<commit_before>#include <SPI.h>
#include <HackBoy.h>
#include "hackman.h"
#include "defs.h"

uint32_t startScreenFrame = 0;

void setup(void) {
	HackBoy.begin();
	tft.fillScreen(BLACK);
}

void loop(void) {
	startScreenFrame = millis();
	playMatrixman();
}

void startMelody() {
	HackBoy.noteDelay(NOTE_A, 4, 200);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_FIS, 5, 100);
	HackBoy.noteDelay(NOTE_ES, 5, 100);
	HackBoy.noteDelay(NOTE_A, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 150);
	HackBoy.noteDelay(NOTE_ES, 5, 200);
	
	HackBoy.noteDelay(NOTE_C, 5, 100);
	HackBoy.noteDelay(NOTE_C, 6, 200);
	HackBoy.noteDelay(NOTE_G, 5, 100);
	HackBoy.noteDelay(NOTE_E, 5, 100);
	HackBoy.noteDelay(NOTE_C, 6, 50);
	HackBoy.noteDelay(NOTE_G, 5, 150);
	HackBoy.noteDelay(NOTE_E, 5, 200);
	
	HackBoy.noteDelay(NOTE_A, 4, 200);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_FIS, 5, 100);
	HackBoy.noteDelay(NOTE_ES, 5, 100);
	HackBoy.noteDelay(NOTE_A, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 150);
	HackBoy.noteDelay(NOTE_ES, 5, 200);
	
	HackBoy.noteDelay(NOTE_ES, 5, 50);
	HackBoy.noteDelay(NOTE_E, 5, 50);
	HackBoy.noteDelay(NOTE_F, 5, 100);
	HackBoy.noteDelay(NOTE_F, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 50);
	HackBoy.noteDelay(NOTE_G, 5, 100);
	HackBoy.noteDelay(NOTE_G, 5, 50);
	HackBoy.noteDelay(NOTE_AS, 5, 50);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_H, 5, 200);
}

void eatSound() {
	HackBoy.note(NOTE_C, 5, 50);
}





boolean startKey = false;

uint8_t getControl(void) {
	uint8_t keypad = HackBoy.getMovement();
	Serial.println(keypad);
	if (HackBoy.getLeftKey()) return LEFT;
	if (HackBoy.getUpKey()) return UP;
	if (HackBoy.getRightKey()) return RIGHT;
	if (HackBoy.getDownKey()) return DOWN;
	if (HackBoy.getStartKey() != startKey) {
		startKey = !startKey;
		if (startKey) return BUTTON;
	}
	return NOINPUT;
}


//GRAPHICS UNO

static const uint8_t rdy[] = {
	0b01100111, 0b00100110, 0b01010010,
	0b01010100, 0b01010101, 0b01010010,
	0b01100110, 0b01110101, 0b00100100,
	0b01010100, 0b01010101, 0b00100000,
	0b01010111, 0b01010110, 0b00100100
};
void getReady(void) {
	for (uint8_t i = 0; i < 120; i++) {
		if ((rdy[i / 8] >> (0x7 - (i & 0x7))) & 1) {
			tft.drawPixel(X_OFFSET + 13 * PXPF + (i % 24), Y_OFFSET + 20 * PXPF - 2 + i / 24, YELLOW);
		}
	}
	if (getScore() == 0)
		startMelody();
	else
		delay(2000);
	tft.fillRect(X_OFFSET + 13 * PXPF, Y_OFFSET + 20 * PXPF - 2, 24, 5, BLACK);
}

void drawLives(void) {
	for (uint8_t i = 0; i < getLives(); i++) {
		tft.fillCircle(119, 120 - i * 6, 2.5, YELLOW);
		tft.drawPixel(119, 120 - i * 6, BLACK);
		tft.fillRect(120, 119 - i * 6, 2, 3, BLACK);
	}
	tft.fillCircle(119, 120 - getLives() * 6, 2.5, BLACK);
}

boolean initiating = true;
void drawBoard(boolean won) {
	uint8_t length;
	uint8_t offset;
	uint16_t color;
	drawPlayer(getEnemy1(), true);
	drawPlayer(getEnemy2(), true);
	drawPlayer(getEnemy3(), true);
	drawPlayer(getEnemy4(), true);
	for (uint8_t i = 0; i <= 5 * won; i++) {
		uint32_t startingTime = millis();
		color = i & 1 ? WHITE : BLUE;
		for (uint8_t x = 2; x < 30; x++) {
			for (uint8_t y = 3; y < 34; y++) {
				if ((board[y] >> x) & 1) {
					if ((x == 15 || x == 16) && y == 15) {
						tft.drawFastHLine(X_OFFSET + 15 * PXPF - 1, Y_OFFSET + 15 * PXPF, 8, PINK);
					} else {
						if (!((board[y] >> (x - 1)) & 1)) { //line right of field
							offset = PXPF + ((board[y - 1] >> x) & 1) * 2;
							length = 1 + (((board[y + 1] >> x) & 1) + (offset != PXPF)) * 2;
							if (length > 1)
								tft.drawFastVLine(X_OFFSET + x * PXPF - 1, Y_OFFSET + (y + 1) * PXPF - offset, length, color);
						}
						if (!((board[y] >> (x + 1)) & 1)) { //line left of field
							offset = PXPF + ((board[y - 1] >> x) & 1) * 2;
							length = 1 + (((board[y + 1] >> x) & 1) + (offset != PXPF)) * 2;
							if (length > 1)
								tft.drawFastVLine(X_OFFSET + x * PXPF + 1, Y_OFFSET + (y + 1) * PXPF - offset, length, color);
						}
						if (!((board[y - 1] >> x) & 1)) { //line below field
							offset = PXPF + ((board[y] >> (x - 1)) & 1) * 2;
							length = 1 + (((board[y] >> (x + 1)) & 1) + (offset != PXPF)) * 2;
							//if (length > 1)
							tft.drawFastHLine(X_OFFSET + (x + 1) * PXPF - offset, Y_OFFSET + (y + 1) * PXPF - 5, length, color);
						}
						if (!((board[y + 1] >> x) & 1)) { //line over field
							offset = PXPF + ((board[y] >> (x - 1)) & 1) * 2;
							length = 1 + (((board[y] >> (x + 1)) & 1) + (offset != PXPF)) * 2;
							//if (length > 1)
							tft.drawFastHLine(X_OFFSET + (x + 1) * PXPF - offset, Y_OFFSET + (y + 1) * PXPF - 3, length, color);
						}
					}
				}
			}
		}
		if (won) while (millis() - 400 < startingTime);
	}
	if (!won) {
		for (uint8_t x = 3; x < 30; x++) {
			for (uint8_t y = 4; y < 33; y++) {
				if (isPixel(x,y)) {
					displayDots(x, y, true, false);
				}
			}
		}
	}
	initiating = true;
}

void drawPlayer(Player* pawn, boolean erase) {
	if (pawn == getMyGuy()) {
		tft.fillCircle((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET, 2.5, erase ? BLACK : YELLOW);
		if (initiating) {initiating = false;return;}
		if (!erase) {
			boolean fullOpen = (pawn->x + pawn->y) & 1;
			if (fullOpen) tft.drawPixel((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET, BLACK);
			switch (pawn->travelDir) {
				case LEFT:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 3, BLACK);
					else
						tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET, 2, BLACK);
					break;
				case UP:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET - 2, 3, 2, BLACK);
					else
						tft.drawFastVLine((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET - 2, 2, BLACK);
					break;
				case RIGHT:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 3, BLACK);
					else
						tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET, 2, BLACK);
					break;
				case DOWN:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET + 1, 3, 2, BLACK);
					else
						tft.drawFastVLine((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET + 1, 2, BLACK);
					break;
			}
		}
	} else {
		if (!erase && pawn->color == GREEN_S) {
			tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 2, WHITE);
			tft.fillRect((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 2, WHITE);
			tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 1 - (pawn->travelDir == LEFT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), BLACK);
			tft.drawPixel((pawn->x * PXPF) + X_OFFSET + 1 + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), BLACK);
		} else {
			uint16_t color = erase ? BLACK : colors[pawn->color];
			tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 5, 3, color);
			tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET - 2, 3, color);
			for (uint8_t i = 0; i < 3; i++)
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 2 + i * 2, (pawn->y * PXPF) + Y_OFFSET + 2, color);
			if (!erase) {
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 1 - (pawn->travelDir == LEFT) + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), WHITE);
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET + 1 - (pawn->travelDir == LEFT) + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), WHITE);
			}
		}
	}
	if (pawn != getMyGuy() && (erase || (pawn->x == getMyGuy()->x && pawn->y == getMyGuy()->y))) {
		restoreDot(pawn->x, pawn->y);
		displayFruit(pawn);
		drawPlayer(getMyGuy(), false);
	}
}

#define FRUIT_XC (X_OFFSET + 15*PXPF+PXPF/2) //center
#define FRUIT_YC (Y_OFFSET + FRUIT_Y*PXPF)
void displayFruit(Player *pawn) {
	if (getFruit()->removed) return;
	if (pawn == getMyGuy() || millis() > getFruit()->displayTill) {
		tft.fillRect(FRUIT_XC - 2, FRUIT_YC - 2, 5, 5, BLACK);<commit_msg>stray '\240' in program - fix<commit_after>#include <SPI.h>
#include <HackBoy.h>
#include "hackman.h"
#include "defs.h"

uint32_t startScreenFrame = 0;

void setup(void) {
	HackBoy.begin();
	tft.fillScreen(BLACK);
}

void loop(void) {
	startScreenFrame = millis();
	playMatrixman();
}

void startMelody() {
	HackBoy.noteDelay(NOTE_A, 4, 200);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_FIS, 5, 100);
	HackBoy.noteDelay(NOTE_ES, 5, 100);
	HackBoy.noteDelay(NOTE_A, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 150);
	HackBoy.noteDelay(NOTE_ES, 5, 200);
	
	HackBoy.noteDelay(NOTE_C, 5, 100);
	HackBoy.noteDelay(NOTE_C, 6, 200);
	HackBoy.noteDelay(NOTE_G, 5, 100);
	HackBoy.noteDelay(NOTE_E, 5, 100);
	HackBoy.noteDelay(NOTE_C, 6, 50);
	HackBoy.noteDelay(NOTE_G, 5, 150);
	HackBoy.noteDelay(NOTE_E, 5, 200);
	
	HackBoy.noteDelay(NOTE_A, 4, 200);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_FIS, 5, 100);
	HackBoy.noteDelay(NOTE_ES, 5, 100);
	HackBoy.noteDelay(NOTE_A, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 150);
	HackBoy.noteDelay(NOTE_ES, 5, 200);
	
	HackBoy.noteDelay(NOTE_ES, 5, 50);
	HackBoy.noteDelay(NOTE_E, 5, 50);
	HackBoy.noteDelay(NOTE_F, 5, 100);
	HackBoy.noteDelay(NOTE_F, 5, 50);
	HackBoy.noteDelay(NOTE_FIS, 5, 50);
	HackBoy.noteDelay(NOTE_G, 5, 100);
	HackBoy.noteDelay(NOTE_G, 5, 50);
	HackBoy.noteDelay(NOTE_AS, 5, 50);
	HackBoy.noteDelay(NOTE_A, 5, 100);
	HackBoy.noteDelay(NOTE_H, 5, 200);
}

void eatSound() {
	HackBoy.note(NOTE_C, 5, 50);
}





boolean startKey = false;

uint8_t getControl(void) {
	uint8_t keypad = HackBoy.getMovement();
	Serial.println(keypad);
	if (HackBoy.getLeftKey()) return LEFT;
	if (HackBoy.getUpKey()) return UP;
	if (HackBoy.getRightKey()) return RIGHT;
	if (HackBoy.getDownKey()) return DOWN;
	if (HackBoy.getStartKey() != startKey) {
		startKey = !startKey;
		if (startKey) return BUTTON;
	}
	return NOINPUT;
}


//GRAPHICS UNO

static const uint8_t rdy[] = {
	0b01100111, 0b00100110, 0b01010010,
	0b01010100, 0b01010101, 0b01010010,
	0b01100110, 0b01110101, 0b00100100,
	0b01010100, 0b01010101, 0b00100000,
	0b01010111, 0b01010110, 0b00100100
};
void getReady(void) {
	for (uint8_t i = 0; i < 120; i++) {
		if ((rdy[i / 8] >> (0x7 - (i & 0x7))) & 1) {
			tft.drawPixel(X_OFFSET + 13 * PXPF + (i % 24), Y_OFFSET + 20 * PXPF - 2 + i / 24, YELLOW);
		}
	}
	if (getScore() == 0)
		startMelody();
	else
		delay(2000);
	tft.fillRect(X_OFFSET + 13 * PXPF, Y_OFFSET + 20 * PXPF - 2, 24, 5, BLACK);
}

void drawLives(void) {
	for (uint8_t i = 0; i < getLives(); i++) {
		tft.fillCircle(119, 120 - i * 6, 2.5, YELLOW);
		tft.drawPixel(119, 120 - i * 6, BLACK);
		tft.fillRect(120, 119 - i * 6, 2, 3, BLACK);
	}
	tft.fillCircle(119, 120 - getLives() * 6, 2.5, BLACK);
}

boolean initiating = true;
void drawBoard(boolean won) {
	uint8_t length;
	uint8_t offset;
	uint16_t color;
	drawPlayer(getEnemy1(), true);
	drawPlayer(getEnemy2(), true);
	drawPlayer(getEnemy3(), true);
	drawPlayer(getEnemy4(), true);
	for (uint8_t i = 0; i <= 5 * won; i++) {
		uint32_t startingTime = millis();
		color = i & 1 ? WHITE : BLUE;
		for (uint8_t x = 2; x < 30; x++) {
			for (uint8_t y = 3; y < 34; y++) {
				if ((board[y] >> x) & 1) {
					if ((x == 15 || x == 16) && y == 15) {
						tft.drawFastHLine(X_OFFSET + 15 * PXPF - 1, Y_OFFSET + 15 * PXPF, 8, PINK);
					} else {
						if (!((board[y] >> (x - 1)) & 1)) { //line right of field
							offset = PXPF + ((board[y - 1] >> x) & 1) * 2;
							length = 1 + (((board[y + 1] >> x) & 1) + (offset != PXPF)) * 2;
							if (length > 1)
								tft.drawFastVLine(X_OFFSET + x * PXPF - 1, Y_OFFSET + (y + 1) * PXPF - offset, length, color);
						}
						if (!((board[y] >> (x + 1)) & 1)) { //line left of field
							offset = PXPF + ((board[y - 1] >> x) & 1) * 2;
							length = 1 + (((board[y + 1] >> x) & 1) + (offset != PXPF)) * 2;
							if (length > 1)
								tft.drawFastVLine(X_OFFSET + x * PXPF + 1, Y_OFFSET + (y + 1) * PXPF - offset, length, color);
						}
						if (!((board[y - 1] >> x) & 1)) { //line below field
							offset = PXPF + ((board[y] >> (x - 1)) & 1) * 2;
							length = 1 + (((board[y] >> (x + 1)) & 1) + (offset != PXPF)) * 2;
							//if (length > 1)
							tft.drawFastHLine(X_OFFSET + (x + 1) * PXPF - offset, Y_OFFSET + (y + 1) * PXPF - 5, length, color);
						}
						if (!((board[y + 1] >> x) & 1)) { //line over field
							offset = PXPF + ((board[y] >> (x - 1)) & 1) * 2;
							length = 1 + (((board[y] >> (x + 1)) & 1) + (offset != PXPF)) * 2;
							//if (length > 1)
							tft.drawFastHLine(X_OFFSET + (x + 1) * PXPF - offset, Y_OFFSET + (y + 1) * PXPF - 3, length, color);
						}
					}
				}
			}
		}
		if (won) while (millis() - 400 < startingTime);
	}
	if (!won) {
		for (uint8_t x = 3; x < 30; x++) {
			for (uint8_t y = 4; y < 33; y++) {
				if (isPixel(x,y)) {
					displayDots(x, y, true, false);
				}
			}
		}
	}
	initiating = true;
}

void drawPlayer(Player* pawn, boolean erase) {
	if (pawn == getMyGuy()) {
		tft.fillCircle((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET, 2.5, erase ? BLACK : YELLOW);
		if (initiating) {initiating = false;return;}
		if (!erase) {
			boolean fullOpen = (pawn->x + pawn->y) & 1;
			if (fullOpen) tft.drawPixel((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET, BLACK);
			switch (pawn->travelDir) {
				case LEFT:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 3, BLACK);
					else
						tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET, 2, BLACK);
					break;
				case UP:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET - 2, 3, 2, BLACK);
					else
						tft.drawFastVLine((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET - 2, 2, BLACK);
					break;
				case RIGHT:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 3, BLACK);
					else
						tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET, 2, BLACK);
					break;
				case DOWN:
					if (fullOpen)
						tft.fillRect((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET + 1, 3, 2, BLACK);
					else
						tft.drawFastVLine((pawn->x * PXPF) + X_OFFSET, (pawn->y * PXPF) + Y_OFFSET + 1, 2, BLACK);
					break;
			}
		}
	} else {
		if (!erase && pawn->color == GREEN_S) {
			tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 2, WHITE);
			tft.fillRect((pawn->x * PXPF) + X_OFFSET + 1, (pawn->y * PXPF) + Y_OFFSET - 1, 2, 2, WHITE);
			tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 1 - (pawn->travelDir == LEFT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), BLACK);
			tft.drawPixel((pawn->x * PXPF) + X_OFFSET + 1 + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), BLACK);
		} else {
			uint16_t color = erase ? BLACK : colors[pawn->color];
			tft.fillRect((pawn->x * PXPF) + X_OFFSET - 2, (pawn->y * PXPF) + Y_OFFSET - 1, 5, 3, color);
			tft.drawFastHLine((pawn->x * PXPF) + X_OFFSET - 1, (pawn->y * PXPF) + Y_OFFSET - 2, 3, color);
			for (uint8_t i = 0; i < 3; i++)
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 2 + i * 2, (pawn->y * PXPF) + Y_OFFSET + 2, color);
			if (!erase) {
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET - 1 - (pawn->travelDir == LEFT) + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), WHITE);
				tft.drawPixel((pawn->x * PXPF) + X_OFFSET + 1 - (pawn->travelDir == LEFT) + (pawn->travelDir == RIGHT), (pawn->y * PXPF) + Y_OFFSET - (pawn->travelDir == UP), WHITE);
			}
		}
	}
  if (pawn != getMyGuy() && (erase || (pawn->x == getMyGuy()->x && pawn->y == getMyGuy()->y))) {
		restoreDot(pawn->x, pawn->y);
		displayFruit(pawn);
		drawPlayer(getMyGuy(), false);
	}
}

#define FRUIT_XC (X_OFFSET + 15*PXPF+PXPF/2) //center
#define FRUIT_YC (Y_OFFSET + FRUIT_Y*PXPF)
void displayFruit(Player *pawn) {
	if (getFruit()->removed) return;
	if (pawn == getMyGuy() || millis() > getFruit()->displayTill) {
		tft.fillRect(FRUIT_XC - 2, FRUIT_YC - 2, 5, 5, BLACK);
{'fraction_non_alphanumeric': 0.19559177625486202, 'fraction_numerical': 0.060072852997468666, 'mean_word_length': 3.085245901639344, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 195, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1856973', 'n_tokens_mistral': 8804, 'n_tokens_neox': 7143, 'n_words': 1645}