pwenker commited on
Commit
c4cacdf
·
1 Parent(s): fecc357

feat: Fetch and filter puzzles from database

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
.gitattributes ADDED
@@ -0,0 +1 @@
 
 
1
+ lichess_db_puzzles.csv filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,15 +1,3 @@
1
- ---
2
- title: Chessli2
3
- emoji: 🏰
4
- colorFrom: blue
5
- colorTo: red
6
- sdk: gradio
7
- app_file: src/chessli2/app.py
8
- python_version: 3.11
9
- pinned: True
10
- ---
11
-
12
-
13
  # Welcome to Chessli2 🏰
14
 
15
  [chessli2](https://github.com/pwenker/chessli2) is your **always free** and **open-source** chess trainer 🛡️, designed to elevate your game by allowing you to analyze games, identify mistakes, and sharpen your tactics, all sourced directly from [lichess.org](https://lichess.org/).
@@ -33,10 +21,14 @@ Chessli2 is here to support your journey to becoming a chess master. Dive in and
33
  ### 👉 Click here to try out the app directly without any setup:
34
  [**Chessli2**](https://pwenker-chessli2.hf.space/)
35
 
 
36
  ### 🔍 Inspect code at:
37
  - **GitHub:** [pwenker/chessli2](https://github.com/pwenker/chessli2)
38
  - **Hugging Face Spaces:** [pwenker/chessli2](https://huggingface.co/spaces/pwenker/chessli2)
39
 
 
 
 
40
 
41
  ## Local Deployment 🏠
42
 
@@ -130,8 +122,8 @@ Finally, you can import the CSV file into Anki.
130
  4. In the main Anki window, go to the menu bar and click on `File`.
131
  5. Select `Import...` from the dropdown menu.
132
  6. Browse to the location of your CSV file, select it, and click `Open`.
133
- 7. Anki will open a dialog box asking how you want to import the CSV file. Select the `Chess-2.0` note type.
134
- 8. Make sure it reads: "Field 1 of file is: mapped to PGN"
135
  9. Click the `Import` button. Anki will process the file and add the new cards to the selected deck.
136
  10. After importing, it’s a good idea to review a few cards to ensure they were imported correctly. You can do this by browsing the deck or starting a study session.
137
  11. Pat yourself on the back! You did it! 🎉
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # Welcome to Chessli2 🏰
2
 
3
  [chessli2](https://github.com/pwenker/chessli2) is your **always free** and **open-source** chess trainer 🛡️, designed to elevate your game by allowing you to analyze games, identify mistakes, and sharpen your tactics, all sourced directly from [lichess.org](https://lichess.org/).
 
21
  ### 👉 Click here to try out the app directly without any setup:
22
  [**Chessli2**](https://pwenker-chessli2.hf.space/)
23
 
24
+
25
  ### 🔍 Inspect code at:
26
  - **GitHub:** [pwenker/chessli2](https://github.com/pwenker/chessli2)
27
  - **Hugging Face Spaces:** [pwenker/chessli2](https://huggingface.co/spaces/pwenker/chessli2)
28
 
29
+ ### 🌟 Best 1000 Puzzles for each Theme 🧩
30
+
31
+ 📚 [Overview and links](https://github.com/pwenker/chessli2/docs/best_1000_puzzles_by_theme.md) 🔗
32
 
33
  ## Local Deployment 🏠
34
 
 
122
  4. In the main Anki window, go to the menu bar and click on `File`.
123
  5. Select `Import...` from the dropdown menu.
124
  6. Browse to the location of your CSV file, select it, and click `Open`.
125
+ 7. Anki will open a dialog box asking how you want to import the CSV file. Select the `Chess-2.0` note type. And select "Fields separated by: Comma".
126
+ 8. Make sure it reads: "Field 1 of file is: mapped to PGN" (For the puzzles you can map the second field to "Tags")
127
  9. Click the `Import` button. Anki will process the file and add the new cards to the selected deck.
128
  10. After importing, it’s a good idea to review a few cards to ensure they were imported correctly. You can do this by browsing the deck or starting a study session.
129
  11. Pat yourself on the back! You did it! 🎉
docs/best_1000_puzzles_by_theme.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ | Name | Description | Link to 1000 best puzzles |
2
+ |-------------------------|---------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
3
+ | Advanced pawn | One of your pawns is deep into the opponent position, maybe threatening to promote. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/advancedPawn.csv) |
4
+ | Advantage | Seize your chance to get a decisive advantage. (200cp ≤ eval ≤ 600cp) | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/advantage.csv) |
5
+ | Anastasia's mate | A knight and rook or queen team up to trap the opposing king between the side of the board and a friendly piece. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/anastasiaMate.csv) |
6
+ | Arabian mate | A knight and a rook team up to trap the opposing king on a corner of the board. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/arabianMate.csv) |
7
+ | Attacking f2 or f7 | An attack focusing on the f2 or f7 pawn, such as in the fried liver opening. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/attackingF2F7.csv) |
8
+ | Attraction | An exchange or sacrifice encouraging or forcing an opponent piece to a square that allows a follow-up tactic. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/attraction.csv) |
9
+ | Back rank mate | Checkmate the king on the home rank, when it is trapped there by its own pieces. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/backRankMate.csv) |
10
+ | Bishop endgame | An endgame with only bishops and pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/bishopEndgame.csv) |
11
+ | Boden's mate | Two attacking bishops on criss-crossing diagonals deliver mate to a king obstructed by friendly pieces. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/bodenMate.csv) |
12
+ | Castling | Bring the king to safety, and deploy the rook for attack. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/castling.csv) |
13
+ | Capture the defender | Removing a piece that is critical to defence of another piece, allowing the now undefended piece to be captured on a following move. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/capturingDefender.csv) |
14
+ | Crushing | Spot the opponent blunder to obtain a crushing advantage. (eval ≥ 600cp) | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/crushing.csv) |
15
+ | Double bishop mate | Two attacking bishops on adjacent diagonals deliver mate to a king obstructed by friendly pieces. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/doubleBishopMate.csv) |
16
+ | Dovetail mate | A queen delivers mate to an adjacent king, whose only two escape squares are obstructed by friendly pieces. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/dovetailMate.csv) |
17
+ | Equality | Come back from a losing position, and secure a draw or a balanced position. (eval ≤ 200cp) | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/equality.csv) |
18
+ | Kingside attack | An attack of the opponent's king, after they castled on the king side. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/kingsideAttack.csv) |
19
+ | Clearance | A move, often with tempo, that clears a square, file or diagonal for a follow-up tactical idea. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/clearance.csv) |
20
+ | Defensive move | A precise move or sequence of moves that is needed to avoid losing material or another advantage. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/defensiveMove.csv) |
21
+ | Deflection | A move that distracts an opponent piece from another duty that it performs, such as guarding a key square. Sometimes also called "overloading". | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/deflection.csv) |
22
+ | Discovered attack | Moving a piece (such as a knight), that previously blocked an attack by a long range piece (such as a rook), out of the way of that piece. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/discoveredAttack.csv) |
23
+ | Double check | Checking with two pieces at once, as a result of a discovered attack where both the moving piece and the unveiled piece attack the opponent's king. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/doubleCheck.csv) |
24
+ | Endgame | A tactic during the last phase of the game. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/endgame.csv) |
25
+ | En passant | A tactic involving the en passant rule, where a pawn can capture an opponent pawn that has bypassed it using its initial two-square move. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/enPassant.csv) |
26
+ | Exposed king | A tactic involving a king with few defenders around it, often leading to checkmate. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/exposedKing.csv) |
27
+ | Fork | A move where the moved piece attacks two opponent pieces at once. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/fork.csv) |
28
+ | Hanging piece | A tactic involving an opponent piece being undefended or insufficiently defended and free to capture. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/hangingPiece.csv) |
29
+ | Hook mate | Checkmate with a rook, knight, and pawn along with one enemy pawn to limit the enemy king's escape. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/hookMate.csv) |
30
+ | Interference | Moving a piece between two opponent pieces to leave one or both opponent pieces undefended, such as a knight on a defended square between two rooks. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/interference.csv) |
31
+ | Intermezzo | Instead of playing the expected move, first interpose another move posing an immediate threat that the opponent must answer. Also known as "Zwischenzug" or "In between". | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/intermezzo.csv) |
32
+ | Knight endgame | An endgame with only knights and pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/knightEndgame.csv) |
33
+ | Long | Three moves to win. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/long.csv) |
34
+ | Master games | Puzzles from games played by titled players. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/master.csv) |
35
+ | Master vs Master games | Puzzles from games between two titled players. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/masterVsMaster.csv) |
36
+ | Checkmate | Win the game with style. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mate.csv) |
37
+ | Mate in 1 | Deliver checkmate in one move. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mateIn1.csv) |
38
+ | Mate in 2 | Deliver checkmate in two moves. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mateIn2.csv) |
39
+ | Mate in 3 | Deliver checkmate in three moves. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mateIn3.csv) |
40
+ | Mate in 4 | Deliver checkmate in four moves. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mateIn4.csv) |
41
+ | Mate in 5 or more | Figure out a long mating sequence. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/mateIn5.csv) |
42
+ | Middlegame | A tactic during the second phase of the game. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/middlegame.csv) |
43
+ | One-move puzzle | A puzzle that is only one move long. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/oneMove.csv) |
44
+ | Opening | A tactic during the first phase of the game. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/opening.csv) |
45
+ | Pawn endgame | An endgame with only pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/pawnEndgame.csv) |
46
+ | Pin | A tactic involving pins, where a piece is unable to move without revealing an attack on a higher value piece. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/pin.csv) |
47
+ | Promotion | Promote one of your pawn to a queen or minor piece. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/promotion.csv) |
48
+ | Queen endgame | An endgame with only queens and pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/queenEndgame.csv) |
49
+ | Queen and Rook | An endgame with only queens, rooks and pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/queenRookEndgame.csv) |
50
+ | Queenside attack | An attack of the opponent's king, after they castled on the queen side. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/queensideAttack.csv) |
51
+ | Quiet move | A move that does neither make a check or capture, nor an immediate threat to capture, but does prepare a more hidden unavoidable threat for a later move. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/quietMove.csv) |
52
+ | Rook endgame | An endgame with only rooks and pawns. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/rookEndgame.csv) |
53
+ | Sacrifice | A tactic involving giving up material in the short-term, to gain an advantage again after a forced sequence of moves. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/sacrifice.csv) |
54
+ | Short | Two moves to win. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/short.csv) |
55
+ | Skewer | A motif involving a high value piece being attacked, moving out the way, and allowing a lower value piece behind it to be captured or attacked, the inverse of a pin. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/skewer.csv) |
56
+ | Smothered mate | A checkmate delivered by a knight in which the mated king is unable to move because it is surrounded (or smothered) by its own pieces. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/smotheredMate.csv) |
57
+ | Super GM games | Puzzles from games played by the best players in the world. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/superGM.csv) |
58
+ | Trapped piece | A piece is unable to escape capture as it has limited moves. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/trappedPiece.csv) |
59
+ | Underpromotion | Promotion to a knight, bishop, or rook. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/underPromotion.csv) |
60
+ | Very long | Four moves or more to win. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/veryLong.csv) |
61
+ | X-Ray attack | A piece attacks or defends a square, through an enemy piece. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/xRayAttack.csv) |
62
+ | Zugzwang | The opponent is limited in the moves they can make, and all moves worsen their position. | [Link to 1000 best puzzles](https://github.com/pwenker/chessli2/puzzles/zugzwang.csv) |
generate_puzzles.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import shutil
2
+ from pathlib import Path
3
+
4
+ from gradio_client import Client
5
+ from tqdm import tqdm
6
+
7
+ themes = [
8
+ "advancedPawn",
9
+ "advantage",
10
+ "anastasiaMate",
11
+ "arabianMate",
12
+ "attackingF2F7",
13
+ "attraction",
14
+ "backRankMate",
15
+ "bishopEndgame",
16
+ "bodenMate",
17
+ "castling",
18
+ "capturingDefender",
19
+ "crushing",
20
+ "doubleBishopMate",
21
+ "dovetailMate",
22
+ "equality",
23
+ "kingsideAttack",
24
+ "clearance",
25
+ "defensiveMove",
26
+ "deflection",
27
+ "discoveredAttack",
28
+ "doubleCheck",
29
+ "endgame",
30
+ "exposedKing",
31
+ "fork",
32
+ "hangingPiece",
33
+ "hookMate",
34
+ "interference",
35
+ "intermezzo",
36
+ "knightEndgame",
37
+ "long",
38
+ "master",
39
+ "masterVsMaster",
40
+ "mate",
41
+ "mateIn1",
42
+ "mateIn2",
43
+ "mateIn3",
44
+ "mateIn4",
45
+ "mateIn5",
46
+ "middlegame",
47
+ "oneMove",
48
+ "opening",
49
+ "pawnEndgame",
50
+ "pin",
51
+ "promotion",
52
+ "queenEndgame",
53
+ "queenRookEndgame",
54
+ "queensideAttack",
55
+ "quietMove",
56
+ "rookEndgame",
57
+ "sacrifice",
58
+ "short",
59
+ "skewer",
60
+ "smotheredMate",
61
+ "superGM",
62
+ "trappedPiece",
63
+ "underPromotion",
64
+ "veryLong",
65
+ "xRayAttack",
66
+ "zugzwang",
67
+ "healthyMix",
68
+ "playerGames",
69
+ ]
70
+ client = Client("http://localhost:7860/")
71
+
72
+
73
+ for theme in tqdm(themes, desc="Generating puzzles...", total=len(themes)):
74
+ csv_data, csv_file = client.predict(
75
+ themes=[theme],
76
+ popularity_range=[80, 100],
77
+ rating_range=[0, 4000],
78
+ nb_plays_range=[0, 1007625],
79
+ opening_tags=None,
80
+ max=1000,
81
+ api_name="/get_puzzles_from_db",
82
+ )
83
+
84
+ src = csv_file["value"]
85
+ dest = f"puzzles/{theme}.csv"
86
+
87
+ shutil.copy(Path(src), dest)
lichess_db_puzzles.csv ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:66732175bcaeb29249a17bbc99854b1b096ccf7a27fd0237e125ecf03e31face
3
+ size 716070952
puzzles/advancedPawn.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/advantage.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/anastasiaMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/arabianMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/attackingF2F7.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/attraction.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/backRankMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/bishopEndgame.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/bodenMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/capturingDefender.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/castling.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/clearance.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/count_fen.sh ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Directory to search files in
4
+ DIRECTORY="."
5
+
6
+ # Iterate through all files in the directory
7
+ for file in "$DIRECTORY"/*; do
8
+ if [ -f "$file" ]; then
9
+ # Count the number of lines containing "FEN"
10
+ count=$(grep -c "FEN" "$file")
11
+ # Print the filename and the count
12
+ echo "$file: $count"
13
+ fi
14
+ done
puzzles/crushing.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/defensiveMove.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/deflection.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/discoveredAttack.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/doubleBishopMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/doubleCheck.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/dovetailMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/endgame.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/equality.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/exposedKing.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/fork.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/hangingPiece.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/healthyMix.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/hookMate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/interference.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/intermezzo.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/kingsideAttack.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/knightEndgame.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/long.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/master.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/masterVsMaster.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mate.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mateIn1.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mateIn2.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mateIn3.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mateIn4.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/mateIn5.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/middlegame.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/oneMove.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/opening.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/pawnEndgame.csv ADDED
The diff for this file is too large to render. See raw diff
 
puzzles/pin.csv ADDED
The diff for this file is too large to render. See raw diff