├── mergechance ├── __init__.py ├── test │ ├── __init__.py │ └── test_analysis.py ├── data_export.py ├── db.py ├── templates │ ├── index.html │ └── chance.html ├── gh_gql.py ├── main.py ├── analysis.py └── blacklist.py ├── .gitignore ├── requirements.txt ├── first_config.sh ├── scripts ├── batch.sh ├── README.md ├── score.py ├── requirements.txt ├── gh-rest-api │ └── get_pr_data.py └── get_pr_gql.py ├── Dockerfile ├── README.md └── LICENSE /mergechance/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mergechance/test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .env 3 | envs 4 | secrets 5 | .ipynb_checkpoints 6 | .DS_STORE 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==1.1.2 2 | gunicorn==20.0.4 3 | requests==2.24.0 4 | firebase-admin==4.5.0 5 | python-dateutil==2.8.1 6 | -------------------------------------------------------------------------------- /first_config.sh: -------------------------------------------------------------------------------- 1 | gcloud config set project $GCP_PROJECT 2 | gcloud config set run/region $GCP_REGION 3 | gcloud config set run/platform managed 4 | -------------------------------------------------------------------------------- /scripts/batch.sh: -------------------------------------------------------------------------------- 1 | # pass a file with one org/repo per line (in a format as the get_pr_gql.py expects) 2 | cat $1 | tr '\n' '\0' | xargs -0 -n1 python get_pr_gql.py 3 | CSV_DIR="$1_prs" 4 | OUTSIDERS_DIR="$1_prs_outsiders" 5 | ALL_DIR="$1_prs_all" 6 | mkdir -p $CSV_DIR 7 | mkdir -p $OUTSIDERS_DIR 8 | mkdir -p $ALL_DIR 9 | mv *csv "$CSV_DIR"/ 10 | for f in $(ls $CSV_DIR) 11 | do 12 | python score.py $CSV_DIR/$f --outsiders 13 | mv *png "$OUTSIDERS_DIR/" 14 | python score.py "$CSV_DIR/$f" 15 | mv *png "$ALL_DIR/" 16 | done 17 | -------------------------------------------------------------------------------- /mergechance/data_export.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | from typing import List 4 | from typing import List 5 | from mergechance.analysis import ANALYSIS_FIELDS 6 | 7 | 8 | def prep_tsv(prs:List) -> str: 9 | """Create a tsv content with pr data.""" 10 | rows = [ 11 | ['author'] + ANALYSIS_FIELDS, 12 | ] 13 | for pr in prs: 14 | author_login = pr['author']['login'] if pr['author'] else '' 15 | row = [author_login] 16 | fields = [str(pr.get(field, '')) for field in ANALYSIS_FIELDS] 17 | row.extend(fields) 18 | rows.append(row) 19 | lines = ["\t".join(row) for row in rows] 20 | return "\n".join(lines) 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use the official Python image. 2 | # https://hub.docker.com/_/python 3 | FROM python:3.8 4 | 5 | # Allow statements and log messages to immediately appear in the Cloud Run logs 6 | ENV PYTHONUNBUFFERED True 7 | 8 | # Copy application dependency manifests to the container image. 9 | # Copying this separately prevents re-running pip install on every code change. 10 | COPY requirements.txt ./ 11 | 12 | # Install production dependencies. 13 | RUN pip install -r requirements.txt 14 | 15 | # Copy local code to the container image. 16 | ENV APP_HOME /app 17 | WORKDIR $APP_HOME 18 | COPY . ./ 19 | 20 | # Run the web service on container startup. 21 | # Use gunicorn webserver with one worker process and 8 threads. 22 | # For environments with multiple CPU cores, increase the number of workers 23 | # to be equal to the cores available. 24 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 mergechance.main:app 25 | -------------------------------------------------------------------------------- /scripts/README.md: -------------------------------------------------------------------------------- 1 | # How Likely Is Your OSS Contribution to Succeed 2 | 3 | __Check Merge Chance for a public GitHub Repo [here](https://merge-chance.info)__ 4 | 5 | Or use `get_pr_gql.py` script from this repo for more control and data. 6 | 7 | Requires python 3.6+ 8 | Prepare a venv 9 | ```shell 10 | python -m venv .env 11 | source .env/bin/activate 12 | pip install -r requirements.txt 13 | ``` 14 | You will need a GitHub token, [instructions](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token). 15 | 16 | run the script 17 | ```shell 18 | GH_TOKEN=YOUR_GH_TOKEN python get_pr_gql.py ORG/REPO 19 | ``` 20 | Make a score plot 21 | ```shell 22 | python score.py org_repo.csv 23 | ``` 24 | or if you want to plot only outsider contributions (author affiliation other than MEMBER or OWNER) do: 25 | ```shell 26 | python score.py org_repo.csv --outsiders 27 | ``` 28 | ## What is in the other directories? 29 | - `web` merge-chance.info code 30 | - `exploration` contains a simple analysis of one repository 31 | - `gh-rest-api` contains my old script for fetching the same data with REST-api (slooow) 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # merge-chance.info code 2 | This is repo for the [merge-chance](https://merge-chance.info), page where you can checks success rate for your favorite open-source project on GitHub. 3 | 4 | _if you just want to make some plots for given repo locally, use scripts from the `scripts` dir._ 5 | 6 | ## Build & Setup 7 | 8 | You will need a GitHub token, in order to extract data from GitHub [instructions](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token). 9 | 10 | First setup a google cloud project and set following env vars: 11 | ```shell 12 | export GCP_PROJECT=YOUR_PROJECT 13 | export GCP_REGION=DESIRED_REGION 14 | export GH_TOKEN=YOUR_GITHUB_TOKEN 15 | ``` 16 | Then create a service account with admin rights to your project's firestore. Save the json key to this service account as `key.json` in current dir. 17 | Run the app locally with 18 | ```shell 19 | gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 mergechance.main:app 20 | ``` 21 | Before first deploy to GCP run 22 | ```shell 23 | ./first_config.sh 24 | ``` 25 | in order to deploy it as a Cloud Run service on your GCP project run 26 | ```shell 27 | ./build.sh 28 | ``` 29 | This will build the container with Cloud Build and deploy it. 30 | -------------------------------------------------------------------------------- /scripts/score.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import pandas as pd 4 | import seaborn as sns 5 | 6 | STALE_THRESHOLD = 90 * 24 * 60 * 60 # 90 days in seconds 7 | 8 | if len(sys.argv) < 2: 9 | print("Path to a csv required as the first argument") 10 | sys.exit(1) 11 | OUTSIDER_ONLY = False 12 | if len(sys.argv) == 3: 13 | OUTSIDER_ONLY = sys.argv[2] == "--outsiders" 14 | 15 | path = sys.argv[1] 16 | data = pd.read_csv(path) 17 | 18 | if OUTSIDER_ONLY: 19 | data = data.drop(data[data['author'] == "MEMBER"].index) 20 | data = data.drop(data[data['author'] == "OWNER"].index) 21 | 22 | def is_stale(created, extracted): 23 | return (extracted - created) > STALE_THRESHOLD 24 | 25 | 26 | def classify_pr(pr_stats): 27 | if pr_stats["state"] == "MERGED": 28 | return "Successful" 29 | elif pr_stats["state"] == "CLOSED": 30 | return "Rejected" 31 | elif pr_stats["state"] == "OPEN" and is_stale( 32 | pr_stats["created_at"], pr_stats["extracted_at"] 33 | ): 34 | return "Stale" 35 | else: 36 | return "Active" 37 | 38 | 39 | pr_class = data.apply(classify_pr, axis=1) 40 | data = data.assign(PR=pr_class) 41 | plot_order = ["Successful", "Rejected", "Stale", "Active"] 42 | plot = sns.countplot( 43 | data=data, x="PR", palette="colorblind", order=plot_order 44 | ).get_figure() 45 | 46 | repo_name = os.path.basename(path) 47 | if repo_name.endswith(".csv"): 48 | repo_name = repo_name[:-4] 49 | plot.savefig(f"{repo_name}.png") 50 | -------------------------------------------------------------------------------- /scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.4 2 | appnope==0.1.2 3 | argon2-cffi==20.1.0 4 | async-generator==1.10 5 | attrs==20.3.0 6 | backcall==0.2.0 7 | black==20.8b1 8 | bleach==3.2.1 9 | certifi==2020.12.5 10 | cffi==1.14.4 11 | chardet==3.0.4 12 | click==7.1.2 13 | cycler==0.10.0 14 | decorator==4.4.2 15 | defusedxml==0.6.0 16 | Deprecated==1.2.10 17 | entrypoints==0.3 18 | idna==2.10 19 | ipykernel==5.4.2 20 | ipython==7.19.0 21 | ipython-genutils==0.2.0 22 | ipywidgets==7.5.1 23 | jedi==0.17.2 24 | Jinja2==2.11.2 25 | jsonschema==3.2.0 26 | jupyter==1.0.0 27 | jupyter-client==6.1.7 28 | jupyter-console==6.2.0 29 | jupyter-core==4.7.0 30 | jupyterlab-pygments==0.1.2 31 | kiwisolver==1.3.1 32 | MarkupSafe==1.1.1 33 | matplotlib==3.3.3 34 | mistune==0.8.4 35 | mypy-extensions==0.4.3 36 | nbclient==0.5.1 37 | nbconvert==6.0.7 38 | nbformat==5.0.8 39 | nest-asyncio==1.4.3 40 | notebook==6.1.5 41 | numpy==1.19.4 42 | packaging==20.8 43 | pandas==1.1.5 44 | pandocfilters==1.4.3 45 | parso==0.7.1 46 | pathspec==0.8.1 47 | pexpect==4.8.0 48 | pickleshare==0.7.5 49 | Pillow==8.0.1 50 | prometheus-client==0.9.0 51 | prompt-toolkit==3.0.8 52 | ptyprocess==0.6.0 53 | pycparser==2.20 54 | PyGithub==1.54 55 | Pygments==2.7.3 56 | PyJWT==1.7.1 57 | pyparsing==2.4.7 58 | pyrsistent==0.17.3 59 | python-dateutil==2.8.1 60 | pytz==2020.4 61 | pyzmq==20.0.0 62 | qtconsole==5.0.1 63 | QtPy==1.9.0 64 | regex==2020.11.13 65 | requests==2.24.0 66 | scipy==1.5.4 67 | seaborn==0.11.0 68 | Send2Trash==1.5.0 69 | six==1.15.0 70 | terminado==0.9.1 71 | testpath==0.4.4 72 | toml==0.10.2 73 | tornado==6.1 74 | traitlets==5.0.5 75 | typed-ast==1.4.1 76 | typing-extensions==3.7.4.3 77 | urllib3==1.25.11 78 | wcwidth==0.2.5 79 | webencodings==0.5.1 80 | widgetsnbextension==3.5.1 81 | wrapt==1.12.1 82 | -------------------------------------------------------------------------------- /mergechance/db.py: -------------------------------------------------------------------------------- 1 | import time 2 | from firebase_admin import credentials, firestore, initialize_app 3 | import logging 4 | 5 | 6 | TTL = 24 * 60 * 60 # A day in seconds 7 | 8 | # Initialize Firestore DB 9 | cred = credentials.Certificate("key.json") 10 | default_app = initialize_app(cred) 11 | db = firestore.client() 12 | cache_ref = db.collection("cache") 13 | 14 | log = logging.getLogger(__name__) 15 | 16 | 17 | def autocomplete_list() -> list: 18 | """return list of last used repos.""" 19 | data = ( 20 | cache_ref.order_by("ts", direction=firestore.Query.DESCENDING).limit(500).get() 21 | ) 22 | repo_names = [repo.to_dict()["name"] for repo in data] 23 | return repo_names 24 | 25 | 26 | def escape_fb_key(repo_target): 27 | """GitHub repos contain '/' which is a path delimiter in firestore.""" 28 | return repo_target.replace("/", "_") 29 | 30 | 31 | def get_from_cache(repo): 32 | repo = escape_fb_key(repo) 33 | try: 34 | cached = cache_ref.document(repo).get().to_dict() 35 | if not cached: 36 | return None 37 | median = cached.get("median") 38 | if not median: 39 | return None 40 | age = time.time() - cached["ts"] 41 | if age < TTL: 42 | return cached.get("chance"), median, cached.get("total"), cached.get("prs", []) 43 | return None 44 | except Exception as e: 45 | log.critical(f"An error occured ruing retrieving cache: {e}") 46 | 47 | 48 | def cache(repo, chance, median, total, prs): 49 | escaped_repo = escape_fb_key(repo) 50 | try: 51 | ts = time.time() 52 | cache_ref.document(escaped_repo).set( 53 | {"chance": chance, "ts": ts, "name": repo, "total": total, "median": median, "prs": prs} 54 | ) 55 | except Exception as e: 56 | log.critical(f"An error occured during caching: {e}") 57 | -------------------------------------------------------------------------------- /mergechance/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Merge Chance 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 |

Will your PR get merged?

15 |

16 |
17 |
18 | 19 | Type in a GitHub repo name including the owner. e.g: JuliaLang/Julia (or paste entire url) 20 |
21 |
22 | 23 | (case-insensitive) 24 |
25 |
26 |
27 | 28 | 29 | 30 |
31 |
32 |
33 |
34 | 38 | 39 | 40 | 41 | 64 | 65 | -------------------------------------------------------------------------------- /mergechance/gh_gql.py: -------------------------------------------------------------------------------- 1 | """Module for handling GitHub's GraphQL API.""" 2 | from typing import List 3 | import os 4 | import logging 5 | import requests as rq 6 | 7 | log = logging.getLogger(__name__) 8 | 9 | TOKEN = os.getenv("GH_TOKEN") 10 | STEP_SIZE = 100 # 100 is Max 11 | GH_GQL_URL = "https://api.github.com/graphql" 12 | 13 | 14 | def get_pr_fields(org: str, repo: str, fields: List[str], page_cap=1, cursor=None) -> tuple: 15 | """Get specified GitHub PR fields. 16 | 17 | org - GitHub organization/users 18 | repo - GitHub repository 19 | fields - list of PR edge fields (See GitHub GraphQL docs) 20 | page_cap - how many pages (each 100 records) to fetch 21 | start_at - graphQl cursor to resume previous query 22 | """ 23 | pages = 0 24 | has_next = True 25 | rows = [] 26 | while has_next and pages < page_cap: 27 | result = _paginated_query(org, repo, cursor, fields) 28 | rows.extend(_to_rows(result)) 29 | page_info = result["data"]["repository"]["pullRequests"]["pageInfo"] 30 | has_next = page_info["hasPreviousPage"] 31 | cursor = page_info["startCursor"] 32 | pages += 1 33 | return rows, cursor 34 | 35 | 36 | def _to_rows(result: dict): 37 | rows = [] 38 | for edge in result["data"]["repository"]["pullRequests"]["edges"]: 39 | rows.append(edge["node"]) 40 | return rows 41 | 42 | 43 | def _paginated_query(owner, repo, cursor, fields): 44 | fields = "\n".join(fields) 45 | cursor_part = f', before: "{cursor}"' if cursor else "" 46 | data = { 47 | "query": """ 48 | query { 49 | repository(owner:"%s", name:"%s") { 50 | pullRequests(last: %s %s) { 51 | pageInfo { 52 | hasPreviousPage 53 | startCursor 54 | } 55 | edges { 56 | cursor 57 | node { 58 | timelineItems(last: 1 , itemTypes: CLOSED_EVENT) { 59 | edges { 60 | node { 61 | ... on ClosedEvent { 62 | actor{ 63 | login 64 | } 65 | } 66 | } 67 | } 68 | } 69 | author { 70 | login 71 | } 72 | %s 73 | } 74 | } 75 | } 76 | } 77 | } 78 | """ 79 | % (owner, repo, STEP_SIZE, cursor_part, fields) 80 | } 81 | return _gql_request(data) 82 | 83 | 84 | def _gql_request(data): 85 | headers = {"Authorization": f"bearer {TOKEN}"} 86 | res = rq.post(GH_GQL_URL, headers=headers, json=data) 87 | data = res.json() 88 | if "errors" in data: 89 | errs = data["errors"] 90 | log.critical(f"Failed GQL query with {errs}") 91 | raise GQLError() 92 | return data 93 | 94 | 95 | class GQLError(Exception): 96 | pass 97 | -------------------------------------------------------------------------------- /scripts/gh-rest-api/get_pr_data.py: -------------------------------------------------------------------------------- 1 | from github import Github, PaginatedList 2 | from github.GithubException import RateLimitExceededException 3 | import os 4 | import sys 5 | import time 6 | from datetime import datetime 7 | 8 | 9 | TOKEN = os.getenv("GH_TOKEN") 10 | # REPORT_PROGRESS controls after how many PRs % of totall processed will be printed out 11 | REPORT_PROGRESS = 25 12 | 13 | def main(): 14 | if not TOKEN: 15 | print("You need to set GH_TOKEN env var") 16 | sys.exit(1) 17 | if len(sys.argv) < 2: 18 | print( 19 | "Pass github repo name as first position argument.\n 'facebook/react' for example" 20 | ) 21 | sys.exit(1) 22 | 23 | g = Github(TOKEN) 24 | target_repo_id = sys.argv[1] 25 | target_repo = g.get_repo(target_repo_id) 26 | csv_data = [["state", "created_at", "merged", "merge_date", "no_comments", "extracted_at"]] 27 | 28 | open_prs = target_repo.get_pulls(sort="created_at") 29 | print("Will process open PRs ..") 30 | open_prs_data = process_pr_data(open_prs) 31 | csv_data.extend(open_prs_data) 32 | 33 | closed_prs = target_repo.get_pulls(state="closed", sort="created_at") 34 | print("Will process closed PRs ..") 35 | closed_prs_data = process_pr_data(closed_prs) 36 | csv_data.extend(closed_prs_data) 37 | 38 | csv_name = f"{target_repo_id}.csv" 39 | csv_name = csv_name.replace(os.sep, "_") 40 | print(f"Will write results to {csv_name}") 41 | with open(csv_name, "w") as outfile: 42 | lines = [",".join(row) for row in csv_data] 43 | text = "\n".join(lines) 44 | outfile.write(text + "\n") 45 | 46 | 47 | def process_pr_data(paginated_gh_result: PaginatedList): 48 | rows = [] 49 | while True: 50 | try: 51 | _process_pr_data(paginated_gh_result, rows, len(rows)) 52 | except RateLimitExceededException: 53 | print("Rate limited. Will sleep for 5 minutes and try again...") 54 | time.sleep(3600) 55 | else: 56 | break 57 | return rows 58 | 59 | def _process_pr_data(paginated_gh_result: PaginatedList, rows, resume_ind = 0): 60 | total = paginated_gh_result.totalCount 61 | processed_prs = resume_ind 62 | print(f"{total} PRs to process...") 63 | for pr in paginated_gh_result[resume_ind:]: 64 | created_at = pr.created_at.timestamp() if pr.created_at else "N/A" 65 | merged_at = pr.merged_at.timestamp() if pr.merged_at else "N/A" 66 | extracted_at = datetime.now().timestamp() 67 | row = [ 68 | pr.state, 69 | f"{created_at}", 70 | f"{pr.merged}", 71 | f"{merged_at}", 72 | f"{pr.comments}", 73 | f"{extracted_at}", 74 | ] 75 | rows.append(row) 76 | processed_prs += 1 77 | if (processed_prs % REPORT_PROGRESS) == 0: 78 | perc_progress = round(processed_prs / total * 100, 2) 79 | print(f"Processed {perc_progress} % of PRs") 80 | 81 | print("Processed 100 % of PRs") 82 | 83 | if __name__ == "__main__": 84 | main() 85 | -------------------------------------------------------------------------------- /scripts/get_pr_gql.py: -------------------------------------------------------------------------------- 1 | import requests as rq 2 | import os 3 | import sys 4 | from datetime import datetime 5 | from dateutil import parser 6 | 7 | 8 | TOKEN = os.getenv("GH_TOKEN") 9 | STEP_SIZE = 100 10 | GH_GQL_URL = "https://api.github.com/graphql" 11 | 12 | 13 | def main(): 14 | if not TOKEN: 15 | print("You need to set GH_TOKEN env var") 16 | sys.exit(1) 17 | if len(sys.argv) < 2: 18 | print( 19 | "Pass github repo name as first position argument.\n 'facebook/react' for example" 20 | ) 21 | sys.exit(1) 22 | owner, repo = sys.argv[1].split('/') 23 | first_resp = first_query(owner, repo) 24 | total = first_resp["data"]["repository"]["pullRequests"]["totalCount"] 25 | has_next = first_resp["data"]["repository"]["pullRequests"]["pageInfo"][ 26 | "hasNextPage" 27 | ] 28 | cursor = first_resp["data"]["repository"]["pullRequests"]["edges"][-1]["cursor"] 29 | print(f"Total PRs to process {total}.") 30 | rows = [["state", "created_at", "extracted_at", "author"]] 31 | to_csv(first_resp, rows) 32 | while has_next: 33 | progress = round(len(rows) / total * 100, 2) 34 | print(f"Processed {progress}% of the total ...") 35 | result = paginated_query(owner, repo, cursor) 36 | has_next = result["data"]["repository"]["pullRequests"]["pageInfo"][ 37 | "hasNextPage" 38 | ] 39 | to_csv(result, rows) 40 | cursor = result["data"]["repository"]["pullRequests"]["edges"][-1]["cursor"] 41 | print("Done fetching") 42 | csv_name = f"{owner}_{repo}.csv" 43 | print(f"Will save results to {csv_name}") 44 | with open(csv_name, "w") as outfile: 45 | lines = [",".join(row) for row in rows] 46 | text = "\n".join(lines) 47 | outfile.write(text + "\n") 48 | 49 | 50 | def first_query(owner, repo): 51 | data = { 52 | "query": """ 53 | query { 54 | repository(owner:"%s", name:"%s") { 55 | pullRequests(first: %s) { 56 | totalCount 57 | pageInfo { 58 | hasNextPage 59 | } 60 | edges { 61 | cursor 62 | node { 63 | state 64 | createdAt 65 | authorAssociation 66 | } 67 | } 68 | } 69 | } 70 | } 71 | """ 72 | % (owner, repo, STEP_SIZE) 73 | } 74 | return gql_request(data) 75 | 76 | 77 | def paginated_query(owner, repo, cursor): 78 | data = { 79 | "query": """ 80 | query { 81 | repository(owner:"%s", name:"%s") { 82 | pullRequests(first: %s, after: "%s") { 83 | totalCount 84 | pageInfo { 85 | hasNextPage 86 | } 87 | edges { 88 | cursor 89 | node { 90 | state 91 | createdAt 92 | authorAssociation 93 | } 94 | } 95 | } 96 | } 97 | } 98 | """ 99 | % (owner, repo, STEP_SIZE, cursor) 100 | } 101 | return gql_request(data) 102 | 103 | 104 | def gql_request(data): 105 | headers = {"Authorization": f"bearer {TOKEN}"} 106 | res = rq.post(GH_GQL_URL, headers=headers, json=data) 107 | return res.json() 108 | 109 | 110 | def to_csv(gql_result, rows: list): 111 | extracted_at = datetime.now().timestamp() 112 | for edge in gql_result["data"]["repository"]["pullRequests"]["edges"]: 113 | node = edge["node"] 114 | created_at = node["createdAt"] 115 | # parse to ts 116 | created_at = parser.parse(created_at).timestamp() 117 | author = node["authorAssociation"] 118 | row = [node["state"], str(created_at), str(extracted_at), author] 119 | rows.append(row) 120 | 121 | 122 | if __name__ == "__main__": 123 | main() 124 | -------------------------------------------------------------------------------- /mergechance/templates/chance.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Your Merge Chance on GitHub 9 | 10 | 11 |
12 | 13 |

14 |
15 |
16 | 17 |

Merge Chance For

18 |
19 |
20 | 21 |

{{repo}}

22 |
23 |
24 | 25 |

{{chance}}%

26 |
27 |
28 | 29 | of the PRs made by outsiders (not owners/members) get merged. 30 |
31 |
32 | 33 |

PRs usually closed after {{median}} days (median)

34 |
35 |
36 |
37 | 38 | * Based on most recent {{total}} outsiders' PRs 39 |
40 |
41 | 42 | (Download the data) 43 |
44 |
45 | 46 | * PRs open but not merged within 90 days are also treated as rejected 47 |
48 |
49 | 50 | * PRs closed by the author are ignored 51 |
52 |
53 | 54 | * bot PRs and spam should be ignored (check data to validate - help welcome) 55 |
56 |
57 | 58 | See this blog post for more explanation 59 |
60 |
61 |
62 | 63 | 64 | Copy Markdown below to your README.md to get a Merge-Chance badge 65 | 66 |
67 |
68 | 69 |
70 |         
71 |             [![merge-chance-badge](https://img.shields.io/endpoint?url=https%3A%2F%2Fmerge-chance.info%2Fbadge%3Frepo%3D{{repo | urlencode}})](https://merge-chance.info/target?repo={{repo | urlencode}})
72 |         
73 |     
74 |
75 |
76 | 77 | Like this one 78 | Custom badge 79 |
80 |
81 |
82 | 83 | Check Some Other Repo .. 84 |
85 |
86 |
87 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /mergechance/main.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, render_template, jsonify, send_file 2 | import logging 3 | import os 4 | from tempfile import TemporaryDirectory 5 | 6 | from mergechance.db import autocomplete_list, get_from_cache, cache 7 | from mergechance.gh_gql import get_pr_fields, GQLError 8 | from mergechance.analysis import ANALYSIS_FIELDS, get_viable_prs, merge_chance, get_median_outsider_time, filter_prs 9 | from mergechance.data_export import prep_tsv 10 | 11 | app = Flask(__name__) 12 | log = logging.getLogger(__name__) 13 | 14 | 15 | def sanitize_repo(target: str): 16 | """Sanitize user input (repo name).""" 17 | if not target: 18 | raise ValueError("Repo cannot be empty") 19 | target = target.lower() 20 | target = target.strip() 21 | target = _strip_url(target) 22 | # sometimes people copy paste from GitHub UI, which adds spaces in between 23 | # those can be safely removed, spaces are not allowed in GitHub repo names 24 | target = target.replace(" ", "") 25 | if target.count("/") != 1: 26 | raise ValueError("Invalid repo name. Must be in format: organization/name") 27 | return target 28 | 29 | 30 | def _strip_url(target): 31 | """Target repo can be either a org/repo string or a full url.""" 32 | exclude = "github.com/" 33 | if exclude in target: 34 | pos = target.find(exclude) + len(exclude) 35 | target = target[pos:] 36 | if target[-1] == "/": 37 | target = target[:-1] 38 | return target 39 | 40 | 41 | def _get_chance(target): 42 | cached_chance = get_from_cache(target) 43 | if cached_chance: 44 | chance, median, total, _ = cached_chance 45 | log.info(f"Retrieved {target} from cache") 46 | else: 47 | log.info(f"Retrieving {target} from GH API") 48 | # after sanitize_repo it is guaranteed to contain exactly one '/' 49 | owner, repo = target.split("/") 50 | try: 51 | prs = [] 52 | all_prs = [] 53 | cursor = None 54 | reqs = 0 55 | while len(prs) < 50 and reqs < 10: 56 | batch, cursor = get_pr_fields(owner, repo, ANALYSIS_FIELDS, page_cap=1, cursor=cursor) 57 | batch = filter_prs(batch) 58 | all_prs.extend(batch) 59 | # because of implied insider calculation it is important to recalculate 60 | # on the entire dataset, as it might uncover more information about implied insiders 61 | prs = get_viable_prs(all_prs) 62 | reqs += 1 63 | except GQLError: 64 | return None 65 | chance = merge_chance(prs) 66 | if not chance: 67 | return None 68 | chance, total = chance 69 | median = get_median_outsider_time(prs) 70 | if not median: 71 | return None 72 | cache(target, chance, median, total, prs) 73 | return chance, median, total 74 | 75 | 76 | @app.route("/autocomplete", methods=["GET"]) 77 | def auto_complete(): 78 | """Endpoint for target repo autocomplete.""" 79 | return jsonify(autocomplete_list()) 80 | 81 | 82 | @app.route("/", methods=["GET"]) 83 | def index(): 84 | return render_template("index.html") 85 | 86 | 87 | @app.route("/target", methods=["GET"]) 88 | def target(): 89 | target = request.args.get("repo") 90 | try: 91 | target = sanitize_repo(target) 92 | except ValueError: 93 | return ("Invalid repo name. Must be in format 'owner/name'.", 400) 94 | chance = _get_chance(target) 95 | if chance is None: 96 | return ( 97 | f"Could not calculate merge chance for this repo. It might not exist on GitHub or have zero PRs.", 98 | 404, 99 | ) 100 | chance, median, total = chance 101 | return render_template("chance.html", chance=chance, repo=target, total=total, median=median) 102 | 103 | 104 | @app.route("/badge", methods=["GET"]) 105 | def badge(): 106 | target = request.args.get("repo") 107 | try: 108 | target = sanitize_repo(target) 109 | except ValueError: 110 | return ("Invalid repo name. Must be in format 'owner/name'.", 400) 111 | chance = _get_chance(target) 112 | if chance is None: 113 | return ( 114 | f"Could not calculate merge chance for this repo. It might not exist on GitHub or have zero PRs.", 115 | 404, 116 | ) 117 | chance, median, _ = chance 118 | return jsonify( 119 | {"schemaVersion": 1, "label": "Merge Chance", "message": f"{chance}% after {median} days"} 120 | ) 121 | 122 | 123 | @app.route("/data", methods=["GET"]) 124 | def download_data(): 125 | target = request.args.get("repo") 126 | try: 127 | target = sanitize_repo(target) 128 | except ValueError: 129 | return ("Invalid repo name. Must be in format 'owner/name'.", 400) 130 | data = get_from_cache(target) 131 | if not data: 132 | return ("Repo not found", 404) 133 | _, _, _, prs = data 134 | if not prs: 135 | return ("No data for this repo", 404) 136 | content = prep_tsv(prs) 137 | with TemporaryDirectory() as tdir: 138 | full_path = os.path.join(tdir, "prs.tsv") 139 | with open(full_path, "w") as tsv: 140 | tsv.write(content) 141 | return send_file(full_path, attachment_filename=f"{target}.tsv", as_attachment=True, cache_timeout=-600) 142 | -------------------------------------------------------------------------------- /mergechance/analysis.py: -------------------------------------------------------------------------------- 1 | """Module for calculating stats from data provided by gh_gql.py""" 2 | from dateutil import parser 3 | import time 4 | import statistics 5 | from mergechance.blacklist import blacklist 6 | 7 | 8 | STALE_THRESHOLD = 90 * 24 * 60 * 60 # 90 days in seconds 9 | 10 | ANALYSIS_FIELDS = ["closedAt", "createdAt", "authorAssociation", "state", "permalink", "title"] 11 | 12 | # PRs a nominal outsider must merge to become an insider 13 | INSIDER_PR_THRESHOLD = 5 14 | 15 | def median_time_to_merge(prs: list) -> float: 16 | closings = [_to_ts(pr["closedAt"]) - _to_ts(pr["createdAt"]) for pr in prs ] 17 | median_seconds = statistics.median(closings) 18 | median_days = median_seconds / 60 / 60 / 24 19 | median_days = round(median_days, 2) 20 | return median_days 21 | 22 | 23 | def filter_prs(prs): 24 | """Rules based pr filtering for spam, bots etc.""" 25 | prs = [pr for pr in prs if not _is_trivial(pr)] 26 | prs = [pr for pr in prs if not _is_blacklisted(pr)] 27 | prs = [pr for pr in prs if not _is_closed_by_author(pr)] 28 | return prs 29 | 30 | 31 | def get_viable_prs(prs): 32 | """return only outsider PRs that MERGED, CLOSED or stale.""" 33 | outsiders = get_outsiders(prs) 34 | now = time.time() 35 | return [pr for pr in outsiders if _is_handled(pr) or _is_stale(pr, now)] 36 | 37 | 38 | def get_implied_insiders(prs: list): 39 | """Some repositories don't add contributors to their org members. 40 | 41 | Returns a list of author logins that successfully merged to 42 | the repo many times, they will be assumed to be insiders. 43 | """ 44 | logins = [pr['author']['login'] for pr in prs if pr['state'] == 'MERGED'] 45 | return {login for login in logins if logins.count(login) > INSIDER_PR_THRESHOLD } 46 | 47 | def get_median_outsider_time(outsiders_prs: list) -> float: 48 | """Return median closing time for closed PRs. 49 | 50 | Will return None if there are no closed prs in the input. 51 | """ 52 | closed = [pr for pr in outsiders_prs if pr['state'] in {'MERGED', 'CLOSED'}] 53 | if not closed: 54 | return None 55 | return median_time_to_merge(closed) 56 | 57 | 58 | def merge_chance(outsiders_prs: list) -> tuple: 59 | """Return a tuple of proportion of successful PRs and the amount of 60 | prs that were taken into consideration among those from the input. 61 | Open and not stale PRs are not valid and are ignored.""" 62 | merged = get_merged(outsiders_prs) 63 | open = get_open(outsiders_prs) 64 | stale = get_stale(open) 65 | ignored = len(open) - len(stale) 66 | total = len(outsiders_prs) - ignored 67 | if not total: 68 | return None 69 | chance = len(merged) / total 70 | chance *= 100 71 | chance = round(chance, 2) 72 | return chance, total 73 | 74 | 75 | def get_merged(prs: list) -> list: 76 | return [pr for pr in prs if pr["state"] == "MERGED"] 77 | 78 | 79 | def get_open(prs: list) -> list: 80 | return [pr for pr in prs if pr["state"] == "OPEN"] 81 | 82 | 83 | def get_outsiders(prs: list) -> list: 84 | implied_insiders = get_implied_insiders(prs) 85 | def _outsider_pr(pr): 86 | if pr['author'] is None: 87 | # author's GH user removed? 88 | return _is_outsider(pr["authorAssociation"]) 89 | return _is_outsider(pr["authorAssociation"]) and pr['author']['login'] not in implied_insiders 90 | return [pr for pr in prs if _outsider_pr(pr)] 91 | 92 | 93 | def get_stale(prs: list) -> list: 94 | """Returns the PRs without stale PRs.""" 95 | now = time.time() 96 | return [pr for pr in prs if _is_stale(pr, now)] 97 | 98 | 99 | def _is_outsider(author: str): 100 | return author not in {"OWNER", "MEMBER"} 101 | 102 | 103 | def _is_stale(pr, now): 104 | if pr["state"] != "OPEN": 105 | return False 106 | ts = pr["createdAt"] 107 | ts = _to_ts(ts) 108 | return (now - ts) > STALE_THRESHOLD 109 | 110 | 111 | def _is_handled(pr): 112 | """A PR is considered handled when it is CLOSED or MERGED.""" 113 | return pr['state'] in {'MERGED', 'CLOSED'} 114 | 115 | 116 | def _is_blacklisted(pr): 117 | if not pr['author']: 118 | return False 119 | return pr['author']['login'] in blacklist 120 | 121 | 122 | banned_keywords = ["readme", "update", "typo"] 123 | 124 | def _is_trivial(pr): 125 | """Poor man's spam detection - based on title only for now.""" 126 | title = pr.get('title', '') 127 | title = title.lower() 128 | for banned in banned_keywords: 129 | if banned in title: 130 | return True 131 | if title == 'test': 132 | return True 133 | return False 134 | 135 | 136 | def _is_closed_by_author(pr): 137 | """If the author closed the PR themselves we ignore it.""" 138 | if not pr['author']: 139 | return False 140 | if pr['state'] != 'CLOSED': 141 | return False 142 | timeline = pr.get('timelineItems') 143 | if not timeline: 144 | return False 145 | open_login = pr['author'].get('login') 146 | events = timeline.get('edges', []) 147 | for event in events: 148 | node = event['node'] 149 | actor = node.get('actor') 150 | if not actor: 151 | return False 152 | closed_login = actor.get('login') 153 | if closed_login == open_login: 154 | return True 155 | return False 156 | 157 | 158 | 159 | def _to_ts(ts_iso): 160 | return parser.parse(ts_iso).timestamp() 161 | -------------------------------------------------------------------------------- /mergechance/test/test_analysis.py: -------------------------------------------------------------------------------- 1 | from mergechance.analysis import ( 2 | get_merged, 3 | get_outsiders, 4 | get_stale, 5 | get_open, 6 | merge_chance, 7 | median_time_to_merge, 8 | get_implied_insiders 9 | ) 10 | 11 | import datetime 12 | 13 | import pytest 14 | 15 | 16 | @pytest.fixture() 17 | def pr_open_outsider(): 18 | now = datetime.datetime.now().isoformat() 19 | return { 20 | "createdAt": now, 21 | "closedAt": None, 22 | "authorAssociation": None, 23 | "state": "OPEN", 24 | "author": { 25 | "login": "author1" 26 | } 27 | } 28 | 29 | 30 | @pytest.fixture() 31 | def pr_closed_outsider(): 32 | now = datetime.datetime.now().isoformat() 33 | return { 34 | "createdAt": now, 35 | "closedAt": now, 36 | "authorAssociation": None, 37 | "state": "CLOSED", 38 | "author": { 39 | "login": "author1" 40 | } 41 | } 42 | 43 | 44 | @pytest.fixture() 45 | def pr_merged_outsider(): 46 | now = datetime.datetime.now().isoformat() 47 | return { 48 | "createdAt": now, 49 | "closedAt": now, 50 | "authorAssociation": None, 51 | "state": "MERGED", 52 | "author": { 53 | "login": "author1" 54 | } 55 | } 56 | 57 | 58 | @pytest.fixture() 59 | def pr_open_outsider_stale(): 60 | delta = datetime.timedelta(days=91) 61 | long_time_ago = datetime.datetime.now() - delta 62 | return { 63 | "createdAt": long_time_ago.isoformat(), 64 | "closedAt": None, 65 | "authorAssociation": None, 66 | "state": "OPEN", 67 | "author": { 68 | "login": "author1" 69 | } 70 | } 71 | 72 | 73 | @pytest.fixture() 74 | def pr_open_insider(): 75 | now = datetime.datetime.now().isoformat() 76 | return { 77 | "createdAt": now, 78 | "closedAt": None, 79 | "authorAssociation": "MEMBER", 80 | "state": "OPEN", 81 | "author": { 82 | "login": "author1" 83 | } 84 | } 85 | 86 | 87 | @pytest.fixture() 88 | def pr_closed_insider(): 89 | now = datetime.datetime.now().isoformat() 90 | return { 91 | "createdAt": now, 92 | "closedAt": now, 93 | "authorAssociation": "MEMBER", 94 | "state": "CLOSED", 95 | "author": { 96 | "login": "author1" 97 | } 98 | } 99 | 100 | 101 | @pytest.fixture() 102 | def pr_merged_insider(): 103 | now = datetime.datetime.now().isoformat() 104 | return { 105 | "createdAt": now, 106 | "closedAt": now, 107 | "authorAssociation": "MEMBER", 108 | "state": "MERGED", 109 | "author": { 110 | "login": "author1" 111 | } 112 | } 113 | 114 | 115 | @pytest.fixture() 116 | def pr_open_insider_stale(): 117 | delta = datetime.timedelta(days=91) 118 | long_time_ago = datetime.datetime.now() - delta 119 | return { 120 | "createdAt": long_time_ago.isoformat(), 121 | "closedAt": None, 122 | "authorAssociation": "MEMBER", 123 | "state": "OPEN", 124 | "author": { 125 | "login": "author1" 126 | } 127 | } 128 | 129 | 130 | @pytest.fixture() 131 | def prs( 132 | pr_open_outsider, 133 | pr_closed_outsider, 134 | pr_merged_outsider, 135 | pr_open_outsider_stale, 136 | pr_open_insider, 137 | pr_closed_insider, 138 | pr_merged_insider, 139 | pr_open_insider_stale, 140 | ): 141 | return [ 142 | pr_open_outsider, 143 | pr_closed_outsider, 144 | pr_merged_outsider, 145 | pr_open_outsider_stale, 146 | pr_open_insider, 147 | pr_closed_insider, 148 | pr_merged_insider, 149 | pr_open_insider_stale, 150 | ] 151 | 152 | @pytest.fixture() 153 | def pr_merged_1day(): 154 | delta = datetime.timedelta(days=1) 155 | now =datetime.datetime.now() 156 | time_ago = now - delta 157 | return { 158 | "createdAt": time_ago.isoformat(), 159 | "closedAt": now.isoformat(), 160 | "authorAssociation": None, 161 | "state": "MERGED", 162 | } 163 | 164 | @pytest.fixture() 165 | def pr_merged_2day(): 166 | delta = datetime.timedelta(days=2) 167 | now =datetime.datetime.now() 168 | time_ago = now - delta 169 | return { 170 | "createdAt": time_ago.isoformat(), 171 | "closedAt": now.isoformat(), 172 | "authorAssociation": None, 173 | "state": "MERGED", 174 | } 175 | 176 | @pytest.fixture() 177 | def pr_merged_3day(): 178 | delta = datetime.timedelta(days=3) 179 | now =datetime.datetime.now() 180 | time_ago = now - delta 181 | return { 182 | "createdAt": time_ago.isoformat(), 183 | "closedAt": now.isoformat(), 184 | "authorAssociation": None, 185 | "state": "MERGED", 186 | } 187 | 188 | 189 | def test_get_merged(prs): 190 | merged = get_merged(prs) 191 | assert len(prs) == 8 192 | assert len(merged) == 2 193 | 194 | 195 | def test_get_stale(prs): 196 | stale = get_stale(prs) 197 | assert len(prs) == 8 198 | assert len(stale) == 2 199 | 200 | 201 | def test_get_open(prs): 202 | open = get_open(prs) 203 | assert len(prs) == 8 204 | assert len(open) == 4 205 | 206 | 207 | def test_get_outsiders(prs): 208 | out = get_outsiders(prs) 209 | assert len(prs) == 8 210 | assert len(out) == 4 211 | 212 | 213 | def test_merge_chance(prs): 214 | chance, total = merge_chance(prs) 215 | assert total == 6 216 | assert pytest.approx(chance, 0.1) == 33.3 217 | 218 | 219 | def test_merge_chance_empty(): 220 | res = merge_chance([]) 221 | assert res is None 222 | 223 | 224 | def test_median_time(pr_merged_1day, pr_merged_2day, pr_merged_3day): 225 | prs = [pr_merged_1day, pr_merged_1day, pr_merged_1day] 226 | med_t = median_time_to_merge(prs) 227 | assert pytest.approx(med_t, 0.1) == 1.0 228 | 229 | prs = [pr_merged_1day, pr_merged_2day, pr_merged_3day] 230 | med_t = median_time_to_merge(prs) 231 | assert pytest.approx(med_t, 0.1) == 2.0 232 | 233 | 234 | def test_implied_insider(pr_merged_outsider): 235 | prs = [pr_merged_outsider] * 6 236 | implied = get_implied_insiders(prs) 237 | assert {'author1'} == implied 238 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /mergechance/blacklist.py: -------------------------------------------------------------------------------- 1 | blacklist = [ 2 | "userQED", 3 | "GGupzHH", 4 | "nodejs-ma", 5 | "linxz-coder", 6 | "teach-tian", 7 | "kevinlens", 8 | "Pabitra-26", 9 | "mangalan516", 10 | "IjtihadIslamEmon", 11 | "marcin-majewski-sonarsource", 12 | "LongTengDao", 13 | "JoinsG", 14 | "safanbd", 15 | "aly2", 16 | "aka434112" 17 | "SMAKSS", 18 | "imbereket", 19 | "takumu1011", 20 | "adityanjr", 21 | "Aa115511", 22 | "farjanaHuq", 23 | "samxcode", 24 | "HaiTing-Zhu", 25 | "gimnakatugampala", 26 | "cmc3cn", 27 | "kkkisme", 28 | "haidongwang-github", 29 | "ValueCoders", 30 | "happy-dc", 31 | "Tyorden", 32 | "SP4R0W", 33 | "q970923066", 34 | "Shivansh2407", 35 | "1o1w1", 36 | "soumyadip007", 37 | "AceTheCreator", 38 | "qianbaiduhai", 39 | "changwei0857", 40 | "CainKane", 41 | "Jajabenit250", 42 | "gouri1000", 43 | "yvettep321", 44 | "naveen8801", 45 | "HelloAny", 46 | "ShaileshDeveloper", 47 | "Jia-De", 48 | "JeffCorp", 49 | "ht1131589588", 50 | "Supsource", 51 | "coolwebrahul", 52 | "aimidy", 53 | "ishaanthakur", 54 | # bots 55 | "vue-bot", 56 | "dependabot", 57 | # below is taken from spamtoberfest 58 | "SudhanshuAGR", 59 | "pinkuchoudhury69", 60 | "brijal96", 61 | "shahbazalam07", 62 | "piyushkothari1999", 63 | "imnrb", 64 | "saksham05mathur", 65 | "Someshkale15", 66 | "xinghalok", 67 | "manpreet147", 68 | "sumitsrivastav180", 69 | "1234515", 70 | "Rachit-hooda-man", 71 | "vishal2305bug", 72 | "Ajayraj006", 73 | "pathak7838", 74 | "Kumarjatin-coder", 75 | "Narendra-Git-Hub", 76 | "Stud-dabral", 77 | "Siddhartha05", 78 | "rishi123A", 79 | "kartik71792", 80 | "kapilpatel-2001", 81 | "SapraRam", 82 | "PRESIDENT-caris", 83 | "smokkie087", 84 | "Ravikant-unzippedtechnology", 85 | "sawanch", 86 | "Saayancoder", 87 | "shubham5888", 88 | "manasvi141220002", 89 | "Asher12428", 90 | "mohdalikhan", 91 | "Paras4902", 92 | "shudhii", 93 | "Tesla9625", 94 | "web-codegrammer", 95 | "imprakashsah", 96 | "Bhagirath043", 97 | "Ankur-S1", 98 | "Deannos", 99 | "sapro-eng", 100 | "skabhi001", 101 | "AyushPathak12", 102 | "Hatif786", 103 | "adityas2124k2", 104 | "Henry-786", 105 | "abhi6418", 106 | "J-Ankit2002", 107 | "9759176595", 108 | "rajayush9944", 109 | "Kishan-Kumar-Kannaujiya", 110 | "ManavBargali", 111 | "komalsharma121", 112 | "AbhiramiTS", 113 | "mdkaif25", 114 | "shubhamsingh333", 115 | "hellosibun", 116 | "ankitbharti1998", 117 | "subhakantabhau", 118 | "shivamsri142", 119 | "sameer13899", 120 | "BhavyaTheHacker", 121 | "nehashewale", 122 | "Shashi-design", 123 | "anuppal101", 124 | "NitinRavat888", 125 | "sakrit", 126 | "Kamran-360", 127 | "satyam-dot", 128 | "Suleman3015", 129 | "amanpj15", 130 | "abhinavjha98", 131 | "Akshat-Git-Sharma", 132 | "Anuragtawaniya", 133 | "nongshaba1337", 134 | "XuHewen", 135 | "happyxhw", 136 | "ascott", 137 | "ThomasGrund", 138 | 'Abhayrai778', 139 | 'pyup-bot', 140 | 'AhemadRazaK3', 141 | 'doberoi10', 142 | 'lsmatovu', 143 | 'Lakshay7014', 144 | 'nikhilkr1402', 145 | 'arfakl99', 146 | 'Tyrrrz', 147 | 'SwagatamNanda', 148 | 'V-Soni', 149 | 'hparadiz', 150 | 'Ankurmarkam', 151 | 'shubham-01-star', 152 | 'Rajputusman', 153 | 'bharat13soni', 154 | 'przemeklal', 155 | 'p4checo', 156 | 'REDSKULL1412', 157 | 'GAURAVCHETTRI', 158 | 'DerDomml', 159 | 'Sunit25', 160 | 'divyansh123-max', 161 | 'hackerharsh007', 162 | 'Thecreativeone2001', 163 | 'nishkarshsingh-tech', 164 | 'Devyadav1994', 165 | 'Rajeshjha586', 166 | 'BoboTiG', 167 | 'nils-braun', 168 | 'DjDeveloperr', 169 | 'FreddieRidell', 170 | 'pratyxx525', 171 | 'abstergo43', 172 | 'impossibleshado1', 173 | 'Gurnoor007', 174 | '2303-kanha', 175 | 'ChaitanyaAg', 176 | 'justinjpacheco', 177 | 'shoaib5887khan', 178 | 'farhanmulla713', 179 | 'ashrafzeya', 180 | 'muke64', 181 | 'aditya08maker', 182 | 'rajbaba1', 183 | 'priyanshu-top10', 184 | 'Maharshi369', 185 | 'Deep-bhingradiya', 186 | 'shyam7e', 187 | 'shubhamsuman37', 188 | 'jastisriradheshyam', 189 | 'Harshit-10-pal', 190 | 'shivphp', 191 | 'RohanSahana', 192 | '404notfound-3', 193 | 'ritikkatiyar', 194 | 'ashishmohan0522', 195 | 'Amanisrar', 196 | 'VijyantVerma', 197 | 'Chetanchetankoli', 198 | 'Hultner', 199 | 'gongeprashant', 200 | 'psw89', 201 | 'harshilaneja', 202 | 'SLOKPATHAK', 203 | 'st1891', 204 | 'nandita853', 205 | 'ms-prob', 206 | 'Sk1llful', 207 | 'HarshKq', 208 | 'rpy9954', 209 | 'TheGunnerMan', 210 | 'AhsanKhokhar1', 211 | 'RajnishJha12', 212 | 'Adityapandey-7', 213 | 'vipulkumbhar0', 214 | 'nikhilkhetwal', 215 | 'Adityacoder99', 216 | 'arjun01-debug', 217 | 'saagargupta', 218 | 'UtCurseSingh', 219 | 'Anubhav07-pixel', 220 | 'Vinay584', 221 | 'YA7CR7', 222 | 'anirbanballav', 223 | 'mrPK', 224 | 'VibhakarYashasvi', 225 | 'ANKITMOHAPATRAPROGRAMS', 226 | 'parmar-hacky', 227 | 'zhacker1999', 228 | 'akshatjindal036', 229 | 'swarakeshrwani', 230 | 'ygajju52', 231 | 'Nick-Kr-Believe', 232 | 'adityashukl1502', 233 | 'mayank23raj', 234 | 'shauryamishra', 235 | 'swagat11', 236 | '007swayam', 237 | 'gardener-robot-ci-1', 238 | 'ARUNJAYSACHAN', 239 | 'MdUmar07', 240 | 'vermavinay8948', 241 | 'Rimjhim-Dey', 242 | 'prathamesh-jadhav-21', 243 | 'brijal96', 244 | 'siddhantparadox', 245 | 'Abhiporwal123', 246 | 'sparshbhardwaj209', 247 | 'Amit-Salunke-02', 248 | 'wwepavansharma', 249 | 'kirtisahu123', 250 | 'japsimrans13', 251 | 'wickedeagle', 252 | 'AnirbanB999', 253 | 'jayeshmishra', 254 | 'shahbazalam07', 255 | 'Samrath07', 256 | 'pinkuchoudhury69', 257 | 'moukhikgupta5', 258 | 'hih547430', 259 | 'burhankhan23', 260 | 'Rakesh0222', 261 | 'Rahatullah19', 262 | 'sanskar783', 263 | 'Eshagupta0106', 264 | 'Arpit-Tailong', 265 | 'Adityaaashu', 266 | 'rahul149', 267 | 'udit0912', 268 | 'aru5858', 269 | 'riya6361', 270 | 'vanshkhemani', 271 | 'Aditi0205', 272 | 'riteshbiswas0', 273 | '12Ayush12008039', 274 | 'Henry-786', 275 | 'ManviMaheshwari', 276 | 'SATHIYASEELAN2001', 277 | 'SuchetaPal', 278 | 'Sahil24822', 279 | 'sohamgit', 280 | 'Bhumi5599', 281 | 'anil-rathod', 282 | 'binayuchai', 283 | 'PujaMawandia123', 284 | '78601abhiyadav', 285 | 'PriiTech', 286 | 'SahilBhagtani', 287 | 'dhruv1214', 288 | 'SAURABHYAGYIK', 289 | 'farhanmansuri25', 290 | 'Chronoviser', 291 | 'airtel945', 292 | 'Swagnikdhar', 293 | 'tushar-1308', 294 | 'sameerbasha123', 295 | 'anshu15183', 296 | 'Mohit049', 297 | 'YUVRAJBHATI', 298 | 'miras143mom', 299 | 'ProPrakharSoni', 300 | 'pratikkhatana', 301 | 'Alan1857', 302 | 'AyanKrishna', 303 | 'kartikey2003jain', 304 | 'sailinkan', 305 | 'DEVELOPER06810', 306 | 'Abhijeet9274', 307 | 'Kannu12', 308 | 'Shivam-Amin', 309 | 'suraj-lpu', 310 | 'Elizah550', 311 | 'dipsylocus', 312 | 'jaydev-coding', 313 | 'IamLucif3r', 314 | 'DesignrKnight', 315 | 'PiyumalK', 316 | 'nandita853', 317 | 'mohsin529', 318 | 'ShravanBhat', 319 | 'doppelganger-test', 320 | 'smitgh', 321 | 'parasgarg123', 322 | 'Amit-Salunke-02', 323 | 'Chinmay-KB', 324 | 'sagarr1', 325 | 'Praveshrana12', 326 | 'fortrathon', 327 | 'miqbalrr', 328 | 'Ankurmarkam', 329 | 'saloni691', 330 | 'Bhuvan804', 331 | 'pra-b-hat-chauhan', 332 | 'snakesause', 333 | 'Shubhani25', 334 | 'arshad699', 335 | 'fahad-25082001', 336 | 'Chaitanya31612', 337 | 'tiwariraju', 338 | 'ritik0021', 339 | 'aakash-dhingra', 340 | 'Raunak017', 341 | 'ashrafzeya', 342 | 'priyanshu-top10', 343 | 'NikhilKumar-coder', 344 | 'ygajju52', 345 | 'shvnsh', 346 | 'abhishek7457', 347 | 'sethmcagit', 348 | 'Apurva122', 349 | 'Gurpreet-Singh-Bhupal', 350 | 'ashmit-coder', 351 | 'Rishi098', 352 | 'Xurde-glitch', 353 | 'imrohitoberoi', 354 | 'Hrushikeshsalunkhe', 355 | 'ABHI2598', 356 | 'Abhishek8-web', 357 | 'arjun01-debug', 358 | 'Shailesh12-svg', 359 | 'SachinSingh7050', 360 | 'VibhakarYashasvi', 361 | 'rajbaba1', 362 | 'yuvraj66', 363 | 'Nick-Kr-Believe', 364 | 'gongeprashant', 365 | 'sanskar783', 366 | 'infoguru19', 367 | 'Shamik225', 368 | 'Pro0131', 369 | 'soni-111', 370 | 'Rahul-bitu', 371 | 'meetshrimali', 372 | 'coolsuva', 373 | 'yogeshwaran01', 374 | 'Satyamtripathi1996', 375 | 'Rahatullah19', 376 | 'kartikey2003jain', 377 | 'rajarshi15220', 378 | 'SahilBhagtani', 379 | 'janni-03', 380 | 'Abhijit-06', 381 | 'dvlp-jrs', 382 | 'Viki3223', 383 | 'Azhad56', 384 | 'Mohit049', 385 | 'mvpsaurav', 386 | 'dvcrn', 387 | 'Deep-bhingradiya', 388 | 'shreyans2007', 389 | 'sailinkan', 390 | 'Abhijeet9274', 391 | 'riteshbiswas0', 392 | 'AhemadRazaK3', 393 | 'rishi123A', 394 | 'shivpatil', 395 | 'rikidas99', 396 | 'sohamgit', 397 | 'jheero', 398 | 'itzhv14', 399 | 'sameerbasha123', 400 | 'yatendra-dev', 401 | 'AditiGautam2000', 402 | 'sid0542', 403 | 'tushar-1308', 404 | 'dhruvil05', 405 | 'sufiyankhanz', 406 | 'Alan1857', 407 | 'siriusb79', 408 | 'PKan06', 409 | 'yagnikvadaliya', 410 | 'yogeshkun', 411 | 'Abhishekjhatech', 412 | 'jatinsharma11', 413 | 'THENNARASU-M', 414 | 'priyanshu987art', 415 | 'maulik922', 416 | 'param-de', 417 | 'nisheksharma', 418 | 'balbirsingh08', 419 | 'piyushkothari1999', 420 | 'zeeshanthedev590', 421 | 'praney-pareek', 422 | 'SUBHANGANI22', 423 | 'kartikeyaGUPTA45', 424 | 'Educatemeans', 425 | '9192939495969798', 426 | 'Amit1173', 427 | 'thetoppython', 428 | 'Saurabhsingh94', 429 | 'royalbhati', 430 | 'kardithSingh', 431 | 'kishankumar05', 432 | 'Rachit-hooda-man', 433 | 'alijng', 434 | 'patel-om', 435 | 'jahangirguru', 436 | 'Vchandan348', 437 | 'amitagarwalaa57', 438 | 'rockingrohit9639', 439 | 'Krishnapal-rajput', 440 | 'aman78954098', 441 | 'pranshuag1818', 442 | 'PIYUSH6791', 443 | 'Lachiemckelvie', 444 | 'Pragati-Gawande', 445 | 'mahesh2526', 446 | 'Aman9234', 447 | 'xMaNaSx', 448 | 'shreyanshnpanwar', 449 | 'Paravindvishwakarma', 450 | 'chandan-op', 451 | 'amit007-majhi', 452 | 'Rahul-TheHacker', 453 | 'sharmanityam252', 454 | 'iamnishan', 455 | 'codewithashu', 456 | 'mersonfufu', 457 | 'saksham05mathur', 458 | 'Krishna10798', 459 | 'rajashit14', 460 | 'aetios', 461 | 'pankajnimiwal', 462 | '132ikl', 463 | 'ghost', 464 | 'Sabyyy', 465 | '9Ankit00', 466 | 'AfreenKhan777', 467 | 'akash-bansal-02', 468 | 'regakakobigman', 469 | 'aman1750', 470 | 'irajdip99', 471 | 'mohdadil2001', 472 | 'shithinshetty', 473 | 'nikhilsawalkar', 474 | 'Brighu-Raina', 475 | 'kenkirito', 476 | 'SamueldaCostaAraujoNunes', 477 | 'codewithsaurav', 478 | 'Ashutoshvk18', 479 | 'EthicalRohit', 480 | 'ihimalaya', 481 | 'somya-max', 482 | 'themonkeyhacker', 483 | 'rammohan12345', 484 | 'JasmeetSinghWasal', 485 | 'black73', 486 | 'Rebelshiv', 487 | 'DarshanaNemane', 488 | 'Jitin20', 489 | 'Prakshal2607', 490 | 'Sourabhkale1', 491 | 'shoeb370', 492 | 'ArijitGoswami100', 493 | 'anju2408', 494 | 'ukybhaiii', 495 | 'anshulbhandari5', 496 | 'pratham1303', 497 | 'arpitdevv', 498 | 'RishabhGhildiyal', 499 | 'mohammedssab', 500 | 'deepakshisingh', 501 | 'Samshopify', 502 | 'ankitkumar827', 503 | 'anddytheone', 504 | 'Tush6571', 505 | 'pritam98-debug', 506 | 'Snehapriya9955', 507 | 'coastaldemigod', 508 | 'yogesh-1952', 509 | 'Vivekv11', 510 | 'Andrewrick1', 511 | 'DARSHIT006', 512 | 'pravar18', 513 | 'devildeep4u', 514 | '21appleceo', 515 | 'bereketsemagn', 516 | 'vandana-kotnala', 517 | 'tanya4113', 518 | 'gorkemkrdmn', 519 | 'Ashwin0512', 520 | 'prateekrathore1234', 521 | 'hash-mesh', 522 | 'pathak7838', 523 | 'sakshamdeveloper', 524 | 'ankan10', 525 | 'prafgup', 526 | 'anurag200502', 527 | 'niklifter', 528 | 'Shreeja1699', 529 | 'shivshikharsinha', 530 | 'SumanPurkait-grb', 531 | 'chiranjeevprajapat', 532 | 'TechieBoy', 533 | 'KhushiMittal', 534 | 'UtCurseSingh', 535 | 'lucastrogo', 536 | 'jarvis0302', 537 | 'ratan160', 538 | 'kgaurav123', 539 | 'dhakad17', 540 | 'Rishn99', 541 | 'codeme13', 542 | 'KINGUMS', 543 | 'sun-3', 544 | 'varunsingh251', 545 | 'thedrivingforc', 546 | 'aditya08maker', 547 | 'AkashVerma1515', 548 | 'gaurangbhavsar', 549 | 'ApurvaSharma20', 550 | 'Manmeet1999', 551 | 'Arhaans', 552 | 'Jaykitkukadiya', 553 | 'Rimjhim-Dey', 554 | 'apurv69', 555 | 'parth-lth', 556 | 'PranshuVashishtha', 557 | 'sidhantsharmaa', 558 | 'uday0001', 559 | 'iamrahul-9', 560 | 'nagpalnipun22', 561 | 'poonamp-31', 562 | 'dhananjaypatil', 563 | 'baibhavvishalpani', 564 | 'Ashish774-sol', 565 | 'sachin2490', 566 | 'Sudhanshu777871', 567 | 'mayur1234-shiwal', 568 | 'RohanWakhare', 569 | 'rishi4004', 570 | 'Amankumar019', 571 | 'Vaibhav162002', 572 | 'pratyushsrivastava500', 573 | 'AmarPaul-GiT', 574 | 'arjit-gupta', 575 | 'nitinchopade', 576 | 'imakg', 577 | 'meharshchakraborty', 578 | 'tumsabGandu', 579 | 'anurag360', 580 | '2000sanu', 581 | 'PoorviAgrawal56', 582 | 'omdhurat', 583 | 'Pawansinghla', 584 | 'thehacker-oss', 585 | 'mritu-mritu', 586 | 'AJAY07111998', 587 | 'rai12091997', 588 | 'OmShrivastava19', 589 | 'Divyanshu2109', 590 | 'adityaherowa', 591 | 'Abhishekt07', 592 | 'code-diggers-369', 593 | 'Jamesj001', 594 | 'coding-geek1711', 595 | 'govindrajpagul', 596 | 'CDP14', 597 | 'Kartik989-max', 598 | 'MaheshDoiphode', 599 | 'Pranayade777', 600 | 'er-royalprince', 601 | 'ricardoseriani', 602 | 'nowitsbalibhadra', 603 | 'navyaswarup', 604 | 'devendrathakare44', 605 | 'awaisulabdeen', 606 | 'SoumyaShree80', 607 | 'abahad7921', 608 | 'vishal0410', 609 | 'gajerachintan9', 610 | 'EBO9877', 611 | 'rohit-rksaini', 612 | 'momin786786', 613 | 'Shaurya-567', 614 | 'himanshu1079', 615 | 'AlecsFerra', 616 | 'rajvpatil5', 617 | 'Hacker-Boss', 618 | 'Rakesh0222', 619 | 'ASHMITA-DE', 620 | 'BilalSabugar', 621 | 'Anjan50', 622 | 'Vedant336', 623 | 'github2aman', 624 | 'satyamgta', 625 | 'kumar-vineet', 626 | 'uttamagrawal', 627 | 'AjaySinghPanwar', 628 | 'saieshdevidas', 629 | 'ohamshakya', 630 | 'JrZemdegs712', 631 | 'Anil404', 632 | 'Anamika1818', 633 | 'ssisodiya28', 634 | 'Vedurumudi-Priyanka', 635 | 'python1neo', 636 | 'sanketprajapati', 637 | 'InfinitelLoop', 638 | 'DarkMatter188', 639 | 'TanishqAhluwalia', 640 | 'J-yesh4939', 641 | 'sameer8991', 642 | 'ANSH-CODER-create', 643 | 'DeadShot-111', 644 | 'joydeepraina', 645 | 'Dhrupal19', 646 | 'Nikhil5511', 647 | 'lavyaKoli', 648 | 'jitu0956', 649 | 'parthika', 650 | 'digitalarunava', 651 | 'Shivamagg97', 652 | '23031999', 653 | 'Ashu-Modanwal', 654 | 'Singhichchha', 655 | 'pareekaabhi33', 656 | 'yashpatel008', 657 | 'yashwantkaushal', 658 | 'prem-smvdu', 659 | 'jains1234567890', 660 | 'Ritesh-004', 661 | 'shraddha8218', 662 | 'misbah9105', 663 | 'Tanishqpy', 664 | 'Iamtripathisatyam', 665 | 'mdnazam', 666 | 'akashkalal', 667 | 'Abhishekkumar10', 668 | 'chaitalimazumder', 669 | 'shubham1176', 670 | '866767676767', 671 | 'Priyanshu0131', 672 | 'Rajani12345678910', 673 | 'agrima84', 674 | 'DODOG98T', 675 | 'Abhishekaddu', 676 | 'ipriyanshuthakur', 677 | 'yogesh9555', 678 | 'shubham1234-os', 679 | 'abby486', 680 | 'YOGESH86400', 681 | 'jaggi-pixel', 682 | 'Utkarshdubey44', 683 | 'Mustafiz900', 684 | 'ashusaurav', 685 | 'Deepak27004', 686 | 'theHackPot', 687 | 'itsaaloksah', 688 | 'MakdiManush', 689 | 'Divyanshu09', 690 | 'codewithabhishek786', 691 | 'sumitkumar727254', 692 | 'faiz-9', 693 | 'soumyadipdaripa100', 694 | 'Prerna-eng', 695 | 'yourcodinsmas', 696 | 'akashnai', 697 | 'aryancoder4279', 698 | 'Anish-kumar7641', 699 | 'shivamkumar1999', 700 | 'Kushal34563', 701 | 'YashSinghyash', 702 | 'Alok070899', 703 | 'gautamdewasi', 704 | '5HAD0W-P1R4T3', 705 | 'rajkhatana', 706 | 'Himanshu-Sharma-java', 707 | 'yethish', 708 | 'Vikaskhurja', 709 | 'boomboom2003', 710 | 'mansigurnani', 711 | 'ansh8540', 712 | 'beingkS23', 713 | 'raksharaj1122', 714 | 'harshoswal', 715 | 'mitali-datascientist', 716 | 'daadestroyer', 717 | 'panudet-24mb', 718 | 'divy-koushik', 719 | 'Tanuj1234567', 720 | 'pattnaikp', 721 | 'Gauravsaha-97', 722 | '0x6D70', 723 | 'aptinstaller', 724 | 'SahilKhera14', 725 | 'Archie-Sharma', 726 | 'Chandan-program', 727 | 'shadowfighter2403', 728 | 'ivinodpatil2000', 729 | 'Souvik-py', 730 | 'NomanBaigA', 731 | 'UdhavKumar', 732 | 'rishabh-var123', 733 | 'NK-codeman0001', 734 | 'ritikkatiyar', 735 | 'ananey2004', 736 | 'tirth7677', 737 | 'Stud-dabral', 738 | 'dhruvsalve', 739 | 'treyssatvincent', 740 | 'AYUSHRAJ-WXYZ', 741 | 'JenisVaghasiya', 742 | 'KPRAPHULL', 743 | 'Apex-code', 744 | 'cypherrexx', 745 | 'AkilaDee', 746 | 'ankit-ec', 747 | 'darshan-10', 748 | 'Srijans01', 749 | 'Ankit00008', 750 | 'bijantitan', 751 | 'Jitendrayadav-eng', 752 | 'Tamonash-glitch', 753 | 'Ans-pro', 754 | 'yogesh8087', 755 | 'Sakshi2000-hash', 756 | 'shrbis2810', 757 | 'swagatopain6', 758 | 'mayankaryaman10', 759 | 'rajlomror', 760 | 'GauravNub', 761 | 'puru2407', 762 | 'KhushalPShah', 763 | 'aman7heaven', 764 | 'hazelvercetti', 765 | 'nil901', 766 | 'Ankitsingh6299', 767 | 'yashprasad8', 768 | 'Zapgithubexe', 769 | 'shiiivam', 770 | 'ShubhamGuptaa', 771 | 'viraj3315', 772 | 'Pratyush2005', 773 | 'jackSaluza', 774 | '03shivamkushwah', 775 | 'shahvraj20', 776 | 'manaskirad', 777 | 'Harsh08112001', 778 | 'R667180', 779 | 'PRATIKBANSDOE', 780 | 'MabtoorUlShafiq', 781 | 'dkyadav8282', 782 | 'prtk2001', 783 | 'MrDpk818', 784 | 'ParmGill00', 785 | 'kavya0116', 786 | 'gauravrai26', 787 | 'sachi9692', 788 | 'nj1902', 789 | 'akshatjindal036', 790 | 'shravanvis', 791 | 'ranjith660', 792 | 'sahemur', 793 | 'MDARBAAJ', 794 | 'Tylerdurdenn', 795 | 'hemantagrawal1808', 796 | 'luck804', 797 | 'vivekpatel09', 798 | 'ArushiGupta21', 799 | 'ray5541', 800 | 'arpitlathiya', 801 | 'Koshal67', 802 | 'harshul03', 803 | 'avinchudasama', 804 | 'PUJACHAUDHARY092', 805 | 'shaifali-555', 806 | 'coderidder', 807 | 'ravianandfbg', 808 | 'rohitnaththakur', 809 | 'KhanRohila', 810 | 'nikhilkr1402', 811 | 'abhijitk123', 812 | 'Jitendra2027', 813 | 'Roshan13046', 814 | 'satyam1316', 815 | 'shhivam005', 816 | 'V-Soni', 817 | 'iamayanofficial', 818 | 'kunaljainSgit', 819 | 'shriramsalunke-45', 820 | 'Laltu079', 821 | 'premkushwaha1', 822 | 'aryansingho7', 823 | 'rohitkalse', 824 | 'Royalsolanki', 825 | 'MAYANK25402', 826 | 'prakharlegend15', 827 | 'Ansh2831', 828 | 'aps-glitch', 829 | 'PJ-123-Prime', 830 | 'iamprathamchhabra', 831 | 'Bhargavi09', 832 | 'Shubham2443', 833 | 'YashAgarwalDev', 834 | 'ChandanDroid', 835 | 'SaurabhDev338', 836 | 'developerlives', 837 | 'Abhishek-hash', 838 | 'harshal1996', 839 | 'ritik9428', 840 | 'shadab19it', 841 | 'sarthakd999', 842 | 'Pruthviraj001', 843 | 'royalkingsava', 844 | 'manofelfin', 845 | 'vedantbirla', 846 | 'nishantkrgupta14', 847 | 'harsh1471', 848 | 'krabhi977', 849 | 'Pradipta0065', 850 | 'Ajeet2007', 851 | 'aman97703', 852 | 'Killersaint007', 853 | 'sachin8859', 854 | 'shubhamsuman37', 855 | 'rutuja2807', 856 | 'rishabh2204', 857 | 'Basal05', 858 | 'vipulkumbhar0', 859 | 'DSMalaviya', 860 | 'Mohit5700', 861 | 'pranaykrpiyush', 862 | 'Deepesh11-Code', 863 | 'yogikhandal', 864 | 'jigneshoo7', 865 | 'vishal-1264', 866 | 'RohanKap00r', 867 | 'Lokik18', 868 | 'harisharma12', 869 | 'PRESIDENT-caris', 870 | 'sandy56github', 871 | 'shreeya0505', 872 | 'Azumaxoid', 873 | 'Hagemaru69', 874 | 'sanju69', 875 | 'Roopeshrawat', 876 | 'hackersadd', 877 | 'coder0880', 878 | 'bajajtushar094', 879 | 'amitkumar8514', 880 | 'avichalsri', 881 | 'Satya-cod', 882 | 'andaugust', 883 | 'emtushar', 884 | 'snehalbiju12', 885 | 'lakshya05', 886 | 'Shaika07', 887 | 'John339', 888 | 'chetan-v', 889 | 'KrishnaAgarwal3458', 890 | 'rohit-1225', 891 | 'vaibhavjain2099', 892 | 'Pratheekb1', 893 | 'devu2000', 894 | 'Akhil88328832', 895 | 'anupam123148', 896 | 'pramod12345-design', 897 | 'Kartik192192', 898 | 'Kartik-Aggarwal', 899 | 'Ekansh5702', 900 | 'basitali97', 901 | 'TanishqKhetan', 902 | 'deecode15800', 903 | 'Vibhore-7190', 904 | 'Harsh-pj', 905 | 'vishalvishw10', 906 | 'runaljain255', 907 | 'RitikmishraRitik', 908 | 'akashtyagi0008', 909 | 'albert1800', 910 | 'Harsh1388-p', 911 | 'Omkar0104', 912 | 'Lakshitasaini8', 913 | 'vaibhav-87', 914 | 'AshimKr', 915 | 'joshi2727', 916 | 'vihariswamy', 917 | 'Sudhanshu-Srivastava', 918 | 'sameersahoo', 919 | 'YOGENDER-sharma', 920 | 'shashank06-sudo', 921 | 'irramshaiikh', 922 | 'Magnate2213', 923 | 'srishti0801', 924 | 'darshanchau', 925 | 'tanishka1745', 926 | 'Coder00sharma', 927 | 'gariya95', 928 | 'vedanttttt', 929 | 'codecpacka', 930 | 'vijay0960', 931 | 'tanya-98', 932 | 'Tarkeshwar999', 933 | 'RiderX24', 934 | 'BUNNY2210', 935 | 'yuvrajbagale', 936 | 'Pranchalkushwaha', 937 | 'Varun11940', 938 | 'khushhal213', 939 | 'Raulkumar', 940 | 'bekapish', 941 | 'shubhkr1023', 942 | 'mishrasanskriti802', 943 | 'vaibhavimekhe', 944 | 'HardikShreays', 945 | 'ab-rahman92', 946 | 'waytoheaven001', 947 | 'ambrajyaldandi', 948 | '100009224730519', 949 | 'Bikramdas04', 950 | 'mokshkant7', 951 | 'Harshcoder10', 952 | 'hvshete', 953 | 'sanmatipol', 954 | 'polankita', 955 | 'Vinit-Code04', 956 | 'Sheetal0601', 957 | 'harsh123-para', 958 | 'RitikSharma06', 959 | 'pankajmandal1996', 960 | 'AkshayNaphade', 961 | 'KaushalDevrari', 962 | 'ag3n7', 963 | 'SudershanSharma', 964 | 'naturese', 965 | 'Shubham-217', 966 | 'ateef-khan', 967 | 'sharad5987', 968 | 'anmolsahu901', 969 | 'sarkarbibrata', 970 | 'Chandramohan01', 971 | 'RAVI-SHEKHAR-SINGH', 972 | 'vinayak15-cyber', 973 | 'TheWriterSahb', 974 | 'way2dmark', 975 | 'Spramod23', 976 | 'Saurabgami977', 977 | 'doberoi10', 978 | 'Lakshya9425', 979 | 'megha1527', 980 | 'beasttiwari', 981 | 'gtg94', 982 | 'kshingala1', 983 | 'Dshivamkumar', 984 | 'smokkie087', 985 | 'RiserShaikh', 986 | 'explorerAndroid', 987 | 'Grace-Rasaily780', 988 | 'Harshacharya2020', 989 | 'SatvikVirmani', 990 | 'RishabhIshtwal', 991 | 'gargtanuj05', 992 | 'skilleddevil', 993 | 'XAFFI', 994 | 'BALAJIRAO676', 995 | 'neer007-cpu', 996 | 'JiimmyValentine', 997 | 'Dhruv8228', 998 | 'Devendranath-Maddula', 999 | 'abhishekaman3015', 1000 | 'sudhir-12', 1001 | 'Shashi-design', 1002 | 'simplilearns', 1003 | 'ThakurTulsi', 1004 | 'rahulshastryd', 1005 | 'Ankit9915', 1006 | 'afridi1706', 1007 | 'JaySingh23', 1008 | 'DevCode-shreyas', 1009 | 'Shivansh-K', 1010 | 'kikisslass', 1011 | 'swarup4544', 1012 | 'shivam22chaudhary', 1013 | 'smrn54', 1014 | '521ramborahul', 1015 | 'pretechscience', 1016 | 'rudrakj', 1017 | 'janidivy', 1018 | 'SuvarneshKM', 1019 | 'manishsuthar414', 1020 | 'raghavbansal-sys', 1021 | 'GoGi2712', 1022 | 'therikesh', 1023 | 'Anonymouslaj', 1024 | 'devs7122', 1025 | 'icmulnk77', 1026 | 'ankit4-com', 1027 | 'ansh4223', 1028 | 'shudhanshubisht08', 1029 | 'RN-01', 1030 | 'iamsandeepprasad', 1031 | 'neerajd007', 1032 | 'rrishu', 1033 | 'sameer0606', 1034 | 'kunaldhar', 1035 | 'sajal243', 1036 | 'Arsalankhan111', 1037 | 'RavindraPal2000', 1038 | 'shubham5630994', 1039 | 'ankit526', 1040 | 'codewithaniket', 1041 | 'meetpanchal017', 1042 | 'Pranjal1362', 1043 | 'ni30kp', 1044 | 'kushalsoni123', 1045 | 'Nishantcoedtu', 1046 | 'vijaygupta18', 1047 | 'Bishalsharma733', 1048 | 'AnkitaMalviya', 1049 | 'anianiket', 1050 | 'hritik6774', 1051 | 'krongreap', 1052 | 'FlyingwithCaptainSoumya', 1053 | 'himpat202', 1054 | 'mahin651', 1055 | 'mohit-jadhav-mj', 1056 | 'kaushiknyay18', 1057 | 'testinguser883', 1058 | 'MdUmar07', 1059 | 'Saumiya-Ranjan', 1060 | 'cycric', 1061 | 'mandliya456', 1062 | 'kavipss', 1063 | 'Sumit1777', 1064 | 'ankitgusain', 1065 | 'SKamal1998', 1066 | 'Pritam-hrxcoder13', 1067 | 'shruti-coder', 1068 | 'Harshit-techno', 1069 | 'Sanketpatil45', 1070 | 'poojan-26', 1071 | 'Nayan-Sinha', 1072 | 'confievil', 1073 | 'mrkishanda', 1074 | 'abhishek777777777777', 1075 | 'ankitnith99', 1076 | 'Pushkar0', 1077 | 'Sahil-Sinha', 1078 | 'Anantvasu-cyber', 1079 | 'priyanujbd23', 1080 | 'divyanshmalik22', 1081 | 'shreybhan', 1082 | 'nirupam090', 1083 | 'sohail000shaikh', 1084 | 'dhruvvats-011', 1085 | 'ATRI2107', 1086 | 'Harjot9812', 1087 | 'sougata18p', 1088 | 'Amogh6315', 1089 | 'NishanBanga', 1090 | 'SaifVeesar', 1091 | 'edipretoro', 1092 | 'Amit10538', 1093 | 'thewires2', 1094 | 'jaswalsaurabh', 1095 | 'siddh358', 1096 | 'raj074', 1097 | 'Sameer-create', 1098 | 'goderos19', 1099 | 'akash6194', 1100 | 'Ketan19479', 1101 | 'shubham-01-star', 1102 | 'avijitmondal', 1103 | 'khand420', 1104 | 'kasarpratik31', 1105 | 'jayommaniya', 1106 | 'WildCard13', 1107 | 'RishabhAgarwal345', 1108 | 'mukultwr', 1109 | 'Gauravrathi1122', 1110 | 'abhinav-bit', 1111 | 'ShivamBaishkhiyar', 1112 | 'sudip682', 1113 | 'neelshah6892', 1114 | 'archit00007', 1115 | 'Kara3', 1116 | 'Akash5523', 1117 | 'Pranshumehta', 1118 | 'karan97144', 1119 | 'parasraghav288', 1120 | 'codingmastr', 1121 | 'farzi56787', 1122 | 'SAURABHYAGYIK', 1123 | 'faizan7800', 1124 | 'TheBinitGhimire', 1125 | 'anandrathod143', 1126 | 'Jeetrughani', 1127 | 'aaditya2357', 1128 | 'ADDY-666', 1129 | 'kumarsammi3', 1130 | 'prembhatt1916', 1131 | 'Gourav5857', 1132 | 'pradnyaghuge', 1133 | 'Vishal-Aggarwal0305', 1134 | 'prashant-45', 1135 | 'abhishek18002', 1136 | 'Deadlynector', 1137 | 'ashishjangir02082001', 1138 | 'RohitSingh04', 1139 | 'Satyamtechy', 1140 | 'shreyukashid', 1141 | 'M-ux349', 1142 | 'Riya123cloud', 1143 | 'coder-beast-78', 1144 | 'mrmaxx010204', 1145 | 'npdoshi5', 1146 | 'gobar07', 1147 | 'rushi1313', 1148 | 'Akashsah312', 1149 | 'pksinghal585', 1150 | 'rockyfarhan', 1151 | 'JayeshDehankar', 1152 | 'sarap224', 1153 | 'yash752004', 1154 | 'rohan241119', 1155 | 'Nick-h4ck3r', 1156 | 'abhishekA07', 1157 | 'cjjain76', 1158 | 'CodeWithYashraj', 1159 | 'dkp888', 1160 | 'rahil003', 1161 | 'sachin694', 1162 | 'Anjali0369', 1163 | 'sumeet004', 1164 | 'aryan1256', 1165 | 'PNSuchismita', 1166 | 'shash2407', 1167 | 'Tanishk007', 1168 | 'Yugalbuddy', 1169 | 'Saurabh392', 1170 | 'Saurabh299', 1171 | 'DevanshGupta15', 1172 | 'DeltaxHamster', 1173 | 'darpan45', 1174 | 'P-cpu', 1175 | 'singhneha94', 1176 | 'Nitish-McQueen', 1177 | 'GRACEMARYMATHEW', 1178 | 'ios-shah', 1179 | 'Divanshu2402', 1180 | 'asubodh', 1181 | 'CypherAk007', 1182 | 'nethracookie', 1183 | 'guptaji609', 1184 | 'thishantj', 1185 | 'shivamsaini89', 1186 | 'AntLab04', 1187 | 'bit2u', 1188 | 'AbhishekTiwari72', 1189 | 'shreyashkharde', 1190 | 'PrabhatP2000', 1191 | 'amansahani60', 1192 | 'shubham5888', 1193 | 'Ashutoshkrs', 1194 | 'scratcher007lakshya', 1195 | 'SumitRodrigues', 1196 | 'Harishit1466', 1197 | 'Gouravbhardwaj1', 1198 | 'shraiyya', 1199 | 'SpooderManEXE', 1200 | 'thelinuxboy', 1201 | 'jamnesh', 1202 | 'Nilesh425', 1203 | 'machinegun20000', 1204 | 'Brianodroid', 1205 | 'sunnyjohari', 1206 | 'TusharThakkar13', 1207 | 'juned06', 1208 | 'bindu-07', 1209 | 'gautamsharma17', 1210 | 'sonamvlog', 1211 | 'iRajMishra', 1212 | 'ayushgupta1915', 1213 | 'Joker9050', 1214 | 'Aakash1720', 1215 | 'sakshiii-bit', 1216 | 'mpsapps', 1217 | 'deadshot9987', 1218 | 'RobinKumar5986', 1219 | 'thiszsachin', 1220 | 'karanjoshi1206', 1221 | 'sumitsisodiya', 1222 | 'akashnavale18', 1223 | 'spmhot', 1224 | 'ashutoshhack', 1225 | 'shivamupasanigg', 1226 | 'rajaramrom', 1227 | 'vksvikash85072', 1228 | 'mohitkedia-github', 1229 | 'vanshdeepcoder', 1230 | 'rkgupta95', 1231 | 'sushilmangnlae', 1232 | 'Prakashmishra25', 1233 | 'YashPatelH', 1234 | 'prakash-jayaswal-au6', 1235 | 'AnayAshishBhagat', 1236 | 'Indian-hacker', 1237 | 'ishaanbhardwaj', 1238 | 'nish235', 1239 | 'shubhampatil9125', 1240 | 'Ankush-prog', 1241 | 'Arpus87', 1242 | 'kuldeepborkarjr', 1243 | 'rajibbera', 1244 | 'kt96914', 1245 | 'nithubcode', 1246 | 'ishangoyal8055', 1247 | 'Samirbhajipale', 1248 | 'AnshKumar200', 1249 | 'salmansalim145', 1250 | 'SAWANTHMARINGANTI', 1251 | 'ankitts12', 1252 | 'ketul2912', 1253 | 'kdj309', 1254 | 'nsundriyal62', 1255 | 'manishsingh003', 1256 | 'Deepak-max800', 1257 | 'magicmasti428', 1258 | 'sidharthpunathil', 1259 | 'shyamal2411', 1260 | 'auravgv', 1261 | 'MrIconic27', 1262 | 'anku-11-11', 1263 | 'Suyashendra', 1264 | 'WarriorSdg', 1265 | 'pythoniseasy-hub', 1266 | 'Nikk-code', 1267 | 'Kutubkhan2005', 1268 | 'kunal4421', 1269 | 'apoorva1823000', 1270 | 'singharsh0', 1271 | 'sushobhitk', 1272 | 'NavidMansuri5155', 1273 | 'tanav8570', 1274 | 'Durveshpal', 1275 | 'dkishere2021', 1276 | 'shubhamraj01', 1277 | 'manthan14448', 1278 | 'sahilmandoliya', 1279 | 'Dewakarsonusingh', 1280 | 'kalpya123', 1281 | '9075yash', 1282 | 'Aditya7851-AdiStarCoders', 1283 | 'MrChau', 1284 | 'ooyeayush', 1285 | 'Vipinkumar12it', 1286 | 'ayushyadav2001', 1287 | 'akshay20105', 1288 | 'prothehero', 1289 | 'sam007143', 1290 | 'subhojit75', 1291 | 'Dhvanil25', 1292 | 'ANKUSHSINGH-PAT', 1293 | 'Apoorva-Shukla', 1294 | 'GizmoGamingIn', 1295 | 'Mahaveer173', 1296 | 'Abhayrai778', 1297 | 'adityarawat007', 1298 | 'HarshKumar2001', 1299 | 'mohitboricha', 1300 | 'deepakpate07', 1301 | 'Aish-18', 1302 | 'Sakshi-2100', 1303 | 'adarshdwivedi123', 1304 | 'shubhamprakhar', 1305 | 'Basir56', 1306 | 'zerohub23', 1307 | 'Shrish072003', 1308 | 'yash3497', 1309 | 'Alfax14910', 1310 | 'khushboo-lab', 1311 | 'Devam-Vyas', 1312 | 'PPS-H', 1313 | 'nimitshrestha', 1314 | 'sunnythepatel', 1315 | 'Tusharkumarofficial', 1316 | 'Nikhilmadduri', 1317 | 'hiddenGeeks', 1318 | 'dearyash', 1319 | 'shahvihan', 1320 | 'BlackThor555', 1321 | 'preetamsatpute555', 1322 | 'RanniePavillon', 1323 | 'dgbkn', 1324 | 'Karan-Agarwal1', 1325 | 'praanjaal-guptaa', 1326 | 'Cha7410', 1327 | 'ar2626715', 1328 | 'suhaibshaik', 1329 | 'gurkaranhub', 1330 | 'Guptaji29', 1331 | 'seekNdestory', 1332 | 'gorujr', 1333 | 'lokeshbramhe', 1334 | 'Rakesh-roy', 1335 | 'NKGupta07', 1336 | 'hacky503boy', 1337 | 'Harshit-Taneja', 1338 | 'vishal3308', 1339 | 'vibhor828', 1340 | 'rabi477', 1341 | 'ArinTyagi', 1342 | 'RaviMahile', 1343 | 'Ayushgreeshu', 1344 | 'Deepak674', 1345 | 'VikashAbhay', 1346 | 'paddu-sonu', 1347 | 'swapnil-morakhia', 1348 | 'anshu7919', 1349 | 'vickyshaw29', 1350 | 'pawan941394', 1351 | 'mayankrai123', 1352 | 'riodelord', 1353 | 'iamsmr', 1354 | 'ramkrit', 1355 | 'vijayjha15', 1356 | 'Anurag346', 1357 | 'vineetstar10', 1358 | 'Amarjeetsingh6120000', 1359 | 'ayush9000', 1360 | 'staticman-net', 1361 | 'piyush4github', 1362 | 'Neal-01', 1363 | 'sky00099', 1364 | 'cjheath', 1365 | 'pranavstar-1203', 1366 | 'sjwarner', 1367 | 'Sandeepana', 1368 | 'ritikrkx21', 1369 | 'alinasahoo', 1370 | 'tech-vin', 1371 | 'Atul-steamcoder', 1372 | 'ranchodhamala11', 1373 | 'pradnyahaval', 1374 | 'Nishant2911', 1375 | 'altaf71mansoori', 1376 | 'codex111', 1377 | 'anirbandey303', 1378 | 'kishan-kushwaha', 1379 | 'ashwinthomas28', 1380 | 'adityasunny1189', 1381 | 'sourav1122', 1382 | 'Hozefa976', 1383 | 'PratapSaren', 1384 | 'vikram-3118', 1385 | 'Deep22T', 1386 | 'sidd4999', 1387 | 'agrawalvinay699', 1388 | 'anujsingh1913', 1389 | 'SoniHariom555', 1390 | 'AyushJoshi2001', 1391 | 'barinder7', 1392 | 'shishir-m98', 1393 | 'abhishekkrdev', 1394 | 'pmanaktala', 1395 | 'Snehil101', 1396 | 'Himanshsingh0753', 1397 | 'sambhav2898', 1398 | 'niteshsharma9', 1399 | 'x-thompson3', 1400 | 'Vipul-hash', 1401 | 'MrityunjayR', 1402 | 'Abhinav7272', 1403 | 'prashant-pbh', 1404 | 'Saswat-Gewali', 1405 | 'Redcloud2020-coder', 1406 | 'priyanka-prasad1', 1407 | 'harshwardhan111', 1408 | 'Rajendra-banna', 1409 | 'Rajan24032000', 1410 | 'Mariede', 1411 | 'sakshi-jain24', 1412 | 'arron-hacker', 1413 | 'Aniket-ind', 1414 | 'Devloper-Adil', 1415 | 'Shubh2674', 1416 | 'saloninahar', 1417 | 'DipNkr', 1418 | 'princekumar6', 1419 | 'harshsingh121098', 1420 | 'Rajneesh486Git', 1421 | 'jitendragangwar', 1422 | 'Jayesh-Kumar-Yadav', 1423 | 'shudhii', 1424 | 'Bishal-bit', 1425 | 'sulemangit', 1426 | 'Kushagra767', 1427 | 'JSM2512', 1428 | 'ovs1176', 1429 | 'arfakl99', 1430 | 'Premkr1110', 1431 | 'YASH162', 1432 | 'rp-singh1994', 1433 | 'Deepu10172j', 1434 | 'raghavk911', 1435 | 'HardikN19', 1436 | 'Gari1309', 1437 | 'eklare19', 1438 | 'rohitmore1012', 1439 | 'Aabhash007', 1440 | 'mohitsaha123', 1441 | 'Bhagirath043', 1442 | 'surajphulara', 1443 | 'shaurya127', 1444 | 'shubzzz98', 1445 | 'mkarimi-coder', 1446 | 'sakshi0309-champ', 1447 | 'shivam623623', 1448 | 'cheekudeveloper', 1449 | 'Ashutosh-98765', 1450 | 'Vaibhavipadamwar', 1451 | 'shwetashrei', 1452 | 'Banashree19', 1453 | 'atharvashinde01', 1454 | 'PrashantMehta-coder', 1455 | 'kajolkumari150', 1456 | 'Aqdashashmii', 1457 | 'joyskmathew', 1458 | 'pkkushagra', 1459 | 'Rishrao09', 1460 | 'Ashutoshrastogi02', 1461 | 'JatulCodes', 1462 | 'agarwals368', 1463 | 'praveenbhardwaj', 1464 | 'hardik302001', 1465 | 'jagannathbehera444', 1466 | 'jubyer00', 1467 | 'SouravSarkar7', 1468 | 'neerajsins', 1469 | 'Rasam22', 1470 | 'pk-bits', 1471 | 'asawaronit60', 1472 | 'anupama-nicky', 1473 | 'Kishan-Kumar-Kannaujiya', 1474 | 'carrycooldude', 1475 | 'parasjain99', 1476 | 'vishwatejharer', 1477 | 'sayon-islam-23', 1478 | 'sidhu56', 1479 | 'Diwakarprasadlp', 1480 | 'hashim361', 1481 | 'Anantjoshie', 1482 | 'bankateshkr', 1483 | 'Mayank2001kh', 1484 | 'RoyNancy', 1485 | 'ayushsagar10', 1486 | 'jaymishra2002', 1487 | 'Anushka004', 1488 | 'naitik-23', 1489 | 'meraj97', 1490 | 'gagangupta07', 1491 | 'stark829', 1492 | 'Muskan761', 1493 | 'MrDeepakY', 1494 | 'NayanPrakash11', 1495 | 'shawnfrost69', 1496 | 'thor174', 1497 | 'Sumeet2442', 1498 | 'ummekulsum123', 1499 | 'akarsh2312', 1500 | 'hemantmakkar', 1501 | 'bardrock01', 1502 | 'MrunalHole', 1503 | 'chetanrakhra', 1504 | 'pratik821', 1505 | 'rahulkz', 1506 | 'Akhilesh-ingle', 1507 | 'pruthvi3007', 1508 | 'Vanshi1999', 1509 | 'sagarkb', 1510 | 'CoderRushil', 1511 | 'Shivansh2200', 1512 | 'Ronak14999', 1513 | 'srishtiaggarwal', 1514 | 'adityakumar48', 1515 | 'piyushchandana', 1516 | 'Piyussshh', 1517 | 'priyank-di', 1518 | 'Vishwajeetbamane', 1519 | 'moto-pixel', 1520 | 'madmaxakshay', 1521 | 'James-HACK', 1522 | 'vikaschamyal', 1523 | 'Arkadipta14', 1524 | 'Abhishekk2000', 1525 | 'Sushant012', 1526 | 'Quint-Anir', 1527 | 'navaloli', 1528 | 'ronitsingh1405', 1529 | 'vanshu25', 1530 | 'samueldenzil', 1531 | 'akashrajput25', 1532 | 'sidhi100', 1533 | 'ShivtechSolutions', 1534 | 'vimal365', 1535 | 'master77229', 1536 | 'Shubham-Khetan-2005', 1537 | 'vaishnavi-1', 1538 | 'AbhijithSogal', 1539 | 'Sid133', 1540 | 'white-devil123', 1541 | 'bawa2510', 1542 | 'anjanikshree12', 1543 | 'mansigupta1999', 1544 | 'hritik229', 1545 | 'engineersonal', 1546 | 'adityaadg1997', 1547 | 'mansishah20', 1548 | '2shuux', 1549 | 'Nishthajosh', 1550 | 'ParthaDe94', 1551 | 'abhi-io', 1552 | 'Neha-119', 1553 | 'Dungeonmaster07', 1554 | 'Prathu121', 1555 | 'anishloop7', 1556 | 'cwmohit', 1557 | 'shivamsri142', 1558 | 'Sahil9511', 1559 | 'NIKHILAVISHEK', 1560 | 'amitpaswan9', 1561 | 'devsharmaarihant', 1562 | 'bilal509', 1563 | 'BrahmajitMohapatra', 1564 | 'rebelpower', 1565 | 'Biswajitpradhan', 1566 | 'sudhirhacker999', 1567 | 'pydevtanya', 1568 | 'Ashutosh147', 1569 | 'jayeshmishra', 1570 | 'rahul97407', 1571 | 'athar10y2k', 1572 | 'mrvasani48', 1573 | 'raiatharva', 1574 | 'Arj09', 1575 | 'manish-109', 1576 | 'aishwarya540', 1577 | 'mohitjoshi81', 1578 | 'PrathamAditya', 1579 | 'K-Adrenaline', 1580 | 'mrvlsaf', 1581 | 'shivam9599', 1582 | 'souravnitkkr', 1583 | 'Anugya-Gogoi', 1584 | 'AdityaTiwari64', 1585 | 'yash623623', 1586 | 'anjanik807', 1587 | 'ujjwal193', 1588 | 'TusharKapoor24', 1589 | 'Ayushman278', 1590 | 'osama072', 1591 | 'aksahoo-1097', 1592 | 'kishan-31802', 1593 | 'Roshanpaswan', 1594 | 'Himanshu-Prajapati', 1595 | 'satyamraj48', 1596 | 'NEFARI0US', 1597 | 'kavitsheth', 1598 | 'kushagra-18', 1599 | 'khalane1221', 1600 | 'ravleenkaur8368', 1601 | 'Himanshu9430', 1602 | 'uttam509', 1603 | 'CmeherGit', 1604 | 'sid5566', 1605 | 'devaryan12123', 1606 | 'ishanchoudhry', 1607 | 'himanshu70043', 1608 | 'skabhi001', 1609 | 'tekkenpro', 1610 | 'sandip1911', 1611 | 'HarshvardhnMishra', 1612 | 'krunalrocky', 1613 | 'rohitkr-07', 1614 | 'anshulgarg1234', 1615 | 'hacky502boy', 1616 | 'vivek-nagre', 1617 | 'Hsm7085', 1618 | 'amazingmj', 1619 | 'Rbsingh9111', 1620 | 'ronupanchal', 1621 | 'mohitcodeshere', 1622 | '1741Rishabh', 1623 | 'Cypher2122', 1624 | 'SahilDiwakar', 1625 | 'abhigyan1000', 1626 | 'HimanshuSharma5280', 1627 | 'ProgrammerHarsh', 1628 | 'Amitamit789', 1629 | 'swapnilmutthalkar', 1630 | 'enggRahul8git', 1631 | 'BhuvnendraPratapSingh', 1632 | 'Ronak1958', 1633 | 'Knight-coder', 1634 | 'Faizu123', 1635 | 'shivansh987', 1636 | 'mrsampage', 1637 | 'AbhishikaAgarwal', 1638 | 'Souvagya-Nayak', 1639 | 'harsh287', 1640 | 'Staryking', 1641 | 'rmuliterno', 1642 | 'kunjshah0703', 1643 | 'KansaraPratham', 1644 | 'GargoyleKing2112', 1645 | 'Tanu-creater', 1646 | 'satvikmittal638', 1647 | 'gauravshinde-7', 1648 | 'saabkapoor36', 1649 | 'devangpawar', 1650 | 'RiddhiCoder', 1651 | 'Bilalrizwaan', 1652 | 'sayyamjain78', 1653 | '2606199', 1654 | 'mayuresh4700', 1655 | 'umang171', 1656 | 'kramit9', 1657 | 'surendraverma1999', 1658 | 'raviu773986', 1659 | 'Codewithzaid', 1660 | 'Souvik-Bose-199', 1661 | 'BeManas', 1662 | 'JKHAS786', 1663 | 'MrK232', 1664 | 'aaryannipane', 1665 | 'bronzegamer', 1666 | 'hardikkushwaha', 1667 | 'Anurag931999', 1668 | 'dhruvalgupta2003', 1669 | 'kaushal7806', 1670 | 'JayGupta6866', 1671 | 'mayank161001', 1672 | 'ShashankPawsekar', 1673 | '387daksh', 1674 | 'Susanta-Nayak', 1675 | 'Pratik-11', 1676 | 'Anas-S-Shaikh', 1677 | 'marginkantilal', 1678 | 'Brijbihari24', 1679 | 'Deepanshu761', 1680 | 'Aakashlifehacker', 1681 | 'SaketKaswa', 1682 | 'dhritiduttroy', 1683 | 'astitvagupta31', 1684 | 'Prakhyat-Srivastava', 1685 | 'Puneet405', 1686 | 'harsh2630', 1687 | 'sds9639', 1688 | 'Prajwal38', 1689 | 'simransharmarajni', 1690 | 'Naman195', 1691 | 'patience0721', 1692 | 'Aman6651', 1693 | 'tyagi1558', 1694 | 'kmannnish', 1695 | 'victorwpbastos', 1696 | 'sagnik403', 1697 | 'rahuly5544', 1698 | 'PrinceKumarMaurya591', 1699 | 'nakulwastaken', 1700 | 'janmejayamet', 1701 | 'HimanshuGupta11110000', 1702 | 'Akshatcodes21', 1703 | 'IRFANSARI', 1704 | 'shreya991', 1705 | 'pavan109', 1706 | 'Parth00010', 1707 | 'itzUG', 1708 | 'Mayank-choudhary-SF', 1709 | 'shubhamborse', 1710 | 'Courage04', 1711 | 'techsonu160', 1712 | 'shivamkonkar', 1713 | 'ErMapsh', 1714 | 'roshan-githubb', 1715 | 'Gourav502', 1716 | 'SauravMiah', 1717 | 'nikhil609', 1718 | 'BenzylFernandes', 1719 | 'BarnakGhosh', 1720 | 'Aanchalgarg343', 1721 | 'Madhav12345678', 1722 | 'Tirth11', 1723 | 'bhavesh1456', 1724 | 'ajeet323327', 1725 | 'AmitNayak9', 1726 | 'lalitchauhan2712', 1727 | 'raviroshan224', 1728 | 'hellmodexxx', 1729 | 'Dhruv1501', 1730 | 'Himanshu6003', 1731 | 'mystery2828', 1732 | 'waris89', 1733 | '2303-kanha', 1734 | 'Anshuk-Mishra', 1735 | 'amandeeptiwari22', 1736 | 'Shashikant9198', 1737 | 'Adityacoder99', 1738 | 'Pradeepsharma7447', 1739 | 'varunreddy57', 1740 | 'uddeshaya', 1741 | 'Priyanka0310-byte', 1742 | 'adharsidhantgupta', 1743 | 'Bhupander7', 1744 | 'NomanSubhani', 1745 | 'umeshkv2', 1746 | 'Debosmit-Neogi', 1747 | 'bhaktiagrawal088', 1748 | 'Aashishsharma99', 1749 | 'G25091998', 1750 | 'mdkaif25', 1751 | 'raj-jetani', 1752 | 'chetanpujari5105', 1753 | 'Agrawal-Rajat', 1754 | 'Parthkrishnan', 1755 | 'sameer-15', 1756 | 'HD-Harsh-Doshi', 1757 | 'Anvesha', 1758 | 'karanmankoliya', 1759 | 'armandatt', 1760 | 'DakshSinghalIMS', 1761 | 'Bhavyyadav25', 1762 | 'surya123-ctrl', 1763 | 'shubhambhawsar-5782', 1764 | 'PAWANOP', 1765 | 'mohit-singh-coder', 1766 | 'Mradul-Hub', 1767 | 'babai1999', 1768 | 'Ritesh4726', 1769 | 'Anuj-Solanki', 1770 | 'abhi04neel', 1771 | 'yashshahah', 1772 | 'yogendraN27', 1773 | 'Rishabh23-thakur', 1774 | 'Indhralochan', 1775 | 'harshvaghani', 1776 | 'dapokiya', 1777 | 'pg00019', 1778 | 'AMITPKR', 1779 | 'pawarrahul1002', 1780 | 'mrgentlemanus', 1781 | 'anurag-sonkar', 1782 | 'aalsicoder07', 1783 | 'harsh2699', 1784 | 'Rahilkaxi', 1785 | 'Jyotindra-21', 1786 | 'dhruvilmehta', 1787 | 'jacktherock', 1788 | 'helpinubcomgr8', 1789 | 'spcrze', 1790 | 'aman707f', 1791 | 'Nikkhil-J', 1792 | 'Poonam798', 1793 | 'devyansh2006', 1794 | 'amanpj15', 1795 | 'rudrcodes', 1796 | 'STREIN-max', 1797 | 'Adarsh-kushwaha', 1798 | 'adxsh', 1799 | 'Mohnish7869', 1800 | 'Mrpalash', 1801 | 'umangpincha', 1802 | 'aniket1399', 1803 | 'Sudip843', 1804 | 'Amartya-Srivastav', 1805 | 'Ananda1113', 1806 | 'nobbitaa', 1807 | 'shahmeet79', 1808 | 'AmitM56', 1809 | 'jiechencn', 1810 | 'devim-stuffs', 1811 | 'bkobl', 1812 | 'kavindyasinthasilva', 1813 | 'MochamadAhya29', 1814 | 'misbagas', 1815 | 'ksmarty', 1816 | 'vedikaag99', 1817 | 'nongshaba1337', 1818 | 'daiyi', 1819 | 'Saturia', 1820 | 'llfj', 1821 | '312494845', 1822 | 'DeadPackets', 1823 | 'Pandorax41', 1824 | 'Kritip123', 1825 | 'poburi', 1826 | 'hffkb', 1827 | 'cybrnook', 1828 | 'lichaonetuser', 1829 | 'l-k-a-m-a-z-a', 1830 | 'zhaoshengweifeng', 1831 | 'staticman-peoplesoftmods', 1832 | 'ikghx', 1833 | 'uguruyar', 1834 | '513439077', 1835 | 'f4nff', 1836 | 'samspei0l', 1837 | 'Seminlee94', 1838 | 'inflabz', 1839 | 'jack1988520', 1840 | 'lanfenglin', 1841 | 'sujalgoel', 1842 | 'foldax', 1843 | 'corejava', 1844 | 'DarkReitor', 1845 | 'amirpourastarabadi', 1846 | 'Raess-rk1', 1847 | 'ankit0183', 1848 | 'jurandy007', 1849 | 'davidbarratt', 1850 | 'bertonjulian', 1851 | 'TMFRook', 1852 | 'qhmdi', 1853 | 'QairexStudio', 1854 | 'XuHewen', 1855 | 'happyxhw', 1856 | 'Mokaz24', 1857 | 'andyteq', 1858 | 'Grommish', 1859 | 'fork-bombed', 1860 | 'AZiMiao1122', 1861 | '61569864', 1862 | 'jeemgreen234', 1863 | 'IgorKowalczykBot', 1864 | 'sirpdboy', 1865 | 'fjsnogueira', 1866 | '9000000', 1867 | 'ascott', 1868 | 'aparcar', 1869 | 'void9main', 1870 | 'gerzees', 1871 | 'javadnew5', 1872 | 'belatedluck', 1873 | 'calmsacibis995', 1874 | 'maciejSamerdak', 1875 | 'ghostsniper2018', 1876 | 'rockertinsein', 1877 | 'divarjahan', 1878 | 'skywalkerEx', 1879 | 'ehack-italy', 1880 | 'Cloufish', 1881 | 'aasoares', 1882 | 'mustyildiz', 1883 | 'Ras7', 1884 | 'philly12399', 1885 | 'cuucondiep', 1886 | 'Nomake', 1887 | 'z306334796', 1888 | 'ball144love', 1889 | 'armfc6161', 1890 | 'Alex-coffen', 1891 | 'rodrigodesouza07', 1892 | 'lss182650', 1893 | 'iphotomoto', 1894 | 'overlordsaten', 1895 | 'miaoshengwang', 1896 | 'ManiakMCPE', 1897 | 'Yazid0540570463', 1898 | 'unnamegeek', 1899 | 'brennvika', 1900 | 'ardi66', 1901 | 'Cheniour10', 1902 | 'lxc1121', 1903 | 'rfm-bot', 1904 | 'cornspig', 1905 | 'jedai47', 1906 | 'ignotus09', 1907 | 'kamal7641', 1908 | 'Dabe11', 1909 | 'dgder0', 1910 | 'Nerom', 1911 | 'luixiuno', 1912 | 'zh610902551', 1913 | 'wifimedia', 1914 | 'mjoelmendes', 1915 | 'pc2019', 1916 | 'hellodong', 1917 | 'lkfete', 1918 | 'a7raj', 1919 | 'willquirk', 1920 | 'xyudikxeon1717171717', 1921 | '420hackS', 1922 | 'mohithpokala', 1923 | 'tranglc', 1924 | 'ilyankou', 1925 | 'hhmaomao', 1926 | 'hongjuzzang', 1927 | 'Mophee-ds', 1928 | 'wetorek', 1929 | 'apktesl', 1930 | 'jaylac2000', 1931 | 'BishengSJTU', 1932 | 'elfring', 1933 | 'ThomasGrund', 1934 | 'coltonios', 1935 | 'kouhe3', 1936 | 'balaji-29', 1937 | 'demo003', 1938 | 'gfsupport', 1939 | 'AlonzoLax', 1940 | 'tazmanian-hub', 1941 | 'qwerttvv', 1942 | 'kotucocuk', 1943 | 'ajnair100', 1944 | 'jirayutza1', 1945 | 'karolsw3', 1946 | 'shenzt68', 1947 | 'xpalm', 1948 | 'adamwebrog', 1949 | 'jackmahoney', 1950 | 'chenwangnec', 1951 | 'hanlihanshaobo', 1952 | 'jannik-mohemian', 1953 | 'Pablosky12', 1954 | '95dewadew', 1955 | 'dcharbonnier', 1956 | 'chapmanvoris', 1957 | 'nishantingle999', 1958 | 'gulabraoingle', 1959 | 'kalyaniingle', 1960 | 'BoulavardDepo', 1961 | 'amingoli78', 1962 | 'daya2940', 1963 | 'roaddogg2k2', 1964 | 'AmbroseRen', 1965 | 'jayadevvasudevan', 1966 | 'pambec', 1967 | 'orditeck', 1968 | 'muhammetcan34', 1969 | 'Aman199825', 1970 | 'hyl946', 1971 | 'CyberSecurityUP', 1972 | 'kokum007', 1973 | 'shivamjaiswal64', 1974 | 'Skub123', 1975 | 'KerimG', 1976 | 'thehexmor', 1977 | 'jakaya123', 1978 | 'Ashish24788', 1979 | 'qhuy1501', 1980 | 'TranVanDinh235', 1981 | 'Thuong1998', 1982 | 'TranTheTuan', 1983 | 'anhtuyenuet', 1984 | 'tranhuongk', 1985 | 'danhquyen0109', 1986 | 'hunghv-0939', 1987 | 'dat-lq-234', 1988 | 'nguyenducviet1999', 1989 | 'Rxzzma', 1990 | 'MrRobotjs', 1991 | 'jonschlinkert', 1992 | 'awsumbill', 1993 | 'lastle', 1994 | 'gaga227', 1995 | 'maiquangminh', 1996 | 'andhie-wijaya', 1997 | 'penn5', 1998 | 'FormosaZh', 1999 | 'itz63c', 2000 | 'AvinashReddy3108', 2001 | 'ferchlam', 2002 | 'noobvishal', 2003 | 'ammarraisafti', 2004 | 'authenticatorbot', 2005 | 'SekiBetu', 2006 | 'markkap', 2007 | 'wyd6295578sk', 2008 | 'lorpus', 2009 | 'Camelsvest', 2010 | 'ben-august', 2011 | 'jackytang', 2012 | 'dominguezcelada', 2013 | 'tony1016', 2014 | 'afuerhoff420', 2015 | 'darkoverlordofdata', 2016 | 'yihanwu1024', 2017 | 'bromiao', 2018 | 'MaxEis', 2019 | 'kyf15596619', 2020 | 'Reysefyn', 2021 | 'THEROCK2512', 2022 | 'Krystool', 2023 | 'Adomix', 2024 | 'splexpe', 2025 | 'hugetiny', 2026 | 'mikeLongChen', 2027 | 'KlansyMsniv', 2028 | 'Anony1234mo', 2029 | 'Mygod', 2030 | 'chenzesam', 2031 | 'vatayes', 2032 | 'fisher134', 2033 | 'bmaurizio', 2034 | 'fire-bot', 2035 | 'kjbot-github', 2036 | 'Dcollins66', 2037 | 'dislash', 2038 | 'noraj', 2039 | 'theLSA', 2040 | 'chadyj', 2041 | 'AlbertLiu-Breeze', 2042 | 'jspspike', 2043 | 'kill5Witchd', 2044 | 'repushko', 2045 | 'ankushshekhawat', 2046 | 'karan1dhir', 2047 | 'venkatvani', 2048 | 'tracyxiong1', 2049 | 'PythxnBite', 2050 | 'vamshi0997', 2051 | 'himanshu345', 2052 | 'prabhat2001', 2053 | 'aakar345', 2054 | 'rangers9708', 2055 | 'anuragiiitm', 2056 | 'AlfieBurns12345678910', 2057 | 'marpernas', 2058 | 'jrcole2884', 2059 | 'deshanjali', 2060 | 'alekh42', 2061 | 'deepakgangore', 2062 | 'SuperBeagleDog', 2063 | 'vasiliykovalev', 2064 | 'lyin888', 2065 | 'tchainzzz', 2066 | 'Theoask', 2067 | 'jnikita356', 2068 | 'ajay1706', 2069 | 'gane5hvarma', 2070 | 'pbhavesh2807', 2071 | 'daniloeler', 2072 | 'gabrielrab', 2073 | 'djdamian210', 2074 | '1samuel411', 2075 | 'Apoorv1', 2076 | 'AnimatedAnand', 2077 | '7coil', 2078 | 'trentschnee', 2079 | 'himanshu435', 2080 | 'dialv', 2081 | 'DHRUV536', 2082 | 'pratyushraj01', 2083 | 'vedantv', 2084 | 'yusronrizki', 2085 | 'joaoguazzelli', 2086 | 'pradnyesh45', 2087 | 'aneeshaanjali', 2088 | 'iREDMe', 2089 | 'ashish010598', 2090 | 'abhi1998das', 2091 | 'keshriraj7870', 2092 | 'vishad2', 2093 | 'Navzter', 2094 | 'jagadyudha', 2095 | 'hrom405', 2096 | 'seferov', 2097 | 'umeshdhauni', 2098 | 'sakshamkhurana97', 2099 | 'ThatNerdyPikachu', 2100 | 'dishantsethi', 2101 | 'tharindumalshan1', 2102 | 'ruderbytes', 2103 | 'pr-jli', 2104 | '21RachitShukla', 2105 | 'fellipegs', 2106 | 'foolbirds', 2107 | 'hariprasetia', 2108 | 'tanyaagrawal1006', 2109 | 'Gaurav1309Goel', 2110 | 'vidurathegeek', 2111 | 'wolfsoldier47', 2112 | 'bhaskar24', 2113 | 'thedutchruben', 2114 | 'Qoyyuum', 2115 | 'msdeibel', 2116 | 'Nann', 2117 | 'bksahu', 2118 | 'sathyamoorthyrr', 2119 | 'sbenstewart', 2120 | 'supriyanta', 2121 | 'MasterKN48', 2122 | 'prkhrv', 2123 | 'Blatantz', 2124 | 'rahulgoyal911', 2125 | 'ranyejun', 2126 | 'decpr', 2127 | 'apollojoe', 2128 | 'SuperAdam47', 2129 | 'RootUp', 2130 | 'llronaldoll', 2131 | 'jayadeepgilroy', 2132 | 'Arunthomas1105', 2133 | 'zhanwenzhuo-github', 2134 | 'dennisslol006', 2135 | 'xFreshie', 2136 | 'servantthought', 2137 | 'Geilivable', 2138 | 'xushet', 2139 | 'order4adwriter', 2140 | 'dubrovka', 2141 | 'Nmeyers75', 2142 | 'p3p5170', 2143 | 'yangkun6666', 2144 | 'knight6414', 2145 | 'nailanawshaba', 2146 | 'tuhafadam', 2147 | 'stainbank', 2148 | '52fhy', 2149 | 'jiyanmizah', 2150 | 'iotsys', 2151 | 'zhangxiao921207', 2152 | 'empsmoke', 2153 | 'asugarr', 2154 | 'Amonhuz', 2155 | 'VinayaSathyanarayana', 2156 | 'html5lover', 2157 | 'peterambrozic', 2158 | 'maomaodegushi', 2159 | 'ShelbsLynn', 2160 | 'AmmarAlzoubi', 2161 | 'AlessioPellegrini', 2162 | 'tetroider', 2163 | '404-geek', 2164 | 'mohammed078', 2165 | 'sugus25', 2166 | 'mxdi9i7', 2167 | 'sahilmalhotra24', 2168 | 'furqanhaidersyed', 2169 | 'ChurchCRMBugReport', 2170 | 'shivamkapoor3198', 2171 | 'wulongji2016', 2172 | 'jjelschen', 2173 | 'bj2015', 2174 | 'tangxuelong', 2175 | 'gunther-bachmann', 2176 | 'marcos-tomaz', 2177 | 'anette68', 2178 | 'techiadarsh', 2179 | 'nishantmadu', 2180 | 'Nikhil2508', 2181 | 'anoojlal', 2182 | 'krischoi07', 2183 | 'utkarshyadavin', 2184 | 'amanPanth', 2185 | 'chinurox', 2186 | 'syedbilal5000', 2187 | 'NidPlays', 2188 | 'jirawat050', 2189 | 'RealAnishSharma', 2190 | 'bwegener', 2191 | 'whyisjacob', 2192 | 'naveenpucha8', 2193 | 'ronaksakhuja', 2194 | 'ju3tin', 2195 | 'DT9', 2196 | 'dorex22', 2197 | 'hiendinhngoc', 2198 | 'mlkorra', 2199 | 'Christensenea', 2200 | 'Mouse31', 2201 | 'VeloxDevelopment', 2202 | 'parasnarang1234', 2203 | 'beilo', 2204 | 'armagadon159753', 2205 | 'andrewducker', 2206 | 'NotMainScientist', 2207 | 'alterem', 2208 | 'MilkAndCookiz', 2209 | 'Justinshakes', 2210 | 'TheColdVoid', 2211 | 'falconxunit', 2212 | '974648183', 2213 | 'minenlink', 2214 | 'thapapinak', 2215 | 'lianghuacheng', 2216 | 'ben3726', 2217 | 'BjarniRunar', 2218 | 'Taki21', 2219 | 'zsytssk', 2220 | 'Apple240Bloom', 2221 | 'shubham436', 2222 | 'LoOnyBiker', 2223 | 'uasi', 2224 | 'wailoamrani', 2225 | 'AnimeOverlord7', 2226 | 'zzyzy', 2227 | 'ignitete', 2228 | 'vikstrous', 2229 | 's5s5', 2230 | 'tianxingvpn', 2231 | 'talib1410', 2232 | 'vinymv', 2233 | 'yerikyy', 2234 | 'Honsec', 2235 | 'chesterwang', 2236 | 'perryzou', 2237 | 'Meprels', 2238 | 'mfat', 2239 | 'mo-han', 2240 | 'roganoalien', 2241 | 'amoxicillin', 2242 | 'AbelLai', 2243 | 'whatisgravity', 2244 | 'darshankaarki', 2245 | 'Tshifhiwa84', 2246 | 'CurtainTears', 2247 | 'gaotong2055', 2248 | 'appleatiger', 2249 | 'hdstar2009', 2250 | 'TommyJerryMairo', 2251 | 'GoogleCodeExporter', 2252 | ] 2253 | --------------------------------------------------------------------------------