From cf8f0614ad2ddc6b7b737cdbc7780b5cf090a3a7 Mon Sep 17 00:00:00 2001
From: Aevann1 Truescore requirement:
+ Everyone will be able to see this post
+
Truescore requirement:
- Everyone will be able to see this post
-
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
{[para]}
-![](/images/16649046614498348.webp)
\ No newline at end of file
+![](/images/16649046614498348.webp)
+{[para]}
+![](/images/16630965071440427.webp)
+{[para]}
+```
+⠀⠀⠀⠀⠀⢰⡿⠋⠁⠀⠀⠈⠉⠙⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⢀⣿⠇⠀⢀⣴⣶⡾⠿⠿⠿⢿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⣀⣀⣸⡿⠀⠀⢸⣿⣇⠀⠀⠀⠀⠀⠀⠙⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⣾⡟⠛⣿⡇⠀⠀⢸⣿⣿⣷⣤⣤⣤⣤⣶⣶⣿⠇⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀
+⢀⣿⠀⢀⣿⡇⠀⠀⠀⠻⢿⣿⣿⣿⣿⣿⠿⣿⡏⠀⠀⠀⠀⢴⣶⣶⣿⣿⣿⣆
+⢸⣿⠀⢸⣿⡇⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⣿⡇⣀⣠⣴⣾⣮⣝⠿⠿⠿⣻⡟
+⢸⣿⠀⠘⣿⡇⠀⠀⠀⠀⠀⠀⠀⣠⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠉⠀
+⠸⣿⠀⠀⣿⡇⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠉⠀⠀⠀⠀
+⠀⠻⣷⣶⣿⣇⠀⠀⠀⢠⣼⣿⣿⣿⣿⣿⣿⣿⣛⣛⣻⠉⠁⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⢸⣿⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀
+⠀⠀⠀⠀⢸⣿⣀⣀⣀⣼⡿⢿⣿⣿⣿⣿⣿⡿⣿⣿⡿
+```
\ No newline at end of file
From 94e441a23b1e837d360cfd7c0b02ed0f02625ed6 Mon Sep 17 00:00:00 2001
From: Aevann1
From ebf83687948c869d37431d5e6b64867b07012d0b Mon Sep 17 00:00:00 2001
From: TLSM
From a22c42631097d704acbdebe5310d3bab0d7a2b4e Mon Sep 17 00:00:00 2001
From: justcool393
Max file size is 8 MB (16 MB for paypigs)
+ Max image/audio size is 8 MB (16 MB for paypigs)
Max video size is 32 MB (64 MB for paypigs)
+
+
.*)", flags=re.A|re.DOTALL) +# Specifically match Snappy's way of formatting, this might break some losers' comments. +showmore_regex = re.compile(r"^(.{3000,}?
(?:)?)(\s*.*)", flags=re.A|re.DOTALL) search_token_regex = re.compile('"([^"]*)"|(\S+)', flags=re.A) diff --git a/files/helpers/sanitize.py b/files/helpers/sanitize.py index 966ba07e1..5d2867b6d 100644 --- a/files/helpers/sanitize.py +++ b/files/helpers/sanitize.py @@ -386,7 +386,7 @@ def sanitize(sanitized, golden=True, limit_pings=0, showmore=True, count_marseys if '
' not in sanitized: sanitized = sanitized.replace('\n','') - if showmore and len(sanitized) > 5000: + if showmore and len(sanitized) > 3500: sanitized = showmore_regex.sub(r'\1\2 ', sanitized, count=1) return sanitized.strip() From fbd815f54ea2838796d4dda929fbeb9bc92a48b6 Mon Sep 17 00:00:00 2001 From: Aevann1Date: Thu, 6 Oct 2022 08:26:10 +0200 Subject: [PATCH 20/52] fix this https://rdrama.org/post/18459/marseycapywalking-megathread-for-bugs-and-suggestions/2847925?context=8#context --- files/assets/sitemap.xml | 5 ----- files/routes/static.py | 5 +---- files/templates/sign_up.html | 2 +- files/tests/test_e2e.py | 2 +- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/files/assets/sitemap.xml b/files/assets/sitemap.xml index e1e7bae04..87d13bab9 100644 --- a/files/assets/sitemap.xml +++ b/files/assets/sitemap.xml @@ -1325,11 +1325,6 @@ 2022-06-10T23:42:26+00:00 0.64 -- https://rdrama.net/logged_out/sidebar -2022-06-10T23:42:26+00:00 -0.64 -https://rdrama.net/signup?redirect=/marseys? 2022-06-10T23:42:26+00:00 diff --git a/files/routes/static.py b/files/routes/static.py index ee5435919..035c062d7 100644 --- a/files/routes/static.py +++ b/files/routes/static.py @@ -72,11 +72,8 @@ def marsey_list(): return jsonify(emojis) -@app.get('/rules') @app.get('/sidebar') -@app.get('/logged_out/rules') -@app.get('/logged_out/sidebar') -@auth_desired_with_logingate +@auth_desired def sidebar(v): return render_template('sidebar.html', v=v) diff --git a/files/templates/sign_up.html b/files/templates/sign_up.html index cefca89c0..f87d66184 100644 --- a/files/templates/sign_up.html +++ b/files/templates/sign_up.html @@ -112,7 +112,7 @@ required="">- +{% if hcaptcha %} diff --git a/files/tests/test_e2e.py b/files/tests/test_e2e.py index f3f049325..00ede0ccf 100644 --- a/files/tests/test_e2e.py +++ b/files/tests/test_e2e.py @@ -5,7 +5,7 @@ from files.__main__ import app # these tests require `docker-compose up` first def test_rules(): - response = app.test_client().get("/logged_out/rules") + response = app.test_client().get("/sidebar") assert response.status_code == 200 assert response.text.startswith("") From d73990d5b243fa47f85b8f911938da2e4ce2cc03 Mon Sep 17 00:00:00 2001 From: Aevann1Date: Thu, 6 Oct 2022 08:35:42 +0200 Subject: [PATCH 21/52] delete granted_by column --- files/classes/award.py | 1 - schema.sql | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/files/classes/award.py b/files/classes/award.py index d64970e95..751b8b0d7 100644 --- a/files/classes/award.py +++ b/files/classes/award.py @@ -15,7 +15,6 @@ class AwardRelationship(Base): comment_id = Column(Integer, ForeignKey("comments.id")) kind = Column(String) awarded_utc = Column(Integer) - granted_by = Column(Integer, ForeignKey("users.id")) created_utc = Column(Integer) user = relationship("User", primaryjoin="AwardRelationship.user_id==User.id", back_populates="awards") diff --git a/schema.sql b/schema.sql index 806974595..d1a8f7e27 100644 --- a/schema.sql +++ b/schema.sql @@ -167,7 +167,6 @@ CREATE TABLE public.award_relationships ( kind character varying(20) NOT NULL, awarded_utc integer, created_utc integer, - granted_by integer ); @@ -2101,14 +2100,6 @@ ALTER TABLE ONLY public.award_relationships ADD CONSTRAINT award_comment_fkey FOREIGN KEY (comment_id) REFERENCES public.comments(id); --- --- Name: award_relationships award_granted_by_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY public.award_relationships - ADD CONSTRAINT award_granted_by_fkey FOREIGN KEY (granted_by) REFERENCES public.users(id); - - -- -- Name: award_relationships award_submission_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -2688,4 +2679,3 @@ ALTER TABLE ONLY public.comment_option_votes -- -- PostgreSQL database dump complete -- - From c22c77ade6b7f4da368e324c4cb81651e25645cd Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 08:37:32 +0200 Subject: [PATCH 22/52] same as last commit --- sql/20220920-award-granted-by.sql | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 sql/20220920-award-granted-by.sql diff --git a/sql/20220920-award-granted-by.sql b/sql/20220920-award-granted-by.sql deleted file mode 100644 index 662118094..000000000 --- a/sql/20220920-award-granted-by.sql +++ /dev/null @@ -1,5 +0,0 @@ -alter table award_relationships add column granted_by int; -ALTER TABLE ONLY public.award_relationships - ADD CONSTRAINT award_granted_by_fkey FOREIGN KEY (granted_by) REFERENCES public.users(id); -update award_relationships set granted_by=1 where granted=true; -alter table award_relationships drop column granted; From fea0ce115fe8a1ece0964b457c827adb398fa976 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 08:41:48 +0200 Subject: [PATCH 23/52] do the result of this poll https://rdrama.org/post/79285/-/2845495?context=8#context --- files/classes/user.py | 5 +---- files/routes/users.py | 6 ++---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/files/classes/user.py b/files/classes/user.py index 12aed3b0f..c30ed2be9 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -458,10 +458,7 @@ class User(Base): posts = g.db.query(Submission.id).filter_by(author_id=self.id, is_pinned=False) if not (v and (v.admin_level > 1 or v.id == self.id)): - posts = posts.filter_by(is_banned=False, private=False, ghost=False) - - if not (v and v.admin_level > 1): - posts = posts.filter_by(deleted_utc=0) + posts = posts.filter_by(is_banned=False, private=False, ghost=False, deleted_utc=0) posts = apply_time_filter(t, posts, Submission) diff --git a/files/routes/users.py b/files/routes/users.py index 54aa674ab..79d604e9c 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -1145,12 +1145,10 @@ def u_username_comments(username, v=None): comments = comments.filter( Comment.is_banned == False, Comment.ghost == False, - comment_post_author.shadowbanned == None + comment_post_author.shadowbanned == None, + Comment.deleted_utc == 0 ) - if not (v and v.admin_level > 1): - comments = comments.filter(Comment.deleted_utc == 0) - comments = apply_time_filter(t, comments, Comment) comments = sort_comments(sort, comments) From 96f4f8499fa72f0eaabb0bcbb62145ef5aa37e36 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 09:30:38 +0200 Subject: [PATCH 24/52] fix 500 errors --- files/helpers/media.py | 6 +++--- files/routes/comments.py | 2 +- files/routes/posts.py | 2 +- files/routes/settings.py | 4 ++-- files/routes/subs.py | 6 +++--- sql/20221006-media-table.sql | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/files/helpers/media.py b/files/helpers/media.py index de077294a..db856d8af 100644 --- a/files/helpers/media.py +++ b/files/helpers/media.py @@ -21,7 +21,7 @@ def process_files(): if file.content_type.startswith('image/'): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - url = process_image(name) + url = process_image(name, patron=g.v.patron) body += f"\n\n![]({url})" elif file.content_type.startswith('video/'): body += f"\n\n{process_video(file)}" @@ -112,10 +112,10 @@ def process_video(file): -def process_image(filename=None, resize=0, trim=False): +def process_image(filename=None, resize=0, trim=False, patron=False): size = os.stat(filename).st_size - if size > 16 * 1024 * 1024 or not g.v.patron and size > 8 * 1024 * 1024: + if size > 16 * 1024 * 1024 or not patron and size > 8 * 1024 * 1024: os.remove(filename) abort(413) diff --git a/files/routes/comments.py b/files/routes/comments.py index 666059d5f..86d46861c 100644 --- a/files/routes/comments.py +++ b/files/routes/comments.py @@ -194,7 +194,7 @@ def comment(v): if file.content_type.startswith('image/'): oldname = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(oldname) - image = process_image(oldname) + image = process_image(oldname, patron=v.patron) if image == "": return {"error":"Image upload failed"}, 400 if v.admin_level > 2 and level == 1: if parent_post.id == SIDEBAR_THREAD: diff --git a/files/routes/posts.py b/files/routes/posts.py index 654cb8dcc..09b50bfc5 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -949,7 +949,7 @@ def submit_post(v, sub=None): if file.content_type.startswith('image/'): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - post.url = process_image(name) + post.url = process_image(name, patron=v.patron) name2 = name.replace('.webp', 'r.webp') copyfile(name, name2) diff --git a/files/routes/settings.py b/files/routes/settings.py index 92bd7476f..c7a036c72 100644 --- a/files/routes/settings.py +++ b/files/routes/settings.py @@ -518,7 +518,7 @@ def settings_images_profile(v): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - highres = process_image(name) + highres = process_image(name, patron=v.patron) if not highres: abort(400) @@ -556,7 +556,7 @@ def settings_images_banner(v): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - bannerurl = process_image(name) + bannerurl = process_image(name, patron=v.patron) if bannerurl: if v.bannerurl and '/images/' in v.bannerurl: diff --git a/files/routes/subs.py b/files/routes/subs.py index 2fcee35e0..ad40ef5ff 100644 --- a/files/routes/subs.py +++ b/files/routes/subs.py @@ -486,7 +486,7 @@ def sub_banner(v, sub): name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - bannerurl = process_image(name) + bannerurl = process_image(name, patron=v.patron) if bannerurl: if sub.bannerurl and '/images/' in sub.bannerurl: @@ -518,7 +518,7 @@ def sub_sidebar(v, sub): file = request.files["sidebar"] name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - sidebarurl = process_image(name) + sidebarurl = process_image(name, patron=v.patron) if sidebarurl: if sub.sidebarurl and '/images/' in sub.sidebarurl: @@ -550,7 +550,7 @@ def sub_marsey(v, sub): file = request.files["marsey"] name = f'/images/{time.time()}'.replace('.','') + '.webp' file.save(name) - marseyurl = process_image(name) + marseyurl = process_image(name, patron=v.patron) if marseyurl: if sub.marseyurl and '/images/' in sub.marseyurl: diff --git a/sql/20221006-media-table.sql b/sql/20221006-media-table.sql index 6db368af3..fa0dc4f4d 100644 --- a/sql/20221006-media-table.sql +++ b/sql/20221006-media-table.sql @@ -1,6 +1,6 @@ CREATE TABLE public.media ( kind character varying(5) NOT NULL, - filename character varying(23) NOT NULL, + filename character varying(55) NOT NULL, user_id Integer NOT NULL, created_utc integer NOT NULL, size integer NOT NULL From 79960d58be015048232fe8013af3f3a09582bda8 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 09:33:47 +0200 Subject: [PATCH 25/52] ping me for "aev" --- files/helpers/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/helpers/const.py b/files/helpers/const.py index 1b568846e..70d001cc6 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -848,7 +848,7 @@ TROLLTITLES = [ ] NOTIFIED_USERS = { - 'aevan': AEVANN_ID, + 'aev': AEVANN_ID, 'avean': AEVANN_ID, 'joan': JOAN_ID, 'pewkie': JOAN_ID, From fc1d56053dbd999216612d98fef91b68be7e2fb8 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 08:00:06 +0000 Subject: [PATCH 26/52] sneed --- schema.sql | 5 +++-- seed-db.sql | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/schema.sql b/schema.sql index d1a8f7e27..4a13f6413 100644 --- a/schema.sql +++ b/schema.sql @@ -166,7 +166,7 @@ CREATE TABLE public.award_relationships ( comment_id integer, kind character varying(20) NOT NULL, awarded_utc integer, - created_utc integer, + created_utc integer ); @@ -566,7 +566,7 @@ CREATE TABLE public.marseys ( CREATE TABLE public.media ( kind character varying(5) NOT NULL, - filename character varying(23) NOT NULL, + filename character varying(55) NOT NULL, user_id integer NOT NULL, created_utc integer NOT NULL, size integer NOT NULL @@ -2679,3 +2679,4 @@ ALTER TABLE ONLY public.comment_option_votes -- -- PostgreSQL database dump complete -- + diff --git a/seed-db.sql b/seed-db.sql index e6e35f46a..8d0c7f4d0 100644 --- a/seed-db.sql +++ b/seed-db.sql @@ -2654,6 +2654,7 @@ INSERT INTO public.marseys (name, author_id, tags, created_utc) VALUES ('marseyzombiewolflove',2,'hug cuddle love marseylove zombiewolf zombie wolf',NULL), ('marseyzombiewolfmarseymask',2,'sussy amogus fraud fake phony cope seethe',NULL), ('marseyzombiewolftrample',2,'kill murder mascot animated walking animated tramplewolf',NULL), +('marseyzombiewolfvore',2,'furry furfag food eat yum carp degenerate',1665041705), ('marseyzoomer',2,'child brat kid zoomie',NULL), ('marseyzwei',2,'drinking germany lederhosen zweirama bavarian beer',NULL), ('marsheen',2,'pusheen animated meme cute',NULL), From e071f9c81bd32acb2785161a19d4847afdc36845 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 10:23:29 +0200 Subject: [PATCH 27/52] remove leaderboard_thread --- files/routes/users.py | 57 ++++++-------------------------- files/templates/leaderboard.html | 35 -------------------- 2 files changed, 11 insertions(+), 81 deletions(-) diff --git a/files/routes/users.py b/files/routes/users.py index 79d604e9c..83f5ac556 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -21,42 +21,6 @@ import os import json from .login import check_for_alts -def leaderboard_thread(): - db = db_session() - - global users9, users9_1, users9_2 - votes1 = db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() - votes2 = db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() - votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) - users8 = db.query(User.id).filter(User.id.in_(votes3.keys())).all() - users9 = [] - for user in users8: - users9.append((user.id, votes3[user.id])) - if not users9: users9 = [(None,None)] - users9 = sorted(users9, key=lambda x: x[1], reverse=True) - users9_1, users9_2 = zip(*users9[:25]) - - global users13, users13_1, users13_2 - votes1 = db.query(Vote.user_id, func.count(Vote.user_id)).filter(Vote.vote_type==1).group_by(Vote.user_id).order_by(func.count(Vote.user_id).desc()).all() - votes2 = db.query(CommentVote.user_id, func.count(CommentVote.user_id)).filter(CommentVote.vote_type==1).group_by(CommentVote.user_id).order_by(func.count(CommentVote.user_id).desc()).all() - votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) - users14 = db.query(User).filter(User.id.in_(votes3.keys())).all() - users13 = [] - for user in users14: - users13.append((user.id, votes3[user.id]-user.post_count-user.comment_count)) - if not users13: users13 = [(None,None)] - users13 = sorted(users13, key=lambda x: x[1], reverse=True) - users13_1, users13_2 = zip(*users13[:25]) - - db.close() - stdout.flush() - - -gevent.spawn(leaderboard_thread) - - - - @app.get("/@ /upvoters/ /posts") @auth_required @@ -590,6 +554,16 @@ def leaderboard(v): sq = g.db.query(User.id, func.rank().over(order_by=User.coins_spent.desc()).label("rank")).subquery() pos7 = g.db.query(sq.c.id, sq.c.rank).filter(sq.c.id == v.id).limit(1).one()[1] + votes1 = db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() + votes2 = db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() + votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) + users8 = db.query(User.id).filter(User.id.in_(votes3.keys())).all() + users9 = [] + for user in users8: + users9.append((user.id, votes3[user.id])) + if not users9: users9 = [(None,None)] + users9 = sorted(users9, key=lambda x: x[1], reverse=True) + users9_1, users9_2 = zip(*users9[:25]) users9_accs = g.db.query(User).filter(User.id.in_(users9_1)).all() users9_accs = sorted(users9_accs, key=lambda x: users9_1.index(x.id)) @@ -624,14 +598,6 @@ def leaderboard(v): users12 = None pos12 = None - users13_accs = g.db.query(User).filter(User.id.in_(users13_1)).all() - users13_accs = sorted(users13_accs, key=lambda x: users13_1.index(x.id)) - users13_accs = zip(users13_accs, users13_2) - try: - pos13 = [x[0] for x in users13].index(v.id) - pos13 = (pos13+1, users13[pos13][1]) - except: pos13 = (len(users13)+1, 0) - # winnings_sq = g.db.query(Casino_Game.user_id, func.sum(Casino_Game.winnings)).group_by(Casino_Game.user_id).subquery() # users14 = g.db.query(User).join(winnings_sq, winnings_sq.c.user_id == User.id).order_by(winnings_sq.c.sum.desc()).limit(25).all() # if v in users14: @@ -669,8 +635,7 @@ def leaderboard(v): return render_template("leaderboard.html", v=v, users1=users1, pos1=pos1, users2=users2, pos2=pos2, users3=users3, pos3=pos3, users4=users4, pos4=pos4, users5=users5, pos5=pos5, users7=users7, pos7=pos7, users9=users9_accs, pos9=pos9, - users10=users10, pos10=pos10, users11=users11, pos11=pos11, users12=users12, pos12=pos12, - users13=users13_accs, pos13=pos13, users16=users16, pos16=pos16, users17=users17, pos17=pos17, users18=users18, pos18=pos18) + users10=users10, pos10=pos10, users11=users11, pos11=pos11, users12=users12, pos12=pos12, users16=users16, pos16=pos16, users17=users17, pos17=pos17, users18=users18, pos18=pos18) @app.get("/ /css") def get_css(id): diff --git a/files/templates/leaderboard.html b/files/templates/leaderboard.html index 9381822b7..554e65fcd 100644 --- a/files/templates/leaderboard.html +++ b/files/templates/leaderboard.html @@ -15,7 +15,6 @@ Downvotes • Badges • {% if users12 %}Marseys • {% endif %} - {% if users13 %}Upvotes Given • {% endif %} Blocked • Owned Hats • Designed Hats @@ -336,40 +335,6 @@ {% endif %} -{% if users13 %} - Top 25 by upvotes given
- -- -
-{% endif %} -- - - - {% for user, num in users13 %} -# -Name -Upvotes -- - {% endfor %} - {% if pos13 and (pos13[0] > 25 or not pos13[1]) %} -{{loop.index}} -{% include "user_in_table.html" %} -{{"{:,}".format(num)}} -- - {% endif %} - -{{pos13[0]}} -- {% with user=v %} - {% include "user_in_table.html" %} - {% endwith %} - -{{"{:,}".format(pos13[1])}} -Top 25 Most Blocked
From 7eefcf53082c7c73a8f094e3201eb267fadf1b1a Mon Sep 17 00:00:00 2001 From: TLSM
Date: Thu, 6 Oct 2022 04:57:21 -0400 Subject: [PATCH 28/52] Stopgap optimize leaderboard received downvotes. --- files/routes/users.py | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/files/routes/users.py b/files/routes/users.py index 83f5ac556..dc00090ad 100644 --- a/files/routes/users.py +++ b/files/routes/users.py @@ -554,24 +554,35 @@ def leaderboard(v): sq = g.db.query(User.id, func.rank().over(order_by=User.coins_spent.desc()).label("rank")).subquery() pos7 = g.db.query(sq.c.id, sq.c.rank).filter(sq.c.id == v.id).limit(1).one()[1] - votes1 = db.query(Submission.author_id, func.count(Submission.author_id)).join(Vote).filter(Vote.vote_type==-1).group_by(Submission.author_id).order_by(func.count(Submission.author_id).desc()).all() - votes2 = db.query(Comment.author_id, func.count(Comment.author_id)).join(CommentVote).filter(CommentVote.vote_type==-1).group_by(Comment.author_id).order_by(func.count(Comment.author_id).desc()).all() - votes3 = Counter(dict(votes1)) + Counter(dict(votes2)) - users8 = db.query(User.id).filter(User.id.in_(votes3.keys())).all() - users9 = [] - for user in users8: - users9.append((user.id, votes3[user.id])) - if not users9: users9 = [(None,None)] - users9 = sorted(users9, key=lambda x: x[1], reverse=True) - users9_1, users9_2 = zip(*users9[:25]) + # Received Downvotes + dv_stmt = text(""" + SELECT + u.id, + (coalesce(cv.count, 0) + coalesce(pv.count, 0)) as downvotes + FROM + users u + LEFT OUTER JOIN + (SELECT c.author_id, COUNT(*) FROM commentvotes v + JOIN comments c ON v.comment_id = c.id WHERE v.vote_type = -1 + GROUP BY c.author_id) AS cv + ON cv.author_id = u.id + LEFT OUTER JOIN + (SELECT p.author_id, COUNT(*) FROM votes v + JOIN submissions p ON v.submission_id = p.id WHERE v.vote_type = -1 + GROUP BY p.author_id) AS pv + ON pv.author_id = u.id + ORDER BY downvotes DESC; + """) + dv_result = g.db.execute(dv_stmt).fetchall() or [(None,None)] + users9_1, users9_2 = zip(*dv_result[:25]) users9_accs = g.db.query(User).filter(User.id.in_(users9_1)).all() users9_accs = sorted(users9_accs, key=lambda x: users9_1.index(x.id)) users9_accs = zip(users9_accs, users9_2) try: - pos9 = [x[0] for x in users9].index(v.id) - pos9 = (pos9+1, users9[pos9][1]) - except: pos9 = (len(users9)+1, 0) + pos9 = [x[0] for x in dv_result].index(v.id) + pos9 = (pos9+1, dv_result[pos9][1]) + except: pos9 = (len(dv_result)+1, 0) users10 = users.order_by(User.truecoins.desc()).limit(25).all() if v in users10: From 24167b1d09d23f9f69a5a81e409319778833095f Mon Sep 17 00:00:00 2001 From: TLSM Date: Thu, 6 Oct 2022 05:15:21 -0400 Subject: [PATCH 29/52] Fix thumbnail_thread passing uploader to media. --- files/helpers/media.py | 4 ++-- files/routes/posts.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/files/helpers/media.py b/files/helpers/media.py index db856d8af..976789226 100644 --- a/files/helpers/media.py +++ b/files/helpers/media.py @@ -112,7 +112,7 @@ def process_video(file): -def process_image(filename=None, resize=0, trim=False, patron=False): +def process_image(filename=None, resize=0, trim=False, uploader=None, patron=False): size = os.stat(filename).st_size if size > 16 * 1024 * 1024 or not patron and size > 8 * 1024 * 1024: @@ -177,7 +177,7 @@ def process_image(filename=None, resize=0, trim=False, patron=False): media = Media( kind='image', filename=filename.split('/')[-1], - user_id=g.v.id, + user_id=uploader or g.v.id, size=os.stat(filename).st_size ) g.db.add(media) diff --git a/files/routes/posts.py b/files/routes/posts.py index 09b50bfc5..9dbb81c1d 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -598,7 +598,7 @@ def thumbnail_thread(pid): for chunk in image_req.iter_content(1024): file.write(chunk) - post.thumburl = process_image(name, resize=100) + post.thumburl = process_image(name, resize=100, uploader=post.author_id) db.add(post) db.commit() db.close() From a2b0d2f824ffdcdcae99acf7069d6cccec1a45a6 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 12:00:08 +0000 Subject: [PATCH 30/52] sneed --- .../images/emojis/marseyvorezombiewolf.webp | Bin 0 -> 13260 bytes seed-db.sql | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 files/assets/images/emojis/marseyvorezombiewolf.webp diff --git a/files/assets/images/emojis/marseyvorezombiewolf.webp b/files/assets/images/emojis/marseyvorezombiewolf.webp new file mode 100644 index 0000000000000000000000000000000000000000..be539062c148e8beeabe0057590f1d004470fc8f GIT binary patch literal 13260 zcmV;-Gc(LmNk&G*GXMZrMM6+kP&il$0000G0002T008Fz06|PpNCpQ000E$eZQJoi zdYWq7VaE0># aM+G+qP}nwr!Q;skTm^A8FEj&-cA|j{O%A6F>?#dF9HLD`(DJ z?xbbG-V;_Fc=qMSipjMJOOFDz`VJnmWcP`4w;sKXj*a~
f`O&?+5Zh4!{`F{Vmq zS*c46tLRBq>_aO9HqB?{rWQ7&re9dWJ&b4pD|vzO6ui%BKA=03TY7#;Wko;M(|6u0 zPdy9{e{p$xU@ (S^E6at5vV?#V<|@j17K55xKwAC;RJfwFK@4kCX=`xlE$sv@-qNn(;wSAS zE`ie4;4(;>4=&!)isN!h8f}DyS4b iCD>hBM_9P4w9>e& zlI9Ts%U3U9bQKnECv6`t%cX6=<(0H`xNvP@$AOtFt8fx97iIm($d(he5t<-LuA$JZ zmsEzK4fhb#78|Z9Xc#zu2wDryQ9;MR`It%06L7eZ7`HHV#*6WaMCYiO!WMMiXO!|C z!&_fUBYb|6(ixu>Qu^cbM9M&XxVR8sfZ7TP1Zaei9|77Y B79r2H~|0EipP z2ta6n3?GC>WD?O2q1pMJg~dfhcq6p6l8Au_9cd_{GeVa;h-iS&(?KH2BlIRnM8On* zJ`NV)6$w!EXc2DV0L4!dK`#N~IWq1cG*8A+gyzdw?=&oQ8ipV=S4KC05~s*$08q>r z8Q%f)aj=YB|KSt-lMGWBJ}>-a&}DpXbajwNshX|ZH>lucYb`#<8apDl|Ege4Gx6vj z`O}z)&-N VqiM}O}B z1fE9rEoH~Y#iNsupBL{3Eh=0VBWNp1&FTU+rkl*w?m|EgZWLH(RS2`#EH@1%uzl z)^+f1k LNJO03~ z3)#69x+!FDsI0^|EY6YL(Xyh4Mj-LQtRw!m1QPX0Pu;084nCwSKcbo_j3a&d5>eR~ z5Ue4c`4JI~LSQ%PtuGNZU;vMj?%EO2BLHr?>aPw_5Uc;1E9tKY(M|PTaU=abCaS~A zKSB-`wt;A*@^+9R{7AG%b@Rv&;_{JOnBs!S7#0(iWTnS7AY(Z1LR3R-)5#ci5D~Ri z+Y*ClX4Ob->kOiyRRy&zH3(m;VrrXW5DToTtL<-tcx5$7Z9NTw2N9X0)K<|bzT~6} ztn}Ap6#PDv)xN?wl;6o&xJS-H+y5Q7uG0{l*;(MZnnXdxWwp45)haEPV3kr#gFvi! zv<4Nyx~Bm>#foccunDY@8gv8eng%&yuu3lAINF32ch;aeSc^2ED_9-Vq9<0bwV>lr zad9n*CqUIw3krfNP!l?U)C6s^z6NTgHdOFEP6sri0>Lm{*NU> N2iKET}QKe(p6c$8OW@9QY33)^j +C5Ik92m+Y1jh9HJuFr;*8Gd5e}>L)&z$?^hVw=RM#D~2jLtUp!pC4U5$X~ zyA26;e7UfF%l4D6EMhG22?+@a@o_OxQITK1d<>6BGdw&jG&CgS&C>_>?%%x=Ct*Ap zrANJ=7w$fGbV=6|Zj@%uCP#(zBD2|S&Ye3)wrp85XZAF?rfo90xVVtbz5+&&p^p{e zLo$EVDy1VC{9x^pnvv9ok(!*&O@?3ZqegqZNUqz2WQSdBKuY{KR)Z7Yl5F>YOBM$_ znO1^S>FIsZF%L(VA|0B0joW(ftHmn$^PR1e29zMR7VNd`cC *8|ya&?ota`kzc++AoBE+JD;*fe+^&;6L#GfBb-Y0CgAjv-=O@e}X^Q{~-Ud zf8zDO@lTrm&HZ!sbNgrh?|MJ&JSqAY^S|@`5dJgvGw=V~zivOee&zhT{@21Ej^Eb$ zgnlLbtNYLQAKIVHFK&P4`(|w?`ma!rW 9lf3{8*Hy65_d$S$; zKYyZ;;>-uk@Wl&OdDKT5|L=5BdGl3e;CkmfM>lj8E=K#Vt7wl#@pKoyDh(bgj+OM` zb$HGfX8oangv&KJ=wUlMzdYymdCYyinP^ve0Ta|CgsgNqHe)%{gbSMHS~DH% L zDUf%|d-DYX^?oU;^lOC@Zcg~%PHBo4*p(${ZQ $=AOo~GZI4Fl**;Ft$cQhyYWv{#CsaAC`%DpEW4w%af+-u5k z?j&!P;icV44_~NASljpbE`?hg42Fl*`Yc)~)FQP#v%0nYB_I_a$x`MFphtely*OTv zQ^=ElCFTsa2`#w>WE#+n%d{*Udv)w9gDA?Nk@hXeb2X3>>)Cz%3Er5C5>W6jvwAB7 zse>Gj5k}e!2lmBt;5p*ku-P1!``?(d@bE)*@IyECvcutJ<{d+HL=ZWi|9M#>x6b zx0)JfVE_{jK2Z0NDW; #x<8mpZc502mV?lA1~s{E9pR`!VNSEv?UCF_S$z8ayp zUaAUjjy|P7mZ?bgMi=`9odZ6Jzw=Hyvfb5nIZOv(HN8xH!A`q>L<>PJ+qDy`w;u+UT@N)5+S9_K zE*4A);HDfTQD;n;FAHha-|I$cDEm09K;C8hhEbC>qsi->KPp#o#F}!?eK|WRtw8+X zQ-62@2o5QC!HxLQWN^^TdIzJpEulJYD@o8MX#3#dU#4D|%gk-H3d}NUme%rU8cMf> zH7F13`lMi#GzwRQo{&~Yc7{#CEf{aDk6Ciu#&ihxfLelsb>Q%CoI7g%B?)|07GLC& znf3Z|=GoOmAwhHB5z<3yKEcfjI3z1;M?A&9ehw1r{d~=`dne><(GmYpA;o9gyZEmp zlj;}U&OVE{CP(N#eSwr0pZO9s($?C@9I)9?x7Uq`##kHb0h=aXC)&Sybx8uUS-i #GT)DL1Fw^)ZLi8heU?QLm}%0<(?KKgR}=>;(d=_nM})N+0=Gc9$b2 zvT>aw0qP;K&(m4i6`qZ#(dn#ozef##7=grjb1NN4h318KRlJc^bI05Qt=kippxI_U zCS |3z;nk5Lna@;AstF_|h0EeI! zMUy?2lf47VBW>>xo&NDO-=g*(S? +;W zN{Kt>Fg7?D`#%jBMtGon32 U?@cxy1aaQMng|ynIa>TOiMR{FaugqQ| zN_0=-hyz^fwbTxC)u7p G?dG?eCJ|j;5qV1vf3nT73C2>4vwq;o~)` zbV1_ruGaw*M1UEKeS1mnwd})un=JL z}F(0468hsD=(~} zxxwg8JGg8;jxiGPdJXf}7K*%ui;72Oxb5ydmkmu*NT2rp^==sG&PQU0@EAF8Cl!y) za0g3AIW&z%a<&NfVR_5A-6o%K`3OdN7+j@pGvctEakCYrHLHW9mxmZPnSW2=z}igI zCw5+Sk4A{y@%-X1WegA0uXZQt273i >gwBom980CmT_JwBw$ #By RLDMS(|>DLl{5>+xHOn}j})X~QBy2oV`v!UE awW^5| z4?oM6t6iCCNe1DH?XYl9w9Z1iP)Vz)BuOUDDnT}@XYyKQlrxh{wdL9vYyEOu(nqV4 zV} I cLsV~Xw+I# zKWF4(g7PU!Mm6WfB}U5l=Y>;KerJu(CU78`y&I=3GkY%favna#aN EfsC;%X!Wr6L@ON7fA9{B!t98^t>K3dJNOcW4J;}G=-x!xJV^1&RH`kpP8 z^S}bKjH%Z1X`PAXl*(9 Pp~!p~WKM5mTBhBK>AvjuU2fw_V^UXpsx z`~3dmfh56@P44Zm@CqLe+cnqI+cYcRQ%Q>>Atv&5q+b}{Q3Asqj^vIH8k=X9#H|88 z9ishbskuqC3K|6uT-b}KRERo?0c9Zqm-y1=DKy1NL2axHmB=0A550z)WvHEGZW}ZY z0L70bLgbLnZ9gSAT0}JiBd<&&)^>rb k~Y6-QZ@u z|5ro$h-F0QT1kh;Meqwrz|RyJJ%4z!99K20`0US)-jWutJt+ja2@pZAPIH(eRUq$) z96I#F9KTwW)kr8c|E?Q$j56kq5KvisJULq;F%%hcQcm( oAF@>QD%P&Y-IU4UQLg7F2h D@mF+N1W z9;SLbfMC_xFt`UTAXH8#O?15A?GCbRmr!=97hwLIEV>OOeV RAtMfFA<3t2GcU8iSr z!<+xwA& zb%o-C*;wb{r1pB`aZGFMevL{@s>R)Rzz8F*V=u5Xq}_oyfT4wRhDdLhDstA tSsvncn|eqsjG46^ai~jKD`C`aw<35C34Q z!;0cD%Y-)?^Vv}jEUF}5grISolH_ymv9sG#>(`FKB>4Y58oH|bFzMptBNWs(VmPzp zB3WKtx1OBe$}g m z0P-rb6EN8y0T{~;98cH$$C&_w#)p-a8>FvUR^DIoXZZSi{h}}qyL+5-14)CKHN*uV z%EgTtD1j&AAR2j5Jg4w!RJ$y6{EU_oj^gflPh>2{3Y4I9l3G*2RMZz-bTO@&GLI21 zmiQcXh|w+|iL>gLOBrNw*$(GWgD&xkEp_VSL~Lqc%a7%oQ(iXRrdYSSip=2y`1%f2 zNvS?P?#n8zo|l*3; rv|q|%htm+HxFX!#*+j*Ct|H^SDTQgPa;B~PbzK8l zBHe|UYgk+$r+`@}Y~2}NJ+AL%xp7ee^3vSV)#(VJ<~A)YOZ9Pw(J!ZL
D+T1w;wYO98EIU)Ac}**f-V2=VDKKu%J5r6M4JxLE%g=rP3k;8@LaT@8st}ko)%k z>`h^IlR==pMQp^;tUzoBM$i{Pq`LpHG cKGgX*lL{DhCn<1jMe81Rpy|a^zfb= zWV8eLKz?WeuBF@Ew30hcz6|#A9uJ_t?}a%zj$@#3l}NO|gKx%{{u!cKHY+5I02PPN zBqfPz7tRPfgS{nxy-U=;V%AI+6MOJXt5H<$%MeL8N_+le=X2Nc-XD*1c;=()fZ7R; zel@nNe>@;>+@;k53Kn1TC^(UwpC7yzIU^g;5c-4(^`Q6@nPE0Wpu)`qCO7ks ; zj(%&Cn$cD({Mr=#YP$Lh;;ld_Xg@g%(?BdEmNx>Y!Au0KE0h8&H5&;u2du?ly4rEo zRDx26t0kqJO}aG97*6iOp0vCs9Tg2vn7Y|Pv?{?_D&bzDF(82Z>8xPdsev?Vd!dUa z*E!&49u9)CAo0RX6zYTe6B*mmV@|J$<&&urt*#4+%%?rV(=n+tjc=7GzuNHq3nl{x zy2c|;#QePTgnCZg5|G+99FIINVFzN+cgfk!e=IwZ7E3BGsb5l1 m1&QAL{E{`VH4_T$}NeOv+zi1>E?sud9_vYfyq1~bO(l3rj?_-jI z*Rw2w!`%Y&H6R21<}Nu3V7w!fKw!#;+Ct@Dz4-yD7MTj1N58GkN89| T`VUaxNRGtz@aam$u;j6~E#r@j@CD8Yl#7<3`Wg GNw5&5$e1v`!BN_asPs{a--XBBxnxmG++;3HD?05SmDUd-e4C!) zf|3~A9bR VDeYQZh>@P@%Qa@-&NR#S_}wqxC_n$cOVYu92Fc z5x`Kt$VLXM^(Pvrlh4$b5&Wh5LG!uSo~fW@aRp=saNdm6f0+2Yx72DoR*gCIZ OSN^A7k9PnZp=Qa0Pn4C-AfIOU7l5>#;N?gb~>81wlEEx#5de3 zs1QI0KGz0$tSgk*=!Z~qd}<-|@zTt7klE}9*bNPX<+%^wY)_Rsb-e*WY98RVT7;Oc zECO>8-T})HVE?eH0=ipz#3JtE!(P;4`N3VM7$B4`0TZ!D=&8mXvxdx6lc*CqWu;)s z2pK;1P4e3pjCMC#i7>juTYoep5J%SylcO6 H;T#(J0XmH({B}cgDB$L!{varLZ19Y@SuwV7O$iP zY{8hj9L9Pj0|baYl6Oppcr8OMPVBM_EtPFs*_Qfq*{3;Etiv5uGZiTk)0H+!l0%zW zM<6ylbaiV&nurQz#QD+HQY2SWcfn`>Je9V}f11h&3g(!+HxHkSI|PA{`-KFy3B` q7I zd;EgUH)T3VPhtMbe^%np*&R|ancP(1U&@1r*C<7Qi5`=D$^8=XJ!{`bs^XLOScc~6VAXeA8x9*jg=#ni@ z&4i*2eYxs}QI7+&Qkw~Z6xL>C)d(a9rnIxsuOZ?>n59R$D W)4xAlSrf|f{ zHSSa#-=T2VmBJj&DYhuIhtsOZaRduW>=nm2ugKA>RInmfqUni&upRn-m(n-3GvX6} z&*J*Z#-)4{KJ$60CVRusI%Ah}mQR5rJDE(LEO)mpVwt$E#gMhl6y$TNa@i@?sWe1% zT0Kr|Q`s&y&~NB7)EX^A7c+`}$<1+v=lnfN{uKXfDg`j7B#>V^MDWm7+g}hhH FpBmw#~rj+}2vbOZURYz>M zhlPl2hl5h<$>mB9t9e`^3^|-17uMDC&!^lOLCBW5FVy*oDMW5F&OF+ZNiVJJ5ybj4 z bG{oao&`*2pHE_;Q41Q7z0YSCB#m8h}LHl0=giJNm4$@ z&V^R|BO20`pGuiL_!)%X0R_^$x2P?ZD@ZD|hJKSw0GzBux8O{?`x*ex5D2J&A)6RS z3NKVRDu^6H01lSglbnB=o88whb^(guUhN%tzOk#ESqX`4Yi8EN;CBHPGnq!FJmz;} zg~HT30QPRrZ~`P!uF<(4RDPjoTl7-{wdi~3RzCbFj36Q%u5Vv|Mj}$AO)12C` jw~TC#Y`0Zi5))-ujp#kB`bJa2?TPQla8$dQ4EEWz8xc3Yvn5hPcsA7a3aVoc99B zp-JzHb5FgQ4Y`XP3z2j^9ofl|UV`jHvC2Yexzuu8OM$ERqRGctnc1cYh8AJRl18iw zTGl@-A}n33XUIgoaoJtWq)JMcdF~MKc{Sb!bd<*c$iRbLuqS 3afoeljM%ML3SyKrnkIZ)VCD4Y3rb@&8&j&K8%Ou=c_jRtyXeBwqgicw)>BIfM znv~!!Noj*Hm ~lI*mxMQd__;w$l%d+_rkLCP(-LA;QN)wtZ0Bjbk=Ju3Eu zOM!&Wso9sly}i7x1&oDGGb#YOf;dS~2eX_DzF!Xpj)1^^ph{7v6ev%Z?)yR-x4bXt zg_D`5ld!qF;wxQaYRm-cxG22yFCDIswUU3v^@cN|j9T1D_q|FwqgGKVFmry;Ab)nR z2w%!%oc!#ls&?W8Vv^faZqATn `xM7IXs8~<3Ed22b)cE>SEfcQ zrdIM$lwkw~BMOEb)Gprm>Ns2IABmg>@SMb9^1EyCb&^i5fd6%wzi@Dnz_NtkJDv;3 zz)GuVR%hF?OtveLDSXPg%L@UXU z>60z804n t;wbN2z zH=EIo>r5CoW>Dz0o&_}!sH+Ee7h%mAIZ?0agt+93D0mSh92D)z>U168HY~khgQ+7c z(2-xWfIuqn#Nuk_0abY%`HS0KVEeV$e3}gbY67{xSW (28S?>xRw%ufs+o?eCEU>Z%dn%jzs3puo`O3h#AfycYZ`6{i#)tTs zF^{!`!N|1v&RFKBz3BSbVJ}P>RB9Nk39jG6Yvq&$H?MayY3fhsI%nBf_H1Z&W3LSq zuhBPDKbX7^mEgJ8rcX`QF3=DVwK59A-ec}+pekw~N;rhs)?6Djuu&H`>a ;Wivb!U_n)6O>6HM!#ozrD|NOQ*KPneRT!-yX)Brpn%Fmp+`>1A(P0 jr7M%I)`6&%DgN|0usm-t 4c%#vQq zi9-5P+zd#TwY{%*`fVfafJpr0C5ZDVXNn?+I!f_A#|d3PnrX|@8xSW@kVdH5wN6oX z{bC_|Vgc>xxAaKBl+%opNBhdTGC4E-)sMF1$pFTN{`WK;koil%DY1qYhRLD(0$3_y zhbow^aPP*tdIU6cI^m$ jhM`NE8b8yObT zipxC;9CdPM7hv06Hd&VLziYkqFcjx5mwNcvY=_FqvaJ6+4dHGU3|JJohgpVrBP=Od zV&nGq^hz71nD??~E8$|V$Ek59ft5R5c6Hfm+)kYm z y!nA@h@)zJE&Gux zdN47T6&@@*UDe$aYM^0YV$sri@j)Q8>`{ENoD`s;WCi*&+(jC$FxeR4^WTC#aX^Ox zFgz`G@;48czGYqE`V$x4*dHA{5L564PI3A$?-+7B2EE2Boo>Mh|7;q==mo9uB-)JU z#%qG-iznWZJo%((50EA9w `|coY;G#RS6M-Y?`dV8p`?gA=wga2n^+%r=@wn}d@-BoeE<~HZ6Tf2$med PYR0etDDOS HWI=_ufbq28f|yUim8X2%l?98K$jW?!rbIw~x%pE)0S z$iZBUAqea(=t ztrN}H{pW{Lt#i22`My%91Ht+Wkqv7`7q?y^mKE@WTEk!M_NK?ZUQaEHvt+t3_a|RF z(3}FC+(BY%u7e~v7Qy*9q47A(PDTU1Bt_vKgVC9_#ZLIn*=MgL{3umxs#>0NH!7QU zbg{Z86lmpxgdeGyb%eibHUIDp`RKna(B4!+d3#*rE^$6y%pwgQxBur)8q7mTcE6)} zK(oHT(ygx0C81qCD$L+9Td!|Gj)KDCF61!Y;aJF#0aPXUOS6^i*RXreP=2i^6trSa z8*GN<3{S&UOSA|pc$`vbkelx-zES+C{Nd+;JePZz-8-E?+5wSm##}PnhWIe4)aT7W z113uYoY?Z}F^C4gMnDH_(@A$Y#&xAn=Bo5H!)QyvubzH%LK*JY2EZh*%tBPA8{&N` zI9HJ75>f9}eH%RsC+g3GS`vf96x2+U9dS2*WapO0Air}IxYCZ_auetO@_T#s)YJr% z=!A=23fGiXdX+fKe>r19(`0w&^44_xUAa FZ1NYclq6)N*UB}UV4Lk8qM z+pCrXp1zo>b*P0$4i?p6^&bu2f;(@-L!`SI6e=5M*X#BTEfEZfhbkyw>R7G3nKRd( zCWX|cR@Wbh)a43nL5Sd@3OeQ_Nt*P%k7TMA22^#h)Bpocs!w2$#Y}0K$XQ0#BlRjr zCizTY#_UsP)wQuN2fN8$&*RSM={SS~L{+7kyq{VvR@|&LWwO9Q)YbK<%S_|{LFIiq zKz`|DZr4WWnJ2PEa5f};m+fv9Xb^9J-1K72N;`Nbp}oCgn6Y<;&;25LbgRW{oBl%R zX_B6J`KD(xQACWCBOsqtAY%)n8iwBttP`g&l50sS;<1sEH3q*s*X^{gdAt~RXfp>? z)W`3ekC|m^j)B=QV)Oe_uWGuyc8t@HRKt+6AsR?WBtCgo<={{x>fXOKFu95;ecc;I z@PK%sbq&6Hwdw!ePqxay)HLT# Ha?y8%w7C-gyfKUi3O3_Clrmb ^}rT%MMmZiq)JY$V8L)qW-lbsb-c%EB3XTU8E2U5V{XIN8s9x#h}} zn|n?C|1ox_g?JZKLONT5{>${<@bVjTGT$}{(3K xUbxr0C#_{!p!LuA_dOAp((LZk>+#Od&F %5Z%lVF5RvsdgzUC6Z6~XYb3rx(9}E)f=Z}>ZwEr*ciTBN z*TBpFkA&b4b`?CCvWa5#-^ADLUxLE-_LRx?NFbka@TVFd;midmi6SH!P}xqlj+oze zY(hJWD?TAzW?ze{-WMquBb00*0>15xL{93=1ISUs&y;SIxK7)|lXzdj3OKM~(NII$ zJFxZwQO{mlMUlU)zx9C}QeA`;aWFEcuhN?ZO2Eocw~|9BwFJr7FRWb$A?jik0Gy`^ z`zf!NrGW4Mk%m`Kp|cG=I|(i!!(DYovs%bquF$Fzhm~^plOLI|OlaVnnXD?-1-?6r zpr@^WUl6ywxsjl{> }S)@GvT_hhts zsAa`O9WD5v6Pem{`7i6qyZWW<3EP)gE%45-*jd?8D$_X%NT!(>3Y=4gy9 zg!0sVluMjCNECP$zw=~Fv_3mNd_XhBwhN9Q{ODh{Gjl~i+8}6J4 G;? x_Y|_zGenMYe7sv*4SgHVSF79|sgcD|W=Jto#1kbz54>~N_f4{J zd~E#q1Jbf+txiz^E$_iio|?$>MEM_a(W{)%0?#2;axVAj2{=qp)cUfl{S4QeQIRA7 z*6;iyL`PVn6HQ&h(^?q`)v=*`tIz)$Ex7L$ER_d_zHtjR@TLKdinzu($1CR#HMVL$ z_Wu3fU)aqRsxc O(7Hy}45`dbGgQZe5}u(cR1*&CK)+vD 8<&~BkET<~6`7r0Y`_ieP$K^sleG!XxlVKY|jifm>Cfj#PQ62be_@tLD zJKks0{XmB+vc+G*^Q})r%LXTm;My&~9eCV!n9oAwr1stj#G+5NCpYS7C-2#R|DyU9 K(d%3Q0000p5dFgd literal 0 HcmV?d00001 diff --git a/seed-db.sql b/seed-db.sql index 8d0c7f4d0..b822bd577 100644 --- a/seed-db.sql +++ b/seed-db.sql @@ -2586,6 +2586,7 @@ INSERT INTO public.marseys (name, author_id, tags, created_utc) VALUES ('marseyvibing',2,'animated bopping vibe jam dancing headbang music rainbow dance',NULL), ('marseyvietnam',2,'army born to kill soldier war',NULL), ('marseyvirus',2,'phage infect infection plagued',NULL), +('marseyvorezombiewolf',2,'furry furfag food eat yum degenerate fetish hungry',1665041705), ('marseyw',2,'win winner dub',NULL), ('marseywagie',2,'crypto rightoid ancap poor wagecuck mcdonalds maccas reaction',NULL), ('marseywait',2,'time watch wait waiting bored',NULL), @@ -2654,7 +2655,6 @@ INSERT INTO public.marseys (name, author_id, tags, created_utc) VALUES ('marseyzombiewolflove',2,'hug cuddle love marseylove zombiewolf zombie wolf',NULL), ('marseyzombiewolfmarseymask',2,'sussy amogus fraud fake phony cope seethe',NULL), ('marseyzombiewolftrample',2,'kill murder mascot animated walking animated tramplewolf',NULL), -('marseyzombiewolfvore',2,'furry furfag food eat yum carp degenerate',1665041705), ('marseyzoomer',2,'child brat kid zoomie',NULL), ('marseyzwei',2,'drinking germany lederhosen zweirama bavarian beer',NULL), ('marsheen',2,'pusheen animated meme cute',NULL), From c7ef508c2fbe8d9349c1756ec5df361c0ce885dd Mon Sep 17 00:00:00 2001 From: TLSMDate: Thu, 6 Oct 2022 14:02:01 -0400 Subject: [PATCH 31/52] PCM: update sidebar with livelist link. --- files/templates/sidebar_PCM.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/files/templates/sidebar_PCM.html b/files/templates/sidebar_PCM.html index 3c40b3553..ff1cbf99e 100644 --- a/files/templates/sidebar_PCM.html +++ b/files/templates/sidebar_PCM.html @@ -23,9 +23,8 @@ CREATE {{HOLE_NAME|upper}} {%- endif %} BROWSE {{HOLE_NAME|upper}}S - - STREAM LIST - Coming Sometime 2022 + + LIVE LIST BUGS/SUGGESTIONS MEGATHREAD OFFICIAL CONSPIRACY THEORY THREAD From 73e18191994205f1c5b2692cf3f92aa5324d9707 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 20:48:15 +0200 Subject: [PATCH 32/52] remove commented lines in ubuntu_setup.sh --- ubuntu_setup.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ubuntu_setup.sh b/ubuntu_setup.sh index 213e53e46..c69ad1f66 100644 --- a/ubuntu_setup.sh +++ b/ubuntu_setup.sh @@ -1,7 +1,4 @@ -# locale-gen "en_US.UTF-8" -# update-locale LANG=en_US.utf8 -# update-locale LC_ALL=en_US.utf8 -# reboot + apt -y update apt -y upgrade apt -y install git redis-server python3-pip ffmpeg imagemagick tmux nginx snapd ufw gpg-agent htop nano From 3cf838af292cf7b1f25d45b8623268ddf6b9f1d8 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 21:07:45 +0200 Subject: [PATCH 33/52] fix thumbnails and add opera-proxy to docker --- docker-compose.yml | 7 + files/helpers/const.py | 3 +- files/helpers/media.py | 5 +- files/routes/posts.py | 2 +- nginx.conf | 4 +- redis.conf | 1372 ---------------------------------------- 6 files changed, 15 insertions(+), 1378 deletions(-) delete mode 100644 redis.conf diff --git a/docker-compose.yml b/docker-compose.yml index 4cafb5afa..ad40d3762 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,7 @@ services: environment: - DATABASE_URL=postgresql://postgres@postgres:5432 - REDIS_URL=redis://redis + - OPERA_URL=http://opera-proxy:18080 links: - "redis" - "postgres" @@ -37,3 +38,9 @@ services: - POSTGRES_HOST_AUTH_METHOD=trust ports: - "5432:5432" + + opera-proxy: + container_name: "opera-proxy" + image: yarmak/opera-proxy + ports: + - "18080:18080" diff --git a/files/helpers/const.py b/files/helpers/const.py index 70d001cc6..00e7847ba 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -957,7 +957,8 @@ YOUTUBE_KEY = environ.get("YOUTUBE_KEY", "").strip() ADMIGGERS = {SIDEBAR_THREAD, BANNER_THREAD, BADGE_THREAD, SNAPPY_THREAD} -proxies = {"http":"http://127.0.0.1:18080","https":"http://127.0.0.1:18080"} +OPERA_URL = environ.get("OPERA_URL", "http://localhost:18080") +proxies = {"http":OPERA_URL,"https":OPERA_URL} blackjack = environ.get("BLACKJACK", "").strip() diff --git a/files/helpers/media.py b/files/helpers/media.py index 976789226..395cabfa0 100644 --- a/files/helpers/media.py +++ b/files/helpers/media.py @@ -112,7 +112,7 @@ def process_video(file): -def process_image(filename=None, resize=0, trim=False, uploader=None, patron=False): +def process_image(filename=None, resize=0, trim=False, uploader=None, patron=False, db=None): size = os.stat(filename).st_size if size > 16 * 1024 * 1024 or not patron and size > 8 * 1024 * 1024: @@ -180,6 +180,7 @@ def process_image(filename=None, resize=0, trim=False, uploader=None, patron=Fal user_id=uploader or g.v.id, size=os.stat(filename).st_size ) - g.db.add(media) + db = db or g.db + db.add(media) return filename diff --git a/files/routes/posts.py b/files/routes/posts.py index 9dbb81c1d..16b4b7eb6 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -598,7 +598,7 @@ def thumbnail_thread(pid): for chunk in image_req.iter_content(1024): file.write(chunk) - post.thumburl = process_image(name, resize=100, uploader=post.author_id) + post.thumburl = process_image(name, resize=100, uploader=post.author_id, db=db) db.add(post) db.commit() db.close() diff --git a/nginx.conf b/nginx.conf index efb4743de..9a1313b55 100644 --- a/nginx.conf +++ b/nginx.conf @@ -14,10 +14,10 @@ server { proxy_buffering off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; - proxy_pass http://127.0.0.1:5001/socket.io; + proxy_pass http://localhost:5001/socket.io; } location /chat { - proxy_pass http://127.0.0.1:5001/chat; + proxy_pass http://localhost:5001/chat; } location /images/ { diff --git a/redis.conf b/redis.conf deleted file mode 100644 index e048e8d30..000000000 --- a/redis.conf +++ /dev/null @@ -1,1372 +0,0 @@ -# Redis configuration file example. -# -# Note that in order to read the configuration file, Redis must be -# started with the file path as first argument: -# -# ./redis-server /path/to/redis.conf - -# Note on units: when memory size is needed, it is possible to specify -# it in the usual form of 1k 5GB 4M and so forth: -# -# 1k => 1000 bytes -# 1kb => 1024 bytes -# 1m => 1000000 bytes -# 1mb => 1024*1024 bytes -# 1g => 1000000000 bytes -# 1gb => 1024*1024*1024 bytes -# -# units are case insensitive so 1GB 1Gb 1gB are all the same. - -################################## INCLUDES ################################### - -# Include one or more other config files here. This is useful if you -# have a standard template that goes to all Redis servers but also need -# to customize a few per-server settings. Include files can include -# other files, so use this wisely. -# -# Notice option "include" won't be rewritten by command "CONFIG REWRITE" -# from admin or Redis Sentinel. Since Redis always uses the last processed -# line as value of a configuration directive, you'd better put includes -# at the beginning of this file to avoid overwriting config change at runtime. -# -# If instead you are interested in using includes to override configuration -# options, it is better to use include as the last line. -# -# include /path/to/local.conf -# include /path/to/other.conf - -################################## MODULES ##################################### - -# Load modules at startup. If the server is not able to load modules -# it will abort. It is possible to use multiple loadmodule directives. -# -# loadmodule /path/to/my_module.so -# loadmodule /path/to/other_module.so - -################################## NETWORK ##################################### - -# By default, if no "bind" configuration directive is specified, Redis listens -# for connections from all the network interfaces available on the server. -# It is possible to listen to just one or multiple selected interfaces using -# the "bind" configuration directive, followed by one or more IP addresses. -# -# Examples: -# -# bind 192.168.1.100 10.0.0.1 -# bind 127.0.0.1 ::1 -# -# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the -# internet, binding to all the interfaces is dangerous and will expose the -# instance to everybody on the internet. So by default we uncomment the -# following bind directive, that will force Redis to listen only into -# the IPv4 loopback interface address (this means Redis will be able to -# accept connections only from clients running into the same computer it -# is running). -# -# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES -# JUST COMMENT THE FOLLOWING LINE. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -bind 127.0.0.1 ::1 - -# Protected mode is a layer of security protection, in order to avoid that -# Redis instances left open on the internet are accessed and exploited. -# -# When protected mode is on and if: -# -# 1) The server is not binding explicitly to a set of addresses using the -# "bind" directive. -# 2) No password is configured. -# -# The server only accepts connections from clients connecting from the -# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain -# sockets. -# -# By default protected mode is enabled. You should disable it only if -# you are sure you want clients from other hosts to connect to Redis -# even if no authentication is configured, nor a specific set of interfaces -# are explicitly listed using the "bind" directive. -protected-mode yes - -# Accept connections on the specified port, default is 6379 (IANA #815344). -# If port 0 is specified Redis will not listen on a TCP socket. -port 6379 - -# TCP listen() backlog. -# -# In high requests-per-second environments you need an high backlog in order -# to avoid slow clients connections issues. Note that the Linux kernel -# will silently truncate it to the value of /proc/sys/net/core/somaxconn so -# make sure to raise both the value of somaxconn and tcp_max_syn_backlog -# in order to get the desired effect. -tcp-backlog 511 - -# Unix socket. -# -# Specify the path for the Unix socket that will be used to listen for -# incoming connections. There is no default, so Redis will not listen -# on a unix socket when not specified. -# -# unixsocket /var/run/redis/redis-server.sock -# unixsocketperm 700 - -# Close the connection after a client is idle for N seconds (0 to disable) -timeout 0 - -# TCP keepalive. -# -# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence -# of communication. This is useful for two reasons: -# -# 1) Detect dead peers. -# 2) Take the connection alive from the point of view of network -# equipment in the middle. -# -# On Linux, the specified value (in seconds) is the period used to send ACKs. -# Note that to close the connection the double of the time is needed. -# On other kernels the period depends on the kernel configuration. -# -# A reasonable value for this option is 300 seconds, which is the new -# Redis default starting with Redis 3.2.1. -tcp-keepalive 300 - -################################# GENERAL ##################################### - -# By default Redis does not run as a daemon. Use 'yes' if you need it. -# Note that Redis will write a pid file in /var/run/redis.pid when daemonized. -daemonize yes - -# If you run Redis from upstart or systemd, Redis can interact with your -# supervision tree. Options: -# supervised no - no supervision interaction -# supervised upstart - signal upstart by putting Redis into SIGSTOP mode -# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET -# supervised auto - detect upstart or systemd method based on -# UPSTART_JOB or NOTIFY_SOCKET environment variables -# Note: these supervision methods only signal "process is ready." -# They do not enable continuous liveness pings back to your supervisor. -supervised systemd - -# If a pid file is specified, Redis writes it where specified at startup -# and removes it at exit. -# -# When the server runs non daemonized, no pid file is created if none is -# specified in the configuration. When the server is daemonized, the pid file -# is used even if not specified, defaulting to "/var/run/redis.pid". -# -# Creating a pid file is best effort: if Redis is not able to create it -# nothing bad happens, the server will start and run normally. -pidfile /var/run/redis/redis-server.pid - -# Specify the server verbosity level. -# This can be one of: -# debug (a lot of information, useful for development/testing) -# verbose (many rarely useful info, but not a mess like the debug level) -# notice (moderately verbose, what you want in production probably) -# warning (only very important / critical messages are logged) -loglevel notice - -# Specify the log file name. Also the empty string can be used to force -# Redis to log on the standard output. Note that if you use standard -# output for logging but daemonize, logs will be sent to /dev/null -logfile /var/log/redis/redis-server.log - -# To enable logging to the system logger, just set 'syslog-enabled' to yes, -# and optionally update the other syslog parameters to suit your needs. -# syslog-enabled no - -# Specify the syslog identity. -# syslog-ident redis - -# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. -# syslog-facility local0 - -# Set the number of databases. The default database is DB 0, you can select -# a different one on a per-connection basis using SELECT where -# dbid is a number between 0 and 'databases'-1 -databases 16 - -# By default Redis shows an ASCII art logo only when started to log to the -# standard output and if the standard output is a TTY. Basically this means -# that normally a logo is displayed only in interactive sessions. -# -# However it is possible to force the pre-4.0 behavior and always show a -# ASCII art logo in startup logs by setting the following option to yes. -always-show-logo yes - -################################ SNAPSHOTTING ################################ -# -# Save the DB on disk: -# -# save -# -# Will save the DB if both the given number of seconds and the given -# number of write operations against the DB occurred. -# -# In the example below the behaviour will be to save: -# after 900 sec (15 min) if at least 1 key changed -# after 300 sec (5 min) if at least 10 keys changed -# after 60 sec if at least 10000 keys changed -# -# Note: you can disable saving completely by commenting out all "save" lines. -# -# It is also possible to remove all the previously configured save -# points by adding a save directive with a single empty string argument -# like in the following example: -# -# save "" - -save 900 1 -save 300 10 -save 60 10000 - -# By default Redis will stop accepting writes if RDB snapshots are enabled -# (at least one save point) and the latest background save failed. -# This will make the user aware (in a hard way) that data is not persisting -# on disk properly, otherwise chances are that no one will notice and some -# disaster will happen. -# -# If the background saving process will start working again Redis will -# automatically allow writes again. -# -# However if you have setup your proper monitoring of the Redis server -# and persistence, you may want to disable this feature so that Redis will -# continue to work as usual even if there are problems with disk, -# permissions, and so forth. -stop-writes-on-bgsave-error yes - -# Compress string objects using LZF when dump .rdb databases? -# For default that's set to 'yes' as it's almost always a win. -# If you want to save some CPU in the saving child set it to 'no' but -# the dataset will likely be bigger if you have compressible values or keys. -rdbcompression yes - -# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. -# This makes the format more resistant to corruption but there is a performance -# hit to pay (around 10%) when saving and loading RDB files, so you can disable it -# for maximum performances. -# -# RDB files created with checksum disabled have a checksum of zero that will -# tell the loading code to skip the check. -rdbchecksum yes - -# The filename where to dump the DB -dbfilename dump.rdb - -# The working directory. -# -# The DB will be written inside this directory, with the filename specified -# above using the 'dbfilename' configuration directive. -# -# The Append Only File will also be created inside this directory. -# -# Note that you must specify a directory here, not a file name. -dir /var/lib/redis - -################################# REPLICATION ################################# - -# Master-Replica replication. Use replicaof to make a Redis instance a copy of -# another Redis server. A few things to understand ASAP about Redis replication. -# -# +------------------+ +---------------+ -# | Master | ---> | Replica | -# | (receive writes) | | (exact copy) | -# +------------------+ +---------------+ -# -# 1) Redis replication is asynchronous, but you can configure a master to -# stop accepting writes if it appears to be not connected with at least -# a given number of replicas. -# 2) Redis replicas are able to perform a partial resynchronization with the -# master if the replication link is lost for a relatively small amount of -# time. You may want to configure the replication backlog size (see the next -# sections of this file) with a sensible value depending on your needs. -# 3) Replication is automatic and does not need user intervention. After a -# network partition replicas automatically try to reconnect to masters -# and resynchronize with them. -# -# replicaof - -# If the master is password protected (using the "requirepass" configuration -# directive below) it is possible to tell the replica to authenticate before -# starting the replication synchronization process, otherwise the master will -# refuse the replica request. -# -# masterauth - -# When a replica loses its connection with the master, or when the replication -# is still in progress, the replica can act in two different ways: -# -# 1) if replica-serve-stale-data is set to 'yes' (the default) the replica will -# still reply to client requests, possibly with out of date data, or the -# data set may just be empty if this is the first synchronization. -# -# 2) if replica-serve-stale-data is set to 'no' the replica will reply with -# an error "SYNC with master in progress" to all the kind of commands -# but to INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, -# SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, -# COMMAND, POST, HOST: and LATENCY. -# -replica-serve-stale-data yes - -# You can configure a replica instance to accept writes or not. Writing against -# a replica instance may be useful to store some ephemeral data (because data -# written on a replica will be easily deleted after resync with the master) but -# may also cause problems if clients are writing to it because of a -# misconfiguration. -# -# Since Redis 2.6 by default replicas are read-only. -# -# Note: read only replicas are not designed to be exposed to untrusted clients -# on the internet. It's just a protection layer against misuse of the instance. -# Still a read only replica exports by default all the administrative commands -# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve -# security of read only replicas using 'rename-command' to shadow all the -# administrative / dangerous commands. -replica-read-only yes - -# Replication SYNC strategy: disk or socket. -# -# ------------------------------------------------------- -# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY -# ------------------------------------------------------- -# -# New replicas and reconnecting replicas that are not able to continue the replication -# process just receiving differences, need to do what is called a "full -# synchronization". An RDB file is transmitted from the master to the replicas. -# The transmission can happen in two different ways: -# -# 1) Disk-backed: The Redis master creates a new process that writes the RDB -# file on disk. Later the file is transferred by the parent -# process to the replicas incrementally. -# 2) Diskless: The Redis master creates a new process that directly writes the -# RDB file to replica sockets, without touching the disk at all. -# -# With disk-backed replication, while the RDB file is generated, more replicas -# can be queued and served with the RDB file as soon as the current child producing -# the RDB file finishes its work. With diskless replication instead once -# the transfer starts, new replicas arriving will be queued and a new transfer -# will start when the current one terminates. -# -# When diskless replication is used, the master waits a configurable amount of -# time (in seconds) before starting the transfer in the hope that multiple replicas -# will arrive and the transfer can be parallelized. -# -# With slow disks and fast (large bandwidth) networks, diskless replication -# works better. -repl-diskless-sync no - -# When diskless replication is enabled, it is possible to configure the delay -# the server waits in order to spawn the child that transfers the RDB via socket -# to the replicas. -# -# This is important since once the transfer starts, it is not possible to serve -# new replicas arriving, that will be queued for the next RDB transfer, so the server -# waits a delay in order to let more replicas arrive. -# -# The delay is specified in seconds, and by default is 5 seconds. To disable -# it entirely just set it to 0 seconds and the transfer will start ASAP. -repl-diskless-sync-delay 5 - -# Replicas send PINGs to server in a predefined interval. It's possible to change -# this interval with the repl_ping_replica_period option. The default value is 10 -# seconds. -# -# repl-ping-replica-period 10 - -# The following option sets the replication timeout for: -# -# 1) Bulk transfer I/O during SYNC, from the point of view of replica. -# 2) Master timeout from the point of view of replicas (data, pings). -# 3) Replica timeout from the point of view of masters (REPLCONF ACK pings). -# -# It is important to make sure that this value is greater than the value -# specified for repl-ping-replica-period otherwise a timeout will be detected -# every time there is low traffic between the master and the replica. -# -# repl-timeout 60 - -# Disable TCP_NODELAY on the replica socket after SYNC? -# -# If you select "yes" Redis will use a smaller number of TCP packets and -# less bandwidth to send data to replicas. But this can add a delay for -# the data to appear on the replica side, up to 40 milliseconds with -# Linux kernels using a default configuration. -# -# If you select "no" the delay for data to appear on the replica side will -# be reduced but more bandwidth will be used for replication. -# -# By default we optimize for low latency, but in very high traffic conditions -# or when the master and replicas are many hops away, turning this to "yes" may -# be a good idea. -repl-disable-tcp-nodelay no - -# Set the replication backlog size. The backlog is a buffer that accumulates -# replica data when replicas are disconnected for some time, so that when a replica -# wants to reconnect again, often a full resync is not needed, but a partial -# resync is enough, just passing the portion of data the replica missed while -# disconnected. -# -# The bigger the replication backlog, the longer the time the replica can be -# disconnected and later be able to perform a partial resynchronization. -# -# The backlog is only allocated once there is at least a replica connected. -# -# repl-backlog-size 1mb - -# After a master has no longer connected replicas for some time, the backlog -# will be freed. The following option configures the amount of seconds that -# need to elapse, starting from the time the last replica disconnected, for -# the backlog buffer to be freed. -# -# Note that replicas never free the backlog for timeout, since they may be -# promoted to masters later, and should be able to correctly "partially -# resynchronize" with the replicas: hence they should always accumulate backlog. -# -# A value of 0 means to never release the backlog. -# -# repl-backlog-ttl 3600 - -# The replica priority is an integer number published by Redis in the INFO output. -# It is used by Redis Sentinel in order to select a replica to promote into a -# master if the master is no longer working correctly. -# -# A replica with a low priority number is considered better for promotion, so -# for instance if there are three replicas with priority 10, 100, 25 Sentinel will -# pick the one with priority 10, that is the lowest. -# -# However a special priority of 0 marks the replica as not able to perform the -# role of master, so a replica with priority of 0 will never be selected by -# Redis Sentinel for promotion. -# -# By default the priority is 100. -replica-priority 100 - -# It is possible for a master to stop accepting writes if there are less than -# N replicas connected, having a lag less or equal than M seconds. -# -# The N replicas need to be in "online" state. -# -# The lag in seconds, that must be <= the specified value, is calculated from -# the last ping received from the replica, that is usually sent every second. -# -# This option does not GUARANTEE that N replicas will accept the write, but -# will limit the window of exposure for lost writes in case not enough replicas -# are available, to the specified number of seconds. -# -# For example to require at least 3 replicas with a lag <= 10 seconds use: -# -# min-replicas-to-write 3 -# min-replicas-max-lag 10 -# -# Setting one or the other to 0 disables the feature. -# -# By default min-replicas-to-write is set to 0 (feature disabled) and -# min-replicas-max-lag is set to 10. - -# A Redis master is able to list the address and port of the attached -# replicas in different ways. For example the "INFO replication" section -# offers this information, which is used, among other tools, by -# Redis Sentinel in order to discover replica instances. -# Another place where this info is available is in the output of the -# "ROLE" command of a master. -# -# The listed IP and address normally reported by a replica is obtained -# in the following way: -# -# IP: The address is auto detected by checking the peer address -# of the socket used by the replica to connect with the master. -# -# Port: The port is communicated by the replica during the replication -# handshake, and is normally the port that the replica is using to -# listen for connections. -# -# However when port forwarding or Network Address Translation (NAT) is -# used, the replica may be actually reachable via different IP and port -# pairs. The following two options can be used by a replica in order to -# report to its master a specific set of IP and port, so that both INFO -# and ROLE will report those values. -# -# There is no need to use both the options if you need to override just -# the port or the IP address. -# -# replica-announce-ip 5.5.5.5 -# replica-announce-port 1234 - -################################## SECURITY ################################### - -# Require clients to issue AUTH before processing any other -# commands. This might be useful in environments in which you do not trust -# others with access to the host running redis-server. -# -# This should stay commented out for backward compatibility and because most -# people do not need auth (e.g. they run their own servers). -# -# Warning: since Redis is pretty fast an outside user can try up to -# 150k passwords per second against a good box. This means that you should -# use a very strong password otherwise it will be very easy to break. -# -# requirepass foobared - -# Command renaming. -# -# It is possible to change the name of dangerous commands in a shared -# environment. For instance the CONFIG command may be renamed into something -# hard to guess so that it will still be available for internal-use tools -# but not available for general clients. -# -# Example: -# -# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 -# -# It is also possible to completely kill a command by renaming it into -# an empty string: -# -# rename-command CONFIG "" -# -# Please note that changing the name of commands that are logged into the -# AOF file or transmitted to replicas may cause problems. - -################################### CLIENTS #################################### - -# Set the max number of connected clients at the same time. By default -# this limit is set to 10000 clients, however if the Redis server is not -# able to configure the process file limit to allow for the specified limit -# the max number of allowed clients is set to the current file limit -# minus 32 (as Redis reserves a few file descriptors for internal uses). -# -# Once the limit is reached Redis will close all the new connections sending -# an error 'max number of clients reached'. -# -# maxclients 10000 - -############################## MEMORY MANAGEMENT ################################ - -# Set a memory usage limit to the specified amount of bytes. -# When the memory limit is reached Redis will try to remove keys -# according to the eviction policy selected (see maxmemory-policy). -# -# If Redis can't remove keys according to the policy, or if the policy is -# set to 'noeviction', Redis will start to reply with errors to commands -# that would use more memory, like SET, LPUSH, and so on, and will continue -# to reply to read-only commands like GET. -# -# This option is usually useful when using Redis as an LRU or LFU cache, or to -# set a hard memory limit for an instance (using the 'noeviction' policy). -# -# WARNING: If you have replicas attached to an instance with maxmemory on, -# the size of the output buffers needed to feed the replicas are subtracted -# from the used memory count, so that network problems / resyncs will -# not trigger a loop where keys are evicted, and in turn the output -# buffer of replicas is full with DELs of keys evicted triggering the deletion -# of more keys, and so forth until the database is completely emptied. -# -# In short... if you have replicas attached it is suggested that you set a lower -# limit for maxmemory so that there is some free RAM on the system for replica -# output buffers (but this is not needed if the policy is 'noeviction'). -# -# maxmemory - -# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory -# is reached. You can select among five behaviors: -# -# volatile-lru -> Evict using approximated LRU among the keys with an expire set. -# allkeys-lru -> Evict any key using approximated LRU. -# volatile-lfu -> Evict using approximated LFU among the keys with an expire set. -# allkeys-lfu -> Evict any key using approximated LFU. -# volatile-random -> Remove a random key among the ones with an expire set. -# allkeys-random -> Remove a random key, any key. -# volatile-ttl -> Remove the key with the nearest expire time (minor TTL) -# noeviction -> Don't evict anything, just return an error on write operations. -# -# LRU means Least Recently Used -# LFU means Least Frequently Used -# -# Both LRU, LFU and volatile-ttl are implemented using approximated -# randomized algorithms. -# -# Note: with any of the above policies, Redis will return an error on write -# operations, when there are no suitable keys for eviction. -# -# At the date of writing these commands are: set setnx setex append -# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd -# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby -# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby -# getset mset msetnx exec sort -# -# The default is: -# -# maxmemory-policy noeviction - -# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated -# algorithms (in order to save memory), so you can tune it for speed or -# accuracy. For default Redis will check five keys and pick the one that was -# used less recently, you can change the sample size using the following -# configuration directive. -# -# The default of 5 produces good enough results. 10 Approximates very closely -# true LRU but costs more CPU. 3 is faster but not very accurate. -# -# maxmemory-samples 5 - -# Starting from Redis 5, by default a replica will ignore its maxmemory setting -# (unless it is promoted to master after a failover or manually). It means -# that the eviction of keys will be just handled by the master, sending the -# DEL commands to the replica as keys evict in the master side. -# -# This behavior ensures that masters and replicas stay consistent, and is usually -# what you want, however if your replica is writable, or you want the replica to have -# a different memory setting, and you are sure all the writes performed to the -# replica are idempotent, then you may change this default (but be sure to understand -# what you are doing). -# -# Note that since the replica by default does not evict, it may end using more -# memory than the one set via maxmemory (there are certain buffers that may -# be larger on the replica, or data structures may sometimes take more memory and so -# forth). So make sure you monitor your replicas and make sure they have enough -# memory to never hit a real out-of-memory condition before the master hits -# the configured maxmemory setting. -# -# replica-ignore-maxmemory yes - -############################# LAZY FREEING #################################### - -# Redis has two primitives to delete keys. One is called DEL and is a blocking -# deletion of the object. It means that the server stops processing new commands -# in order to reclaim all the memory associated with an object in a synchronous -# way. If the key deleted is associated with a small object, the time needed -# in order to execute the DEL command is very small and comparable to most other -# O(1) or O(log_N) commands in Redis. However if the key is associated with an -# aggregated value containing millions of elements, the server can block for -# a long time (even seconds) in order to complete the operation. -# -# For the above reasons Redis also offers non blocking deletion primitives -# such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and -# FLUSHDB commands, in order to reclaim memory in background. Those commands -# are executed in constant time. Another thread will incrementally free the -# object in the background as fast as possible. -# -# DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled. -# It's up to the design of the application to understand when it is a good -# idea to use one or the other. However the Redis server sometimes has to -# delete keys or flush the whole database as a side effect of other operations. -# Specifically Redis deletes objects independently of a user call in the -# following scenarios: -# -# 1) On eviction, because of the maxmemory and maxmemory policy configurations, -# in order to make room for new data, without going over the specified -# memory limit. -# 2) Because of expire: when a key with an associated time to live (see the -# EXPIRE command) must be deleted from memory. -# 3) Because of a side effect of a command that stores data on a key that may -# already exist. For example the RENAME command may delete the old key -# content when it is replaced with another one. Similarly SUNIONSTORE -# or SORT with STORE option may delete existing keys. The SET command -# itself removes any old content of the specified key in order to replace -# it with the specified string. -# 4) During replication, when a replica performs a full resynchronization with -# its master, the content of the whole database is removed in order to -# load the RDB file just transferred. -# -# In all the above cases the default is to delete objects in a blocking way, -# like if DEL was called. However you can configure each case specifically -# in order to instead release memory in a non-blocking way like if UNLINK -# was called, using the following configuration directives: - -lazyfree-lazy-eviction no -lazyfree-lazy-expire no -lazyfree-lazy-server-del no -replica-lazy-flush no - -############################## APPEND ONLY MODE ############################### - -# By default Redis asynchronously dumps the dataset on disk. This mode is -# good enough in many applications, but an issue with the Redis process or -# a power outage may result into a few minutes of writes lost (depending on -# the configured save points). -# -# The Append Only File is an alternative persistence mode that provides -# much better durability. For instance using the default data fsync policy -# (see later in the config file) Redis can lose just one second of writes in a -# dramatic event like a server power outage, or a single write if something -# wrong with the Redis process itself happens, but the operating system is -# still running correctly. -# -# AOF and RDB persistence can be enabled at the same time without problems. -# If the AOF is enabled on startup Redis will load the AOF, that is the file -# with the better durability guarantees. -# -# Please check https://redis.io/topics/persistence for more information. - -appendonly no - -# The name of the append only file (default: "appendonly.aof") - -appendfilename "appendonly.aof" - -# The fsync() call tells the Operating System to actually write data on disk -# instead of waiting for more data in the output buffer. Some OS will really flush -# data on disk, some other OS will just try to do it ASAP. -# -# Redis supports three different modes: -# -# no: don't fsync, just let the OS flush the data when it wants. Faster. -# always: fsync after every write to the append only log. Slow, Safest. -# everysec: fsync only one time every second. Compromise. -# -# The default is "everysec", as that's usually the right compromise between -# speed and data safety. It's up to you to understand if you can relax this to -# "no" that will let the operating system flush the output buffer when -# it wants, for better performances (but if you can live with the idea of -# some data loss consider the default persistence mode that's snapshotting), -# or on the contrary, use "always" that's very slow but a bit safer than -# everysec. -# -# More details please check the following article: -# https://antirez.com/post/redis-persistence-demystified.html -# -# If unsure, use "everysec". - -# appendfsync always -appendfsync everysec -# appendfsync no - -# When the AOF fsync policy is set to always or everysec, and a background -# saving process (a background save or AOF log background rewriting) is -# performing a lot of I/O against the disk, in some Linux configurations -# Redis may block too long on the fsync() call. Note that there is no fix for -# this currently, as even performing fsync in a different thread will block -# our synchronous write(2) call. -# -# In order to mitigate this problem it's possible to use the following option -# that will prevent fsync() from being called in the main process while a -# BGSAVE or BGREWRITEAOF is in progress. -# -# This means that while another child is saving, the durability of Redis is -# the same as "appendfsync none". In practical terms, this means that it is -# possible to lose up to 30 seconds of log in the worst scenario (with the -# default Linux settings). -# -# If you have latency problems turn this to "yes". Otherwise leave it as -# "no" that is the safest pick from the point of view of durability. - -no-appendfsync-on-rewrite no - -# Automatic rewrite of the append only file. -# Redis is able to automatically rewrite the log file implicitly calling -# BGREWRITEAOF when the AOF log size grows by the specified percentage. -# -# This is how it works: Redis remembers the size of the AOF file after the -# latest rewrite (if no rewrite has happened since the restart, the size of -# the AOF at startup is used). -# -# This base size is compared to the current size. If the current size is -# bigger than the specified percentage, the rewrite is triggered. Also -# you need to specify a minimal size for the AOF file to be rewritten, this -# is useful to avoid rewriting the AOF file even if the percentage increase -# is reached but it is still pretty small. -# -# Specify a percentage of zero in order to disable the automatic AOF -# rewrite feature. - -auto-aof-rewrite-percentage 100 -auto-aof-rewrite-min-size 64mb - -# An AOF file may be found to be truncated at the end during the Redis -# startup process, when the AOF data gets loaded back into memory. -# This may happen when the system where Redis is running -# crashes, especially when an ext4 filesystem is mounted without the -# data=ordered option (however this can't happen when Redis itself -# crashes or aborts but the operating system still works correctly). -# -# Redis can either exit with an error when this happens, or load as much -# data as possible (the default now) and start if the AOF file is found -# to be truncated at the end. The following option controls this behavior. -# -# If aof-load-truncated is set to yes, a truncated AOF file is loaded and -# the Redis server starts emitting a log to inform the user of the event. -# Otherwise if the option is set to no, the server aborts with an error -# and refuses to start. When the option is set to no, the user requires -# to fix the AOF file using the "redis-check-aof" utility before to restart -# the server. -# -# Note that if the AOF file will be found to be corrupted in the middle -# the server will still exit with an error. This option only applies when -# Redis will try to read more data from the AOF file but not enough bytes -# will be found. -aof-load-truncated yes - -# When rewriting the AOF file, Redis is able to use an RDB preamble in the -# AOF file for faster rewrites and recoveries. When this option is turned -# on the rewritten AOF file is composed of two different stanzas: -# -# [RDB file][AOF tail] -# -# When loading Redis recognizes that the AOF file starts with the "REDIS" -# string and loads the prefixed RDB file, and continues loading the AOF -# tail. -aof-use-rdb-preamble yes - -################################ LUA SCRIPTING ############################### - -# Max execution time of a Lua script in milliseconds. -# -# If the maximum execution time is reached Redis will log that a script is -# still in execution after the maximum allowed time and will start to -# reply to queries with an error. -# -# When a long running script exceeds the maximum execution time only the -# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be -# used to stop a script that did not yet called write commands. The second -# is the only way to shut down the server in the case a write command was -# already issued by the script but the user doesn't want to wait for the natural -# termination of the script. -# -# Set it to 0 or a negative value for unlimited execution without warnings. -lua-time-limit 5000 - -################################ REDIS CLUSTER ############################### - -# Normal Redis instances can't be part of a Redis Cluster; only nodes that are -# started as cluster nodes can. In order to start a Redis instance as a -# cluster node enable the cluster support uncommenting the following: -# -# cluster-enabled yes - -# Every cluster node has a cluster configuration file. This file is not -# intended to be edited by hand. It is created and updated by Redis nodes. -# Every Redis Cluster node requires a different cluster configuration file. -# Make sure that instances running in the same system do not have -# overlapping cluster configuration file names. -# -# cluster-config-file nodes-6379.conf - -# Cluster node timeout is the amount of milliseconds a node must be unreachable -# for it to be considered in failure state. -# Most other internal time limits are multiple of the node timeout. -# -# cluster-node-timeout 15000 - -# A replica of a failing master will avoid to start a failover if its data -# looks too old. -# -# There is no simple way for a replica to actually have an exact measure of -# its "data age", so the following two checks are performed: -# -# 1) If there are multiple replicas able to failover, they exchange messages -# in order to try to give an advantage to the replica with the best -# replication offset (more data from the master processed). -# Replicas will try to get their rank by offset, and apply to the start -# of the failover a delay proportional to their rank. -# -# 2) Every single replica computes the time of the last interaction with -# its master. This can be the last ping or command received (if the master -# is still in the "connected" state), or the time that elapsed since the -# disconnection with the master (if the replication link is currently down). -# If the last interaction is too old, the replica will not try to failover -# at all. -# -# The point "2" can be tuned by user. Specifically a replica will not perform -# the failover if, since the last interaction with the master, the time -# elapsed is greater than: -# -# (node-timeout * replica-validity-factor) + repl-ping-replica-period -# -# So for example if node-timeout is 30 seconds, and the replica-validity-factor -# is 10, and assuming a default repl-ping-replica-period of 10 seconds, the -# replica will not try to failover if it was not able to talk with the master -# for longer than 310 seconds. -# -# A large replica-validity-factor may allow replicas with too old data to failover -# a master, while a too small value may prevent the cluster from being able to -# elect a replica at all. -# -# For maximum availability, it is possible to set the replica-validity-factor -# to a value of 0, which means, that replicas will always try to failover the -# master regardless of the last time they interacted with the master. -# (However they'll always try to apply a delay proportional to their -# offset rank). -# -# Zero is the only value able to guarantee that when all the partitions heal -# the cluster will always be able to continue. -# -# cluster-replica-validity-factor 10 - -# Cluster replicas are able to migrate to orphaned masters, that are masters -# that are left without working replicas. This improves the cluster ability -# to resist to failures as otherwise an orphaned master can't be failed over -# in case of failure if it has no working replicas. -# -# Replicas migrate to orphaned masters only if there are still at least a -# given number of other working replicas for their old master. This number -# is the "migration barrier". A migration barrier of 1 means that a replica -# will migrate only if there is at least 1 other working replica for its master -# and so forth. It usually reflects the number of replicas you want for every -# master in your cluster. -# -# Default is 1 (replicas migrate only if their masters remain with at least -# one replica). To disable migration just set it to a very large value. -# A value of 0 can be set but is useful only for debugging and dangerous -# in production. -# -# cluster-migration-barrier 1 - -# By default Redis Cluster nodes stop accepting queries if they detect there -# is at least an hash slot uncovered (no available node is serving it). -# This way if the cluster is partially down (for example a range of hash slots -# are no longer covered) all the cluster becomes, eventually, unavailable. -# It automatically returns available as soon as all the slots are covered again. -# -# However sometimes you want the subset of the cluster which is working, -# to continue to accept queries for the part of the key space that is still -# covered. In order to do so, just set the cluster-require-full-coverage -# option to no. -# -# cluster-require-full-coverage yes - -# This option, when set to yes, prevents replicas from trying to failover its -# master during master failures. However the master can still perform a -# manual failover, if forced to do so. -# -# This is useful in different scenarios, especially in the case of multiple -# data center operations, where we want one side to never be promoted if not -# in the case of a total DC failure. -# -# cluster-replica-no-failover no - -# In order to setup your cluster make sure to read the documentation -# available at https://redis.io web site. - -########################## CLUSTER DOCKER/NAT support ######################## - -# In certain deployments, Redis Cluster nodes address discovery fails, because -# addresses are NAT-ted or because ports are forwarded (the typical case is -# Docker and other containers). -# -# In order to make Redis Cluster working in such environments, a static -# configuration where each node knows its public address is needed. The -# following two options are used for this scope, and are: -# -# * cluster-announce-ip -# * cluster-announce-port -# * cluster-announce-bus-port -# -# Each instruct the node about its address, client port, and cluster message -# bus port. The information is then published in the header of the bus packets -# so that other nodes will be able to correctly map the address of the node -# publishing the information. -# -# If the above options are not used, the normal Redis Cluster auto-detection -# will be used instead. -# -# Note that when remapped, the bus port may not be at the fixed offset of -# clients port + 10000, so you can specify any port and bus-port depending -# on how they get remapped. If the bus-port is not set, a fixed offset of -# 10000 will be used as usually. -# -# Example: -# -# cluster-announce-ip 10.1.1.5 -# cluster-announce-port 6379 -# cluster-announce-bus-port 6380 - -################################## SLOW LOG ################################### - -# The Redis Slow Log is a system to log queries that exceeded a specified -# execution time. The execution time does not include the I/O operations -# like talking with the client, sending the reply and so forth, -# but just the time needed to actually execute the command (this is the only -# stage of command execution where the thread is blocked and can not serve -# other requests in the meantime). -# -# You can configure the slow log with two parameters: one tells Redis -# what is the execution time, in microseconds, to exceed in order for the -# command to get logged, and the other parameter is the length of the -# slow log. When a new command is logged the oldest one is removed from the -# queue of logged commands. - -# The following time is expressed in microseconds, so 1000000 is equivalent -# to one second. Note that a negative number disables the slow log, while -# a value of zero forces the logging of every command. -slowlog-log-slower-than 10000 - -# There is no limit to this length. Just be aware that it will consume memory. -# You can reclaim memory used by the slow log with SLOWLOG RESET. -slowlog-max-len 128 - -################################ LATENCY MONITOR ############################## - -# The Redis latency monitoring subsystem samples different operations -# at runtime in order to collect data related to possible sources of -# latency of a Redis instance. -# -# Via the LATENCY command this information is available to the user that can -# print graphs and obtain reports. -# -# The system only logs operations that were performed in a time equal or -# greater than the amount of milliseconds specified via the -# latency-monitor-threshold configuration directive. When its value is set -# to zero, the latency monitor is turned off. -# -# By default latency monitoring is disabled since it is mostly not needed -# if you don't have latency issues, and collecting data has a performance -# impact, that while very small, can be measured under big load. Latency -# monitoring can easily be enabled at runtime using the command -# "CONFIG SET latency-monitor-threshold " if needed. -latency-monitor-threshold 0 - -############################# EVENT NOTIFICATION ############################## - -# Redis can notify Pub/Sub clients about events happening in the key space. -# This feature is documented at https://redis.io/topics/notifications -# -# For instance if keyspace events notification is enabled, and a client -# performs a DEL operation on key "foo" stored in the Database 0, two -# messages will be published via Pub/Sub: -# -# PUBLISH __keyspace@0__:foo del -# PUBLISH __keyevent@0__:del foo -# -# It is possible to select the events that Redis will notify among a set -# of classes. Every class is identified by a single character: -# -# K Keyspace events, published with __keyspace@ __ prefix. -# E Keyevent events, published with __keyevent@ __ prefix. -# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... -# $ String commands -# l List commands -# s Set commands -# h Hash commands -# z Sorted set commands -# x Expired events (events generated every time a key expires) -# e Evicted events (events generated when a key is evicted for maxmemory) -# A Alias for g$lshzxe, so that the "AKE" string means all the events. -# -# The "notify-keyspace-events" takes as argument a string that is composed -# of zero or multiple characters. The empty string means that notifications -# are disabled. -# -# Example: to enable list and generic events, from the point of view of the -# event name, use: -# -# notify-keyspace-events Elg -# -# Example 2: to get the stream of the expired keys subscribing to channel -# name __keyevent@0__:expired use: -# -# notify-keyspace-events Ex -# -# By default all notifications are disabled because most users don't need -# this feature and the feature has some overhead. Note that if you don't -# specify at least one of K or E, no events will be delivered. -notify-keyspace-events "" - -############################### ADVANCED CONFIG ############################### - -# Hashes are encoded using a memory efficient data structure when they have a -# small number of entries, and the biggest entry does not exceed a given -# threshold. These thresholds can be configured using the following directives. -hash-max-ziplist-entries 512 -hash-max-ziplist-value 64 - -# Lists are also encoded in a special way to save a lot of space. -# The number of entries allowed per internal list node can be specified -# as a fixed maximum size or a maximum number of elements. -# For a fixed maximum size, use -5 through -1, meaning: -# -5: max size: 64 Kb <-- not recommended for normal workloads -# -4: max size: 32 Kb <-- not recommended -# -3: max size: 16 Kb <-- probably not recommended -# -2: max size: 8 Kb <-- good -# -1: max size: 4 Kb <-- good -# Positive numbers mean store up to _exactly_ that number of elements -# per list node. -# The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size), -# but if your use case is unique, adjust the settings as necessary. -list-max-ziplist-size -2 - -# Lists may also be compressed. -# Compress depth is the number of quicklist ziplist nodes from *each* side of -# the list to *exclude* from compression. The head and tail of the list -# are always uncompressed for fast push/pop operations. Settings are: -# 0: disable all list compression -# 1: depth 1 means "don't start compressing until after 1 node into the list, -# going from either the head or tail" -# So: [head]->node->node->...->node->[tail] -# [head], [tail] will always be uncompressed; inner nodes will compress. -# 2: [head]->[next]->node->node->...->node->[prev]->[tail] -# 2 here means: don't compress head or head->next or tail->prev or tail, -# but compress all nodes between them. -# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] -# etc. -list-compress-depth 0 - -# Sets have a special encoding in just one case: when a set is composed -# of just strings that happen to be integers in radix 10 in the range -# of 64 bit signed integers. -# The following configuration setting sets the limit in the size of the -# set in order to use this special memory saving encoding. -set-max-intset-entries 512 - -# Similarly to hashes and lists, sorted sets are also specially encoded in -# order to save a lot of space. This encoding is only used when the length and -# elements of a sorted set are below the following limits: -zset-max-ziplist-entries 128 -zset-max-ziplist-value 64 - -# HyperLogLog sparse representation bytes limit. The limit includes the -# 16 bytes header. When an HyperLogLog using the sparse representation crosses -# this limit, it is converted into the dense representation. -# -# A value greater than 16000 is totally useless, since at that point the -# dense representation is more memory efficient. -# -# The suggested value is ~ 3000 in order to have the benefits of -# the space efficient encoding without slowing down too much PFADD, -# which is O(N) with the sparse encoding. The value can be raised to -# ~ 10000 when CPU is not a concern, but space is, and the data set is -# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. -hll-sparse-max-bytes 3000 - -# Streams macro node max size / items. The stream data structure is a radix -# tree of big nodes that encode multiple items inside. Using this configuration -# it is possible to configure how big a single node can be in bytes, and the -# maximum number of items it may contain before switching to a new node when -# appending new stream entries. If any of the following settings are set to -# zero, the limit is ignored, so for instance it is possible to set just a -# max entires limit by setting max-bytes to 0 and max-entries to the desired -# value. -stream-node-max-bytes 4096 -stream-node-max-entries 100 - -# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in -# order to help rehashing the main Redis hash table (the one mapping top-level -# keys to values). The hash table implementation Redis uses (see dict.c) -# performs a lazy rehashing: the more operation you run into a hash table -# that is rehashing, the more rehashing "steps" are performed, so if the -# server is idle the rehashing is never complete and some more memory is used -# by the hash table. -# -# The default is to use this millisecond 10 times every second in order to -# actively rehash the main dictionaries, freeing memory when possible. -# -# If unsure: -# use "activerehashing no" if you have hard latency requirements and it is -# not a good thing in your environment that Redis can reply from time to time -# to queries with 2 milliseconds delay. -# -# use "activerehashing yes" if you don't have such hard requirements but -# want to free memory asap when possible. -activerehashing yes - -# The client output buffer limits can be used to force disconnection of clients -# that are not reading data from the server fast enough for some reason (a -# common reason is that a Pub/Sub client can't consume messages as fast as the -# publisher can produce them). -# -# The limit can be set differently for the three different classes of clients: -# -# normal -> normal clients including MONITOR clients -# replica -> replica clients -# pubsub -> clients subscribed to at least one pubsub channel or pattern -# -# The syntax of every client-output-buffer-limit directive is the following: -# -# client-output-buffer-limit -# -# A client is immediately disconnected once the hard limit is reached, or if -# the soft limit is reached and remains reached for the specified number of -# seconds (continuously). -# So for instance if the hard limit is 32 megabytes and the soft limit is -# 16 megabytes / 10 seconds, the client will get disconnected immediately -# if the size of the output buffers reach 32 megabytes, but will also get -# disconnected if the client reaches 16 megabytes and continuously overcomes -# the limit for 10 seconds. -# -# By default normal clients are not limited because they don't receive data -# without asking (in a push way), but just after a request, so only -# asynchronous clients may create a scenario where data is requested faster -# than it can read. -# -# Instead there is a default limit for pubsub and replica clients, since -# subscribers and replicas receive data in a push fashion. -# -# Both the hard or the soft limit can be disabled by setting them to zero. -client-output-buffer-limit normal 0 0 0 -client-output-buffer-limit replica 256mb 64mb 60 -client-output-buffer-limit pubsub 32mb 8mb 60 - -# Client query buffers accumulate new commands. They are limited to a fixed -# amount by default in order to avoid that a protocol desynchronization (for -# instance due to a bug in the client) will lead to unbound memory usage in -# the query buffer. However you can configure it here if you have very special -# needs, such us huge multi/exec requests or alike. -# -# client-query-buffer-limit 1gb - -# In the Redis protocol, bulk requests, that are, elements representing single -# strings, are normally limited ot 512 mb. However you can change this limit -# here. -# -# proto-max-bulk-len 512mb - -# Redis calls an internal function to perform many background tasks, like -# closing connections of clients in timeout, purging expired keys that are -# never requested, and so forth. -# -# Not all tasks are performed with the same frequency, but Redis checks for -# tasks to perform according to the specified "hz" value. -# -# By default "hz" is set to 10. Raising the value will use more CPU when -# Redis is idle, but at the same time will make Redis more responsive when -# there are many keys expiring at the same time, and timeouts may be -# handled with more precision. -# -# The range is between 1 and 500, however a value over 100 is usually not -# a good idea. Most users should use the default of 10 and raise this up to -# 100 only in environments where very low latency is required. -hz 10 - -# Normally it is useful to have an HZ value which is proportional to the -# number of clients connected. This is useful in order, for instance, to -# avoid too many clients are processed for each background task invocation -# in order to avoid latency spikes. -# -# Since the default HZ value by default is conservatively set to 10, Redis -# offers, and enables by default, the ability to use an adaptive HZ value -# which will temporary raise when there are many connected clients. -# -# When dynamic HZ is enabled, the actual configured HZ will be used as -# as a baseline, but multiples of the configured HZ value will be actually -# used as needed once more clients are connected. In this way an idle -# instance will use very little CPU time while a busy instance will be -# more responsive. -dynamic-hz yes - -# When a child rewrites the AOF file, if the following option is enabled -# the file will be fsync-ed every 32 MB of data generated. This is useful -# in order to commit the file to the disk more incrementally and avoid -# big latency spikes. -aof-rewrite-incremental-fsync yes - -# When redis saves RDB file, if the following option is enabled -# the file will be fsync-ed every 32 MB of data generated. This is useful -# in order to commit the file to the disk more incrementally and avoid -# big latency spikes. -rdb-save-incremental-fsync yes - -# Redis LFU eviction (see maxmemory setting) can be tuned. However it is a good -# idea to start with the default settings and only change them after investigating -# how to improve the performances and how the keys LFU change over time, which -# is possible to inspect via the OBJECT FREQ command. -# -# There are two tunable parameters in the Redis LFU implementation: the -# counter logarithm factor and the counter decay time. It is important to -# understand what the two parameters mean before changing them. -# -# The LFU counter is just 8 bits per key, it's maximum value is 255, so Redis -# uses a probabilistic increment with logarithmic behavior. Given the value -# of the old counter, when a key is accessed, the counter is incremented in -# this way: -# -# 1. A random number R between 0 and 1 is extracted. -# 2. A probability P is calculated as 1/(old_value*lfu_log_factor+1). -# 3. The counter is incremented only if R < P. -# -# The default lfu-log-factor is 10. This is a table of how the frequency -# counter changes with a different number of accesses with different -# logarithmic factors: -# -# +--------+------------+------------+------------+------------+------------+ -# | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits | -# +--------+------------+------------+------------+------------+------------+ -# | 0 | 104 | 255 | 255 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 1 | 18 | 49 | 255 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 10 | 10 | 18 | 142 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 100 | 8 | 11 | 49 | 143 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# -# NOTE: The above table was obtained by running the following commands: -# -# redis-benchmark -n 1000000 incr foo -# redis-cli object freq foo -# -# NOTE 2: The counter initial value is 5 in order to give new objects a chance -# to accumulate hits. -# -# The counter decay time is the time, in minutes, that must elapse in order -# for the key counter to be divided by two (or decremented if it has a value -# less <= 10). -# -# The default value for the lfu-decay-time is 1. A Special value of 0 means to -# decay the counter every time it happens to be scanned. -# -# lfu-log-factor 10 -# lfu-decay-time 1 - -########################### ACTIVE DEFRAGMENTATION ####################### -# -# WARNING THIS FEATURE IS EXPERIMENTAL. However it was stress tested -# even in production and manually tested by multiple engineers for some -# time. -# -# What is active defragmentation? -# ------------------------------- -# -# Active (online) defragmentation allows a Redis server to compact the -# spaces left between small allocations and deallocations of data in memory, -# thus allowing to reclaim back memory. -# -# Fragmentation is a natural process that happens with every allocator (but -# less so with Jemalloc, fortunately) and certain workloads. Normally a server -# restart is needed in order to lower the fragmentation, or at least to flush -# away all the data and create it again. However thanks to this feature -# implemented by Oran Agra for Redis 4.0 this process can happen at runtime -# in an "hot" way, while the server is running. -# -# Basically when the fragmentation is over a certain level (see the -# configuration options below) Redis will start to create new copies of the -# values in contiguous memory regions by exploiting certain specific Jemalloc -# features (in order to understand if an allocation is causing fragmentation -# and to allocate it in a better place), and at the same time, will release the -# old copies of the data. This process, repeated incrementally for all the keys -# will cause the fragmentation to drop back to normal values. -# -# Important things to understand: -# -# 1. This feature is disabled by default, and only works if you compiled Redis -# to use the copy of Jemalloc we ship with the source code of Redis. -# This is the default with Linux builds. -# -# 2. You never need to enable this feature if you don't have fragmentation -# issues. -# -# 3. Once you experience fragmentation, you can enable this feature when -# needed with the command "CONFIG SET activedefrag yes". -# -# The configuration parameters are able to fine tune the behavior of the -# defragmentation process. If you are not sure about what they mean it is -# a good idea to leave the defaults untouched. - -# Enabled active defragmentation -# activedefrag yes - -# Minimum amount of fragmentation waste to start active defrag -# active-defrag-ignore-bytes 100mb - -# Minimum percentage of fragmentation to start active defrag -# active-defrag-threshold-lower 10 - -# Maximum percentage of fragmentation at which we use maximum effort -# active-defrag-threshold-upper 100 - -# Minimal effort for defrag in CPU percentage -# active-defrag-cycle-min 5 - -# Maximal effort for defrag in CPU percentage -# active-defrag-cycle-max 75 - -# Maximum number of set/hash/zset/list fields that will be processed from -# the main dictionary scan -# active-defrag-max-scan-fields 1000 - From 60e4e92e9031c9031a6bae146373be84c577d973 Mon Sep 17 00:00:00 2001 From: TLSM Date: Thu, 6 Oct 2022 15:17:36 -0400 Subject: [PATCH 34/52] Suppress ffmpeg progress output, fix trailing flag. --- files/helpers/media.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/helpers/media.py b/files/helpers/media.py index 395cabfa0..62828c9c5 100644 --- a/files/helpers/media.py +++ b/files/helpers/media.py @@ -60,7 +60,7 @@ def process_audio(file): def webm_to_mp4(old, new, vid): tmp = new.replace('.mp4', '-t.mp4') - subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-i", old, "-map_metadata", "-1", tmp, "-threads:v", "1"], check=True, stderr=subprocess.STDOUT) + subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-threads:v", "1", "-i", old, "-map_metadata", "-1", tmp], check=True, stderr=subprocess.STDOUT) os.replace(tmp, new) os.remove(old) requests.post(f'https://api.cloudflare.com/client/v4/zones/{CF_ZONE}/purge_cache', headers=CF_HEADERS, @@ -97,7 +97,7 @@ def process_video(file): copyfile(old, new) gevent.spawn(webm_to_mp4, old, new, g.v.id) else: - subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-i", old, "-map_metadata", "-1", "-c:v", "copy", "-c:a", "copy", new], check=True) + subprocess.run(["ffmpeg", "-y", "-loglevel", "warning", "-nostats", "-i", old, "-map_metadata", "-1", "-c:v", "copy", "-c:a", "copy", new], check=True) os.remove(old) media = Media( From 6bdb0d792bfdaa31852179f4800e10c46f6141c8 Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 21:52:57 +0200 Subject: [PATCH 35/52] fix my mentions --- files/helpers/const.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/helpers/const.py b/files/helpers/const.py index 00e7847ba..20aa0c2fd 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -848,7 +848,9 @@ TROLLTITLES = [ ] NOTIFIED_USERS = { - 'aev': AEVANN_ID, + 'aevan': AEVANN_ID, + ' aev': AEVANN_ID, + 'aev ': AEVANN_ID, 'avean': AEVANN_ID, 'joan': JOAN_ID, 'pewkie': JOAN_ID, From 34cb2e0ccb33204d5379e5df400c54b336cade1d Mon Sep 17 00:00:00 2001 From: Aevann1 Date: Thu, 6 Oct 2022 20:00:06 +0000 Subject: [PATCH 36/52] sneed --- files/assets/images/emojis/marseydrowned.webp | Bin 0 -> 2326 bytes files/assets/images/emojis/marseyvore.webp | Bin 0 -> 11478 bytes files/assets/images/emojis/marseyvore2.webp | Bin 0 -> 8150 bytes seed-db.sql | 2 ++ 4 files changed, 2 insertions(+) create mode 100644 files/assets/images/emojis/marseydrowned.webp create mode 100644 files/assets/images/emojis/marseyvore.webp create mode 100644 files/assets/images/emojis/marseyvore2.webp diff --git a/files/assets/images/emojis/marseydrowned.webp b/files/assets/images/emojis/marseydrowned.webp new file mode 100644 index 0000000000000000000000000000000000000000..f5a4d480760d2ff498447829d8856462993a3027 GIT binary patch literal 2326 zcmV+x3F-DyNk&Ev2><|BMM6+kP&il$0000G0001E004mi06|PpNXP*I00EFg+qS7a z_rq`7wqo11O53)R*0yciwr$(^e9`9HXZ(79iins1_8)(PhnJU^Z;2LdoLMW}%gf8t zK*bnSvUI(vn>KIWa^d@LC;obSaP#KPYkHR}o$du^Nbfmu`;(Wi|8mZ`kjklobI!lN zd~tK$h VRB8-AT<29%gDD2AgQe8|hHh9!L_Fg&|O(Cux}a z>!3o8Q(>B*;G?;L*9;p4`K>FKuH_FB7t3L>2Hz=&y#cv`zecF;R}wq@z|yY@0>8(3 zfqATT5cpI}2j;edL{+Atb6rH?Bb>g|XFTz!EE+5J7|*^o6fW~2fw{&aCu#TaY%}qK zw>aS5bTh!|hFjonWitE$csCO@ME%WhHz>6GEW!AmXacbp&`kYY34|Pn>%=s60oz3` zVC?-f7hv_jV9DR@bA!7za{;kGG&k7muPLhb4$HCLk3`gd0rj<~8wt;)4yX_HbR odGIj0D=HM zJsgWfq9KUJ15^+J;#tuh!vX70`QSWKeSi7my1+dEJgz;9e{%gI^8h~wd>H>(;a`wn zD*H+5z5K6_hn@TD`kpENGyIF^7yM6zKI=dS^;7+?8b4xu%YWB-O!*B^5AzrOzfk}A z|IPYx{L}oG{!eiK LY@rFRnjK{L Qd?wKhor$X*DoeE}b?5C{@} zWVlWGO|qQH?`7!p4zolIJ4J*|wmUlne^25Z@t_CyDvI#c)upwV0RH}^J2(8KWyZ>0 zDU`#vDa++zj-m79=89O4Fk?-VWHwerkI$Rr$xhcF{jlCAQWCUuZpu@wTa<8n DVF zT!f)x_Paq|#ya$^%yJn2{lr=y<8ryMK-%3p!7kqT-Kf7@^c4CY9;wt1?Vm&{EYb+I z%m9m4yv=8FhC3U8!nI_rf!)bxaHs1`&K4Quq)EM$5Sf~hD0 XiW4i z%K%_v4u3>m`>+>n`19T{#bB~z>iU~T%wIs*_gPWDq;Q5eN<~Y0ULfX}^qV`B^64lK zQucG_;v6rF8Hu|)UvZskVDD<_T@ULruHf_Uy{ZmJA2PkHCu$IZ$?RZcTF?m!@F_Dv z#WZ3%?79Td&eHS~vkgKv9a|-tFe55uF$6dL-#;*#em2F~<_cAU8faCx=z_H3@{`4L zwjK`YIYzd?OD^TU5nYP*Wo2FlQgbMu&~BQDCN7rAkgD{cf}CNQG2|4`T5AcI;`j&t zHMg^M<4t3LbV=nUORI#}xcV-=-hv2P82T9g&zu3G`nXsMbW0{SUh*)bSfKSr^@`Dx zVcOsRI!*q~yZ)8~&VT=qJ8u6ca~m)39(aqwdV3yPPfGo@Q!rmuUVyvMKzl@8Q=Rzw z1?~Gqw_K9L#KU_Ea4BnxYD}{9o3b2De}iSGns}dqWDSxg_1GU@iAn62#YC*@ZmZ|! zefW8WIGXctR)|k-rZi7?%70N!` sS28^OVus;3Bz!r0GPeYl19ocY7X-#Oj8Crh@938-o_tSdC 8%(~jec4j8}f5-o4J@2?= qvEz@r2A8bd#r}A<;<1J4*GA1*t zBd-l1aEC=ahvf;h)ZhQ1qd2@y4hyqwDJLF^e3EHy0W0tdT*W-wXWGxxTcmRo;l`AD zZ-StRf5_HdUvtTCg3bd`OPZIbrc__5sGS2>2{KEL)9tALUOPUbu>%OUE5_MN?Dfp( z^ qrynSZ zRkN2$>uw>R-M)rL*)<`5f*bU)Cl|mWCn9ke6;Uif86oQ~+(jd=x$DQCbM<0DX6FiU zNQXK`N|zn{f3f`&FdCk!qO~eZoAT>G)UNDOLpJQ2_epfOgThD$q`h5+^YQxOGUt^Z z;!a{k;U6QY;9`6lbfcwKqZ+lJ 1{K>AwPJkz)qu928yf-)I#(s1BK?I{<`5o)GL7~hV{Z@27FBj4KOc!Ng zm3-UDwPV`D;e@*Fum9~qpdy&=97;%%suh!bdr?#VS?z|`Sw!0&iL0=|a)v}VC%KI% z7AZazRvP;iPhh3aE%c8+S5;9%d@5unXgo7>B$^`5gK;rjK7#gTht0I$81ym4yq|#H zS2^!F_I@D%uwBa}+O6N}4uzt%(X?%f0EWNk_f89Q uLcPI|U-Q5ZlFYfN{@?b6QR@|N9QXGmGcXx^ud2pAHzW2v_f86h6 zWoBoeeI_$!)~qD6qADjXJ@F9$G^NCqzbNx+Ap!uv`hE@pz%T&FNk}LwK)zoBkP3FD z_O8(HE_(+z7gZT?axHBga=3i}5r73?04@O0*wocYQB7L?pZfo{+XVpPpJ$foUt9mT z=KsqgnVGwq0ssX3yMo))$;Is*i@sw8PdBH3IQku9n_3y0z2m%h{L$sTgYS6kA8+zM zc 3it}cmpo)5te|} zd+f(|*8ROz^Y_}~oi~3!>;Uh7d4G?4xBuqT)q;clKNJMAH~_$GyuDpf0{~nS0KCM% zy*=f>y}c9w0Mr@)^f>%C-Z2jVcyHeM`2TWLxd4C`3INT0|K&{50H7rd0PvTcj9rZX zb04Vp64Jr~04_@b07V-Bu%-Y2QTKmx_3r!U2MQMfK;8F!ipBvTJp%w}-t}mDVhYN# zp-BH`>8t(fO7p|3q1mzv?|7n{_3!u+Mvi|LoBnS3YZh}J9VzMQebLe{aCJ;iX)k}; zJg_mafP@sSof!__&jCm6C`8RCYralzUF+TU&wHnfIp3F>#X3@e*gy9rQ2QeH0Sh^5 zJdr{ljn 2m`fP~Y*=k-% =#Gya z)306KW+~9qEm)}Ku5=ts^{(rJPb Z^pl=5gG)BQ;G_pTSW z6c$<(Iin0iX}ziUtoI1GJE`JU3F?pWdP~gwI#jXi7!!UaQRt|9zCjO%^!%vbd@jmv zD12bl#K=-*xGXGIfx}^Jih)!Lv%1(ARZnH{+0SK_8ji!@wN{8&wjuWTqv%jENewf} zyyx$4n79tv2Rwew$KrfQE)Us>56RTtW3`nXWsy=VCn_bB9G3*Bo>b{fry}3_Bg^+c zxLKp%E|o^M?r?K(=2+QPPb{7*3oj^yGCS||J_VL1AK-u3Oi_?5?C$Hg#N{Xk5B8Vf zU!i9>BVq~sO_x3NLcocj!EDzb=>KNLanlwNfri6zGcwrE80=lP!~=)%XxcBSDx#o1 z3HeS-O9nV%Vbo2cNM>1^S5#}FU)Xk}7u_CUT$ErV($|Uk6#A&rWsnSpxY9#+ZiK@H z@cP|84^SSH5fG9zChL0*AK_5VT;>SPkAeP7JjjWCT8Ru3x(P{o9yYg_x{~S63wJi$ z-G-vZpD6>mSqS P>ti%W3oy?(9|V zEJ|K6nvL(Y2?0y1d68Gc#oh!7g||W&{+8|h;OHkBe51kwyHSU)wY5`dqAbdJ>iDfE zBOTrA(qQnYFbJJL9~tU#*2D-&sN LAURPiIy{9VBlCyV6TiM;%sYOSG)q@WwQ|fRbHGFRJv35}k z#KInXwfcksUYvI7D9>F2dAr11NfmZmT2 naAcF&*rC2B>)INWV>n{t=NkUHD1=p_W9S*((4Wh5;C z4M5M|#Zf1AR6m9od|0*sB#Bj`BNG#vgm=aTV8io1Iv0q8vH&g6jv^VFWTS9(VX%EO z6cs5uM2g9V DYJ^rL}8G^v9&=s5rR&cW3qDc0$53XDf5FbgS z`MGfGp6q8Fd`#f!#d;Zm;9!BwGB~VTV&x1?sdW5o-V*zQPkHBaKRTj}H&1Ss9@X7} zTzrZVs^FfHSB(9Xg-6y`@i6L0p(XQYx6qLu^p&Z1#z{b!|KL(H8KT}lfPkO9=DT=3 z_ah96;zR~H7PS0ahK*ej@t>NXOz0yEHniLYo|$ Ylg}xQaO8 {#d^i z#h~IGL65SZD;aoC;8|TKnTR8WE2W}Z#XXLTllGmTw~}V37iz7pJ%UcIzJLxls-mJo zs%d2xYxOkTPfdT#p9;Q!?o%Sw;ukaRFLo;FVIK@jP0n7UD3cL`>B0l3Rhq9SWBlY~ zeli}xB&!A?s-r_Qzz2&;Su4ox6_U9OkwS^Xqv*xcq)7>XKmOz335iY~iv9_KLKGfj zj~;(`Y`@w95*+}<;URL>33a0ZdpJ+KPMB!ba!+o^Eri!dIKrgNvw@y1m$M~{c8m`L z0f7+qjG$P)!K#Me=m6ztt0^r9a-fm5D>2jp_`&qp6h+xwj14w#-TGCKWf_u^;0Yhm zNI}?h>>-(p{K%RGbGU&0?E7xWoM>CNsVrc;t$2pN$|ZV@bps;-CAul}TvyP-PbUm} zU<{cNp!b`^v~@H33viOlt{%v4CeP&=ouUMFm>Gi%JS7``@|tlU#P>z(m+3eJYVQJW z!$VjmZNf)Q;2{F{5Nh7CkM|2aw)>{1ZXs0xa(>s_ yLKZ;O?nWT4 zbN6%{MB4S;uo|xNZ&V2&=^vLrSc9ECm#0xfTOYFX;97tK$iA%8T`IQOf8^N{tmnr7 z0^?&f(P8pX9=0NR03pklYxQ%v;cEtU2zVyk&fD4a &GwKVayw0QD%iX!=g8;4b7;unAZg$;IzYmYVZ zp3;?3CVSlcy`IA#Y#!4dOFrp3hclQuk29FEh*I{4LWzXp#uN9!-P4-)Fq`ONtv#pH zH}N5ywT5O# MkJo!>cJs}XxutAo`}Q#U$YA~0gTI17-j#(+ z fd+56q`xsiXcN_h7?4WBo4x-vWZ-V7c=-YGAIH(qZ^ zPp06s$AdDN>+W+BhmDX|ec_3>mF|;m7Et7=<8#`r5;=(I;Q;)WYS6j4 44l~klkCv9oc! &s*+ zPdHxX69h=?jpB*%B;l>*$x#}l@pk!Ueop-iegeO23>vm?Ohhh0I64LUi!>5E^l)cJ zD(z>`6}@%cs2j3)z{x@cs4HoUf1sAA^5@cHQHXi2NArdZ7jdkxOZ6s( ^4eDW8?%Ia^E`g$k=VSUo5f(% z0fHosb%A!!*}Oe9PP*YEMBX=O>Jgd52wFQg-!4uXcSru|e8ftr+rV&cr;44AK1gXH zz8NzEt&ZrR@_c(AE1#pT3#Oo@kK}2%;(1)eWt3{c_R0heX#5u%-|tNR)(MSKA$?=g zn9Q(&P>JC}kLc2p+gIzJJsakpixEKOtPCsKFu_k$NcMdC>$aX{(wBY_wS|1?3fiT= zYb1jc-Xbl_BxZTUF*?%fA)B78b81Jf7Bi2KJLfp&YO(9e+;r7ZDc`_B@)k#hKl*BMMw^4wnbFaf< zBu9k{^5688>;8RpVNgM9e%VPwb@)8jT6Kv tKl%L0REO^bBBLc}aoszMKac+Tr#?k@6Sde2=&e*Y|~ z^qF!+O_q!(H_LCLpP)&xAGO3pY8X_|FVMw@GtstY)+8FaQymsH`t_{s2h@2nta`Ql z=NH%4QE-x|{DtSTT-ulCsRpSNDRiF|J8a$}`#&Zoid$Wkh}u; Br`yc_geK oOY65w#OC z_Py3 o z@uVWLmQ-CQ_HWhaBx7H-a61P7Fa`HZelVP{KD*h+s(w4NZQ?t!^vrI*IPaXna5DUb zIv8ysf#VjW5^bSU*|0~p5a`u$p)5BX@lyI|9ZjintjV<9sN0&HF?1_HI$fz}@nZN5 zY8XPc1V-~K?a%f%Ux`1h-stxa*7i#aYWFigM@BJR2bB*mbS+ts+0aY}g)VTf_}dED zKd%7eB36q=7?t*tPy23S*x}05nA|-(L_S7*If{l(ttUot9w*=VwaN3 6*koA7iW$UQ46F zwY=oIX=j~1Uy+&M1J{vC=m$Z!3MGZP(cG}#4%nEj8*xi4Wi=;^ujd0gN4@d|X%#0o z;kBBJ)T{>IoI?fRdpRjx1gZOaYUq~J`yO*WCNK}+l8_XTl7x7DKAC2~JNJ>Vh*SmD zrJKF71vs%hGf;b>H# 0+J zA!sv|BDh*N8pY|PXQbAnGQ5`ao9|E65;IpYp;KyLn~c|u3X^X#U>}$XSx=ap?u!Z? zeu_LKn)~$fR_&g37~;klv}2CNj+TJRZ%q?@p!p`9mX9TAR^`4@vg7dbA4Id*IjOYb zvqiw0&;j235Yrm09X%e#F=&q1f0+7am}&*-EZpd?5-B-oNWXV8q)N;ATobgd8+^xW z#-N5i4`phDljB9wIZhxLZ#Bs>>@4uvGG>1CLX9^cAJbEnu_x`JtfA5Mgj iTwx>UC@N9wnZ1FMG-u;HH`mq7ipx3P1yFtrM~bPqH +U&$3WP1fTYpQBMndg#11&`~RF*a8`@<-AVYHaU}k%+bN^-syO9k zv@Av|HDh7EgPMSNVFk7}V|?9Oz8}?~^nYa$I2R+zrKPc8eS51ed`icmk6O7; -iC*>ppMX zQ>XG*&gRPOaCCKa5!~#Aqx@Q;r8KM};`-YYarbHJ`^7Aqw!oRQu}Ww2MV_Qz?i Bj{`A;IEHoA1Qqp-*CSTB|pY;2;wzzE=iF32(?HrBs~llF-~aKA3m4o z%@yHy$xFW}ZSdsYYw3-|i$Sm~IHTs(Rn~{Ke#(mgo#ts06Z3>r8U&t;0Y1ahr}tX~ z`NwGjk2Kcg9f5s&d-?GDaetpzexWW-WdmwW$$$D|g9a)@+mEWXsjkp~Z_) PI+s-sA$J#m&1t@`map$lFt Fwg z@E1p{177L6eQG?}c3mT4t!y*<&Wc0*U(mn>yNSsY5z0KKT{h>^9g5_+)yu+t`J<)2 zPAuBH5jDRRoYbb -%@kEEA)McHSQ)TMcxWSd3FhXxgg6**FBZQVkfLoL&L7xxS8 zAV&DF+;t3mgpYS-Fx`?1 x#+kwm(J_vv#g5 z)UX{;r7ZX7QS3_l#1~e96@%IM6k%n6%!%PS-?ok*Y=W4zTc}f8M97Lw*K&hdp5 oo-grO z4&L=r(SM)v5ct>^VmKO^z6~!PR)FgN#VPSe(7MzI27X)kJ&ZWGM-nJ7N9lCxhRVn0 z%=;gu>X`Bd+l6pLnGFI7#)CLGti4*(0 TK3{R30lWU*tgiYYswr =?LUr2~&x`_hDIm}+CYbTlr5aYi z==d@N>Ezn7f!fK(RnJ5);$aD%q20hEr`_WByua--kF4nCH=s89rSxuv;EjmN*rMH* z?I!IkdG)n;ei(Y?Ai8`yc?)#OBUf6xNdmn^wAXpBE&hUp_i@TjS!rVjM)2(Du2z&y zV^<^$=4q jlw39ljF>{K*jMxm6Xem{ zt4O<+nwk|pG1IYj BT$*VjHg2nRCX&0J;R<;kJjJQzKAbXFY(}LTDs>HS z&k;?t4mG;r;sctty(+jvnXseCwgS6A9-JhUGr7n-(iq%f%U;*9nGsniy xSY7o*LIx(tFZJI pb`HQ11g32~w5PlR(G=8jjmC3v{}e)~5c zN; 0EF1V$qc&9))y=|(fvhOEi1AD$O`Doi zGmD_3I`sBwoddtKsjYjGZ@F`iyaS$_LjUH+b- m&`1sw>m^)Oa^M_xul^B~o`@uEAD@km2b*q~E7ut` zAI-!xWzFBkY0^?nKZ^1V5(}5dZ6%w*nc!__a(voF73z!mt51c{*+>`gJ;qQlWK?HD zBzI^^NUp0~kYP5PyVhKRF;QS5ph#S}L9LUO{lnOEpLTpkMcp$`XP# X;V;XQqjZp?Hb-fgu8t#FG1=1duY5pCvbvhvu=SN|k$W z%d{REXBVW8F($2rE%m3(*q}Tf({9H+W_waLjLNdBNA6`U7Ace~OjJp%G;(j;`sJ_U zGpdQk)49rDJr801)J}b_o15=M$DkM~9cJThZE3U4VuK6xU4PpC_)8}Ty^MDFXr=Z% zIUrlDr2IqW+j9U|>Qf34!j>kaXR!R0h);~Mp-;*eIi2Ob3idXTFLFHxHpTGFF9~`t zPf8+rG9JU3#3h@)fwLpb7^_o!-QSQVBlB1fx;9h-T#5Y|`=<|8ZI~=*QgcV!NKexB zzj_~ ?|2Ai zn=i*G_kvV=t}gK0)k_>0-qti3&38SFA8w64#7Kd;rcq9p4KK*y^_6 J|HJ}qF&}**Q?|`n_f^Ls~E0o>aN vNk?JY>Yh$g|Cmm3z!<-}AF=(0=`q&R2*{Eg{kWJWpX $7%G&}Yo zNeU%%nl9+CCjGALAxCrX705cvKsLfg1N3P-ro;C9`#}V>$q1UX8)BDO#k7qfKexP) z9B$T&^0P`s+GyGmyh2{n%PhO0{La49Y?#yP%v&(Di6u`HRe7ZHIdUB(JJm1C%_R}{ zS(x#%L!6P0dTpiMYwZZi&tEPnQllC+9>yYFrQ&qem|tfp$0?ODLYMR?<7mXYkGnp5 zBpAb}c*bb#4)YDDjBqgY#h&5u?u!&$UmIHr#EU^cxcaD}$6`j(gNr;hMG&_{{4-dy zj>d@#W3^jLy=%lF?S4t7Iv>MO*_w}vGC=ON1?BZPP_8d(2Sa2(;xNhOlWApGo_w~? zblSljIQS|?b;k8j*sN4Xq{EGmXK6fGk`;G(-FwdW6|dn=C+AhCM*!LQme+do7x;w2 z7K2@pF>uAc`AkK73{0es-}Y;s#njMzy?0d7zcxJy-~Y%uf-iP2$>B6#*$mGr@6p-Q zJ<^?J)zGh2 ugfGZ@XwDsK@Pz(~R%gkfA*#yT zLXzP};c0LRtaT4oqpWl?JCn3zD#+yXkWuNiO&dL~Z#MmCQ%hHbej((eH9^h=;h{*IBGN(u692w21-dlDpPCG8TeQr_QA6rF0YO!y_2nx z&p&b+ 1)g6@ywWJNgMP}gZ|J1T{qviUGw-v-K^F!O4%LE zL}DxJD6i21-SHJ@F|q-n^t z+GM!RZn2%r#mis3+8e9BsXz|AJZ_A6dr1}1tf7sQR`df5D5`L7J2uwW@?PDYhjR9H zZEDysHnuJDNQ7}Zs4ZuAdWiY14*Puj1mhK9=*jovM@$@0^q#TXR EAaUGtn;-rD>TX0~-+S+JGb0DBKD@d|4Ahe<|{d z8qaL*_xt*~mrNaDI~4TT3r(kx1wDD8`aAttaU}D}nEe7Q OPy0blNk zy#T+oO5c?-ap$Q{oB`>??1d1VBqJyAMh};y8y8momr -l$#^qEOcKhJJ9rou6n{H(0?GO^NUN zNMp(RlmRq|%OUpn!N5p2=ce)r(yn*D=Fhw~^Pf(7kU04rg-pK&U-Ti={m~!qU>R+H zobbURGgHS}32xJ v4 VbR0}SP+5?{m zvLMp*#M53>Pq$HGG2ZCwiJ%Ew4_-C(Hf3*U!(K TmB>Z4 X{tcO`C&+ipH__L{&Ev8htH8 zT*2EfUbq|?^%kBe#Gz1?jdp*zWRW^Cv<>AMM82DCiu)`Cbxo8Px_naGKn4aMw-?a% zSANM91%z(2kfDFZ{VGz|$~H}=8XeX%M0L9L8~s>jv 7viPTyDfjW zrJpE!^J-a>!j*VcMt-q|P-+9Zf-!FR)q>i`bO*kCsP+l7(%q9d^KiH5zEqdz{>Y$D z2%pf}6G+JznqDhFy+=L}i5*#ya>cY=9(s{D&MuYrB0gYR{leX*H{{{0Yvtc?1+lkD z3oz>_6p}|M!rNLq;^2+cHHVp@KpZkr41wTW;Vj8II&9ZfQifxM(7PWBX5msxr@a)5 z$N>l=`db(^{3r&PYLg%3mm^AvYPitX%40PYaY@xdR0WwutLN3xTmymizkhu#%ce?Q zLWO8+&0F42vHXllaTw1ozJ}1opw|46FMI>P)I{@T4qiJU6;@SL2t6W4rmq~~P27pF z4a$&>E3ofOpXOWk$clUWnLhf(L1!$+R{(N1R@H+6WE4f2xqmTXL&;mvF*i&9`pKGr z@+OWf^&7e`KSB*(e^>);`I%Wu&v4^lQ+|1~hRF>Qo(Sz8t j6Tm{ z^oyL7dosc{r)4nM9Qx5Y14~01Y`pN1>v#!auS8yY BapRK+?YlP6+t*#XiN|h7DoaaSlr{ieAMGqE8)U)0v zVuxdkpI7c^?A*zQ3EE;aF3KMYI4(x87-{1(V8_}bzv27e{ pOCPJTFAxs-RKBYph>CuRc<6?6aB#=IN+dY2 zW2<0uCM-TUF7$Cy-SF~W@M+MEXlUz&7G|sbQAy_BcUBeBPQF*JOZbcZ3E?-M;`xR~ z`7?bL0KKs6gD8>%)~+hgNgrElOZz^LeX3EZcYysehLBd_l*H1i^Qi;%FY;Fvsisyn zYE;B%81dEOx1YBAsC~ZF-t-E&`ad97QN HwiM~hHT}Xf zhQL~8Uu`LB(u)fXMR+FSfRr&~th=QN0i(y!RY& k3Jb7^6>8i0yP{(d7t-F+z`~5N_=@WrcRRF2}y+!U)Y!sW7mua;RG| zTAbzdjY4xiFaQpO|4TQ*JPGk(PYGUe%e<+Ul~%AWhDeH7r%_E@2d{!%r$~44bp)s2 zuFE%*z2!$kHby|%4@WRx2_aeVpoI2ct^R$R9F;S%Lv70O#URZ?Tld!m0pE!A>9zW+ z3z24`z1XWl+6!tw(7AVq&vUA!T!hTulfxEN)f`numbpb`I@lRSZ3T|Ilj-0DFtzRK tRayvo;li%b_s2`ZNRh+Hge;%nK;R*QamatkQHVP2>% 0LwQm z_>Faa%WC#!&EI&lx5pOn_*eHg-CO%_J)OK$?cfcxf+kNq!4kplo|K>*Ou`(MsD1ppdD0RV65i; R)85^8L{9fsC#prIE_afX;ZX}V{p;5<%_Gk6`TzzT0a7B}imTZquL;5Wy{a?&; 7-&E#bBBcnXDA=C9ZF|{)>emGuJg>b2y(Whs!gGY5T#jR7{2D7egL2w@?e2vL zB>D0B8wvfD*6S~-8;lAS2bBSgP4+W=d8$(VoZ*b|a@dbP&dcMKE!!6z4xt?1Cr1!U zSnmgV@j0bB2F(0?4_}HN$*4-Y3$WcUn@i+`ATyD>g*T$m8B9yQ8)N##o%q^8u$%^M zOe?(-#}TqN7H%|Kdszm7JYLyVXW45USeKP^p06tooiDeSc~KD$=062YQj#Jp2X1ag zbTnCT-%lDo7P;WGvFIjMtrN1I=o-G(&iF-D*xmMMnf+Z>V_g1l*Z9Jkub30uTC3Hz zCzgPbtpDV^G$3UosWFck*StK~dFF}NU5rSVx=~dtypSan>YCGd5Er5RJX6v|!x!Pk z7C(>Yp Sr$Q>inf!kLU`j^nynGDaO* z2@DP`$8^1DygdD=MfthE2Et-KHW?#H{Sw6vt4d|us8eGs0aKwBm5NCLg%Au~YjfhQ zTW)la>_Iy6EQq3>P-&dgDL!Y*rK2g6&fW1b=&z)H$bn4eFM8(kyA&)p=)zTf3hg`8 zPXlD8Q-m~QR0m>LEG^o~`fIk4f|L(=p` %k}xpf*=Etor11jO^@R`vtN+kq^atF8ilm-eRK3#*!f)_*t&L~CVyw!%==r${ zHNv5#6%PY`6 Ua^m|}(v>lqUF zMw8r9WLs8^;BFK2ohDKC8XVKhOW5j=sJHCsB!Ig*s0b3zbS4?wR(}lMgPtUj&uch~ zrWeH7t9x9TW0yPLZ*?M8n29H7!QPBP9a-@o_~Bx<;Qsoth2 &?`DB(r+D2J!s9yHSrkc|*HvX6$VC@_(I7o_jL1btcw z2rD_(LsT=TmMnD?7r)TJSKDJ1J%zizG)%!dOhlTTuYxYBB04k)-ZN75)V_-Xugw;3 za#Jb!7nRoxGE;mY*i(@e>6R)$zmbFKZ(fZ-s(28FI(&VPvxk9 Oy92%=|NEzj@(3<#^a<@89zU@SBXewI_~Z_ z6OA~fP-Cy*OD@*K=L`Q&rl+p&f~DFA_cSJw$a;xszDPRcNH)z`r=h|al%9;}YJ9pQ zhiNA5;p=s<4kni9;rQJ;Np3x-AQ6BT;yK5xS`N#HHIdLxaG+7<#fbIX!R2eCRnEeXqVY?E4kv~VcYeRxT6v&angM(-q!G2=*Rxzl^3vmdLr@^v zEu^hKt?1K#h~GKTBls<>2S;d6^Bdi9XuyO9JC&`=1-;QTBC`I47tTo1 Z
RaiY{Johw%Q8r;rgJc(H%(x)5un z>Sr(AET(RTlB#lSpfrQ&_E?t2dpl>5e8zb@XBh)oP;`U95Fi-GpDJDWgN&2`^Es>v z1JM-W3sgjlc1y?Dt!~(>*h$XXvat@|(^L83+4Mwe xwu9WR9wHC{6PCZ2?V4l4a1ls5>^DGxCZ z(a=hu8Kj 2A+R$w=aP;A@*)r zcHUpP4Pr1I;DZWRFI}|Z%gkCz*Oq_w@6>M%1)B0Gx#FTaTRh77%Qsir%y^%7!iY1- zNA`%2VN)j)kBL4nP5rPjKN}wdrJC#RwTs*PV^xQ4L-;`L8pZi!H-rbsI4Y`lqe$>% zQFNh^r(vlx-Y9mq;`#CHq$h~)V%ZyG5Kq=Y#H=$8gmTf54-Qn!Jd(Mj=IB`kLpEt^ zlcv&G-PEWQyu{gvg!ULIQGbQ?bfYeIO1sCtsg+r!*gUhR_p{TiqVU-byEFB=4x(F@ z%w&v@Hg3TP>OJFxFhX%LT=B)3S>kR%O53W$s)6b|YN-VFngLq()`S9bvk%ySSKc_u zetbyFyi`aKn{prED4qjxHF6E=Uz$9{enNTSM)M0Q(JU-L+9Y`t9a1CIO8W@WJ_smx z&ePY*p|n@yp45yhM~nlBzh}}UwrbYP&nqu2pC`xuHK9HzBi+d}%%09l CsaezbV-vg#&V-Z1aGhR6f A73Ll{-O1A* z;kB b^nJGdQemV)`m^{i3C&vI_`5FQ zCq|z%ZH0|62KB^I8D* Em@y{RvyuD8FhKM+UCBzgkgWZRYW~sbOz(N8hLqV pi0>DMdwyZDSixdnxiSh^;U0Rw l}5?5E0BT0fRR{>5?L%vns5z}H_` rbH|*!9=SAoE;8DzCQ}qcm z?l~GP_Y(u va|?%Q4=gNeoT&tIL5p1XKvb~Rc(nHFA8zyFy!*4k%l8p%-kO(JI0 zRrHhhgM;Ji_*1H>7uSOi2g;*o?N)#f3g+P0<)gR!od&9_4Ne>+=sG+4i>y}# Dn7k~CPq_kNS8>(`~uxnvfdcOR3R53X+COJ(Uu!kp-XCRCYxr5 zwO)Vl!JBEk^L_0heFM1tI}+4ob)c{KJr)jt;#8Mwqryp#rzT6C{&BjV?r32hRj|sg z?>p^%1u2$*KAkas^P|6eSnB~gf?UaVi_iKuI4~3Ml-X!t`e$maaabi%$Ihn^f z%=ZOONX=Hh>5QoZBxJ e(%h(d*sexVnCeN zDO^gJsg*`1dPjI}?9enAzq(YWhPmH%#b*y~!3jnnMg)XW59-`X5}XXs*r+lKeq`Oq zum_#kuU|#Nq>Vg*@rX$q_7j_Kt|vd~8lGT4cj_wJYJHNBHd`J1%<%o5{?*%&P<9&x z`X)YH9V4oNV>kiY^Y@kMxj>xVShdIwJoi@~wcTCmnrD3ehR+LY@es>OvLJ@~?Xxsj zrl;)^ESe?yg#CA;^!K_Ais01Avly$v?_Ypc5+C?*=MH%KVOI4Av(-xTpZ9wcKT$aB zVq#+Lt!24lP2K$%W##P)I&{DJA?+^>$H_6tfgrYmCFkU6d&nJql_4kl8q4+cepz@q zqHBwu0 y1 q)q6RrgprSU`-7K|ND>l?arq!iey$WQLX za~Uz*xLXjP_=2Gc&bsCA9qNQrrsvu_(JahgCSj?8x>O+2O;a?I{$BJaW*yoTFKhuD zgIi2A^r-Xe)m-0di3j+dHYsPC=Py>D&^{RyYL3jPxtv|$4#z@in#MT-42i0 wHM{ozpyM6kEL$&di|eIAA+ZCS3ecfHC-xgH&m$Xw13s*ZC>+<{0T`>95c= z^gPEq7%F=(u#` mb2fOC1wUjjZK zpJ?>o$@(=yPHkxKFVN#^RdXWsG|SRD8j9`LA@@)ZYs+{ %w11g4=SsTkc`Io=q6_3kCP3^1S`@M2+-FlyQo1Z() z@9L=Z+G#RLX?uIM+F7)GI;B@J;Y~z?xMWgaYS@F;?)^wqOE_H^E @BB2+`J`-3 z6!;|(&57OVvsW{PCwg70`!B;#&X}~WxtApIvgzJc_#T>n-X1qXDrV;+U;V{|rFQrZ z!{dju#$KotIRl5iNFgCj(P*QXO^;>%Q$^R*`8RXu!kg?JbLOZ}B8FpE46W_eY^NY2 zF|w*WXrhd#INh}ourh#ayHtYS57}Wiolhqw7F1}u{<&1qx4AfsdOYxqn;U&_;UJ|^ zQLc7DPljko44V3&Of&M8%sD>!F~vaH;jHpS+`o4?sVpVY+? yKkei z7KCtdBvO8sN{;CaOF#0xA$s3w4;-D%8Pm2^b2S|@W|YR(6Xxz0qPq7R*`5p)qw@3P z4VkVTOSQJ8omk0wnL;6tvEqNt4j#?$;?5ViE-jEEVCtRMXIH~BI9qAfs!KqN0Y$x6 z14t5r9ceWk9fW-pY~UX}$kM3kJ2|Tp@J_cv^~Lg{=lkhvM}ozCP`=k@-V>Z06whJT z*u4Z3c81FgOx;F1@LQoxv$4gBDJ0SJ-{mL*cU2vaOG`qX-err01brZ%oj}L-La#{~ z5BgnK7W9)>ffI4ntCp6*#a<-ElEPDA+s)E?Mx%6!mbV`;v{EW}I-eGoVwiHc@-*U3 zW`b^4`!bkopo_%@$y1BE;^8$dOgw0I+ i^ HX++W3CwqKcyWhB7Nk;|{1`ctLGhrW*t z_~RL$8=JUVsqgYeo3+|6wb(dY-+qIUdelx5PcxuNXp0&+%v<|NZeB;>3w>MRt#@M? zsk-S1bpB{9J~Q7Oxmkl|ZX#Ekf-Bwg;Kd1};|Ax^=4|Pp*S4U sQO19SA|+$3*A3OKK=XHCVs7eJ91`Bxs7`9{z0UDF`~xC2;#3zH-@ z=#WXT$KV@-qr?Da+L{8eYmX91QCNid-VxhW%dcXwaN?8o4Hm(_F9Bi|HHnSpEYol! zP7M ag2v*<*5)|%Q)=WmBkO8Lg5ap=<4au0Ut}d*wtHxh!GhEjPft1l0o}h z9UH3(o^G1L0!$>o-Rz#?cUE>< I+A4GbSke#8gm&Zp zaxmfa71xYnX*uzbYkgQ{{WiVi$oKwP5AQ}m30~CDS>hYFT4=bIyUt)Lr6Y2N_2ycJ zH?P`ntn$`DGdbV6v6qc{F<^)`e#=(h*X=8T+F?)0xJ@YotRqNBGi{wS8D@v5bv3x} z{dsqmw^xh3sW4-=`4tJH=gOJ*W(FEcO?;Q?i4h?>IhxTiE?m}wk-7Wkdh3$~ z4RP*1Z)^ccuq%^ua7~g5=P|dVKvtdTZ#WEA z@CMU!z>)E NqsS41R5=Ji43D8u{FlT!jsdf$8)HC5z9@doKI2vAsJhJOy2XnPV20W z>iUQnd|`go&My2CnGIP85%pXdf239pmM^|9NWKPVVd_8@C2XqMn(=ZbpII;K2)+uA zerrg(l=wvAIhRfPMIRwq^6|yC?7}+i4kVYEisBiBg@?I5(2qX*OCR-aBu=8pXlnkO z(OIfJGs0a1l*3iEdbRb=P#4lqGy%?$0Hb{SBhU6^N%(TZGpw)xR3`y4(CpK=EHddK zCB&45>Uch@P>QB~Ij|&al89E4ovCInebjxgAlfs``cTIUjpBR^VjM{LAji_;*^F0I zD&xlz5v_N;lZoa7pH{IiMj3U|Ns__1*%a=V&XP$k)s0|v{X_vAUeJQ&5n*|Yg^4BU zTVxvqS3QM~b>N6mt4 hV)Pjhe*w&Nz*1*}75E*Y zXIY(IGilzFU>4mAxJQ!XP_TH*JT3Xc$~1QVKxPUT3I5O1u2a6GPl{{o9#bYM7l$ct zZFZ>m)Tev0`%=+Xtf0a)Fs_MWwSxY d_7+COh%K=Q4w`^P zw4|z|S26XtARW5thfw;bO*=DdV`URcFHd9z*_i4zZ yQnSx~LTWIuE6-Tj&%e3XsT26J@i0}1r#5*sA{`O@(EKm8GKD(hG%~5WH z=#D2oY>D5ddo^XZNkX?;d{S(EnZjUwv|+Y0*5vG2UMDMRvT1^T&)y*MQ`9gdobaAZ zaci$8K2*4Bk%#Z&-E0TVo>)m|*XHt|D6-vT33_)&;735Lhz`%Midw9%sX@JfcWgll zfS~Y)3|d=huL<>s37f%_OzTO+i&!->i;f10z*2})xs>ZnHSxIIU1-hDTFfiz);OiF z2MDXTd)K{-$qi$^^JFg(m0lB(n<|K>5NvAN-qWiYCiQEQKUK^;IJ>!M`hy@vyf6 >0v{3HA=-FS$aS&eyM+koni&lh<@<(hBkv&PcE6uy* zxh$o%V!aD?rtJL_G41|BSCGHFP=;PvIL{~foIeU#N^lwaDZnV|1)@|tKB2S<%5T2+ re3+fP-Hj-cSgEkn)T!^t_mC6L5gpASuhvY(X)!qk9 Date: Thu, 6 Oct 2022 23:16:16 +0200 Subject: [PATCH 37/52] fix margins for award_modal and emoji_modal and popover --- files/assets/css/main.css | 10 ++++------ files/templates/award_modal.html | 2 +- files/templates/emoji_modal.html | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/files/assets/css/main.css b/files/assets/css/main.css index dc832fd26..599404ce1 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -4806,7 +4806,7 @@ input[type=radio] ~ .custom-control-label::before { border-radius: 50%; } .emoji-modal { - max-width: 85% !important + max-width: 80% !important } .emj, .emoji, strong a img, img[alt^=":"]:not(img[b]):not(img[alt*="#"]) { height: 40px !important; @@ -5075,10 +5075,8 @@ img[glow]:not([data-src]) { } .awardmodal { - max-width: 85% !important; - min-height: 90% !important; - max-height: 90% !important; - height: 90% !important; + max-width: 80% !important; + height: 100% !important; margin: auto !important } @@ -5130,7 +5128,7 @@ html { @media (max-width: 991.98px) { .popover { - max-width: 85% !important; + max-width: 80% !important; } } diff --git a/files/templates/award_modal.html b/files/templates/award_modal.html index 9d72b4746..a05e86e58 100644 --- a/files/templates/award_modal.html +++ b/files/templates/award_modal.html @@ -1,5 +1,5 @@