mirror of
https://github.com/bellingcat/reddit-post-scraping-tool.git
synced 2026-06-08 11:38:28 +03:00
Compare commits
156 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8c25a3cef | ||
|
|
d73ffd8acb | ||
|
|
1a95af33ea | ||
|
|
1dfefd9ef1 | ||
|
|
7d5894224b | ||
|
|
981fbfcac1 | ||
|
|
145d33ef9e | ||
|
|
c544ede53b | ||
|
|
1c2d114b0e | ||
|
|
5dbc752056 | ||
|
|
4ae45320c7 | ||
|
|
c25d3942ec | ||
|
|
6611cc2023 | ||
|
|
9abc351ffa | ||
|
|
f92efe640e | ||
|
|
68253a6986 | ||
|
|
1cf78c3609 | ||
|
|
ff905764cf | ||
|
|
76a6dec671 | ||
|
|
10fa0688a5 | ||
|
|
ad547b4eaf | ||
|
|
00688ea0e4 | ||
|
|
6dd075a44e | ||
|
|
dd4d10df57 | ||
|
|
a1ab71b205 | ||
|
|
61be692c4e | ||
|
|
e54b0f24e0 | ||
|
|
7c4e1a8a38 | ||
|
|
21d176f7b0 | ||
|
|
e5386f89b1 | ||
|
|
e904570117 | ||
|
|
7961cd05fe | ||
|
|
26b08980e9 | ||
|
|
6c47e5609e | ||
|
|
b96889f078 | ||
|
|
2dca02e315 | ||
|
|
23553a3d34 | ||
|
|
2441197a5f | ||
|
|
6db8af96c4 | ||
|
|
07a6031394 | ||
|
|
246c0d9943 | ||
|
|
ec5e84e3bb | ||
|
|
4eaaaf5764 | ||
|
|
5685dc9734 | ||
|
|
fba1b65d4e | ||
|
|
25fec049f8 | ||
|
|
d920dad7a8 | ||
|
|
83ac5d710c | ||
|
|
ceccd434b4 | ||
|
|
156482eb68 | ||
|
|
782eb1577f | ||
|
|
0023a974fc | ||
|
|
5468d93976 | ||
|
|
d186f6f7da | ||
|
|
b5d52e4bb5 | ||
|
|
a2bdc66a03 | ||
|
|
bb72360699 | ||
|
|
adc15555e3 | ||
|
|
07ad626dd2 | ||
|
|
2729c984bc | ||
|
|
f3445b8e06 | ||
|
|
358f264bdd | ||
|
|
e3dda99233 | ||
|
|
7198e0be90 | ||
|
|
f9f0ed5085 | ||
|
|
b0c53a1511 | ||
|
|
54b9abc4b6 | ||
|
|
4ae14ff02e | ||
|
|
376eeab243 | ||
|
|
6d427849d5 | ||
|
|
ad8cb63541 | ||
|
|
57f8c24cee | ||
|
|
750967c322 | ||
|
|
cfef86cbe3 | ||
|
|
2a2696403d | ||
|
|
b0a8d75d8c | ||
|
|
b31c38f5cc | ||
|
|
b5b7df868e | ||
|
|
566f558720 | ||
|
|
c3e5ce6441 | ||
|
|
7c164938c9 | ||
|
|
b08c4a147b | ||
|
|
8f259b7a40 | ||
|
|
f117c99cc7 | ||
|
|
3a9a87e67c | ||
|
|
cce254e976 | ||
|
|
418b2acc4c | ||
|
|
d26699cc1f | ||
|
|
9efb1cea4a | ||
|
|
ba6eeb38a6 | ||
|
|
2053c0f0bc | ||
|
|
8bef73001c | ||
|
|
c9d9628326 | ||
|
|
2f1619b4c5 | ||
|
|
33db66dbc3 | ||
|
|
bbbdab906d | ||
|
|
74264224a5 | ||
|
|
ce75d40f76 | ||
|
|
406e34c4bb | ||
|
|
38140ea2be | ||
|
|
4c3d3a688f | ||
|
|
a03b649904 | ||
|
|
aa3b506a96 | ||
|
|
13db97b6d8 | ||
|
|
4da2fcf913 | ||
|
|
c6792277f3 | ||
|
|
5bc061b300 | ||
|
|
b3441a58b1 | ||
|
|
60ba2e41b0 | ||
|
|
7bebff61a8 | ||
|
|
3576bcbf45 | ||
|
|
d266301917 | ||
|
|
1f3d8f41eb | ||
|
|
4ac58f0fc4 | ||
|
|
7696dd923a | ||
|
|
45b82e57ac | ||
|
|
6d6e616640 | ||
|
|
4ba402a129 | ||
|
|
52d36baae2 | ||
|
|
1086ba1db1 | ||
|
|
d8919b4357 | ||
|
|
8952c7910b | ||
|
|
5d144fcd00 | ||
|
|
4c86206d0f | ||
|
|
6f77623681 | ||
|
|
e88e1a2d5a | ||
|
|
71b65753cf | ||
|
|
002dd57c0d | ||
|
|
6e9f97c444 | ||
|
|
1ff6d2c9c0 | ||
|
|
b356a6beaa | ||
|
|
618aaa45ba | ||
|
|
f321accfbb | ||
|
|
e2e9228bec | ||
|
|
90e7fefa7f | ||
|
|
64ebdca6ee | ||
|
|
ca0458f328 | ||
|
|
bc10b3020e | ||
|
|
fc0c62a1ee | ||
|
|
151183765b | ||
|
|
210beccce8 | ||
|
|
3a3a0b67dc | ||
|
|
7399683352 | ||
|
|
b536b8245a | ||
|
|
8102c2276c | ||
|
|
5ba5db6118 | ||
|
|
2863aef3df | ||
|
|
4d3eed1d41 | ||
|
|
d86ecb020b | ||
|
|
67b36a8764 | ||
|
|
7705eb29af | ||
|
|
2d79877440 | ||
|
|
d9d0e58759 | ||
|
|
3609b6ec87 | ||
|
|
0d0581cc25 | ||
|
|
18504e7144 |
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
custom: ['https://buymeacoffee.com/_rly0nheart'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@@ -8,7 +8,7 @@ updates:
|
||||
- package-ecosystem: "nuget"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
directory: "Reddit Post Scraping Tool"
|
||||
directory: "Knew Karma"
|
||||
ignore:
|
||||
- dependency-name: "Newtonsoft.Json"
|
||||
- package-ecosystem: "pip"
|
||||
|
||||
@@ -6,6 +6,6 @@ WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN pip install --upgrade pip && pip install build && python -m build && pip install dist/*.whl
|
||||
RUN pip install --upgrade pip && pip install .
|
||||
|
||||
ENTRYPOINT ["reddit_post_scraping_tool"]
|
||||
ENTRYPOINT ["rpst"]
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Richard Mwewa
|
||||
Copyright (c) 2023 Richard Mwewa
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
58
README.md
58
README.md
@@ -1,29 +1,47 @@
|
||||
# Reddit Post Scraping Tool
|
||||
Given a subreddit name and a keyword, this script will return all posts from a specified listing (default is 'top') that contain the provided keyword.
|
||||
|
||||
[](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml) [](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml)  
|
||||

|
||||

|
||||
## Note
|
||||
|
||||
> Use [Knew Karma](https://pypi.org/project/knewkarma) for more advanced and improved features.
|
||||
|
||||
# Features (GUI)
|
||||
- [x] Auto dark mode from 6pm - 6am
|
||||
- [x] Saves results to a JSON
|
||||
- [ ] Other features coming soon...
|
||||

|
||||
|
||||
# TODO (GUI)
|
||||
- [ ] Make it a stand alone executable
|
||||
- [ ] Add manual dark mode option, that will be remembered in all sessions
|
||||
# RPST (Reddit Post Scraping Tool)
|
||||
|
||||
# Wiki
|
||||
[Refer to the Wiki](https://github.com/rly0nheart/reddit-post-scraping-tool/wiki) for installation instructions, in addition to all other documentation.
|
||||
Retrieve **Reddit** posts that contain the specified **keyword** from a specified **subreddit**.
|
||||
|
||||
# Note
|
||||
> This is one of the projects I am working on, while learning Visual Basic, so the implementation/code may be messed up. If that's the case, please feel free to open a pull request using the available templates. Otherwise, enjoy!
|
||||
[](https://github.com/search?q=repo%3Abellingcat%2Freddit-post-scraping-tool++language%3A%22Visual+Basic+.NET%22&type=code) [](https://github.com/search?q=repo%3Abellingcat%2Freddit-post-scraping-tool++language%3APython&type=code) [](https://github.com/search?q=repo%3Abellingcat%2Freddit-post-scraping-tool++language%3ADockerfile&type=code) [](https://pypi.org/project/reddit-post-scraping-tool) [](https://buymeacoffee.com/_rly0nheart)
|
||||
|
||||
# Donations
|
||||
If you like `Reddit Post Scraping Tool` and would like to show support, you can Buy A Coffee for the developer using the button below
|
||||
# ✅ Features
|
||||
|
||||
<a href="https://www.buymeacoffee.com/189381184" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
|
||||
## *GUI*
|
||||
|
||||
Your support will be much appreciated😊
|
||||
- [x] Dark mode (*Right-click>Settings>Dark Mode*).
|
||||
- [x] Saves results to a JSON/CSV file (*Right-click>Settings>Save posts>to JSON/to CSV*).
|
||||
- [x] Logs errors to a file.
|
||||
- [x] In-App feature to check for Updates.
|
||||
|
||||
## *CLI*
|
||||
|
||||
- [x] Saves results to JSON (*specifiy* `--json`).
|
||||
- [x] Saves results to CSV (*specify* `--csv`).
|
||||
- [x] Automatically checks for new updates, and notifies user if updates were found.
|
||||
|
||||
# 🖥️ Tested environments
|
||||
|
||||
## *GUI*
|
||||
|
||||
- [x] Microsoft Windows 11
|
||||
|
||||
## *CLI*
|
||||
|
||||
- [x] Android Termux
|
||||
- [x] Microsoft Windows 11
|
||||
- [x] Ubuntu 22.04 - latest versions
|
||||
|
||||
# 📖 Documentation
|
||||
|
||||
[Refer to the Wiki](https://github.com/bellingcat/reddit-post-scraping-tool/wiki) for installation instructions, in
|
||||
addition to all other documentation.
|
||||
|
||||
***
|
||||
[](https://about.me/rly0nheart)
|
||||
|
||||
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33213.308
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Reddit Post Scraping Tool", "Reddit Post Scraping Tool\Reddit Post Scraping Tool.vbproj", "{46C2541E-6F65-461A-A479-F65D445C36EA}"
|
||||
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "RPST", "RPST\RPST.vbproj", "{46C2541E-6F65-461A-A479-F65D445C36EA}"
|
||||
EndProject
|
||||
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "RPSTSetup", "RPSTSetup\RPSTSetup.vdproj", "{7D89A26E-2D54-4BB7-B9C4-E1382E657DEA}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -15,6 +17,8 @@ Global
|
||||
{46C2541E-6F65-461A-A479-F65D445C36EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{46C2541E-6F65-461A-A479-F65D445C36EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{46C2541E-6F65-461A-A479-F65D445C36EA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7D89A26E-2D54-4BB7-B9C4-E1382E657DEA}.Debug|Any CPU.ActiveCfg = Debug
|
||||
{7D89A26E-2D54-4BB7-B9C4-E1382E657DEA}.Release|Any CPU.ActiveCfg = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
84
RPST GUI/RPST/Assets/ApiHandler.vb
Normal file
84
RPST GUI/RPST/Assets/ApiHandler.vb
Normal file
@@ -0,0 +1,84 @@
|
||||
Imports System.IO
|
||||
Imports System.Net.Http
|
||||
Imports Newtonsoft.Json
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
''' <summary>
|
||||
''' Handles requests to Reddit and Github APIs.
|
||||
''' </summary>
|
||||
Public Class ApiHandler
|
||||
Public Property LogFile As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RedditPostScrapingTool", "logs", $"debug.log")
|
||||
Public Property Headers As String = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
|
||||
Public Property UpdatesEndpoint As String = "https://api.github.com/repos/bellingcat/reddit-post-scraping-tool/releases/latest"
|
||||
|
||||
''' <summary>
|
||||
''' Asyncrosnously scrape Reddit data.
|
||||
''' </summary>
|
||||
''' <returns>Json object containing scraped data.</returns>
|
||||
Public Async Function AsyncGetPosts(subreddit As String, listing As String, limit As Integer, timeframe As String) As Task(Of JArray)
|
||||
Dim PostsEndpoint As String = $"https://www.reddit.com/r/{subreddit}/{listing}.json?limit={limit}&t={timeframe}"
|
||||
Return Await PaginatedPosts(endpoint:=PostsEndpoint, limit:=limit)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Retrieves posts in a paginated manner until the specified limit is reached.
|
||||
''' </summary>
|
||||
''' <param name="endpoint">The API endpoint for retrieving posts.</param>
|
||||
''' <param name="limit">The limit on the number of posts to retrieve.</param>
|
||||
''' <returns>A Task(Of JArray) representing the asynchronous operation, which upon completion returns a JArray of posts.</returns>
|
||||
Private Async Function PaginatedPosts(endpoint As String, limit As Integer) As Task(Of JArray)
|
||||
Dim allPosts As New JArray()
|
||||
Dim lastPostId As String = ""
|
||||
Dim useAfter As Boolean = limit > 100
|
||||
|
||||
While allPosts.Count < limit
|
||||
Dim endpointWithAfter As String = If(useAfter And Not String.IsNullOrEmpty(lastPostId), $"{endpoint}&after={lastPostId}", endpoint)
|
||||
Dim postsData As JObject = Await AsyncGetData(endpoint:=endpointWithAfter)
|
||||
Dim postsChildren As JArray = postsData("data")("children")
|
||||
|
||||
If postsChildren.Count = 0 Then
|
||||
Exit While
|
||||
End If
|
||||
|
||||
allPosts.Merge(postsChildren)
|
||||
|
||||
lastPostId = postsChildren.Last("data")("id").ToString()
|
||||
End While
|
||||
|
||||
Return allPosts
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Asyncrosnously gets remote version information from the repository release page.
|
||||
''' </summary>
|
||||
''' <returns>Json object containing update data.</returns>
|
||||
Public Async Function CheckUpdatesAsync() As Task(Of JObject)
|
||||
Return Await AsyncGetData(endpoint:=UpdatesEndpoint)
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Asyncronously retrieves a JObject from the specified endpoint.
|
||||
''' </summary>
|
||||
''' <param name="endpoint">The URL endpoint to retrieve data from.</param>
|
||||
''' <returns>A JObject containing the retrieved data.</returns>
|
||||
Private Async Function AsyncGetData(endpoint As String) As Task(Of JObject)
|
||||
Try
|
||||
Using httpClient As New HttpClient()
|
||||
httpClient.DefaultRequestHeaders.Add("User-Agent", Headers)
|
||||
Dim response As HttpResponseMessage = Await httpClient.GetAsync(endpoint)
|
||||
If response.IsSuccessStatusCode Then
|
||||
Dim json As String = response.Content.ReadAsStringAsync().Result
|
||||
Dim data As JObject = JsonConvert.DeserializeObject(Of JObject)(json)
|
||||
Return data
|
||||
Else
|
||||
MessageBox.Show(response.ReasonPhrase, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End If
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
My.Computer.FileSystem.WriteAllText(LogFile, $"{DateTime.Now}: {ex}{Environment.NewLine}", True)
|
||||
MessageBox.Show($"{ex.Message}. Please see the debug log '{LogFile}' for more information.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End Try
|
||||
Return New JObject()
|
||||
End Function
|
||||
End Class
|
||||
115
RPST GUI/RPST/Assets/PostsProcessor.vb
Normal file
115
RPST GUI/RPST/Assets/PostsProcessor.vb
Normal file
@@ -0,0 +1,115 @@
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
Public Class PostsProcessor
|
||||
Private Shared ReadOnly ApiHandler As New ApiHandler()
|
||||
|
||||
''' <summary>
|
||||
''' Checks if the given Reddit post contains the given keyword in its text.
|
||||
''' </summary>
|
||||
''' <param name="post">The Reddit post to check.</param>
|
||||
''' <param name="keyword">The keyword to check for.</param>
|
||||
''' <returns>True if the post contains the keyword, False otherwise.</returns>
|
||||
Public Shared Function PostContainsKeyword(post As JObject, keyword As String) As Boolean
|
||||
Return post("data")("selftext").ToString.ToLower(Globalization.CultureInfo.InvariantCulture).Contains(keyword.ToLower(System.Globalization.CultureInfo.InvariantCulture))
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Collects user inputs, fetches Reddit posts based on the inputs, checks if posts contain the keyword, and saves posts to a JSON file if necessary.
|
||||
''' </summary>
|
||||
''' <param name="JSONToolStripMenuItem">Indicates whether to save the posts to a JSON file.</param>
|
||||
''' <remarks>
|
||||
''' This function initializes the DataGridView, iterates over each post, adds the posts containing the keyword to the DataGridView and updates the UI.
|
||||
''' It also shows a message if the keyword was not found in any of the posts or if the inputs are empty.
|
||||
''' </remarks>
|
||||
Public Shared Async Sub ProcessRedditPosts(settings)
|
||||
' Collect inputs from the user.
|
||||
Dim inputs = Utilities.CollectInputs()
|
||||
|
||||
If inputs.HasValue Then
|
||||
' Fetch Reddit posts based on the inputs.
|
||||
Dim processor As New PostsProcessor()
|
||||
Dim posts As JArray = Await ApiHandler.AsyncGetPosts(subreddit:=inputs.Value.Subreddit, listing:=inputs.Value.Listing, limit:=inputs.Value.Limit, timeframe:=inputs.Value.Timeframe)
|
||||
Dim totalPosts As Integer = 0
|
||||
Dim keywordFound As Boolean = False
|
||||
Dim foundPosts As Integer = 0
|
||||
Dim foundPostsList As New JArray
|
||||
|
||||
PostsWindow.DataGridViewPosts.Rows.Clear()
|
||||
PostsWindow.DataGridViewPosts.Columns.Clear()
|
||||
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostCount", "Index")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostAuthor", "Author")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostID", "ID")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostTitle", "Title")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostText", "Text")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostSubreddit", "Subreddit")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("SubredditVisibility", "Subreddit Type")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostThumbnail", "Thumbnail")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostIsNSFW", "NSFW")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostIsGilded", "Is Gilded")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostUpvotes", "Upvotes")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostUpvoteRatio", "Upvote Ratio")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostDownvotes", "Downvotes")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostIsCrosspostable", "↪️ Is Shareable")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostScore", "Score")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostCategory", "Category")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostDomain", "Domain")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostPermalink", "Permalink")
|
||||
PostsWindow.DataGridViewPosts.Columns.Add("PostCreatedAt", "Created At")
|
||||
|
||||
' Iterate over each post.
|
||||
For Each post In posts
|
||||
totalPosts += 1
|
||||
' Check if the post contains the keyword
|
||||
If PostsProcessor.PostContainsKeyword(post, inputs.Value.Keyword.ToLower(Globalization.CultureInfo.InvariantCulture)) Then
|
||||
foundPosts += 1
|
||||
foundPostsList.Add(post)
|
||||
|
||||
PostsWindow.DataGridViewPosts.Rows.Add(totalPosts,
|
||||
post("data")("author"),
|
||||
post("data")("id"),
|
||||
post("data")("title"),
|
||||
post("data")("selftext"),
|
||||
post("data")("subreddit_name_prefixed"),
|
||||
post("data")("subreddit_type"),
|
||||
post("data")("thumbnail"),
|
||||
post("data")("over_18"),
|
||||
post("data")("gilded"),
|
||||
post("data")("ups"),
|
||||
post("data")("upvote_ratio"),
|
||||
post("data")("downs"),
|
||||
post("data")("is_crosspostable"),
|
||||
post("data")("score"),
|
||||
post("data")("category"),
|
||||
post("data")("domain"),
|
||||
post("data")("permalink"),
|
||||
post("data")("created"))
|
||||
|
||||
PostsWindow.Text = $"Showing {foundPosts}/{inputs.Value.Limit} {inputs.Value.Listing} posts containing the word {inputs.Value.Keyword}, from r/{inputs.Value.Subreddit}"
|
||||
PostsWindow.Show()
|
||||
keywordFound = True
|
||||
End If
|
||||
Next
|
||||
|
||||
' Check if the keyword was found in any posts
|
||||
If Not keywordFound Then
|
||||
MessageBox.Show($"Keyword `{inputs.Value.Keyword}` was not found in any of the " + posts("data")("children").Count.ToString(Globalization.CultureInfo.InvariantCulture) _
|
||||
+ $" {inputs.Value.Listing} posts from r/{inputs.Value.Subreddit}", "Not Found", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
End If
|
||||
|
||||
|
||||
If settings.SaveToJson Then
|
||||
' Save posts to a JSON file if SaveToJson is True.
|
||||
Utilities.SavePostsToJson(posts:=foundPostsList)
|
||||
End If
|
||||
|
||||
If settings.SaveToCsv Then
|
||||
' Save posts to a CSV file if SaveToCsv is True.
|
||||
Utilities.SavePostsToCSV(posts:=foundPostsList)
|
||||
End If
|
||||
Else
|
||||
End If
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
230
RPST GUI/RPST/Assets/Settings.vb
Normal file
230
RPST GUI/RPST/Assets/Settings.vb
Normal file
@@ -0,0 +1,230 @@
|
||||
Imports System.IO
|
||||
Imports System.Text.Json
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
|
||||
Public Class SettingsManager
|
||||
|
||||
''' <summary>
|
||||
''' Represents the Dark Mode property.
|
||||
''' Indicates whether the dark mode is enabled or disabled.
|
||||
''' </summary>
|
||||
Public Property DarkMode As Boolean
|
||||
Public Property SaveToJson As Boolean
|
||||
Public Property SaveToCsv As Boolean
|
||||
|
||||
Private ReadOnly settingsFilePath As String = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"RPST",
|
||||
"settings.json"
|
||||
)
|
||||
|
||||
''' <summary>
|
||||
''' Loads application settings from the 'settings.json' file.
|
||||
''' If the settings file doesn't exist, it creates a new file with default settings.
|
||||
''' </summary>
|
||||
Public Sub LoadSettings()
|
||||
' Check if the settings.json file exists
|
||||
' and load the configurations from it
|
||||
If File.Exists(settingsFilePath) Then
|
||||
Dim json As String = File.ReadAllText(settingsFilePath)
|
||||
Dim options As New JsonSerializerOptions With {.PropertyNameCaseInsensitive = True}
|
||||
Dim settings = JsonSerializer.Deserialize(Of SettingsManager)(json, options)
|
||||
|
||||
DarkMode = settings.DarkMode
|
||||
SaveToJson = settings.SaveToJson
|
||||
SaveToCsv = settings.SaveToCsv
|
||||
|
||||
MainWindow.DarkModeToolStripMenuItem.Checked = settings.DarkMode
|
||||
MainWindow.ToJSONToolStripMenuItem.Checked = settings.SaveToJson
|
||||
MainWindow.ToCSVToolStripMenuItem.Checked = settings.SaveToCsv
|
||||
Else
|
||||
' Settings file does not exist
|
||||
' Create a new file with default settings 'False'
|
||||
Dim defaultSettings = New SettingsManager With {.DarkMode = False, .SaveToCsv = False, .SaveToJson = False}
|
||||
Dim jsonOutput = JsonSerializer.Serialize(defaultSettings)
|
||||
File.WriteAllText(settingsFilePath, jsonOutput)
|
||||
|
||||
|
||||
SaveToJson = False
|
||||
SaveToCsv = False
|
||||
MainWindow.ToJSONToolStripMenuItem.Checked = False
|
||||
MainWindow.ToCSVToolStripMenuItem.Checked = False
|
||||
|
||||
If Utilities.IsSystemDarkTheme() Then
|
||||
DarkMode = True
|
||||
MainWindow.DarkModeToolStripMenuItem.Checked = True
|
||||
Else
|
||||
DarkMode = False
|
||||
MainWindow.DarkModeToolStripMenuItem.Checked = False
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Retrieves application settings from a JSON file.
|
||||
''' </summary>
|
||||
''' <returns>A Dictionary containing the names and values of all settings.
|
||||
''' If the settings file doesn't exist, returns a Dictionary with default values.</returns>
|
||||
Private Function GetSettings() As Dictionary(Of String, Object)
|
||||
Dim settings As New Dictionary(Of String, Object)
|
||||
If File.Exists(settingsFilePath) Then
|
||||
' Read and parse the JSON settings file.
|
||||
Dim json As String = File.ReadAllText(settingsFilePath)
|
||||
Dim jObject As JObject = JObject.Parse(json)
|
||||
|
||||
' Loop through each property in the JObject and add it to the settings Dictionary.
|
||||
For Each item As JProperty In jObject.Properties()
|
||||
settings.Add(item.Name, item.Value.ToObject(Of Object)())
|
||||
Next
|
||||
Else
|
||||
End If
|
||||
Return settings
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Saves the provided settings to the 'settings.json' file.
|
||||
''' </summary>
|
||||
''' <param name="settings">An instance of the SettingsManager containing the configurations to be saved.</param>
|
||||
Private Sub SaveSettings(settings)
|
||||
Dim jsonOutput = JsonSerializer.Serialize(settings)
|
||||
File.WriteAllText(settingsFilePath, jsonOutput)
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Applies the current settings to the application's interface. This includes
|
||||
''' toggling SaveToJson, SaveToCsv, and applying the visual theme based on the Dark Mode setting.
|
||||
''' </summary>
|
||||
Public Sub ApplySettings()
|
||||
' Retrieve the current settings
|
||||
Dim settings As Dictionary(Of String, Object) = GetSettings()
|
||||
|
||||
' Apply the SaveToJson setting to the menu item checkbox
|
||||
MainWindow.ToJSONToolStripMenuItem.Checked = CBool(settings("SaveToJson"))
|
||||
|
||||
' Apply the SaveToCsv setting to the menu item checkbox
|
||||
MainWindow.ToCSVToolStripMenuItem.Checked = CBool(settings("SaveToCsv"))
|
||||
|
||||
' Apply the color scheme based on the Dark Mode setting
|
||||
ApplyColorScheme(isDarkMode:=CBool(settings("DarkMode")))
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Applies the color scheme based on the given Dark Mode setting.
|
||||
''' Colors are defined in a mapping for easier maintenance and flexibility.
|
||||
''' </summary>
|
||||
''' <param name="isDarkMode">Indicates whether Dark Mode is enabled.</param>
|
||||
Public Shared Sub ApplyColorScheme(ByVal isDarkMode As Boolean)
|
||||
' Initialize color mapping
|
||||
Dim colorMap As New Dictionary(Of String, Color)
|
||||
|
||||
If isDarkMode Then
|
||||
' Dark Mode colors
|
||||
colorMap("MainBackground") = ColorTranslator.FromHtml("#FF121212")
|
||||
colorMap("TextBoxBackground") = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
colorMap("Foreground") = SystemColors.Control
|
||||
colorMap("MenuBackground") = ColorTranslator.FromHtml("#FF121212")
|
||||
colorMap("AboutBackground") = ColorTranslator.FromHtml("#FF121212")
|
||||
colorMap("AboutForeground") = SystemColors.Control
|
||||
colorMap("TabPageBackground") = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
colorMap("TabPageForeground") = SystemColors.Control
|
||||
colorMap("ButtonForeground") = Color.Black
|
||||
Else
|
||||
' Light Mode colors
|
||||
colorMap("MainBackground") = Color.Gainsboro
|
||||
colorMap("TextBoxBackground") = SystemColors.Control
|
||||
colorMap("Foreground") = ColorTranslator.FromHtml("#FF121212")
|
||||
colorMap("MenuBackground") = Color.Gainsboro
|
||||
colorMap("AboutBackground") = Color.Gainsboro
|
||||
colorMap("AboutForeground") = SystemColors.WindowText
|
||||
colorMap("TabPageBackground") = SystemColors.Control
|
||||
colorMap("TabPageForeground") = SystemColors.WindowText
|
||||
colorMap("ButtonForeground") = Color.Black
|
||||
End If
|
||||
|
||||
' Applying Main Form colors
|
||||
MainWindow.BackColor = colorMap("MainBackground")
|
||||
MainWindow.TextBoxKeyword.BackColor = colorMap("TextBoxBackground")
|
||||
MainWindow.TextBoxSubreddit.BackColor = colorMap("TextBoxBackground")
|
||||
MainWindow.NumericUpDownLimit.BackColor = colorMap("TextBoxBackground")
|
||||
MainWindow.ComboBoxListing.BackColor = colorMap("TextBoxBackground")
|
||||
MainWindow.ComboBoxTimeframe.BackColor = colorMap("TextBoxBackground")
|
||||
MainWindow.TextBoxKeyword.ForeColor = colorMap("Foreground")
|
||||
MainWindow.TextBoxSubreddit.ForeColor = colorMap("Foreground")
|
||||
MainWindow.NumericUpDownLimit.ForeColor = colorMap("Foreground")
|
||||
MainWindow.ComboBoxListing.ForeColor = colorMap("Foreground")
|
||||
MainWindow.ComboBoxTimeframe.ForeColor = colorMap("Foreground")
|
||||
MainWindow.LabelKeyword.ForeColor = colorMap("Foreground")
|
||||
MainWindow.LabelSubreddit.ForeColor = colorMap("Foreground")
|
||||
MainWindow.LabelLimit.ForeColor = colorMap("Foreground")
|
||||
MainWindow.LabelListing.ForeColor = colorMap("Foreground")
|
||||
MainWindow.LabelTimeframe.ForeColor = colorMap("Foreground")
|
||||
|
||||
' Applying Right-Click Menu colors
|
||||
MainWindow.SettingsToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.DarkModeToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.SavePostsToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.ToJSONToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.ToCSVToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.AboutToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.CheckForUpdatesToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.QuitToolStripMenuItem.BackColor = colorMap("MenuBackground")
|
||||
MainWindow.SettingsToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.DarkModeToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.SavePostsToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.ToJSONToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.ToCSVToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.AboutToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.CheckForUpdatesToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
MainWindow.QuitToolStripMenuItem.ForeColor = colorMap("Foreground")
|
||||
|
||||
' Applying About Box colors
|
||||
AboutBox.BackColor = colorMap("AboutBackground")
|
||||
AboutBox.TabPageAbout.BackColor = colorMap("TabPageBackground")
|
||||
AboutBox.TabPageAuthor.BackColor = colorMap("TabPageBackground")
|
||||
AboutBox.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.LabelProgramName.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.LabelDescription.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.LabelCopyright.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.LabelVersion.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.LabelAuthor.ForeColor = colorMap("AboutForeground")
|
||||
AboutBox.ButtonClose.ForeColor = colorMap("ButtonForeground")
|
||||
|
||||
' Updating Dark Mode Text
|
||||
If isDarkMode Then
|
||||
MainWindow.DarkModeToolStripMenuItem.Text = "Dark Mode: Disable"
|
||||
Else
|
||||
MainWindow.DarkModeToolStripMenuItem.Text = "Dark Mode: Enable"
|
||||
End If
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Toggles specific settings on or off based on the provided parameters.
|
||||
''' </summary>
|
||||
''' <param name="enabled">A Boolean indicating if the setting option should be enabled or not.</param>
|
||||
''' <param name="saveTo">A String specifying the type of setting to toggle ('json', 'csv', or 'darkmode').</param>
|
||||
Public Sub ToggleSettings(enabled As Boolean, saveTo As String)
|
||||
' Read the existing settings from the settings file
|
||||
Dim json As String = File.ReadAllText(settingsFilePath)
|
||||
Dim options As New JsonSerializerOptions With {.PropertyNameCaseInsensitive = True}
|
||||
Dim settings As SettingsManager = JsonSerializer.Deserialize(Of SettingsManager)(json, options)
|
||||
|
||||
' Update the settings based on the specified saveTo parameter
|
||||
If saveTo.ToLower(Globalization.CultureInfo.InvariantCulture) = "json" Then
|
||||
settings.SaveToJson = enabled
|
||||
ElseIf saveTo.ToLower(Globalization.CultureInfo.InvariantCulture) = "csv" Then
|
||||
settings.SaveToCsv = enabled
|
||||
ElseIf saveTo.ToLower(Globalization.CultureInfo.InvariantCulture) = "darkmode" Then
|
||||
settings.DarkMode = enabled
|
||||
Else
|
||||
' Handle unexpected value of saveTo (if needed)
|
||||
End If
|
||||
|
||||
' Save the updated settings back to the settings file
|
||||
SaveSettings(settings)
|
||||
' Apply the updated settings to the application
|
||||
ApplySettings()
|
||||
End Sub
|
||||
End Class
|
||||
173
RPST GUI/RPST/Assets/Utilities.vb
Normal file
173
RPST GUI/RPST/Assets/Utilities.vb
Normal file
@@ -0,0 +1,173 @@
|
||||
Imports System.IO
|
||||
Imports Microsoft.Win32
|
||||
Imports Newtonsoft.Json
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
Public Class Utilities
|
||||
|
||||
''' <summary>
|
||||
''' Determines if the Windows system theme is in dark mode.
|
||||
''' </summary>
|
||||
''' <returns>
|
||||
''' True if the dark mode is enabled, otherwise false.
|
||||
''' </returns>
|
||||
Public Shared Function IsSystemDarkTheme() As Boolean
|
||||
Dim registryKey As RegistryKey = Registry.CurrentUser.OpenSubKey(
|
||||
"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"
|
||||
)
|
||||
If registryKey IsNot Nothing Then
|
||||
Dim appsUseLightTheme As Object = registryKey.GetValue("AppsUseLightTheme")
|
||||
Return appsUseLightTheme IsNot Nothing AndAlso CType(appsUseLightTheme, Integer) = 0
|
||||
Else
|
||||
Return False
|
||||
End If
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Shows the license notice in a messagebox.
|
||||
''' </summary>
|
||||
''' <returns>
|
||||
''' Result of the Dialog (Yes/No).
|
||||
''' </returns>
|
||||
Public Shared Function LicenseAgreement()
|
||||
Dim result As DialogResult = MessageBox.Show($"{My.Application.Info.Copyright}
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the ""Software""), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", "MIT License", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
|
||||
Return result
|
||||
End Function
|
||||
|
||||
''' <summary>
|
||||
''' Checks for the existence of the 'logs' directory under the 'RPST' directory within the user's AppData\Roaming folder.
|
||||
''' If the directory does not exist, it creates one.
|
||||
''' </summary>
|
||||
''' <remarks>
|
||||
''' The directory path is 'C:\Users\<username>\AppData\Roaming\RPST\logs'.
|
||||
''' If the 'RPST' or 'logs' directories do not exist, the function will create them.
|
||||
''' If the directories already exist, the function will not perform any actions.
|
||||
''' </remarks>
|
||||
Public Shared Sub PathFinder()
|
||||
Dim directoryPath As String = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"RPST", "logs"
|
||||
)
|
||||
|
||||
If Not Directory.Exists(directoryPath) Then
|
||||
Directory.CreateDirectory(directoryPath)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Collects and validates user inputs from StartForm and returns them as a Tuple.
|
||||
''' </summary>
|
||||
''' <returns>
|
||||
''' Tuple containing:
|
||||
''' Keyword (String) - Keyword entered by user in theMainWindow.
|
||||
''' Subreddit (String) - Subreddit entered by user in theMainWindow.
|
||||
''' Listing (String) - Listing chosen by user in the StartForm, defaults to 'top' if none is selected.
|
||||
''' Limit (Integer) - Limit entered by user in the StartForm, defaults to 10 if the entered value is over 100.
|
||||
''' Timeframe (String) - Timeframe chosen by user in the StartForm, defaults to 'all' if none is selected.
|
||||
''' </returns>
|
||||
''' <remarks>
|
||||
''' If keyword or subreddit are empty, Displays a warning and returns nothing.
|
||||
''' </remarks>
|
||||
Public Shared Function CollectInputs() As (Keyword As String, Subreddit As String, Listing As String, Limit As Integer, Timeframe As String)?
|
||||
Dim keyword As String = MainWindow.TextBoxKeyword.Text.Trim()
|
||||
Dim subreddit As String = MainWindow.TextBoxSubreddit.Text.Trim()
|
||||
' Convert the Listing and Subreddit to lowercase using InvariantCulture.
|
||||
Dim listing As String = If(String.IsNullOrEmpty(MainWindow.ComboBoxListing.Text), "top", MainWindow.ComboBoxListing.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim())
|
||||
Dim timeframe As String = If(String.IsNullOrEmpty(MainWindow.ComboBoxTimeframe.Text), "all", MainWindow.ComboBoxTimeframe.Text.ToLower(Globalization.CultureInfo.InvariantCulture).Trim())
|
||||
Dim limit As Integer = MainWindow.NumericUpDownLimit.Value
|
||||
|
||||
' Validate inputs.
|
||||
If String.IsNullOrEmpty(keyword) AndAlso String.IsNullOrEmpty(subreddit) Then
|
||||
MessageBox.Show("Keyword and Subreddit should not be empty.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
Return Nothing
|
||||
ElseIf String.IsNullOrEmpty(keyword) Then
|
||||
MessageBox.Show("Keyword field should not be empty.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
Return Nothing
|
||||
ElseIf String.IsNullOrEmpty(subreddit) Then
|
||||
MessageBox.Show("Subreddit field should not be empty.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
Return Nothing
|
||||
End If
|
||||
Return (keyword, subreddit, listing, limit, timeframe)
|
||||
End Function
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Saves the gives posts' data to a JSON file.
|
||||
''' </summary>
|
||||
''' <param name="Posts">The object containing posts to be saved.</param>
|
||||
''' <remarks>
|
||||
''' This function allows the user to select a location to save the posts.
|
||||
''' If the user confirms the save location, the posts will be serialized
|
||||
''' to JSON with an indented format and written to the chosen file.
|
||||
''' A success message will be displayed to the user upon successful save.
|
||||
''' </remarks>
|
||||
Public Shared Sub SavePostsToJson(posts As Object)
|
||||
Dim saveFileDialog As New SaveFileDialog With {
|
||||
.Filter = "JSON files (*.json)|*.json",
|
||||
.Title = "Save posts to JSON"
|
||||
}
|
||||
|
||||
If saveFileDialog.ShowDialog() = DialogResult.OK Then
|
||||
Dim fileName As String = saveFileDialog.FileName
|
||||
Dim serializerSettings As New JsonSerializerSettings With {
|
||||
.Formatting = Formatting.Indented
|
||||
}
|
||||
Dim json As String = JsonConvert.SerializeObject(posts, serializerSettings)
|
||||
|
||||
File.WriteAllText(fileName, json)
|
||||
|
||||
MessageBox.Show($"Posts saved to {fileName}", "Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Saves Reddit posts contained in a JArray to a CSV file.
|
||||
''' </summary>
|
||||
''' <param name="posts">A JArray containing the Reddit posts to be saved.</param>
|
||||
''' <remarks>
|
||||
''' This function displays a SaveFileDialog to allow the user to specify the file name and location.
|
||||
''' It then iterates through the JArray to write each post's details (totalPosts, title, subreddit, author, score) into the selected CSV file.
|
||||
''' </remarks>
|
||||
Public Shared Sub SavePostsToCSV(posts As JArray)
|
||||
Dim saveFileDialog As New SaveFileDialog With {
|
||||
.Filter = "CSV files (*.csv)|*.csv",
|
||||
.Title = "Save posts to CSV"
|
||||
}
|
||||
|
||||
If saveFileDialog.ShowDialog() = DialogResult.OK Then
|
||||
Dim fileName As String = saveFileDialog.FileName
|
||||
Using csvWriter As New StreamWriter(fileName)
|
||||
' Write the header.
|
||||
csvWriter.WriteLine("Index,Author,ID,Subreddit,Visibility,Thumbnail,NSFW,Gilded,Upvotes,Upvote Ratio,Downvotes,Award,Top Award,Is cross-postable?,Score,Category,Text,Domain,Permalink,Created At,Approved At,Approved By")
|
||||
|
||||
Dim postCount As Integer = 0
|
||||
For Each post In posts
|
||||
postCount += 1
|
||||
csvWriter.WriteLine($"{postCount},{post("data")("author")},{post("data")("id")},{post("data")("subreddit_name_prefixed")},{post("data")("subreddit_type")},{post("data")("thumbnail")},{post("data")("over_18")},{post("data")("gilded")},{post("data")("ups")},{post("data")("upvote_ratio")},{post("data")("downs")},{post("data")("total_awards_received")},{post("data")("top_awarded_type")},{post("data")("is_crosspostable")},{post("data")("score")},{post("data")("category")},{post("data")("selftext")},{post("data")("domain")},{post("data")("permalink")},{post("data")("created")},{post("data")("approved_at_utc")},{post("data")("approved_by")}")
|
||||
Next
|
||||
End Using
|
||||
|
||||
MessageBox.Show($"Posts saved to {fileName}", "Saved", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
End If
|
||||
End Sub
|
||||
End Class
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Richard Mwewa
|
||||
Copyright (c) 2023 Richard Mwewa
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
19
RPST GUI/RPST/LICENSE.rtf
Normal file
19
RPST GUI/RPST/LICENSE.rtf
Normal file
@@ -0,0 +1,19 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf2577
|
||||
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
{\*\expandedcolortbl;;}
|
||||
\paperw11900\paperh16840\margl1440\margr1440\vieww13560\viewh17700\viewkind0
|
||||
\pard\tx0\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
|
||||
|
||||
{
|
||||
{\header The MIT License (MIT)}
|
||||
The MIT License (MIT)\par
|
||||
\fs20\li0\fi0 Copyright (c) 2023 Richard Mwewa
|
||||
\par\par
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
\par\par
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
\par\par
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\par
|
||||
}
|
||||
}
|
||||
@@ -33,7 +33,13 @@ Namespace My
|
||||
|
||||
<Global.System.Diagnostics.DebuggerStepThroughAttribute()> _
|
||||
Protected Overrides Sub OnCreateMainForm()
|
||||
Me.MainForm = Global.Reddit_Post_Scraping_Tool.StartForm
|
||||
Me.MainForm = Global.RPST.MainWindow
|
||||
End Sub
|
||||
|
||||
<Global.System.Diagnostics.DebuggerStepThroughAttribute()>
|
||||
Protected Overrides Function OnInitialize(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean
|
||||
Me.MinimumSplashScreenDisplayTime = 2000
|
||||
Return MyBase.OnInitialize(commandLineArgs)
|
||||
End Function
|
||||
End Class
|
||||
End Namespace
|
||||
@@ -1,10 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-16"?>
|
||||
<?xml version="1.0" encoding="utf-16"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>true</MySubMain>
|
||||
<MainForm>StartForm</MainForm>
|
||||
<MainForm>MainWindow</MainForm>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
<SplashScreen></SplashScreen>
|
||||
<MinimumSplashScreenDisplayTime>2000</MinimumSplashScreenDisplayTime>
|
||||
</MyApplicationData>
|
||||
52
RPST GUI/RPST/README.md
Normal file
52
RPST GUI/RPST/README.md
Normal file
@@ -0,0 +1,52 @@
|
||||

|
||||
|
||||
## Note
|
||||
|
||||
> Use [Knew Karma](https://github.com/bellingcat/knewkarma) for more advanced and improved features.
|
||||
|
||||
# RPST (Reddit Post Scraping Tool)
|
||||
|
||||
Retrieve **Reddit** posts that contain the specified **keyword** from a specified **subreddit**.
|
||||
|
||||
[](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml) [](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml)  
|
||||
|
||||
# ✅ Features
|
||||
|
||||
## *GUI*
|
||||
|
||||
- [x] Dark mode (*Right-click>Settings>Dark Mode*).
|
||||
- [x] Saves results to a JSON/CSV file (*Right-click>Settings>Save posts>to JSON/to CSV*).
|
||||
- [x] Logs errors to a file.
|
||||
- [x] In-App feature to check for Updates.
|
||||
|
||||
## *CLI*
|
||||
|
||||
- [x] Saves results to JSON (*specifiy* `--json`).
|
||||
- [x] Saves results to CSV (*specify* `--csv`).
|
||||
- [x] Automatically checks for new updates, and notifies user if updates were found.
|
||||
|
||||
# 📃 TODO
|
||||
|
||||
## *GUI*
|
||||
|
||||
- [ ] Make it installable with a setup.exe/setup.msi file.
|
||||
|
||||
# 🖥️ Tested environments
|
||||
|
||||
## *GUI*
|
||||
|
||||
- [x] Microsoft Windows 11
|
||||
|
||||
## *CLI*
|
||||
|
||||
- [x] Android Termux
|
||||
- [x] Microsoft Windows 11
|
||||
- [x] Ubuntu 22.04 - latest versions
|
||||
|
||||
# 📖 Documentation
|
||||
|
||||
[Refer to the Wiki](https://github.com/bellingcat/reddit-post-scraping-tool/wiki) for installation instructions, in
|
||||
addition to all other documentation.
|
||||
|
||||
***
|
||||
[](https://about.me/rly0nheart)
|
||||
@@ -3,25 +3,35 @@
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<StartupObject>Reddit_Post_Scraping_Tool.My.MyApplication</StartupObject>
|
||||
<StartupObject>RPST.My.MyApplication</StartupObject>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<MyType>WindowsForms</MyType>
|
||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||
<ApplicationIcon>Resources\icon.ico</ApplicationIcon>
|
||||
<Company>Richard Mwewa</Company>
|
||||
<Description>Given a subreddit name and a keyword, this program returns all top (by default) posts that contain the specified keyword. </Description>
|
||||
<Copyright>Copyright (c) 2023 Richard Mwewa. All rights reserved.</Copyright>
|
||||
<PackageProjectUrl>https://github.com/rly0nheart/reddit-post-scraping-tool</PackageProjectUrl>
|
||||
<Description>Retrieve Reddit posts that contain the specified keyword from a specified subreddit. </Description>
|
||||
<Copyright>© 2023 Richard Mwewa. All rights reserved.</Copyright>
|
||||
<PackageProjectUrl>https://github.com/bellingcat/reddit-post-scraping-tool</PackageProjectUrl>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<RepositoryUrl>https://github.com/rly0nheart/reddit-post-scraping-tool</RepositoryUrl>
|
||||
<AssemblyVersion>1.1.0.0</AssemblyVersion>
|
||||
<FileVersion>1.1.0.0</FileVersion>
|
||||
<RepositoryUrl>https://github.com/bellingcat/reddit-post-scraping-tool</RepositoryUrl>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
<FileVersion>2.0.0.0</FileVersion>
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
|
||||
<Version>1.1.0</Version>
|
||||
<Version>2.0.0</Version>
|
||||
<PackageTags>reddit;scraper;reddit-scraper;osint</PackageTags>
|
||||
<PackageReleaseNotes></PackageReleaseNotes>
|
||||
<AnalysisLevel>6.0-recommended</AnalysisLevel>
|
||||
<PackageId>RPST</PackageId>
|
||||
<Authors>Richard Mwewa</Authors>
|
||||
<NeutralLanguage>en</NeutralLanguage>
|
||||
<Product>$(AssemblyName) (Reddit Post Scraping Tool)</Product>
|
||||
<AssemblyName>RPST</AssemblyName>
|
||||
<Title>Reddit Post Scraping Tool.</Title>
|
||||
<PackageIcon>icon.png</PackageIcon>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="icon.ico" />
|
||||
<Content Include="Resources\icon.ico" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -31,7 +41,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -68,6 +78,10 @@
|
||||
<Pack>True</Pack>
|
||||
<PackagePath>\</PackagePath>
|
||||
</None>
|
||||
<None Update="Resources\icon.png">
|
||||
<Pack>True</Pack>
|
||||
<PackagePath>\</PackagePath>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -1,13 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Compile Update="DeveloperForm.vb">
|
||||
<Compile Update="Windows\AboutBox.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Update="PostsForm.vb">
|
||||
<Compile Update="Windows\MainWindow.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Update="StartForm.vb">
|
||||
<Compile Update="Windows\PostsWindow.vb">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
BIN
RPST GUI/RPST/Resources/icon-small.ico
Normal file
BIN
RPST GUI/RPST/Resources/icon-small.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
BIN
RPST GUI/RPST/Resources/icon.ico
Normal file
BIN
RPST GUI/RPST/Resources/icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
BIN
RPST GUI/RPST/Resources/icon.png
Normal file
BIN
RPST GUI/RPST/Resources/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
259
RPST GUI/RPST/Windows/AboutBox.Designer.vb
generated
Normal file
259
RPST GUI/RPST/Windows/AboutBox.Designer.vb
generated
Normal file
@@ -0,0 +1,259 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
|
||||
Partial Class AboutBox
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()> _
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()> _
|
||||
Private Sub InitializeComponent()
|
||||
Dim resources As ComponentModel.ComponentResourceManager = New ComponentModel.ComponentResourceManager(GetType(AboutBox))
|
||||
PictureBoxLogo = New PictureBox()
|
||||
LabelProgramName = New Label()
|
||||
LabelDescription = New Label()
|
||||
TabControl1 = New TabControl()
|
||||
TabPageAbout = New TabPage()
|
||||
LabelCopyright = New Label()
|
||||
LinkLabelLicense = New LinkLabel()
|
||||
LinkLabelReadtheWiki = New LinkLabel()
|
||||
TabPageAuthor = New TabPage()
|
||||
LinkLabelEmail = New LinkLabel()
|
||||
LinkLabelBMC = New LinkLabel()
|
||||
LinkLabelAboutMe = New LinkLabel()
|
||||
LabelAuthor = New Label()
|
||||
LabelVersion = New Label()
|
||||
ButtonClose = New Button()
|
||||
CType(PictureBoxLogo, ComponentModel.ISupportInitialize).BeginInit()
|
||||
TabControl1.SuspendLayout()
|
||||
TabPageAbout.SuspendLayout()
|
||||
TabPageAuthor.SuspendLayout()
|
||||
SuspendLayout()
|
||||
'
|
||||
' PictureBoxLogo
|
||||
'
|
||||
PictureBoxLogo.BackColor = Color.Transparent
|
||||
PictureBoxLogo.Image = CType(resources.GetObject("PictureBoxLogo.Image"), Image)
|
||||
PictureBoxLogo.Location = New Point(12, 12)
|
||||
PictureBoxLogo.Name = "PictureBoxLogo"
|
||||
PictureBoxLogo.Size = New Size(62, 64)
|
||||
PictureBoxLogo.SizeMode = PictureBoxSizeMode.StretchImage
|
||||
PictureBoxLogo.TabIndex = 0
|
||||
PictureBoxLogo.TabStop = False
|
||||
'
|
||||
' LabelProgramName
|
||||
'
|
||||
LabelProgramName.AutoSize = True
|
||||
LabelProgramName.Font = New Font("Segoe UI Semibold", 9.75F, FontStyle.Bold, GraphicsUnit.Point)
|
||||
LabelProgramName.ForeColor = SystemColors.ControlText
|
||||
LabelProgramName.Location = New Point(80, 33)
|
||||
LabelProgramName.Name = "LabelProgramName"
|
||||
LabelProgramName.Size = New Size(44, 17)
|
||||
LabelProgramName.TabIndex = 3
|
||||
LabelProgramName.Text = "Name"
|
||||
'
|
||||
' LabelDescription
|
||||
'
|
||||
LabelDescription.AutoSize = True
|
||||
LabelDescription.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
LabelDescription.ForeColor = SystemColors.ControlText
|
||||
LabelDescription.Location = New Point(6, 7)
|
||||
LabelDescription.Name = "LabelDescription"
|
||||
LabelDescription.Size = New Size(67, 15)
|
||||
LabelDescription.TabIndex = 4
|
||||
LabelDescription.Text = "Description"
|
||||
'
|
||||
' TabControl1
|
||||
'
|
||||
TabControl1.Controls.Add(TabPageAbout)
|
||||
TabControl1.Controls.Add(TabPageAuthor)
|
||||
TabControl1.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
TabControl1.Location = New Point(12, 91)
|
||||
TabControl1.Name = "TabControl1"
|
||||
TabControl1.SelectedIndex = 0
|
||||
TabControl1.Size = New Size(322, 152)
|
||||
TabControl1.TabIndex = 8
|
||||
'
|
||||
' TabPageAbout
|
||||
'
|
||||
TabPageAbout.BackColor = Color.Transparent
|
||||
TabPageAbout.Controls.Add(LabelCopyright)
|
||||
TabPageAbout.Controls.Add(LinkLabelLicense)
|
||||
TabPageAbout.Controls.Add(LabelDescription)
|
||||
TabPageAbout.Controls.Add(LinkLabelReadtheWiki)
|
||||
TabPageAbout.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold, GraphicsUnit.Point)
|
||||
TabPageAbout.Location = New Point(4, 24)
|
||||
TabPageAbout.Name = "TabPageAbout"
|
||||
TabPageAbout.Padding = New Padding(3)
|
||||
TabPageAbout.Size = New Size(314, 124)
|
||||
TabPageAbout.TabIndex = 0
|
||||
TabPageAbout.Text = "About"
|
||||
'
|
||||
' LabelCopyright
|
||||
'
|
||||
LabelCopyright.AutoSize = True
|
||||
LabelCopyright.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
LabelCopyright.Location = New Point(6, 97)
|
||||
LabelCopyright.Name = "LabelCopyright"
|
||||
LabelCopyright.Size = New Size(60, 15)
|
||||
LabelCopyright.TabIndex = 7
|
||||
LabelCopyright.Text = "Copyright"
|
||||
'
|
||||
' LinkLabelLicense
|
||||
'
|
||||
LinkLabelLicense.AutoSize = True
|
||||
LinkLabelLicense.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
LinkLabelLicense.Location = New Point(6, 52)
|
||||
LinkLabelLicense.Name = "LinkLabelLicense"
|
||||
LinkLabelLicense.Size = New Size(84, 15)
|
||||
LinkLabelLicense.TabIndex = 5
|
||||
LinkLabelLicense.TabStop = True
|
||||
LinkLabelLicense.Text = "🗒️ MIT License"
|
||||
'
|
||||
' LinkLabelReadtheWiki
|
||||
'
|
||||
LinkLabelReadtheWiki.AutoSize = True
|
||||
LinkLabelReadtheWiki.Font = New Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
LinkLabelReadtheWiki.Location = New Point(6, 74)
|
||||
LinkLabelReadtheWiki.Name = "LinkLabelReadtheWiki"
|
||||
LinkLabelReadtheWiki.Size = New Size(94, 15)
|
||||
LinkLabelReadtheWiki.TabIndex = 6
|
||||
LinkLabelReadtheWiki.TabStop = True
|
||||
LinkLabelReadtheWiki.Text = "📖 Read the Wiki"
|
||||
'
|
||||
' TabPageAuthor
|
||||
'
|
||||
TabPageAuthor.BackColor = Color.Transparent
|
||||
TabPageAuthor.Controls.Add(LinkLabelEmail)
|
||||
TabPageAuthor.Controls.Add(LinkLabelBMC)
|
||||
TabPageAuthor.Controls.Add(LinkLabelAboutMe)
|
||||
TabPageAuthor.Controls.Add(LabelAuthor)
|
||||
TabPageAuthor.ForeColor = SystemColors.ControlText
|
||||
TabPageAuthor.Location = New Point(4, 24)
|
||||
TabPageAuthor.Name = "TabPageAuthor"
|
||||
TabPageAuthor.Padding = New Padding(3)
|
||||
TabPageAuthor.Size = New Size(314, 124)
|
||||
TabPageAuthor.TabIndex = 1
|
||||
TabPageAuthor.Text = "Author"
|
||||
'
|
||||
' LinkLabelEmail
|
||||
'
|
||||
LinkLabelEmail.AutoSize = True
|
||||
LinkLabelEmail.Location = New Point(6, 89)
|
||||
LinkLabelEmail.Name = "LinkLabelEmail"
|
||||
LinkLabelEmail.Size = New Size(51, 15)
|
||||
LinkLabelEmail.TabIndex = 3
|
||||
LinkLabelEmail.TabStop = True
|
||||
LinkLabelEmail.Text = "📧 Email"
|
||||
'
|
||||
' LinkLabelBMC
|
||||
'
|
||||
LinkLabelBMC.AutoSize = True
|
||||
LinkLabelBMC.Location = New Point(3, 66)
|
||||
LinkLabelBMC.Name = "LinkLabelBMC"
|
||||
LinkLabelBMC.Size = New Size(111, 15)
|
||||
LinkLabelBMC.TabIndex = 2
|
||||
LinkLabelBMC.TabStop = True
|
||||
LinkLabelBMC.Text = "🍵 Buy Me A Coffee"
|
||||
'
|
||||
' LinkLabelAboutMe
|
||||
'
|
||||
LinkLabelAboutMe.AutoSize = True
|
||||
LinkLabelAboutMe.Location = New Point(6, 43)
|
||||
LinkLabelAboutMe.Name = "LinkLabelAboutMe"
|
||||
LinkLabelAboutMe.Size = New Size(75, 15)
|
||||
LinkLabelAboutMe.TabIndex = 1
|
||||
LinkLabelAboutMe.TabStop = True
|
||||
LinkLabelAboutMe.Text = "🔗 About.me"
|
||||
'
|
||||
' LabelAuthor
|
||||
'
|
||||
LabelAuthor.AutoSize = True
|
||||
LabelAuthor.Font = New Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point)
|
||||
LabelAuthor.Location = New Point(6, 15)
|
||||
LabelAuthor.Name = "LabelAuthor"
|
||||
LabelAuthor.Size = New Size(96, 15)
|
||||
LabelAuthor.TabIndex = 0
|
||||
LabelAuthor.Text = "Richard Mwewa"
|
||||
'
|
||||
' LabelVersion
|
||||
'
|
||||
LabelVersion.AutoSize = True
|
||||
LabelVersion.Font = New Font("Segoe UI", 8.25F, FontStyle.Regular, GraphicsUnit.Point)
|
||||
LabelVersion.Location = New Point(80, 53)
|
||||
LabelVersion.Name = "LabelVersion"
|
||||
LabelVersion.Size = New Size(45, 13)
|
||||
LabelVersion.TabIndex = 9
|
||||
LabelVersion.Text = "Version"
|
||||
'
|
||||
' ButtonClose
|
||||
'
|
||||
ButtonClose.Location = New Point(275, 249)
|
||||
ButtonClose.Name = "ButtonClose"
|
||||
ButtonClose.Size = New Size(61, 23)
|
||||
ButtonClose.TabIndex = 6
|
||||
ButtonClose.Text = "&Close"
|
||||
ButtonClose.UseVisualStyleBackColor = True
|
||||
'
|
||||
' AboutBox
|
||||
'
|
||||
AutoScaleDimensions = New SizeF(7F, 15F)
|
||||
AutoScaleMode = AutoScaleMode.Font
|
||||
BackColor = Color.Gainsboro
|
||||
CancelButton = ButtonClose
|
||||
ClientSize = New Size(346, 285)
|
||||
Controls.Add(ButtonClose)
|
||||
Controls.Add(LabelVersion)
|
||||
Controls.Add(TabControl1)
|
||||
Controls.Add(LabelProgramName)
|
||||
Controls.Add(PictureBoxLogo)
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle
|
||||
Icon = CType(resources.GetObject("$this.Icon"), Icon)
|
||||
MaximizeBox = False
|
||||
MinimizeBox = False
|
||||
Name = "AboutBox"
|
||||
ShowInTaskbar = False
|
||||
StartPosition = FormStartPosition.CenterScreen
|
||||
Text = "About"
|
||||
CType(PictureBoxLogo, ComponentModel.ISupportInitialize).EndInit()
|
||||
TabControl1.ResumeLayout(False)
|
||||
TabPageAbout.ResumeLayout(False)
|
||||
TabPageAbout.PerformLayout()
|
||||
TabPageAuthor.ResumeLayout(False)
|
||||
TabPageAuthor.PerformLayout()
|
||||
ResumeLayout(False)
|
||||
PerformLayout()
|
||||
End Sub
|
||||
|
||||
Friend WithEvents PictureBoxLogo As PictureBox
|
||||
Friend WithEvents LabelProgramName As Label
|
||||
Friend WithEvents LabelDescription As Label
|
||||
Friend WithEvents LicenseRichTextBox As RichTextBox
|
||||
Friend WithEvents DataGridView1 As DataGridView
|
||||
Friend WithEvents TabControl1 As TabControl
|
||||
Friend WithEvents TabPageAbout As TabPage
|
||||
Friend WithEvents TabPageAuthor As TabPage
|
||||
Friend WithEvents LabelVersion As Label
|
||||
Friend WithEvents LinkLabelLicense As LinkLabel
|
||||
Friend WithEvents ButtonClose As Button
|
||||
Friend WithEvents LabelCopyright As Label
|
||||
Friend WithEvents LinkLabelReadtheWiki As LinkLabel
|
||||
Friend WithEvents LabelAuthor As Label
|
||||
Friend WithEvents LinkLabelAboutMe As LinkLabel
|
||||
Friend WithEvents LinkLabelEmail As LinkLabel
|
||||
Friend WithEvents LinkLabelBMC As LinkLabel
|
||||
End Class
|
||||
1491
RPST GUI/RPST/Windows/AboutBox.resx
Normal file
1491
RPST GUI/RPST/Windows/AboutBox.resx
Normal file
File diff suppressed because it is too large
Load Diff
82
RPST GUI/RPST/Windows/AboutBox.vb
Normal file
82
RPST GUI/RPST/Windows/AboutBox.vb
Normal file
@@ -0,0 +1,82 @@
|
||||
Imports System.Runtime
|
||||
|
||||
Public Class AboutBox
|
||||
ReadOnly settings As New SettingsManager()
|
||||
|
||||
''' <summary>
|
||||
''' Handles the Load event for the AboutBox form.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub AboutBox_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
||||
Me.Text = $"About {My.Application.Info.AssemblyName}"
|
||||
|
||||
settings.LoadSettings()
|
||||
settings.ToggleSettings(settings.DarkMode, "darkmode")
|
||||
|
||||
LabelProgramName.Text = My.Application.Info.ProductName
|
||||
LabelDescription.Text = "Retrieve Reddit posts that contain the specified keyword
|
||||
from a specified subreddit. "
|
||||
LabelVersion.Text = $"Version {My.Application.Info.Version}"
|
||||
LabelCopyright.Text = My.Application.Info.Copyright
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the LinkClicked event for the LinkLabelLicense control.
|
||||
''' Opens A MessageBox showing the License Notice.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub LinkLabelLicense_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabelLicense.LinkClicked
|
||||
Utilities.LicenseAgreement()
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the LinkClicked event for the LinkLabelReadtheWiki control.
|
||||
''' Opens the Wiki URL in the default browser.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub LinkLabelReadtheWiki_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabelReadtheWiki.LinkClicked
|
||||
Shell("cmd /c start https://github.com/bellingcat/reddit-post-scraping-tool/wiki")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the LinkClicked event for the LinkLabelAboutMe control.
|
||||
''' Opens A MessageBox showing the License Notice.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub LinkLabelAboutMe_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabelAboutMe.LinkClicked
|
||||
Shell("cmd /c start https://about.me/rly0nheart")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the LinkClicked event for the LinkLabelBMC control.
|
||||
''' Opens A MessageBox showing the License Notice.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub LinkLabelBMC_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabelBMC.LinkClicked
|
||||
Shell("cmd /c start https://buymeacoffee.com/_rly0nheart")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the LinkClicked event for the LinkLabelEmail control.
|
||||
''' Opens A MessageBox showing the License Notice.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub LinkLabelEmail_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabelEmail.LinkClicked
|
||||
Shell("cmd /c start mailto:rly0nheart@duck.com")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Handles the Click event for ButtonOK event.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The event data.</param>
|
||||
Private Sub ButtonOK_Click(sender As Object, e As EventArgs) Handles ButtonClose.Click
|
||||
Me.Close()
|
||||
End Sub
|
||||
End Class
|
||||
311
RPST GUI/RPST/Windows/MainWindow.Designer.vb
generated
Normal file
311
RPST GUI/RPST/Windows/MainWindow.Designer.vb
generated
Normal file
@@ -0,0 +1,311 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||
Partial Class MainWindow
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()>
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()>
|
||||
Private Sub InitializeComponent()
|
||||
components = New ComponentModel.Container()
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainWindow))
|
||||
TextBoxKeyword = New TextBox()
|
||||
TextBoxSubreddit = New TextBox()
|
||||
ButtonSearch = New Button()
|
||||
ComboBoxTimeframe = New ComboBox()
|
||||
ComboBoxListing = New ComboBox()
|
||||
LabelKeyword = New Label()
|
||||
LabelSubreddit = New Label()
|
||||
LabelLimit = New Label()
|
||||
LabelListing = New Label()
|
||||
LabelTimeframe = New Label()
|
||||
ContextMenuStripRightClick = New ContextMenuStrip(components)
|
||||
SettingsToolStripMenuItem = New ToolStripMenuItem()
|
||||
DarkModeToolStripMenuItem = New ToolStripMenuItem()
|
||||
SavePostsToolStripMenuItem = New ToolStripMenuItem()
|
||||
ToJSONToolStripMenuItem = New ToolStripMenuItem()
|
||||
ToCSVToolStripMenuItem = New ToolStripMenuItem()
|
||||
AboutToolStripMenuItem = New ToolStripMenuItem()
|
||||
CheckForUpdatesToolStripMenuItem = New ToolStripMenuItem()
|
||||
QuitToolStripMenuItem = New ToolStripMenuItem()
|
||||
NumericUpDownLimit = New NumericUpDown()
|
||||
ToolTip = New ToolTip(components)
|
||||
ContextMenuStripRightClick.SuspendLayout()
|
||||
CType(NumericUpDownLimit, ComponentModel.ISupportInitialize).BeginInit()
|
||||
SuspendLayout()
|
||||
'
|
||||
' TextBoxKeyword
|
||||
'
|
||||
TextBoxKeyword.BackColor = SystemColors.Window
|
||||
TextBoxKeyword.ForeColor = SystemColors.WindowText
|
||||
TextBoxKeyword.Location = New Point(118, 20)
|
||||
TextBoxKeyword.Name = "TextBoxKeyword"
|
||||
TextBoxKeyword.PlaceholderText = "*Keyword"
|
||||
TextBoxKeyword.Size = New Size(100, 23)
|
||||
TextBoxKeyword.TabIndex = 0
|
||||
ToolTip.SetToolTip(TextBoxKeyword, "[required] The keyword to search for.")
|
||||
'
|
||||
' TextBoxSubreddit
|
||||
'
|
||||
TextBoxSubreddit.Location = New Point(118, 49)
|
||||
TextBoxSubreddit.Name = "TextBoxSubreddit"
|
||||
TextBoxSubreddit.PlaceholderText = "*Subreddit"
|
||||
TextBoxSubreddit.Size = New Size(100, 23)
|
||||
TextBoxSubreddit.TabIndex = 4
|
||||
ToolTip.SetToolTip(TextBoxSubreddit, "[required] The subreddit to search in.")
|
||||
'
|
||||
' ButtonSearch
|
||||
'
|
||||
ButtonSearch.Location = New Point(165, 165)
|
||||
ButtonSearch.Name = "ButtonSearch"
|
||||
ButtonSearch.Size = New Size(55, 28)
|
||||
ButtonSearch.TabIndex = 6
|
||||
ButtonSearch.Text = "Search"
|
||||
ToolTip.SetToolTip(ButtonSearch, "Hitting ENTER will also start the scraping process.")
|
||||
ButtonSearch.UseVisualStyleBackColor = True
|
||||
'
|
||||
' ComboBoxTimeframe
|
||||
'
|
||||
ComboBoxTimeframe.AutoCompleteCustomSource.AddRange(New String() {"Hour", "Day", "Week", "Month", "Year"})
|
||||
ComboBoxTimeframe.AutoCompleteSource = AutoCompleteSource.CustomSource
|
||||
ComboBoxTimeframe.FormattingEnabled = True
|
||||
ComboBoxTimeframe.Items.AddRange(New Object() {"Hour", "Day", "Week", "Month", "Year"})
|
||||
ComboBoxTimeframe.Location = New Point(118, 136)
|
||||
ComboBoxTimeframe.Name = "ComboBoxTimeframe"
|
||||
ComboBoxTimeframe.Size = New Size(100, 23)
|
||||
ComboBoxTimeframe.TabIndex = 8
|
||||
ComboBoxTimeframe.Text = "All"
|
||||
ToolTip.SetToolTip(ComboBoxTimeframe, "The time period for the posts. Default value is `All`.")
|
||||
'
|
||||
' ComboBoxListing
|
||||
'
|
||||
ComboBoxListing.AutoCompleteCustomSource.AddRange(New String() {"Controversial", "Hot", "Best", "New", "Rising"})
|
||||
ComboBoxListing.AutoCompleteSource = AutoCompleteSource.CustomSource
|
||||
ComboBoxListing.BackColor = SystemColors.Window
|
||||
ComboBoxListing.FormattingEnabled = True
|
||||
ComboBoxListing.Items.AddRange(New Object() {"Controversial", "Hot", "Best", "New", "Rising"})
|
||||
ComboBoxListing.Location = New Point(118, 107)
|
||||
ComboBoxListing.Name = "ComboBoxListing"
|
||||
ComboBoxListing.Size = New Size(100, 23)
|
||||
ComboBoxListing.TabIndex = 9
|
||||
ComboBoxListing.Text = "Top"
|
||||
ToolTip.SetToolTip(ComboBoxListing, "The type of post listings. Default value is `Top`.")
|
||||
'
|
||||
' LabelKeyword
|
||||
'
|
||||
LabelKeyword.AutoEllipsis = True
|
||||
LabelKeyword.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point)
|
||||
LabelKeyword.ForeColor = Color.Black
|
||||
LabelKeyword.Location = New Point(19, 23)
|
||||
LabelKeyword.Name = "LabelKeyword"
|
||||
LabelKeyword.Size = New Size(71, 20)
|
||||
LabelKeyword.TabIndex = 10
|
||||
LabelKeyword.Text = "Keyword:"
|
||||
'
|
||||
' LabelSubreddit
|
||||
'
|
||||
LabelSubreddit.AutoEllipsis = True
|
||||
LabelSubreddit.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point)
|
||||
LabelSubreddit.ForeColor = Color.Black
|
||||
LabelSubreddit.Location = New Point(19, 51)
|
||||
LabelSubreddit.Name = "LabelSubreddit"
|
||||
LabelSubreddit.Size = New Size(71, 23)
|
||||
LabelSubreddit.TabIndex = 11
|
||||
LabelSubreddit.Text = "Subreddit:"
|
||||
'
|
||||
' LabelLimit
|
||||
'
|
||||
LabelLimit.AutoEllipsis = True
|
||||
LabelLimit.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point)
|
||||
LabelLimit.ForeColor = Color.Black
|
||||
LabelLimit.Location = New Point(19, 80)
|
||||
LabelLimit.Name = "LabelLimit"
|
||||
LabelLimit.Size = New Size(56, 23)
|
||||
LabelLimit.TabIndex = 12
|
||||
LabelLimit.Text = "Limit:"
|
||||
'
|
||||
' LabelListing
|
||||
'
|
||||
LabelListing.AutoEllipsis = True
|
||||
LabelListing.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point)
|
||||
LabelListing.ForeColor = Color.Black
|
||||
LabelListing.Location = New Point(19, 108)
|
||||
LabelListing.Name = "LabelListing"
|
||||
LabelListing.Size = New Size(56, 23)
|
||||
LabelListing.TabIndex = 13
|
||||
LabelListing.Text = "Listing:"
|
||||
'
|
||||
' LabelTimeframe
|
||||
'
|
||||
LabelTimeframe.AutoEllipsis = True
|
||||
LabelTimeframe.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold Or FontStyle.Underline, GraphicsUnit.Point)
|
||||
LabelTimeframe.ForeColor = Color.Black
|
||||
LabelTimeframe.Location = New Point(19, 137)
|
||||
LabelTimeframe.Name = "LabelTimeframe"
|
||||
LabelTimeframe.Size = New Size(81, 23)
|
||||
LabelTimeframe.TabIndex = 14
|
||||
LabelTimeframe.Text = "Timeframe:"
|
||||
'
|
||||
' ContextMenuStripRightClick
|
||||
'
|
||||
ContextMenuStripRightClick.Items.AddRange(New ToolStripItem() {SettingsToolStripMenuItem, AboutToolStripMenuItem, CheckForUpdatesToolStripMenuItem, QuitToolStripMenuItem})
|
||||
ContextMenuStripRightClick.Name = "ContextMenuStrip1"
|
||||
ContextMenuStripRightClick.Size = New Size(172, 92)
|
||||
'
|
||||
' SettingsToolStripMenuItem
|
||||
'
|
||||
SettingsToolStripMenuItem.DropDownItems.AddRange(New ToolStripItem() {DarkModeToolStripMenuItem, SavePostsToolStripMenuItem})
|
||||
SettingsToolStripMenuItem.Image = CType(resources.GetObject("SettingsToolStripMenuItem.Image"), Image)
|
||||
SettingsToolStripMenuItem.Name = "SettingsToolStripMenuItem"
|
||||
SettingsToolStripMenuItem.Size = New Size(171, 22)
|
||||
SettingsToolStripMenuItem.Text = "Settings"
|
||||
'
|
||||
' DarkModeToolStripMenuItem
|
||||
'
|
||||
DarkModeToolStripMenuItem.CheckOnClick = True
|
||||
DarkModeToolStripMenuItem.Image = CType(resources.GetObject("DarkModeToolStripMenuItem.Image"), Image)
|
||||
DarkModeToolStripMenuItem.Name = "DarkModeToolStripMenuItem"
|
||||
DarkModeToolStripMenuItem.Size = New Size(132, 22)
|
||||
DarkModeToolStripMenuItem.Text = "Dark Mode"
|
||||
'
|
||||
' SavePostsToolStripMenuItem
|
||||
'
|
||||
SavePostsToolStripMenuItem.AutoToolTip = True
|
||||
SavePostsToolStripMenuItem.DropDownItems.AddRange(New ToolStripItem() {ToJSONToolStripMenuItem, ToCSVToolStripMenuItem})
|
||||
SavePostsToolStripMenuItem.Image = CType(resources.GetObject("SavePostsToolStripMenuItem.Image"), Image)
|
||||
SavePostsToolStripMenuItem.Name = "SavePostsToolStripMenuItem"
|
||||
SavePostsToolStripMenuItem.Size = New Size(132, 22)
|
||||
SavePostsToolStripMenuItem.Text = "Save posts"
|
||||
'
|
||||
' ToJSONToolStripMenuItem
|
||||
'
|
||||
ToJSONToolStripMenuItem.AutoToolTip = True
|
||||
ToJSONToolStripMenuItem.CheckOnClick = True
|
||||
ToJSONToolStripMenuItem.Image = CType(resources.GetObject("ToJSONToolStripMenuItem.Image"), Image)
|
||||
ToJSONToolStripMenuItem.Name = "ToJSONToolStripMenuItem"
|
||||
ToJSONToolStripMenuItem.Size = New Size(116, 22)
|
||||
ToJSONToolStripMenuItem.Text = "to JSON"
|
||||
'
|
||||
' ToCSVToolStripMenuItem
|
||||
'
|
||||
ToCSVToolStripMenuItem.AutoToolTip = True
|
||||
ToCSVToolStripMenuItem.CheckOnClick = True
|
||||
ToCSVToolStripMenuItem.Image = CType(resources.GetObject("ToCSVToolStripMenuItem.Image"), Image)
|
||||
ToCSVToolStripMenuItem.Name = "ToCSVToolStripMenuItem"
|
||||
ToCSVToolStripMenuItem.Size = New Size(116, 22)
|
||||
ToCSVToolStripMenuItem.Text = "to CSV"
|
||||
'
|
||||
' AboutToolStripMenuItem
|
||||
'
|
||||
AboutToolStripMenuItem.AutoToolTip = True
|
||||
AboutToolStripMenuItem.Image = CType(resources.GetObject("AboutToolStripMenuItem.Image"), Image)
|
||||
AboutToolStripMenuItem.Name = "AboutToolStripMenuItem"
|
||||
AboutToolStripMenuItem.Size = New Size(171, 22)
|
||||
AboutToolStripMenuItem.Text = "About RPST"
|
||||
'
|
||||
' CheckForUpdatesToolStripMenuItem
|
||||
'
|
||||
CheckForUpdatesToolStripMenuItem.AutoToolTip = True
|
||||
CheckForUpdatesToolStripMenuItem.Image = CType(resources.GetObject("CheckForUpdatesToolStripMenuItem.Image"), Image)
|
||||
CheckForUpdatesToolStripMenuItem.Name = "CheckForUpdatesToolStripMenuItem"
|
||||
CheckForUpdatesToolStripMenuItem.Size = New Size(171, 22)
|
||||
CheckForUpdatesToolStripMenuItem.Text = "Check for Updates"
|
||||
'
|
||||
' QuitToolStripMenuItem
|
||||
'
|
||||
QuitToolStripMenuItem.AutoToolTip = True
|
||||
QuitToolStripMenuItem.Font = New Font("Segoe UI Semibold", 9F, FontStyle.Bold, GraphicsUnit.Point)
|
||||
QuitToolStripMenuItem.Image = CType(resources.GetObject("QuitToolStripMenuItem.Image"), Image)
|
||||
QuitToolStripMenuItem.Name = "QuitToolStripMenuItem"
|
||||
QuitToolStripMenuItem.Size = New Size(171, 22)
|
||||
QuitToolStripMenuItem.Text = "Quit"
|
||||
'
|
||||
' NumericUpDownLimit
|
||||
'
|
||||
NumericUpDownLimit.Location = New Point(118, 78)
|
||||
NumericUpDownLimit.Maximum = New Decimal(New Integer() {10000, 0, 0, 0})
|
||||
NumericUpDownLimit.Minimum = New Decimal(New Integer() {200, 0, 0, 0})
|
||||
NumericUpDownLimit.Name = "NumericUpDownLimit"
|
||||
NumericUpDownLimit.ReadOnly = True
|
||||
NumericUpDownLimit.Size = New Size(100, 23)
|
||||
NumericUpDownLimit.TabIndex = 15
|
||||
ToolTip.SetToolTip(NumericUpDownLimit, "Number of posts to go through. Default value is `10`.")
|
||||
NumericUpDownLimit.Value = New Decimal(New Integer() {200, 0, 0, 0})
|
||||
'
|
||||
' ToolTip
|
||||
'
|
||||
ToolTip.AutoPopDelay = 5000
|
||||
ToolTip.BackColor = Color.Gainsboro
|
||||
ToolTip.InitialDelay = 500
|
||||
ToolTip.ReshowDelay = 100
|
||||
ToolTip.ToolTipIcon = ToolTipIcon.Info
|
||||
ToolTip.ToolTipTitle = "Tip"
|
||||
'
|
||||
' MainWindow
|
||||
'
|
||||
AutoScaleDimensions = New SizeF(7F, 15F)
|
||||
AutoScaleMode = AutoScaleMode.Font
|
||||
BackColor = SystemColors.Control
|
||||
ClientSize = New Size(239, 211)
|
||||
ContextMenuStrip = ContextMenuStripRightClick
|
||||
Controls.Add(ComboBoxTimeframe)
|
||||
Controls.Add(TextBoxKeyword)
|
||||
Controls.Add(LabelTimeframe)
|
||||
Controls.Add(LabelKeyword)
|
||||
Controls.Add(ComboBoxListing)
|
||||
Controls.Add(NumericUpDownLimit)
|
||||
Controls.Add(LabelListing)
|
||||
Controls.Add(ButtonSearch)
|
||||
Controls.Add(LabelLimit)
|
||||
Controls.Add(LabelSubreddit)
|
||||
Controls.Add(TextBoxSubreddit)
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle
|
||||
Icon = CType(resources.GetObject("$this.Icon"), Icon)
|
||||
MaximizeBox = False
|
||||
Name = "MainWindow"
|
||||
StartPosition = FormStartPosition.CenterScreen
|
||||
Text = "RPST"
|
||||
ContextMenuStripRightClick.ResumeLayout(False)
|
||||
CType(NumericUpDownLimit, ComponentModel.ISupportInitialize).EndInit()
|
||||
ResumeLayout(False)
|
||||
PerformLayout()
|
||||
End Sub
|
||||
|
||||
Friend WithEvents TextBoxKeyword As TextBox
|
||||
Friend WithEvents TextBoxSubreddit As TextBox
|
||||
Friend WithEvents ButtonSearch As Button
|
||||
Friend WithEvents ComboBoxTimeframe As ComboBox
|
||||
Friend WithEvents ComboBoxListing As ComboBox
|
||||
Friend WithEvents LabelKeyword As Label
|
||||
Friend WithEvents LabelSubreddit As Label
|
||||
Friend WithEvents LabelLimit As Label
|
||||
Friend WithEvents LabelListing As Label
|
||||
Friend WithEvents LabelTimeframe As Label
|
||||
Friend WithEvents ContextMenuStripRightClick As ContextMenuStrip
|
||||
Friend WithEvents SavePostsToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents ToJSONToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents ToCSVToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents NumericUpDownLimit As NumericUpDown
|
||||
Friend WithEvents AboutToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents CheckForUpdatesToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents QuitToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents ToolTip As ToolTip
|
||||
Friend WithEvents SettingsToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents DarkModeToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents SaveFoundPostsToolStripMenuItem As ToolStripMenuItem
|
||||
End Class
|
||||
2475
RPST GUI/RPST/Windows/MainWindow.resx
Normal file
2475
RPST GUI/RPST/Windows/MainWindow.resx
Normal file
File diff suppressed because it is too large
Load Diff
203
RPST GUI/RPST/Windows/MainWindow.vb
Normal file
203
RPST GUI/RPST/Windows/MainWindow.vb
Normal file
@@ -0,0 +1,203 @@
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
Public Class MainWindow
|
||||
ReadOnly settings As New SettingsManager()
|
||||
ReadOnly ApiHandler As New ApiHandler()
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the form load event.
|
||||
''' It loads settings, toggles dark mode if necessary, checks for directories, logs first time launch, and sets the form title.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub MainWindow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
||||
Utilities.PathFinder()
|
||||
|
||||
settings.LoadSettings()
|
||||
settings.ToggleSettings(enabled:=settings.DarkMode, saveTo:="darkmode")
|
||||
settings.ToggleSettings(enabled:=settings.SaveToJson, saveTo:="json")
|
||||
settings.ToggleSettings(enabled:=settings.SaveToCsv, saveTo:="csv")
|
||||
|
||||
Me.Text = My.Application.Info.AssemblyName
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'About' menu item click.
|
||||
''' It shows the 'About' box.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub ToolStripMenuItemAbout_Click(sender As Object, e As EventArgs) Handles AboutToolStripMenuItem.Click
|
||||
AboutBox.Show()
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'Check Updates' menu item click.
|
||||
''' It checks for application updates and provides update information if a newer version is available.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Async Sub ToolStripMenuItemCheckUpdates_Click(sender As Object, e As EventArgs) Handles CheckForUpdatesToolStripMenuItem.Click
|
||||
Dim data As JObject = Await ApiHandler.CheckUpdatesAsync()
|
||||
If data("tag_name").ToString = My.Application.Info.Version.ToString Then
|
||||
MessageBox.Show($"You're running the latest version v{My.Application.Info.Version} of {Me.Text}. Check again soon! :)", $"{Me.Text} v{My.Application.Info.Version}", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
Else
|
||||
Dim confirm As DialogResult = MessageBox.Show($"A new version v{data("tag_name")} of {Me.Text} is available, would you like to get it?
|
||||
|
||||
{data("body")}
|
||||
", $"{Me.Text} v{data("tag_name")}", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||||
If confirm = DialogResult.Yes Then
|
||||
Shell($"cmd /c start {data("html_url")}")
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'Quit' menu item click.
|
||||
''' It asks the user for confirmation and closes the program if the user agrees.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub ToolStripMenuItemQuit_Click(sender As Object, e As EventArgs) Handles QuitToolStripMenuItem.Click
|
||||
Dim result As DialogResult = MessageBox.Show("This will close the program, continue?", "Quit", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||||
If result = DialogResult.Yes Then
|
||||
Me.Close()
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the click event of the ScrapeButton.
|
||||
''' Collects inputs, fetches Reddit posts based on the inputs,
|
||||
''' and processes Reddit posts.
|
||||
''' </summary>
|
||||
''' <param name="sender">The sender of the event.</param>
|
||||
''' <param name="e">The EventArgs instance containing the event data.</param>
|
||||
Private Sub ButtonScrape_Click(sender As Object, e As EventArgs) Handles ButtonSearch.Click
|
||||
settings.LoadSettings()
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the KeyDown event for the TextBoxKeyword.
|
||||
''' Processes Reddit posts when the Enter key is pressed.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
|
||||
Private Sub TextBoxKeyword_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBoxKeyword.KeyDown
|
||||
settings.LoadSettings()
|
||||
|
||||
' Check if the Enter key is pressed
|
||||
If e.KeyCode = Keys.Enter Then
|
||||
' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox
|
||||
e.SuppressKeyPress = True
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the KeyDown event for the TextBoxSubreddit.
|
||||
''' Processes Reddit posts when the Enter key is pressed.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
|
||||
Private Sub TextBoxSubreddit_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBoxSubreddit.KeyDown
|
||||
settings.LoadSettings()
|
||||
|
||||
' Check if the Enter key is pressed
|
||||
If e.KeyCode = Keys.Enter Then
|
||||
' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox
|
||||
e.SuppressKeyPress = True
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the KeyDown event for the NumericUpDownLimit.
|
||||
''' Processes Reddit posts when the Enter key is pressed.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
|
||||
Private Sub NumericUpDownLimit_KeyDown(sender As Object, e As KeyEventArgs) Handles NumericUpDownLimit.KeyDown
|
||||
settings.LoadSettings()
|
||||
|
||||
' Check if the Enter key is pressed
|
||||
If e.KeyCode = Keys.Enter Then
|
||||
' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox
|
||||
e.SuppressKeyPress = True
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the KeyDown event for the ComboBoxListing.
|
||||
''' Processes Reddit posts when the Enter key is pressed.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
|
||||
Private Sub ComboBoxListing_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBoxListing.KeyDown
|
||||
settings.LoadSettings()
|
||||
|
||||
' Check if the Enter key is pressed
|
||||
If e.KeyCode = Keys.Enter Then
|
||||
' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox
|
||||
e.SuppressKeyPress = True
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
''' <summary>
|
||||
''' Handles the KeyDown event for the ComboBoxTimeframe.
|
||||
''' Processes Reddit posts when the Enter key is pressed.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">The <see cref="KeyEventArgs"/> instance containing the event data.</param>
|
||||
Private Sub ComboBoxTimeframe_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBoxTimeframe.KeyDown
|
||||
settings.LoadSettings()
|
||||
|
||||
' Check if the Enter key is pressed
|
||||
If e.KeyCode = Keys.Enter Then
|
||||
' Prevent the beep sound that usually comes with the Enter key in a single-line TextBox
|
||||
e.SuppressKeyPress = True
|
||||
PostsProcessor.ProcessRedditPosts(settings:=settings)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'Dark Mode' checkbox change event.
|
||||
''' It toggles the dark mode of the application based on the checkbox status.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub ToolStripMenuItemDarkMode_CheckedChanged(sender As Object, e As EventArgs) Handles DarkModeToolStripMenuItem.CheckedChanged
|
||||
settings.ToggleSettings(enabled:=DarkModeToolStripMenuItem.Checked, saveTo:="darkmode")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'to CSV' checkbox change event.
|
||||
''' It toggles the dark mode of the application based on the checkbox status.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub ToCSVToolStripMenuItem_CheckedChanged(sender As Object, e As EventArgs) Handles ToCSVToolStripMenuItem.CheckedChanged
|
||||
settings.ToggleSettings(enabled:=ToCSVToolStripMenuItem.Checked, saveTo:="csv")
|
||||
End Sub
|
||||
|
||||
''' <summary>
|
||||
''' Event handler for the 'to JSON' checkbox change event.
|
||||
''' It toggles the dark mode of the application based on the checkbox status.
|
||||
''' </summary>
|
||||
''' <param name="sender">The source of the event.</param>
|
||||
''' <param name="e">An EventArgs that contains the event data.</param>
|
||||
Private Sub ToJSONToolStripMenuItem_CheckedChanged(sender As Object, e As EventArgs) Handles ToJSONToolStripMenuItem.CheckedChanged
|
||||
settings.ToggleSettings(enabled:=ToJSONToolStripMenuItem.Checked, saveTo:="json")
|
||||
End Sub
|
||||
End Class
|
||||
203
RPST GUI/RPST/Windows/PostsWindow.Designer.vb
generated
Normal file
203
RPST GUI/RPST/Windows/PostsWindow.Designer.vb
generated
Normal file
@@ -0,0 +1,203 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||
Partial Class PostsWindow
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()>
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()>
|
||||
Private Sub InitializeComponent()
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(PostsWindow))
|
||||
DataGridViewPosts = New DataGridView()
|
||||
postIndex = New DataGridViewTextBoxColumn()
|
||||
postAuthor = New DataGridViewTextBoxColumn()
|
||||
postId = New DataGridViewTextBoxColumn()
|
||||
postTitle = New DataGridViewTextBoxColumn()
|
||||
postText = New DataGridViewTextBoxColumn()
|
||||
postSubreddit = New DataGridViewTextBoxColumn()
|
||||
postSubredditType = New DataGridViewTextBoxColumn()
|
||||
postThumbnail = New DataGridViewTextBoxColumn()
|
||||
postIsNSFW = New DataGridViewTextBoxColumn()
|
||||
postIsGilded = New DataGridViewTextBoxColumn()
|
||||
postUpvotes = New DataGridViewTextBoxColumn()
|
||||
postUpvoteRatio = New DataGridViewTextBoxColumn()
|
||||
postIsShareable = New DataGridViewTextBoxColumn()
|
||||
postScore = New DataGridViewTextBoxColumn()
|
||||
postCategory = New DataGridViewTextBoxColumn()
|
||||
postDomain = New DataGridViewTextBoxColumn()
|
||||
postPermalink = New DataGridViewTextBoxColumn()
|
||||
postCreatedAt = New DataGridViewTextBoxColumn()
|
||||
CType(DataGridViewPosts, ComponentModel.ISupportInitialize).BeginInit()
|
||||
SuspendLayout()
|
||||
'
|
||||
' DataGridViewPosts
|
||||
'
|
||||
DataGridViewPosts.BackgroundColor = Color.Gainsboro
|
||||
DataGridViewPosts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize
|
||||
DataGridViewPosts.Columns.AddRange(New DataGridViewColumn() {postIndex, postAuthor, postId, postTitle, postText, postSubreddit, postSubredditType, postThumbnail, postIsNSFW, postIsGilded, postUpvotes, postUpvoteRatio, postIsShareable, postScore, postCategory, postDomain, postPermalink, postCreatedAt})
|
||||
DataGridViewPosts.Dock = DockStyle.Fill
|
||||
DataGridViewPosts.Location = New Point(0, 0)
|
||||
DataGridViewPosts.Name = "DataGridViewPosts"
|
||||
DataGridViewPosts.ReadOnly = True
|
||||
DataGridViewPosts.RowHeadersVisible = False
|
||||
DataGridViewPosts.RowTemplate.Height = 25
|
||||
DataGridViewPosts.Size = New Size(501, 365)
|
||||
DataGridViewPosts.TabIndex = 3
|
||||
'
|
||||
' postIndex
|
||||
'
|
||||
postIndex.HeaderText = "Index"
|
||||
postIndex.Name = "postIndex"
|
||||
postIndex.ReadOnly = True
|
||||
'
|
||||
' postAuthor
|
||||
'
|
||||
postAuthor.HeaderText = "Author"
|
||||
postAuthor.Name = "postAuthor"
|
||||
postAuthor.ReadOnly = True
|
||||
'
|
||||
' postId
|
||||
'
|
||||
postId.HeaderText = "ID"
|
||||
postId.Name = "postId"
|
||||
postId.ReadOnly = True
|
||||
'
|
||||
' postTitle
|
||||
'
|
||||
postTitle.HeaderText = "Title"
|
||||
postTitle.Name = "postTitle"
|
||||
postTitle.ReadOnly = True
|
||||
'
|
||||
' postText
|
||||
'
|
||||
postText.HeaderText = "Text"
|
||||
postText.Name = "postText"
|
||||
postText.ReadOnly = True
|
||||
'
|
||||
' postSubreddit
|
||||
'
|
||||
postSubreddit.HeaderText = "Subreddit"
|
||||
postSubreddit.Name = "postSubreddit"
|
||||
postSubreddit.ReadOnly = True
|
||||
'
|
||||
' postSubredditType
|
||||
'
|
||||
postSubredditType.HeaderText = "Subreddit Type"
|
||||
postSubredditType.Name = "postSubredditType"
|
||||
postSubredditType.ReadOnly = True
|
||||
'
|
||||
' postThumbnail
|
||||
'
|
||||
postThumbnail.HeaderText = "Thumbnail"
|
||||
postThumbnail.Name = "postThumbnail"
|
||||
postThumbnail.ReadOnly = True
|
||||
'
|
||||
' postIsNSFW
|
||||
'
|
||||
postIsNSFW.HeaderText = "Is NSFW"
|
||||
postIsNSFW.Name = "postIsNSFW"
|
||||
postIsNSFW.ReadOnly = True
|
||||
'
|
||||
' postIsGilded
|
||||
'
|
||||
postIsGilded.HeaderText = "Is Gilded"
|
||||
postIsGilded.Name = "postIsGilded"
|
||||
postIsGilded.ReadOnly = True
|
||||
'
|
||||
' postUpvotes
|
||||
'
|
||||
postUpvotes.HeaderText = "Upvotes"
|
||||
postUpvotes.Name = "postUpvotes"
|
||||
postUpvotes.ReadOnly = True
|
||||
'
|
||||
' postUpvoteRatio
|
||||
'
|
||||
postUpvoteRatio.HeaderText = "Upvote Ratio"
|
||||
postUpvoteRatio.Name = "postUpvoteRatio"
|
||||
postUpvoteRatio.ReadOnly = True
|
||||
'
|
||||
' postIsShareable
|
||||
'
|
||||
postIsShareable.HeaderText = "Is Shareable"
|
||||
postIsShareable.Name = "postIsShareable"
|
||||
postIsShareable.ReadOnly = True
|
||||
'
|
||||
' postScore
|
||||
'
|
||||
postScore.HeaderText = "Score"
|
||||
postScore.Name = "postScore"
|
||||
postScore.ReadOnly = True
|
||||
'
|
||||
' postCategory
|
||||
'
|
||||
postCategory.HeaderText = "Category"
|
||||
postCategory.Name = "postCategory"
|
||||
postCategory.ReadOnly = True
|
||||
'
|
||||
' postDomain
|
||||
'
|
||||
postDomain.HeaderText = "Domain"
|
||||
postDomain.Name = "postDomain"
|
||||
postDomain.ReadOnly = True
|
||||
'
|
||||
' postPermalink
|
||||
'
|
||||
postPermalink.HeaderText = "Permalink"
|
||||
postPermalink.Name = "postPermalink"
|
||||
postPermalink.ReadOnly = True
|
||||
'
|
||||
' postCreatedAt
|
||||
'
|
||||
postCreatedAt.HeaderText = "Created At"
|
||||
postCreatedAt.Name = "postCreatedAt"
|
||||
postCreatedAt.ReadOnly = True
|
||||
'
|
||||
' PostsWindow
|
||||
'
|
||||
AutoScaleDimensions = New SizeF(7F, 15F)
|
||||
AutoScaleMode = AutoScaleMode.Font
|
||||
ClientSize = New Size(501, 365)
|
||||
Controls.Add(DataGridViewPosts)
|
||||
Icon = CType(resources.GetObject("$this.Icon"), Icon)
|
||||
Name = "PostsWindow"
|
||||
StartPosition = FormStartPosition.CenterScreen
|
||||
Text = "Posts"
|
||||
CType(DataGridViewPosts, ComponentModel.ISupportInitialize).EndInit()
|
||||
ResumeLayout(False)
|
||||
End Sub
|
||||
|
||||
Friend WithEvents DataGridViewPosts As DataGridView
|
||||
Friend WithEvents postIndex As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postAuthor As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postId As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postTitle As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postText As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postSubreddit As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postSubredditType As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postThumbnail As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postIsNSFW As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postIsGilded As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postUpvotes As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postUpvoteRatio As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postIsShareable As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postScore As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postCategory As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postDomain As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postPermalink As DataGridViewTextBoxColumn
|
||||
Friend WithEvents postCreatedAt As DataGridViewTextBoxColumn
|
||||
End Class
|
||||
622
RPST GUI/RPST/Windows/PostsWindow.resx
Normal file
622
RPST GUI/RPST/Windows/PostsWindow.resx
Normal file
@@ -0,0 +1,622 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="postIndex.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postAuthor.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postTitle.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postText.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postSubreddit.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postSubredditType.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postThumbnail.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postIsNSFW.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postIsGilded.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postUpvotes.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postUpvoteRatio.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postIsShareable.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postScore.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postCategory.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postDomain.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postPermalink.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<metadata name="postCreatedAt.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
8DXKzC//H2KEQtrPXsHrAAAAAElFTkSuQmCC
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
3
RPST GUI/RPST/Windows/PostsWindow.vb
Normal file
3
RPST GUI/RPST/Windows/PostsWindow.vb
Normal file
@@ -0,0 +1,3 @@
|
||||
Public Class PostsWindow
|
||||
|
||||
End Class
|
||||
792
RPST GUI/RPSTSetup/RPSTSetup.vdproj
Normal file
792
RPST GUI/RPSTSetup/RPSTSetup.vdproj
Normal file
@@ -0,0 +1,792 @@
|
||||
"DeployProject"
|
||||
{
|
||||
"VSVersion" = "3:800"
|
||||
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
|
||||
"IsWebType" = "8:FALSE"
|
||||
"ProjectName" = "8:RPSTSetup"
|
||||
"LanguageId" = "3:0"
|
||||
"CodePage" = "3:1252"
|
||||
"UILanguageId" = "3:0"
|
||||
"SccProjectName" = "8:"
|
||||
"SccLocalPath" = "8:"
|
||||
"SccAuxPath" = "8:"
|
||||
"SccProvider" = "8:"
|
||||
"Hierarchy"
|
||||
{
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_3E2A5BCE69FF40C19B380CE7DE18F582"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_68E75ECCCEB74C9DAEE029419E7ACA2B"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_76F301ADC81F41699FE5F6EFEFECAA11"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
}
|
||||
"Configurations"
|
||||
{
|
||||
"Debug"
|
||||
{
|
||||
"DisplayName" = "8:Debug"
|
||||
"IsDebugOnly" = "11:TRUE"
|
||||
"IsReleaseOnly" = "11:FALSE"
|
||||
"OutputFilename" = "8:Debug\\RPSTSetup.msi"
|
||||
"PackageFilesAs" = "3:2"
|
||||
"PackageFileSize" = "3:-2147483648"
|
||||
"CabType" = "3:1"
|
||||
"Compression" = "3:2"
|
||||
"SignOutput" = "11:FALSE"
|
||||
"CertificateFile" = "8:"
|
||||
"PrivateKeyFile" = "8:"
|
||||
"TimeStampServer" = "8:"
|
||||
"InstallerBootstrapper" = "3:2"
|
||||
"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
|
||||
{
|
||||
"Enabled" = "11:TRUE"
|
||||
"PromptEnabled" = "11:TRUE"
|
||||
"PrerequisitesLocation" = "2:1"
|
||||
"Url" = "8:"
|
||||
"ComponentsUrl" = "8:"
|
||||
"Items"
|
||||
{
|
||||
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.CoreRuntime.6.0.x64"
|
||||
{
|
||||
"Name" = "8:.NET Runtime 6.0.25 (x64)"
|
||||
"ProductCode" = "8:Microsoft.NetCore.CoreRuntime.6.0.x64"
|
||||
}
|
||||
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.NetCore.CoreRuntime.6.0.x86"
|
||||
{
|
||||
"Name" = "8:.NET Runtime 6.0.25 (x86)"
|
||||
"ProductCode" = "8:Microsoft.NetCore.CoreRuntime.6.0.x86"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"Release"
|
||||
{
|
||||
"DisplayName" = "8:Release"
|
||||
"IsDebugOnly" = "11:FALSE"
|
||||
"IsReleaseOnly" = "11:TRUE"
|
||||
"OutputFilename" = "8:Release\\RPSTSetup.msi"
|
||||
"PackageFilesAs" = "3:2"
|
||||
"PackageFileSize" = "3:-2147483648"
|
||||
"CabType" = "3:1"
|
||||
"Compression" = "3:2"
|
||||
"SignOutput" = "11:FALSE"
|
||||
"CertificateFile" = "8:"
|
||||
"PrivateKeyFile" = "8:"
|
||||
"TimeStampServer" = "8:"
|
||||
"InstallerBootstrapper" = "3:2"
|
||||
}
|
||||
}
|
||||
"Deployable"
|
||||
{
|
||||
"CustomAction"
|
||||
{
|
||||
}
|
||||
"DefaultFeature"
|
||||
{
|
||||
"Name" = "8:DefaultFeature"
|
||||
"Title" = "8:"
|
||||
"Description" = "8:"
|
||||
}
|
||||
"ExternalPersistence"
|
||||
{
|
||||
"LaunchCondition"
|
||||
{
|
||||
"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_17213E668C074AD5AD5FC8E06206E69E"
|
||||
{
|
||||
"Name" = "8:.NET Core"
|
||||
"Message" = "8:[VSDNETCOREMSG]"
|
||||
"AllowLaterVersions" = "11:FALSE"
|
||||
"InstallUrl" = "8:https://dotnet.microsoft.com/download/dotnet-core/[NetCoreVerMajorDotMinor]"
|
||||
"IsNETCore" = "11:TRUE"
|
||||
"Architecture" = "2:0"
|
||||
"Runtime" = "2:0"
|
||||
}
|
||||
}
|
||||
}
|
||||
"File"
|
||||
{
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3E2A5BCE69FF40C19B380CE7DE18F582"
|
||||
{
|
||||
"SourcePath" = "8:..\\RPST\\Resources\\icon-small.ico"
|
||||
"TargetName" = "8:icon-small.ico"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:TRUE"
|
||||
"Hidden" = "11:TRUE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_76F301ADC81F41699FE5F6EFEFECAA11"
|
||||
{
|
||||
"SourcePath" = "8:..\\RPST\\LICENSE.rtf"
|
||||
"TargetName" = "8:LICENSE.rtf"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:TRUE"
|
||||
"Hidden" = "11:TRUE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
}
|
||||
"FileType"
|
||||
{
|
||||
}
|
||||
"Folder"
|
||||
{
|
||||
"{1525181F-901A-416C-8A58-119130FE478E}:_14AD380FC0AA495FB87400E478966DD2"
|
||||
{
|
||||
"Name" = "8:#1919"
|
||||
"AlwaysCreate" = "11:TRUE"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Property" = "8:ProgramMenuFolder"
|
||||
"Folders"
|
||||
{
|
||||
}
|
||||
}
|
||||
"{3C67513D-01DD-4637-8A68-80971EB9504F}:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
{
|
||||
"DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
|
||||
"Name" = "8:#1925"
|
||||
"AlwaysCreate" = "11:FALSE"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Property" = "8:TARGETDIR"
|
||||
"Folders"
|
||||
{
|
||||
}
|
||||
}
|
||||
"{1525181F-901A-416C-8A58-119130FE478E}:_BD020B7E2C9F475083F2EE7493C6CA56"
|
||||
{
|
||||
"Name" = "8:#1916"
|
||||
"AlwaysCreate" = "11:TRUE"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Property" = "8:DesktopFolder"
|
||||
"Folders"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"LaunchCondition"
|
||||
{
|
||||
}
|
||||
"Locator"
|
||||
{
|
||||
}
|
||||
"MsiBootstrapper"
|
||||
{
|
||||
"LangId" = "3:0"
|
||||
"RequiresElevation" = "11:FALSE"
|
||||
}
|
||||
"Product"
|
||||
{
|
||||
"Name" = "8:Microsoft Visual Studio"
|
||||
"ProductName" = "8:RPST (Reddit Post Scraping Tool)"
|
||||
"ProductCode" = "8:{76E86D3A-14D8-426B-ADB6-C22C3D444E49}"
|
||||
"PackageCode" = "8:{D33BBB6A-B9C1-4596-A299-931B9FEE6921}"
|
||||
"UpgradeCode" = "8:{05EF97C6-762C-4254-94FF-53380A799007}"
|
||||
"AspNetVersion" = "8:4.0.30319.0"
|
||||
"RestartWWWService" = "11:FALSE"
|
||||
"RemovePreviousVersions" = "11:TRUE"
|
||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||
"InstallAllUsers" = "11:FALSE"
|
||||
"ProductVersion" = "8:2.0.0"
|
||||
"Manufacturer" = "8:Richard Mwewa"
|
||||
"ARPHELPTELEPHONE" = "8:"
|
||||
"ARPHELPLINK" = "8:https://github.com/bellingcat/reddit-post-scraping-tool/wiki"
|
||||
"Title" = "8:RPST (Reddit Post Scraping Tool)"
|
||||
"Subject" = "8:"
|
||||
"ARPCONTACT" = "8:Richard Mwewa"
|
||||
"Keywords" = "8:"
|
||||
"ARPCOMMENTS" = "8:Retrieve Reddit posts that contain the specified keyword from a specified subreddit."
|
||||
"ARPURLINFOABOUT" = "8:https://about.me/rly0nheart"
|
||||
"ARPPRODUCTICON" = "8:_3E2A5BCE69FF40C19B380CE7DE18F582"
|
||||
"ARPIconIndex" = "3:0"
|
||||
"SearchPath" = "8:"
|
||||
"UseSystemSearchPath" = "11:TRUE"
|
||||
"TargetPlatform" = "3:0"
|
||||
"PreBuildEvent" = "8:"
|
||||
"PostBuildEvent" = "8:"
|
||||
"RunPostBuildEvent" = "3:0"
|
||||
}
|
||||
"Registry"
|
||||
{
|
||||
"HKLM"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_49885B940CB4489B9981836DE0A26E07"
|
||||
{
|
||||
"Name" = "8:Software"
|
||||
"Condition" = "8:"
|
||||
"AlwaysCreate" = "11:FALSE"
|
||||
"DeleteAtUninstall" = "11:FALSE"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Keys"
|
||||
{
|
||||
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E3E857007AC8478B9D0C9C009F6A8BAF"
|
||||
{
|
||||
"Name" = "8:[Manufacturer]"
|
||||
"Condition" = "8:"
|
||||
"AlwaysCreate" = "11:FALSE"
|
||||
"DeleteAtUninstall" = "11:FALSE"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Keys"
|
||||
{
|
||||
}
|
||||
"Values"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"Values"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"HKCU"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_17B8420A2F55464D8FD66D76E90FE530"
|
||||
{
|
||||
"Name" = "8:Software"
|
||||
"Condition" = "8:"
|
||||
"AlwaysCreate" = "11:FALSE"
|
||||
"DeleteAtUninstall" = "11:FALSE"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Keys"
|
||||
{
|
||||
"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_247BBD924EA946C0B4F05A907A48C9D5"
|
||||
{
|
||||
"Name" = "8:[Manufacturer]"
|
||||
"Condition" = "8:"
|
||||
"AlwaysCreate" = "11:FALSE"
|
||||
"DeleteAtUninstall" = "11:FALSE"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Keys"
|
||||
{
|
||||
}
|
||||
"Values"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"Values"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"HKCR"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
}
|
||||
}
|
||||
"HKU"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
}
|
||||
}
|
||||
"HKPU"
|
||||
{
|
||||
"Keys"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
"Sequences"
|
||||
{
|
||||
}
|
||||
"Shortcut"
|
||||
{
|
||||
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_03274DE5011840E682E398A86F5A065D"
|
||||
{
|
||||
"Name" = "8:RPST (Reddit Post Scraping Tool)"
|
||||
"Arguments" = "8:"
|
||||
"Description" = "8:Retrieve Reddit posts that contain the specified keyword from a specified subreddit."
|
||||
"ShowCmd" = "3:1"
|
||||
"IconIndex" = "3:0"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Target" = "8:_68E75ECCCEB74C9DAEE029419E7ACA2B"
|
||||
"Folder" = "8:_14AD380FC0AA495FB87400E478966DD2"
|
||||
"WorkingFolder" = "8:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
"Icon" = "8:_3E2A5BCE69FF40C19B380CE7DE18F582"
|
||||
"Feature" = "8:"
|
||||
}
|
||||
"{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_6C793AC49B71464FA40CB4D6C361BD84"
|
||||
{
|
||||
"Name" = "8:RPST (Reddit Post Scraping Tool)"
|
||||
"Arguments" = "8:"
|
||||
"Description" = "8:Retrieve Reddit posts that contain the specified keyword from a specified subreddit."
|
||||
"ShowCmd" = "3:1"
|
||||
"IconIndex" = "3:0"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Target" = "8:_68E75ECCCEB74C9DAEE029419E7ACA2B"
|
||||
"Folder" = "8:_BD020B7E2C9F475083F2EE7493C6CA56"
|
||||
"WorkingFolder" = "8:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
"Icon" = "8:_3E2A5BCE69FF40C19B380CE7DE18F582"
|
||||
"Feature" = "8:"
|
||||
}
|
||||
}
|
||||
"UserInterface"
|
||||
{
|
||||
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_260F17414CD94855B1C4E94459527B0E"
|
||||
{
|
||||
"UseDynamicProperties" = "11:FALSE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2E6A77A8635449DCAA91FDB47AD57928"
|
||||
{
|
||||
"Name" = "8:#1900"
|
||||
"Sequence" = "3:2"
|
||||
"Attributes" = "3:1"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_318D351DD1CD404E8A4BD093773AE2F5"
|
||||
{
|
||||
"Sequence" = "3:100"
|
||||
"DisplayName" = "8:License Agreement"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminLicenseDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"EulaText"
|
||||
{
|
||||
"Name" = "8:EulaText"
|
||||
"DisplayName" = "8:#1008"
|
||||
"Description" = "8:#1108"
|
||||
"Type" = "3:6"
|
||||
"ContextData" = "8:"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:2"
|
||||
"Value" = "8:_76F301ADC81F41699FE5F6EFEFECAA11"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"Sunken"
|
||||
{
|
||||
"Name" = "8:Sunken"
|
||||
"DisplayName" = "8:#1007"
|
||||
"Description" = "8:#1107"
|
||||
"Type" = "3:5"
|
||||
"ContextData" = "8:4;True=4;False=0"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:0"
|
||||
"Value" = "3:4"
|
||||
"DefaultValue" = "3:4"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5F8575AA5ECB4174B1C60F9DBFBC9855"
|
||||
{
|
||||
"Sequence" = "3:200"
|
||||
"DisplayName" = "8:Installation Folder"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7D142C585EE6498DA19A25EEBEDACFF6"
|
||||
{
|
||||
"Sequence" = "3:300"
|
||||
"DisplayName" = "8:Confirm Installation"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_521CEA4C4D36467CAF5E9B792033EB4B"
|
||||
{
|
||||
"Name" = "8:#1901"
|
||||
"Sequence" = "3:2"
|
||||
"Attributes" = "3:2"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_80EEC0D3EB6146438998401A4D904E1A"
|
||||
{
|
||||
"Sequence" = "3:100"
|
||||
"DisplayName" = "8:Progress"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"ShowProgress"
|
||||
{
|
||||
"Name" = "8:ShowProgress"
|
||||
"DisplayName" = "8:#1009"
|
||||
"Description" = "8:#1109"
|
||||
"Type" = "3:5"
|
||||
"ContextData" = "8:1;True=1;False=0"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:0"
|
||||
"Value" = "3:1"
|
||||
"DefaultValue" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_5EFCFC798BF24EB68DC201E4505F8489"
|
||||
{
|
||||
"UseDynamicProperties" = "11:FALSE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_6BFF4405824D471EA651E90715AAACDF"
|
||||
{
|
||||
"Name" = "8:#1901"
|
||||
"Sequence" = "3:1"
|
||||
"Attributes" = "3:2"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D34EDE0B30824A01B0B266B6079C8469"
|
||||
{
|
||||
"Sequence" = "3:100"
|
||||
"DisplayName" = "8:Progress"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"ShowProgress"
|
||||
{
|
||||
"Name" = "8:ShowProgress"
|
||||
"DisplayName" = "8:#1009"
|
||||
"Description" = "8:#1109"
|
||||
"Type" = "3:5"
|
||||
"ContextData" = "8:1;True=1;False=0"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:0"
|
||||
"Value" = "3:1"
|
||||
"DefaultValue" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_D30397AD6E1547799AC7430D693FA0FC"
|
||||
{
|
||||
"Name" = "8:#1902"
|
||||
"Sequence" = "3:1"
|
||||
"Attributes" = "3:3"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_71B305AEDF384563B2D30069B0F145DF"
|
||||
{
|
||||
"Sequence" = "3:100"
|
||||
"DisplayName" = "8:Finished"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"UpdateText"
|
||||
{
|
||||
"Name" = "8:UpdateText"
|
||||
"DisplayName" = "8:#1058"
|
||||
"Description" = "8:#1158"
|
||||
"Type" = "3:15"
|
||||
"ContextData" = "8:"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:1"
|
||||
"Value" = "8:#1258"
|
||||
"DefaultValue" = "8:#1258"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_EBE4314B289A4ECEB75F0B5D00905DB4"
|
||||
{
|
||||
"Name" = "8:#1900"
|
||||
"Sequence" = "3:1"
|
||||
"Attributes" = "3:1"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5A069E8C7FE74313BA59FE93ED3B017D"
|
||||
{
|
||||
"Sequence" = "3:200"
|
||||
"DisplayName" = "8:License Agreement"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdLicenseDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"EulaText"
|
||||
{
|
||||
"Name" = "8:EulaText"
|
||||
"DisplayName" = "8:#1008"
|
||||
"Description" = "8:#1108"
|
||||
"Type" = "3:6"
|
||||
"ContextData" = "8:"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:2"
|
||||
"Value" = "8:_76F301ADC81F41699FE5F6EFEFECAA11"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"Sunken"
|
||||
{
|
||||
"Name" = "8:Sunken"
|
||||
"DisplayName" = "8:#1007"
|
||||
"Description" = "8:#1107"
|
||||
"Type" = "3:5"
|
||||
"ContextData" = "8:4;True=4;False=0"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:0"
|
||||
"Value" = "3:4"
|
||||
"DefaultValue" = "3:4"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_69D777B0C6974DD0AFA54BDF51755C81"
|
||||
{
|
||||
"Sequence" = "3:400"
|
||||
"DisplayName" = "8:Confirm Installation"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7A7EE4F003334B01BE835D840DF961DF"
|
||||
{
|
||||
"Sequence" = "3:300"
|
||||
"DisplayName" = "8:Installation Folder"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
"InstallAllUsersVisible"
|
||||
{
|
||||
"Name" = "8:InstallAllUsersVisible"
|
||||
"DisplayName" = "8:#1059"
|
||||
"Description" = "8:#1159"
|
||||
"Type" = "3:5"
|
||||
"ContextData" = "8:1;True=1;False=0"
|
||||
"Attributes" = "3:0"
|
||||
"Setting" = "3:0"
|
||||
"Value" = "3:1"
|
||||
"DefaultValue" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_FE23A7B7220447F981819CF713DF20E5"
|
||||
{
|
||||
"Name" = "8:#1902"
|
||||
"Sequence" = "3:2"
|
||||
"Attributes" = "3:3"
|
||||
"Dialogs"
|
||||
{
|
||||
"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_54098FCDE6914AEE8AA27CDB24E77DAF"
|
||||
{
|
||||
"Sequence" = "3:100"
|
||||
"DisplayName" = "8:Finished"
|
||||
"UseDynamicProperties" = "11:TRUE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
|
||||
"Properties"
|
||||
{
|
||||
"BannerBitmap"
|
||||
{
|
||||
"Name" = "8:BannerBitmap"
|
||||
"DisplayName" = "8:#1001"
|
||||
"Description" = "8:#1101"
|
||||
"Type" = "3:8"
|
||||
"ContextData" = "8:Bitmap"
|
||||
"Attributes" = "3:4"
|
||||
"Setting" = "3:1"
|
||||
"UsePlugInResources" = "11:TRUE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"MergeModule"
|
||||
{
|
||||
}
|
||||
"ProjectOutput"
|
||||
{
|
||||
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_68E75ECCCEB74C9DAEE029419E7ACA2B"
|
||||
{
|
||||
"SourcePath" = "8:..\\RPST\\obj\\Debug\\net6.0-windows\\apphost.exe"
|
||||
"TargetName" = "8:"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_362735941ABB4269A087A0EAC1F3EB41"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:TRUE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
"ProjectOutputGroupRegister" = "3:1"
|
||||
"OutputConfiguration" = "8:"
|
||||
"OutputGroupCanonicalName" = "8:PublishItems"
|
||||
"OutputProjectGuid" = "8:{46C2541E-6F65-461A-A479-F65D445C36EA}"
|
||||
"ShowKeyOutput" = "11:TRUE"
|
||||
"ExcludeFilters"
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
Imports System.IO
|
||||
Imports System.Net.Http
|
||||
Imports Newtonsoft.Json
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
Public Class ApiHandler
|
||||
'Public currentDateTime As DateTime = DateTime.Now
|
||||
'ReadOnly formattedDateTime As String = String.Format("{0:yyyy_MM_dd_HH_mm}", currentDateTime)
|
||||
Public logfile As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RedditPostScrapingTool", "logs", $"debug.log")
|
||||
Public headers As String = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
|
||||
Public UpdatesEndpoint As String = "https://api.github.com/repos/rly0nheart/reddit-post-scraping-tool/releases/latest"
|
||||
|
||||
Public Function ScrapeReddit(subreddit, listing, limit, timeframe) As JObject
|
||||
Dim ApiEndpoint As String = $"https://reddit.com/r/{subreddit}/{listing}.json?limit={limit}&t={timeframe}').json()"
|
||||
Try
|
||||
Dim httpClient As New HttpClient()
|
||||
httpClient.DefaultRequestHeaders.Add("User-Agent", headers)
|
||||
Dim response As HttpResponseMessage = httpClient.GetAsync(ApiEndpoint).Result
|
||||
If response.IsSuccessStatusCode Then
|
||||
Dim json As String = response.Content.ReadAsStringAsync().Result
|
||||
Dim data As JObject = JsonConvert.DeserializeObject(Of JObject)(json)
|
||||
Return data
|
||||
Else
|
||||
' handle the case when the response status is not successful
|
||||
' return an empty JObject or throw an exception
|
||||
Return New JObject()
|
||||
MessageBox.Show(response.ReasonPhrase, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End If
|
||||
Catch ex As Exception
|
||||
' handle the exception
|
||||
' return an empty JObject or throw an exception
|
||||
Return New JObject()
|
||||
My.Computer.FileSystem.WriteAllText(logfile, $"{DateTime.Now}: {ex}{Environment.NewLine}", True)
|
||||
MessageBox.Show($"{ex.Message}. Please see the debug log '{logfile}' for more information.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End Try
|
||||
Return New JObject()
|
||||
End Function
|
||||
|
||||
|
||||
' Get remote version information from the repository release page
|
||||
Public Function CheckUpdates() As JObject
|
||||
Try
|
||||
Dim httpClient As New HttpClient()
|
||||
httpClient.DefaultRequestHeaders.Add("User-Agent", headers)
|
||||
Dim response As HttpResponseMessage = httpClient.GetAsync(UpdatesEndpoint).Result
|
||||
If response.IsSuccessStatusCode Then
|
||||
Dim json As String = response.Content.ReadAsStringAsync().Result
|
||||
Dim data As JObject = JsonConvert.DeserializeObject(Of JObject)(json)
|
||||
Return data
|
||||
Else
|
||||
'Return New JObject()
|
||||
MessageBox.Show(response.ReasonPhrase, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End If
|
||||
Catch ex As Exception
|
||||
'Return New JObject()
|
||||
My.Computer.FileSystem.WriteAllText(logfile, $"{DateTime.Now}: {ex}{Environment.NewLine}", True)
|
||||
MessageBox.Show($"{ex.Message}. Please see the debug log '{logfile}' for more information.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
|
||||
End Try
|
||||
Return New JObject()
|
||||
End Function
|
||||
End Class
|
||||
@@ -1,86 +0,0 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||
Partial Class DeveloperForm
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()>
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()>
|
||||
Private Sub InitializeComponent()
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DeveloperForm))
|
||||
Me.AboutMeLinkLabel = New System.Windows.Forms.LinkLabel()
|
||||
Me.BuyMeACoffeeLinkLabel = New System.Windows.Forms.LinkLabel()
|
||||
Me.GreetingLabel = New System.Windows.Forms.Label()
|
||||
Me.SuspendLayout()
|
||||
'
|
||||
'AboutMeLinkLabel
|
||||
'
|
||||
Me.AboutMeLinkLabel.AutoSize = True
|
||||
Me.AboutMeLinkLabel.BackColor = System.Drawing.Color.White
|
||||
Me.AboutMeLinkLabel.Location = New System.Drawing.Point(33, 426)
|
||||
Me.AboutMeLinkLabel.Name = "AboutMeLinkLabel"
|
||||
Me.AboutMeLinkLabel.Size = New System.Drawing.Size(60, 15)
|
||||
Me.AboutMeLinkLabel.TabIndex = 0
|
||||
Me.AboutMeLinkLabel.TabStop = True
|
||||
Me.AboutMeLinkLabel.Text = "About.me"
|
||||
'
|
||||
'BuyMeACoffeeLinkLabel
|
||||
'
|
||||
Me.BuyMeACoffeeLinkLabel.AutoSize = True
|
||||
Me.BuyMeACoffeeLinkLabel.Location = New System.Drawing.Point(33, 451)
|
||||
Me.BuyMeACoffeeLinkLabel.Name = "BuyMeACoffeeLinkLabel"
|
||||
Me.BuyMeACoffeeLinkLabel.Size = New System.Drawing.Size(96, 15)
|
||||
Me.BuyMeACoffeeLinkLabel.TabIndex = 1
|
||||
Me.BuyMeACoffeeLinkLabel.TabStop = True
|
||||
Me.BuyMeACoffeeLinkLabel.Text = "Buy Me A Coffee"
|
||||
'
|
||||
'GreetingLabel
|
||||
'
|
||||
Me.GreetingLabel.AutoSize = True
|
||||
Me.GreetingLabel.Font = New System.Drawing.Font("Verdana", 27.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point)
|
||||
Me.GreetingLabel.Location = New System.Drawing.Point(62, 22)
|
||||
Me.GreetingLabel.Name = "GreetingLabel"
|
||||
Me.GreetingLabel.Size = New System.Drawing.Size(382, 45)
|
||||
Me.GreetingLabel.TabIndex = 3
|
||||
Me.GreetingLabel.Text = "Hello, I'm Ritchie"
|
||||
'
|
||||
'DeveloperForm
|
||||
'
|
||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!)
|
||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||
Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Image)
|
||||
Me.ClientSize = New System.Drawing.Size(510, 510)
|
||||
Me.Controls.Add(Me.BuyMeACoffeeLinkLabel)
|
||||
Me.Controls.Add(Me.AboutMeLinkLabel)
|
||||
Me.Controls.Add(Me.GreetingLabel)
|
||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||
Me.MaximizeBox = False
|
||||
Me.Name = "DeveloperForm"
|
||||
Me.ShowIcon = False
|
||||
Me.ShowInTaskbar = False
|
||||
Me.Text = "Developer"
|
||||
Me.ResumeLayout(False)
|
||||
Me.PerformLayout()
|
||||
|
||||
End Sub
|
||||
|
||||
Friend WithEvents AboutMeLinkLabel As LinkLabel
|
||||
Friend WithEvents BuyMeACoffeeLinkLabel As LinkLabel
|
||||
Friend WithEvents PictureBox1 As PictureBox
|
||||
Friend WithEvents GreetingLabel As Label
|
||||
End Class
|
||||
@@ -1,829 +0,0 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
/9j/4AAQSkZJRgABAQEAAAAAAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdCIFhZ
|
||||
WiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAA
|
||||
AHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAA
|
||||
AChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAA
|
||||
AFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAA
|
||||
AAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAA
|
||||
E9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAA
|
||||
ABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEB
|
||||
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/bAEMBAQEBAQEBAQEBAQEB
|
||||
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAgAC
|
||||
AAMBIgACEQEDEQH/xAAfAAEAAQQDAQEBAAAAAAAAAAAABwQFBggDCQoCCwH/xABFEAABAwMCBAQDBQcC
|
||||
BAUFAQEBAgMEAAURBiEHEjFBCBNRYRQicQkVMoGRI0KhscHR8FJiChYk4RczcoLxJUOywtI0kv/EABwB
|
||||
AQACAwEBAQAAAAAAAAAAAAAFBgMEBwIBCP/EAD8RAAEEAQMCBAMFBwEIAgMAAAEAAgMRBBIhMQVBBhNR
|
||||
YSJxgQcykaHBFCNCUrHR8BUWJENicpLh8TOCNGOy/9oADAMBAAIRAxEAPwD1YUpSrQqulKUoiUpSiJSl
|
||||
KIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpS
|
||||
iJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUo
|
||||
iUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKI
|
||||
lKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJ
|
||||
SlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiU
|
||||
pSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlK
|
||||
UoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSl
|
||||
KIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpS
|
||||
iJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUo
|
||||
iUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKI
|
||||
lKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJ
|
||||
SlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiU
|
||||
pSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlK
|
||||
UoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSl
|
||||
KIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpS
|
||||
iJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUo
|
||||
iUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKI
|
||||
lKUoiUpSiJSlKIlKUoiUpSiJSlW67Xi02GA/db5c7fZ7ZFCDIuFzmR4EJjzHEtNh2TKcaZQXXVoabSpY
|
||||
Ljq0NoClqSk/HOa0FznBrWgkucQAAOSSaAA7kr01rnuaxjXPe4hrWNBc5ziaDWtAJJJ2AAJJ4VxpWg3F
|
||||
fx46G0uXbdw9jtanuKQgm9XVuXDsLWfgH8M25Kol5uPmMuToTwkLsPwktlmVHVdYiyFaY6u+0G4oy1ST
|
||||
br5CsrD6HG/hbVZrYENpWtxZ8iVcI9wuTDiErSw26meXUoabUF+cXX3K3meLOj4jnNEz8lzdj+zNa9l+
|
||||
gkc9jXciywuG/Jo1d+mfZ54l6lGyX9mjwo3kV+2ufHIWmqd5LI5JGk7gNkDHWDYAIJ7xwCTgDJOwA6k+
|
||||
lYhdeIOgrFLVAvmt9IWacgKK4V11LZrdLSEuuMqKo0yay8kJeZdaUSgAOtONn50KA83GrvFRr/UrK4V3
|
||||
1lqO6w8nEa6X+63FkJ8xDyUpZmSpDPKHW0OABOA4htey2kkRYri5JUSoyDkkk4cx1OegVjuagZvHsX/A
|
||||
w216yz79v4WsAHfh7uPdW7F+yHILQ7M6mbIBDMfG4ut9cshsb8eWCvVRbdXaUvSGHLPqfT12bleb8M5b
|
||||
b1bZyJHklxL3kKiyXUveUWnQ75ZV5ZacC8FCsX5t1t5RS04h1QBUUtrStQSCASQkk4BIBOMZI9a8ly+L
|
||||
0lJKfPJ9+Y9iR6/19KpTxdkZKfNUem4Vg7j9O/cY2rG3x+NteCw776cmvT1jcR3Pf9VmP2OyOvy+rPYO
|
||||
wkw2uNkju3JZYANcCyL2Gw9cCkLQQFpUgkBQCklJKTkBQyBkEggEbbGvmvJdG4quA+Y5LXlK8pClJxsS
|
||||
Mb5AwCoYGwJO22KmzR/iz4maQMQaf4galgswm1NRYJur8y0tNqYeYS2bPPVLtDjbLch1TDUiE61HkFMt
|
||||
htuS026jdi8c4r3hsmHIxvdzJhIasAkNMUYNX/P9VH5P2SdQiBEHVIpX9myYj4Wk7Vb2TzkA+ug0ATWy
|
||||
9MtK6QNIfaTcT7aIrN/j6S1bHTKbcmSZ1retV2fi+cFPxo0mxy4NqiLUwFtMSXbHN8lwtvOtSUtuNPbV
|
||||
aI+0b4aXtxmPrDS170u49IjMCbapsPUtsabdU227Nllxux3JhhjmcecYh266Siy3hhEh9SGlTmP4l6Rk
|
||||
Gv2gwuPadhZ+L264xXcl4Cqmd4B8TYIs4TcloBJdiytk2FGxG/ypXc7aYyV2K0rF9I610nr2zMX/AEbq
|
||||
C2aitD4bAl22Sl7yHXGWpAizo55ZVunIZfaW9AnsxpscOJD8dtRxWUVONc17Q9jmvY4W1zSHNcPUOBII
|
||||
9wVUJI5InujlY+ORhp8cjXMe0+jmuAc0+xAKUpSvS8JSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoi
|
||||
UpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiV/CQASSAAC
|
||||
SScAAbkknYADck9Kp5kyHbokmfcJcWBAhMOypk6bIaiQ4cVhCnX5MqVIW2xHjsNJU48+84hpptKlrUlK
|
||||
SR02+LXxuu6hj3bQnDyU/a9IuqfgXG9JK2bnq2HlpDiEtOMNSrNZpC0voMQrE65wFpRdURGpEyzJiOsd
|
||||
ZxOjY5myHXI4HyYGka5XD57NYCRqedhwNTiGmx+GvC/UvE+c3FwYy2Jrm/tWW8HysdhPJ48yUi/LiadT
|
||||
ju4sjDnt2Z42+OXT2j5Vy0/w5Yg6gnQ1uRXtUyXfiLEH2xyPmyx4y0m7oZcUUMXNUhu3PPsKdjMXS2us
|
||||
S3+pPi14kdXa5uEm4am1JOuj+XENoekKTFitrWFLZhQ2wmJBYWr5/h4jLMcLypLYUVE6wan4gyJS1Bt0
|
||||
qyVb8+diMDoCMfMScHt67mFLtqB99wlbyiNyfmxknA6kbfljNcY6v4oz+ouPmzERCyIGEthaCRQDQPiI
|
||||
H8Uhc+tr9f1H4Z8A9I6FEx0GLG7IAAfmTgSZEhAp3xv2YCQToiaxm4tvBUsXjiE86VnztwVE/tEHOd+5
|
||||
ydxtUc3DWTznOfNJB7kA9VHPTJP4h3H51Hsi4qJO/TH7wPXl9D/WrK/LWSQXNj2GB2A/1E75qsnKe7l5
|
||||
NeupXluFGwBv7sA/yjVZsXYske3qVmr2qHVuKUXCCT+IcoCsbbDm6DG2+N9sVQOajdIUfNc3xtzY/ez/
|
||||
AKvf0rC1P9Mq/wA/939KpVPDurr9B/avgkcO/wCn9KXt2I0VpF/9oriueb349vrmitROnGXV9+rhHp9a
|
||||
+G9QPAE83X0UR0z9c1gq5acfiz7A5PQ+5x9dvqK4Pi//AFf5/wC6vvmv9fzP918bitPILeK2Druu5PbY
|
||||
/j3Ulp1O4M4dUr6Ee/v/AErnb1U6ObmcUOnTlOeuQd0/56VEy5qz+EkDf1yfTOen5eveuIznAPxk/n/Y
|
||||
ms7ch5vciq/iJ/Uen6LA/HZrI229ge5FHmqrgevdToxrJxKgPPUfXBwO/ZRP8/esutmv5Efky8duUfiU
|
||||
nJBxkAkn32HtvWrqbm4M/tMZ+h9f0qsavbiVD5vXv2+Yj9M+w9hW/HkPbYcSL0197tz39O3clR0+G1zR
|
||||
bb57D+3Hbvz7rsO4b+IXV+gLtHvmkNUXTTt0a8sfF26UWQ+y28iR8LNjHmh3GEt1ptb9vuLEq3yChKZM
|
||||
d1CVIPaBwQ+0zuMb4a0cYLWNSwCQhOqNPsw4WoWQpUpfNNtQVDs92SMxY7RimyPsRmXpMhd0kqwrznRd
|
||||
RLQeXzD/AOpRyPw49QcYyT6Dr1rP7JrB5hSQXlYP7+eYYAJHU7ZxnfPU77nNk6Z1jMxHDyMh7QCCW6tU
|
||||
TroEOi1OaSRW5AcK2I2VJ694U6V1Rjhm4UUjyCGzMZ5U7KFgsmZ+8ABJ+CywndzSBR9p/D7inw+4p2v7
|
||||
30Dqq16iipbQ5IZiurZuUBDj0iO0blaJaI90tyX3YklMVc2GwiWllb0VTzOHDn9eTHgZ4jtW8KdTW/Uu
|
||||
lLuuDOaSpiQ2Sl6LPhvFJkw5sV0KYkxXwlta2nkK5H2mJLRTLjxn2PRl4bfFBovxEafLsBTNk1nbmlLv
|
||||
mlHJPnOJYStCEXa0vLQ0qbbHvNaS+goTLtUtZiy0uxXbZdLr0rpHXoeoVDNoiyuzRYjlG27NRJa4d4y4
|
||||
nu0u3DeA+KPB2T0J7sjGMmV07YmU6XS49mgJgwAFl7CVrQ29nhhLdWzlKUqwKlJSlKIlKUoiUpSiJSlK
|
||||
IlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSi
|
||||
JVuu92t9htVzvl3kphWqzwJl0uUtTbzyYsCBHclS5BajtvSHfJYacc8phl19zl5GmnHFJQbjXU/47/EY
|
||||
2pcnhRpqURBtEhDuqJ8aY2pq6XdltLjVoSIb60rhWVx0Ge1MUHDf2g0uHHcsseVLi+r9Ti6ThSZMlF/3
|
||||
IIyd5JSDpG2+lv3nns0UDqLQZ/w10DJ8R9Vg6fBbYyfMypwLEGO0jW7fbW7Zkbe7yCfga8iFPFd4yLtr
|
||||
9uXpnT5esWjGnyU2ovNGdfDFfdVEm3t5kYSlKQxJTZmXpFviykpcMi4yI0OcjqR1dqp6dIcW8+SVKV3K
|
||||
sHdQwcnYDA7b9RsMXvWGpVPuPOOPlSllRUScEnrsM98nlH59esD3K4OPrWUqOc5CeY/KDkDO43OSd/TH
|
||||
04D1jqmT1GZ8+TM58j+SaAa0cNa0ENaB2aAGitu6/Yfhnw9gdGw4sTChZBE1u9C3PcQ3VJI4m3yEm3Oc
|
||||
dTtrOwC5Z9zLq1JCiSOmSTgHOT6ZOPr0FYq/KU4pRJyfz2298f57kmv66tauqjk9zv0/+f8ABVGpskYB
|
||||
znqfz+tQTnFxs/5/n+e1x+CIdhY2AHcc8DjccrgW8SDnOT0wffP+H/tm3vuLBSQcE5zsD0x659TVxWwr
|
||||
H+f0P89qon2DlIKsEZ7fT3HpXxeQ8OcLN89vY+ypyQkEnoBn/Pc9veqBayTzE79h/QegH+ZJqueaWQAk
|
||||
jG5VnI6dOmdupOfQVbF9RRYnk2B2/qf8/VcZIA/kPWqZTm+OuPoMfp9K/rpIzvv0z6ZGdt/8+tUq1EDA
|
||||
7/0/+azgV3s+v+fra9gV3s+v+fra+nHc5Sn8/wCn8v8A5q3uOnOEHYdTsQT7ZB2Hr3+mCeVajuP196tb
|
||||
rqlKydwc4Gen9ye5/pgDI15Zdd671xf91gljt2q/ve3FAD13v6UuVb5ByFnJ6/i7fTG2526DtXyqWUnI
|
||||
J39yOn/tPrVuW6euevbbf+H+fXrRrdwFb55eo2GxB64+h9v0rOCex55v+pWo8WL9P1pZEzcVBR5zkH+x
|
||||
7Yye3QGr3EvC04w4Rn90k/7umSfqcH61HfxfrzD65/oo1ytzMHIOfzPuOxNS+O8t+B0g3qth6j1I33qg
|
||||
a/SOymB4Oreqr/tvv6UFPdr1K7HWgpdOx6Hbudsg9cDvtuOuMVstwn406l0PfrZqLS98nWS+Wx5MiHNh
|
||||
SFx3kHlLbiSpCh5jL7LjjElk8zT8d1xh5DjLi0VoPEuikkZX/PPU+oHr327bZqRbHelMqT+0yPkOM47Z
|
||||
27jqDjPvU9jue1zSHEFpsOGxvcg7EVVfjv7KpdSxYXh8b2Mex4cHMe3U0tAILXDgh1b39V6+fB54xrRx
|
||||
8tMPSmqnItt4nwYJUot+UzB1nHhsrck3K2stobZi3dmM0qVd7QwlLC0NyLtaGmrcmZbrJvbXjL4RcUrn
|
||||
pK/2e+Wq4vQZ1snwrjClMqSHIs6DIblRJTXMCkOsPtNupKgUcyEkpVsK9aPAfjJYeOvDaya9snlsPSkK
|
||||
hX61IdS6uzX6IlAnQSUuOEx3QtqfbXXFB5+1zIT0htiSt6Oz0nofU3ZbDjZDryImhzXn700fcn1eyxZs
|
||||
lzSHEWHOP548Y+G2dJmbmYbC3CyHua6No+HHl2IDdyRHJ8WlvDHAtBAcxomOlKVYFR0pSlESlKURKUpR
|
||||
EpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKpp
|
||||
syLbocu4TpDMSFAjPzJkqS62xHjRYrS35Eh995bbLLLLSFuOuurQ22hKlrWlIJHwkAEkgAAkk8ADck+w
|
||||
C+taXODWglziGtA3JJNAAepOwWsvik48xuDui3olqmRf+dr/AB1s2xgvL+KtFteRJae1F5DbawpbbzJh
|
||||
WtD7sZDs9a5bYmtWmbCd84/ETVj0uTJWtwrU4pas9/nJAVt1ByDjO24O4zWxviO40XniRq++aiukuQW3
|
||||
5Elu2wnpAfatFpbefXBtcUoZitmLCYX5fOmOyuU+Xp0lC5cuQ451/aqvKnlOkrOOY8uASRss7kY6DYd0
|
||||
/wABw3xT113Ust5BIx4i6PHbZAawVqcW3WuQgOdY40g7MC/WH2feE4+h9Pja9oOdk6JsqXYnzSCBGDtc
|
||||
cIJYwA0SXvoF5vDr5clPuKIcJGT12/M5UdsdNthmsQ5VSHClJ+VJ3PXfffruTg43Axvtvn6WtyU4QCeX
|
||||
O5/UjYkHGRsPzPYDJ7bbwv5iNhjbB3zk9fyGds7/AEqjH944nj8+ST7Lq20TKJsDe6I1VQIHOwJvtZNC
|
||||
uVambSXE83KB0xkq9/RX8wK5/uoeif8A/lP/APdSKxbhyA4A6Y+U+g7DH+dKqFwRtjbGew9vZP8AWvoY
|
||||
Bzv+X6rUfl/ETsPqR3vs5tn1Jvfuouct5AJxgn22/e/PpucDIHerPJgEAgIB+hVnOSBgYHTr3qV5MYoy
|
||||
FADPtscHGRgjpkEflsKxuZDB/dBG+25yDj1J9Onfp6Z+6G+n5n+6xDILedvrz+Bb/nooydi8vMR1Hbbf
|
||||
8XoT6emem9WiQ0oJIIz1x29j9MAk467dKkCYwnHTffA2/wBQyMkHp7EfnWLS2QpKgNgf4HqD1Hft+u1N
|
||||
IHG34/oQs3nXW+quBZofL4nHevbj8MKeSd/1/TY/3qgUDnf8vpV7kthKlAepx9QSB39Bj+NWp5GAFDpn
|
||||
cema9L057CSQed+D9eytchScKGdzjuOg79emx3q1u/vfl/Sq98bpPqCP0Of61bXlfix2xn32P9v5Giyi
|
||||
gw+/9Tt+X/lUbqsZ9hgfU/5+gq2vPKSFJSMEY3z6j07Hfrn1xg7iqecCTk7nsPU+3sNs+n162d1YH5Z/
|
||||
Ppn/ADv2raOza7nc/LsP1/8AawPNCvX9KXw+4oKO/THYdwPb/MVSGUoAgqzn1J/hlQ9a4XnAM+pxt9Mf
|
||||
57fpm1PSAnJzv6evT2OMZ/P863scBziD6ih60HH9FpS/xfT9FkzU5SRv82O+SD1PU4OfbIGO3rWW2u54
|
||||
KBzbHGD/AH/M7jt1Ge8TpmDBOcdNs79//Tn+OP53mFMWlZCV4Ox/TPUdwMjqPTrU9ATqNEjffn0Py7f1
|
||||
v51bPIAoCrLq39OD9Qf7rZrT1+Uy42Q4R02BBzuDnv8AkRsQd+4PbH4BfFf/AOC3EWNb9QTinQesXIdq
|
||||
1YnyZMr4NpsvC2X5hmL50lb9iflPPutMsTXpFokXaNFhuzn4jjPSVZpuFIwrbv23BI26HG22cAc2Rv1n
|
||||
XSF5cYdjuJcIW2pByDg8ySkpUPrjHocn0qw4U74pGTsNvY4OBojcE8ixYIsOH8QJB7lUnrGJDnQ5GJO0
|
||||
uinYWOoCxuCCCQdLmu0ua7lrmgr3ZMPsyWWZMZ5qRHkNNvx5DDiHWX2XUBxp5l1sqbdadQpK23EKUhaF
|
||||
BSSQQa5a6y/s2PEGviJw8f4VaiuUubqbQkIT9PuyzKkuSdC+bEgohGW4Hkj/AJYuMqPAjtSJLPJaLnZ7
|
||||
fa4yolnkljs0rpOLkNyoI52itbRqb3Y8feafkeD3FHuvz31DCl6dmTYku7onfC6qD43DUx45HxNIsAnS
|
||||
7U27aUpSlbC0kpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKU
|
||||
pREpSlESlKURKUpRErV7xia8XoPgTqh2M84xP1O5G0jCdQ1GeShN1RIfufnpkrHlsvWSDc4okMtPvsSZ
|
||||
MZTSWVqEqPtDXTp9pXxCDuodO6LjvxVs6bsT86SGkq+MYvGonW3X4spzzVJLaLTbrJLjNpZbcb+OfcUt
|
||||
1LrYagvEub+w9Hy5AdL5WjGjPHxTHS6jzYj8xw2O4HayLX4J6Z/qviXpsBAMUMv7XMCLGjHIe0EbAh0x
|
||||
iY6zVOPyPT5rW++a89yufLzLAwRkkE77k7AEYPY5z2A17vk5Tri085UVKJydtiTjYcp/Dg533IzWb6nn
|
||||
pU47leSFEY26lRydyfTrUWurW/KUeoBO/YZz26ZPtjYe1fnfJlc57gd7J3s2Nq+vPsv2bhQiJjQP4YwR
|
||||
XPw13vb7p4vbb3V2t0Yvu53wCO2c7jI2IwTsOh3IqSbTbsIG2em3KTk8p3/ex9M9Qas9gtDq0pWocoVh
|
||||
QO5ykjI7/i67jbB3zsBIcdhthvrnHTI9MjuT/n0rHFGSLPw3W3Pr8l5yZyC4F18XtztW4A9D+nNr4SwE
|
||||
jCh/n5g1xuthRUonp2+uT61UrfSBjHXv9D9D/b3qlU4CSQP4/wDatlRvmtP3d/qP0tWaW3gk5/F7dMAD
|
||||
196sElvAIPuR9MHP9s/1rJZJzzJ6YIOfqnH9ascoe/QEfoSf6UWRr+dJ+e39wsMnNgKcGPf8yAT64znt
|
||||
WI3FIT9c9f0P8yazibsHD6D/APUH+lYZch86j6pI/Q5/rRZmu1XtVLCJIypXsSf4qqzPnAKe2R/An+e3
|
||||
0rI5P4V/Q/8A4GsYkrSCT6b9vfbr13xj1othrtV7VSsslWFKA2OTjvvnBPY9s+2cVa31fiOP83V/2qtf
|
||||
ODn/ADoKtUhwgKI3IBJ/QnY/lj2osjXab2u1a5KyVEEjYbdB1AJJO3QfkNverVIc5lEA/KnYHtkdT1wR
|
||||
n6dB6VVurKipR339ff8APb09gKtj5xz/APqV/Mn+lZGGy76frt9F8c4m3Ht2/E8/T0VA+sjJPXoPqfz7
|
||||
e3tWPSpIOcHpnf12PqR6YHcDPfYXWWvCCFHsQPqU4Pf6fkPasdf6q/z941KRjU8m6DNgK5sEeu3/AKWn
|
||||
Iaaf843/AEXwHs/vfwB/lmrzDklOBkH06judumMdeo6nJ2GKxYupCz8wB9+m22/YdO/fYbiq+O+QcZx+
|
||||
f1HqOn02qYi/h+v6qu5nLru7dsfS31+HP1Cli1TEpSkKOPmwCDsdgd8AY6jr6HpUv6fuCQ6OVWc8vr9R
|
||||
3+oOe2RjcEa726WcA53JAPburrgdu36/STrLOWFIJVscg9vwnY5OOuPpv9Kl8MgOAcSA6wa+Z35FAd9/
|
||||
lVKoZo2Lv5bIH1vn02477bhdn/ha4uXfhvrzTGrLG6n7xsNzjS2I63FobnMLCmZtrkOJ51tRLxCck2uc
|
||||
toB1MOW9yEEg168I0mPMjR5kR5uRFlMNSY0hlQW0/HfbS6y80sbLbdbUlaFDZSVAjY14XuH9/MSdFdDh
|
||||
SOdHNgnYgggjtt139Otev7wV8QEcRfDfw6uS5cWTPsNve0fcW4jSWUQFabeVCs8F1tKlf9Q3pj7ieecV
|
||||
yqkKf+IUlJdxV16HNUk0BJpzRI0HjUzS11C+S1zSaHDRfFLkfjTFBZjZbW/Ex74ZCBuWv+KMk+jXMcBv
|
||||
zItqaUpVkXP0pSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUp
|
||||
REpSlESlKURKUpRErzUeNzW7uqONXEWWp6OtqNqCbZo7kQuiO7CsRTZLfIT5rr5Up6DbmFvqStLTj6nX
|
||||
GWY7C22UejPWV/GlNIaq1QWBKGm9OXy/fDKfEYSTaLZKuAj/ABCmZAYL5jhoOmO/5ZWFeS6R5avI5xVv
|
||||
3xNyuDynTl111wkqyrlW4sDCQBlIPyj8IAwMneudfaDl+XjYeM07vdLO8ezQ2OPbvZdJ8q97HZ/sd6f5
|
||||
2f1LPc2xFHBjRn3e8zSj2oRw7HY3vwteNQzvNedKFnPNkDYndWcD1JIIHqTtVBYYqX3UrUnmGck56gK6
|
||||
bZx0wdsg7+tWGfIMuaoknk5sDf8AECojmz6kKOCMgeprPdMx1HB/Lt3P1+lcasuk3PHt6gD9fyX6VkPl
|
||||
RFt1243+XO4/H5bqToCAhlsD069MjGRtk9MnvVa4cJP+dN/6V8MICG0gdhgfTY+/rXw6pPzEkDp1IHcC
|
||||
tpQr/vH/ADsFwkknJqkU8o45fl656HP6jbFczquVJx1Ow/qeoOw79jiqN/8Ac/8Ad/8ArXprdV71S8qm
|
||||
kOkkknJP09Mdsen6ZqxT5XIkpzlRB6Hpn6HOfQn9auD7n4jnAA79B13/ACG598+tYtcHgpaiBnGRnJPY
|
||||
+pIx9PfNfAL7+n6+/wCZ29SNrK2zJYCFk99+o9/9X5AD29xWE3CUSpRz1OBudh+RP8+oNX2e4dsbfizv
|
||||
13xjttv0+lYPPewo/NvjbI9xk5x+me/r0r4thUEmUCCEnqMk/XIxun6Yx9KsEhxJJx+v6f2/zbNS8vlB
|
||||
HT339vT0z+ZxVnfe5QrdOdtifcdN84HT8qLYVukkgnHoT+hNWaSfkP0B/VQqskO7ncd+n1PX+3erPKcJ
|
||||
BPNkDGRgjOcDc/n6dNtsnJZtbfX8j/ZULhASc/53/wA9/rVrfJxjPX+uf7fzqsfe59+iR0Hr1yeuN/p0
|
||||
AydqtclxJBweg/U5649P82rM1tHnmvp+a8vcNJrf8vU/orVLJIJJyARge+FE7++QPbArH5a8BWDy5B36
|
||||
42znHfGf1Aq9TFAnA6jr07kAfyz9MVjUxxX7uxJIz1683032/jtg71Iwi3F18fnd9/otaY035/8Ar9Va
|
||||
VvKK8E/TYb749Ou3+HrVx3ygpz7+v+rfuOoJ77nHvVpcXhR7n8xj+ffP57965G38kD0z7Hc9+30I6bZq
|
||||
Zi/h+v6qvZZBO/8AKfxpxH9Qs6gyfmAGB17469jnr/mRtUhWOUcISVZOBuCnr39Nz33336YqJYboUThW
|
||||
MYyPTOfcdCMj8z0wTI9meCCkg8oHKfXO+/dPr2z1yBgVK47blA9SL24Gqzftuqf1B7GMdZu+23Yk+p2N
|
||||
7n/wp+0tL5HG+U4wU98YPYYBBOVDAzg4Vt6H0nfZE8SHJVv4k8MZs+S8ERrRraxQCkmJHQw59x6nlBQb
|
||||
wiRJVN0m0oKdy63GSUN/sXVHzI6ekhK2yDnBR+W2DsCr026HB233ruU+zF1Eu3eIjh/zynI7M9V7tT6E
|
||||
rk+XLTctMXhiPGfbaOXWzcFQnW0uhTDcpqPJdADAWmy4LnQZmM4HZ0gYRxs6o3cHeg4kdthfIqg9ehGR
|
||||
07MiPPlGVpq6dDpkb7iy0NJ9CeRYXqBpSlXZcjSlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlE
|
||||
SlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlEWpvjb1gNH+HTWi25kmFN1E5a9MwHIqnm1vKnzU
|
||||
S7jEcdZUgtxpVit92ZlBwqZkMLciOoWiQUnyr8Q7kp2Q61zgrdKlkcw3SVKKCRgg8ySSAeo77nHoY+1B
|
||||
1NKgcPuH+mG3UIhXm+Xy9TUeWou+bYIMKHDcQ5nlCEM6guRcb5VlR8tSihKAHPNXry5lUt91SgFOrdwB
|
||||
/pQtSE4JPTlzgHJA2Bxk1xb7QMl0nVHRA/DjwRRD/qLfOd+ctH5ey/Tv2QYQx/D7cgtp2bl5E9nuGObj
|
||||
DsO0NgWdnX3FYnGKHJZ5juTt+LA3JAAzXLfOMnD7h1IiW/U1/RFuD7ZcRAixZlxmNtHlLb8lmAw+Yjbh
|
||||
cT5RkKbU6klbCXUIeU1rnxU4rHRNtXbbRJSrVNzZHwyxhwWmGpa23Li42UqbU84G3WoDS1FKncyHW3mo
|
||||
6mH9ErnenpU6RNuMtUydMedkS5Mp0vPyJC1FTrrjrgUtxa1K5lrJJJPXAFRnQ/DRzmfteU98WO+vKayh
|
||||
JJVDVuHVHZIDgCTz8Kk/GfjyPpGQ/A6dHHkZjN53vswwWb8shpa50lHcWAARe9gd0Fi8QvB7UMhcS3a+
|
||||
tTT6eQJF4YuGnkOKc5+Vth6/w7cxJcVyEeVHW44CUgp5loCpYTPjvtIfjyGnmXm0OsvNuJcadbcTzocb
|
||||
cQVIWhaFJW2tKuVSFDkOCDXn8Rc0LzyvIOMZwAcZzjpn0NSVo7i3rnQ6kJ03f5kKIh5LqrY6oTLY7gu8
|
||||
7a4UpDrKEuh57zVMJZdUtaXg4l5ptxM1P4TY0H9kyXNO5DJw06iQL+NjW1femEDY1tRqeD9pMmsN6jgx
|
||||
6CSXS4lsIO1Hynufq4/nHG/K7rXJWEnKwR6DAzse4HT26VwKlEjBUT+ZP9Vevsa1J4WeI+z64bi2i9fD
|
||||
2XVDiQgQsu/d10XyFS3LY86XCysqSf8A6dLeMhBWhth6byLUif03xtQzzIH1+mdwcHp7GqjlY02HK6HI
|
||||
jLHt/mOkOB4LTRDm+472Ni0rpvTupYfVMdmThTsmjcNw1w1xu/kkZ95jhtYIHIWUOvNkKwehOenor3rF
|
||||
J7qC4o5/iOxHvVLJuydwtzJ9jsO3QJwPxZHcisRuN4KSoqWcf6c9evVWDjr/AJisBc1tE7C7AuyeNzVg
|
||||
dtv/AGN9VM9aSFYPQY6HrlXtWEz1p5uXmBxnoSepB3229t9/5/E68BfMhKj6A7e/Tp7fTptisUlXJOVH
|
||||
mJJ67+47kfyz+mCdZbTW6r3qlXPqTlW/8/8AUasj5y4dugA/Xf8AriqdU45A5yon2T7exqnckcySAf6n
|
||||
+Z6/l9aLYa3Ve9UqaQonmzv/AA7kf1qxynOqUn0J3/IdD9Tv7Grq64N+Y7noNz033P8AnXNWF0g598fw
|
||||
7/TavTW6r3ql5VA8vflH5/5/D239atMlzCSMZ5vfGACMbb9d/wA81cXVDmJ7D+5P9cfWrPJWMLxvgJSd
|
||||
+45le/pj659KzgWQPVFa5L5BIB3O6tz657HOABgZ6VjciRzhWRjO4yfQKyST6g5O+xHuSLpMWQlRGx6Z
|
||||
+pxtjG+1YzIXnPfHb9T7+mPrmpWOPT8IPPeu+/v+q1ZnloeR2F/gHf2/NUbrgCtjj8s+n1/wivlp35zh
|
||||
RPZXUddwO3vgDbOKo33ilQ2yDnvjpj6+u3tXy0vIynp6+u56j8vr9KlsUWQPU1//AEqxmvok1yD7fzX6
|
||||
+v4LMra4Srrnp29z7j37fnUj2pw4TkDtjGRsNt85qLLWr5wD3xjoPRR9OuD+dSlbkcqBvnOO2OiSPU+l
|
||||
WHGiuUfFzfb0LT691SeqSlxLQdjYuh6j1HrzxwpNscgpcayepA7b4Kh2T3IB/Ou0LwGyy7xx4Pt83MV8
|
||||
T+Hm2CNxq+0r2yPQHGDucDBJGOq60Lwto47KHX/UT7dq7MvAZLbZ49cHHl5UhniZoR1QSAVFLWqLW4sJ
|
||||
HNgqKUnHMUgqAyQDtKtbUjBd0+Mkn1DmkbX7b7qtZpvHnb/+qQfO2r2J0pSrsuNpSlKIlKUoiUpSiJSl
|
||||
KIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpXnS8cv29+k+Cd9v
|
||||
/Djw3aEia21ppDVuodM6o1txIaL3DwvabuDduW3om06O1VFvmsWbq+3c0i93C9aPh2hESA+zB1G3dnE2
|
||||
vFLNHCAXmrBIABJOmrqhW1jkjlZooJZr8tthunUbADdV1dm96PAPCkj7UDVke4cU2LNHQ809pfSFrtU5
|
||||
TqUIbkPzFydQtuRymQ4XGExL2wwVONxnDIRJb8pTTTT7/n24rash2CNPu011CWYTLimmVPeUuXI5FKYi
|
||||
MFZXzSJK0+WgDON3CAhKyjsI4qcZNX8d9GaA4v69kQpWsOIPDDh7qq/u22CLbbzMu+krXMSzEhIcdSw1
|
||||
HYdZYHKoJUGwtKGgoNI6h/EVo6+cRE2q1Wq+xbFCZuEiTdpL8aRNklkx/LZVb4zb7UdyUnneZKpK2w21
|
||||
IW4y4CFtOcL6w6LM69PJkvdFjPypJHPLS7TG1x0spt25zQ1u1i6+v6w8PNyumeDsKPAYyfPj6fCyKISM
|
||||
aDkyNYHvt7mjS17zJuW7NtxFLRDUur7tqfUDjEFiVqTV1/kp8uFbGfPfdcQhDSQlKD5caFEjhAXIkuNx
|
||||
IENpTr77bDanKkGxeGjWF6a+8NY6xj6dkraUqPZrLCRd1xXFhCm13C5PyY0dxbfzpehwWnGlkoU1cRyu
|
||||
B2cNDaB0nw1iPMWKIXbhKQ2LnfLgsybtc1pCQQ++opTHjhaeduBDQxBbcy4lgvLcdXniLwlCcc4IHckf
|
||||
0P6+9Zc7xNkE+V0xhxsePS1r3xgvdpr7rTbWMqqFWeTRJuO6N9nmGWuyuvzDOzZ3GR8TJnCJjnkOOqRr
|
||||
mySvsmzq0AmgHAWdTrp4b9eWhDa7JqmyaoDSAX25cORpubzFZSr4ZPxF5huoQnldUp+XCUU+YlKVrDaH
|
||||
YmlLvOnLi5ZdRQZFrujCUrehyORSlNrKktvsPtOORpcZakuJRKiuPsLUhaUOFSVAdiP3y0rJ5grfPrjP
|
||||
0P8AmKxTVNlsOr7eq33yBHlsAKUy4pAEuI+sJHxUKVyedEfHKjK2FJ8xKS095jK1tq+4PivLjcGZobPG
|
||||
aBka0MlbvuaaAx21A7NPofTH1f7NenTxOf0h78ScAuZFLI6XHeQNm24mRhca+LU4Vdg2tM4d0QpSFtuq
|
||||
bcSQpKkq5VpUDlKkqG+QRnHXOOlbacNeP9wjoi2HVspcpnPlRdQPvFT7Cdg2zcypClSG+bmzcFuKkJyF
|
||||
SvOSVvs6h6t0xddC3T4OStUq1ylFVsuaEqSh9tJ3ZdHMEMTmf/vNZSHE4eaKmlEp4YdyS4AckfLzpIUO
|
||||
gGdjkb9+nTf6XCbHwusYrS8NkjcNUcja1NJHIdWxB+8w7EinCly7Ezer+FepPY3Vj5ETw3IxnjVHK0G9
|
||||
Lmm2ua5taXt3pwLHC12uo1OZLSXEyEKQsJUhSFJWlSFBJSpJKdwpICgRlO+ApWM1YLleirnwsk9unYHB
|
||||
GPT06HOd++pnBbXMi5RLvp99alfcTkVcRxSgvEScJP8A0w9ExnoqlJyvZElKG0lKMVMMm5rWogqCgeo2
|
||||
HTI9d89fauXZ+G/Ay5sV5JMRb8RFag5ocDVnYgjvzfpv+iOhdRh6t0zG6jCwxjJaTIw/wSscWSNuhdOa
|
||||
QDXFHa1lcq7EqJWVKPvk5ycbDGB0/OrHJuZIJCj9T9c7AFQH59c47CsdemqwSVYAz36+wznf/wCc4FWK
|
||||
XcVqSoFQA9jttn1UfT1x+e9arW6r3qlMLNkXQpzzOJ3xjJPv6AVzieSDhRJ9eb2HbI9+57ZqH7vqZq0x
|
||||
y6VqdfWFeQ2k8vMU4ClLXvyoTkA75USAAcEpx9jidFOS/FkRyAVKDTzb3yj8OOb4ZJzv+9tUlj9G6jkw
|
||||
DIhxy6Mk0dTQSBtYaTZF2LrkEc7KGzPE/QemZTsLM6hHFktaxz2Fj3NYH7gOewOa00dVOIJaWkDcKeHZ
|
||||
RUd1HqT1GOpPf6nffr1qickZ5hzd8ds4Gdhg9/8AMVE7PEayOgqXOdYwEkJebfJOc7YZDoynAJ3x8wwT
|
||||
hWK86zsziCsXKKBtvzFCsD1BTzjGP9O+Tk18PTM+IkPxJxdURG8g/IgUeRwVmi690LIZrh6vgPoWWjJi
|
||||
DwPUtc9pArubdtv2WcLkowSDnHbBGd8bnHv06VZpMjdQGceueu5TnG3UevYkd6xGRrqwtIUpdySvGMBt
|
||||
D7hO4z0a5R26qAO/KTg4w658UbWwhRjRZL5yoftVIY6dFDAfznO2QnA2777eN0jqEzwW40rQNwXs8sH6
|
||||
uoCu9nuPpo5nivw7hsd53VcR3tBIJ3Dt92LWd770s7mvg7Hfrj9CP45/Ue5xj0h1Azk479z3HoO1RZ/4
|
||||
oPKcJkQozjQBCPJecadOckqUtwv7FYBGEAlGUFW/NV3Y1XbrynljO+U/gc0V5QQ9nZRKBzcriBjZSCcA
|
||||
p5wgkJqTk6T1DFaHywfCBu5jmvAu+QDdAEW40PRRuF4v6F1Z7sfFzAJTYEczXRPfyPgDxpdyNg4uqyRQ
|
||||
V8luoUSe2Djr3z7duboeuPcVwx3sJX+9jl7kdcj067dfYZqwrmkKAJzknukYx7Y652+u2aqYkgecQT8q
|
||||
8Ajp9N9u/p71nxo/f17emr3WLNlskc0D370RfG5NXwOykizr5nGtsZweucbfSpat/wD5af8APWocsZw8
|
||||
kdcH/wDFPT+P5VMUA4aSev8Ahqz4bPha6+QTVf8AR7+yonUH29wrguHPqT7e/wCXvtmFucHmJ7gBI7DG
|
||||
QR3xn+PTtXYd4Mrwu2cXuGs5kNOPQ9a6YlMpdBU0p5m8Q3GkuBLiFFtSwA4ErSooJ5VpOFDrkt6z5yAD
|
||||
2O/tgke/8ttq3E4FO/8A1mAnnyDIYQdjkjzkg+vUKJPf36Y3CNLmUe5I/wC6/wAtVKGyCXxSajsWkDnb
|
||||
YD1+Xovc5SlKuq42lKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpS
|
||||
iJSlKIlKUoiUpSiLxK/8QJ42OLVv8ZV34A8O+LfEzS3Dvh9wj0fpbiHobS+pNR6X0re9Va9gXLWF3Xf7
|
||||
bbbhGgawRctAaz0hbpCrkzJtzUATLQ3HQtd3VL8/C79OmoQ5JfRJUU7OOsMvLKCAQkOONrUlBJKilKgF
|
||||
ZzsSSe5T/iF/DbrLh54977xhuTsiRoXxIaX0rqfSs8JkKjt3Xh9o/S3DfV2lH5Ul5xx+5WZdlsmoVpjh
|
||||
EOFZNaafgx8GO40z0fO2253l6x6RsCm0XvV99smj7KXPiAhNx1BPYtcdajFZkyQlKnyoqYZfeT+Jpl9w
|
||||
JaXXclzxNKXHSQ9xo390HY8jYNr8RSseI0OjgbHVvawbd3bB2/qHEj1tbN2dzxE8XbOy5a7lxI1dpy0M
|
||||
Q9OxZUrUF0/5WtqLDEZiRbLGmXG4MWOMu0xgygwkPpeiBYceaDj3M7js7hVxZZeLs6yS1upOOdzUNhdc
|
||||
GDg/tEXh4jIGCAoHod8Gu8LiPp/TnDbRtj4faPjfA6Z0faLfpqxRFL8x1NtskRqDGXKfSlsyp0hDfxNw
|
||||
mOJ86dNdkTHip99xZ0O1I6srdUgDBUrGepPMSe56DGAOpOM1zLN8WZEGQ+PHxcTQHEVIx7nUCNJLmvaL
|
||||
I7UaBXe+l/ZvhZOJFLn9S6k+dzGF3kTMZG2wCWtD45DQ3F6voKWiTum+ItrUfMiXiOoFPzRro26ARkhS
|
||||
lxJr2UoyQcggEqTzJUCk8bcviVCClj/m8NoKUlxTd1lR+YnlSkOrbdZVz90hRQvlPOVY5a2Z1DqTRejb
|
||||
c/qXXV5YtVoYVlphHM9crlJwSm32mCkpcnTHCU8y9oUFP/UT347ISo7i+DTgt9oJ4yLavUvg/wDBhaLf
|
||||
wubdabhca+PV9/5L0beUvOoZbkael3FVrn6oRFQp2Rc/+Ro2qY8JuG5HkyWJ78SLJ3cDqnV+ogub0rDm
|
||||
jBAdK4eUzcgbF5JdtYIGuvhs0VFda8O+GvD9xu8TdSxckttuOx/7RMG7G3NgEfliyD8bmg1tva6pWeJ+
|
||||
s4Lzrbs5LzrTq0PMTYUdLjTqeZC2nEtNsuoLa8gpKgpK0YUMhSTlNv43XNogXK0xZKQRzORXlxXCkZBS
|
||||
QtD6SDkdCkJxhIGTXYX4m7V4y+CPiNf8I3EzSHg441cVrUxo9i8aR4d6c49a1SzeeIEKFqG0aEt6tR8P
|
||||
4D961TcdLTNMajcGmLJqKxNxdSWOGu6SdQ2+/wBgsmrHFSPZtAa1ufDvxIeB3iVwH4gxZlrim2aTkT4O
|
||||
oJS9QvyjbrnaeG12jacu0rT092FJVBnQdM3WHGS1EgNOtrlxY78k7Egkaf2rocYui52I+Jzu29M8lxB/
|
||||
5Q433KgYeqdQxpGu6f4vnqv3Q6myZjJDt8ID/wBpiA3H3ywWRfNKP3uIWidWwHbXem/IYljlWxPaTyIc
|
||||
wpLbzUtrm8h1oqPlyEFlSFKCgpKQ4tOvWtbDM0Yz96wZX3zpt1DoZuscJUGFEhCY9yDPMhl5KnEtokJ5
|
||||
W5DnIORh8/DiX2uGvD3XttnXngnxGTqdENx1L+nNSQDaL/FS069zJkKDUZ3zQjy2m+eyxozzyHXVSYza
|
||||
whqL5DWptHTFNSES7a8lw7IcJjPKbOPlcQosugAgqRnzEoWErS3zkV96fj4UL3M6dlPheSRJgZZeCSas
|
||||
tbI0SMd31DW3eqKdcyerZuMyXr3To5mBobD1zpxjeQ1x2bI+JzoJmUNoneU4E7PbZWTeGu4PTYurbycG
|
||||
NIl2q3suJChl2GzNfltpJbLYHJPiFSUrUsEjnQ2Cgr2jEtR/ex+Sf6gVDuhtZN6kS5FeLLF0ijmLQUeW
|
||||
S0EjmdbBzggklxtGQkELQeUqQ3KHluJCjggDHTB6nHbOKo3XnZD+p5D8iHyXu0AM1a26Gsa1rmvpusEC
|
||||
7oVx7Lr/AIOjwovD2BFgZYzYY2ygzaPKd5j5XSva+LU8xuaZNOkuIoAtJaQTySJSUpPMrGOhyfTPQnrt
|
||||
07j61jk6cnlWAvbuenTPoen1rjuT7qeYc3vjfABzj8/X3z2qOLzdDEQpbz7bTWVgLcWEhSgFKCUAgrcW
|
||||
UZIabC3VHIQ2rBxqRQyTvEcTXPeeA1pd+NWR+B96VhnngxonzZE0cETN3SSuaxgHu5xACtWtb2lD6AXO
|
||||
ZKYiVpHMAApTz4URlR2PIkflkg5zUUr1AnBTzjt0WkHsfb+dX7UNx01dmwiW/OW4hvkTKt7akOtJ5yoJ
|
||||
U3LWyhwAg7KaVgFfIttRViM5lktCgoxr1emlbFKpNphPDJIJ+Ri6RuUjC0Z80/iSocoJSrqPR45GYUEM
|
||||
kUsT42BrvMa0AmydQ+KwHWTuBXG/K/NXi90MvWs7Mxc/Fy4p5RIwwPc8htNGk/AB8FctcRVfECsmOoEf
|
||||
Mnmx0zl1O+R25lK233A29e2CtSsox+0xn/crt/7h61gP3HlBJvspSwdkfdKENkdSVO/faiDyhXKnylcx
|
||||
ASFDOas0nT93dUryLrbENpGwmfeTT6io5BDbEGY0By8pKlPgZOMlIBMwIh3o+m4Ffn8vwVUMjjVGu2xI
|
||||
222O/Fi/82kWZq1pIUQsDHbKRnCiepUT2PasFuuuE/OG1lRJIwkpyN/9pUrfJznGcY6kVW2jQEKermv2
|
||||
sYiWwRzxba1Ij55uYjlnXePG5VD94CI8kbZWCUkyzY9J6WswBtESJKeCC25ODqbi+vY8/wC2CnkNLI5V
|
||||
KSwlkAqxygVG5nU24lgY2RK5u1tie2MEcjzHNAND+UO/vZ+jeF5Orljn9S6diRuIsSZUUmQRtxDG8uDu
|
||||
wEpj+agT/nIjqHfbKF//AMj+tX2z6xZE1lxt5TTza0loupIQtWd0KyrJSsDlUBjKSUkjOROMiTzEgHp7
|
||||
n1znqNtuvXv0rHJ9ptl2HLcIEaSopWA6tpKXklSUpKkPt8jzauVCUlSHEKwlGFDl3jmdfjkJZNilrCKc
|
||||
Q8P2dyCCxgII7ah6q0yfZ1PjaZsTqzHzRva6NxgMbWuADgdbJZK32vSdx81lMG4InsIltn5XUcwBIPKs
|
||||
E86SQN+VaFIzgBR+YDFZLCeCilR6p5So7DOM7+2Rv+u21YTboseA0mNFb8thlIShBWtZ3K1EqccUtaiS
|
||||
rqpROAN6yuAdwP8Acg/pj+9R8QY6UmIFsZcQwEDZp2ArsadZ9NlaJ3Tsx2Nnc187YWea5v3HSNaNZbe+
|
||||
kuuro16KWLCoqWgjAB3333VnJ7d8n88ds1MkAgR0A987/mahvT4J5CDjCWx33CuvQj0/zFS3BWfh053G
|
||||
Tjpt/erJjbNr2G/yAH6lVHMcXPcdh9L5PzCyu2n9sn2OP1B/vW6fhjscjVXE3QulYjnkytSans1ijO8j
|
||||
bnlv3adGhNOcjr0ZtXIt9J5XJLCFYwp5pOVp0nthJeTn0P8Ab+ldi3gAhu3XxUcA4MZlElf/AIm6Smus
|
||||
rUylJiWq4tXSe4oSCltaWIcJ94tAl14oS2yhx1aG1ZiNU0f/ADOr5W5vf6+nZReS7RjzP2+GNzt+KaLP
|
||||
p2C9qlKUq5rjyUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlK
|
||||
UoiUpSiJSlKIunH7djgNB4zfZ7cS9SR9PKvWs+Bl101xY0pIipZRPt1vgXqFYeITypK1tLNmjcO73qS+
|
||||
3aB5i2JTtgtsv4WRPtluLXgz4OvKY8RnhidBwGfELwjfJOSkKZ1vZFoykYzuNtxj0OcV+nr4jOGM7jZ4
|
||||
fOOvBq2XKJZ7lxa4OcTeGluu89p5+Dap+utFXvS8K5TWY5D70SBJujUqS0yfNcZaWhv5lCvy2bfqFGit
|
||||
bcN9dOc/laG4k6K1a8W0JW4WbFfoVwcDaFIdSpw+QChKm3EqUAFtqTnEF1eMkOLRvJC8enxNoD8nD8FP
|
||||
9DkAliDjtHkxu77NLm/lYP1O69BHHG4mVNWwF7qedVgZ7qJ9d8ZH8TioJjcLJmqI/wAS2paQlKAlJSVo
|
||||
3HMV4Chkp2BHToeY74kvilJMm7EKySHncnIwMjbGNt9zjOxB23rJ9JSHGLQ0tkcygQTg4IGM5CSCFYzu
|
||||
Ns/nXAJyTPMCbp9b/XlfsyEOZiQlpq42XQ9uxFcHn3vdSF9k/wDZg8CuOvjh1jqnxhX+FxZhcMtK2zXH
|
||||
BngJe9MRRw61my5dFw7jctbRJ1yuEfUlq0HOet6ndASLdJtGrJd1jXXUE+42a2XjSs/3OR340CPHhxmm
|
||||
IcSMy3GiRYzKGI0eMwhLTMdhlpKW2WWG0obabQEtttpSlCUpGK8M+muIl50fqjTWudJ6jueiNd6MuP3v
|
||||
pXV1mcZTPs09TS40hKo8lLkK5Wq6QnHrXqCw3SPMsmoLJMm2i7wpUGW61XeVwE+1x0dd7Jb7Lx+sFxsG
|
||||
pIce3xJWu9ExjqfTGo3gWGZl3l6WtzY1fpqX+0VNkWq0WrVlrS0xNXEurLqoVnduvR+vQtgbjZemIxUy
|
||||
N4DWRlvADiKDXCqt33ubs0OM+MPBeY/Lk6p0xsmY3JdryYA4yZMclDU5mo3Kx3Iay3NJoN00V5bXfHPZ
|
||||
/Ap9sR4lPFRI0pb+IDHCHxveK6Rd9JSLg1bHLtbb/wAY+I+hbuqBPksTGIV2g2m+SplqfdYWyi4Q2Uue
|
||||
W0t5yrH9uh9tHwH+1M4h8DL9wb4UXrhnaOEWktV2i66l1+/pdOudXzNXT7FN+6X2dNXS8Qo+mtLqsj7l
|
||||
l868ypEmVqC7vGDawSJcgfbneGPT07xFay8bfhnm6R4o8EOMNlt03xAWLQV6slx1Fwn4nQLZO0/qHVOq
|
||||
eG9lstpvumuG/ETTWnbfqS4a2upvrz/EhfES9ayuljg6m0gbl5sZvC/Skt52ba9WPwYK8OMQn7excHI/
|
||||
yJK0GaLlB85sqyppRjIUlpSW1rfUgyHbbjZkJa4+Y17XOsPYQ9pJDQR8JcfQ2R337KnZnRMrIjxTBHom
|
||||
ii8ubGyHMxpW04uD6ndG3TTi0gEutoqwbEoaS1fBMydebVcW7fe7czDXB1NbpgbuFrdTIJbYKUu/CT40
|
||||
1gSGpMG6sTYK2G3FNxm5SWJLG6VoukjiJo2yy9U2oW6bqexPX+2yWDiFqGxxNW6p0N/zXYFKW4tMIau0
|
||||
Xqe0eTI5n4VzslygSDLiojz5+onAvgFrLjprmy8GeB9hXdrxc5DUrVGrbmFsac0fYm1hFw1rr2/NtLjW
|
||||
HTFlYW78OwnM66ynI2n9OQb3qu8w4Ny9OfiF4FcDmfDVwG4S8PdQadk3/wAM1jiafsF20+xabbHv9slW
|
||||
uFG4ozdSotClads87XGoLbB4oatukqQi6zdVW15ZuL8m+3YXSH65HjSMGS2SOHLgIkgfrAe7SWnRXLtd
|
||||
/C0bk7Dk3ZfDGRl9PyI+lyRPzsDMa/H6jExrpcaHzbHnBxBY3ygQJXn4SwOouaG15zbbcZlgvDcqMryZ
|
||||
tvkZSTlSCtCihxChkBSFgLbcRkZSSnPKTmfmuOtrbt7Zu+n30KaaKpMi3ykKQtwYBUzEkNhSAr/SqW6o
|
||||
Y3UdjUE2Oy3PXGrIFjsrCVXXUt4TFgR3HMNpkTHjyh17lSEsNFRLzxSkJQFLKeXIG6Wp/s+eJzVrT92a
|
||||
20LKkOJCpDU9d/tzTICAoBl5iz3NT55jghbEccvzHuE7PU29Hk8gdWdEJhGA1znPa7T8JNuYa06thqJb
|
||||
YdzvUL4fyPFOP+2Hw55r8Rs58xrY45InOB2pkoLQ4sAssAdVXsd9c79xu09MZeRp223J2apr5Xrg0wxF
|
||||
ZC8hLvK088/IKCd2i2wlQOQ7scRTHXdNTTC49JW85gqeeeUA2yhSiUobQnCEAkrLbCAhsfNyhCMqFr1f
|
||||
w81Twy1FO03qyCmLPYQlxl6O4ZEC4RipQRMt8vkQJEZZSUklCHWXUuMSGmZDTjSZE0PAS3YXri620Vvy
|
||||
3ylaM+YqNGbZSlLyin/zESHJXKgKWhKFIIIUpdYnxYHSenvyunsa582nyZi4S6g4gWHnUNNbgXvVOO5U
|
||||
lgz9Z8X9eg6T16edkGNqfkYrWDHA0AbOja1tue4gF7hbQ6mkWv5C0TEWkuSpsxQTyLBjqZZSoDOUqS43
|
||||
I2Jx0UCM7EbYr4fD6DcpAYhNz5B5kpKzJSeUr5iASlpIwOXYYz+LJzgG7tTfi3AwOVCCoDlKgjb0JOye
|
||||
hI5lJTsQSK2W4aTtFafdK5SZuoJiGmXXbZYILt1mBTjgbKFtRguRzBwpbbS1Ge5lqCRgqAFSn6v1UU4T
|
||||
y33AIq7BNBoAAFDkfkurx+EvDMDA1vS8UtF0ZQZHdibdI41Wx3KhWN4dn5LYWPvNAW3zJKH2xhJTzZSF
|
||||
x1jOcqGeYAk5SrNU0zw4SkJKm5s8KHVUhcNxO5AyChhkAYJBB58/u8u4O70rj5o5PlRGeFvEtnCQ35ju
|
||||
gNYpCQAAFKB0s2AD1JUopHdQzmsTuXFCyygtw6V1nCZ+Xmem6R1JHYayQlIdkP2lptAUpQSgrUOZRCBl
|
||||
ZSk6w6z1pv8Ax5+3Lb400dwR6dqXk+G/CU9307p5Ar7j9FbjvG/a+O23otDrvwRv1vStbUtL4SflbVF5
|
||||
MJ2Cip1EhYzkggJZGdxkkbx1P0fqK3FYcih0DcFtfKSMkDIeDaQojfCVKxsAok4re+78TeHbS0NXC8Qr
|
||||
c484tltm4vtQ3XH0A+YwhqSWnDIRulxkJLrZ6oBBIwe93XR13iFyDcIbgeSVNOIUhYXzk/MFp5gtGPXq
|
||||
M5wTUvj+IOrDSJgJRQovjDWuFtBNt0k+ove9uSorK+z/AMKzlwxxJjOG5di5TiRwRtK6QCrsDijYG603
|
||||
+9dQwlAOPTFIazyolJ+MjtglWeUSkyY6FfMpWQAtOVLwArK6+Pqo5/6uG2U/KCuMtTZGSorWpt5TyXVB
|
||||
BIQhCmB15lgHIkq72xEd7nBSptwlTakkq5weXfmGARuOXdW3XHfGZdmhTEcrrYS5yqAeaAbcCiAObKcc
|
||||
4yFEpc50kqJABCSJZvV8XILW5mEw3VvZV2aBNffAG16X88BQMng7q3S43TdE65NTQHNxsjeOQCtnDUY3
|
||||
E2auKgSLIslVUG82mQAUXCOhTgSS1JX8K40NyA4p8ojqUdwfIfdQFAJ51FSCrObYEuHmaWh0IABLS0uJ
|
||||
yr5iCpBI2zgb7kHatZboyq3TH4SlhxbCyklA2WkjmQSDnlykgqAKuU5AKgOY4uLw/wA4LZWsIdCCEqAc
|
||||
ByMOBJweVOD0JJzkfhNTMXTcWtcJeGuAcw6rFOAcKoA187O/PIVJm8X9RZI6HOx4DJC50Umluh5ew6X6
|
||||
tywkEG6bW49LPYzp9v5knm6BO2PQI9/9v5Z/WSo0lhplCXXW28ZyXFpQN99snf37jrjetM2NZahSFtMz
|
||||
kMssPSI6G2GmOUstPLaZ/aLDvP8Asm0ZUCQpXMclChnkho1bfStMRN7uKPmDvkfFvxwADzJcKAppAVyg
|
||||
YXgKVsVFR3k4sQtBBeO349//AB/gWhP18SH91iSOJ4t9EX/yBpJ3O2/AB7rc1zWGnbQlS5t0jIJaWUoQ
|
||||
4lfPnYJDgIaCsndK3EkVN/hw8bunvDtxm0FxOt+i53EN3Rt9TcG9NsXkaedu7yo8mCiOzcxZtQIZDipP
|
||||
Ml5qFNWpQDaI6yoEdels4VaxmuNqkxo9taWVAuTpLRUSMAgNQzKeyeYFPmIbScHKkjlKpKTbNJcKjbru
|
||||
Ly/ftcxZCJtvZZQxGtdjW3yqiTZSMSZDlzYfIl28tTG0x1ojyHG1r5ks4MzJxsBjZXEySFw8ljbcXSAg
|
||||
tvgAA07U7YH6BbHT8TrfXXux2sjxMUs/3maUBrY4nENeKeQ5zyLoNAJo0QASv0TPB74k7f4t/D1oPjvB
|
||||
0pM0G9q4X+LdtDXK6s3m6aUu+nNSXbTsy2z5zUG1rdMoWxq829cm1WyU/ZrrbZb0CMZAbGzVfmu8I+Ov
|
||||
EvRusEau0ZxD1rovUUxhdukX7SGp73pi7O29yTGnvQF3GyToE1yA5NgwJa4ZkGOqXCiSSlT0dlTfvT+z
|
||||
/wCL+ruN3hZ4e604hagVqfiDz322axu7kOyW5x+e1eZc+0NuQbBHhwY62dJ3LTqFFUCHJkkfGvokKkif
|
||||
LmeldUfnMDZofJmDLNPD2vIoOI+FpaTd6fiA3GrYXV/EvhhvQz52NmtzcZ0ujeEwyRlwJbY1ytewaS0v
|
||||
1NNlnwmyRufSlKmVUUpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESl
|
||||
KURKUpREpSlESvzh/tjvDS54fPHT4h9FxrdKiaS4h3xzjRw+cft8K2W+TYOKCn9TS41hhQCIjWn9Ja6c
|
||||
1boO1hLLKi1pBQWykklX6PFefz/iCfCfb+N/h24e8WtNQEK4ucKdZyLLZy2G23NTaI1TZLpdNRaYfX+z
|
||||
U/NjXLTNpvOm3JLrzUJ1N9t8WO27qWRLZ0Oohox3TOIAhIeSdhpJDSCaNXYPptv6iR6WJZMuOCFjpJJ7
|
||||
YxjeS8AvbQ7kURXuaBOy823BXiWnibwh0TdpMsytQWe2R9MaqQ9IL85u/WBpNuekzipIIfu8dmPe8/MC
|
||||
m4hIWopONodFXBCm0RQsBxBxg8oCgc4GCB1x/TOa6SNC6z1Twl1PLu9ladeYlKXF1NpKc+uDEuq4wcaa
|
||||
W6pTMhdtukCRzLZmIhOOoBejOtuMvPNq7IuDniR4X6ldjx5l4Z0neHnWWfufVbse2OLlPEssswbit1Vp
|
||||
uBkOpUI7UWcqcpPlmRBiuONtHiXXOhZeLlz5METpsOdxla6IajGXGy1wFkAX8J+6W1RvY/qLwp4x6f1D
|
||||
puPg52QzE6nixsgfFO4s84xANbIx7wGuc8CywODw4O+EN3W68zTyLo0SnDS1bqHMcKO52GMncE7Z9d87
|
||||
xld+Ht/bUpUCU80ASU+W6UpWScqIGFJIKgTuMgnbY5rYG3PNORm15yRnOcHqNhue2ff0qpdAWlWFdRjo
|
||||
Ns5HY/7vbp+lbII5BHzVwEhF6XBw23HB2vsfdalyoHE6CENpurstttJS2xMAmR0pVlJBiyvNjEEbZ8k7
|
||||
9cd8KGk7tIMpErRGhHG5anUyW1aE0WUSkug+d8Qk2Ah7zuZXm+aFeZznzArJzuvJYSocykoUTsTy432I
|
||||
2Kj1wdxj3ztVvchNuDBbSPoE+mK9tke37r3N+TiOPkUc5j61wxPr+ZgPoe99x/neBdNWK9QGGI0VFusM
|
||||
NLi3vgdP22DZY3nPhBkOeRaWIMYOPFtHnr8ol0IRn8CCOHjffI/DbgdxHvrjxalSNNTrDa1JeSzIcvOp
|
||||
UfcUB1hJDhkOwZFx+83G0IUoxob6iWmEvOt7HxLO0FBRSDnsAE4we5BOentgZ3HWunfxscfLLxO1DZdA
|
||||
6EuyLto/ST8iXcLnDVzW/UGrHPOgJdt7m7c+2WWEH4ttuscpiT3LtcnoapdsFvnSJjouHJn5sILC6KJ7
|
||||
ZZ5Hai0NY4OIPpqqgNwCSeyq3ivq2P0rpOTRjbk5ETsfEhbpa90kgDC5oHxaWWHelgDVZCxjwT6UdvfF
|
||||
U6ndQFRdIwwWHAVJULrfUv2+OjCcN+Wbam7KWXCshaWi22VDnR3Ravlpi2t0k4Ja3T0yOTBJ9cc3T+Va
|
||||
ceGnhavhfo6xwp6FJ1Be+XUuoUupUhcOVMYZ+Gt2CogiBEDbbik5SuWuSsKLS0VOGvr6VRlNBwH5D1PK
|
||||
VdOgynBAz77dgDnD1/qDc3qc72W6KINgjN7VGKcR83Fx+os+m94N6JJ0foWDBK3Tk5GvMyW1uHzgFjTV
|
||||
05sTWNcDRBBXVv4yECVcNHTkAZC9Qx3FbhSgv7ncaCU7o5UqD5UeYKJdyOfB5Y04ew0z9N2+MgcyFuTC
|
||||
6E75cMt5HXYbpCME7cpB37zR4n4Ttw0vEmsp8z7qvUeRKI5P2UWYzKhLcH75JlvwUBKVpB5uYg8oKYi4
|
||||
DSWn03SAtalPQZjEtKSFBIjTmktpS2tZKVKbfhSVueXgILzBKQTzLsuM8zeF4a38iV4PuC6/Sxs9u29+
|
||||
uyqz424f2lzteC0Z+EzyiaDXFsUWotutWowPvjvybrcvg74f9H3VTdy1HFEmNEfamKLzr0dK3G1eYlpa
|
||||
GpDaHmFqSoORXkusOIIbdbWjmqbNcausdjjs6e0xBg2q025kQbdBtrEaHBjMNpKUIixIrTUdllOcobab
|
||||
QhKfwo3BqLbJfJUKMW2nlhCkpC08+ObHME5Oc4AKgRvnPXbFYdqZp+bIeeaWsBRKkJKiQATkgj2V0OPX
|
||||
oDtSpZZHkhz3H5na6FEDtXfc37d+naBqs1pAoNAqvcm9+3Ycc83QXbV8lbi1FZGM4wvc78u+AfXoDjIw
|
||||
MnpiD2rHiVczivbp/qPrk7dQO9WO4tTclZRlAz8wwc5IxsR7dAcDIHucUfefSVAsudRuBzZAVg/u7ZA2
|
||||
Gf5V6aCD9470L9PzWQhrSRpb+BHv6rL3dalhzZ0jYfvYOwB/0KxuT16jHbFYrMs/DzUbq3bppayLmL2N
|
||||
zhx0Wy8pSovqKGrxavgrqwnzHlvp8iWAiWUzEckppt5Md3SW+24RyugqySSFJz0GBsemTnfqR6VbGLtI
|
||||
aWCOdXsok+p2PUHfGf8AtiXjZI0gskcCALLDpJGxHxXxYv324WnOIJAY5oY5G9hI1rgCNgRqH4jg7eiv
|
||||
U3hVco/ks6S1c7IipS6pVq1klycpTgadXGbiX+3iNMjNLfDDEh25QL7LbZdelIec8luC9Wu6Km2zLctU
|
||||
ZxSW2lrdirfejqWptKlpadkMw3nWkOqU1zORWFL5AsISlQFVtvust/BbSsgkfj3zvkY9j02PXbrisymX
|
||||
L4e0SJU4hLEaO7JeW4QAlpltTrpPmqSlISlJUoqWkAAZO9ZnulkMYGhzrDS5o0udZABeQQXG6HxbmzZW
|
||||
lFFDiRzP1PEQZrIe9zmMDQdRYHuJY3TVsBDBXwtFm9INZLbOpbm0woKEZ74dWFBQDrSeV1PUgFCsoWCc
|
||||
pWlSSBy1TaR0O9qa7R0FC0W1h9py4Pc3loCAoEttdQZLqOdDPyrLeVOKHKnCqCS9Iu9zflIQ2qTcprjw
|
||||
aayAp+Y+pXyBQBw4twE5SggqJ8tCcAbP6OgM2i3wbegpywgF1e4Lrzn7R93Cvm5VOKUEA/hbCGwSlCa6
|
||||
L5v7NBjR8v8ALjb6EANa0u+YJA7c87r88YuE3rPU8/Nk1DHbkyzGhs50kmprNztYuzvtt3Uu6fsNoYAc
|
||||
atcFLn4y78I0Xi4VLJWXlJLpVk82VLUrKic71JMVPKgnOckDp6Ae/vWKWUZaSPXH/wCRrNo6MpRv2J6e
|
||||
o5vX3xWVhNWXEk3dn39Pw/AKZfGyN5DWtaKFANAAWMav1B9zxkttAmaplS2BzYAeWMBSlA8yPL5g4FZ3
|
||||
UAnGcZ1fvkxLTEu9XWW8WUukurQFPvSpLzqeZmPzqbbW8EKXIUp59lrykKJf85xht+f9aWa4akv0e12x
|
||||
PMtLClvuKS8WokSOwZU2Y8Wm3V+RDjNOyn+RtxYYadU2hxSOQ6z8THmJNzj2C2NqTb7YFciFKzIcWo5L
|
||||
8peAlb7yv2q1JSEJKuRlDbKWmkaGcY2tMsgaWsFMve3E9uw9+eOykOm+dPM3Fx3uHmuBe5tUGggbkE7b
|
||||
mu299t6vhtrOffNeWy3woDkeJKmtIgwHVIlOpUVhLTbkwR44dWpZSpw/DIbWrmKGmwQiv0nPAJoCTw78
|
||||
KXCm2XKDHhXm72dWpLsqOY6vvBdzcLdnuTrkV59pTkrTESxFCFKQ/GjoYhymWpUd5tP5+f2evA248aPF
|
||||
Xw10XbUxwp+/2Rl5+aViAxJk3CKxGTNdaZfdZjOS5EWNIdaZdcbS8opbcWPLV+l/YbJbNM2Oy6bssdUS
|
||||
zaftNusdpirfekqjWy0w2YECOqRJW7IfLESOy0Xn3HHnSnndWtalKMx4cLp2OySAGaA1gG+7jyDwaazf
|
||||
3dfe1TvtA0Yc8fTWPLy2TzJbNm2MAo+xdJYu70ciqV1pSlWlc2SlKURKUpREpSlESlKURKUpREpSlESl
|
||||
KURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURK0I+0ltLNy8L9+kOKdS9ZdSWG6xPLKAkv8A
|
||||
JcLY4HgpC1KaEO5ylBLaml+alpXmcgW25vvWqXjeifG+Fziu1n8NusSgnBPOpWq7E0lOQRjC3Uqzvnl5
|
||||
cb5EX1pnmdJ6i31xJj/2sLvb0U/4VlEPiToch3A6phtI33Ek7IyNrNU7deGzjJwf0NrO4S58y2ptd6dW
|
||||
txd6s6WocyQ6VrJVcGwgxriXCEJcdlsuS/LT5bMlkE50j1N4eNX24hyz/CapjEr5kxsQrg0lKlBLioUx
|
||||
0NrC0BGERZUp3zFKbLfIjzVdlvEBCo1xlN5/A4scoAwP2h7756/wqJUzOR0HmwcnG/odyebGQcjPUb79
|
||||
RjhOJ4g6l095jbKJ4W1UM4MjBz90k6mgdg1wHp6n9cdV8B+H+uwefLjnEyyP/wArDqF5Li0kyNAMchJO
|
||||
5e0u3oEAWNC7NrDjjwdMduzaj19omGwVNxbVO+8BpwFTiXOdmwXhl/T8hxwwOVLybe6XY7DjQccjl5C5
|
||||
ysfjt42WwNN3WHorUbYWn4h2ZaZ1unushHItLb9quUaEy66fnU6bY4hCiQ2ylOEjZuNeCUrQVBaeUoUC
|
||||
chaXAQpKxuFBQyCCDlJKds1QyLBw/uYWu76L0nOU60GXHndP234sNpJwlE1MUS2wP3Q08gp2CSN8yg8R
|
||||
9NyT/v3SYi7b44qs7AH+EOHHOonngqlO8Bdc6c4/6R4lyGxt+7BO1+loH3RtI9jga3/dtobiydsAifaJ
|
||||
3RlJTceEkGXII2XC1w9BQeUrzlp/SlwWcjkAPmpwoKPMefCfqb9o3cDHeFu4Pwok9bawxKn64euEVpzk
|
||||
IbU9DY0pa3n0JX5alttTo6lpSUh1tSkutyTF4M+Hy9lhU/QFu5m0lAEO66gtSVBRH/mJtd2hJccwBhTi
|
||||
VrSDgFKcgydprw5eGtiS1MicNLbIeSAfLuF71ReYhBIV+1t94vs6C9jGAH4ytiofKlRB9jO8LUX/AOmT
|
||||
l5PIc7SarucjTY3/AIO/zWM9G+0FtR/65hNjrd+hheBtZsYodz/zChwb564NZeInxFeIGU5o2A9MRAu0
|
||||
ZxhWheHNmmxo0+OhpSZiprjSrlf5sFxjmXco0+6vWZLKFOqjRmQ4qtguAfhIc0rdI+ruK7EN26QFty4O
|
||||
lG5DM6LbCn9sl68S4okQJF0cIDcGBGdmMxnD584ktlqN2EzDpHSNtcsOjrTYdMJccS5Lhaes0K1xiUNo
|
||||
YSksWyPGj/EJbKW0lxKPKQ2plSkKS20rDZDypCkxIQeLSFKVl1AbcfVnC3nQFrKFFIQfLDjiUIKE55gp
|
||||
S9DqHiU/s78PpuLHhQuAD3Rm5XAtFgObWkkAtdyfQgqxeH/s4DsyHqvXs6bquREQ6Jkwd5DA2qeGPc4v
|
||||
5BaPhaCAdOwKuUBSnVybk4EpLqihltIISlvcfLg/KkbYSQB0xgACox1lJLi1pKwNyBlRUPw4G2QN8Gs+
|
||||
mLkxooa8tQSlKU82wzypySQOmdh6H1qIL9JUtboc3SCn5cnBBCQe3v8AU9qqjLJO/pe13yuq/s7CSR90
|
||||
aQNhs1oFCiCdq9jxtwRr5xFtSL1Zrpanigtz4z8cKW2lYacWlQZfDZyFLYdCHW8YIWgEKGDjQTTt8ufD
|
||||
jV6ZMiO/zQpCoF6tyeUGVBU4kSEtha0NuLSG2pkCQHWm1uts8z5gvSUP9j1/aC0uJV25k5wPfPXPpWvP
|
||||
EXhNE1Wz94wFogX1LaWkyF8wiSkNhXI1PQ0hxzDSCvy5bTSn20BDTofbbZQzd/DudBFHLh5QH7LkiiTv
|
||||
pefhv5VsQBfpZFLlX2geHc3MlxOtdH+HqXTXtka0HSZI7D9N8OLXXTXENc1zmnagpr07qC1aitcW72Sa
|
||||
3Ngymwtp5AWhSTgc7D7LqUPMSGjs9HebQ62rHMkbGssb8qQktKwRtuRnGebBAOD+YOf1rrIizdfcLLu4
|
||||
4wqfp+Y6lCHmJDKH7Xdo7CnFo5m3A7CuDTSn3g3KjOKejGS+I8lh5x0medP+J9pIZY1Npt1pYazImWSS
|
||||
l5tT4yf2UCWlt1tLgCeQqnOhK1hC1JbR56veb4XyQTLgOZlwOtzS1zNdGjWxDX87adz6DvF9K+0Hp8jR
|
||||
j9cZL0rqDKZM2SJ/lOeABbTWtgJN09tNHDnCidsX7FHeBBQkhXYb4G+2ck9TtuMY79axyXpOOVKIbB9C
|
||||
UgkfMRjpk7f07CsLtPiG4aTmkKevrtrW4tDYautvmsOJWoKUQ442w8wlKNgt0veSNgHDlPPlDfFTQkpt
|
||||
brGsNOKZQE+Y6u8QY6UFXN8qlPOpGflPptyqGygagn9N6jFYfjZAO3/BeR24dRB57c7Veyt0PXuiztD4
|
||||
uqYLwa2GTFqAPNtDiQRtYq91jVy0G1ISoeWnOVDBTkjcp74we53xtj6Ys/w8baJIaSFb8p5emAR/qPp+
|
||||
Xoaz5zidoo7o1hpQJX15NRWkFQx6JlAHYnv039axi78XdAW/mEvVdqUpPN8sZ8zlEBSgCEQWpCiklspS
|
||||
UhXMcJBUSjn2GY+eXaRjz2eAIn1tXoG0OAeas/X3J1fpLGFz+o4TG1952REAOD3cP8G/CszdgMHBWG2y
|
||||
kfMSCT0O4yc9998VCnGXVbVvtLenojilTrqG3JJZdS2uPAadC1LXuHB8W62WUJSAhSG3kuKCVIbeuus+
|
||||
PllbYdj6Wju3WY5siVLZXGtzKVM8yXeVXLJlFDjiEKjp+HBw4ovEISl3Wdhm7asujz0l9cqbJUl2ZOdC
|
||||
lIQkAp51kfhSlKQhhhJDaEAMx0NNNpbTaekdKljkGZngxRxND2skAbqeCKNUCADvuAboAchc58V+LsbL
|
||||
xz0XokhzcrNHkySwtL44430HBjwKe94JbbfhAu3A8ZFoO0mRLdujmCzFKmmARs5JWnJcBOx8hpRJTjZb
|
||||
7awrLe2xlhaPmISDzEnGw78p2G+/p/SsAgxo8CMxEioCGI6ORKe5JJKlrOBzLcWVLWrABUSQADipP0s2
|
||||
pZ27Z9OqiSOpHoalRMczJfKTTfhawbE6WuBF8ck2PS63reJhwR0bprMbU10p/eTuAFPleBrF86WbNaaB
|
||||
NXW5Uv2aOEpTynYAE7Dfc47jqT+WazeHHW6tKEbrUQAMdcg75+pGfr7VZLTH5GAtQ64AG3QbH/Mdc9s5
|
||||
kO1JbtkGbe5DBkot8WVJRG5w2ZTrEdchtkOhLimAsNO8zoQ4UJBUEKxyqmB8DfWu/F7/AFUJK/UTvZdu
|
||||
B6ce5u9uw+XCjjXF9h6ai3y1W9aUyHoLStRTMBJXJkLYmtWVSwrzRGtTLbCpMN5KHG72JzL4d+ChqRpZ
|
||||
Gj/Fvz73NJUlJdlLUonPKnmShGAcgKVypR+LdQznpUu69mSHEItpkOv3G7PrkTn3XFPSHXnlh2RIkPLU
|
||||
VOl1XMtxxSiVOPKJUohRVbrRou56tv8ApPh1p+OZd51RdITJjoHKUtOSEttpcWVcraFFRU4pxKUttgOr
|
||||
5UBShX+ryumlgwozu8tLz6A1vXau9+u4Pa8+FcaPCxMzrOQB5cELvLLqAe+uBd7k0APrvvXpB/4c7wxP
|
||||
Sb/rbxI3xJjmyxlQLEyVFuRKkakZutsS8WnITjUq0/Cxrz5rrcqJKjXa3W4NefHXLbT64a1O8Efhzt3h
|
||||
a8NvDnhPHipj3i32iNctWrSlCFPaonxY/wB4JWhm4XKGlUJpmNbXHIEkQ5rsN25oZZenPprbGuh9MxG4
|
||||
eHFEBpJAe8cHU4DYjsQ0AEeoK/PPiDqTuq9Wy8su1MdI5kR2rQ0miCOQ5xc5v/KQOyUpSt9QyUpSiJSl
|
||||
KIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJUZ8ZNCjiVwt1
|
||||
zohLYdlX6wS2rW2qUYTSr5CKLnp/4mSEr8uIm9wreuWFIUhcZLra0lKjUmUrHLE2aKSF4tksb43j1a9p
|
||||
a78iVmx55MXIgyYTplx5o54nb7SRPbIw7EHZzRwQvBZxohm3ahurCk4KJD2QcA7uKAHfoMH0yTjrtrTJ
|
||||
kEOOJUcZAAOB6b5zj1/zqe2j7UvhQ5w/8R/EF2HGVHtuobmrVFvCWfLiFvUraL483D8uLFaESFLnSba2
|
||||
202tEZUNUYyHyyXXOoOavleXk4IxnG4743IHp9PfavzZ1XFfh5+TBJ96OV7DtW7DpJr3IvlfvPw/1CLq
|
||||
fRsLOiILMjGhyG7g02aJpom+W6iDsNxx2VX8UpJBCycZ9f5gk/XPWviTdVoHKpZJOcbg9AR0JHr9OozV
|
||||
mceCm1DIOMZ6bZ+h/n17VaJb+Enf67egz6fyxUeBf05+Xc/T07rJN/8AIfTevlZr6LN7XfH/ADikKUPw
|
||||
7g9cZG+22MAAg4xjHQ1PelNSuMR+Vt4BXItQWCElAShxfNzBWxJ5UBXZShkE7DVa2uq8wcpyr03GR83X
|
||||
A6A4J2NTDp6S61Bu8dTfMudZ5bENwFIVHuLRbmwFJLnIylEqVEbt0h55aG48WdIeWoBGRlFggc2APTjb
|
||||
8yQFhdVAkWAQSPUC/wCnKnOz3yIA+p9QcU44MKyVHlRzErIVgjm5vc7bnpUr6RFuuK3X8tciQAgJ2Uoj
|
||||
JPU7jcdMDod+3V3J4gXq23wWW4MT7ZcTanb0mNdI8i2OOWpqAu6CeyZiIyXortubXKivNlaZjamhDU+t
|
||||
9hDkw2bilqjRohu3u33W2M3CMJtvVdYUqCJ0ZWT8TFMltvzmVlQPO3zowttXNhSSr5+yZEYL3xuDDXx1
|
||||
t/557X/S9yHNgl1RxZML5q2i1iwBRoguJHarAGwO4FLfXVUOKiC6UBOw5lYJB6bZJ5u2cYAwd8b1p9qq
|
||||
ay1Id+ZOQVDYk5IUcn8JHpge4x1rH734jHZ8ZbXmpQVIV0UM/gPQgjt6DuDt317vvFWO866tcgZBAxzY
|
||||
OCQNjuduv5/r6Zj670tuqvYd/os8cskYcXuA4rarB7bED057eyke6XJHzFS88x+XptjOe3uM987Y7Vao
|
||||
12WysLZeW2pAUeZClJVvjcEEbjG2c4yR6Y14vfFeIhRQHUuKIIHIoBJwRk53B7dx1z12NnRxVZKFLyRt
|
||||
y4LgPUZ64x2wNh65GN5eLDka0aWloO/J9udue99zXAoKMyMyIl7dbSW7uGqtz67d9xsRZo8UBsbfLlZt
|
||||
QMvQrra7fPce8r4dEmLDcjOSULBaRJiuxzEUXApxtDqg0426pp1x8tIdbc1rv+itCysutQnrStRJK7ZL
|
||||
LbajjYLYmiUyhGTzcsdDBJRgqwVc3PYtdpuWoLTHbcz5tygBWQkgo+IbK9t+jZWo7jKQd+mceut3fluv
|
||||
PPueYp5115xRCUhbjqytxfKhISApaiQAAN8JAGAJYHLxGRujmli1k6g15GotDSDXF26qojgAcqoS43Se
|
||||
sS5EWVhYuR5TWfG9jDI0PLrDZGtLm/cHDu5HFhY47w4tz/MYN/cQpKP/AC5UFLnOslWP2zclrkRgAH9i
|
||||
sg5UVHmCRbXuF90cVyRrraHEEfieXMYXzYOR5aYj4wP9XPv6bGrqm5lOfLPXr1HTp+HOep61kkG4qSgH
|
||||
dXNjBB3Gx6gkkj5h3BHv0raPW+pRNB84P4+/Ewk1XJAB9O92NlFP8C+F5z+7xJIHHl0WRNRsbbPe8Djt
|
||||
VWVF7nC6+jKg5Zvp57x7E9TFr+t8MrqAFPTbU0OqglclxY77JMZKDhPzbOAVLr9xWEbA7jO/bIO3X+P8
|
||||
KsMma6ckrx03OBn8Pqf82rMOvdRcD8UTarfygT9PiPcDsbPHqcR+zrw2z4iMuQCvhOSSNq9ACPoeLCwk
|
||||
cPbfDKVS7o/LKUpISwyiKjIJwnKnJKikbfg8sn1yNskYbiQWBFhstRWUZ5UNgAZGxUsqUVuOYA53HFrc
|
||||
UclSyrNUEuatzZTg6jGw26DuD6+tUSH1E8oOebGfyO3UH17Yr7+1ZWS6p5jIK2bQaLPJppA4FDba7tev
|
||||
9I6R0gOGBhxQyHZ0p1SPPsHyGRwBB+L4gCd6WVRlgu4Tuodt+4Pt71NOkWFpKFdebAwAe2AMHockY+u1
|
||||
QtZGvNdQQO4z1/3Ht7bY26e+2xWlIeQyMEpAyduXORzH2ylJ36j5uo7z+DCaJd6No1Y2FevsPdVXqs4O
|
||||
oXudu36fM+9EEcqXrXHWpEdr/UAVbE4598YyM8vNg9PyrI7/AHlNhbZtraedb1umqltDnUSzLj/DqQst
|
||||
gOtpSwJSXFoIKI8l3mUlsuKNVpqAlTyHndkMo85w4z8rZyTudgcY7k83T1hPU2r3n79qe4RHWVvOxLtp
|
||||
+3tLQpSXWbjb37NJdSlt1CmnI8SZIkMrAWluY2z5zbrXM25uumEcckjz8LG6jx8vbuQoLGY/JmZE378r
|
||||
mtaOaJNHf1F2T7FRMwE3C5Xe/wAz5YUV11DBWPlSxHOXXEbjKT8jSOgWoBKFDeu+j7BXwgPcVeNd28T2
|
||||
tLbz6b4cLalaYafSpKXdQOuvN2EtcsyLKQmI5GfnNSEMzoD33RcLVcGgJrRV0tcI+FepOOnEfSPCHSES
|
||||
TKN3ucGNcTCjPS3nEreQFR48eOC5Md+flZjMczkySpqG2VrfaFfoe+Ezw5aY8LHA3R/CPTTLSVWmGzM1
|
||||
BKYdcdZn6kkxIrVzksKcbYHwyPhmYsdaYsMym44nyoyZ8yYtzU8PYDs3Nl6hkN+APDmNPFfwir3stB4r
|
||||
SCCOFI/aD16HpfRsXw9gyAyPiAncw2L0jzDY7tB2N2HPHOlbJUpSuhLgqUpSiJSlKIlKUoiUpSiJSlKI
|
||||
lKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoi6ZPtiuCjeqeGGmOLkJD
|
||||
rlw0vLTpC8oQh57FmuIuNytMtISktRGol0E6JIdWpKpD15t7SCC1hXkkv8X4SdIbOx5lAjAHQq6AE7An
|
||||
1I/r+hNxq4ZQOMnCnXXDK4vCMzq6wyLfHlq5y3BurDjVwsc95DYK3mIF6h2+a+wnCpDLC2QUlzmHgu46
|
||||
aPnaT1ZdrbOiPQpkKXIiyYr7LjL8aTFecZeYeacSFoebcQptxCgFJWlSVJCkmuP+PumGLOjzI21Hlxlz
|
||||
iBf76Ita8c7W0xuPYlxPYr9N/Y51/wDaejzdJmeXS9Mn+BpJJOLkW+LfatMjZoxVlrWts0QBr0tzGe3L
|
||||
9Dnr69On8e2KskqZyK+Y7E4265wem56ZGe+c71cH8pCyQdhnfbOADWBX+4ohx3X3DltsYSAQStalcoSO
|
||||
+VKO5zkJHMflBIocMT55WQxtLpJHBrGjckk1VfMj5LrWZkw40M8872xQxMdJJI40GMY1znE7dgf8JAUq
|
||||
aaW3IeCsZ5kgAqG+cn1PTfGQT1xUjtau0zb+ZuTqCyRHCOUolXaFHXkDcFDkhJyjmHMN8EjcZGdErlqG
|
||||
bdCht6QW4yUhTMVBKWk/6FrH/wB5wYyVq6k4SEIAQLM5LaQQkKC1HOACMkj9fUZxnH5VeMfwQZGtky8s
|
||||
xyObZiiYDoJN7vJ3q6NAb8HuuPdR+1iNkskfTemiaJpoZGRKW622LIia22NNbEvsitmrdDVHCrSnEGLJ
|
||||
MORFmMSXHVrSxIbmRA+4lLjgadjuZjOFKmiClQdDfl/tAClVanar4Ta64ZNpZ0ncrxL0w3M+Ol2FUqR9
|
||||
2Pyg2phU163JcVEMxuMVR27j5K5jDA5FOqbyhVmTNXFUl2O64y+DhtxpwtrQSMEpWhQUDy5AIUCM5+mT
|
||||
QuIOrLfH+Fa1FcHowSEojT3hc4zQCVpCWY9xRKZYThZJSyhAUpLa1ZW00UbP+ymVjDTj9Qjni2HlZLC1
|
||||
jh6amueRYr+EgGjWwWsz7S8LJc05fSZsaQAf7zhStfIHAinAPZGSDR2LydzuLXxK0RxDn6cj6o0yiDqm
|
||||
3vsrMu2We7W+Tq2zOtMOSJqbvo8yRqSLChNtuF69/dirC7yf9LdHwrNRS/o3ivcIztzXpO/Q7MyMztQX
|
||||
GFKhWO2MpI8yRcLo+0mHEjNBYU444+nkBwASUBUrTdVsXZDiLvZ7ZJ8zKSuL5sNfIoucyTkyWyrlUhCF
|
||||
BsAJbBcS6tRWMHNn0U44px6yuFxKwrLbzLhOOYAl1UVCgrmSUkjccowd8V5i6NlRUJOm6yN7hnj0n1A1
|
||||
U4b0d9+fXaWk8b4GUxoj8QCAH/5GZOBOZWjb+OHVGTtyL/RQ85eo/wAYu3WSwRtUoKoaH71fzfoi5UiO
|
||||
l5ySLJbLHd7O5BtLzz3wyXLy/cbpco1vg3NDemHZs+wtZDfI93uPlqY4eWnSoSQWl6an6uejP+YxGQ4i
|
||||
YnWOpNXKcS2tlb0ZEV+3OB2bMTJVKjiEzClWJd9P2z5oOm47KsAApnISRjrkiGVKB22KgkKyo8xVXG7r
|
||||
d3cIgwWVdEhXmuEb77+YjmPQBXLt2Hrm/YOrPNNwoY2ivhfLET/DtYkI24N2T6kgLW/2i8Lta5z+r5Es
|
||||
jq/eRQZANjYk+YwCz3FDuPZYVoS1XmzXFq4P2fz3DHmxkSbg6+liMmZCkRRMhohSIjzN0gLcEyBIekvx
|
||||
RJbaEmFJaCmXMykQmFo/8xaj/u5QNh/tz+XTBGR6i1StUSloPzstbqOUNnOPq664Mj2AGCSegqwv3eQ6
|
||||
CTIc6nCW+VsDPYcgScdtznfcmvb+i9RyS0zugiEYoMsnTZs7Nad7Are/W6WtF438PdPbJHix5+RJI7U+
|
||||
R0bGlxbQFlz26dIBAAFEWSASbrJkEx1c7aspTnCQN8E4xnm/LGD2z0ObnaXQs+WonIwMnbHoNsHO3fp1
|
||||
3rCXbmoZUqQpZ35eZ4qPXJ+Y8xHX17bVcLBd2lTBFKgVv58pYI2WBkN4wR8/4U8qj+05U9VDGrl9AyoI
|
||||
HytkjlDG6nBpOoNGkmhVnY36+t99/pHj7pedmxYskU2I6dzI4nyaTG6R5ADXkOqPUaAdRHuO+cS3QnJz
|
||||
0BJ3Hrn169vrisXlSslXzHf6dNv9x9T/AF6nNbdJRZSdwSvOdyCAPoTsc98dD1zgYRJnLKlBKhgbd89s
|
||||
9SR7AYztgjNQsMevk1ddgeL9/b/NlfMrJYxpBdQocb3uD8xQ9PXeu9a9KwsAnc/wH6H6em2M7GvuK6HV
|
||||
4zk7ZO49RnBA/ht2rHVOlxZJJOe5/M9P8xWZ2KEVrSrG4UCTt3xgdRsN+ue21WDBxi67/GuOffv9du3r
|
||||
R+qdQDdQDqNDsN+3YADYfmpM0xDU6tsY2UUkjHbcEAg9R1274wDWz2lLYoBtRBBISpQ374KU5CgCSMFW
|
||||
dwSPSov0TYifLdUj5ByEHlAyrGQcgDYDOc9BjI3FbL6XtC3nWmgkqweoGyl4JOd9sbH2JG9WJsWkVq49
|
||||
j/dUbJn1Euuu9+nf2/8AAs2Niv7q67jSeiLlOSCmbNZXEhAHlcC1pSkrQokYLfOlRGR+JolWDitRE3lU
|
||||
xmBZYZU84FvrKkZWt2XM8pt1ZJV+FYbQjA5QQkH8XMpeYeJDWoe4gDhzbHSuPouKY98LZdKP+YFIzNhL
|
||||
DgQA7aXSm3yMIwJkZ/kceaLbh7N/sj/s6b/4ouJUXWOsEO2fhlolcO+6inuMJXJmLdecRaLLbmHkOMLn
|
||||
3Rxia6y/JbVCjMW+ZKebmmO3bp3lsLp3/s4ZrDiG16gEEiiNuNzewskilhGazpsRzXv0Oa0yBwoEbU3b
|
||||
1cCAAN7IA3IXbN9iH4DDomDO8RXEvToXcZkaIzoRu5xOZpE1MoSHbtB530EvWByL5SluxJUQ3abHciyI
|
||||
950w8ln0k1ZtO6esuk7FaNM6ct7NqsVht8W12m3MKdW3Egw2ksx2vNfcekPrCEAuyZLz0qS6VvyXnn3H
|
||||
HFXmrfiYzMWFsTQL5eQKBcfTvQ4aD2HqSuV9T6hL1LLlyZS6nGo2uN6GDgelnl1dye1JSlK2VoJSlKIl
|
||||
KUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJX
|
||||
lA+2F4AJ0Jxsumr7S26u0cSYp1whRakKSxeLlNnNajhKluDy35CrzHk3ny2flhQbzboywOVK3PV/XXX9
|
||||
pj4fl8bfD7PvNsYXJ1JwwTctRQ2E8y/iNPzGIyNUtoa5kth6Kxb7de1SXCfKhWacw2hxyUlNV7xP08dQ
|
||||
6VOGt1S448+MdyGgiRvPeMudXdzWj3V28Ada/wBF8R4r5JDHjZl4c5umjzCDC4/KYMbZIpr3EmrXhsub
|
||||
Km1upzzHBHQDc7Doo49NyPzqAuI84MNQ4oJPnOOurT0GEJDbZOx/EXHR6DlOUqzlO3GutOyLTcZsR1Ba
|
||||
U06tKklJGcEpOMnbfc4JGCPQVp9xbjlp23L3PP5pB5fl5G5MbmAOSSR5yuuwKxvuc8k8OwBvXccPF0JH
|
||||
NBFWWsc4E2NqNe2oDkWF+i/HeS8+E898RsSNxmvcNiWPmjBAN7auD6i+9EYzo3S8/XWp4tjiPCO0tCZF
|
||||
znEEfCW9l1Da0NcwWFyZDjrbMdGFKClqdUhTLTxG6WofDboK3ab+JiuuKuce2R7laxMZujcDU7SXyxdI
|
||||
f3raLom4WS8Wt9DKPJci3e33NMp15+dpuMwiPL1k8P8AIKNazDlPIdPl5wfLkrTc4iUnOyuji9ublOfm
|
||||
CgBjs+0IGNbaenaZcfbZu9mc+87BKcxztJfUEyoxwUrVEcdyiUFFxv8A61tamlqjMpMr1/quXF1Y4rZn
|
||||
RwxxM0NYXs+J7QS5xY4Ha62IG3rarngDoPRpehxZ+bhQZRmyX/tLpGRueyBjw3REZGva3Yarcxws24EC
|
||||
l16a70he+GBt8XX3CS6aNbvMVybYZ9/07NTB1FbeRh4XXTl4uiX4WorU4zLiyIt3s0yZCeiy4j0eSuNJ
|
||||
ZLkVP3XT8nmP3dbwlWP/ACmGmuhJ/wDs8g79senQkH1weB/xAcJZvDiH4SPERpPTN/t3xa41p0hxSt1v
|
||||
1TovWXn3qTd7bGsZ1FAn2GDOtD7qI9ptF0dajONRLenTMx67hi1q2N4mfZKfZo8e7tfYLfCORwg1pdLZ
|
||||
Hdcm8KtR3vQNwsioC4EV96Doae5duG9tktspiMyUvaFUia5cpU6RHeubyZzOKCUysa4ZcocQCWvle6nU
|
||||
CQ0l1k8WDXYUAt7qMmF0/Lnx/wDRYJcSOR3kTNxYRrxw8eW+SMCgSz72lzg06gCaoeHCTN0+24559vcU
|
||||
lQADsWa/GkxyFheY/P8AEQcLISh1t+FIC2S4htTDym5LOCy7vBaa8pnznn1gebKcdSApSVLw5GjNnlip
|
||||
cQU+YzIkXAhQCkOoyc+qbjT/AMN7w8YkLuXCXxUa203ZmYuV2niBoGya7nPSAt1xUhvUGmtQ8PIjLHkl
|
||||
DaIqtNvr50rcM0IWlpvTCd/w/XECOyl9/wAUGkksrCF5a4e3lbgaUkErDatUNJJCDzBCnUAqHIVp/FW8
|
||||
zKnhHxZ9AV9+Q32ofEbIvhoO3Nb7RbsXoWe8Ts6PG54aWgMxS1tOI/gYAwk8tc5pdYIBFldBTt7IJJd2
|
||||
GO53yR3I2/TP5Yq0u34c5AcOMn95Rxueh5Tn9RXfSx9iZofSc1MnX/iL1FqS3hSGn7bpTQNt0jNddecS
|
||||
yCzebtqfWbCUIK+ZQVY1FaBnnbzV4Z+zb8Jug3pUqRB1zr9nyFNpja21h5EaKpKyoyGV6FtuiZZdUlPJ
|
||||
yyJMljk5j5GyVB/tBGx41Zr5HNO7WtcSOBwQAbocGtiD2CyjwYMtodF0KGJjtw+WVsV1V0Guc8epJaDv
|
||||
tuF0F2hV71NcoNksFsuV8u1ylMwrda7VEfmT58yQ4Go8WLEitvSJMh9wpQwyy04464oIbSpZAO2+hPC1
|
||||
clpZn8UUXO3PvuMogaLtz6E3mR8TFLrS7vJQJCbYpEt+Kw5Y0w1Xl4puMSU9p+Wyw6/2at6d4e8N469K
|
||||
8JdKadsj8hry5ybExGE96AicVNu6j1NJdcuM6JFmzUMx5WorzIaiB5qKw62yltmo+v8AqW0aQiSbpOdj
|
||||
zr8tiSHOYq+Gt7SSvCIygC4pZaSFSnFNsvu+cqEhlEBp/wC+0niKWRts8xods0yECQnYg6WAhosXZLuR
|
||||
W9Xv4HgPpOHIJM2PHme1rXHHiaZIWuO41zS255HOkNYLu7bagvifwW4Maatlq0Oxou0NahQh+46iu9vu
|
||||
F2dlwnHm1t262wri7c5ZfaixVhb61uSG56240t8OrffSvq0nNO2K/TYLcsSFW26SYbctKFM+YYch1CJa
|
||||
G1OLU15nlJWlHOrkK+UkhKVK35uOp5N1n3C7znlOyJ7kmS86Vf6+dWTsOVLYwn5U4xgYBIJ697hITIu8
|
||||
2SkEIkTJDoSSCUh5xagkkZB5QsA4647VueG58jJlzjNO+WMNjIY9xe3U7WHEarrYVyR68Uqt9omH0/CZ
|
||||
0d2JiwY00k2Q7XBG2JxYzydIcGAAgONi927gcqUrzOU9EYkufIqRFZeAOQCXmg4opyd+4JHQdCTisBdd
|
||||
Uc79cnftv75/z1q7XeWFKajpJKGGm2QAcjDSAhIz/tCQCTvnt1zY0p51Ak9CD0znPTv27VpY+O0vdWzS
|
||||
95bz923H1HrVqy5+dIIMdjnXIMeLzCSSTIGM1kmt99zx6XuFd7ewXnRg9xkYB2+Y75z/AKcdDuR+c6aM
|
||||
sqpEhoEblaNgMdcHY46jtt+LBztgxrpy3uOrScHGQRhJO5zjoR67ddgPWtr9A2FLafOIweVOSUqHVJGQ
|
||||
OY+2QNtxt3qx40LWtHJ7999X19vzVGz8x0ji4k8DbfuD3oCzt2UoabtQZQwwynOyUDA3UeilnCicZIG+
|
||||
SANs713z/ZOeCa3cadbz+KfEqyrncMeHDkRUS2TWJrEDWWtpIW7b7cXkIRHn2bTbLSrvfoaJoW7Kkadg
|
||||
XCLLtNynML69vBb4XNWeJzi5pzQOnWXosSU58ZqPUAguzIWltMw1NLu19npQpLQbZbcaiwG5D0Rm4Xmb
|
||||
aLOmZHkXZg17cuEnCzSHBPhzpXhfoWG9C0zpK3fAwUyZC5UyU+/IenXK5zpCz+0nXW5yplxlhlDERp+U
|
||||
tiDFhwWo8VmcwMXzn+Y8fuozweHu5DeeBsXc9m8Eqldd6m7GiOPG8jImaNxYMcRsOdySHPAplcAuINtF
|
||||
9SV2/wCH++zvmcULbxIs2nuLGlLdGdtL944aWnihc7zobVci33Vy5zn79cNdQdYcTW16jbUi13sWHiLZ
|
||||
EJt7KF2NFlujkm5SO4rRWiNH8ONL2jRWgtM2XSGk7DG+Es+ntPW+Na7VAZK1OueTEittt+bIfcdky5Kw
|
||||
uTMlvPS5Tr0l511eU0qbjghiLnRxsYXGyWgD8PQewoeyps2Xk5IY2eeWYMFNEjy6h9TZPubPulKUrKtd
|
||||
KUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlES
|
||||
lKURKUpRErjeZZksux5DLUiO+24y+w+2h5l9l1JQ6y804lTbrTiFKQ42tKkLQopUkpJFclKc8oCQQQSC
|
||||
DYI2II4IPYheNz7Snwtr4J8ZNRQ7bDdTpm8OKvumX1Bag7ZLmt52I35q/nedguNybNKkFKBIn2qU42lL
|
||||
biSehTjfAXFNq5lFHI9ObyQeVQWYSxzfMAnJbODg7HfGAK/Qc+0C8MqPENwclybPD+J1voSNcrxZI7UV
|
||||
cmTercY4duljZaYKX356vhmZtnbSiW45JYkWuLFDt6W+14WfFnoWXY7PMkLY8s2e7RXH+dOFpDjjluKd
|
||||
0qIw/Lb5gpTQO26lgIrl2X0z/SvEeNK1lQTSkw1sC2dpY5gIsAxucW70dgapwvv+D1//AGi8B5+PK8Oz
|
||||
MTHiZkg/eLsV7JRI4DtLHGHh3AdqaLLCFrJwXd8rW0pajsNLzUHGUnBu1pOepzuem2+N/TdHSusZGl75
|
||||
DujJUr4dfK60FAefGWpPmtlW/KcpQtGMp8xCM5SCDoJoa6C26rs0payG5Tyra+QBjE5KmWVKOdm0S1R3
|
||||
VnshtRJArbQuFSSM74JA9wNjt1G+xGxBqteMIns6qycfCJIWlpA3DmkhwJu742Pbj1Fv+zOeKfw5Jj7F
|
||||
8GTM2Rl76ZGMc13/AEuogGty07bELscL+n+JFnivJeQh9TKJEKW0MOx3FpSvKSeRa2y4AooUrZQBSsED
|
||||
m2t4UeP3xGcEIB0nrwRuOGhPhkQ4cbW8y5/802ZuP8U5AFm19BdGpfhYkiQgtWu9SLzBjxA7CtqLUJKn
|
||||
U9MehOKUnR8xuJKcKICnwUuLWpSI4WrKgtO58oLKllSASjnOQds7n2riNYrxEYTKkQwmYUstNPOt4eW6
|
||||
hTiUM8yiHStpKnEJaKyptJcTlAK6iIpXluqKTQ87upttdX3i5rtQcDWwI23rilacvFi0mPKjjyMe7ZZc
|
||||
JGHY22Rp1N3rfb1uxS7vdI+Pbwv8UojUXUGvuJ/BS4vKTHmwNUxIeqrQYzsRovJtl+s1ubW0pD7cuE2/
|
||||
cokha1yrbPcjBgT4UWp1tc7RIiOy9BeLbhddLACtq2M3eVb0XBMFH7NoSlwL3JW/MZHloeebtsVuYgKn
|
||||
oYhsqRHHRVfLLaHUmREdS0o7gAgoUc52CjzYG+QSSfXoKwGW5bLaFGRIK3P3WkfMFAbZUQeXv0+bAJJF
|
||||
enudICyWAF+3xte5hux/DemrBNBt8HvZ8YuLjwfFiZT2Riv3UkMMzQQRXxPZrF+pcTtXZdlfEyfphLE8
|
||||
6h8TVonyfPjmxnRtp+PagSGn1oly7za2rpNmXOKthSUxmoUq2uIklMv4h5DBjuaZao1HpBCZoRqDWGrn
|
||||
+Z9Px12kx9M2ItNutuRn/gGEzLzLbebDrb8Zdws7raFoUl0L/BrPcddRoQV8O0lSzz8qnMcrfccqcFJ2
|
||||
J65AOACDvUM6o4gSJHm+bNKkqVugKwnOSBsARgb7YyMnGAcDHBjvJ1AFhcf/ALCtxRNdu5B/tKuytTC3
|
||||
UJA3+U0BY/ladO+myPXvspb1bxPhRVSbbp5mNAYcccW8uMhxLYJdfcbJW+t6XNcZRIcjsS7jKmzksKbj
|
||||
qlLabSkaea614q7TFW2K6pbLDv8A1joVs46hRWGAcr3bWAt45JS8lDeR5TqVYLqziN8Qp6JaXSt5YW25
|
||||
LQoKbYBPKoMqA+Z3AICkhTbecgqc5SMHiqU235i8ZUSdwfmG+VFXfJJ3wckdcnAlWQ+UHOJJJ02TRJPB
|
||||
O3F7bfQKN8/zHODbLRXw9tyAee+xO+2++1g5beb2YlmnLB3MR3lwro4pKm0jPL/uznoT+tastEqmoCt/
|
||||
n5l9cYQogn6DAxn1AJHeTtZ3gtwUsIXs6rzFY2CkIKCM7DbmWOYb5GPmBGDEkBS3Ja1JX+Fv0H75Sg7q
|
||||
J/dcOCkAhQBSrJCTc+h4/wCzdPlmIAfLb27US0DSyx87o77EEdlxjxtnt6r4mxcNj7hw/KgcbsGR7xJM
|
||||
4bDgENIvYtdwslW4p5wqO5J9c9QD/ff2q7W6KpbzeBzEq9O4I22PuBntjPeqWJFJ5QR07Dr06Z33JAHf
|
||||
B+m0l6etHmOtq5SAcFPUZB6K6jO2e5P5Yr1jwtFlu241WDv8RNCzt6E9weO62c3MMji6zvy6zRoDttx2
|
||||
+p2Wb6LsSnnGk+XkDlz06nA23xsNvTODW8fCHhzqPiDqvSnD/SFscu+pdWX21afssBlyOwqfd7xNj26B
|
||||
FD8p9iLHQ9LkNNmRLkx4zPOXH3mmkqWIH0XZPK8tLaMurUlIATkoyRslI3Urc79zt6E+v37GrwPM8NtF
|
||||
xPFHxDt0dzWeurU8xwutk63SWbho/ST7k633HUjnx7LIbumtYyQLNKgMlKNGSFSWLrNiavkwoEzi47pp
|
||||
RG07EanOr7rWkWfcm6HvQ9xVeqZ7cOF876Lh8ETO75HC2gm7oUS4gGm2a4B7D/A14Q7H4QODsXR4ft96
|
||||
19qF1i98QtTw4jLbcu7CM2zGsNqlqix7lI01p5Hnotn3kouSrjOvd7bh2lN6Nog7oUpVqYxsbWsaKa0U
|
||||
P7n1J5J7lc1mmkyJXzSuLpJHFzifyAHYAUAOwACUpSvSxJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlK
|
||||
UoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJXl4+2n8EzNksetOL
|
||||
mirOgaT1vb7tcbjCiJUo2jX8KPK1AqK0woBDMC/uW370tqWnFNxZTV4jIYhQYsBt71D1g/Erh5pjizoL
|
||||
VfDfWcRybpnWNnk2a6ssrQ1Jbae5XGJsJ11p9pm4W2Y1HuNufdYfbYnRY7zjDyUFtUf1HBZnQBpDfOhe
|
||||
2bHeR92VhsAnkNfWl1cbOG7QpnofV5ekZbpBbsbJidjZsIJqWCQFpNcF8d62cWQWWA9xX5UzThbKik8r
|
||||
jfKttYIyhxB+RQBHUFPv19s1ulZLgi8Wq3XNsBAmxI8ny0kKDa3W0qeZ5h18pwqbJAxzBWBUP+KHgPqn
|
||||
wv8AiF4ucA9ZNvffPDLWd008ie9F+C+/bESidpPVcaIXXlR7dq/Ss2y6otbTjhdRbrvFDvKvmSm88Ir4
|
||||
iXaHLM6oB+1LW5H5jguwpTynds4J+HkLdbV8oCG1x0AbZrnfjHCc/CiyQDrxpCH7bta+g4kg9nhoI+tr
|
||||
sH2X9Vjg6tk4D3hsXUIGuh2sGaF2prRxWuN0nuaAKz6421bocWjdW6wcdfxfKd9iAdj3xg4yDWIp1PeL
|
||||
C2qCtuNdbUoFLlqucdt+Kts83M0lLgcKEkuLwjBa+YFSFDIqUeQ9iCP8+tY7drLFmtuJKQlZGxA2zlQ6
|
||||
e+f77bVziGTy3h18fO77EEbiu9UTx6rvUkLJQ5rw1zXCi17Q5pHoQdiNlb7bxH0BBbStm3S9LS3nX35C
|
||||
bVKvNsjIde8pBUldknR2+VbTTSQhDDCQlA5GxzLJ+9RcXNK3JtoSNQu8iEOJ5WLxe2PMS6P2iXkxH2i9
|
||||
nG3xIK0AlKClPOK171vY5FlmIUXFeRJb5mglZ5FKbUpKxyoUEjCPJVkDdSyTkgqVFk9QCHVkIB5VZ+U/
|
||||
MSD1IOBjGRkED67m9Y3R8nMghy48xrxKzVb3PBYRQIBAN/d+8SVyrP8AGHSOj5ed0ubpLo5YJQyoY4jH
|
||||
MDpc151FhF21zbb3+dy7fNbaIhrkfddsN2deXzuF9cmUzkpwSl27uP8AIeZzJQywEBXLn50J5Y6u+sr5
|
||||
qEqjrKYkZeAppkrK1pH7rriiCpG5y2gIQTy7ZCRXxbNMTZUaLJfACJDDchKikjnTIQHRkkAkhKhkYBSo
|
||||
nBIwo5C3YIsbBIyU5223zlPXt1ztn06VoSv0Pcx7zO9riNbnarogEtNggfiTR7gq04cDpceOSCBmJDMx
|
||||
kpjjja29YDwH6QOznA04b3YHfGrfbnCEqc+UBQVnsE4wSRkA5AOBnbuaudxl7hCAcJHKkAg5wRnqSB69
|
||||
u3erjNeS0kNowkDsMDYnbv6gkduhxWE3OWG0uvqWQlkZAykBTqgQ0MlQwUqBWcg5APvWfGgfk5MbGmy4
|
||||
gccCxqcaNkCrNUANzZWDq2dD0rBnyC7eOMuBui47aW0Qd3EgG9/aisI1TNEiSphCspRhv1/CMEjKjspR
|
||||
Jx2IG9cthhKUHnPxcy0oGwG7aVKPU9wsY3yMnvWKOuF59bizk5zzHbO5J2ztk5O2evsKmPTVqWm2Q1lI
|
||||
KnUB4kjqHVFaD12+RxJ7Dbfer7IwQ44ibxTWjtQbp4/C9/dcC6fK/L6nLlzOt7jLO8kXb5DV89tRoDcq
|
||||
ttduUpYQlJIOObb/ANWOmffOc5z9AJ80lp5S/LeWjlSMZKkjA2VgDb26dM4BqyaU007IWhzy1KTscIbJ
|
||||
UQFFW3Ko74UQM/h67k4r0S/ZcfZS3LxESLPxs47W6dY+BFukok6f09+3t114rSIzoPIw+2pmXA0W260W
|
||||
592YLUq7ELhWV9pJeucbxDC97xHGNTnflXJJ3oC7JP8AVSudnQ4sb5JnU0Acck1VAbEuP8I71vV2vv7K
|
||||
/wCzRu/iNu1u4x8V7ZNs/ASxXEfDMPfE2+dxSuNtkFEqxWJ9pUeZH01HkIch6o1RDdZcS8iRp/T0pN9a
|
||||
uly0v7DkIQ0hDbaEtttpShttCQhCEIAShCEpASlKUgJSlIASAAAAKttkslm01ZrVp3Ttqt1isFit8O02
|
||||
Wy2iHHt1rtNrt8duLAt1ugRG2o0OFDjNNx40aO02ywy2httCUJAF0qzYuMzGZpG73UXv9SOAPRos0Pqd
|
||||
yubdQz5c+bzH/CxttijBsMb3v1c7lx+QGwSlKVsrQSlKURKUpREpSlESlKURKUpREpSlESlKURKUpREp
|
||||
SlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpRF5fv+Ij8BF94
|
||||
jaX0141uFOmX7vfuGViVpTjtBtDKHbi9w3hyJFw01xCMBtTLsxnQ86ddbZq+dHauNzZ0zdbLdZiIelND
|
||||
3a4W/wAiGkL67Y7gxNZ5S42SlbKipKH2VjlfYUpIBHMAFNqPOlDqW3ChfJyK/VluFvg3aBNtd0hRLlbL
|
||||
lEk2+426fHalwZ8GYyuPLhTIkhDjEmJKjuOMSI7za2nmXFtuIUhSkn88r7W/7Om9+ATxAPz9JW153w1c
|
||||
Wp9yvPB29IlzLkvTbrIYlX3hhqSXOCpce86WflqXYJM2bcVam0k5bLqLtMv0fVsCxw/U8Rksb9bA+GYF
|
||||
kzTx8W3FcO9eQ7vvSnekdQmxpoXwyuiyMZ7ZYJG8gsOoD0Og9u7duAb18smp7XfGUuRJSFuhCPPjLUlM
|
||||
qKsjHI+0TzAbYQ6kFl0Alpa0gmrlKwUqIIOQf4gnp17/AJ1pdAvb8NxEhiQ6y+hIDciK4WXgOvKVJIyg
|
||||
jBLawttwHDiVJ2q/zdfalmkk3OSxvkGMtMVQ2x+KKljnz6uBauwVgADmWX4OecgnFyWMxybImDvMjBr4
|
||||
RV6wNzqNd7XeMD7V4G4Yb1LBldmsaBqx9Ail5+N+twMd7EgahudPCuPEe9mffn4jbgVGtiExG+VRUFPJ
|
||||
SlcxZz0Ul9RYUnJSBHTygFSqh64OoWlTedlBXMdjj8Q9eu52P69arLjNysjzCpbij5ji1FSlKJypRJzl
|
||||
SlElRzk5333rGJMpPNuob56q674PUZ+vvV0xMZuJjQ4zKLYo2s2FAkCnGt/vGydzyuR9V6jJ1TqOX1CS
|
||||
w/JndKBd6GE1GwHio2gNFdh8lOVguJn2C3PKJU6ywmK8VHKg5F/Y8xOBu6lpLuFJBCXEHc5Ur5mPhHNl
|
||||
Q+X1wM7j1H6evTrUNWvUs20tusxn0/DvOl5bJCCnzClKSpJVzKQeVIA5SPlABzyg1c3tULmMkuqbSoAk
|
||||
lIUW8+yfNcSnYb5e9MDcmqrldByv2qR0HlujkkcW0/dgNmjqqg29qvnYHddf6V9oXSm9Lx4Mx88WXj47
|
||||
GSkxue2Z8bAy4ywk2+rt4Y0EnegrxcZuSpCDlas5OQEpAByScY2z6ew9401PcEDyoTCwtKElTixtzOK6
|
||||
kjJOE/hSDn5Uo3Nf24X1wJcQF/iSedRPU7b+mB27dPTfCWy9cJSGW0KcUs4KR8xORsQnHMcKwPlBOSAe
|
||||
ozYum9LZhgvc7VMbsi9LQeQASCNxvY+XqueeJPE83WneU1hixGODmsJPmykXTn/w16NGpveztV+0/a3b
|
||||
vcYcJpPOHH21PklWEx0ueY+VKBB+ZtKkpHMOdakIBBUCN6dBcLbvqSRGDcF5xpxTaW2kN4ClOOIbbQTk
|
||||
JBUtaUoT1UpQSjKjVZww4Z8POC2nYmreNM8OaqujMK4WvhnaFNydWv2uemK9CcuzbikxtPRnYTyLrzXp
|
||||
2I9MjlKYcaWtDYXZNaca9U8Q5DVjt0aNozSB8lsaW0868hmYWjIxIvlxcIm3iQ6iSW3mVGNaVJYjratT
|
||||
L6FvOe8rOhZI1gJe47AM33vez2Av0J9t176L0bMlgfMY3QxyAOMsoLRpbu0NBALjuST931JFhejD7KD7
|
||||
M/QPiQjO8bNe6lsl74VaE1r/AMrv6LsT0iZN1jqW2afs2ppFuu13abYt0DTDEXVGmnpTlpl3iZelKu9h
|
||||
eFhdiKmO+uO22232e3wbTaYMS2Wu2RI8C3W6BHaiQoMKI0liNEiRWEIZjxo7KENMstIQ222lKEJCQBXV
|
||||
l9ijpK16X+zo4KTINtiwJur7pxK1NfX2GlNyLtc2uI2ptLRblcVKSkvTBp/TFjtyHRzA2+3QUBSuSu1q
|
||||
rTgQsZBHIG0+VjXvcbs6hqA34FHj6mzuue9ayJJc/IiL3Ojx5XwxtJ2HlnS4n1cXA2TvVDYCkpSlbqiU
|
||||
pSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURK
|
||||
UpREpSlESlKURKUpREpSlESlKURKUpRErUjxw+EPQPjg8N2vuAOu0RIb19hru2gtXv25Fyl8O+JNqiyx
|
||||
pLW9tZ82LJUq2yZT8G9Q4U+2yL9pS6ah0yu4RYl7kuDbeleXNa9pa4W1wIIPof8ANj2O6+tcWODmmnNI
|
||||
IPuF+TdxI0Pr3gtxC1pwm4naemaS4g8PtR3XSertNz3Yj79qvlllORZsdE63yJtsucRS0edBu9omzrPd
|
||||
oTse5WqfNt0qNKdw771V/r/lXrx+3d8GvBTjXxYuGvdCWyTonxAQNKWS4a71omXcH9LcSXkW9qy6e0/q
|
||||
OwPwwmFeNL6astkTH1tpic+VWu4Jsd7sV2l2m3O2zyI8QuFnErhfLej6psUyPEbcWhm9QfMn2OWkOvtM
|
||||
uNXGMFNR1yRHW83BniJdG2FNrkQWC4hKqtLNjRZTsQ5EXnAEtYXU5zQatoNXR+E1tY+SuEGFnTYLeoDE
|
||||
nOKSGOmZGXxsk0tdpeW3osODm6qJaQa5Askq4JDhKiok5I6YIycYBOR0OTvknr3rHJs0qWn0HMOqsdQf
|
||||
f9ds1YnrsrPzY74xgZ6j2PYdR3O+2TZZV0UvBB/Armxnscbk+3r/ACr2tZZZ8aT+I59Bv/UbVwOXhGB8
|
||||
yiTnJGMn6lRJ7+tYM/dXl7AqIzv8xx379z+RBB61kumtF6z1aR9y2WdMZyUmX5fw8FKgnmKFTpSmonmc
|
||||
vzeV53mEY5UKOQny5zWNL3uaxjQS5znBoHzLiB+f0KzQY8+TIyLHhlmkeaYyKN0j3H0DWgkqnXMckOcj
|
||||
YUSshISnJUonIwMDofyGPoTWyOhtGO6Vjx73OKRqZSm5MKKEJdNkCAlTb8pJ8xsXTmA8qIpJcgKDnxSG
|
||||
piEMtZFw74FyNPSGrvfXI0+6NAqiRo6FriQXgXP+o811KVypSUKbLB8llEJ5K3W/PfTGktTknSRQFAI/
|
||||
FjPyZ6Zx3Pr/APNVnqniKO34+E8OH3ZJgRuDViO6PqNX1bRojq/hbwBI0x9S62zyy064MFwDidhpfkdq
|
||||
BIPlb7gayCC1QfLhz7hLkzp0iRLnTZD8ubNlvLkypkqS6p6RJlSHXFPPyH3VrdeeeW4464tS1qKlEm82
|
||||
C0qFzjc/d1CRsPXJO6vYenf2rZTQfALiLxNlKiaF0fd9QlpxDcqZFiBq0wVLLf8A/vvMksW2FyocS6Uy
|
||||
ZLay3laUqSCRuNo7wCq06ti8cV9c2yAiPzPL01o1P3rcHgEEobfv0tDFtgqS78rwjQ7rkIWhpxJUh2oz
|
||||
BZkTyMeyN5Ac0kkEChvyav8APb5hWPr3UOk9NjkhmyYmyaNooyHP4DQNEdlnP3jQ7kgWV7Mfs6GYkfwM
|
||||
eFpqFChQGRwe0otce3w4kFhUt2Kp2fLcZhMssuTbhOXJn3OatCpVyuUmXcZz0mdKkSHd0q8nHho+0JuX
|
||||
hL1RonSZRfdQ8CLLAOk7hoI3uRLkWmyy7pNvDmoNJs3CWzaGtWQrlcJ9zfQ63Ai6liuSLHPnWtC7bebF
|
||||
6wY77MqOxKjrDjEllp9hwBSQ4y8hLjawlQSoBSFJVhSQoZwQDkV1jClEkEbaIdGyNjge9MA1D2JB+RB9
|
||||
ifzN1KPTmZEgOqOeaWWN1UdMkjngEWacA4WLIvgmiualKVtrQSlKURKUpREpSlESlKURKUpREpSlESlK
|
||||
URKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSl
|
||||
ESo24t8Q7bww0BqLVk64W6FMi26Uxp1i5KWpu66mfjPJsdrbisLRLmGTODapTUQhxi3tzJzzkeJEkSWc
|
||||
N42eILR3Bu3FiW8i8avmMuKtWmIbran0ZZWtm4XtYcT912ouBDaFr5ps5ayLfFfZjz5MHpQ428TtdcVL
|
||||
hP1BqC7uSbglapVoioTzWmxrZU27Bj2i1uuuR40OO5HiqKTzPTnWlzLk9MnPSJbsfmZzYGvZH8UtEH0j
|
||||
JBok9z6NHHeuDv4mE+ch7/giBB3Fl/sB/Ke7jt6A9rNrSxjiZaLra75MkSLpPfl3Bq5Sn3H5Eu4zS4qY
|
||||
3NfecKnPvRxwl+Q6pTiZhYnFQdY5z0+cSOGt20lfZNtuUR5Ud119mJJcaKQ820spejSBulqWxkNSWCSd
|
||||
0vNLdYdZeX266bv0PUtpZvFvWUkqMe4QlnEu03JkD4u3TmlBLjb8dawULU2huVGXHnxS5ElR3V/GsNF6
|
||||
S4hQFw9RwyxJUlGLjGQFKW60OWO7JZ5myt5lOzclh2NI5OZl55+MpcdfP+sdK/1SK2v8vKi3gkAdYs25
|
||||
jnB16XHggfCd9+/T/CfimXw9lESMGRgZGluVju3sNoeZGCdIc0V8Owe34XG6K87GsfCBww10t19zSbNp
|
||||
mOJAVM00fuZ0HnLnN8NGH3YpwkuJU49AdWpCwkK/Zt8kND7OrTkV59b111RcY6lqMZlT8Bjym/lIRJcb
|
||||
hKEpXNk86G447FGcqV6EZfhsfgqR9wXuy3Fpa1DyJjzsKSy1sGit9+M1FcJyorSktqT+4hwKyLTL4Ga6
|
||||
aUhpFntjwcKkrdj6h06pDZGSkq8+4suKCsEjy0KIT+IBXyitM/2nwg6DXkuG4Bps9Dbdkh1EVYr4rHsF
|
||||
0d8v2edUezJMfTopdRNPJw3arBc18YMTDd92usXvuV0XQ/CTo/SrfNE0fDcWEJSqTcWl3N48is+aPjFP
|
||||
tNOBWDzMNM52B22OVtcO1w/LHkJQ2gciBycgCEpSlKABgcqUgJACQEjGEjcnuTd8NeqLslKZ8vT1kacQ
|
||||
lS1yLm3PdQVJQpxtLNqTMS442FLGfNQ2txAR5gStLhyax+F3hVZXETNTv3LWUtvkUYqj9yWcupUVYXHh
|
||||
uvXGS2MJwFz46FYUHWlIymsTen9c6g4/tDpd+XZEpIaTQ+5ZI9wBvX0WyfFPg/osX+6NxtQ2EWBAwvOz
|
||||
fvSU1nzLpCb4XUTojgjrLiNd27JorTky8y/xSXmk+Tb7eyMlT9zuTymoNvYCUkpckvo83ZthLryktnsV
|
||||
4a+CPhvolqNeOKUtrXuoENtO/wDL8F1+JpGC8UJUpD60iPcr8W18ycuLgQFBAKojyV8qNxzMtlmtzdl0
|
||||
5a7XYbVH5lMWuywYtshNlSSkvKZiIQlx0jBcdcCnnSMuOFXMTCd31hcrvLXa9IxUX2SFrbk3BUlTWn7b
|
||||
ynC0vT2UO/HSUkYVDgea40rKZD0ZZShVj6f0SDHbqnf+0yANq68tpHGlvJAG1nnettlz7r3j/qXVS6HC
|
||||
H+nYhFFsby6eQEV8corSCB91lckaiFkF91REtNtRZLFAhWe1Q2lIh2eyQ2IMJhDaMJDMOI222nlRzFaw
|
||||
guKAKlKGVKMAz9Pax108pu2uJh290ZeuslKpMZCSrJTEQ2tCbg842SplyO8YTaudL0kPtGMqdbRoF2Q6
|
||||
mVqWW3cZBLbot8Vhca0pdQ4p5tSmFvvSLh5bvK4394SZLLUhluVEjxHkpUJSZgJbTyBv5Bj5fw9znqAN
|
||||
9+ids71PtOn7uw9AB/ZUR73PcXPcXOO5JNknuSf6DstMInh309b/ADH5MVy+3F4pEi5XktypKhzeb5bL
|
||||
aG0R4jKXUlbbEZltCSVc3Osc9b/+Hbxi8dPDlbbfpB0RuKPDO1tMxLdpDVMyRBvGn7fFiymItt0hq5li
|
||||
dItlvQtUBKbZd7XqK1QrdbkQLJCsypL8tWLrtjZQQkIUN8px1Hzeue52G1W2RZ2VjmU0Pc/x35Ve2Pz2
|
||||
rYiyZYnamOIPsdvkQbBHtx62teSCOVulzQR6EX9QbsH3FFegLgv4keEnHe3su6H1PGOoEwkzLrom7kWv
|
||||
WFnKGIDk4P2eUUO3GDbn7jGgSb/Y1XTTjk5RjRbu+6lSRO9eW5FmXBmRrnbZEm3XK3y40+33CA+9FmwZ
|
||||
sN5MiJLiSmVofjSoz7Tb8eQwtt5h5CHWlocQlQ2D0N4sPEpw5MBqFr6Rq2zwXX3F2PXzDeqGJyXWXm0M
|
||||
SrzJU1rBuPGceQ/GYt+pYLbbkZhnlXC8yIuYh6swipm0R/E3v76TVe9H5DsouXpbgSYXgj+V+xHtqF37
|
||||
WB7nuvQdSuqjh79pnbnLjb7Xxc4frscR1lhmbq3Rs1+5w2JzkphlyW/pa4tpuEWytR3X5clUK+3+7sCK
|
||||
GYlsurskeR2RaC4jaF4oWFnU3D/VNn1XZXfKQuVaZaHnIMl6LHmi33aEvy59lurUWVHdk2i7RYVziB5s
|
||||
SojKlBNSUWRDNtG8OI5bw78DyPcWPdR8sEsP32ED+Ybt/EWB8jRWa0pSsywpSlKIlKUoiUpSiJSlKIlK
|
||||
UoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUqnly4l
|
||||
viSp8+THhQYMZ+ZNmy3m40SHEitLfkypUh5SGY8aOyhbz77q0NNNIW44pKEkjr546+MVppqbpXhDIUp/
|
||||
zEMTdeLYQWENpShyQxpiJLbV5zi1kwnbzOjpaaS3LXaYz/nW6+MYZ8iLHYXSOA22aK1O+Q/qTQHchZoM
|
||||
eXIdpjbf8zjs1o9Sf0Fk9gVunrribobhtBE7WWooNo81tS4kFSlSbtcAklH/AEFqipenym/N5WnJKGPg
|
||||
4y1oMyRHbJWOvXil43NSXgSLZw1t40nbVhSPv26NxpupZDZIHNHiq+JtFnC21LbcRi7y0ENyItwhOgJT
|
||||
pHdr1c71PlXS73Gdd7nNX5ky53OXInTpboHL5siVKcdkPr5QEhbrq1BKQkEADFoJJJKjknqf5AegHZI+
|
||||
UdgMmoPI6jPKC1hELDtQPxHjl9X/ANobzR1Kag6fDF8T/wB6/wD5h8APs3cH/wC1/ILmuVwm3WbLn3KV
|
||||
Inz58h+XPnTH3pMubKlOKekSZUl9bj8iQ+6tbr77zjjzzq1uOLUtRNWGSwkoW2o8wI64x15hjGfYHrV0
|
||||
UoEYG+f4VTPIKgCNynO3cg46e4x07/XYx5BIILrvvXv+qkFD1x03d7LdV6j0hPFpuriEIltOMCZar0wy
|
||||
o+XDvUFa2zJYyooTIjvw7lFQ44Yc2OXHOata4wW2C41C1pZrnp+apLpXOgRZl+0+4W0pHM1IgRPvWOt/
|
||||
lKxHk2pSWifLM19XK47ILjRWT0IPbA9Sd8mrTKsMaWrnU0Cd+vbOemBnG/TO2NuprG5umt7tFSx+JegJ
|
||||
aC6xqm2ob5VOBc0yLWhbSQCpxtd0YhpcSlKkKWpBUEBxAUU5Gaka80a4OZnV2nHRgKyL9a1fIoqSlQ/6
|
||||
n8KihYBGUqKFYJ5aoXdKQlgByK04P9yEHHTOOfpnvjPTftXG7pOC4SgxGilOwHKjoSodCvbPp715RWa4
|
||||
8WNGMOqhwrz9/wByUjnatummXb3IcSHFt5VIio+7IyFKaWlL02fFYK0rQHSpODjkvW2p7mstae0ZKY5w
|
||||
pKZ2qLlDjNsrSQEr+7bO5dHZyHAkqSg3K3K8pQUpYUfLEhW7Slttx5mIjDZHdtttJJwQSeVKMdRjr339
|
||||
byi3oQcpCU+4Qkev+kjP518BsuFcVv62L+lIokY0JPvp83Wd3fvAB5jZo4Nv08hKwSlly1xyRcWkg5Av
|
||||
D9xPMErSRypCZNt1mh2xppiGy1HZZSENttNpQlCAOVKEJThKEpGMAZ79OgvobSM9P0x/I1914ALr1OBH
|
||||
oPcUbIrkWB875AouBCAc426e/r71zAAdBXBX8JA6mvjXNF3paPYUi+lYTt2H1PX6k18KB5SAtQJ9SVfX
|
||||
HMrY79R/YjjU+2nHzDf1yP5jeqVcxkZPMVY9gAd8YG52HXPfPc5rwZHEkt34+nrudiTY+W5O2wLmWFYy
|
||||
stuHGx5TnO+CfmIwCrccvzd6tUgoUFBXy/TJznOds7dcdfSv65NRulJx7/l6eu/XP0weltekZzvkep/7
|
||||
k+mfT16V7jkcAS41xWw7De6G3/tOFabnCbe5vlSpKgRnrgkqG4PTPr653rG7TqjVnCq6jXGitX3fRN3t
|
||||
jaCu7WibIil+M3KjTfu6cywS3eLZJlQ4ipdluEabbbj5SGpkKS3+zN8mTY7Lb0uU6iPGitrfkPrOG2mm
|
||||
wpalLJwRhOcDfJHbIqM3pDmpXEXKWypqzRlh62QHlFKpSk5CbhNTnJKwW1xY3SOnDr37dfKxna9zDbTR
|
||||
2NgkGxwdiF8c0OBaao82LH4Ls74GfavSYy4On/EBoy4yreDEiI4qaUtzFucdSpNtjfeGodEy5MZx9tHN
|
||||
c7vervpoQAlpMeDYdDS1qSpXcZobXOkuJWkrDrvQt9hal0nqaAi42W8wFOeTKjqWtp1t1iQ2zLgT4Ulp
|
||||
+BdLVcI8W6Wi5xpdrukOHcIkmM14/dTqS824HNh8wABBHLyqwnIKc8oJySCd8Gpb8JPjT1r4R9aKjuGZ
|
||||
qTg/qW4sSNaaGDraltvKQiKrVmk1SXEM23VEWG2yiQ0lyPb9UQIkW1XpaFwrJebBPYec5x0SO1gUNWxc
|
||||
2+CTy5vN3bvfajEZWCyi6EaXCvh4a664H8J9KNdqF2PWlSsZ0ZrHTPELSendcaNu8e/aV1XaIN9sN3ip
|
||||
fbanWy4MIkRnSxKaYmRHwhflyoM6PGnwZKHoc6NHlsPMN5NUwCCLBsHcEcEeqhyCCQRRGxB5B9ClKUoi
|
||||
UpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIlKUoiUpSiJSlKIl
|
||||
RzxJ4q6L4U2hq7auuK2TKW41bbVBbTLvN2dabLrqIEIusp8plISH50t+JbYzr0ViVNZemRG3vvinxIs/
|
||||
CnRV01leWzLRDLES3WtuVGiSbxd5iy3Ct0Z6SrlTzcrsua4yzLkRLVDuE9mDNMQxnOjjXXEjUfE7VV+1
|
||||
dqeaibNnz3IsVphwiDarXCQhuNZbZGLz6oVvgSlzi1HeUqU48/ImzXpcyY/NkaGbnNxgGNoyuF0bIYPU
|
||||
13PYfU7Ve9h4ZyCXPJbG00a5cfQegHc+9De6mHjP4k9bcWlO291wae0hzNKa0rbpBcjvrZdD7Ui9XHyY
|
||||
0i8PoeS042060xbWFxYz8a3MTEOyn9clOKcPNnB9f9WOmwIxjp71wKdwSVfvElIHTlPTH9znPdRr5Lo/
|
||||
1jf1wD+h/wC9VuSZ8ry+Qlzj3J3HyNUB2oCq2AU+yNkbQyNoa0cAf1Pck9ybJ7lc+Sepz7jII+hJOP06
|
||||
gelCcAk9e59f8Oe/eqQuIH7wP0OT/Cvnzke/6V41Ds0fXde1WcyfUfrQlJ6kfqKo/OR7/pQvI/3H8v7k
|
||||
V8JvsB8hSKpKUnoQPzz/AFr4KU9Cc/Qf1yP4VTl9PZJP1wP70EjH7gP1Of6V8Rff7P8Azmr5UUbYz+QJ
|
||||
r+rmDbCEp/ePyk5c/wBexH6HOe5O2KVb4VkBAA9Rt39MH0rDrce2n6g/oi+ytKRt0H12/hXwp8A4Cc49
|
||||
8f0NU5cI6n+H/auErJ6bfx/pXl797J+nf/PnX9iqfNX6/wAT/evkuEZUT+R6d/8AP5naqB18pHX12GPm
|
||||
P6dB3PT67ZoVyVkfMrGe4zn+JOOvbB9K8gk8Db1O2/yFoq9yQACoLSR3AOf5Hqff0JyAKt781IOAo537
|
||||
DB6+vptvuSFb9N7c89yg5O4+nofcen5b96oHZAQrdQGc9Tjp/wC4ZPr79/T5QG5Nn0+e3H0/AeyKuXK3
|
||||
3V67kgZ+m4/hkb7VQOzkgKHp+E+ueuRgEY/Pb0zmrXJnpQSc9M+/N16cp2AxtnOebt3xK43xCG1KSoDH
|
||||
b5cHocY5t+px6fxrYY8uvaqrvZo3yK24RZY7dEAqO/b99Q7AdjgVSO3YlZAUBjPf1JG/Meu2+Pz7VGbl
|
||||
75uf9u3kcvUg9cf7hn8qseoNTvW6yzJMNaHLg/yW+2IJHz3KasRYhIHMoIS475ilAK5EgrOAhVeB5Z5L
|
||||
nf8AVrPofSt9j+CK/wB6uX/M93NiaczYbM62/qBxCspuNxHI/HtGRsqPEC/iZoJwt1Udg5AktG6S5vmD
|
||||
kSA2ykYCE4AwBsARtgDtjAHpuTjFliRrLa4trjrU6phsKlyHFcz8uY6pTkqVIWB878l9Tj7qyBzrWSAE
|
||||
gAcVxnJCClJyPmO2QdkrHY9/fvWUODro3VX9eEWM35WEr5T15s7Dty4Od/U/26VAupFYDnzcv4z0J6cv
|
||||
p0/n6VMVyneaHEFJUnB27+m46Ekbf5vDepRjzN+oz9NsY/hWaFxD9vb+tfqvDxYv0/Wl2t/ZNeNv/wAP
|
||||
dYQ/C1xHlynNI8QdQH/wvvL0ousaT1xdlJR/yu8zKf5mLBreaGkW1u2FQg63lharY81qu83i0el2vz55
|
||||
E+Xa7nGuUCXIgz4EpiXCmRH3Y0qNKjvNvR5EaSwtt5h+O80h5l5laXWnEIW2pKkgj2++DjjsvxIeG7hf
|
||||
xamhhvUF8srtt1fGYVGSlnV+mp8rT2onhEirWm2x7tcLa5frZbnil+NZrrbg4DzJWuy4c2tpYXWRbm+t
|
||||
XRG/oSK9iRwFBZ8Qa8SNFajT/TVQo12JF32JF8krZulKVvKPSlKURKUpREpSlESlKURKUpREpSlESlKU
|
||||
RKUpREpSlESlKURKUpREpSlESlKURKUpREpSlESlKURK/hIAJJAABJJOAANySTsAB1Nf2taPFzqwaU4G
|
||||
6mLcyXBm6hlWnTkB2I66yt1Uuc3OuUR51kpKYk2wW27xJTbi0MymXlw3edEgtOYppRDFJKRYjY51XVkD
|
||||
YX7mh9V7jZ5kjGcanNbfpZon6Ddddvie42jizrjybRJC9F6YD8HS/NCVDkTDJEU3W9SQ+pcsm6SojYhN
|
||||
Pphli1w7eHrbDua7kXtTGFNwbtdIyVJDF1Q3e2UhtWfi2kRrbdFOOAqAHIqzpab5RlXnqBVnFfMmaVqW
|
||||
6tWeZRPU9OwHMSenT0AySBWG6huTrbUW5NOqSuyzkz3wA858RaVtuxbyythrLkhbdvfdmRWEJWVz4kJQ
|
||||
Qrk5VUiTIknkfK4nU9wJNCrNbC96A2A7DYXsrVGxsbGxsFNYAB/c+pJ3J7kkrO1yk7YOBvv8xz09AMY9
|
||||
/wCFf1LoVnJ6fXv9fpWGO3FXMOV0b5xggpUB3Ck5B23z/g5G7i4ScuZJxkjHbONtv4fU1h1O/ic0+24/
|
||||
qT/Tt77e1mQIPQ1/atjElLiUZIKiNz06Y3xvkH1/LrVUHAD1+owd/wCFe/MP81exof5/RFU0rg+Ib33/
|
||||
AJ/2/kDRTw7f5+or6JW7/EHfUCvwu0XKpXKcYz/DuR/SvgrJ6bfx/pVMp07ZOP1P881Tqk4OCrlIGegP
|
||||
X6A4P9xWMyavU16AIq6uNS9sJPX67fyq2OzVYKUkH3I9Qe2B6+p6dKo1yVqTguEj0AAzsfQn+1DqPGw9
|
||||
+fwHH4/givKnMnPX+GP4VSrfTjOeYjoMEenfFWkvuEYKioH/AFZI/io+vtVMtxRP4icdyc/pnP8A3r4G
|
||||
epv/AD8/yRV7rxJznf8Ah9B1wB6/zPWjceODkjYb57dPXO/+egNGt7lyc9Opzt36bjp+nXoBvaZEs5yD
|
||||
sO+2+QPVOx2/Tc+/3Vezd6/Af57e/ZFWPzEI5wXBnt+LqAodv8/Ksclz20hWFAlOdsn1I6467fXr02qm
|
||||
kzUtk5Oe/X0yO2d+mNh16jpWGXK7lHOObl2HXAGw67gZOMdsetZo26b3JJo2fTeiOwvfbkd+yLlu13WA
|
||||
SXCSeid/U7gnIH4cfnk5xUb3G9pKFJDpOCVHfOxSMnGeoxjfG2cHbejvl72cCHAo782FDJHQAAHYdtgc
|
||||
AYGw3iG5ag8qQeZZShRKOUAjAJJSQd/3gDuOqdyQayIs++/OXopSc+hO+PoR61Qqu6J99gJd/aRrBHNx
|
||||
WlSiQbpOQ5HhpVgnmLEZx55TeDyF+OsKBG8RydRJaPOtwhCSS4ScbDYHqRt0JGx5s59ce0trtmfcLmnn
|
||||
B+Luj2Agg/JHQ3DbGe4CY6SM8uc5zvRFtrFu/OjzFKJJ2IxgEY75x69httjFVUiY28kgKAVggZzjcY3I
|
||||
BO3XofT3qN4k1xaUoSsEbYV12JwOh6d+vtWURgQjJOc4Pfbc+pNEVDMIHmAnHMOv6j8+vTv0FRlqBHOh
|
||||
wZx8o7Z7q9x6VIt0OMnsMknIHYjuRk79vQ1gN0JVzBW4KVgjA74Hp/DG9e2GjXr+lodwR6/2I/VQFfSQ
|
||||
4rBxuT+nb+PvXoH+wl41ea1xo8PlwkZU0YHGHS0duAclKjbNGa8fm3Pm/wBX/hyi2QVoJ3u8hteA6K6A
|
||||
9UMeW4vAGFcxBAxsenYbDm7/AJVPPgM44M8APFrwd4hXCbGt+mxqiPpjWMqfNlw7XF0hrOM9pa/3W5/B
|
||||
5VIj6cg3deqI8d5t6Oq42SC443zNoUmXwZNLmniiL/6fun8t1G5MeuN7eS4W3bcObRFfOq+vde6WlKVP
|
||||
KBSlKURKUpREpSlESlKURKUpREpSlESlKURKUpREpSlEX//Z
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,17 +0,0 @@
|
||||
Public Class DeveloperForm
|
||||
Private Sub DeveloperForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
||||
GreetingLabel.BackColor = Color.Transparent
|
||||
AboutMeLinkLabel.BackColor = Color.Transparent
|
||||
BuyMeACoffeeLinkLabel.BackColor = Color.Transparent
|
||||
End Sub
|
||||
|
||||
Private Sub AboutMeLinkLabel_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles AboutMeLinkLabel.LinkClicked
|
||||
' I couldn't find a proper way to open a url
|
||||
' Process.Start() did not work
|
||||
Shell("cmd /c start https://about.me/rly0nheart")
|
||||
End Sub
|
||||
|
||||
Private Sub BuyMeACoffeeLinkLabel_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles BuyMeACoffeeLinkLabel.LinkClicked
|
||||
Shell("cmd /c start https://buymeacoffee.com/189381184")
|
||||
End Sub
|
||||
End Class
|
||||
@@ -1,56 +0,0 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
|
||||
Partial Class PostsForm
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()> _
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()> _
|
||||
Private Sub InitializeComponent()
|
||||
Me.DataGridViewPosts = New System.Windows.Forms.DataGridView()
|
||||
CType(Me.DataGridViewPosts, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||
Me.SuspendLayout()
|
||||
'
|
||||
'DataGridViewPosts
|
||||
'
|
||||
Me.DataGridViewPosts.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
|
||||
Me.DataGridViewPosts.Dock = System.Windows.Forms.DockStyle.Fill
|
||||
Me.DataGridViewPosts.Location = New System.Drawing.Point(0, 0)
|
||||
Me.DataGridViewPosts.Name = "DataGridViewPosts"
|
||||
Me.DataGridViewPosts.ReadOnly = True
|
||||
Me.DataGridViewPosts.RowTemplate.Height = 25
|
||||
Me.DataGridViewPosts.Size = New System.Drawing.Size(800, 450)
|
||||
Me.DataGridViewPosts.TabIndex = 3
|
||||
'
|
||||
'PostsForm
|
||||
'
|
||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!)
|
||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||
Me.ClientSize = New System.Drawing.Size(800, 450)
|
||||
Me.Controls.Add(Me.DataGridViewPosts)
|
||||
Me.Name = "PostsForm"
|
||||
Me.ShowIcon = False
|
||||
Me.ShowInTaskbar = False
|
||||
Me.Text = "PostsForm"
|
||||
CType(Me.DataGridViewPosts, System.ComponentModel.ISupportInitialize).EndInit()
|
||||
Me.ResumeLayout(False)
|
||||
|
||||
End Sub
|
||||
|
||||
Friend WithEvents DataGridViewPosts As DataGridView
|
||||
End Class
|
||||
@@ -1,60 +0,0 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -1,3 +0,0 @@
|
||||
Public Class PostsForm
|
||||
|
||||
End Class
|
||||
@@ -1,29 +0,0 @@
|
||||
# Reddit Post Scraping Tool
|
||||
Given a subreddit name and a keyword, this script will return all posts from a specified listing (default is 'top') that contain the provided keyword.
|
||||
|
||||
[](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/python-publish.yml) [](https://github.com/rly0nheart/reddit-post-scraping-tool/actions/workflows/codeql.yml)  
|
||||

|
||||

|
||||
|
||||
|
||||
# Features (GUI)
|
||||
- [x] Auto dark mode from 6pm - 6am
|
||||
- [x] Saves results to a JSON
|
||||
- [x] Other features coming soon...
|
||||
|
||||
# TODO (GUI)
|
||||
- [x] Make it a stand alone executable
|
||||
- [x] Add comments to the code 😆
|
||||
|
||||
# Wiki
|
||||
[Refer to the Wiki](https://github.com/rly0nheart/reddit-post-scraping-tool/wiki) for installation instructions, in addition to all other documentation.
|
||||
|
||||
# Note
|
||||
> This is one of the projects I am working on, while learning Visual Basic, so the implementation/code may be messed up. If that's the case, please feel free to open a pull request using the available templates. Otherwise, enjoy!
|
||||
|
||||
# Donations
|
||||
If you've got some change to spare and would like to show support, you can Buy Me A Coffee using the button below
|
||||
|
||||
<a href="https://www.buymeacoffee.com/189381184" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>
|
||||
|
||||
Your support will be much appreciated😊
|
||||
@@ -1,283 +0,0 @@
|
||||
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
|
||||
Partial Class StartForm
|
||||
Inherits System.Windows.Forms.Form
|
||||
|
||||
'Form overrides dispose to clean up the component list.
|
||||
<System.Diagnostics.DebuggerNonUserCode()>
|
||||
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||
Try
|
||||
If disposing AndAlso components IsNot Nothing Then
|
||||
components.Dispose()
|
||||
End If
|
||||
Finally
|
||||
MyBase.Dispose(disposing)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
'Required by the Windows Form Designer
|
||||
Private components As System.ComponentModel.IContainer
|
||||
|
||||
'NOTE: The following procedure is required by the Windows Form Designer
|
||||
'It can be modified using the Windows Form Designer.
|
||||
'Do not modify it using the code editor.
|
||||
<System.Diagnostics.DebuggerStepThrough()>
|
||||
Private Sub InitializeComponent()
|
||||
Me.components = New System.ComponentModel.Container()
|
||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(StartForm))
|
||||
Me.KeywordTextBox = New System.Windows.Forms.TextBox()
|
||||
Me.LimitTextBox = New System.Windows.Forms.TextBox()
|
||||
Me.SubredditTextBox = New System.Windows.Forms.TextBox()
|
||||
Me.Button1 = New System.Windows.Forms.Button()
|
||||
Me.TimeframeComboBox = New System.Windows.Forms.ComboBox()
|
||||
Me.ListingComboBox = New System.Windows.Forms.ComboBox()
|
||||
Me.Label1 = New System.Windows.Forms.Label()
|
||||
Me.Label2 = New System.Windows.Forms.Label()
|
||||
Me.Label3 = New System.Windows.Forms.Label()
|
||||
Me.Label4 = New System.Windows.Forms.Label()
|
||||
Me.Label5 = New System.Windows.Forms.Label()
|
||||
Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)
|
||||
Me.SaveResultsJSONToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
|
||||
Me.ToolsToolStripMenuTools = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.AboutToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.DeveloperToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
|
||||
Me.QuitToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.ChekUpdatesToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
|
||||
Me.ContextMenuStrip1.SuspendLayout()
|
||||
Me.MenuStrip1.SuspendLayout()
|
||||
Me.SuspendLayout()
|
||||
'
|
||||
'KeywordTextBox
|
||||
'
|
||||
Me.KeywordTextBox.BackColor = System.Drawing.SystemColors.Window
|
||||
Me.KeywordTextBox.ForeColor = System.Drawing.SystemColors.WindowText
|
||||
Me.KeywordTextBox.Location = New System.Drawing.Point(89, 96)
|
||||
Me.KeywordTextBox.Name = "KeywordTextBox"
|
||||
Me.KeywordTextBox.PlaceholderText = "Keyword"
|
||||
Me.KeywordTextBox.Size = New System.Drawing.Size(100, 23)
|
||||
Me.KeywordTextBox.TabIndex = 0
|
||||
'
|
||||
'LimitTextBox
|
||||
'
|
||||
Me.LimitTextBox.Location = New System.Drawing.Point(89, 154)
|
||||
Me.LimitTextBox.Name = "LimitTextBox"
|
||||
Me.LimitTextBox.PlaceholderText = "Limit (1-100)"
|
||||
Me.LimitTextBox.Size = New System.Drawing.Size(100, 23)
|
||||
Me.LimitTextBox.TabIndex = 3
|
||||
'
|
||||
'SubredditTextBox
|
||||
'
|
||||
Me.SubredditTextBox.Location = New System.Drawing.Point(89, 125)
|
||||
Me.SubredditTextBox.Name = "SubredditTextBox"
|
||||
Me.SubredditTextBox.PlaceholderText = "Subreddit"
|
||||
Me.SubredditTextBox.Size = New System.Drawing.Size(100, 23)
|
||||
Me.SubredditTextBox.TabIndex = 4
|
||||
'
|
||||
'Button1
|
||||
'
|
||||
Me.Button1.Location = New System.Drawing.Point(251, 215)
|
||||
Me.Button1.Name = "Button1"
|
||||
Me.Button1.Size = New System.Drawing.Size(76, 28)
|
||||
Me.Button1.TabIndex = 6
|
||||
Me.Button1.Text = "Scrape"
|
||||
Me.Button1.UseVisualStyleBackColor = True
|
||||
'
|
||||
'TimeframeComboBox
|
||||
'
|
||||
Me.TimeframeComboBox.FormattingEnabled = True
|
||||
Me.TimeframeComboBox.Items.AddRange(New Object() {"Hour", "Day", "Week", "Month", "Year"})
|
||||
Me.TimeframeComboBox.Location = New System.Drawing.Point(89, 212)
|
||||
Me.TimeframeComboBox.Name = "TimeframeComboBox"
|
||||
Me.TimeframeComboBox.Size = New System.Drawing.Size(100, 23)
|
||||
Me.TimeframeComboBox.TabIndex = 8
|
||||
Me.TimeframeComboBox.Text = "All"
|
||||
'
|
||||
'ListingComboBox
|
||||
'
|
||||
Me.ListingComboBox.FormattingEnabled = True
|
||||
Me.ListingComboBox.Items.AddRange(New Object() {"Controversial", "Hot", "Best", "New", "Rising"})
|
||||
Me.ListingComboBox.Location = New System.Drawing.Point(89, 183)
|
||||
Me.ListingComboBox.Name = "ListingComboBox"
|
||||
Me.ListingComboBox.Size = New System.Drawing.Size(100, 23)
|
||||
Me.ListingComboBox.TabIndex = 9
|
||||
Me.ListingComboBox.Text = "Top"
|
||||
'
|
||||
'Label1
|
||||
'
|
||||
Me.Label1.AutoEllipsis = True
|
||||
Me.Label1.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point)
|
||||
Me.Label1.ForeColor = System.Drawing.Color.Black
|
||||
Me.Label1.Location = New System.Drawing.Point(12, 96)
|
||||
Me.Label1.Name = "Label1"
|
||||
Me.Label1.Size = New System.Drawing.Size(56, 23)
|
||||
Me.Label1.TabIndex = 10
|
||||
Me.Label1.Text = "Keyword"
|
||||
'
|
||||
'Label2
|
||||
'
|
||||
Me.Label2.AutoEllipsis = True
|
||||
Me.Label2.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point)
|
||||
Me.Label2.ForeColor = System.Drawing.Color.Black
|
||||
Me.Label2.Location = New System.Drawing.Point(12, 125)
|
||||
Me.Label2.Name = "Label2"
|
||||
Me.Label2.Size = New System.Drawing.Size(63, 23)
|
||||
Me.Label2.TabIndex = 11
|
||||
Me.Label2.Text = "Subreddit"
|
||||
'
|
||||
'Label3
|
||||
'
|
||||
Me.Label3.AutoEllipsis = True
|
||||
Me.Label3.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!, CType((System.Drawing.FontStyle.Bold Or System.Drawing.FontStyle.Underline), System.Drawing.FontStyle), System.Drawing.GraphicsUnit.Point)
|
||||
Me.Label3.ForeColor = System.Drawing.Color.Black
|
||||
Me.Label3.Location = New System.Drawing.Point(12, 154)
|
||||
Me.Label3.Name = "Label3"
|
||||
Me.Label3.Size = New System.Drawing.Size(56, 23)
|
||||
Me.Label3.TabIndex = 12
|
||||
Me.Label3.Text = "Limit"
|
||||
'
|
||||
'Label4
|
||||
'
|
||||
Me.Label4.AutoEllipsis = True
|
||||
Me.Label4.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!, CType((System.Drawing.FontStyle.Bold Or System.Drawing.FontStyle.Underline), System.Drawing.FontStyle), System.Drawing.GraphicsUnit.Point)
|
||||
Me.Label4.ForeColor = System.Drawing.Color.Black
|
||||
Me.Label4.Location = New System.Drawing.Point(12, 183)
|
||||
Me.Label4.Name = "Label4"
|
||||
Me.Label4.Size = New System.Drawing.Size(56, 23)
|
||||
Me.Label4.TabIndex = 13
|
||||
Me.Label4.Text = "Listing"
|
||||
'
|
||||
'Label5
|
||||
'
|
||||
Me.Label5.AutoEllipsis = True
|
||||
Me.Label5.Font = New System.Drawing.Font("Segoe UI Semibold", 9.0!, CType((System.Drawing.FontStyle.Bold Or System.Drawing.FontStyle.Underline), System.Drawing.FontStyle), System.Drawing.GraphicsUnit.Point)
|
||||
Me.Label5.ForeColor = System.Drawing.Color.Black
|
||||
Me.Label5.Location = New System.Drawing.Point(12, 215)
|
||||
Me.Label5.Name = "Label5"
|
||||
Me.Label5.Size = New System.Drawing.Size(71, 23)
|
||||
Me.Label5.TabIndex = 14
|
||||
Me.Label5.Text = "Timeframe"
|
||||
'
|
||||
'ContextMenuStrip1
|
||||
'
|
||||
Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.SaveResultsJSONToolStripMenuItem})
|
||||
Me.ContextMenuStrip1.Name = "ContextMenuStrip1"
|
||||
Me.ContextMenuStrip1.Size = New System.Drawing.Size(175, 26)
|
||||
'
|
||||
'SaveResultsJSONToolStripMenuItem
|
||||
'
|
||||
Me.SaveResultsJSONToolStripMenuItem.CheckOnClick = True
|
||||
Me.SaveResultsJSONToolStripMenuItem.Image = CType(resources.GetObject("SaveResultsJSONToolStripMenuItem.Image"), System.Drawing.Image)
|
||||
Me.SaveResultsJSONToolStripMenuItem.Name = "SaveResultsJSONToolStripMenuItem"
|
||||
Me.SaveResultsJSONToolStripMenuItem.Size = New System.Drawing.Size(174, 22)
|
||||
Me.SaveResultsJSONToolStripMenuItem.Text = "Save results (JSON)"
|
||||
Me.SaveResultsJSONToolStripMenuItem.ToolTipText = "Save results to a JSON file"
|
||||
'
|
||||
'MenuStrip1
|
||||
'
|
||||
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolsToolStripMenuTools})
|
||||
Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
|
||||
Me.MenuStrip1.Name = "MenuStrip1"
|
||||
Me.MenuStrip1.Size = New System.Drawing.Size(355, 24)
|
||||
Me.MenuStrip1.TabIndex = 0
|
||||
Me.MenuStrip1.Text = "MenuStrip1"
|
||||
'
|
||||
'ToolsToolStripMenuTools
|
||||
'
|
||||
Me.ToolsToolStripMenuTools.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.AboutToolStripMenuItem, Me.DeveloperToolStripMenuItem, Me.ChekUpdatesToolStripMenuItem, Me.ToolStripSeparator2, Me.QuitToolStripMenuItem})
|
||||
Me.ToolsToolStripMenuTools.Image = CType(resources.GetObject("ToolsToolStripMenuTools.Image"), System.Drawing.Image)
|
||||
Me.ToolsToolStripMenuTools.Name = "ToolsToolStripMenuTools"
|
||||
Me.ToolsToolStripMenuTools.Size = New System.Drawing.Size(62, 20)
|
||||
Me.ToolsToolStripMenuTools.Text = "Tools"
|
||||
'
|
||||
'AboutToolStripMenuItem
|
||||
'
|
||||
Me.AboutToolStripMenuItem.Image = CType(resources.GetObject("AboutToolStripMenuItem.Image"), System.Drawing.Image)
|
||||
Me.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem"
|
||||
Me.AboutToolStripMenuItem.Size = New System.Drawing.Size(180, 22)
|
||||
Me.AboutToolStripMenuItem.Text = "About"
|
||||
Me.AboutToolStripMenuItem.ToolTipText = "About program"
|
||||
'
|
||||
'DeveloperToolStripMenuItem
|
||||
'
|
||||
Me.DeveloperToolStripMenuItem.Image = CType(resources.GetObject("DeveloperToolStripMenuItem.Image"), System.Drawing.Image)
|
||||
Me.DeveloperToolStripMenuItem.Name = "DeveloperToolStripMenuItem"
|
||||
Me.DeveloperToolStripMenuItem.Size = New System.Drawing.Size(180, 22)
|
||||
Me.DeveloperToolStripMenuItem.Text = "Developer"
|
||||
Me.DeveloperToolStripMenuItem.ToolTipText = "About developer"
|
||||
'
|
||||
'ToolStripSeparator2
|
||||
'
|
||||
Me.ToolStripSeparator2.Name = "ToolStripSeparator2"
|
||||
Me.ToolStripSeparator2.Size = New System.Drawing.Size(177, 6)
|
||||
'
|
||||
'QuitToolStripMenuItem
|
||||
'
|
||||
Me.QuitToolStripMenuItem.Image = CType(resources.GetObject("QuitToolStripMenuItem.Image"), System.Drawing.Image)
|
||||
Me.QuitToolStripMenuItem.Name = "QuitToolStripMenuItem"
|
||||
Me.QuitToolStripMenuItem.Size = New System.Drawing.Size(180, 22)
|
||||
Me.QuitToolStripMenuItem.Text = "Quit"
|
||||
Me.QuitToolStripMenuItem.ToolTipText = "Quit program"
|
||||
'
|
||||
'ChekUpdatesToolStripMenuItem
|
||||
'
|
||||
Me.ChekUpdatesToolStripMenuItem.Image = CType(resources.GetObject("ChekUpdatesToolStripMenuItem.Image"), System.Drawing.Image)
|
||||
Me.ChekUpdatesToolStripMenuItem.Name = "ChekUpdatesToolStripMenuItem"
|
||||
Me.ChekUpdatesToolStripMenuItem.Size = New System.Drawing.Size(180, 22)
|
||||
Me.ChekUpdatesToolStripMenuItem.Text = "Check updates"
|
||||
'
|
||||
'StartForm
|
||||
'
|
||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!)
|
||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||
Me.BackColor = System.Drawing.Color.White
|
||||
Me.ClientSize = New System.Drawing.Size(355, 255)
|
||||
Me.ContextMenuStrip = Me.ContextMenuStrip1
|
||||
Me.Controls.Add(Me.MenuStrip1)
|
||||
Me.Controls.Add(Me.Label5)
|
||||
Me.Controls.Add(Me.Label4)
|
||||
Me.Controls.Add(Me.Label3)
|
||||
Me.Controls.Add(Me.Label2)
|
||||
Me.Controls.Add(Me.Label1)
|
||||
Me.Controls.Add(Me.ListingComboBox)
|
||||
Me.Controls.Add(Me.TimeframeComboBox)
|
||||
Me.Controls.Add(Me.SubredditTextBox)
|
||||
Me.Controls.Add(Me.LimitTextBox)
|
||||
Me.Controls.Add(Me.Button1)
|
||||
Me.Controls.Add(Me.KeywordTextBox)
|
||||
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
|
||||
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
|
||||
Me.MainMenuStrip = Me.MenuStrip1
|
||||
Me.MaximizeBox = False
|
||||
Me.Name = "StartForm"
|
||||
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
|
||||
Me.Text = "Reddit Post Scraping Tool"
|
||||
Me.ContextMenuStrip1.ResumeLayout(False)
|
||||
Me.MenuStrip1.ResumeLayout(False)
|
||||
Me.MenuStrip1.PerformLayout()
|
||||
Me.ResumeLayout(False)
|
||||
Me.PerformLayout()
|
||||
|
||||
End Sub
|
||||
|
||||
Friend WithEvents KeywordTextBox As TextBox
|
||||
Friend WithEvents LimitTextBox As TextBox
|
||||
Friend WithEvents SubredditTextBox As TextBox
|
||||
Friend WithEvents Button1 As Button
|
||||
Friend WithEvents TimeframeComboBox As ComboBox
|
||||
Friend WithEvents ListingComboBox As ComboBox
|
||||
Friend WithEvents Label1 As Label
|
||||
Friend WithEvents Label2 As Label
|
||||
Friend WithEvents Label3 As Label
|
||||
Friend WithEvents Label4 As Label
|
||||
Friend WithEvents Label5 As Label
|
||||
Friend WithEvents ContextMenuStrip1 As ContextMenuStrip
|
||||
Friend WithEvents MenuStrip1 As MenuStrip
|
||||
Friend WithEvents ToolsToolStripMenuTools As ToolStripMenuItem
|
||||
Friend WithEvents AboutToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents DeveloperToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents ToolStripSeparator2 As ToolStripSeparator
|
||||
Friend WithEvents QuitToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents SaveResultsJSONToolStripMenuItem As ToolStripMenuItem
|
||||
Friend WithEvents ChekUpdatesToolStripMenuItem As ToolStripMenuItem
|
||||
End Class
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,264 +0,0 @@
|
||||
Imports System.IO
|
||||
Imports System.Reflection
|
||||
Imports Newtonsoft.Json
|
||||
Imports Newtonsoft.Json.Linq
|
||||
|
||||
Public Class StartForm
|
||||
|
||||
' Create the program's directory
|
||||
' We will store information about the user and current machine in it
|
||||
Private Sub PathFinder()
|
||||
Dim directoryPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RedditPostScrapingTool", "logs")
|
||||
|
||||
If Not Directory.Exists(directoryPath) Then
|
||||
Directory.CreateDirectory(directoryPath)
|
||||
Else
|
||||
' DO NOTHING
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
' Create a file in C:\Users\<username>\AppData\Roaming\RedditPostScrapingTool, this will be used to determine
|
||||
' Whether the program has been run before
|
||||
' If it has not been run before, display the license notice
|
||||
Private Sub LogFirstTimeLaunch()
|
||||
Dim filePath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "RedditPostScrapingTool", "logs", "first_launch.log")
|
||||
Dim textToWrite As String = $"
|
||||
{My.Application.Info.AssemblyName}
|
||||
-------------------------
|
||||
|
||||
|
||||
User: {Environment.UserName}
|
||||
Host: {Environment.MachineName}
|
||||
OS: {Environment.OSVersion}
|
||||
x64: {Environment.Is64BitOperatingSystem}
|
||||
First launched on: {DateTime.Now}"
|
||||
|
||||
If Not File.Exists(filePath) Then
|
||||
MessageBox.Show("MIT License
|
||||
|
||||
Copyright (c) 2023 Richard Mwewa
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the ""Software""), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.", "License", MessageBoxButtons.OKCancel, MessageBoxIcon.Information)
|
||||
|
||||
File.WriteAllText(filePath, textToWrite)
|
||||
Else
|
||||
' DO NOTHING
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
' Check the current time
|
||||
' add a dark background to the program if it's evening
|
||||
' This is my way of implementing auto dark-mode (you could help if you know a better way :) )
|
||||
Private Sub DarkModeProperties()
|
||||
Dim currentHour As Integer = DateTime.Now.Hour
|
||||
If currentHour >= 6 And currentHour < 18 Then
|
||||
Me.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
KeywordTextBox.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
KeywordTextBox.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
SubredditTextBox.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
SubredditTextBox.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
LimitTextBox.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
LimitTextBox.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
ListingComboBox.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
ListingComboBox.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
TimeframeComboBox.BackColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
TimeframeComboBox.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
Label1.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
Label2.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
Label3.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
Label4.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
Label5.ForeColor = ColorTranslator.FromHtml("#FF121212")
|
||||
Else
|
||||
Me.BackColor = ColorTranslator.FromHtml("#FF121212")
|
||||
|
||||
KeywordTextBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
KeywordTextBox.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
SubredditTextBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
SubredditTextBox.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
LimitTextBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
LimitTextBox.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
ListingComboBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
ListingComboBox.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
TimeframeComboBox.BackColor = ColorTranslator.FromHtml("#FF2E2E2E")
|
||||
TimeframeComboBox.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
|
||||
Label1.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
Label2.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
Label3.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
Label4.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
Label5.ForeColor = ColorTranslator.FromHtml("#FFFFFFFF")
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
|
||||
Dim ApiHandler As New ApiHandler
|
||||
Dim Keyword As String = KeywordTextBox.Text
|
||||
Dim Subreddit As String = SubredditTextBox.Text
|
||||
Dim Listing As String = ListingComboBox.Text.ToLower()
|
||||
Dim Limit As String = LimitTextBox.Text
|
||||
Dim Timeframe As String = TimeframeComboBox.Text.ToLower()
|
||||
Dim FoundPosts As Integer = 0
|
||||
Dim TotalPosts As Integer = 0
|
||||
|
||||
' Clear the Columns and Rows before adding Items to them
|
||||
PostsForm.DataGridViewPosts.Rows.Clear()
|
||||
PostsForm.DataGridViewPosts.Columns.Clear()
|
||||
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostCount", "Post Number")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostAuthor", "Author")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostID", "ID")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostSubreddit", "Subreddit")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("SubredditVisibility", "Subreddit Visibility")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostThumbnail", "Thumbnail")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostIsNSFW", "NSFW")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostIsGilded", "Gilded")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostUpvotes", "Upvotes")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostUpvoteRatio", "Upvote Ratio")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostDownvotes", "Downvotes")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostAwards", "Awards")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostTopAward", "Top Award")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostIsCrosspostable", "Is Crosspostable?")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostScore", "Score")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostText", "Text")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostCategory", "Category")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostDomain", "Domain")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostPermalink", "Permalink")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostCreatedAt", "Created At")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostApprovedAt", "Approved At")
|
||||
PostsForm.DataGridViewPosts.Columns.Add("PostApprovedBy", "Approved By")
|
||||
|
||||
If Limit = "" Then
|
||||
Limit = "10"
|
||||
ElseIf Limit > 100 Then
|
||||
MessageBox.Show("Limit should not be over 100. Defaulting to 10", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
End If
|
||||
|
||||
If Listing = "" Then
|
||||
Listing = "top"
|
||||
End If
|
||||
|
||||
If Timeframe = "" Then
|
||||
Timeframe = "all"
|
||||
End If
|
||||
|
||||
If Keyword = "" Then
|
||||
MessageBox.Show("Keyword should not be emtpy", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
ElseIf Subreddit = "" Then
|
||||
MessageBox.Show("Subreddit should not be emtpy", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
|
||||
Else
|
||||
PostsForm.Text = $"Reddit Post Scraping Tool - {Keyword}"
|
||||
Dim Posts As JObject = ApiHandler.ScrapeReddit(Subreddit, Listing, Limit, Timeframe)
|
||||
For Each Post In Posts("data")("children")
|
||||
TotalPosts += 1
|
||||
If Post("data")("selftext").ToString.ToLower().Contains(KeywordTextBox.Text.ToLower()) Then
|
||||
FoundPosts += 1
|
||||
PostsForm.DataGridViewPosts.Rows.Add(TotalPosts, Post("data")("author"), Post("data")("id"), Post("data")("subreddit_name_prefixed"),
|
||||
Post("data")("subreddit_type"), Post("data")("thumbnail"), Post("data")("over_18"), Post("data")("gilded"),
|
||||
Post("data")("ups"), Post("data")("upvote_ratio"), Post("data")("downs"), Post("data")("total_awards_received"),
|
||||
Post("data")("top_awarded_type"), Post("data")("is_crosspostable"), Post("data")("score"), Post("data")("selftext"),
|
||||
Post("data")("category"), Post("data")("domain"), Post("data")("permalink"), Post("data")("created"),
|
||||
Post("data")("approved_at_utc"), Post("data")("approved_by"))
|
||||
End If
|
||||
Next
|
||||
MessageBox.Show($"Keyword `{Keyword}` was found in {FoundPosts}/" + Posts("data")("children").Count.ToString _
|
||||
+ $" {Listing} posts from r/{Subreddit}", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
PostsForm.Show()
|
||||
If SaveResultsJSONToolStripMenuItem.Checked Then
|
||||
Dim saveFileDialog As New SaveFileDialog()
|
||||
|
||||
saveFileDialog.Filter = "JSON files (*.json)|*.json"
|
||||
saveFileDialog.Title = "Save JSON File"
|
||||
|
||||
If saveFileDialog.ShowDialog() = DialogResult.OK Then
|
||||
Dim fileName As String = saveFileDialog.FileName
|
||||
Dim serializerSettings As New JsonSerializerSettings()
|
||||
serializerSettings.Formatting = Formatting.Indented
|
||||
Dim json As String = JsonConvert.SerializeObject(Posts("data")("children")(0), serializerSettings)
|
||||
|
||||
System.IO.File.WriteAllText(fileName, json)
|
||||
|
||||
MessageBox.Show($"Results saved to {fileName} successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub StartForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
||||
PathFinder()
|
||||
LogFirstTimeLaunch()
|
||||
DarkModeProperties()
|
||||
ToolsToolStripMenuTools.Text = Environment.UserName
|
||||
Me.Text = $"{My.Application.Info.AssemblyName} v{My.Application.Info.Version}"
|
||||
End Sub
|
||||
|
||||
Private Sub AboutToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AboutToolStripMenuItem.Click
|
||||
Dim response As DialogResult = MessageBox.Show("This will open the program's Wiki page in browser, continue?", "About", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||||
If response = DialogResult.Yes Then
|
||||
Shell("cmd /c start https:github.com/rly0nheart/reddit-post-scraping-tool/wiki")
|
||||
Else
|
||||
' DO NOTHING
|
||||
End If
|
||||
|
||||
' About infomation, the description of the release is taken from the GitHub releases page
|
||||
' This will throw an exception if there is no internet
|
||||
' Check line 34 - 57 in the ApiHandler.vb class file
|
||||
End Sub
|
||||
|
||||
Private Sub QuitToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles QuitToolStripMenuItem.Click
|
||||
Dim result As DialogResult = MessageBox.Show("This will close the program, continue?", "Quit", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||||
If result = DialogResult.Yes Then
|
||||
Me.Close()
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub DeveloperToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DeveloperToolStripMenuItem.Click
|
||||
DeveloperForm.Show()
|
||||
End Sub
|
||||
|
||||
Private Sub ChekUpdatesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ChekUpdatesToolStripMenuItem.Click
|
||||
Dim ApiHandler As New ApiHandler()
|
||||
Dim data As JObject = ApiHandler.CheckUpdates()
|
||||
If data("tag_name").ToString = $"{My.Application.Info.Version}" Then
|
||||
MessageBox.Show($"You're running the current version v{My.Application.Info.Version} of {My.Application.Info.ProductName}. Check again soon! :)", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||
Else
|
||||
Dim confirm As DialogResult = MessageBox.Show($"A new version v{data("tag_name")} of {My.Application.Info.ProductName} is availble, would you like to get it?
|
||||
|
||||
What's new in v{data("tag_name")}?
|
||||
{data("body")}
|
||||
", "Update", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
|
||||
If confirm = DialogResult.Yes Then
|
||||
Shell($"cmd /c start https://github.com/rly0nheart/reddit-post-scraping-tool/releases/tag/{data("tag_name")}")
|
||||
End If
|
||||
End If
|
||||
|
||||
End Sub
|
||||
End Class
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
40
pyproject.toml
Normal file
40
pyproject.toml
Normal file
@@ -0,0 +1,40 @@
|
||||
[build-system]
|
||||
requires = ["setuptools", "setuptools-scm"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[tool.setuptools]
|
||||
packages = ["rpst"]
|
||||
|
||||
[project]
|
||||
name = "reddit-post-scraping-tool"
|
||||
version = "2.0.1.0"
|
||||
description = "Retrieve Reddit posts that contain the specified keyword from a specified subreddit."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.8"
|
||||
license = { file = "LICENSE" }
|
||||
keywords = ["reddit-crawler", "reddit-scraping", "reddit", "reddit-api"]
|
||||
authors = [{ name = "Richard Mwewa", email = "rly0nheart@duck.com" }]
|
||||
classifiers = [
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Visual Basic",
|
||||
"Intended Audience :: End Users/Desktop",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Operating System :: OS Independent",
|
||||
"Natural Language :: English"
|
||||
]
|
||||
|
||||
dependencies = [
|
||||
"rich",
|
||||
"aiohttp",
|
||||
"rich-argparse"
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
homepage = "https://github.com/bellingcat"
|
||||
documentation = "https://github.com/bellingcat/reddit-post-scraping-tool/wiki"
|
||||
repository = "https://github.com/bellingcat/reddit-post-scraping-tool.git"
|
||||
|
||||
[project.scripts]
|
||||
rpst = "rpst.scraper:run"
|
||||
reddit_post_scraping_tool = "rpst.scraper:run"
|
||||
@@ -1,12 +0,0 @@
|
||||
from reddit_post_scraping_tool.reddit_post_scraping_tool import *
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
reddit_post_scraper()
|
||||
except KeyboardInterrupt:
|
||||
log.warning(f"User interruption detected.")
|
||||
except Exception as e:
|
||||
log.error(e)
|
||||
finally:
|
||||
log.info(f'Finished in {datetime.now() - start_time} seconds.')
|
||||
@@ -1,75 +0,0 @@
|
||||
import logging
|
||||
import argparse
|
||||
import requests
|
||||
from rich.tree import Tree
|
||||
from datetime import datetime
|
||||
from rich import print as xprint
|
||||
from rich.logging import RichHandler
|
||||
|
||||
start_time = datetime.now()
|
||||
logging.basicConfig(level="NOTSET", format="%(message)s", handlers=[RichHandler(markup=True, log_time_format='[%H:%M:%S%p]')])
|
||||
log = logging.getLogger("rich")
|
||||
|
||||
|
||||
# Getting posts
|
||||
def get_posts(post):
|
||||
post_data = {'Author': post['data']['author'],
|
||||
'ID': post['data']['id'],
|
||||
'Subreddit': post["data"]["subreddit_name_prefixed"],
|
||||
'Visibility': post['data']['subreddit_type'],
|
||||
# 'Author': post["data"]["author_fullname"],
|
||||
'Thumbnail': post["data"]["thumbnail"],
|
||||
# 'Flair': post["data"]["link_flair_text"],
|
||||
'NSFW': post['data']['over_18'],
|
||||
'Gilded': post['data']['gilded'],
|
||||
'Upvotes': post["data"]["ups"],
|
||||
'Upvote ratio': post["data"]["upvote_ratio"],
|
||||
'Downvotes': post["data"]["downs"],
|
||||
'Awards': post["data"]["total_awards_received"],
|
||||
'Top award': post['data']['top_awarded_type'],
|
||||
'Is crosspostable?': post['data']['is_crosspostable'],
|
||||
'Score': post["data"]["score"],
|
||||
'Category': post['data']['category'],
|
||||
'Domain': post["data"]["domain"],
|
||||
'Created': post['data']['created'],
|
||||
'Approved at': post['data']['approved_at_utc'],
|
||||
'Approved by': post['data']['approved_by'], }
|
||||
|
||||
post_tree = Tree("\n" + post['data']['title'])
|
||||
for post_key, post_value in post_data.items():
|
||||
post_tree.add(f"{post_key}: {post_value}")
|
||||
xprint(post_tree)
|
||||
print(post['data']['selftext'] + "\n")
|
||||
|
||||
|
||||
def reddit_post_scraper():
|
||||
session = requests.session()
|
||||
session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15'}
|
||||
response = session.get(f'https://reddit.com/r/{args.subreddit}/{args.listing}.json?limit={args.limit}&t={args.timeframe}').json()
|
||||
found_posts = 0
|
||||
for post in response['data']['children']:
|
||||
if args.keyword.lower() in post['data']['selftext'] or args.keyword.lower() in post['data']['title']:
|
||||
found_posts += 1
|
||||
get_posts(post)
|
||||
|
||||
log.info(f"Keyword ('{args.keyword}') was found in {found_posts}/{len(response['data']['children'])} {args.listing} posts from r/{args.subreddit}.")
|
||||
|
||||
|
||||
def create_parser():
|
||||
parser = argparse.ArgumentParser(
|
||||
description=f'reddit-post-scraping-tool — by Richard Mwewa | https://about.me/rly0nheart',
|
||||
epilog=f'Given a subreddit name and a keyword, this program returns all top (by default) posts that contain the specified word. ')
|
||||
parser.add_argument('-k', '--keyword', help='kewyword', required=True)
|
||||
parser.add_argument('-s', '--subreddit', help='subreddit', required=True)
|
||||
parser.add_argument('-c', '--limit', help='results limit (1-100) (default: %(default)s)', default=10, type=int)
|
||||
parser.add_argument('-l', '--listing', default='top', const='top', nargs='?',
|
||||
choices=['controversial', 'hot', 'best', 'new', 'rising'],
|
||||
help='listings: controversial, hot, best, new, rising (default: %(default)s)')
|
||||
parser.add_argument('-t', '--timeframe', default='all', const='all', nargs='?',
|
||||
choices=['hour', 'day', 'week', 'month', 'year'],
|
||||
help='timeframe: hour, day, week, month, year (default: %(default)s)')
|
||||
return parser
|
||||
|
||||
|
||||
_parser = create_parser()
|
||||
args = _parser.parse_args()
|
||||
42
rpst/__init__.py
Normal file
42
rpst/__init__.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import os
|
||||
|
||||
__author__: str = "Richard Mwewa"
|
||||
__about_author__: str = "https://about/me/rly0nheart"
|
||||
__version__: str = "2.0.1.0"
|
||||
|
||||
__description__: str = f"""
|
||||
# RPST (Reddit Post Scraping Tool) {__version__}
|
||||
> Retrieve Reddit posts that contain the specified keyword from a specified subreddit.
|
||||
"""
|
||||
__epilog__: str = f"""
|
||||
# by [{__author__}]({__about_author__})
|
||||
|
||||
```
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 {__author__}
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
```
|
||||
"""
|
||||
|
||||
# Construct path to the program's directory
|
||||
PROGRAM_DIRECTORY: str = os.path.expanduser(
|
||||
os.path.join("~", "reddit_post_scraping_tool")
|
||||
)
|
||||
164
rpst/api.py
Normal file
164
rpst/api.py
Normal file
@@ -0,0 +1,164 @@
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
from typing import Union
|
||||
|
||||
import aiohttp
|
||||
|
||||
from .coreutils import log
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
REDDIT_ENDPOINT: str = "https://www.reddit.com"
|
||||
PYPI_PROJECT_ENDPOINT: str = "https://pypi.org/pypi/reddit-post-scraping-tool/json"
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
async def get_data(session: aiohttp.ClientSession, endpoint: str) -> Union[dict, list]:
|
||||
"""
|
||||
Fetches JSON data from a given API endpoint.
|
||||
|
||||
:param session: aiohttp session to use for the request.
|
||||
:param endpoint: The API endpoint to fetch data from.
|
||||
:return: Returns JSON data as a dictionary or list. Returns an empty dict if fetching fails.
|
||||
"""
|
||||
|
||||
try:
|
||||
async with session.get(
|
||||
endpoint,
|
||||
) as response:
|
||||
if response.status == 200:
|
||||
return await response.json()
|
||||
else:
|
||||
error_message = await response.json()
|
||||
log.error(f"An API error occurred: {error_message}")
|
||||
return {}
|
||||
|
||||
except aiohttp.ClientConnectionError as error:
|
||||
log.error(f"An HTTP error occurred: {error}")
|
||||
return {}
|
||||
except Exception as error:
|
||||
log.critical(f"An unknown error occurred: {error}")
|
||||
return {}
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
async def get_updates(session: aiohttp.ClientSession):
|
||||
"""
|
||||
Gets and compares the current program version with the remote version.
|
||||
|
||||
Assumes version format: major.minor.patch.prefix
|
||||
|
||||
:param session: aiohttp session to use for the request.
|
||||
"""
|
||||
from . import __version__
|
||||
|
||||
# Make a GET request to PyPI to get the project's latest release.
|
||||
response: dict = await get_data(endpoint=PYPI_PROJECT_ENDPOINT, session=session)
|
||||
|
||||
if response.get("info"):
|
||||
release: dict = response.get("info")
|
||||
remote_version: str = release.get("version")
|
||||
# Splitting the version strings into components
|
||||
remote_parts: list = remote_version.split(".")
|
||||
local_parts: list = __version__.split(".")
|
||||
|
||||
update_message: str = ""
|
||||
|
||||
# Check for differences in version parts
|
||||
if remote_parts[0] != local_parts[0]:
|
||||
update_message = (
|
||||
f"MAJOR update ({remote_version}) available."
|
||||
f" It might introduce significant changes."
|
||||
)
|
||||
|
||||
elif remote_parts[1] != local_parts[1]:
|
||||
update_message = (
|
||||
f"MINOR update ({remote_version}) available."
|
||||
f" Includes small feature changes/improvements."
|
||||
)
|
||||
|
||||
elif remote_parts[2] != local_parts[2]:
|
||||
update_message = (
|
||||
f"PATCH update ({remote_version}) available."
|
||||
f" Generally for bug fixes and small tweaks."
|
||||
)
|
||||
|
||||
elif (
|
||||
len(remote_parts) > 3
|
||||
and len(local_parts) > 3
|
||||
and remote_parts[3] != local_parts[3]
|
||||
):
|
||||
update_message = (
|
||||
f"BUILD update ({remote_version}) available."
|
||||
f" Might be for specific builds or special versions."
|
||||
)
|
||||
|
||||
if update_message:
|
||||
log.info(update_message)
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
async def get_posts(
|
||||
subreddit: str,
|
||||
listing: str,
|
||||
timeframe: str,
|
||||
limit: int,
|
||||
session: aiohttp.ClientSession,
|
||||
) -> list:
|
||||
all_posts = await paginated_posts(
|
||||
posts_endpoint=f"{REDDIT_ENDPOINT}/r/{subreddit}/{listing}.json?limit={limit}&t={timeframe}",
|
||||
limit=limit,
|
||||
session=session,
|
||||
)
|
||||
|
||||
return all_posts[:limit]
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
async def paginated_posts(
|
||||
posts_endpoint: str, limit: int, session: aiohttp.ClientSession
|
||||
) -> list:
|
||||
"""
|
||||
Paginates and retrieves posts until the specified limit is reached.
|
||||
|
||||
:param posts_endpoint: API endpoint for retrieving posts.
|
||||
:param limit: Limit of the number of posts to retrieve.
|
||||
:param session: aiohttp session to use for the request.
|
||||
:return: A list of all posts.
|
||||
"""
|
||||
all_posts: list = []
|
||||
last_post_id: str = ""
|
||||
|
||||
# Determine whether to use the 'after' parameter
|
||||
use_after: bool = limit > 100
|
||||
|
||||
while len(all_posts) < limit:
|
||||
# Make the API request with the 'after' parameter if it's provided and the limit is more than 100
|
||||
if use_after and last_post_id:
|
||||
endpoint_with_after: str = f"{posts_endpoint}&after={last_post_id}"
|
||||
else:
|
||||
endpoint_with_after: str = posts_endpoint
|
||||
|
||||
posts_data: dict = await get_data(endpoint=endpoint_with_after, session=session)
|
||||
posts_children: list = posts_data.get("data", {}).get("children", [])
|
||||
|
||||
# If there are no more posts, break out of the loop
|
||||
if not posts_children:
|
||||
break
|
||||
|
||||
all_posts.extend(posts_children)
|
||||
|
||||
# We use the id of the last post in the list to paginate to the next posts
|
||||
last_post_id: str = all_posts[-1].get("data").get("id")
|
||||
|
||||
return all_posts
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
103
rpst/base.py
Normal file
103
rpst/base.py
Normal file
@@ -0,0 +1,103 @@
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
|
||||
import aiohttp
|
||||
|
||||
from .api import get_posts, get_updates
|
||||
from .coreutils import timestamp_to_utc
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
@dataclass
|
||||
class Post:
|
||||
id: str
|
||||
thumbnail: str
|
||||
title: str
|
||||
text: str
|
||||
author: str
|
||||
subreddit: str
|
||||
subreddit_id: str
|
||||
subreddit_type: str
|
||||
upvotes: int
|
||||
upvote_ratio: float
|
||||
downvotes: int
|
||||
gilded: int
|
||||
is_nsfw: bool
|
||||
is_shareable: bool
|
||||
is_edited: bool
|
||||
comments: int
|
||||
hide_from_bots: bool
|
||||
score: float
|
||||
domain: str
|
||||
permalink: str
|
||||
is_locked: bool
|
||||
is_archived: bool
|
||||
created_at: str
|
||||
raw_post: dict
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
async def find_posts(
|
||||
keyword: str,
|
||||
subreddit: str,
|
||||
listing: str,
|
||||
timeframe: str,
|
||||
limit: int,
|
||||
) -> List[Post]:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
found_posts_count: int = 0
|
||||
found_posts_list: list = []
|
||||
|
||||
await get_updates(session=session)
|
||||
raw_posts: list = await get_posts(
|
||||
subreddit=subreddit,
|
||||
listing=listing,
|
||||
timeframe=timeframe,
|
||||
limit=limit,
|
||||
session=session,
|
||||
)
|
||||
for raw_post in raw_posts:
|
||||
post_data: dict = raw_post.get("data")
|
||||
|
||||
if keyword.lower() in post_data.get(
|
||||
"selftext"
|
||||
) or keyword.lower() in post_data.get("title"):
|
||||
found_posts_count += 1
|
||||
post = Post(
|
||||
id=post_data.get("id"),
|
||||
thumbnail=post_data.get("thumbnail"),
|
||||
title=post_data.get("title"),
|
||||
text=post_data.get("selftext"),
|
||||
author=post_data.get("author"),
|
||||
subreddit=post_data.get("subreddit"),
|
||||
subreddit_id=post_data.get("subreddit_id"),
|
||||
subreddit_type=post_data.get("subreddit_type"),
|
||||
upvotes=post_data.get("ups"),
|
||||
upvote_ratio=post_data.get("upvote_ratio"),
|
||||
downvotes=post_data.get("downs"),
|
||||
gilded=post_data.get("gilded"),
|
||||
is_nsfw=post_data.get("over_18"),
|
||||
is_shareable=post_data.get("is_reddit_media_domain"),
|
||||
is_edited=post_data.get("edited"),
|
||||
comments=post_data.get("num_comments"),
|
||||
hide_from_bots=post_data.get("is_robot_indexable"),
|
||||
score=post_data.get("score"),
|
||||
domain=post_data.get("domain"),
|
||||
permalink=post_data.get("permalink"),
|
||||
is_locked=post_data.get("locked"),
|
||||
is_archived=post_data.get("archived"),
|
||||
created_at=timestamp_to_utc(timestamp=post_data.get("created_utc")),
|
||||
raw_post=post_data,
|
||||
)
|
||||
found_posts_list.append(post)
|
||||
|
||||
return found_posts_list
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
170
rpst/coreutils.py
Normal file
170
rpst/coreutils.py
Normal file
@@ -0,0 +1,170 @@
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
import argparse
|
||||
import csv
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
from rich.logging import RichHandler
|
||||
from rich.markdown import Markdown
|
||||
from rich_argparse import RichHelpFormatter
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def timestamp_to_utc(timestamp: int) -> str:
|
||||
"""
|
||||
Converts a Unix timestamp to a formatted datetime string.
|
||||
|
||||
:param timestamp: The Unix timestamp to be converted.
|
||||
:return: A formatted datetime string in the format "dd MMMM yyyy, hh:mm:ssAM/PM".
|
||||
"""
|
||||
utc_from_timestamp: datetime = datetime.utcfromtimestamp(timestamp)
|
||||
datetime_string: str = utc_from_timestamp.strftime("%d %B %Y, %I:%M:%S%p")
|
||||
return datetime_string
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def pathfinder(directories: list[str]):
|
||||
for directory in directories:
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def save_posts(
|
||||
filename: str,
|
||||
save_to_dir: str,
|
||||
posts: list,
|
||||
save_json: bool = False,
|
||||
save_csv: bool = False,
|
||||
):
|
||||
posts_data: list = [post.__dict__ for post in posts]
|
||||
|
||||
if save_json:
|
||||
json_path = os.path.join(os.path.join(save_to_dir, "json"), f"{filename}.json")
|
||||
with open(json_path, "w", encoding="utf-8") as json_file:
|
||||
json.dump(posts_data, json_file, indent=4)
|
||||
log.info(
|
||||
f"{os.path.getsize(json_file.name)} bytes written to [link file://{json_file.name}]{json_file.name}"
|
||||
)
|
||||
|
||||
if save_csv:
|
||||
csv_path = os.path.join(os.path.join(save_to_dir, "csv"), f"{filename}.csv")
|
||||
with open(csv_path, "w", newline="", encoding="utf-8") as csv_file:
|
||||
writer = csv.writer(csv_file)
|
||||
if posts:
|
||||
writer.writerow(
|
||||
posts_data[0].keys()
|
||||
) # header from keys of the first item
|
||||
for post in posts:
|
||||
writer.writerow(post.__dict__.values())
|
||||
log.info(
|
||||
f"{os.path.getsize(csv_file.name)} bytes written to [link file://{csv_file.name}]{csv_file.name}"
|
||||
)
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def create_parser():
|
||||
"""
|
||||
Creates and configures an argument parser for the command line arguments.
|
||||
|
||||
:return: A configured argparse.ArgumentParser object ready to parse the command line arguments.
|
||||
"""
|
||||
from . import __version__, __description__, __epilog__
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=Markdown(__description__, style="argparse.text"),
|
||||
epilog=Markdown(__epilog__, style="argparse.text"),
|
||||
formatter_class=RichHelpFormatter,
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
"keyword",
|
||||
help="keyword to search for, in posts",
|
||||
)
|
||||
parser.add_argument("subreddit", help="subreddit to scrape")
|
||||
parser.add_argument(
|
||||
"-l",
|
||||
"--limit",
|
||||
help="maximum number of posts to scrape (default: %(default)s)",
|
||||
default=200,
|
||||
type=int,
|
||||
)
|
||||
parser.add_argument(
|
||||
"-ls",
|
||||
"--listing",
|
||||
default="top",
|
||||
const="top",
|
||||
nargs="?",
|
||||
choices=["best", "controversial", "hot", "new", "rising", "top"],
|
||||
help="listing of posts to scrape (default: %(default)s)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-t",
|
||||
"--timeframe",
|
||||
default="all",
|
||||
const="all",
|
||||
nargs="?",
|
||||
choices=["hour", "day", "week", "month", "year", "all"],
|
||||
help="timeframe from which to scrape posts (default: %(default)s)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-j",
|
||||
"--json",
|
||||
help="write found posts to a json file",
|
||||
action="store_true",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-c",
|
||||
"--csv",
|
||||
help="write found posts to a csv file",
|
||||
action="store_true",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-d",
|
||||
"--debug",
|
||||
help="(dev) run rpst in debug mode",
|
||||
action="store_true",
|
||||
)
|
||||
parser.add_argument("-v", "--version", action="version", version=__version__)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def set_loglevel(debug_mode: bool) -> logging.getLogger:
|
||||
"""
|
||||
Configure and return a logging object with the specified log level.
|
||||
|
||||
:param debug_mode: If True, the log level is set to "NOTSET". Otherwise, it is set to "INFO".
|
||||
:return: A logging object configured with the specified log level.
|
||||
"""
|
||||
logging.basicConfig(
|
||||
level="DEBUG" if debug_mode else "INFO",
|
||||
format="%(message)s",
|
||||
handlers=[
|
||||
RichHandler(
|
||||
markup=True, log_time_format="%I:%M:%S%p", show_level=debug_mode
|
||||
)
|
||||
],
|
||||
)
|
||||
return logging.getLogger("RPST (Reddit Post Scraping Tool)")
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
args: argparse = create_parser().parse_args()
|
||||
log: logging.getLogger = set_loglevel(debug_mode=args.debug)
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
94
rpst/scraper.py
Normal file
94
rpst/scraper.py
Normal file
@@ -0,0 +1,94 @@
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
import asyncio
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
from rich.pretty import pprint
|
||||
|
||||
from . import __version__, PROGRAM_DIRECTORY
|
||||
from .base import find_posts
|
||||
from .coreutils import args, log, save_posts, pathfinder
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
|
||||
|
||||
def run():
|
||||
"""Main entry point for rpst or rpst."""
|
||||
# ------------------------------------- #
|
||||
|
||||
keyword: str = args.keyword
|
||||
subreddit: str = args.subreddit
|
||||
listing: str = args.listing
|
||||
limit: int = args.limit
|
||||
|
||||
# ------------------------------------- #
|
||||
|
||||
start_time = datetime.now()
|
||||
|
||||
# ------------------------------------- #
|
||||
|
||||
print(
|
||||
"""
|
||||
┳┓┏┓┏┓┏┳┓
|
||||
┣┫┃┃┗┓ ┃
|
||||
┛┗┣┛┗┛ ┻ """
|
||||
)
|
||||
|
||||
# ------------------------------------- #
|
||||
|
||||
try:
|
||||
log.info(
|
||||
f"[bold]RPST[/] {__version__} started at {start_time.strftime('%a %b %d %Y, %I:%M:%S%p')}..."
|
||||
)
|
||||
|
||||
found_posts = asyncio.run(
|
||||
find_posts(
|
||||
keyword=keyword,
|
||||
subreddit=subreddit,
|
||||
listing=listing,
|
||||
timeframe=args.timeframe,
|
||||
limit=limit,
|
||||
),
|
||||
)
|
||||
|
||||
if found_posts:
|
||||
pprint(
|
||||
found_posts,
|
||||
expand_all=True,
|
||||
)
|
||||
log.info(
|
||||
f"'{subreddit}': Found {len(found_posts)}/{limit} {listing} posts containing the keyword ('{keyword}')"
|
||||
)
|
||||
if args.json or args.csv:
|
||||
target_dir: str = os.path.join(PROGRAM_DIRECTORY, subreddit)
|
||||
pathfinder(
|
||||
directories=[
|
||||
os.path.join(target_dir, "csv"),
|
||||
os.path.join(target_dir, "json"),
|
||||
]
|
||||
)
|
||||
save_posts(
|
||||
filename=keyword,
|
||||
save_to_dir=target_dir,
|
||||
posts=found_posts,
|
||||
save_json=args.json,
|
||||
save_csv=args.csv,
|
||||
)
|
||||
else:
|
||||
log.info(
|
||||
f"'r/{subreddit}': No {listing} posts found that contain the keyword ('{keyword}')"
|
||||
)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
log.warning("User interruption detected ([yellow]Ctrl+C[/])")
|
||||
except Exception as error:
|
||||
log.error(f"An error occurred: [red]{error}[/]")
|
||||
finally:
|
||||
log.info(f"Finished in {datetime.now() - start_time} seconds")
|
||||
|
||||
# ------------------------------------- #
|
||||
|
||||
|
||||
# +++++++++++++++++++++++++++++++++++++++++++++++++ #
|
||||
31
setup.py
31
setup.py
@@ -1,31 +0,0 @@
|
||||
import setuptools
|
||||
|
||||
with open("README.md", "r", encoding="utf-8") as file:
|
||||
long_description = file.read()
|
||||
|
||||
setuptools.setup(
|
||||
name="reddit-post-scraping-tool",
|
||||
version="1.1.0.0",
|
||||
author="Richard Mwewa",
|
||||
author_email="rly0nheart@duck.com",
|
||||
packages=["reddit_post_scraping_tool"],
|
||||
description="Given a subreddit name and a keyword, this program returns all top (by default) posts that contain the specified word.",
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
url="https://github.com/rly0nheart/reddit-post-scraping-tool",
|
||||
license="MIT License",
|
||||
install_requires=["rich", "requests"],
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Intended Audience :: Information Technology',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Operating System :: OS Independent',
|
||||
'Natural Language :: English',
|
||||
'Programming Language :: Python :: 3'
|
||||
],
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"reddit_post_scraping_tool=reddit_post_scraping_tool.main:main",
|
||||
]
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user