diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5de1e280..328d70fc 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -47,29 +47,6 @@ jobs: - name: Run tests run: flutter test - build-web: - runs-on: ubuntu-latest - needs: validate - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: stable - cache: true - - - name: Flutter pub get - run: flutter pub get - - - name: Enable Web - run: flutter config --enable-web - - - name: Build Web - run: flutter build web --release --dart-define=APP_VERSION=pr-check - build-android: runs-on: ubuntu-latest needs: validate @@ -101,38 +78,3 @@ jobs: - name: Build Android APK run: flutter build apk --release --dart-define=APP_VERSION=pr-check - - build-linux: - runs-on: ubuntu-latest - needs: validate - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: stable - cache: true - - - name: Flutter pub get - run: flutter pub get - - - name: Generate latest app icon source - run: dart run tool/generate_app_icon.dart - - - name: Generate launcher icons - run: dart run flutter_launcher_icons - - - name: Enable Linux desktop - run: flutter config --enable-linux-desktop - - - name: Install Linux dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - clang cmake ninja-build pkg-config libgtk-3-dev libstdc++-12-dev - - - name: Build Linux - run: flutter build linux --release --dart-define=APP_VERSION=pr-check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 973d1cf1..049ce91b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,8 +27,46 @@ env: TAG: ${{ github.event.inputs.tag }} jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Flutter pub get + run: flutter pub get + + - name: Generate latest app icon source + run: dart run tool/generate_app_icon.dart + + - name: Generate launcher icons + run: dart run flutter_launcher_icons + + - name: Check formatting + run: dart format --output=none --set-exit-if-changed . + + - name: Analyze + run: dart analyze + + - name: Run tests + run: flutter test + prepare-release: runs-on: ubuntu-latest + needs: validate outputs: release_id: ${{ steps.resolve.outputs.release_id }} @@ -166,6 +204,12 @@ jobs: - name: Checkout uses: actions/checkout@v4 + - name: Set up Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + - name: Set up Flutter uses: subosito/flutter-action@v2 with: @@ -175,6 +219,12 @@ jobs: - name: Flutter pub get run: flutter pub get + - name: Generate latest app icon source + run: dart run tool/generate_app_icon.dart + + - name: Generate launcher icons + run: dart run flutter_launcher_icons + - name: Enable Web run: flutter config --enable-web diff --git a/README.md b/README.md index daa41758..297e4585 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Release](https://img.shields.io/github/v/release/Rarmash/CS2-Simulator?display_name=tag)](https://github.com/Rarmash/CS2-Simulator/releases) [![Release Build](https://img.shields.io/github/actions/workflow/status/Rarmash/CS2-Simulator/release.yml?label=release%20build)](https://github.com/Rarmash/CS2-Simulator/actions/workflows/release.yml) +[![PR Checks](https://img.shields.io/github/actions/workflow/status/Rarmash/CS2-Simulator/pr.yml?label=PR%20checks)](https://github.com/Rarmash/CS2-Simulator/actions/workflows/pr.yml) [![Flutter](https://img.shields.io/badge/Flutter-3.x-02569B?logo=flutter&logoColor=white)](https://flutter.dev/) [![Dart](https://img.shields.io/badge/Dart-3.11+-0175C2?logo=dart&logoColor=white)](https://dart.dev/) [![Platforms](https://img.shields.io/badge/Platforms-Android%20%7C%20iOS%20%7C%20Windows%20%7C%20Linux%20%7C%20macOS%20%7C%20Web-4EAA25)](https://github.com/Rarmash/CS2-Simulator/releases) @@ -27,6 +28,7 @@ Unless explicitly stated otherwise, the repository license applies to the source - Persistent collection tracking with a saved inventory and recent activity - Collection-aware glossary browsing with per-item collected counts - Collection progress and per-source stats across containers and collections +- Broad automated test coverage across simulator, collection, repository, and helper layers - Major tournament section covering CS:GO and CS2 eras - Major teams and players browsing - Operation and Armory reward collections @@ -148,21 +150,38 @@ The source code in this repository is licensed under `AGPL-3.0`. The project is actively evolving, with current work focused on: -- polishing the collection layer with stronger progress tracking across containers, collections, and collectibles -- improving long-term data quality for tournaments, teams, and players -- continuing UI/codebase refactoring to reduce duplicated screen logic -- hardening the simulator around long-term product polish rather than major missing content +- maintaining data quality for tournaments, teams, players, and item metadata +- continuing UI/codebase cleanup to reduce duplicated screen logic +- stabilizing the simulator experience ahead of a 1.0 release +- deciding which remaining quality-of-life features belong in a final pre-1.0 update ## Roadmap -### v0.14 +### v0.15 -- Better automated test coverage for core simulator and collection logic -- Deeper collection analytics across items, duplicates, sessions, and finishing variants -- Cleaner navigation and final UI consistency pass across major app sections +- Final pre-1.0 quality-of-life pass across inventory, glossary, and simulator flows +- Decide which remaining convenience features should land before 1.0 and which should move to post-1.0 +- Release-readiness pass on wording, navigation, empty states, and general UX consistency + +### Toward 1.0 + +- Freeze the core feature set around simulator, collection, glossary, and Major history +- Focus on stability, maintainability, and product consistency instead of broad new content expansion +- Keep future additions optional unless they clearly strengthen the main simulator experience ### Future - Music Kit preview playback if a maintainable preview-audio import pipeline becomes available - Optional China / Perfect World visual mode once a reliable alternate asset source is available +- In-game store for items purchased directly instead of opened from containers +- Souvenir-O-Matic support for majors without traditional souvenir packages +- Improved tournament metadata importer for logos, dates, teams, rosters, playoffs, and winners +- Tournament history with richer team, roster, playoff, and winner browsing +- Collection goals and achievements +- Favorites, tags, and custom collection showcases +- Saved Trade-Up contract templates +- Tentative: inventory-based Trade-Up suggestions for contracts that can be assembled from collected skins +- Multiple local profiles +- Save import and export +- Historical operations, passes, and limited stores diff --git a/assets/containers/30004.webp b/assets/containers/30004.webp new file mode 100644 index 00000000..84031bf6 Binary files /dev/null and b/assets/containers/30004.webp differ diff --git a/assets/containers/30005.webp b/assets/containers/30005.webp new file mode 100644 index 00000000..84031bf6 Binary files /dev/null and b/assets/containers/30005.webp differ diff --git a/assets/containers/30006.webp b/assets/containers/30006.webp new file mode 100644 index 00000000..84031bf6 Binary files /dev/null and b/assets/containers/30006.webp differ diff --git a/assets/data/containers.json b/assets/data/containers.json index cb6bc762..c73b4088 100644 --- a/assets/data/containers.json +++ b/assets/data/containers.json @@ -372,7 +372,7 @@ "releaseDate": "2014-03-13", "type": "SOUVENIR_PACKAGE", "tournamentName": "EMS One Katowice 2014", - "tournamentLogo": "assets/tournament_logos/ems_one_katowice_2014.png", + "tournamentLogo": "assets/tournament_logos/ems_one_katowice_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -500,7 +500,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -524,7 +524,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -536,7 +536,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -548,7 +548,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -572,7 +572,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -584,7 +584,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null @@ -596,7 +596,7 @@ "releaseDate": "2014-08-14", "type": "SOUVENIR_PACKAGE", "tournamentName": "ESL One Cologne 2014", - "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.png", + "tournamentLogo": "assets/tournament_logos/esl_one_cologne_2014.jpg", "sourceType": null, "sourceId": null, "sourceName": null diff --git a/assets/data/graffiti.json b/assets/data/graffiti.json index beeccf25..67e401fb 100644 --- a/assets/data/graffiti.json +++ b/assets/data/graffiti.json @@ -2834,6 +2834,237 @@ "rarity": "HIGH_GRADE", "collection": null }, + { + "id": "10501", + "name": "Vitality | Cologne 2026", + "graffitiImage": "assets/graffiti/10501.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10502", + "name": "Natus Vincere | Cologne 2026", + "graffitiImage": "assets/graffiti/10502.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10503", + "name": "Falcons | Cologne 2026", + "graffitiImage": "assets/graffiti/10503.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10504", + "name": "The Mongolz | Cologne 2026", + "graffitiImage": "assets/graffiti/10504.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10505", + "name": "PARIVISION | Cologne 2026", + "graffitiImage": "assets/graffiti/10505.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10506", + "name": "Aurora | Cologne 2026", + "graffitiImage": "assets/graffiti/10506.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10507", + "name": "FURIA | Cologne 2026", + "graffitiImage": "assets/graffiti/10507.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10508", + "name": "MOUZ | Cologne 2026", + "graffitiImage": "assets/graffiti/10508.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10509", + "name": "FUT | Cologne 2026", + "graffitiImage": "assets/graffiti/10509.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10510", + "name": "Team Spirit | Cologne 2026", + "graffitiImage": "assets/graffiti/10510.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10511", + "name": "Astralis | Cologne 2026", + "graffitiImage": "assets/graffiti/10511.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10512", + "name": "G2 esports | Cologne 2026", + "graffitiImage": "assets/graffiti/10512.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10513", + "name": "Legacy | Cologne 2026", + "graffitiImage": "assets/graffiti/10513.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10514", + "name": "paiN Gaming | Cologne 2026", + "graffitiImage": "assets/graffiti/10514.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10515", + "name": "Monte | Cologne 2026", + "graffitiImage": "assets/graffiti/10515.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10516", + "name": "9z Team | Cologne 2026", + "graffitiImage": "assets/graffiti/10516.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10517", + "name": "GamerLegion | Cologne 2026", + "graffitiImage": "assets/graffiti/10517.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10518", + "name": "B8 | Cologne 2026", + "graffitiImage": "assets/graffiti/10518.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10519", + "name": "HEROIC | Cologne 2026", + "graffitiImage": "assets/graffiti/10519.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10520", + "name": "BetBoom | Cologne 2026", + "graffitiImage": "assets/graffiti/10520.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10521", + "name": "BIG | Cologne 2026", + "graffitiImage": "assets/graffiti/10521.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10522", + "name": "M80 | Cologne 2026", + "graffitiImage": "assets/graffiti/10522.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10523", + "name": "MIBR | Cologne 2026", + "graffitiImage": "assets/graffiti/10523.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10524", + "name": "SINNERS | Cologne 2026", + "graffitiImage": "assets/graffiti/10524.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10525", + "name": "NRG | Cologne 2026", + "graffitiImage": "assets/graffiti/10525.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10526", + "name": "TYLOO | Cologne 2026", + "graffitiImage": "assets/graffiti/10526.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10527", + "name": "Sharks Esports | Cologne 2026", + "graffitiImage": "assets/graffiti/10527.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10528", + "name": "Gaimin Gladiators | Cologne 2026", + "graffitiImage": "assets/graffiti/10528.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10529", + "name": "Team Liquid | Cologne 2026", + "graffitiImage": "assets/graffiti/10529.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10530", + "name": "Lynn Vision | Cologne 2026", + "graffitiImage": "assets/graffiti/10530.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10531", + "name": "THUNDERdOWNUNDER | Cologne 2026", + "graffitiImage": "assets/graffiti/10531.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10532", + "name": "FlyQuest | Cologne 2026", + "graffitiImage": "assets/graffiti/10532.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, + { + "id": "10533", + "name": "IEM | Cologne 2026", + "graffitiImage": "assets/graffiti/10533.webp", + "rarity": "HIGH_GRADE", + "collection": null + }, { "id": "16971", "name": "X-Axes (Brick Red)", diff --git a/assets/data/music_kits.json b/assets/data/music_kits.json index e68ee606..c4934139 100644 --- a/assets/data/music_kits.json +++ b/assets/data/music_kits.json @@ -116,6 +116,15 @@ "hasRegular": true, "hasStatTrak": true }, + { + "id": "982795548", + "name": "borne, Give It To Me", + "musicKitImage": "assets/music_kits/982795548.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "983344523", "name": "Darren Korb, Hades Music Kit", @@ -422,6 +431,15 @@ "hasRegular": false, "hasStatTrak": true }, + { + "id": "1010401958", + "name": "ShockOne, Voices", + "musicKitImage": "assets/music_kits/1010401958.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "1010421769", "name": "DRYDEN, Feel The Power", @@ -440,6 +458,15 @@ "hasRegular": true, "hasStatTrak": true }, + { + "id": "1011417379", + "name": "ALRT, DOPAMINE HIT", + "musicKitImage": "assets/music_kits/1011417379.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "1012423437", "name": "Darude, Moments CS:GO", @@ -584,6 +611,15 @@ "hasRegular": true, "hasStatTrak": true }, + { + "id": "1033971637", + "name": "Altare, Change My Mind", + "musicKitImage": "assets/music_kits/1033971637.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "1034191515", "name": "Lennie Moore, Java Havana Funkaloo", @@ -710,6 +746,15 @@ "hasRegular": true, "hasStatTrak": true }, + { + "id": "1050984752", + "name": "Repiet & Julia Kleijn, On And On", + "musicKitImage": "assets/music_kits/1050984752.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "1052161809", "name": "James and the Cold Gun, Chewing Glass", @@ -728,6 +773,15 @@ "hasRegular": true, "hasStatTrak": true }, + { + "id": "1053075594", + "name": "Pirapus, EVERYNITE", + "musicKitImage": "assets/music_kits/1053075594.webp", + "rarity": "HIGH_GRADE", + "collection": "NIGHTMODE II", + "hasRegular": true, + "hasStatTrak": true + }, { "id": "1053191400", "name": "New Beat Fund, Sponge Fingerz", diff --git a/assets/data/stickers.json b/assets/data/stickers.json index f7ae2f92..37f75d5c 100644 --- a/assets/data/stickers.json +++ b/assets/data/stickers.json @@ -96668,5 +96668,7725 @@ "effect": "GOLD", "collection": null, "tournament": "StarLadder Budapest 2025" + }, + { + "id": "10369", + "name": "Vitality | Cologne 2026", + "stickerImage": "assets/stickers/10369.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10370", + "name": "Vitality (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10370.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10371", + "name": "Vitality (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10371.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10372", + "name": "Vitality (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10372.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10373", + "name": "Natus Vincere | Cologne 2026", + "stickerImage": "assets/stickers/10373.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10374", + "name": "Natus Vincere (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10374.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10375", + "name": "Natus Vincere (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10375.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10376", + "name": "Natus Vincere (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10376.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10377", + "name": "Falcons | Cologne 2026", + "stickerImage": "assets/stickers/10377.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10378", + "name": "Falcons (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10378.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10379", + "name": "Falcons (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10379.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10380", + "name": "Falcons (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10380.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10381", + "name": "The Mongolz | Cologne 2026", + "stickerImage": "assets/stickers/10381.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10382", + "name": "The Mongolz (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10382.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10383", + "name": "The Mongolz (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10383.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10384", + "name": "The Mongolz (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10384.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10385", + "name": "PARIVISION | Cologne 2026", + "stickerImage": "assets/stickers/10385.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10386", + "name": "PARIVISION (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10386.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10387", + "name": "PARIVISION (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10387.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10388", + "name": "PARIVISION (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10388.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10389", + "name": "Aurora | Cologne 2026", + "stickerImage": "assets/stickers/10389.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10390", + "name": "Aurora (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10390.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10391", + "name": "Aurora (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10391.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10392", + "name": "Aurora (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10392.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10393", + "name": "FURIA | Cologne 2026", + "stickerImage": "assets/stickers/10393.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10394", + "name": "FURIA (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10394.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10395", + "name": "FURIA (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10395.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10396", + "name": "FURIA (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10396.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10397", + "name": "MOUZ | Cologne 2026", + "stickerImage": "assets/stickers/10397.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10398", + "name": "MOUZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10398.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10399", + "name": "MOUZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10399.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10400", + "name": "MOUZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10400.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10401", + "name": "FUT | Cologne 2026", + "stickerImage": "assets/stickers/10401.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10402", + "name": "FUT (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10402.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10403", + "name": "FUT (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10403.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10404", + "name": "FUT (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10404.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10405", + "name": "Team Spirit | Cologne 2026", + "stickerImage": "assets/stickers/10405.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10406", + "name": "Team Spirit (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10406.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10407", + "name": "Team Spirit (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10407.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10408", + "name": "Team Spirit (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10408.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10409", + "name": "Astralis | Cologne 2026", + "stickerImage": "assets/stickers/10409.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10410", + "name": "Astralis (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10410.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10411", + "name": "Astralis (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10411.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10412", + "name": "Astralis (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10412.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10413", + "name": "G2 esports | Cologne 2026", + "stickerImage": "assets/stickers/10413.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10414", + "name": "G2 esports (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10414.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10415", + "name": "G2 esports (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10415.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10416", + "name": "G2 esports (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10416.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10417", + "name": "Legacy | Cologne 2026", + "stickerImage": "assets/stickers/10417.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10418", + "name": "Legacy (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10418.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10419", + "name": "Legacy (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10419.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10420", + "name": "Legacy (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10420.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10421", + "name": "paiN Gaming | Cologne 2026", + "stickerImage": "assets/stickers/10421.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10422", + "name": "paiN Gaming (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10422.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10423", + "name": "paiN Gaming (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10423.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10424", + "name": "paiN Gaming (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10424.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10425", + "name": "Monte | Cologne 2026", + "stickerImage": "assets/stickers/10425.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10426", + "name": "Monte (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10426.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10427", + "name": "Monte (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10427.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10428", + "name": "Monte (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10428.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10429", + "name": "9z Team | Cologne 2026", + "stickerImage": "assets/stickers/10429.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10430", + "name": "9z Team (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10430.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10431", + "name": "9z Team (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10431.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10432", + "name": "9z Team (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10432.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10433", + "name": "GamerLegion | Cologne 2026", + "stickerImage": "assets/stickers/10433.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10434", + "name": "GamerLegion (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10434.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10435", + "name": "GamerLegion (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10435.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10436", + "name": "GamerLegion (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10436.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10437", + "name": "B8 | Cologne 2026", + "stickerImage": "assets/stickers/10437.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10438", + "name": "B8 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10438.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10439", + "name": "B8 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10439.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10440", + "name": "B8 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10440.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10441", + "name": "HEROIC | Cologne 2026", + "stickerImage": "assets/stickers/10441.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10442", + "name": "HEROIC (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10442.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10443", + "name": "HEROIC (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10443.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10444", + "name": "HEROIC (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10444.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10445", + "name": "BetBoom | Cologne 2026", + "stickerImage": "assets/stickers/10445.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10446", + "name": "BetBoom (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10446.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10447", + "name": "BetBoom (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10447.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10448", + "name": "BetBoom (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10448.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10449", + "name": "BIG | Cologne 2026", + "stickerImage": "assets/stickers/10449.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10450", + "name": "BIG (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10450.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10451", + "name": "BIG (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10451.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10452", + "name": "BIG (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10452.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10453", + "name": "M80 | Cologne 2026", + "stickerImage": "assets/stickers/10453.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10454", + "name": "M80 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10454.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10455", + "name": "M80 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10455.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10456", + "name": "M80 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10456.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10457", + "name": "MIBR | Cologne 2026", + "stickerImage": "assets/stickers/10457.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10458", + "name": "MIBR (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10458.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10459", + "name": "MIBR (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10459.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10460", + "name": "MIBR (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10460.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10461", + "name": "SINNERS | Cologne 2026", + "stickerImage": "assets/stickers/10461.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10462", + "name": "SINNERS (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10462.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10463", + "name": "SINNERS (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10463.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10464", + "name": "SINNERS (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10464.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10465", + "name": "NRG | Cologne 2026", + "stickerImage": "assets/stickers/10465.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10466", + "name": "NRG (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10466.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10467", + "name": "NRG (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10467.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10468", + "name": "NRG (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10468.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10469", + "name": "TYLOO | Cologne 2026", + "stickerImage": "assets/stickers/10469.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10470", + "name": "TYLOO (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10470.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10471", + "name": "TYLOO (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10471.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10472", + "name": "TYLOO (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10472.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10473", + "name": "Sharks Esports | Cologne 2026", + "stickerImage": "assets/stickers/10473.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10474", + "name": "Sharks Esports (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10474.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10475", + "name": "Sharks Esports (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10475.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10476", + "name": "Sharks Esports (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10476.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10477", + "name": "Gaimin Gladiators | Cologne 2026", + "stickerImage": "assets/stickers/10477.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10478", + "name": "Gaimin Gladiators (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10478.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10479", + "name": "Gaimin Gladiators (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10479.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10480", + "name": "Gaimin Gladiators (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10480.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10481", + "name": "Team Liquid | Cologne 2026", + "stickerImage": "assets/stickers/10481.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10482", + "name": "Team Liquid (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10482.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10483", + "name": "Team Liquid (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10483.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10484", + "name": "Team Liquid (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10484.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10485", + "name": "Lynn Vision | Cologne 2026", + "stickerImage": "assets/stickers/10485.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10486", + "name": "Lynn Vision (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10486.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10487", + "name": "Lynn Vision (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10487.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10488", + "name": "Lynn Vision (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10488.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10489", + "name": "THUNDERdOWNUNDER | Cologne 2026", + "stickerImage": "assets/stickers/10489.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10490", + "name": "THUNDERdOWNUNDER (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10490.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10491", + "name": "THUNDERdOWNUNDER (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10491.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10492", + "name": "THUNDERdOWNUNDER (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10492.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10493", + "name": "FlyQuest | Cologne 2026", + "stickerImage": "assets/stickers/10493.webp", + "rarity": "HIGH_GRADE", + "stickerType": "STICKER", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10494", + "name": "FlyQuest (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10494.webp", + "rarity": "REMARKABLE", + "stickerType": "STICKER", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10495", + "name": "FlyQuest (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10495.webp", + "rarity": "EXOTIC", + "stickerType": "STICKER", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10496", + "name": "FlyQuest (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10496.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "STICKER", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10497", + "name": "IEM | Cologne 2026", + "stickerImage": "assets/stickers/10497.webp", + "rarity": "HIGH_GRADE", + "stickerType": "EVENT", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10498", + "name": "IEM (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10498.webp", + "rarity": "REMARKABLE", + "stickerType": "EVENT", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10499", + "name": "IEM (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10499.webp", + "rarity": "EXOTIC", + "stickerType": "EVENT", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10500", + "name": "IEM (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10500.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "EVENT", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10534", + "name": "ZywOo | Cologne 2026", + "stickerImage": "assets/stickers/10534.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10535", + "name": "ZywOo (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10535.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10536", + "name": "ZywOo (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10536.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10537", + "name": "ZywOo (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10537.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10538", + "name": "apEX | Cologne 2026", + "stickerImage": "assets/stickers/10538.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10539", + "name": "apEX (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10539.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10540", + "name": "apEX (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10540.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10541", + "name": "apEX (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10541.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10542", + "name": "mezii | Cologne 2026", + "stickerImage": "assets/stickers/10542.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10543", + "name": "mezii (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10543.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10544", + "name": "mezii (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10544.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10545", + "name": "mezii (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10545.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10546", + "name": "FlameZ | Cologne 2026", + "stickerImage": "assets/stickers/10546.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10547", + "name": "FlameZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10547.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10548", + "name": "FlameZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10548.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10549", + "name": "FlameZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10549.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10550", + "name": "ropz | Cologne 2026", + "stickerImage": "assets/stickers/10550.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10551", + "name": "ropz (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10551.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10552", + "name": "ropz (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10552.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10553", + "name": "ropz (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10553.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10554", + "name": "w0nderful | Cologne 2026", + "stickerImage": "assets/stickers/10554.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10555", + "name": "w0nderful (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10555.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10556", + "name": "w0nderful (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10556.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10557", + "name": "w0nderful (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10557.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10558", + "name": "Aleksib | Cologne 2026", + "stickerImage": "assets/stickers/10558.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10559", + "name": "Aleksib (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10559.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10560", + "name": "Aleksib (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10560.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10561", + "name": "Aleksib (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10561.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10562", + "name": "b1t | Cologne 2026", + "stickerImage": "assets/stickers/10562.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10563", + "name": "b1t (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10563.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10564", + "name": "b1t (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10564.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10565", + "name": "b1t (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10565.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10566", + "name": "iM | Cologne 2026", + "stickerImage": "assets/stickers/10566.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10567", + "name": "iM (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10567.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10568", + "name": "iM (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10568.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10569", + "name": "iM (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10569.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10570", + "name": "makazze | Cologne 2026", + "stickerImage": "assets/stickers/10570.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10571", + "name": "makazze (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10571.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10572", + "name": "makazze (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10572.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10573", + "name": "makazze (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10573.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10574", + "name": "NiKo | Cologne 2026", + "stickerImage": "assets/stickers/10574.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10575", + "name": "NiKo (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10575.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10576", + "name": "NiKo (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10576.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10577", + "name": "NiKo (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10577.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10578", + "name": "kyxsan | Cologne 2026", + "stickerImage": "assets/stickers/10578.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10579", + "name": "kyxsan (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10579.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10580", + "name": "kyxsan (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10580.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10581", + "name": "kyxsan (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10581.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10582", + "name": "m0NESY | Cologne 2026", + "stickerImage": "assets/stickers/10582.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10583", + "name": "m0NESY (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10583.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10584", + "name": "m0NESY (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10584.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10585", + "name": "m0NESY (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10585.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10586", + "name": "TeSeS | Cologne 2026", + "stickerImage": "assets/stickers/10586.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10587", + "name": "TeSeS (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10587.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10588", + "name": "TeSeS (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10588.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10589", + "name": "TeSeS (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10589.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10590", + "name": "kyousuke | Cologne 2026", + "stickerImage": "assets/stickers/10590.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10591", + "name": "kyousuke (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10591.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10592", + "name": "kyousuke (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10592.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10593", + "name": "kyousuke (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10593.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10594", + "name": "bLitz | Cologne 2026", + "stickerImage": "assets/stickers/10594.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10595", + "name": "bLitz (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10595.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10596", + "name": "bLitz (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10596.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10597", + "name": "bLitz (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10597.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10598", + "name": "Techno4K | Cologne 2026", + "stickerImage": "assets/stickers/10598.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10599", + "name": "Techno4K (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10599.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10600", + "name": "Techno4K (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10600.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10601", + "name": "Techno4K (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10601.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10602", + "name": "cobra | Cologne 2026", + "stickerImage": "assets/stickers/10602.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10603", + "name": "cobra (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10603.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10604", + "name": "cobra (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10604.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10605", + "name": "cobra (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10605.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10606", + "name": "mzinho | Cologne 2026", + "stickerImage": "assets/stickers/10606.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10607", + "name": "mzinho (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10607.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10608", + "name": "mzinho (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10608.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10609", + "name": "mzinho (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10609.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10610", + "name": "910 | Cologne 2026", + "stickerImage": "assets/stickers/10610.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10611", + "name": "910 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10611.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10612", + "name": "910 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10612.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10613", + "name": "910 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10613.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10614", + "name": "Jame | Cologne 2026", + "stickerImage": "assets/stickers/10614.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10615", + "name": "Jame (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10615.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10616", + "name": "Jame (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10616.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10617", + "name": "Jame (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10617.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10618", + "name": "nota | Cologne 2026", + "stickerImage": "assets/stickers/10618.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10619", + "name": "nota (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10619.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10620", + "name": "nota (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10620.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10621", + "name": "nota (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10621.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10622", + "name": "xiELO | Cologne 2026", + "stickerImage": "assets/stickers/10622.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10623", + "name": "xiELO (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10623.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10624", + "name": "xiELO (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10624.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10625", + "name": "xiELO (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10625.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10626", + "name": "BELCHONOKK | Cologne 2026", + "stickerImage": "assets/stickers/10626.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10627", + "name": "BELCHONOKK (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10627.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10628", + "name": "BELCHONOKK (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10628.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10629", + "name": "BELCHONOKK (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10629.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10630", + "name": "zweih | Cologne 2026", + "stickerImage": "assets/stickers/10630.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10631", + "name": "zweih (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10631.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10632", + "name": "zweih (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10632.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10633", + "name": "zweih (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10633.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10634", + "name": "XANTARES | Cologne 2026", + "stickerImage": "assets/stickers/10634.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10635", + "name": "XANTARES (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10635.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10636", + "name": "XANTARES (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10636.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10637", + "name": "XANTARES (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10637.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10638", + "name": "soulfly | Cologne 2026", + "stickerImage": "assets/stickers/10638.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10639", + "name": "soulfly (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10639.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10640", + "name": "soulfly (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10640.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10641", + "name": "soulfly (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10641.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10642", + "name": "Wicadia | Cologne 2026", + "stickerImage": "assets/stickers/10642.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10643", + "name": "Wicadia (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10643.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10644", + "name": "Wicadia (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10644.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10645", + "name": "Wicadia (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10645.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10646", + "name": "MAJ3R | Cologne 2026", + "stickerImage": "assets/stickers/10646.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10647", + "name": "MAJ3R (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10647.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10648", + "name": "MAJ3R (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10648.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10649", + "name": "MAJ3R (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10649.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10650", + "name": "woxic | Cologne 2026", + "stickerImage": "assets/stickers/10650.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10651", + "name": "woxic (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10651.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10652", + "name": "woxic (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10652.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10653", + "name": "woxic (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10653.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10654", + "name": "YEKINDAR | Cologne 2026", + "stickerImage": "assets/stickers/10654.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10655", + "name": "YEKINDAR (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10655.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10656", + "name": "YEKINDAR (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10656.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10657", + "name": "YEKINDAR (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10657.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10658", + "name": "KSCERATO | Cologne 2026", + "stickerImage": "assets/stickers/10658.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10659", + "name": "KSCERATO (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10659.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10660", + "name": "KSCERATO (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10660.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10661", + "name": "KSCERATO (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10661.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10662", + "name": "FalleN | Cologne 2026", + "stickerImage": "assets/stickers/10662.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10663", + "name": "FalleN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10663.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10664", + "name": "FalleN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10664.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10665", + "name": "FalleN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10665.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10666", + "name": "molodoy | Cologne 2026", + "stickerImage": "assets/stickers/10666.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10667", + "name": "molodoy (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10667.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10668", + "name": "molodoy (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10668.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10669", + "name": "molodoy (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10669.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10670", + "name": "yuurih | Cologne 2026", + "stickerImage": "assets/stickers/10670.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10671", + "name": "yuurih (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10671.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10672", + "name": "yuurih (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10672.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10673", + "name": "yuurih (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10673.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10674", + "name": "Jimpphat | Cologne 2026", + "stickerImage": "assets/stickers/10674.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10675", + "name": "Jimpphat (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10675.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10676", + "name": "Jimpphat (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10676.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10677", + "name": "Jimpphat (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10677.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10678", + "name": "Brollan | Cologne 2026", + "stickerImage": "assets/stickers/10678.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10679", + "name": "Brollan (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10679.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10680", + "name": "Brollan (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10680.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10681", + "name": "Brollan (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10681.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10682", + "name": "Spinx | Cologne 2026", + "stickerImage": "assets/stickers/10682.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10683", + "name": "Spinx (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10683.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10684", + "name": "Spinx (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10684.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10685", + "name": "Spinx (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10685.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10686", + "name": "torzsi | Cologne 2026", + "stickerImage": "assets/stickers/10686.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10687", + "name": "torzsi (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10687.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10688", + "name": "torzsi (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10688.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10689", + "name": "torzsi (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10689.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10690", + "name": "xertioN | Cologne 2026", + "stickerImage": "assets/stickers/10690.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10691", + "name": "xertioN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10691.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10692", + "name": "xertioN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10692.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10693", + "name": "xertioN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10693.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10694", + "name": "dem0n | Cologne 2026", + "stickerImage": "assets/stickers/10694.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10695", + "name": "dem0n (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10695.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10696", + "name": "dem0n (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10696.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10697", + "name": "dem0n (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10697.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10698", + "name": "lauNX | Cologne 2026", + "stickerImage": "assets/stickers/10698.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10699", + "name": "lauNX (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10699.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10700", + "name": "lauNX (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10700.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10701", + "name": "lauNX (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10701.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10702", + "name": "Krabeni | Cologne 2026", + "stickerImage": "assets/stickers/10702.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10703", + "name": "Krabeni (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10703.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10704", + "name": "Krabeni (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10704.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10705", + "name": "Krabeni (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10705.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10706", + "name": "cmtry | Cologne 2026", + "stickerImage": "assets/stickers/10706.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10707", + "name": "cmtry (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10707.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10708", + "name": "cmtry (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10708.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10709", + "name": "cmtry (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10709.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10710", + "name": "dziugss | Cologne 2026", + "stickerImage": "assets/stickers/10710.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10711", + "name": "dziugss (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10711.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10712", + "name": "dziugss (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10712.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10713", + "name": "dziugss (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10713.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10714", + "name": "tN1R | Cologne 2026", + "stickerImage": "assets/stickers/10714.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10715", + "name": "tN1R (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10715.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10716", + "name": "tN1R (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10716.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10717", + "name": "tN1R (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10717.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10718", + "name": "donk | Cologne 2026", + "stickerImage": "assets/stickers/10718.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10719", + "name": "donk (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10719.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10720", + "name": "donk (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10720.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10721", + "name": "donk (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10721.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10722", + "name": "magixx | Cologne 2026", + "stickerImage": "assets/stickers/10722.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10723", + "name": "magixx (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10723.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10724", + "name": "magixx (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10724.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10725", + "name": "magixx (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10725.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10726", + "name": "sh1ro | Cologne 2026", + "stickerImage": "assets/stickers/10726.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10727", + "name": "sh1ro (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10727.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10728", + "name": "sh1ro (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10728.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10729", + "name": "sh1ro (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10729.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10730", + "name": "zont1x | Cologne 2026", + "stickerImage": "assets/stickers/10730.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10731", + "name": "zont1x (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10731.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10732", + "name": "zont1x (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10732.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10733", + "name": "zont1x (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10733.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10734", + "name": "HooXi | Cologne 2026", + "stickerImage": "assets/stickers/10734.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10735", + "name": "HooXi (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10735.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10736", + "name": "HooXi (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10736.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10737", + "name": "HooXi (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10737.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10738", + "name": "phzy | Cologne 2026", + "stickerImage": "assets/stickers/10738.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10739", + "name": "phzy (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10739.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10740", + "name": "phzy (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10740.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10741", + "name": "phzy (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10741.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10742", + "name": "ryu | Cologne 2026", + "stickerImage": "assets/stickers/10742.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10743", + "name": "ryu (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10743.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10744", + "name": "ryu (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10744.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10745", + "name": "ryu (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10745.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10746", + "name": "jabbi | Cologne 2026", + "stickerImage": "assets/stickers/10746.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10747", + "name": "jabbi (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10747.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10748", + "name": "jabbi (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10748.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10749", + "name": "jabbi (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10749.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10750", + "name": "Staehr | Cologne 2026", + "stickerImage": "assets/stickers/10750.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10751", + "name": "Staehr (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10751.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10752", + "name": "Staehr (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10752.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10753", + "name": "Staehr (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10753.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10754", + "name": "huNter- | Cologne 2026", + "stickerImage": "assets/stickers/10754.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10755", + "name": "huNter- (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10755.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10756", + "name": "huNter- (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10756.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10757", + "name": "huNter- (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10757.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10758", + "name": "Heavygod | Cologne 2026", + "stickerImage": "assets/stickers/10758.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10759", + "name": "Heavygod (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10759.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10760", + "name": "Heavygod (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10760.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10761", + "name": "Heavygod (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10761.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10762", + "name": "NertZ | Cologne 2026", + "stickerImage": "assets/stickers/10762.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10763", + "name": "NertZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10763.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10764", + "name": "NertZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10764.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10765", + "name": "NertZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10765.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10766", + "name": "SunPayus | Cologne 2026", + "stickerImage": "assets/stickers/10766.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10767", + "name": "SunPayus (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10767.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10768", + "name": "SunPayus (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10768.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10769", + "name": "SunPayus (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10769.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10770", + "name": "MATYS | Cologne 2026", + "stickerImage": "assets/stickers/10770.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10771", + "name": "MATYS (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10771.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10772", + "name": "MATYS (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10772.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10773", + "name": "MATYS (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10773.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10774", + "name": "arT | Cologne 2026", + "stickerImage": "assets/stickers/10774.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10775", + "name": "arT (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10775.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10776", + "name": "arT (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10776.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10777", + "name": "arT (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10777.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10778", + "name": "latto | Cologne 2026", + "stickerImage": "assets/stickers/10778.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10779", + "name": "latto (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10779.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10780", + "name": "latto (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10780.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10781", + "name": "latto (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10781.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10782", + "name": "dumau | Cologne 2026", + "stickerImage": "assets/stickers/10782.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10783", + "name": "dumau (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10783.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10784", + "name": "dumau (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10784.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10785", + "name": "dumau (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10785.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10786", + "name": "saadzin | Cologne 2026", + "stickerImage": "assets/stickers/10786.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10787", + "name": "saadzin (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10787.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10788", + "name": "saadzin (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10788.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10789", + "name": "saadzin (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10789.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10790", + "name": "n1ssim | Cologne 2026", + "stickerImage": "assets/stickers/10790.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10791", + "name": "n1ssim (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10791.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10792", + "name": "n1ssim (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10792.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10793", + "name": "n1ssim (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10793.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10794", + "name": "biguzera | Cologne 2026", + "stickerImage": "assets/stickers/10794.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10795", + "name": "biguzera (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10795.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10796", + "name": "biguzera (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10796.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10797", + "name": "biguzera (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10797.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10798", + "name": "NQZ | Cologne 2026", + "stickerImage": "assets/stickers/10798.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10799", + "name": "NQZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10799.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10800", + "name": "NQZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10800.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10801", + "name": "NQZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10801.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10802", + "name": "snow | Cologne 2026", + "stickerImage": "assets/stickers/10802.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10803", + "name": "snow (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10803.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10804", + "name": "snow (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10804.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10805", + "name": "snow (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10805.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10806", + "name": "piriajr | Cologne 2026", + "stickerImage": "assets/stickers/10806.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10807", + "name": "piriajr (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10807.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10808", + "name": "piriajr (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10808.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10809", + "name": "piriajr (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10809.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10810", + "name": "v$m | Cologne 2026", + "stickerImage": "assets/stickers/10810.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10811", + "name": "v$m (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10811.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10812", + "name": "v$m (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10812.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10813", + "name": "v$m (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10813.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10814", + "name": "Rainwaker | Cologne 2026", + "stickerImage": "assets/stickers/10814.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10815", + "name": "Rainwaker (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10815.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10816", + "name": "Rainwaker (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10816.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10817", + "name": "Rainwaker (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10817.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10818", + "name": "Bymas | Cologne 2026", + "stickerImage": "assets/stickers/10818.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10819", + "name": "Bymas (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10819.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10820", + "name": "Bymas (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10820.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10821", + "name": "Bymas (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10821.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10822", + "name": "afro | Cologne 2026", + "stickerImage": "assets/stickers/10822.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10823", + "name": "afro (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10823.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10824", + "name": "afro (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10824.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10825", + "name": "afro (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10825.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10826", + "name": "Gizmy | Cologne 2026", + "stickerImage": "assets/stickers/10826.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10827", + "name": "Gizmy (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10827.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10828", + "name": "Gizmy (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10828.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10829", + "name": "Gizmy (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10829.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10830", + "name": "AZUWU | Cologne 2026", + "stickerImage": "assets/stickers/10830.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10831", + "name": "AZUWU (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10831.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10832", + "name": "AZUWU (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10832.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10833", + "name": "AZUWU (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10833.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10834", + "name": "max | Cologne 2026", + "stickerImage": "assets/stickers/10834.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10835", + "name": "max (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10835.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10836", + "name": "max (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10836.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10837", + "name": "max (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10837.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10838", + "name": "dgt | Cologne 2026", + "stickerImage": "assets/stickers/10838.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10839", + "name": "dgt (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10839.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10840", + "name": "dgt (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10840.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10841", + "name": "dgt (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10841.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10842", + "name": "meyern | Cologne 2026", + "stickerImage": "assets/stickers/10842.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10843", + "name": "meyern (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10843.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10844", + "name": "meyern (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10844.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10845", + "name": "meyern (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10845.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10846", + "name": "luchov | Cologne 2026", + "stickerImage": "assets/stickers/10846.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10847", + "name": "luchov (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10847.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10848", + "name": "luchov (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10848.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10849", + "name": "luchov (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10849.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10850", + "name": "HUASOPEEK | Cologne 2026", + "stickerImage": "assets/stickers/10850.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10851", + "name": "HUASOPEEK (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10851.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10852", + "name": "HUASOPEEK (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10852.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10853", + "name": "HUASOPEEK (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10853.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10854", + "name": "Snax | Cologne 2026", + "stickerImage": "assets/stickers/10854.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10855", + "name": "Snax (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10855.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10856", + "name": "Snax (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10856.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10857", + "name": "Snax (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10857.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10858", + "name": "REZ | Cologne 2026", + "stickerImage": "assets/stickers/10858.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10859", + "name": "REZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10859.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10860", + "name": "REZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10860.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10861", + "name": "REZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10861.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10862", + "name": "Tauson | Cologne 2026", + "stickerImage": "assets/stickers/10862.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10863", + "name": "Tauson (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10863.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10864", + "name": "Tauson (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10864.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10865", + "name": "Tauson (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10865.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10866", + "name": "PR | Cologne 2026", + "stickerImage": "assets/stickers/10866.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10867", + "name": "PR (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10867.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10868", + "name": "PR (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10868.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10869", + "name": "PR (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10869.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10870", + "name": "hypex | Cologne 2026", + "stickerImage": "assets/stickers/10870.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10871", + "name": "hypex (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10871.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10872", + "name": "hypex (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10872.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10873", + "name": "hypex (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10873.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10874", + "name": "s1zzi | Cologne 2026", + "stickerImage": "assets/stickers/10874.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10875", + "name": "s1zzi (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10875.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10876", + "name": "s1zzi (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10876.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10877", + "name": "s1zzi (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10877.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10878", + "name": "npl | Cologne 2026", + "stickerImage": "assets/stickers/10878.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10879", + "name": "npl (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10879.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10880", + "name": "npl (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10880.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10881", + "name": "npl (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10881.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10882", + "name": "esenthial | Cologne 2026", + "stickerImage": "assets/stickers/10882.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10883", + "name": "esenthial (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10883.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10884", + "name": "esenthial (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10884.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10885", + "name": "esenthial (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10885.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10886", + "name": "alex666 | Cologne 2026", + "stickerImage": "assets/stickers/10886.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10887", + "name": "alex666 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10887.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10888", + "name": "alex666 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10888.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10889", + "name": "alex666 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10889.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10890", + "name": "kensizor | Cologne 2026", + "stickerImage": "assets/stickers/10890.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10891", + "name": "kensizor (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10891.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10892", + "name": "kensizor (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10892.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10893", + "name": "kensizor (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10893.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10894", + "name": "xfl0ud | Cologne 2026", + "stickerImage": "assets/stickers/10894.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10895", + "name": "xfl0ud (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10895.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10896", + "name": "xfl0ud (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10896.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10897", + "name": "xfl0ud (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10897.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10898", + "name": "nilo | Cologne 2026", + "stickerImage": "assets/stickers/10898.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10899", + "name": "nilo (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10899.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10900", + "name": "nilo (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10900.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10901", + "name": "nilo (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10901.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10902", + "name": "susp | Cologne 2026", + "stickerImage": "assets/stickers/10902.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10903", + "name": "susp (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10903.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10904", + "name": "susp (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10904.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10905", + "name": "susp (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10905.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10906", + "name": "Chr1zN | Cologne 2026", + "stickerImage": "assets/stickers/10906.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10907", + "name": "Chr1zN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10907.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10908", + "name": "Chr1zN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10908.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10909", + "name": "Chr1zN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10909.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10910", + "name": "yxngstxr | Cologne 2026", + "stickerImage": "assets/stickers/10910.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10911", + "name": "yxngstxr (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10911.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10912", + "name": "yxngstxr (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10912.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10913", + "name": "yxngstxr (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10913.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10914", + "name": "Boombl4 | Cologne 2026", + "stickerImage": "assets/stickers/10914.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10915", + "name": "Boombl4 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10915.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10916", + "name": "Boombl4 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10916.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10917", + "name": "Boombl4 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10917.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10918", + "name": "zorte | Cologne 2026", + "stickerImage": "assets/stickers/10918.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10919", + "name": "zorte (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10919.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10920", + "name": "zorte (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10920.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10921", + "name": "zorte (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10921.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10922", + "name": "S1ren | Cologne 2026", + "stickerImage": "assets/stickers/10922.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10923", + "name": "S1ren (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10923.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10924", + "name": "S1ren (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10924.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10925", + "name": "S1ren (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10925.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10926", + "name": "FL4MUS | Cologne 2026", + "stickerImage": "assets/stickers/10926.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10927", + "name": "FL4MUS (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10927.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10928", + "name": "FL4MUS (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10928.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10929", + "name": "FL4MUS (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10929.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10930", + "name": "Magnojez | Cologne 2026", + "stickerImage": "assets/stickers/10930.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10931", + "name": "Magnojez (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10931.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10932", + "name": "Magnojez (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10932.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10933", + "name": "Magnojez (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10933.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10934", + "name": "tabseN | Cologne 2026", + "stickerImage": "assets/stickers/10934.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10935", + "name": "tabseN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10935.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10936", + "name": "tabseN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10936.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10937", + "name": "tabseN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10937.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10938", + "name": "JDC | Cologne 2026", + "stickerImage": "assets/stickers/10938.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10939", + "name": "JDC (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10939.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10940", + "name": "JDC (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10940.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10941", + "name": "JDC (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10941.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10942", + "name": "faveN | Cologne 2026", + "stickerImage": "assets/stickers/10942.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10943", + "name": "faveN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10943.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10944", + "name": "faveN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10944.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10945", + "name": "faveN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10945.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10946", + "name": "blameF | Cologne 2026", + "stickerImage": "assets/stickers/10946.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10947", + "name": "blameF (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10947.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10948", + "name": "blameF (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10948.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10949", + "name": "blameF (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10949.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10950", + "name": "gr1ks | Cologne 2026", + "stickerImage": "assets/stickers/10950.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10951", + "name": "gr1ks (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10951.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10952", + "name": "gr1ks (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10952.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10953", + "name": "gr1ks (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10953.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10954", + "name": "Swisher | Cologne 2026", + "stickerImage": "assets/stickers/10954.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10955", + "name": "Swisher (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10955.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10956", + "name": "Swisher (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10956.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10957", + "name": "Swisher (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10957.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10958", + "name": "Lake | Cologne 2026", + "stickerImage": "assets/stickers/10958.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10959", + "name": "Lake (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10959.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10960", + "name": "Lake (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10960.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10961", + "name": "Lake (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10961.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10962", + "name": "JBa | Cologne 2026", + "stickerImage": "assets/stickers/10962.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10963", + "name": "JBa (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10963.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10964", + "name": "JBa (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10964.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10965", + "name": "JBa (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10965.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10966", + "name": "s1n | Cologne 2026", + "stickerImage": "assets/stickers/10966.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10967", + "name": "s1n (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10967.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10968", + "name": "s1n (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10968.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10969", + "name": "s1n (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10969.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10970", + "name": "slaxz- | Cologne 2026", + "stickerImage": "assets/stickers/10970.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10971", + "name": "slaxz- (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10971.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10972", + "name": "slaxz- (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10972.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10973", + "name": "slaxz- (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10973.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10974", + "name": "LNZ | Cologne 2026", + "stickerImage": "assets/stickers/10974.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10975", + "name": "LNZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10975.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10976", + "name": "LNZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10976.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10977", + "name": "LNZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10977.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10978", + "name": "insani | Cologne 2026", + "stickerImage": "assets/stickers/10978.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10979", + "name": "insani (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10979.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10980", + "name": "insani (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10980.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10981", + "name": "insani (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10981.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10982", + "name": "brnz4n | Cologne 2026", + "stickerImage": "assets/stickers/10982.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10983", + "name": "brnz4n (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10983.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10984", + "name": "brnz4n (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10984.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10985", + "name": "brnz4n (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10985.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10986", + "name": "venomzera | Cologne 2026", + "stickerImage": "assets/stickers/10986.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10987", + "name": "venomzera (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10987.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10988", + "name": "venomzera (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10988.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10989", + "name": "venomzera (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10989.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10990", + "name": "kl1m | Cologne 2026", + "stickerImage": "assets/stickers/10990.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10991", + "name": "kl1m (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10991.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10992", + "name": "kl1m (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10992.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10993", + "name": "kl1m (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10993.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10994", + "name": "beastik | Cologne 2026", + "stickerImage": "assets/stickers/10994.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10995", + "name": "beastik (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10995.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10996", + "name": "beastik (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/10996.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10997", + "name": "beastik (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/10997.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10998", + "name": "SHOCK | Cologne 2026", + "stickerImage": "assets/stickers/10998.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "10999", + "name": "SHOCK (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/10999.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11000", + "name": "SHOCK (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11000.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11001", + "name": "SHOCK (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11001.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11002", + "name": "MoDo | Cologne 2026", + "stickerImage": "assets/stickers/11002.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11003", + "name": "MoDo (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11003.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11004", + "name": "MoDo (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11004.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11005", + "name": "MoDo (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11005.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11006", + "name": "kisserek | Cologne 2026", + "stickerImage": "assets/stickers/11006.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11007", + "name": "kisserek (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11007.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11008", + "name": "kisserek (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11008.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11009", + "name": "kisserek (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11009.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11010", + "name": "stressarN | Cologne 2026", + "stickerImage": "assets/stickers/11010.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11011", + "name": "stressarN (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11011.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11012", + "name": "stressarN (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11012.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11013", + "name": "stressarN (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11013.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11014", + "name": "Grim | Cologne 2026", + "stickerImage": "assets/stickers/11014.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11015", + "name": "Grim (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11015.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11016", + "name": "Grim (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11016.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11017", + "name": "Grim (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11017.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11018", + "name": "br0 | Cologne 2026", + "stickerImage": "assets/stickers/11018.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11019", + "name": "br0 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11019.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11020", + "name": "br0 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11020.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11021", + "name": "br0 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11021.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11022", + "name": "oSee | Cologne 2026", + "stickerImage": "assets/stickers/11022.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11023", + "name": "oSee (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11023.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11024", + "name": "oSee (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11024.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11025", + "name": "oSee (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11025.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11026", + "name": "Sonic | Cologne 2026", + "stickerImage": "assets/stickers/11026.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11027", + "name": "Sonic (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11027.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11028", + "name": "Sonic (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11028.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11029", + "name": "Sonic (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11029.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11030", + "name": "nitr0 | Cologne 2026", + "stickerImage": "assets/stickers/11030.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11031", + "name": "nitr0 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11031.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11032", + "name": "nitr0 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11032.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11033", + "name": "nitr0 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11033.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11034", + "name": "Mercury | Cologne 2026", + "stickerImage": "assets/stickers/11034.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11035", + "name": "Mercury (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11035.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11036", + "name": "Mercury (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11036.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11037", + "name": "Mercury (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11037.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11038", + "name": "Jee | Cologne 2026", + "stickerImage": "assets/stickers/11038.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11039", + "name": "Jee (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11039.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11040", + "name": "Jee (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11040.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11041", + "name": "Jee (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11041.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11042", + "name": "JamYoung | Cologne 2026", + "stickerImage": "assets/stickers/11042.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11043", + "name": "JamYoung (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11043.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11044", + "name": "JamYoung (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11044.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11045", + "name": "JamYoung (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11045.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11046", + "name": "Moseyuh | Cologne 2026", + "stickerImage": "assets/stickers/11046.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11047", + "name": "Moseyuh (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11047.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11048", + "name": "Moseyuh (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11048.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11049", + "name": "Moseyuh (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11049.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11050", + "name": "Zero | Cologne 2026", + "stickerImage": "assets/stickers/11050.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11051", + "name": "Zero (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11051.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11052", + "name": "Zero (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11052.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11053", + "name": "Zero (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11053.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11054", + "name": "gafolo | Cologne 2026", + "stickerImage": "assets/stickers/11054.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11055", + "name": "gafolo (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11055.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11056", + "name": "gafolo (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11056.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11057", + "name": "gafolo (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11057.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11058", + "name": "koala | Cologne 2026", + "stickerImage": "assets/stickers/11058.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11059", + "name": "koala (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11059.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11060", + "name": "koala (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11060.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11061", + "name": "koala (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11061.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11062", + "name": "maxxkor | Cologne 2026", + "stickerImage": "assets/stickers/11062.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11063", + "name": "maxxkor (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11063.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11064", + "name": "maxxkor (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11064.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11065", + "name": "maxxkor (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11065.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11066", + "name": "rdnzao | Cologne 2026", + "stickerImage": "assets/stickers/11066.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11067", + "name": "rdnzao (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11067.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11068", + "name": "rdnzao (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11068.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11069", + "name": "rdnzao (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11069.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11070", + "name": "doc | Cologne 2026", + "stickerImage": "assets/stickers/11070.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11071", + "name": "doc (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11071.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11072", + "name": "doc (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11072.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11073", + "name": "doc (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11073.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11074", + "name": "HEN1 | Cologne 2026", + "stickerImage": "assets/stickers/11074.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11075", + "name": "HEN1 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11075.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11076", + "name": "HEN1 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11076.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11077", + "name": "HEN1 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11077.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11078", + "name": "felps | Cologne 2026", + "stickerImage": "assets/stickers/11078.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11079", + "name": "felps (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11079.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11080", + "name": "felps (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11080.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11081", + "name": "felps (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11081.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11082", + "name": "NEKiZ | Cologne 2026", + "stickerImage": "assets/stickers/11082.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11083", + "name": "NEKiZ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11083.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11084", + "name": "NEKiZ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11084.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11085", + "name": "NEKiZ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11085.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11086", + "name": "luken | Cologne 2026", + "stickerImage": "assets/stickers/11086.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11087", + "name": "luken (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11087.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11088", + "name": "luken (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11088.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11089", + "name": "luken (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11089.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11090", + "name": "JOTA | Cologne 2026", + "stickerImage": "assets/stickers/11090.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11091", + "name": "JOTA (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11091.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11092", + "name": "JOTA (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11092.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11093", + "name": "JOTA (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11093.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11094", + "name": "EliGE | Cologne 2026", + "stickerImage": "assets/stickers/11094.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11095", + "name": "EliGE (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11095.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11096", + "name": "EliGE (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11096.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11097", + "name": "EliGE (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11097.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11098", + "name": "ultimate | Cologne 2026", + "stickerImage": "assets/stickers/11098.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11099", + "name": "ultimate (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11099.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11100", + "name": "ultimate (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11100.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11101", + "name": "ultimate (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11101.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11102", + "name": "malbsMd | Cologne 2026", + "stickerImage": "assets/stickers/11102.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11103", + "name": "malbsMd (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11103.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11104", + "name": "malbsMd (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11104.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11105", + "name": "malbsMd (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11105.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11106", + "name": "siuhy | Cologne 2026", + "stickerImage": "assets/stickers/11106.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11107", + "name": "siuhy (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11107.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11108", + "name": "siuhy (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11108.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11109", + "name": "siuhy (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11109.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11110", + "name": "NAF | Cologne 2026", + "stickerImage": "assets/stickers/11110.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11111", + "name": "NAF (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11111.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11112", + "name": "NAF (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11112.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11113", + "name": "NAF (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11113.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11114", + "name": "westmelon | Cologne 2026", + "stickerImage": "assets/stickers/11114.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11115", + "name": "westmelon (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11115.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11116", + "name": "westmelon (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11116.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11117", + "name": "westmelon (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11117.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11118", + "name": "z4KR | Cologne 2026", + "stickerImage": "assets/stickers/11118.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11119", + "name": "z4KR (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11119.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11120", + "name": "z4KR (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11120.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11121", + "name": "z4KR (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11121.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11122", + "name": "Starry | Cologne 2026", + "stickerImage": "assets/stickers/11122.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11123", + "name": "Starry (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11123.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11124", + "name": "Starry (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11124.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11125", + "name": "Starry (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11125.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11126", + "name": "EmiliaQAQ | Cologne 2026", + "stickerImage": "assets/stickers/11126.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11127", + "name": "EmiliaQAQ (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11127.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11128", + "name": "EmiliaQAQ (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11128.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11129", + "name": "EmiliaQAQ (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11129.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11130", + "name": "C4LLM3SU3 | Cologne 2026", + "stickerImage": "assets/stickers/11130.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11131", + "name": "C4LLM3SU3 (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11131.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11132", + "name": "C4LLM3SU3 (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11132.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11133", + "name": "C4LLM3SU3 (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11133.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11134", + "name": "dexter | Cologne 2026", + "stickerImage": "assets/stickers/11134.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11135", + "name": "dexter (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11135.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11136", + "name": "dexter (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11136.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11137", + "name": "dexter (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11137.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11138", + "name": "Liazz | Cologne 2026", + "stickerImage": "assets/stickers/11138.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11139", + "name": "Liazz (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11139.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11140", + "name": "Liazz (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11140.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11141", + "name": "Liazz (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11141.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11142", + "name": "aliStair | Cologne 2026", + "stickerImage": "assets/stickers/11142.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11143", + "name": "aliStair (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11143.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11144", + "name": "aliStair (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11144.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11145", + "name": "aliStair (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11145.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11146", + "name": "asap | Cologne 2026", + "stickerImage": "assets/stickers/11146.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11147", + "name": "asap (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11147.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11148", + "name": "asap (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11148.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11149", + "name": "asap (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11149.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11150", + "name": "TjP | Cologne 2026", + "stickerImage": "assets/stickers/11150.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11151", + "name": "TjP (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11151.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11152", + "name": "TjP (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11152.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11153", + "name": "TjP (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11153.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11154", + "name": "INS | Cologne 2026", + "stickerImage": "assets/stickers/11154.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11155", + "name": "INS (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11155.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11156", + "name": "INS (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11156.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11157", + "name": "INS (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11157.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11158", + "name": "jks | Cologne 2026", + "stickerImage": "assets/stickers/11158.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11159", + "name": "jks (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11159.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11160", + "name": "jks (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11160.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11161", + "name": "jks (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11161.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11162", + "name": "vexite | Cologne 2026", + "stickerImage": "assets/stickers/11162.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11163", + "name": "vexite (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11163.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11164", + "name": "vexite (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11164.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11165", + "name": "vexite (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11165.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11166", + "name": "story | Cologne 2026", + "stickerImage": "assets/stickers/11166.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11167", + "name": "story (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11167.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11168", + "name": "story (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11168.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11169", + "name": "story (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11169.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11170", + "name": "nettik | Cologne 2026", + "stickerImage": "assets/stickers/11170.webp", + "rarity": "HIGH_GRADE", + "stickerType": "AUTOGRAPH", + "effect": "OTHER", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11171", + "name": "nettik (Foil) | Cologne 2026", + "stickerImage": "assets/stickers/11171.webp", + "rarity": "REMARKABLE", + "stickerType": "AUTOGRAPH", + "effect": "FOIL", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11172", + "name": "nettik (Holo) | Cologne 2026", + "stickerImage": "assets/stickers/11172.webp", + "rarity": "EXOTIC", + "stickerType": "AUTOGRAPH", + "effect": "HOLO", + "collection": null, + "tournament": "IEM Cologne 2026" + }, + { + "id": "11173", + "name": "nettik (Gold) | Cologne 2026", + "stickerImage": "assets/stickers/11173.webp", + "rarity": "EXTRAORDINARY", + "stickerType": "AUTOGRAPH", + "effect": "GOLD", + "collection": null, + "tournament": "IEM Cologne 2026" } ] diff --git a/assets/data/tournament_metadata.json b/assets/data/tournament_metadata.json index 11cffc8d..2a70ce76 100644 --- a/assets/data/tournament_metadata.json +++ b/assets/data/tournament_metadata.json @@ -1,4 +1,36 @@ [ + { + "name": "IEM Cologne 2026", + "winner": "", + "tournamentLogo": "assets/tournament_logos/iem_cologne_2026.png", + "startDate": "2026-06-02", + "endDate": "2026-06-21", + "placements": [], + "teamRosters": [], + "stageDates": [ + { + "phase": "Stage 1", + "startDate": "2026-06-02", + "endDate": "2026-06-05" + }, + { + "phase": "Stage 2", + "startDate": "2026-06-06", + "endDate": "2026-06-09" + }, + { + "phase": "Stage 3", + "startDate": "2026-06-11", + "endDate": "2026-06-15" + }, + { + "phase": "Playoffs", + "startDate": "2026-06-18", + "endDate": "2026-06-21" + } + ], + "playoffMatches": [] + }, { "name": "BLAST.tv Austin 2025", "winner": "Team Vitality", diff --git a/assets/graffiti/10501.webp b/assets/graffiti/10501.webp new file mode 100644 index 00000000..96937a7c Binary files /dev/null and b/assets/graffiti/10501.webp differ diff --git a/assets/graffiti/10502.webp b/assets/graffiti/10502.webp new file mode 100644 index 00000000..b7c3be0a Binary files /dev/null and b/assets/graffiti/10502.webp differ diff --git a/assets/graffiti/10503.webp b/assets/graffiti/10503.webp new file mode 100644 index 00000000..8c84beee Binary files /dev/null and b/assets/graffiti/10503.webp differ diff --git a/assets/graffiti/10504.webp b/assets/graffiti/10504.webp new file mode 100644 index 00000000..e9bfc786 Binary files /dev/null and b/assets/graffiti/10504.webp differ diff --git a/assets/graffiti/10505.webp b/assets/graffiti/10505.webp new file mode 100644 index 00000000..a8b5a888 Binary files /dev/null and b/assets/graffiti/10505.webp differ diff --git a/assets/graffiti/10506.webp b/assets/graffiti/10506.webp new file mode 100644 index 00000000..86a3cfe4 Binary files /dev/null and b/assets/graffiti/10506.webp differ diff --git a/assets/graffiti/10507.webp b/assets/graffiti/10507.webp new file mode 100644 index 00000000..706f24ff Binary files /dev/null and b/assets/graffiti/10507.webp differ diff --git a/assets/graffiti/10508.webp b/assets/graffiti/10508.webp new file mode 100644 index 00000000..47735841 Binary files /dev/null and b/assets/graffiti/10508.webp differ diff --git a/assets/graffiti/10509.webp b/assets/graffiti/10509.webp new file mode 100644 index 00000000..710c90cc Binary files /dev/null and b/assets/graffiti/10509.webp differ diff --git a/assets/graffiti/10510.webp b/assets/graffiti/10510.webp new file mode 100644 index 00000000..16a692a1 Binary files /dev/null and b/assets/graffiti/10510.webp differ diff --git a/assets/graffiti/10511.webp b/assets/graffiti/10511.webp new file mode 100644 index 00000000..1f5c260e Binary files /dev/null and b/assets/graffiti/10511.webp differ diff --git a/assets/graffiti/10512.webp b/assets/graffiti/10512.webp new file mode 100644 index 00000000..4ae80e5d Binary files /dev/null and b/assets/graffiti/10512.webp differ diff --git a/assets/graffiti/10513.webp b/assets/graffiti/10513.webp new file mode 100644 index 00000000..eb88f088 Binary files /dev/null and b/assets/graffiti/10513.webp differ diff --git a/assets/graffiti/10514.webp b/assets/graffiti/10514.webp new file mode 100644 index 00000000..4cd7aefa Binary files /dev/null and b/assets/graffiti/10514.webp differ diff --git a/assets/graffiti/10515.webp b/assets/graffiti/10515.webp new file mode 100644 index 00000000..7716a3ad Binary files /dev/null and b/assets/graffiti/10515.webp differ diff --git a/assets/graffiti/10516.webp b/assets/graffiti/10516.webp new file mode 100644 index 00000000..22ff9117 Binary files /dev/null and b/assets/graffiti/10516.webp differ diff --git a/assets/graffiti/10517.webp b/assets/graffiti/10517.webp new file mode 100644 index 00000000..cbfdb560 Binary files /dev/null and b/assets/graffiti/10517.webp differ diff --git a/assets/graffiti/10518.webp b/assets/graffiti/10518.webp new file mode 100644 index 00000000..a48ca225 Binary files /dev/null and b/assets/graffiti/10518.webp differ diff --git a/assets/graffiti/10519.webp b/assets/graffiti/10519.webp new file mode 100644 index 00000000..817f3969 Binary files /dev/null and b/assets/graffiti/10519.webp differ diff --git a/assets/graffiti/10520.webp b/assets/graffiti/10520.webp new file mode 100644 index 00000000..9a13b14d Binary files /dev/null and b/assets/graffiti/10520.webp differ diff --git a/assets/graffiti/10521.webp b/assets/graffiti/10521.webp new file mode 100644 index 00000000..b1ca3b6e Binary files /dev/null and b/assets/graffiti/10521.webp differ diff --git a/assets/graffiti/10522.webp b/assets/graffiti/10522.webp new file mode 100644 index 00000000..a56a9449 Binary files /dev/null and b/assets/graffiti/10522.webp differ diff --git a/assets/graffiti/10523.webp b/assets/graffiti/10523.webp new file mode 100644 index 00000000..82ea4d6e Binary files /dev/null and b/assets/graffiti/10523.webp differ diff --git a/assets/graffiti/10524.webp b/assets/graffiti/10524.webp new file mode 100644 index 00000000..972d6a82 Binary files /dev/null and b/assets/graffiti/10524.webp differ diff --git a/assets/graffiti/10525.webp b/assets/graffiti/10525.webp new file mode 100644 index 00000000..92b85b50 Binary files /dev/null and b/assets/graffiti/10525.webp differ diff --git a/assets/graffiti/10526.webp b/assets/graffiti/10526.webp new file mode 100644 index 00000000..6e670f0d Binary files /dev/null and b/assets/graffiti/10526.webp differ diff --git a/assets/graffiti/10527.webp b/assets/graffiti/10527.webp new file mode 100644 index 00000000..5d41cda3 Binary files /dev/null and b/assets/graffiti/10527.webp differ diff --git a/assets/graffiti/10528.webp b/assets/graffiti/10528.webp new file mode 100644 index 00000000..0ed43523 Binary files /dev/null and b/assets/graffiti/10528.webp differ diff --git a/assets/graffiti/10529.webp b/assets/graffiti/10529.webp new file mode 100644 index 00000000..d19ad557 Binary files /dev/null and b/assets/graffiti/10529.webp differ diff --git a/assets/graffiti/10530.webp b/assets/graffiti/10530.webp new file mode 100644 index 00000000..7fb71864 Binary files /dev/null and b/assets/graffiti/10530.webp differ diff --git a/assets/graffiti/10531.webp b/assets/graffiti/10531.webp new file mode 100644 index 00000000..b0b71243 Binary files /dev/null and b/assets/graffiti/10531.webp differ diff --git a/assets/graffiti/10532.webp b/assets/graffiti/10532.webp new file mode 100644 index 00000000..e53fe483 Binary files /dev/null and b/assets/graffiti/10532.webp differ diff --git a/assets/graffiti/10533.webp b/assets/graffiti/10533.webp new file mode 100644 index 00000000..18933fb0 Binary files /dev/null and b/assets/graffiti/10533.webp differ diff --git a/assets/music_kits/1010401958.webp b/assets/music_kits/1010401958.webp new file mode 100644 index 00000000..ddfb631a Binary files /dev/null and b/assets/music_kits/1010401958.webp differ diff --git a/assets/music_kits/1011417379.webp b/assets/music_kits/1011417379.webp new file mode 100644 index 00000000..0ac02b8a Binary files /dev/null and b/assets/music_kits/1011417379.webp differ diff --git a/assets/music_kits/1033971637.webp b/assets/music_kits/1033971637.webp new file mode 100644 index 00000000..c36afb09 Binary files /dev/null and b/assets/music_kits/1033971637.webp differ diff --git a/assets/music_kits/1050984752.webp b/assets/music_kits/1050984752.webp new file mode 100644 index 00000000..a6af2f17 Binary files /dev/null and b/assets/music_kits/1050984752.webp differ diff --git a/assets/music_kits/1053075594.webp b/assets/music_kits/1053075594.webp new file mode 100644 index 00000000..d2b6a485 Binary files /dev/null and b/assets/music_kits/1053075594.webp differ diff --git a/assets/music_kits/982795548.webp b/assets/music_kits/982795548.webp new file mode 100644 index 00000000..bca8b33a Binary files /dev/null and b/assets/music_kits/982795548.webp differ diff --git a/assets/stickers/10369.webp b/assets/stickers/10369.webp new file mode 100644 index 00000000..b560ae95 Binary files /dev/null and b/assets/stickers/10369.webp differ diff --git a/assets/stickers/10370.webp b/assets/stickers/10370.webp new file mode 100644 index 00000000..53efa939 Binary files /dev/null and b/assets/stickers/10370.webp differ diff --git a/assets/stickers/10371.webp b/assets/stickers/10371.webp new file mode 100644 index 00000000..803089d1 Binary files /dev/null and b/assets/stickers/10371.webp differ diff --git a/assets/stickers/10372.webp b/assets/stickers/10372.webp new file mode 100644 index 00000000..2babade6 Binary files /dev/null and b/assets/stickers/10372.webp differ diff --git a/assets/stickers/10373.webp b/assets/stickers/10373.webp new file mode 100644 index 00000000..476adf7d Binary files /dev/null and b/assets/stickers/10373.webp differ diff --git a/assets/stickers/10374.webp b/assets/stickers/10374.webp new file mode 100644 index 00000000..8b6f68e4 Binary files /dev/null and b/assets/stickers/10374.webp differ diff --git a/assets/stickers/10375.webp b/assets/stickers/10375.webp new file mode 100644 index 00000000..e240a66b Binary files /dev/null and b/assets/stickers/10375.webp differ diff --git a/assets/stickers/10376.webp b/assets/stickers/10376.webp new file mode 100644 index 00000000..afeaffc8 Binary files /dev/null and b/assets/stickers/10376.webp differ diff --git a/assets/stickers/10377.webp b/assets/stickers/10377.webp new file mode 100644 index 00000000..7c8f4517 Binary files /dev/null and b/assets/stickers/10377.webp differ diff --git a/assets/stickers/10378.webp b/assets/stickers/10378.webp new file mode 100644 index 00000000..e628f437 Binary files /dev/null and b/assets/stickers/10378.webp differ diff --git a/assets/stickers/10379.webp b/assets/stickers/10379.webp new file mode 100644 index 00000000..b1fa1db5 Binary files /dev/null and b/assets/stickers/10379.webp differ diff --git a/assets/stickers/10380.webp b/assets/stickers/10380.webp new file mode 100644 index 00000000..f054a668 Binary files /dev/null and b/assets/stickers/10380.webp differ diff --git a/assets/stickers/10381.webp b/assets/stickers/10381.webp new file mode 100644 index 00000000..4abbc93f Binary files /dev/null and b/assets/stickers/10381.webp differ diff --git a/assets/stickers/10382.webp b/assets/stickers/10382.webp new file mode 100644 index 00000000..05831a2c Binary files /dev/null and b/assets/stickers/10382.webp differ diff --git a/assets/stickers/10383.webp b/assets/stickers/10383.webp new file mode 100644 index 00000000..e2ec19fd Binary files /dev/null and b/assets/stickers/10383.webp differ diff --git a/assets/stickers/10384.webp b/assets/stickers/10384.webp new file mode 100644 index 00000000..a0ef174c Binary files /dev/null and b/assets/stickers/10384.webp differ diff --git a/assets/stickers/10385.webp b/assets/stickers/10385.webp new file mode 100644 index 00000000..f1175b91 Binary files /dev/null and b/assets/stickers/10385.webp differ diff --git a/assets/stickers/10386.webp b/assets/stickers/10386.webp new file mode 100644 index 00000000..2bf3251f Binary files /dev/null and b/assets/stickers/10386.webp differ diff --git a/assets/stickers/10387.webp b/assets/stickers/10387.webp new file mode 100644 index 00000000..6c1e578c Binary files /dev/null and b/assets/stickers/10387.webp differ diff --git a/assets/stickers/10388.webp b/assets/stickers/10388.webp new file mode 100644 index 00000000..49b7f3d0 Binary files /dev/null and b/assets/stickers/10388.webp differ diff --git a/assets/stickers/10389.webp b/assets/stickers/10389.webp new file mode 100644 index 00000000..5d50a8cc Binary files /dev/null and b/assets/stickers/10389.webp differ diff --git a/assets/stickers/10390.webp b/assets/stickers/10390.webp new file mode 100644 index 00000000..93263382 Binary files /dev/null and b/assets/stickers/10390.webp differ diff --git a/assets/stickers/10391.webp b/assets/stickers/10391.webp new file mode 100644 index 00000000..806cfe94 Binary files /dev/null and b/assets/stickers/10391.webp differ diff --git a/assets/stickers/10392.webp b/assets/stickers/10392.webp new file mode 100644 index 00000000..3c717aae Binary files /dev/null and b/assets/stickers/10392.webp differ diff --git a/assets/stickers/10393.webp b/assets/stickers/10393.webp new file mode 100644 index 00000000..af08dece Binary files /dev/null and b/assets/stickers/10393.webp differ diff --git a/assets/stickers/10394.webp b/assets/stickers/10394.webp new file mode 100644 index 00000000..dc81274a Binary files /dev/null and b/assets/stickers/10394.webp differ diff --git a/assets/stickers/10395.webp b/assets/stickers/10395.webp new file mode 100644 index 00000000..e73d68e3 Binary files /dev/null and b/assets/stickers/10395.webp differ diff --git a/assets/stickers/10396.webp b/assets/stickers/10396.webp new file mode 100644 index 00000000..20897039 Binary files /dev/null and b/assets/stickers/10396.webp differ diff --git a/assets/stickers/10397.webp b/assets/stickers/10397.webp new file mode 100644 index 00000000..c150de52 Binary files /dev/null and b/assets/stickers/10397.webp differ diff --git a/assets/stickers/10398.webp b/assets/stickers/10398.webp new file mode 100644 index 00000000..05e9f4e0 Binary files /dev/null and b/assets/stickers/10398.webp differ diff --git a/assets/stickers/10399.webp b/assets/stickers/10399.webp new file mode 100644 index 00000000..c0baae89 Binary files /dev/null and b/assets/stickers/10399.webp differ diff --git a/assets/stickers/10400.webp b/assets/stickers/10400.webp new file mode 100644 index 00000000..0d36195d Binary files /dev/null and b/assets/stickers/10400.webp differ diff --git a/assets/stickers/10401.webp b/assets/stickers/10401.webp new file mode 100644 index 00000000..bf6a3cb6 Binary files /dev/null and b/assets/stickers/10401.webp differ diff --git a/assets/stickers/10402.webp b/assets/stickers/10402.webp new file mode 100644 index 00000000..c0bcae02 Binary files /dev/null and b/assets/stickers/10402.webp differ diff --git a/assets/stickers/10403.webp b/assets/stickers/10403.webp new file mode 100644 index 00000000..5ccb4335 Binary files /dev/null and b/assets/stickers/10403.webp differ diff --git a/assets/stickers/10404.webp b/assets/stickers/10404.webp new file mode 100644 index 00000000..05b21385 Binary files /dev/null and b/assets/stickers/10404.webp differ diff --git a/assets/stickers/10405.webp b/assets/stickers/10405.webp new file mode 100644 index 00000000..d5bd2c95 Binary files /dev/null and b/assets/stickers/10405.webp differ diff --git a/assets/stickers/10406.webp b/assets/stickers/10406.webp new file mode 100644 index 00000000..1e037270 Binary files /dev/null and b/assets/stickers/10406.webp differ diff --git a/assets/stickers/10407.webp b/assets/stickers/10407.webp new file mode 100644 index 00000000..561c77e8 Binary files /dev/null and b/assets/stickers/10407.webp differ diff --git a/assets/stickers/10408.webp b/assets/stickers/10408.webp new file mode 100644 index 00000000..78d5540c Binary files /dev/null and b/assets/stickers/10408.webp differ diff --git a/assets/stickers/10409.webp b/assets/stickers/10409.webp new file mode 100644 index 00000000..5f671c62 Binary files /dev/null and b/assets/stickers/10409.webp differ diff --git a/assets/stickers/10410.webp b/assets/stickers/10410.webp new file mode 100644 index 00000000..184ec6e4 Binary files /dev/null and b/assets/stickers/10410.webp differ diff --git a/assets/stickers/10411.webp b/assets/stickers/10411.webp new file mode 100644 index 00000000..152f8334 Binary files /dev/null and b/assets/stickers/10411.webp differ diff --git a/assets/stickers/10412.webp b/assets/stickers/10412.webp new file mode 100644 index 00000000..bc7f59e3 Binary files /dev/null and b/assets/stickers/10412.webp differ diff --git a/assets/stickers/10413.webp b/assets/stickers/10413.webp new file mode 100644 index 00000000..2f753031 Binary files /dev/null and b/assets/stickers/10413.webp differ diff --git a/assets/stickers/10414.webp b/assets/stickers/10414.webp new file mode 100644 index 00000000..7af8f3c4 Binary files /dev/null and b/assets/stickers/10414.webp differ diff --git a/assets/stickers/10415.webp b/assets/stickers/10415.webp new file mode 100644 index 00000000..8f128776 Binary files /dev/null and b/assets/stickers/10415.webp differ diff --git a/assets/stickers/10416.webp b/assets/stickers/10416.webp new file mode 100644 index 00000000..d9bba1ca Binary files /dev/null and b/assets/stickers/10416.webp differ diff --git a/assets/stickers/10417.webp b/assets/stickers/10417.webp new file mode 100644 index 00000000..1be66af2 Binary files /dev/null and b/assets/stickers/10417.webp differ diff --git a/assets/stickers/10418.webp b/assets/stickers/10418.webp new file mode 100644 index 00000000..983a5ab8 Binary files /dev/null and b/assets/stickers/10418.webp differ diff --git a/assets/stickers/10419.webp b/assets/stickers/10419.webp new file mode 100644 index 00000000..25e7947a Binary files /dev/null and b/assets/stickers/10419.webp differ diff --git a/assets/stickers/10420.webp b/assets/stickers/10420.webp new file mode 100644 index 00000000..1464cfb7 Binary files /dev/null and b/assets/stickers/10420.webp differ diff --git a/assets/stickers/10421.webp b/assets/stickers/10421.webp new file mode 100644 index 00000000..667934ca Binary files /dev/null and b/assets/stickers/10421.webp differ diff --git a/assets/stickers/10422.webp b/assets/stickers/10422.webp new file mode 100644 index 00000000..579dede0 Binary files /dev/null and b/assets/stickers/10422.webp differ diff --git a/assets/stickers/10423.webp b/assets/stickers/10423.webp new file mode 100644 index 00000000..ffdb4eae Binary files /dev/null and b/assets/stickers/10423.webp differ diff --git a/assets/stickers/10424.webp b/assets/stickers/10424.webp new file mode 100644 index 00000000..eb6d7735 Binary files /dev/null and b/assets/stickers/10424.webp differ diff --git a/assets/stickers/10425.webp b/assets/stickers/10425.webp new file mode 100644 index 00000000..16947d16 Binary files /dev/null and b/assets/stickers/10425.webp differ diff --git a/assets/stickers/10426.webp b/assets/stickers/10426.webp new file mode 100644 index 00000000..dcca7c76 Binary files /dev/null and b/assets/stickers/10426.webp differ diff --git a/assets/stickers/10427.webp b/assets/stickers/10427.webp new file mode 100644 index 00000000..1bc01944 Binary files /dev/null and b/assets/stickers/10427.webp differ diff --git a/assets/stickers/10428.webp b/assets/stickers/10428.webp new file mode 100644 index 00000000..49444570 Binary files /dev/null and b/assets/stickers/10428.webp differ diff --git a/assets/stickers/10429.webp b/assets/stickers/10429.webp new file mode 100644 index 00000000..ba7a8e24 Binary files /dev/null and b/assets/stickers/10429.webp differ diff --git a/assets/stickers/10430.webp b/assets/stickers/10430.webp new file mode 100644 index 00000000..4d93234c Binary files /dev/null and b/assets/stickers/10430.webp differ diff --git a/assets/stickers/10431.webp b/assets/stickers/10431.webp new file mode 100644 index 00000000..1e75c413 Binary files /dev/null and b/assets/stickers/10431.webp differ diff --git a/assets/stickers/10432.webp b/assets/stickers/10432.webp new file mode 100644 index 00000000..7d870b94 Binary files /dev/null and b/assets/stickers/10432.webp differ diff --git a/assets/stickers/10433.webp b/assets/stickers/10433.webp new file mode 100644 index 00000000..89b3315b Binary files /dev/null and b/assets/stickers/10433.webp differ diff --git a/assets/stickers/10434.webp b/assets/stickers/10434.webp new file mode 100644 index 00000000..70278b2e Binary files /dev/null and b/assets/stickers/10434.webp differ diff --git a/assets/stickers/10435.webp b/assets/stickers/10435.webp new file mode 100644 index 00000000..8487b232 Binary files /dev/null and b/assets/stickers/10435.webp differ diff --git a/assets/stickers/10436.webp b/assets/stickers/10436.webp new file mode 100644 index 00000000..716f7a09 Binary files /dev/null and b/assets/stickers/10436.webp differ diff --git a/assets/stickers/10437.webp b/assets/stickers/10437.webp new file mode 100644 index 00000000..cb4d58be Binary files /dev/null and b/assets/stickers/10437.webp differ diff --git a/assets/stickers/10438.webp b/assets/stickers/10438.webp new file mode 100644 index 00000000..c865783e Binary files /dev/null and b/assets/stickers/10438.webp differ diff --git a/assets/stickers/10439.webp b/assets/stickers/10439.webp new file mode 100644 index 00000000..62feba53 Binary files /dev/null and b/assets/stickers/10439.webp differ diff --git a/assets/stickers/10440.webp b/assets/stickers/10440.webp new file mode 100644 index 00000000..0f6b67b7 Binary files /dev/null and b/assets/stickers/10440.webp differ diff --git a/assets/stickers/10441.webp b/assets/stickers/10441.webp new file mode 100644 index 00000000..6cefb1db Binary files /dev/null and b/assets/stickers/10441.webp differ diff --git a/assets/stickers/10442.webp b/assets/stickers/10442.webp new file mode 100644 index 00000000..53748183 Binary files /dev/null and b/assets/stickers/10442.webp differ diff --git a/assets/stickers/10443.webp b/assets/stickers/10443.webp new file mode 100644 index 00000000..e0f48c9c Binary files /dev/null and b/assets/stickers/10443.webp differ diff --git a/assets/stickers/10444.webp b/assets/stickers/10444.webp new file mode 100644 index 00000000..aeeaf2f3 Binary files /dev/null and b/assets/stickers/10444.webp differ diff --git a/assets/stickers/10445.webp b/assets/stickers/10445.webp new file mode 100644 index 00000000..83d23088 Binary files /dev/null and b/assets/stickers/10445.webp differ diff --git a/assets/stickers/10446.webp b/assets/stickers/10446.webp new file mode 100644 index 00000000..0dca1c4f Binary files /dev/null and b/assets/stickers/10446.webp differ diff --git a/assets/stickers/10447.webp b/assets/stickers/10447.webp new file mode 100644 index 00000000..274afce2 Binary files /dev/null and b/assets/stickers/10447.webp differ diff --git a/assets/stickers/10448.webp b/assets/stickers/10448.webp new file mode 100644 index 00000000..e0069a7d Binary files /dev/null and b/assets/stickers/10448.webp differ diff --git a/assets/stickers/10449.webp b/assets/stickers/10449.webp new file mode 100644 index 00000000..ca0bb0bb Binary files /dev/null and b/assets/stickers/10449.webp differ diff --git a/assets/stickers/10450.webp b/assets/stickers/10450.webp new file mode 100644 index 00000000..0d8bc461 Binary files /dev/null and b/assets/stickers/10450.webp differ diff --git a/assets/stickers/10451.webp b/assets/stickers/10451.webp new file mode 100644 index 00000000..4be93b3e Binary files /dev/null and b/assets/stickers/10451.webp differ diff --git a/assets/stickers/10452.webp b/assets/stickers/10452.webp new file mode 100644 index 00000000..302f24be Binary files /dev/null and b/assets/stickers/10452.webp differ diff --git a/assets/stickers/10453.webp b/assets/stickers/10453.webp new file mode 100644 index 00000000..49fbf81b Binary files /dev/null and b/assets/stickers/10453.webp differ diff --git a/assets/stickers/10454.webp b/assets/stickers/10454.webp new file mode 100644 index 00000000..046d2b4f Binary files /dev/null and b/assets/stickers/10454.webp differ diff --git a/assets/stickers/10455.webp b/assets/stickers/10455.webp new file mode 100644 index 00000000..cf45d556 Binary files /dev/null and b/assets/stickers/10455.webp differ diff --git a/assets/stickers/10456.webp b/assets/stickers/10456.webp new file mode 100644 index 00000000..291f9d97 Binary files /dev/null and b/assets/stickers/10456.webp differ diff --git a/assets/stickers/10457.webp b/assets/stickers/10457.webp new file mode 100644 index 00000000..fccc3d14 Binary files /dev/null and b/assets/stickers/10457.webp differ diff --git a/assets/stickers/10458.webp b/assets/stickers/10458.webp new file mode 100644 index 00000000..d342d11f Binary files /dev/null and b/assets/stickers/10458.webp differ diff --git a/assets/stickers/10459.webp b/assets/stickers/10459.webp new file mode 100644 index 00000000..0b4e857a Binary files /dev/null and b/assets/stickers/10459.webp differ diff --git a/assets/stickers/10460.webp b/assets/stickers/10460.webp new file mode 100644 index 00000000..dabf5964 Binary files /dev/null and b/assets/stickers/10460.webp differ diff --git a/assets/stickers/10461.webp b/assets/stickers/10461.webp new file mode 100644 index 00000000..2d75f8a3 Binary files /dev/null and b/assets/stickers/10461.webp differ diff --git a/assets/stickers/10462.webp b/assets/stickers/10462.webp new file mode 100644 index 00000000..18bfb4ee Binary files /dev/null and b/assets/stickers/10462.webp differ diff --git a/assets/stickers/10463.webp b/assets/stickers/10463.webp new file mode 100644 index 00000000..0fa48867 Binary files /dev/null and b/assets/stickers/10463.webp differ diff --git a/assets/stickers/10464.webp b/assets/stickers/10464.webp new file mode 100644 index 00000000..c8788f7a Binary files /dev/null and b/assets/stickers/10464.webp differ diff --git a/assets/stickers/10465.webp b/assets/stickers/10465.webp new file mode 100644 index 00000000..33aedf98 Binary files /dev/null and b/assets/stickers/10465.webp differ diff --git a/assets/stickers/10466.webp b/assets/stickers/10466.webp new file mode 100644 index 00000000..9aa2fd8f Binary files /dev/null and b/assets/stickers/10466.webp differ diff --git a/assets/stickers/10467.webp b/assets/stickers/10467.webp new file mode 100644 index 00000000..083f5344 Binary files /dev/null and b/assets/stickers/10467.webp differ diff --git a/assets/stickers/10468.webp b/assets/stickers/10468.webp new file mode 100644 index 00000000..cf0a400a Binary files /dev/null and b/assets/stickers/10468.webp differ diff --git a/assets/stickers/10469.webp b/assets/stickers/10469.webp new file mode 100644 index 00000000..8b3029ef Binary files /dev/null and b/assets/stickers/10469.webp differ diff --git a/assets/stickers/10470.webp b/assets/stickers/10470.webp new file mode 100644 index 00000000..cf21e0a7 Binary files /dev/null and b/assets/stickers/10470.webp differ diff --git a/assets/stickers/10471.webp b/assets/stickers/10471.webp new file mode 100644 index 00000000..1cebd28c Binary files /dev/null and b/assets/stickers/10471.webp differ diff --git a/assets/stickers/10472.webp b/assets/stickers/10472.webp new file mode 100644 index 00000000..7e872eda Binary files /dev/null and b/assets/stickers/10472.webp differ diff --git a/assets/stickers/10473.webp b/assets/stickers/10473.webp new file mode 100644 index 00000000..aa430a70 Binary files /dev/null and b/assets/stickers/10473.webp differ diff --git a/assets/stickers/10474.webp b/assets/stickers/10474.webp new file mode 100644 index 00000000..2bf3db92 Binary files /dev/null and b/assets/stickers/10474.webp differ diff --git a/assets/stickers/10475.webp b/assets/stickers/10475.webp new file mode 100644 index 00000000..85df3a55 Binary files /dev/null and b/assets/stickers/10475.webp differ diff --git a/assets/stickers/10476.webp b/assets/stickers/10476.webp new file mode 100644 index 00000000..7aa352fd Binary files /dev/null and b/assets/stickers/10476.webp differ diff --git a/assets/stickers/10477.webp b/assets/stickers/10477.webp new file mode 100644 index 00000000..9c34ce62 Binary files /dev/null and b/assets/stickers/10477.webp differ diff --git a/assets/stickers/10478.webp b/assets/stickers/10478.webp new file mode 100644 index 00000000..9ff21301 Binary files /dev/null and b/assets/stickers/10478.webp differ diff --git a/assets/stickers/10479.webp b/assets/stickers/10479.webp new file mode 100644 index 00000000..3c759060 Binary files /dev/null and b/assets/stickers/10479.webp differ diff --git a/assets/stickers/10480.webp b/assets/stickers/10480.webp new file mode 100644 index 00000000..774e05e4 Binary files /dev/null and b/assets/stickers/10480.webp differ diff --git a/assets/stickers/10481.webp b/assets/stickers/10481.webp new file mode 100644 index 00000000..bac854e2 Binary files /dev/null and b/assets/stickers/10481.webp differ diff --git a/assets/stickers/10482.webp b/assets/stickers/10482.webp new file mode 100644 index 00000000..3c729154 Binary files /dev/null and b/assets/stickers/10482.webp differ diff --git a/assets/stickers/10483.webp b/assets/stickers/10483.webp new file mode 100644 index 00000000..2b71fb06 Binary files /dev/null and b/assets/stickers/10483.webp differ diff --git a/assets/stickers/10484.webp b/assets/stickers/10484.webp new file mode 100644 index 00000000..baf66b77 Binary files /dev/null and b/assets/stickers/10484.webp differ diff --git a/assets/stickers/10485.webp b/assets/stickers/10485.webp new file mode 100644 index 00000000..f595e74e Binary files /dev/null and b/assets/stickers/10485.webp differ diff --git a/assets/stickers/10486.webp b/assets/stickers/10486.webp new file mode 100644 index 00000000..6de917d1 Binary files /dev/null and b/assets/stickers/10486.webp differ diff --git a/assets/stickers/10487.webp b/assets/stickers/10487.webp new file mode 100644 index 00000000..e0e6245c Binary files /dev/null and b/assets/stickers/10487.webp differ diff --git a/assets/stickers/10488.webp b/assets/stickers/10488.webp new file mode 100644 index 00000000..956d759f Binary files /dev/null and b/assets/stickers/10488.webp differ diff --git a/assets/stickers/10489.webp b/assets/stickers/10489.webp new file mode 100644 index 00000000..a9161584 Binary files /dev/null and b/assets/stickers/10489.webp differ diff --git a/assets/stickers/10490.webp b/assets/stickers/10490.webp new file mode 100644 index 00000000..7653cfcd Binary files /dev/null and b/assets/stickers/10490.webp differ diff --git a/assets/stickers/10491.webp b/assets/stickers/10491.webp new file mode 100644 index 00000000..8ba2963b Binary files /dev/null and b/assets/stickers/10491.webp differ diff --git a/assets/stickers/10492.webp b/assets/stickers/10492.webp new file mode 100644 index 00000000..88500d8c Binary files /dev/null and b/assets/stickers/10492.webp differ diff --git a/assets/stickers/10493.webp b/assets/stickers/10493.webp new file mode 100644 index 00000000..710a1266 Binary files /dev/null and b/assets/stickers/10493.webp differ diff --git a/assets/stickers/10494.webp b/assets/stickers/10494.webp new file mode 100644 index 00000000..1686fcf3 Binary files /dev/null and b/assets/stickers/10494.webp differ diff --git a/assets/stickers/10495.webp b/assets/stickers/10495.webp new file mode 100644 index 00000000..cda499e9 Binary files /dev/null and b/assets/stickers/10495.webp differ diff --git a/assets/stickers/10496.webp b/assets/stickers/10496.webp new file mode 100644 index 00000000..2db58b76 Binary files /dev/null and b/assets/stickers/10496.webp differ diff --git a/assets/stickers/10497.webp b/assets/stickers/10497.webp new file mode 100644 index 00000000..e8a7800b Binary files /dev/null and b/assets/stickers/10497.webp differ diff --git a/assets/stickers/10498.webp b/assets/stickers/10498.webp new file mode 100644 index 00000000..2ebdb0a6 Binary files /dev/null and b/assets/stickers/10498.webp differ diff --git a/assets/stickers/10499.webp b/assets/stickers/10499.webp new file mode 100644 index 00000000..7aa9a9fe Binary files /dev/null and b/assets/stickers/10499.webp differ diff --git a/assets/stickers/10500.webp b/assets/stickers/10500.webp new file mode 100644 index 00000000..e1b0a56b Binary files /dev/null and b/assets/stickers/10500.webp differ diff --git a/assets/stickers/10534.webp b/assets/stickers/10534.webp new file mode 100644 index 00000000..7268ddcc Binary files /dev/null and b/assets/stickers/10534.webp differ diff --git a/assets/stickers/10535.webp b/assets/stickers/10535.webp new file mode 100644 index 00000000..16cc5c91 Binary files /dev/null and b/assets/stickers/10535.webp differ diff --git a/assets/stickers/10536.webp b/assets/stickers/10536.webp new file mode 100644 index 00000000..dd55ccc4 Binary files /dev/null and b/assets/stickers/10536.webp differ diff --git a/assets/stickers/10537.webp b/assets/stickers/10537.webp new file mode 100644 index 00000000..9041e87c Binary files /dev/null and b/assets/stickers/10537.webp differ diff --git a/assets/stickers/10538.webp b/assets/stickers/10538.webp new file mode 100644 index 00000000..eac1c0d0 Binary files /dev/null and b/assets/stickers/10538.webp differ diff --git a/assets/stickers/10539.webp b/assets/stickers/10539.webp new file mode 100644 index 00000000..7d92b1ca Binary files /dev/null and b/assets/stickers/10539.webp differ diff --git a/assets/stickers/10540.webp b/assets/stickers/10540.webp new file mode 100644 index 00000000..afea34f9 Binary files /dev/null and b/assets/stickers/10540.webp differ diff --git a/assets/stickers/10541.webp b/assets/stickers/10541.webp new file mode 100644 index 00000000..c56742e4 Binary files /dev/null and b/assets/stickers/10541.webp differ diff --git a/assets/stickers/10542.webp b/assets/stickers/10542.webp new file mode 100644 index 00000000..25a5cf35 Binary files /dev/null and b/assets/stickers/10542.webp differ diff --git a/assets/stickers/10543.webp b/assets/stickers/10543.webp new file mode 100644 index 00000000..eff33f82 Binary files /dev/null and b/assets/stickers/10543.webp differ diff --git a/assets/stickers/10544.webp b/assets/stickers/10544.webp new file mode 100644 index 00000000..57fc3117 Binary files /dev/null and b/assets/stickers/10544.webp differ diff --git a/assets/stickers/10545.webp b/assets/stickers/10545.webp new file mode 100644 index 00000000..560999b8 Binary files /dev/null and b/assets/stickers/10545.webp differ diff --git a/assets/stickers/10546.webp b/assets/stickers/10546.webp new file mode 100644 index 00000000..ef55bfca Binary files /dev/null and b/assets/stickers/10546.webp differ diff --git a/assets/stickers/10547.webp b/assets/stickers/10547.webp new file mode 100644 index 00000000..3cfc1fe8 Binary files /dev/null and b/assets/stickers/10547.webp differ diff --git a/assets/stickers/10548.webp b/assets/stickers/10548.webp new file mode 100644 index 00000000..52845d42 Binary files /dev/null and b/assets/stickers/10548.webp differ diff --git a/assets/stickers/10549.webp b/assets/stickers/10549.webp new file mode 100644 index 00000000..5a257f99 Binary files /dev/null and b/assets/stickers/10549.webp differ diff --git a/assets/stickers/10550.webp b/assets/stickers/10550.webp new file mode 100644 index 00000000..4863bfbb Binary files /dev/null and b/assets/stickers/10550.webp differ diff --git a/assets/stickers/10551.webp b/assets/stickers/10551.webp new file mode 100644 index 00000000..f27466cc Binary files /dev/null and b/assets/stickers/10551.webp differ diff --git a/assets/stickers/10552.webp b/assets/stickers/10552.webp new file mode 100644 index 00000000..063d8625 Binary files /dev/null and b/assets/stickers/10552.webp differ diff --git a/assets/stickers/10553.webp b/assets/stickers/10553.webp new file mode 100644 index 00000000..f14bd321 Binary files /dev/null and b/assets/stickers/10553.webp differ diff --git a/assets/stickers/10554.webp b/assets/stickers/10554.webp new file mode 100644 index 00000000..2a149a0c Binary files /dev/null and b/assets/stickers/10554.webp differ diff --git a/assets/stickers/10555.webp b/assets/stickers/10555.webp new file mode 100644 index 00000000..4690148e Binary files /dev/null and b/assets/stickers/10555.webp differ diff --git a/assets/stickers/10556.webp b/assets/stickers/10556.webp new file mode 100644 index 00000000..e65980cf Binary files /dev/null and b/assets/stickers/10556.webp differ diff --git a/assets/stickers/10557.webp b/assets/stickers/10557.webp new file mode 100644 index 00000000..70c8df8c Binary files /dev/null and b/assets/stickers/10557.webp differ diff --git a/assets/stickers/10558.webp b/assets/stickers/10558.webp new file mode 100644 index 00000000..2e81a810 Binary files /dev/null and b/assets/stickers/10558.webp differ diff --git a/assets/stickers/10559.webp b/assets/stickers/10559.webp new file mode 100644 index 00000000..1deb40dc Binary files /dev/null and b/assets/stickers/10559.webp differ diff --git a/assets/stickers/10560.webp b/assets/stickers/10560.webp new file mode 100644 index 00000000..d784ef7d Binary files /dev/null and b/assets/stickers/10560.webp differ diff --git a/assets/stickers/10561.webp b/assets/stickers/10561.webp new file mode 100644 index 00000000..321e2267 Binary files /dev/null and b/assets/stickers/10561.webp differ diff --git a/assets/stickers/10562.webp b/assets/stickers/10562.webp new file mode 100644 index 00000000..ee35f2f8 Binary files /dev/null and b/assets/stickers/10562.webp differ diff --git a/assets/stickers/10563.webp b/assets/stickers/10563.webp new file mode 100644 index 00000000..0c22e4f8 Binary files /dev/null and b/assets/stickers/10563.webp differ diff --git a/assets/stickers/10564.webp b/assets/stickers/10564.webp new file mode 100644 index 00000000..e45495dc Binary files /dev/null and b/assets/stickers/10564.webp differ diff --git a/assets/stickers/10565.webp b/assets/stickers/10565.webp new file mode 100644 index 00000000..ecbbce94 Binary files /dev/null and b/assets/stickers/10565.webp differ diff --git a/assets/stickers/10566.webp b/assets/stickers/10566.webp new file mode 100644 index 00000000..26f46dd6 Binary files /dev/null and b/assets/stickers/10566.webp differ diff --git a/assets/stickers/10567.webp b/assets/stickers/10567.webp new file mode 100644 index 00000000..958b40d5 Binary files /dev/null and b/assets/stickers/10567.webp differ diff --git a/assets/stickers/10568.webp b/assets/stickers/10568.webp new file mode 100644 index 00000000..2b8c8ba0 Binary files /dev/null and b/assets/stickers/10568.webp differ diff --git a/assets/stickers/10569.webp b/assets/stickers/10569.webp new file mode 100644 index 00000000..2f866688 Binary files /dev/null and b/assets/stickers/10569.webp differ diff --git a/assets/stickers/10570.webp b/assets/stickers/10570.webp new file mode 100644 index 00000000..9eba3ce3 Binary files /dev/null and b/assets/stickers/10570.webp differ diff --git a/assets/stickers/10571.webp b/assets/stickers/10571.webp new file mode 100644 index 00000000..d53a35a5 Binary files /dev/null and b/assets/stickers/10571.webp differ diff --git a/assets/stickers/10572.webp b/assets/stickers/10572.webp new file mode 100644 index 00000000..d562750a Binary files /dev/null and b/assets/stickers/10572.webp differ diff --git a/assets/stickers/10573.webp b/assets/stickers/10573.webp new file mode 100644 index 00000000..2648a2b1 Binary files /dev/null and b/assets/stickers/10573.webp differ diff --git a/assets/stickers/10574.webp b/assets/stickers/10574.webp new file mode 100644 index 00000000..83020bb7 Binary files /dev/null and b/assets/stickers/10574.webp differ diff --git a/assets/stickers/10575.webp b/assets/stickers/10575.webp new file mode 100644 index 00000000..582327c7 Binary files /dev/null and b/assets/stickers/10575.webp differ diff --git a/assets/stickers/10576.webp b/assets/stickers/10576.webp new file mode 100644 index 00000000..704725ba Binary files /dev/null and b/assets/stickers/10576.webp differ diff --git a/assets/stickers/10577.webp b/assets/stickers/10577.webp new file mode 100644 index 00000000..173ad83b Binary files /dev/null and b/assets/stickers/10577.webp differ diff --git a/assets/stickers/10578.webp b/assets/stickers/10578.webp new file mode 100644 index 00000000..475b78a5 Binary files /dev/null and b/assets/stickers/10578.webp differ diff --git a/assets/stickers/10579.webp b/assets/stickers/10579.webp new file mode 100644 index 00000000..1687f756 Binary files /dev/null and b/assets/stickers/10579.webp differ diff --git a/assets/stickers/10580.webp b/assets/stickers/10580.webp new file mode 100644 index 00000000..bebeb012 Binary files /dev/null and b/assets/stickers/10580.webp differ diff --git a/assets/stickers/10581.webp b/assets/stickers/10581.webp new file mode 100644 index 00000000..bbbc3f04 Binary files /dev/null and b/assets/stickers/10581.webp differ diff --git a/assets/stickers/10582.webp b/assets/stickers/10582.webp new file mode 100644 index 00000000..995289ea Binary files /dev/null and b/assets/stickers/10582.webp differ diff --git a/assets/stickers/10583.webp b/assets/stickers/10583.webp new file mode 100644 index 00000000..e08af828 Binary files /dev/null and b/assets/stickers/10583.webp differ diff --git a/assets/stickers/10584.webp b/assets/stickers/10584.webp new file mode 100644 index 00000000..336e6c68 Binary files /dev/null and b/assets/stickers/10584.webp differ diff --git a/assets/stickers/10585.webp b/assets/stickers/10585.webp new file mode 100644 index 00000000..01bb84a2 Binary files /dev/null and b/assets/stickers/10585.webp differ diff --git a/assets/stickers/10586.webp b/assets/stickers/10586.webp new file mode 100644 index 00000000..ea8de89d Binary files /dev/null and b/assets/stickers/10586.webp differ diff --git a/assets/stickers/10587.webp b/assets/stickers/10587.webp new file mode 100644 index 00000000..bec261f7 Binary files /dev/null and b/assets/stickers/10587.webp differ diff --git a/assets/stickers/10588.webp b/assets/stickers/10588.webp new file mode 100644 index 00000000..98ce8b77 Binary files /dev/null and b/assets/stickers/10588.webp differ diff --git a/assets/stickers/10589.webp b/assets/stickers/10589.webp new file mode 100644 index 00000000..862a3c84 Binary files /dev/null and b/assets/stickers/10589.webp differ diff --git a/assets/stickers/10590.webp b/assets/stickers/10590.webp new file mode 100644 index 00000000..2df08817 Binary files /dev/null and b/assets/stickers/10590.webp differ diff --git a/assets/stickers/10591.webp b/assets/stickers/10591.webp new file mode 100644 index 00000000..e666c09d Binary files /dev/null and b/assets/stickers/10591.webp differ diff --git a/assets/stickers/10592.webp b/assets/stickers/10592.webp new file mode 100644 index 00000000..714edf34 Binary files /dev/null and b/assets/stickers/10592.webp differ diff --git a/assets/stickers/10593.webp b/assets/stickers/10593.webp new file mode 100644 index 00000000..9e6d833f Binary files /dev/null and b/assets/stickers/10593.webp differ diff --git a/assets/stickers/10594.webp b/assets/stickers/10594.webp new file mode 100644 index 00000000..35c9d962 Binary files /dev/null and b/assets/stickers/10594.webp differ diff --git a/assets/stickers/10595.webp b/assets/stickers/10595.webp new file mode 100644 index 00000000..3a2a695d Binary files /dev/null and b/assets/stickers/10595.webp differ diff --git a/assets/stickers/10596.webp b/assets/stickers/10596.webp new file mode 100644 index 00000000..0775d09d Binary files /dev/null and b/assets/stickers/10596.webp differ diff --git a/assets/stickers/10597.webp b/assets/stickers/10597.webp new file mode 100644 index 00000000..5a4f87ed Binary files /dev/null and b/assets/stickers/10597.webp differ diff --git a/assets/stickers/10598.webp b/assets/stickers/10598.webp new file mode 100644 index 00000000..31f76923 Binary files /dev/null and b/assets/stickers/10598.webp differ diff --git a/assets/stickers/10599.webp b/assets/stickers/10599.webp new file mode 100644 index 00000000..a14080dd Binary files /dev/null and b/assets/stickers/10599.webp differ diff --git a/assets/stickers/10600.webp b/assets/stickers/10600.webp new file mode 100644 index 00000000..8eb4f753 Binary files /dev/null and b/assets/stickers/10600.webp differ diff --git a/assets/stickers/10601.webp b/assets/stickers/10601.webp new file mode 100644 index 00000000..21b2bf66 Binary files /dev/null and b/assets/stickers/10601.webp differ diff --git a/assets/stickers/10602.webp b/assets/stickers/10602.webp new file mode 100644 index 00000000..8440dfd5 Binary files /dev/null and b/assets/stickers/10602.webp differ diff --git a/assets/stickers/10603.webp b/assets/stickers/10603.webp new file mode 100644 index 00000000..e8894854 Binary files /dev/null and b/assets/stickers/10603.webp differ diff --git a/assets/stickers/10604.webp b/assets/stickers/10604.webp new file mode 100644 index 00000000..6d1f4781 Binary files /dev/null and b/assets/stickers/10604.webp differ diff --git a/assets/stickers/10605.webp b/assets/stickers/10605.webp new file mode 100644 index 00000000..48fa05c3 Binary files /dev/null and b/assets/stickers/10605.webp differ diff --git a/assets/stickers/10606.webp b/assets/stickers/10606.webp new file mode 100644 index 00000000..12fdb6c0 Binary files /dev/null and b/assets/stickers/10606.webp differ diff --git a/assets/stickers/10607.webp b/assets/stickers/10607.webp new file mode 100644 index 00000000..d10831fa Binary files /dev/null and b/assets/stickers/10607.webp differ diff --git a/assets/stickers/10608.webp b/assets/stickers/10608.webp new file mode 100644 index 00000000..39dba6ea Binary files /dev/null and b/assets/stickers/10608.webp differ diff --git a/assets/stickers/10609.webp b/assets/stickers/10609.webp new file mode 100644 index 00000000..9a5397e6 Binary files /dev/null and b/assets/stickers/10609.webp differ diff --git a/assets/stickers/10610.webp b/assets/stickers/10610.webp new file mode 100644 index 00000000..016f4305 Binary files /dev/null and b/assets/stickers/10610.webp differ diff --git a/assets/stickers/10611.webp b/assets/stickers/10611.webp new file mode 100644 index 00000000..7f5422ea Binary files /dev/null and b/assets/stickers/10611.webp differ diff --git a/assets/stickers/10612.webp b/assets/stickers/10612.webp new file mode 100644 index 00000000..47cc816f Binary files /dev/null and b/assets/stickers/10612.webp differ diff --git a/assets/stickers/10613.webp b/assets/stickers/10613.webp new file mode 100644 index 00000000..fdebec5a Binary files /dev/null and b/assets/stickers/10613.webp differ diff --git a/assets/stickers/10614.webp b/assets/stickers/10614.webp new file mode 100644 index 00000000..1f902b67 Binary files /dev/null and b/assets/stickers/10614.webp differ diff --git a/assets/stickers/10615.webp b/assets/stickers/10615.webp new file mode 100644 index 00000000..458e5972 Binary files /dev/null and b/assets/stickers/10615.webp differ diff --git a/assets/stickers/10616.webp b/assets/stickers/10616.webp new file mode 100644 index 00000000..36ce4a10 Binary files /dev/null and b/assets/stickers/10616.webp differ diff --git a/assets/stickers/10617.webp b/assets/stickers/10617.webp new file mode 100644 index 00000000..3d769d0a Binary files /dev/null and b/assets/stickers/10617.webp differ diff --git a/assets/stickers/10618.webp b/assets/stickers/10618.webp new file mode 100644 index 00000000..b3639886 Binary files /dev/null and b/assets/stickers/10618.webp differ diff --git a/assets/stickers/10619.webp b/assets/stickers/10619.webp new file mode 100644 index 00000000..d8f9c984 Binary files /dev/null and b/assets/stickers/10619.webp differ diff --git a/assets/stickers/10620.webp b/assets/stickers/10620.webp new file mode 100644 index 00000000..ecff5d4c Binary files /dev/null and b/assets/stickers/10620.webp differ diff --git a/assets/stickers/10621.webp b/assets/stickers/10621.webp new file mode 100644 index 00000000..a7faf051 Binary files /dev/null and b/assets/stickers/10621.webp differ diff --git a/assets/stickers/10622.webp b/assets/stickers/10622.webp new file mode 100644 index 00000000..ee283bec Binary files /dev/null and b/assets/stickers/10622.webp differ diff --git a/assets/stickers/10623.webp b/assets/stickers/10623.webp new file mode 100644 index 00000000..64b8e251 Binary files /dev/null and b/assets/stickers/10623.webp differ diff --git a/assets/stickers/10624.webp b/assets/stickers/10624.webp new file mode 100644 index 00000000..e183e3ab Binary files /dev/null and b/assets/stickers/10624.webp differ diff --git a/assets/stickers/10625.webp b/assets/stickers/10625.webp new file mode 100644 index 00000000..e88ae50e Binary files /dev/null and b/assets/stickers/10625.webp differ diff --git a/assets/stickers/10626.webp b/assets/stickers/10626.webp new file mode 100644 index 00000000..7f38c43f Binary files /dev/null and b/assets/stickers/10626.webp differ diff --git a/assets/stickers/10627.webp b/assets/stickers/10627.webp new file mode 100644 index 00000000..b00e8cad Binary files /dev/null and b/assets/stickers/10627.webp differ diff --git a/assets/stickers/10628.webp b/assets/stickers/10628.webp new file mode 100644 index 00000000..7cfd99dc Binary files /dev/null and b/assets/stickers/10628.webp differ diff --git a/assets/stickers/10629.webp b/assets/stickers/10629.webp new file mode 100644 index 00000000..b0140747 Binary files /dev/null and b/assets/stickers/10629.webp differ diff --git a/assets/stickers/10630.webp b/assets/stickers/10630.webp new file mode 100644 index 00000000..3e467c50 Binary files /dev/null and b/assets/stickers/10630.webp differ diff --git a/assets/stickers/10631.webp b/assets/stickers/10631.webp new file mode 100644 index 00000000..b990b6c0 Binary files /dev/null and b/assets/stickers/10631.webp differ diff --git a/assets/stickers/10632.webp b/assets/stickers/10632.webp new file mode 100644 index 00000000..01a91e8a Binary files /dev/null and b/assets/stickers/10632.webp differ diff --git a/assets/stickers/10633.webp b/assets/stickers/10633.webp new file mode 100644 index 00000000..1f766bce Binary files /dev/null and b/assets/stickers/10633.webp differ diff --git a/assets/stickers/10634.webp b/assets/stickers/10634.webp new file mode 100644 index 00000000..4c965eb1 Binary files /dev/null and b/assets/stickers/10634.webp differ diff --git a/assets/stickers/10635.webp b/assets/stickers/10635.webp new file mode 100644 index 00000000..b02eb520 Binary files /dev/null and b/assets/stickers/10635.webp differ diff --git a/assets/stickers/10636.webp b/assets/stickers/10636.webp new file mode 100644 index 00000000..a6814b70 Binary files /dev/null and b/assets/stickers/10636.webp differ diff --git a/assets/stickers/10637.webp b/assets/stickers/10637.webp new file mode 100644 index 00000000..1c6d93ea Binary files /dev/null and b/assets/stickers/10637.webp differ diff --git a/assets/stickers/10638.webp b/assets/stickers/10638.webp new file mode 100644 index 00000000..a40ccf4a Binary files /dev/null and b/assets/stickers/10638.webp differ diff --git a/assets/stickers/10639.webp b/assets/stickers/10639.webp new file mode 100644 index 00000000..95e46268 Binary files /dev/null and b/assets/stickers/10639.webp differ diff --git a/assets/stickers/10640.webp b/assets/stickers/10640.webp new file mode 100644 index 00000000..97dc30a3 Binary files /dev/null and b/assets/stickers/10640.webp differ diff --git a/assets/stickers/10641.webp b/assets/stickers/10641.webp new file mode 100644 index 00000000..382b0960 Binary files /dev/null and b/assets/stickers/10641.webp differ diff --git a/assets/stickers/10642.webp b/assets/stickers/10642.webp new file mode 100644 index 00000000..4e92f91e Binary files /dev/null and b/assets/stickers/10642.webp differ diff --git a/assets/stickers/10643.webp b/assets/stickers/10643.webp new file mode 100644 index 00000000..08b80be4 Binary files /dev/null and b/assets/stickers/10643.webp differ diff --git a/assets/stickers/10644.webp b/assets/stickers/10644.webp new file mode 100644 index 00000000..3c063433 Binary files /dev/null and b/assets/stickers/10644.webp differ diff --git a/assets/stickers/10645.webp b/assets/stickers/10645.webp new file mode 100644 index 00000000..906e3030 Binary files /dev/null and b/assets/stickers/10645.webp differ diff --git a/assets/stickers/10646.webp b/assets/stickers/10646.webp new file mode 100644 index 00000000..272dde99 Binary files /dev/null and b/assets/stickers/10646.webp differ diff --git a/assets/stickers/10647.webp b/assets/stickers/10647.webp new file mode 100644 index 00000000..32cef46e Binary files /dev/null and b/assets/stickers/10647.webp differ diff --git a/assets/stickers/10648.webp b/assets/stickers/10648.webp new file mode 100644 index 00000000..f0a3b2fc Binary files /dev/null and b/assets/stickers/10648.webp differ diff --git a/assets/stickers/10649.webp b/assets/stickers/10649.webp new file mode 100644 index 00000000..f5b79038 Binary files /dev/null and b/assets/stickers/10649.webp differ diff --git a/assets/stickers/10650.webp b/assets/stickers/10650.webp new file mode 100644 index 00000000..b7c3dfe2 Binary files /dev/null and b/assets/stickers/10650.webp differ diff --git a/assets/stickers/10651.webp b/assets/stickers/10651.webp new file mode 100644 index 00000000..19bca205 Binary files /dev/null and b/assets/stickers/10651.webp differ diff --git a/assets/stickers/10652.webp b/assets/stickers/10652.webp new file mode 100644 index 00000000..ebb46e3b Binary files /dev/null and b/assets/stickers/10652.webp differ diff --git a/assets/stickers/10653.webp b/assets/stickers/10653.webp new file mode 100644 index 00000000..81f11f2b Binary files /dev/null and b/assets/stickers/10653.webp differ diff --git a/assets/stickers/10654.webp b/assets/stickers/10654.webp new file mode 100644 index 00000000..1f50a9be Binary files /dev/null and b/assets/stickers/10654.webp differ diff --git a/assets/stickers/10655.webp b/assets/stickers/10655.webp new file mode 100644 index 00000000..2111ec53 Binary files /dev/null and b/assets/stickers/10655.webp differ diff --git a/assets/stickers/10656.webp b/assets/stickers/10656.webp new file mode 100644 index 00000000..cf767611 Binary files /dev/null and b/assets/stickers/10656.webp differ diff --git a/assets/stickers/10657.webp b/assets/stickers/10657.webp new file mode 100644 index 00000000..626abaed Binary files /dev/null and b/assets/stickers/10657.webp differ diff --git a/assets/stickers/10658.webp b/assets/stickers/10658.webp new file mode 100644 index 00000000..e574a746 Binary files /dev/null and b/assets/stickers/10658.webp differ diff --git a/assets/stickers/10659.webp b/assets/stickers/10659.webp new file mode 100644 index 00000000..ead235a9 Binary files /dev/null and b/assets/stickers/10659.webp differ diff --git a/assets/stickers/10660.webp b/assets/stickers/10660.webp new file mode 100644 index 00000000..b40a13fa Binary files /dev/null and b/assets/stickers/10660.webp differ diff --git a/assets/stickers/10661.webp b/assets/stickers/10661.webp new file mode 100644 index 00000000..fbae046f Binary files /dev/null and b/assets/stickers/10661.webp differ diff --git a/assets/stickers/10662.webp b/assets/stickers/10662.webp new file mode 100644 index 00000000..13ae0569 Binary files /dev/null and b/assets/stickers/10662.webp differ diff --git a/assets/stickers/10663.webp b/assets/stickers/10663.webp new file mode 100644 index 00000000..f201147d Binary files /dev/null and b/assets/stickers/10663.webp differ diff --git a/assets/stickers/10664.webp b/assets/stickers/10664.webp new file mode 100644 index 00000000..54b5467c Binary files /dev/null and b/assets/stickers/10664.webp differ diff --git a/assets/stickers/10665.webp b/assets/stickers/10665.webp new file mode 100644 index 00000000..876f8517 Binary files /dev/null and b/assets/stickers/10665.webp differ diff --git a/assets/stickers/10666.webp b/assets/stickers/10666.webp new file mode 100644 index 00000000..760f3887 Binary files /dev/null and b/assets/stickers/10666.webp differ diff --git a/assets/stickers/10667.webp b/assets/stickers/10667.webp new file mode 100644 index 00000000..b3b99d2f Binary files /dev/null and b/assets/stickers/10667.webp differ diff --git a/assets/stickers/10668.webp b/assets/stickers/10668.webp new file mode 100644 index 00000000..2736f3f8 Binary files /dev/null and b/assets/stickers/10668.webp differ diff --git a/assets/stickers/10669.webp b/assets/stickers/10669.webp new file mode 100644 index 00000000..a5883676 Binary files /dev/null and b/assets/stickers/10669.webp differ diff --git a/assets/stickers/10670.webp b/assets/stickers/10670.webp new file mode 100644 index 00000000..28a53140 Binary files /dev/null and b/assets/stickers/10670.webp differ diff --git a/assets/stickers/10671.webp b/assets/stickers/10671.webp new file mode 100644 index 00000000..07eeaa0b Binary files /dev/null and b/assets/stickers/10671.webp differ diff --git a/assets/stickers/10672.webp b/assets/stickers/10672.webp new file mode 100644 index 00000000..9dfe3628 Binary files /dev/null and b/assets/stickers/10672.webp differ diff --git a/assets/stickers/10673.webp b/assets/stickers/10673.webp new file mode 100644 index 00000000..90511f5e Binary files /dev/null and b/assets/stickers/10673.webp differ diff --git a/assets/stickers/10674.webp b/assets/stickers/10674.webp new file mode 100644 index 00000000..037edda0 Binary files /dev/null and b/assets/stickers/10674.webp differ diff --git a/assets/stickers/10675.webp b/assets/stickers/10675.webp new file mode 100644 index 00000000..ddc8cc6f Binary files /dev/null and b/assets/stickers/10675.webp differ diff --git a/assets/stickers/10676.webp b/assets/stickers/10676.webp new file mode 100644 index 00000000..79aedd03 Binary files /dev/null and b/assets/stickers/10676.webp differ diff --git a/assets/stickers/10677.webp b/assets/stickers/10677.webp new file mode 100644 index 00000000..fac3188b Binary files /dev/null and b/assets/stickers/10677.webp differ diff --git a/assets/stickers/10678.webp b/assets/stickers/10678.webp new file mode 100644 index 00000000..670bdc94 Binary files /dev/null and b/assets/stickers/10678.webp differ diff --git a/assets/stickers/10679.webp b/assets/stickers/10679.webp new file mode 100644 index 00000000..648c968b Binary files /dev/null and b/assets/stickers/10679.webp differ diff --git a/assets/stickers/10680.webp b/assets/stickers/10680.webp new file mode 100644 index 00000000..880f7cd9 Binary files /dev/null and b/assets/stickers/10680.webp differ diff --git a/assets/stickers/10681.webp b/assets/stickers/10681.webp new file mode 100644 index 00000000..00364088 Binary files /dev/null and b/assets/stickers/10681.webp differ diff --git a/assets/stickers/10682.webp b/assets/stickers/10682.webp new file mode 100644 index 00000000..4dafb60b Binary files /dev/null and b/assets/stickers/10682.webp differ diff --git a/assets/stickers/10683.webp b/assets/stickers/10683.webp new file mode 100644 index 00000000..4a610ae2 Binary files /dev/null and b/assets/stickers/10683.webp differ diff --git a/assets/stickers/10684.webp b/assets/stickers/10684.webp new file mode 100644 index 00000000..33225b8e Binary files /dev/null and b/assets/stickers/10684.webp differ diff --git a/assets/stickers/10685.webp b/assets/stickers/10685.webp new file mode 100644 index 00000000..b2c9e294 Binary files /dev/null and b/assets/stickers/10685.webp differ diff --git a/assets/stickers/10686.webp b/assets/stickers/10686.webp new file mode 100644 index 00000000..3ae731eb Binary files /dev/null and b/assets/stickers/10686.webp differ diff --git a/assets/stickers/10687.webp b/assets/stickers/10687.webp new file mode 100644 index 00000000..a3b73cab Binary files /dev/null and b/assets/stickers/10687.webp differ diff --git a/assets/stickers/10688.webp b/assets/stickers/10688.webp new file mode 100644 index 00000000..8bae1d59 Binary files /dev/null and b/assets/stickers/10688.webp differ diff --git a/assets/stickers/10689.webp b/assets/stickers/10689.webp new file mode 100644 index 00000000..97668cc6 Binary files /dev/null and b/assets/stickers/10689.webp differ diff --git a/assets/stickers/10690.webp b/assets/stickers/10690.webp new file mode 100644 index 00000000..50cda9df Binary files /dev/null and b/assets/stickers/10690.webp differ diff --git a/assets/stickers/10691.webp b/assets/stickers/10691.webp new file mode 100644 index 00000000..f404fdc9 Binary files /dev/null and b/assets/stickers/10691.webp differ diff --git a/assets/stickers/10692.webp b/assets/stickers/10692.webp new file mode 100644 index 00000000..304171ee Binary files /dev/null and b/assets/stickers/10692.webp differ diff --git a/assets/stickers/10693.webp b/assets/stickers/10693.webp new file mode 100644 index 00000000..3a74b926 Binary files /dev/null and b/assets/stickers/10693.webp differ diff --git a/assets/stickers/10694.webp b/assets/stickers/10694.webp new file mode 100644 index 00000000..9eff3b39 Binary files /dev/null and b/assets/stickers/10694.webp differ diff --git a/assets/stickers/10695.webp b/assets/stickers/10695.webp new file mode 100644 index 00000000..3c4e46c8 Binary files /dev/null and b/assets/stickers/10695.webp differ diff --git a/assets/stickers/10696.webp b/assets/stickers/10696.webp new file mode 100644 index 00000000..a3180423 Binary files /dev/null and b/assets/stickers/10696.webp differ diff --git a/assets/stickers/10697.webp b/assets/stickers/10697.webp new file mode 100644 index 00000000..4ad69280 Binary files /dev/null and b/assets/stickers/10697.webp differ diff --git a/assets/stickers/10698.webp b/assets/stickers/10698.webp new file mode 100644 index 00000000..653bac78 Binary files /dev/null and b/assets/stickers/10698.webp differ diff --git a/assets/stickers/10699.webp b/assets/stickers/10699.webp new file mode 100644 index 00000000..c1d38f95 Binary files /dev/null and b/assets/stickers/10699.webp differ diff --git a/assets/stickers/10700.webp b/assets/stickers/10700.webp new file mode 100644 index 00000000..b139686c Binary files /dev/null and b/assets/stickers/10700.webp differ diff --git a/assets/stickers/10701.webp b/assets/stickers/10701.webp new file mode 100644 index 00000000..d378d896 Binary files /dev/null and b/assets/stickers/10701.webp differ diff --git a/assets/stickers/10702.webp b/assets/stickers/10702.webp new file mode 100644 index 00000000..596559ad Binary files /dev/null and b/assets/stickers/10702.webp differ diff --git a/assets/stickers/10703.webp b/assets/stickers/10703.webp new file mode 100644 index 00000000..9db49443 Binary files /dev/null and b/assets/stickers/10703.webp differ diff --git a/assets/stickers/10704.webp b/assets/stickers/10704.webp new file mode 100644 index 00000000..0520a7b1 Binary files /dev/null and b/assets/stickers/10704.webp differ diff --git a/assets/stickers/10705.webp b/assets/stickers/10705.webp new file mode 100644 index 00000000..13f8fa3a Binary files /dev/null and b/assets/stickers/10705.webp differ diff --git a/assets/stickers/10706.webp b/assets/stickers/10706.webp new file mode 100644 index 00000000..29d2833b Binary files /dev/null and b/assets/stickers/10706.webp differ diff --git a/assets/stickers/10707.webp b/assets/stickers/10707.webp new file mode 100644 index 00000000..f3771008 Binary files /dev/null and b/assets/stickers/10707.webp differ diff --git a/assets/stickers/10708.webp b/assets/stickers/10708.webp new file mode 100644 index 00000000..32a8d2f8 Binary files /dev/null and b/assets/stickers/10708.webp differ diff --git a/assets/stickers/10709.webp b/assets/stickers/10709.webp new file mode 100644 index 00000000..e0f9ca25 Binary files /dev/null and b/assets/stickers/10709.webp differ diff --git a/assets/stickers/10710.webp b/assets/stickers/10710.webp new file mode 100644 index 00000000..04f30a2b Binary files /dev/null and b/assets/stickers/10710.webp differ diff --git a/assets/stickers/10711.webp b/assets/stickers/10711.webp new file mode 100644 index 00000000..a489f789 Binary files /dev/null and b/assets/stickers/10711.webp differ diff --git a/assets/stickers/10712.webp b/assets/stickers/10712.webp new file mode 100644 index 00000000..788e667d Binary files /dev/null and b/assets/stickers/10712.webp differ diff --git a/assets/stickers/10713.webp b/assets/stickers/10713.webp new file mode 100644 index 00000000..d0196ab8 Binary files /dev/null and b/assets/stickers/10713.webp differ diff --git a/assets/stickers/10714.webp b/assets/stickers/10714.webp new file mode 100644 index 00000000..93100b99 Binary files /dev/null and b/assets/stickers/10714.webp differ diff --git a/assets/stickers/10715.webp b/assets/stickers/10715.webp new file mode 100644 index 00000000..368e5183 Binary files /dev/null and b/assets/stickers/10715.webp differ diff --git a/assets/stickers/10716.webp b/assets/stickers/10716.webp new file mode 100644 index 00000000..f1045f94 Binary files /dev/null and b/assets/stickers/10716.webp differ diff --git a/assets/stickers/10717.webp b/assets/stickers/10717.webp new file mode 100644 index 00000000..39788de7 Binary files /dev/null and b/assets/stickers/10717.webp differ diff --git a/assets/stickers/10718.webp b/assets/stickers/10718.webp new file mode 100644 index 00000000..c5bd1ba3 Binary files /dev/null and b/assets/stickers/10718.webp differ diff --git a/assets/stickers/10719.webp b/assets/stickers/10719.webp new file mode 100644 index 00000000..9cad76b9 Binary files /dev/null and b/assets/stickers/10719.webp differ diff --git a/assets/stickers/10720.webp b/assets/stickers/10720.webp new file mode 100644 index 00000000..c0cba8c2 Binary files /dev/null and b/assets/stickers/10720.webp differ diff --git a/assets/stickers/10721.webp b/assets/stickers/10721.webp new file mode 100644 index 00000000..d5e7eabf Binary files /dev/null and b/assets/stickers/10721.webp differ diff --git a/assets/stickers/10722.webp b/assets/stickers/10722.webp new file mode 100644 index 00000000..cec4972f Binary files /dev/null and b/assets/stickers/10722.webp differ diff --git a/assets/stickers/10723.webp b/assets/stickers/10723.webp new file mode 100644 index 00000000..290f6242 Binary files /dev/null and b/assets/stickers/10723.webp differ diff --git a/assets/stickers/10724.webp b/assets/stickers/10724.webp new file mode 100644 index 00000000..19075c10 Binary files /dev/null and b/assets/stickers/10724.webp differ diff --git a/assets/stickers/10725.webp b/assets/stickers/10725.webp new file mode 100644 index 00000000..af2516fb Binary files /dev/null and b/assets/stickers/10725.webp differ diff --git a/assets/stickers/10726.webp b/assets/stickers/10726.webp new file mode 100644 index 00000000..4207f935 Binary files /dev/null and b/assets/stickers/10726.webp differ diff --git a/assets/stickers/10727.webp b/assets/stickers/10727.webp new file mode 100644 index 00000000..f16b5ebc Binary files /dev/null and b/assets/stickers/10727.webp differ diff --git a/assets/stickers/10728.webp b/assets/stickers/10728.webp new file mode 100644 index 00000000..2a2f7868 Binary files /dev/null and b/assets/stickers/10728.webp differ diff --git a/assets/stickers/10729.webp b/assets/stickers/10729.webp new file mode 100644 index 00000000..a8c0fc32 Binary files /dev/null and b/assets/stickers/10729.webp differ diff --git a/assets/stickers/10730.webp b/assets/stickers/10730.webp new file mode 100644 index 00000000..571d9821 Binary files /dev/null and b/assets/stickers/10730.webp differ diff --git a/assets/stickers/10731.webp b/assets/stickers/10731.webp new file mode 100644 index 00000000..4ef15675 Binary files /dev/null and b/assets/stickers/10731.webp differ diff --git a/assets/stickers/10732.webp b/assets/stickers/10732.webp new file mode 100644 index 00000000..d397c97e Binary files /dev/null and b/assets/stickers/10732.webp differ diff --git a/assets/stickers/10733.webp b/assets/stickers/10733.webp new file mode 100644 index 00000000..e34c0de5 Binary files /dev/null and b/assets/stickers/10733.webp differ diff --git a/assets/stickers/10734.webp b/assets/stickers/10734.webp new file mode 100644 index 00000000..e6a35205 Binary files /dev/null and b/assets/stickers/10734.webp differ diff --git a/assets/stickers/10735.webp b/assets/stickers/10735.webp new file mode 100644 index 00000000..50b9e30d Binary files /dev/null and b/assets/stickers/10735.webp differ diff --git a/assets/stickers/10736.webp b/assets/stickers/10736.webp new file mode 100644 index 00000000..544cc685 Binary files /dev/null and b/assets/stickers/10736.webp differ diff --git a/assets/stickers/10737.webp b/assets/stickers/10737.webp new file mode 100644 index 00000000..ac44860f Binary files /dev/null and b/assets/stickers/10737.webp differ diff --git a/assets/stickers/10738.webp b/assets/stickers/10738.webp new file mode 100644 index 00000000..414503a7 Binary files /dev/null and b/assets/stickers/10738.webp differ diff --git a/assets/stickers/10739.webp b/assets/stickers/10739.webp new file mode 100644 index 00000000..566b2699 Binary files /dev/null and b/assets/stickers/10739.webp differ diff --git a/assets/stickers/10740.webp b/assets/stickers/10740.webp new file mode 100644 index 00000000..eb456a06 Binary files /dev/null and b/assets/stickers/10740.webp differ diff --git a/assets/stickers/10741.webp b/assets/stickers/10741.webp new file mode 100644 index 00000000..c7aacc92 Binary files /dev/null and b/assets/stickers/10741.webp differ diff --git a/assets/stickers/10742.webp b/assets/stickers/10742.webp new file mode 100644 index 00000000..35ce5eea Binary files /dev/null and b/assets/stickers/10742.webp differ diff --git a/assets/stickers/10743.webp b/assets/stickers/10743.webp new file mode 100644 index 00000000..557738b1 Binary files /dev/null and b/assets/stickers/10743.webp differ diff --git a/assets/stickers/10744.webp b/assets/stickers/10744.webp new file mode 100644 index 00000000..49e4e203 Binary files /dev/null and b/assets/stickers/10744.webp differ diff --git a/assets/stickers/10745.webp b/assets/stickers/10745.webp new file mode 100644 index 00000000..4bc3a5c0 Binary files /dev/null and b/assets/stickers/10745.webp differ diff --git a/assets/stickers/10746.webp b/assets/stickers/10746.webp new file mode 100644 index 00000000..8e16ca94 Binary files /dev/null and b/assets/stickers/10746.webp differ diff --git a/assets/stickers/10747.webp b/assets/stickers/10747.webp new file mode 100644 index 00000000..650bb99d Binary files /dev/null and b/assets/stickers/10747.webp differ diff --git a/assets/stickers/10748.webp b/assets/stickers/10748.webp new file mode 100644 index 00000000..24cf5dda Binary files /dev/null and b/assets/stickers/10748.webp differ diff --git a/assets/stickers/10749.webp b/assets/stickers/10749.webp new file mode 100644 index 00000000..d773e8af Binary files /dev/null and b/assets/stickers/10749.webp differ diff --git a/assets/stickers/10750.webp b/assets/stickers/10750.webp new file mode 100644 index 00000000..6145fb8c Binary files /dev/null and b/assets/stickers/10750.webp differ diff --git a/assets/stickers/10751.webp b/assets/stickers/10751.webp new file mode 100644 index 00000000..5fdb20de Binary files /dev/null and b/assets/stickers/10751.webp differ diff --git a/assets/stickers/10752.webp b/assets/stickers/10752.webp new file mode 100644 index 00000000..8642ffd1 Binary files /dev/null and b/assets/stickers/10752.webp differ diff --git a/assets/stickers/10753.webp b/assets/stickers/10753.webp new file mode 100644 index 00000000..02de15d8 Binary files /dev/null and b/assets/stickers/10753.webp differ diff --git a/assets/stickers/10754.webp b/assets/stickers/10754.webp new file mode 100644 index 00000000..0eabe402 Binary files /dev/null and b/assets/stickers/10754.webp differ diff --git a/assets/stickers/10755.webp b/assets/stickers/10755.webp new file mode 100644 index 00000000..ab27f2d7 Binary files /dev/null and b/assets/stickers/10755.webp differ diff --git a/assets/stickers/10756.webp b/assets/stickers/10756.webp new file mode 100644 index 00000000..c01160af Binary files /dev/null and b/assets/stickers/10756.webp differ diff --git a/assets/stickers/10757.webp b/assets/stickers/10757.webp new file mode 100644 index 00000000..7ca624a0 Binary files /dev/null and b/assets/stickers/10757.webp differ diff --git a/assets/stickers/10758.webp b/assets/stickers/10758.webp new file mode 100644 index 00000000..e6b84700 Binary files /dev/null and b/assets/stickers/10758.webp differ diff --git a/assets/stickers/10759.webp b/assets/stickers/10759.webp new file mode 100644 index 00000000..5919cd0a Binary files /dev/null and b/assets/stickers/10759.webp differ diff --git a/assets/stickers/10760.webp b/assets/stickers/10760.webp new file mode 100644 index 00000000..4e324641 Binary files /dev/null and b/assets/stickers/10760.webp differ diff --git a/assets/stickers/10761.webp b/assets/stickers/10761.webp new file mode 100644 index 00000000..827ce24e Binary files /dev/null and b/assets/stickers/10761.webp differ diff --git a/assets/stickers/10762.webp b/assets/stickers/10762.webp new file mode 100644 index 00000000..4f19472d Binary files /dev/null and b/assets/stickers/10762.webp differ diff --git a/assets/stickers/10763.webp b/assets/stickers/10763.webp new file mode 100644 index 00000000..21842cb0 Binary files /dev/null and b/assets/stickers/10763.webp differ diff --git a/assets/stickers/10764.webp b/assets/stickers/10764.webp new file mode 100644 index 00000000..c482ae6d Binary files /dev/null and b/assets/stickers/10764.webp differ diff --git a/assets/stickers/10765.webp b/assets/stickers/10765.webp new file mode 100644 index 00000000..978c133b Binary files /dev/null and b/assets/stickers/10765.webp differ diff --git a/assets/stickers/10766.webp b/assets/stickers/10766.webp new file mode 100644 index 00000000..06052fca Binary files /dev/null and b/assets/stickers/10766.webp differ diff --git a/assets/stickers/10767.webp b/assets/stickers/10767.webp new file mode 100644 index 00000000..507f2c2b Binary files /dev/null and b/assets/stickers/10767.webp differ diff --git a/assets/stickers/10768.webp b/assets/stickers/10768.webp new file mode 100644 index 00000000..b03e2481 Binary files /dev/null and b/assets/stickers/10768.webp differ diff --git a/assets/stickers/10769.webp b/assets/stickers/10769.webp new file mode 100644 index 00000000..de3cd375 Binary files /dev/null and b/assets/stickers/10769.webp differ diff --git a/assets/stickers/10770.webp b/assets/stickers/10770.webp new file mode 100644 index 00000000..14bd78b4 Binary files /dev/null and b/assets/stickers/10770.webp differ diff --git a/assets/stickers/10771.webp b/assets/stickers/10771.webp new file mode 100644 index 00000000..76e5b7bd Binary files /dev/null and b/assets/stickers/10771.webp differ diff --git a/assets/stickers/10772.webp b/assets/stickers/10772.webp new file mode 100644 index 00000000..90820eab Binary files /dev/null and b/assets/stickers/10772.webp differ diff --git a/assets/stickers/10773.webp b/assets/stickers/10773.webp new file mode 100644 index 00000000..c5003000 Binary files /dev/null and b/assets/stickers/10773.webp differ diff --git a/assets/stickers/10774.webp b/assets/stickers/10774.webp new file mode 100644 index 00000000..f622abec Binary files /dev/null and b/assets/stickers/10774.webp differ diff --git a/assets/stickers/10775.webp b/assets/stickers/10775.webp new file mode 100644 index 00000000..34969105 Binary files /dev/null and b/assets/stickers/10775.webp differ diff --git a/assets/stickers/10776.webp b/assets/stickers/10776.webp new file mode 100644 index 00000000..77b723e8 Binary files /dev/null and b/assets/stickers/10776.webp differ diff --git a/assets/stickers/10777.webp b/assets/stickers/10777.webp new file mode 100644 index 00000000..4017a9fe Binary files /dev/null and b/assets/stickers/10777.webp differ diff --git a/assets/stickers/10778.webp b/assets/stickers/10778.webp new file mode 100644 index 00000000..6e33c4f1 Binary files /dev/null and b/assets/stickers/10778.webp differ diff --git a/assets/stickers/10779.webp b/assets/stickers/10779.webp new file mode 100644 index 00000000..946be486 Binary files /dev/null and b/assets/stickers/10779.webp differ diff --git a/assets/stickers/10780.webp b/assets/stickers/10780.webp new file mode 100644 index 00000000..29550f3e Binary files /dev/null and b/assets/stickers/10780.webp differ diff --git a/assets/stickers/10781.webp b/assets/stickers/10781.webp new file mode 100644 index 00000000..48e23db7 Binary files /dev/null and b/assets/stickers/10781.webp differ diff --git a/assets/stickers/10782.webp b/assets/stickers/10782.webp new file mode 100644 index 00000000..b7193380 Binary files /dev/null and b/assets/stickers/10782.webp differ diff --git a/assets/stickers/10783.webp b/assets/stickers/10783.webp new file mode 100644 index 00000000..15d4b2f7 Binary files /dev/null and b/assets/stickers/10783.webp differ diff --git a/assets/stickers/10784.webp b/assets/stickers/10784.webp new file mode 100644 index 00000000..b7823878 Binary files /dev/null and b/assets/stickers/10784.webp differ diff --git a/assets/stickers/10785.webp b/assets/stickers/10785.webp new file mode 100644 index 00000000..f73df0ab Binary files /dev/null and b/assets/stickers/10785.webp differ diff --git a/assets/stickers/10786.webp b/assets/stickers/10786.webp new file mode 100644 index 00000000..04e86740 Binary files /dev/null and b/assets/stickers/10786.webp differ diff --git a/assets/stickers/10787.webp b/assets/stickers/10787.webp new file mode 100644 index 00000000..b749c24c Binary files /dev/null and b/assets/stickers/10787.webp differ diff --git a/assets/stickers/10788.webp b/assets/stickers/10788.webp new file mode 100644 index 00000000..e3468acf Binary files /dev/null and b/assets/stickers/10788.webp differ diff --git a/assets/stickers/10789.webp b/assets/stickers/10789.webp new file mode 100644 index 00000000..e3be42b5 Binary files /dev/null and b/assets/stickers/10789.webp differ diff --git a/assets/stickers/10790.webp b/assets/stickers/10790.webp new file mode 100644 index 00000000..70e699f3 Binary files /dev/null and b/assets/stickers/10790.webp differ diff --git a/assets/stickers/10791.webp b/assets/stickers/10791.webp new file mode 100644 index 00000000..54f85ac7 Binary files /dev/null and b/assets/stickers/10791.webp differ diff --git a/assets/stickers/10792.webp b/assets/stickers/10792.webp new file mode 100644 index 00000000..86042008 Binary files /dev/null and b/assets/stickers/10792.webp differ diff --git a/assets/stickers/10793.webp b/assets/stickers/10793.webp new file mode 100644 index 00000000..4303f38a Binary files /dev/null and b/assets/stickers/10793.webp differ diff --git a/assets/stickers/10794.webp b/assets/stickers/10794.webp new file mode 100644 index 00000000..c3c0c18a Binary files /dev/null and b/assets/stickers/10794.webp differ diff --git a/assets/stickers/10795.webp b/assets/stickers/10795.webp new file mode 100644 index 00000000..7d8fb794 Binary files /dev/null and b/assets/stickers/10795.webp differ diff --git a/assets/stickers/10796.webp b/assets/stickers/10796.webp new file mode 100644 index 00000000..089abdb6 Binary files /dev/null and b/assets/stickers/10796.webp differ diff --git a/assets/stickers/10797.webp b/assets/stickers/10797.webp new file mode 100644 index 00000000..3072755e Binary files /dev/null and b/assets/stickers/10797.webp differ diff --git a/assets/stickers/10798.webp b/assets/stickers/10798.webp new file mode 100644 index 00000000..0390e8e5 Binary files /dev/null and b/assets/stickers/10798.webp differ diff --git a/assets/stickers/10799.webp b/assets/stickers/10799.webp new file mode 100644 index 00000000..b5f33dd8 Binary files /dev/null and b/assets/stickers/10799.webp differ diff --git a/assets/stickers/10800.webp b/assets/stickers/10800.webp new file mode 100644 index 00000000..5c80190e Binary files /dev/null and b/assets/stickers/10800.webp differ diff --git a/assets/stickers/10801.webp b/assets/stickers/10801.webp new file mode 100644 index 00000000..13d8520e Binary files /dev/null and b/assets/stickers/10801.webp differ diff --git a/assets/stickers/10802.webp b/assets/stickers/10802.webp new file mode 100644 index 00000000..0c9d67d3 Binary files /dev/null and b/assets/stickers/10802.webp differ diff --git a/assets/stickers/10803.webp b/assets/stickers/10803.webp new file mode 100644 index 00000000..538a92cb Binary files /dev/null and b/assets/stickers/10803.webp differ diff --git a/assets/stickers/10804.webp b/assets/stickers/10804.webp new file mode 100644 index 00000000..a1165bf1 Binary files /dev/null and b/assets/stickers/10804.webp differ diff --git a/assets/stickers/10805.webp b/assets/stickers/10805.webp new file mode 100644 index 00000000..7aa8e946 Binary files /dev/null and b/assets/stickers/10805.webp differ diff --git a/assets/stickers/10806.webp b/assets/stickers/10806.webp new file mode 100644 index 00000000..529005bf Binary files /dev/null and b/assets/stickers/10806.webp differ diff --git a/assets/stickers/10807.webp b/assets/stickers/10807.webp new file mode 100644 index 00000000..7f8344c2 Binary files /dev/null and b/assets/stickers/10807.webp differ diff --git a/assets/stickers/10808.webp b/assets/stickers/10808.webp new file mode 100644 index 00000000..5e3b70c7 Binary files /dev/null and b/assets/stickers/10808.webp differ diff --git a/assets/stickers/10809.webp b/assets/stickers/10809.webp new file mode 100644 index 00000000..81776582 Binary files /dev/null and b/assets/stickers/10809.webp differ diff --git a/assets/stickers/10810.webp b/assets/stickers/10810.webp new file mode 100644 index 00000000..bdc810b0 Binary files /dev/null and b/assets/stickers/10810.webp differ diff --git a/assets/stickers/10811.webp b/assets/stickers/10811.webp new file mode 100644 index 00000000..0d8957e8 Binary files /dev/null and b/assets/stickers/10811.webp differ diff --git a/assets/stickers/10812.webp b/assets/stickers/10812.webp new file mode 100644 index 00000000..f1b8a10c Binary files /dev/null and b/assets/stickers/10812.webp differ diff --git a/assets/stickers/10813.webp b/assets/stickers/10813.webp new file mode 100644 index 00000000..bb30f65e Binary files /dev/null and b/assets/stickers/10813.webp differ diff --git a/assets/stickers/10814.webp b/assets/stickers/10814.webp new file mode 100644 index 00000000..92cd15f7 Binary files /dev/null and b/assets/stickers/10814.webp differ diff --git a/assets/stickers/10815.webp b/assets/stickers/10815.webp new file mode 100644 index 00000000..7fc2c414 Binary files /dev/null and b/assets/stickers/10815.webp differ diff --git a/assets/stickers/10816.webp b/assets/stickers/10816.webp new file mode 100644 index 00000000..f30f1b0c Binary files /dev/null and b/assets/stickers/10816.webp differ diff --git a/assets/stickers/10817.webp b/assets/stickers/10817.webp new file mode 100644 index 00000000..0ba3fb79 Binary files /dev/null and b/assets/stickers/10817.webp differ diff --git a/assets/stickers/10818.webp b/assets/stickers/10818.webp new file mode 100644 index 00000000..385a320e Binary files /dev/null and b/assets/stickers/10818.webp differ diff --git a/assets/stickers/10819.webp b/assets/stickers/10819.webp new file mode 100644 index 00000000..dc3a44c2 Binary files /dev/null and b/assets/stickers/10819.webp differ diff --git a/assets/stickers/10820.webp b/assets/stickers/10820.webp new file mode 100644 index 00000000..b4d80d45 Binary files /dev/null and b/assets/stickers/10820.webp differ diff --git a/assets/stickers/10821.webp b/assets/stickers/10821.webp new file mode 100644 index 00000000..755cd9b4 Binary files /dev/null and b/assets/stickers/10821.webp differ diff --git a/assets/stickers/10822.webp b/assets/stickers/10822.webp new file mode 100644 index 00000000..5a635b37 Binary files /dev/null and b/assets/stickers/10822.webp differ diff --git a/assets/stickers/10823.webp b/assets/stickers/10823.webp new file mode 100644 index 00000000..15f89e01 Binary files /dev/null and b/assets/stickers/10823.webp differ diff --git a/assets/stickers/10824.webp b/assets/stickers/10824.webp new file mode 100644 index 00000000..517b9cf3 Binary files /dev/null and b/assets/stickers/10824.webp differ diff --git a/assets/stickers/10825.webp b/assets/stickers/10825.webp new file mode 100644 index 00000000..6696e708 Binary files /dev/null and b/assets/stickers/10825.webp differ diff --git a/assets/stickers/10826.webp b/assets/stickers/10826.webp new file mode 100644 index 00000000..a113032f Binary files /dev/null and b/assets/stickers/10826.webp differ diff --git a/assets/stickers/10827.webp b/assets/stickers/10827.webp new file mode 100644 index 00000000..3eb393ad Binary files /dev/null and b/assets/stickers/10827.webp differ diff --git a/assets/stickers/10828.webp b/assets/stickers/10828.webp new file mode 100644 index 00000000..98c33b12 Binary files /dev/null and b/assets/stickers/10828.webp differ diff --git a/assets/stickers/10829.webp b/assets/stickers/10829.webp new file mode 100644 index 00000000..b109370e Binary files /dev/null and b/assets/stickers/10829.webp differ diff --git a/assets/stickers/10830.webp b/assets/stickers/10830.webp new file mode 100644 index 00000000..87f578a7 Binary files /dev/null and b/assets/stickers/10830.webp differ diff --git a/assets/stickers/10831.webp b/assets/stickers/10831.webp new file mode 100644 index 00000000..d35cf89a Binary files /dev/null and b/assets/stickers/10831.webp differ diff --git a/assets/stickers/10832.webp b/assets/stickers/10832.webp new file mode 100644 index 00000000..ac661cd1 Binary files /dev/null and b/assets/stickers/10832.webp differ diff --git a/assets/stickers/10833.webp b/assets/stickers/10833.webp new file mode 100644 index 00000000..fe641a2e Binary files /dev/null and b/assets/stickers/10833.webp differ diff --git a/assets/stickers/10834.webp b/assets/stickers/10834.webp new file mode 100644 index 00000000..10497173 Binary files /dev/null and b/assets/stickers/10834.webp differ diff --git a/assets/stickers/10835.webp b/assets/stickers/10835.webp new file mode 100644 index 00000000..eff4594e Binary files /dev/null and b/assets/stickers/10835.webp differ diff --git a/assets/stickers/10836.webp b/assets/stickers/10836.webp new file mode 100644 index 00000000..27f44b48 Binary files /dev/null and b/assets/stickers/10836.webp differ diff --git a/assets/stickers/10837.webp b/assets/stickers/10837.webp new file mode 100644 index 00000000..379b5f64 Binary files /dev/null and b/assets/stickers/10837.webp differ diff --git a/assets/stickers/10838.webp b/assets/stickers/10838.webp new file mode 100644 index 00000000..2b1dfb6b Binary files /dev/null and b/assets/stickers/10838.webp differ diff --git a/assets/stickers/10839.webp b/assets/stickers/10839.webp new file mode 100644 index 00000000..5ce69521 Binary files /dev/null and b/assets/stickers/10839.webp differ diff --git a/assets/stickers/10840.webp b/assets/stickers/10840.webp new file mode 100644 index 00000000..e53c07a4 Binary files /dev/null and b/assets/stickers/10840.webp differ diff --git a/assets/stickers/10841.webp b/assets/stickers/10841.webp new file mode 100644 index 00000000..d6d1a0ef Binary files /dev/null and b/assets/stickers/10841.webp differ diff --git a/assets/stickers/10842.webp b/assets/stickers/10842.webp new file mode 100644 index 00000000..9732f0a7 Binary files /dev/null and b/assets/stickers/10842.webp differ diff --git a/assets/stickers/10843.webp b/assets/stickers/10843.webp new file mode 100644 index 00000000..bf627eaa Binary files /dev/null and b/assets/stickers/10843.webp differ diff --git a/assets/stickers/10844.webp b/assets/stickers/10844.webp new file mode 100644 index 00000000..546ae733 Binary files /dev/null and b/assets/stickers/10844.webp differ diff --git a/assets/stickers/10845.webp b/assets/stickers/10845.webp new file mode 100644 index 00000000..92359415 Binary files /dev/null and b/assets/stickers/10845.webp differ diff --git a/assets/stickers/10846.webp b/assets/stickers/10846.webp new file mode 100644 index 00000000..e8ea732a Binary files /dev/null and b/assets/stickers/10846.webp differ diff --git a/assets/stickers/10847.webp b/assets/stickers/10847.webp new file mode 100644 index 00000000..02cdd2ee Binary files /dev/null and b/assets/stickers/10847.webp differ diff --git a/assets/stickers/10848.webp b/assets/stickers/10848.webp new file mode 100644 index 00000000..19e3d192 Binary files /dev/null and b/assets/stickers/10848.webp differ diff --git a/assets/stickers/10849.webp b/assets/stickers/10849.webp new file mode 100644 index 00000000..a14b1447 Binary files /dev/null and b/assets/stickers/10849.webp differ diff --git a/assets/stickers/10850.webp b/assets/stickers/10850.webp new file mode 100644 index 00000000..5aed47f5 Binary files /dev/null and b/assets/stickers/10850.webp differ diff --git a/assets/stickers/10851.webp b/assets/stickers/10851.webp new file mode 100644 index 00000000..d251665f Binary files /dev/null and b/assets/stickers/10851.webp differ diff --git a/assets/stickers/10852.webp b/assets/stickers/10852.webp new file mode 100644 index 00000000..d65c0e16 Binary files /dev/null and b/assets/stickers/10852.webp differ diff --git a/assets/stickers/10853.webp b/assets/stickers/10853.webp new file mode 100644 index 00000000..759d10e5 Binary files /dev/null and b/assets/stickers/10853.webp differ diff --git a/assets/stickers/10854.webp b/assets/stickers/10854.webp new file mode 100644 index 00000000..6e595cc8 Binary files /dev/null and b/assets/stickers/10854.webp differ diff --git a/assets/stickers/10855.webp b/assets/stickers/10855.webp new file mode 100644 index 00000000..47d62684 Binary files /dev/null and b/assets/stickers/10855.webp differ diff --git a/assets/stickers/10856.webp b/assets/stickers/10856.webp new file mode 100644 index 00000000..0fdcbb3e Binary files /dev/null and b/assets/stickers/10856.webp differ diff --git a/assets/stickers/10857.webp b/assets/stickers/10857.webp new file mode 100644 index 00000000..db66c1ac Binary files /dev/null and b/assets/stickers/10857.webp differ diff --git a/assets/stickers/10858.webp b/assets/stickers/10858.webp new file mode 100644 index 00000000..bad50310 Binary files /dev/null and b/assets/stickers/10858.webp differ diff --git a/assets/stickers/10859.webp b/assets/stickers/10859.webp new file mode 100644 index 00000000..4d56b67e Binary files /dev/null and b/assets/stickers/10859.webp differ diff --git a/assets/stickers/10860.webp b/assets/stickers/10860.webp new file mode 100644 index 00000000..96a4796c Binary files /dev/null and b/assets/stickers/10860.webp differ diff --git a/assets/stickers/10861.webp b/assets/stickers/10861.webp new file mode 100644 index 00000000..ef408507 Binary files /dev/null and b/assets/stickers/10861.webp differ diff --git a/assets/stickers/10862.webp b/assets/stickers/10862.webp new file mode 100644 index 00000000..2b4aff47 Binary files /dev/null and b/assets/stickers/10862.webp differ diff --git a/assets/stickers/10863.webp b/assets/stickers/10863.webp new file mode 100644 index 00000000..1c50e24a Binary files /dev/null and b/assets/stickers/10863.webp differ diff --git a/assets/stickers/10864.webp b/assets/stickers/10864.webp new file mode 100644 index 00000000..4369b7ad Binary files /dev/null and b/assets/stickers/10864.webp differ diff --git a/assets/stickers/10865.webp b/assets/stickers/10865.webp new file mode 100644 index 00000000..06f8e514 Binary files /dev/null and b/assets/stickers/10865.webp differ diff --git a/assets/stickers/10866.webp b/assets/stickers/10866.webp new file mode 100644 index 00000000..94f29a00 Binary files /dev/null and b/assets/stickers/10866.webp differ diff --git a/assets/stickers/10867.webp b/assets/stickers/10867.webp new file mode 100644 index 00000000..8001c6b4 Binary files /dev/null and b/assets/stickers/10867.webp differ diff --git a/assets/stickers/10868.webp b/assets/stickers/10868.webp new file mode 100644 index 00000000..096eb69f Binary files /dev/null and b/assets/stickers/10868.webp differ diff --git a/assets/stickers/10869.webp b/assets/stickers/10869.webp new file mode 100644 index 00000000..3bb1bf5f Binary files /dev/null and b/assets/stickers/10869.webp differ diff --git a/assets/stickers/10870.webp b/assets/stickers/10870.webp new file mode 100644 index 00000000..883c667e Binary files /dev/null and b/assets/stickers/10870.webp differ diff --git a/assets/stickers/10871.webp b/assets/stickers/10871.webp new file mode 100644 index 00000000..c8d5359a Binary files /dev/null and b/assets/stickers/10871.webp differ diff --git a/assets/stickers/10872.webp b/assets/stickers/10872.webp new file mode 100644 index 00000000..58a7b7b5 Binary files /dev/null and b/assets/stickers/10872.webp differ diff --git a/assets/stickers/10873.webp b/assets/stickers/10873.webp new file mode 100644 index 00000000..9244e2aa Binary files /dev/null and b/assets/stickers/10873.webp differ diff --git a/assets/stickers/10874.webp b/assets/stickers/10874.webp new file mode 100644 index 00000000..fc8607ed Binary files /dev/null and b/assets/stickers/10874.webp differ diff --git a/assets/stickers/10875.webp b/assets/stickers/10875.webp new file mode 100644 index 00000000..c07f51a5 Binary files /dev/null and b/assets/stickers/10875.webp differ diff --git a/assets/stickers/10876.webp b/assets/stickers/10876.webp new file mode 100644 index 00000000..506cae99 Binary files /dev/null and b/assets/stickers/10876.webp differ diff --git a/assets/stickers/10877.webp b/assets/stickers/10877.webp new file mode 100644 index 00000000..abf1d6a5 Binary files /dev/null and b/assets/stickers/10877.webp differ diff --git a/assets/stickers/10878.webp b/assets/stickers/10878.webp new file mode 100644 index 00000000..b5ca3563 Binary files /dev/null and b/assets/stickers/10878.webp differ diff --git a/assets/stickers/10879.webp b/assets/stickers/10879.webp new file mode 100644 index 00000000..2fd405fd Binary files /dev/null and b/assets/stickers/10879.webp differ diff --git a/assets/stickers/10880.webp b/assets/stickers/10880.webp new file mode 100644 index 00000000..bd40ff4f Binary files /dev/null and b/assets/stickers/10880.webp differ diff --git a/assets/stickers/10881.webp b/assets/stickers/10881.webp new file mode 100644 index 00000000..be9f5a24 Binary files /dev/null and b/assets/stickers/10881.webp differ diff --git a/assets/stickers/10882.webp b/assets/stickers/10882.webp new file mode 100644 index 00000000..66ccd21e Binary files /dev/null and b/assets/stickers/10882.webp differ diff --git a/assets/stickers/10883.webp b/assets/stickers/10883.webp new file mode 100644 index 00000000..12e5a89d Binary files /dev/null and b/assets/stickers/10883.webp differ diff --git a/assets/stickers/10884.webp b/assets/stickers/10884.webp new file mode 100644 index 00000000..52260787 Binary files /dev/null and b/assets/stickers/10884.webp differ diff --git a/assets/stickers/10885.webp b/assets/stickers/10885.webp new file mode 100644 index 00000000..cd508754 Binary files /dev/null and b/assets/stickers/10885.webp differ diff --git a/assets/stickers/10886.webp b/assets/stickers/10886.webp new file mode 100644 index 00000000..a8f63832 Binary files /dev/null and b/assets/stickers/10886.webp differ diff --git a/assets/stickers/10887.webp b/assets/stickers/10887.webp new file mode 100644 index 00000000..e46107db Binary files /dev/null and b/assets/stickers/10887.webp differ diff --git a/assets/stickers/10888.webp b/assets/stickers/10888.webp new file mode 100644 index 00000000..60de2764 Binary files /dev/null and b/assets/stickers/10888.webp differ diff --git a/assets/stickers/10889.webp b/assets/stickers/10889.webp new file mode 100644 index 00000000..9775c46a Binary files /dev/null and b/assets/stickers/10889.webp differ diff --git a/assets/stickers/10890.webp b/assets/stickers/10890.webp new file mode 100644 index 00000000..4936f657 Binary files /dev/null and b/assets/stickers/10890.webp differ diff --git a/assets/stickers/10891.webp b/assets/stickers/10891.webp new file mode 100644 index 00000000..96d347f3 Binary files /dev/null and b/assets/stickers/10891.webp differ diff --git a/assets/stickers/10892.webp b/assets/stickers/10892.webp new file mode 100644 index 00000000..50b1d49f Binary files /dev/null and b/assets/stickers/10892.webp differ diff --git a/assets/stickers/10893.webp b/assets/stickers/10893.webp new file mode 100644 index 00000000..0b48119c Binary files /dev/null and b/assets/stickers/10893.webp differ diff --git a/assets/stickers/10894.webp b/assets/stickers/10894.webp new file mode 100644 index 00000000..0c285037 Binary files /dev/null and b/assets/stickers/10894.webp differ diff --git a/assets/stickers/10895.webp b/assets/stickers/10895.webp new file mode 100644 index 00000000..1145c881 Binary files /dev/null and b/assets/stickers/10895.webp differ diff --git a/assets/stickers/10896.webp b/assets/stickers/10896.webp new file mode 100644 index 00000000..cb658048 Binary files /dev/null and b/assets/stickers/10896.webp differ diff --git a/assets/stickers/10897.webp b/assets/stickers/10897.webp new file mode 100644 index 00000000..4231f30e Binary files /dev/null and b/assets/stickers/10897.webp differ diff --git a/assets/stickers/10898.webp b/assets/stickers/10898.webp new file mode 100644 index 00000000..aad9f8e2 Binary files /dev/null and b/assets/stickers/10898.webp differ diff --git a/assets/stickers/10899.webp b/assets/stickers/10899.webp new file mode 100644 index 00000000..ab0c286c Binary files /dev/null and b/assets/stickers/10899.webp differ diff --git a/assets/stickers/10900.webp b/assets/stickers/10900.webp new file mode 100644 index 00000000..ea5d869b Binary files /dev/null and b/assets/stickers/10900.webp differ diff --git a/assets/stickers/10901.webp b/assets/stickers/10901.webp new file mode 100644 index 00000000..9a84ed09 Binary files /dev/null and b/assets/stickers/10901.webp differ diff --git a/assets/stickers/10902.webp b/assets/stickers/10902.webp new file mode 100644 index 00000000..602b206d Binary files /dev/null and b/assets/stickers/10902.webp differ diff --git a/assets/stickers/10903.webp b/assets/stickers/10903.webp new file mode 100644 index 00000000..9db6e714 Binary files /dev/null and b/assets/stickers/10903.webp differ diff --git a/assets/stickers/10904.webp b/assets/stickers/10904.webp new file mode 100644 index 00000000..08c80393 Binary files /dev/null and b/assets/stickers/10904.webp differ diff --git a/assets/stickers/10905.webp b/assets/stickers/10905.webp new file mode 100644 index 00000000..e975b70b Binary files /dev/null and b/assets/stickers/10905.webp differ diff --git a/assets/stickers/10906.webp b/assets/stickers/10906.webp new file mode 100644 index 00000000..019962f8 Binary files /dev/null and b/assets/stickers/10906.webp differ diff --git a/assets/stickers/10907.webp b/assets/stickers/10907.webp new file mode 100644 index 00000000..f76af4d8 Binary files /dev/null and b/assets/stickers/10907.webp differ diff --git a/assets/stickers/10908.webp b/assets/stickers/10908.webp new file mode 100644 index 00000000..a9f2ff1b Binary files /dev/null and b/assets/stickers/10908.webp differ diff --git a/assets/stickers/10909.webp b/assets/stickers/10909.webp new file mode 100644 index 00000000..50103e7f Binary files /dev/null and b/assets/stickers/10909.webp differ diff --git a/assets/stickers/10910.webp b/assets/stickers/10910.webp new file mode 100644 index 00000000..ad7e4b79 Binary files /dev/null and b/assets/stickers/10910.webp differ diff --git a/assets/stickers/10911.webp b/assets/stickers/10911.webp new file mode 100644 index 00000000..c80dddce Binary files /dev/null and b/assets/stickers/10911.webp differ diff --git a/assets/stickers/10912.webp b/assets/stickers/10912.webp new file mode 100644 index 00000000..dd06c543 Binary files /dev/null and b/assets/stickers/10912.webp differ diff --git a/assets/stickers/10913.webp b/assets/stickers/10913.webp new file mode 100644 index 00000000..2a1014ad Binary files /dev/null and b/assets/stickers/10913.webp differ diff --git a/assets/stickers/10914.webp b/assets/stickers/10914.webp new file mode 100644 index 00000000..2179e15c Binary files /dev/null and b/assets/stickers/10914.webp differ diff --git a/assets/stickers/10915.webp b/assets/stickers/10915.webp new file mode 100644 index 00000000..1cbae6f7 Binary files /dev/null and b/assets/stickers/10915.webp differ diff --git a/assets/stickers/10916.webp b/assets/stickers/10916.webp new file mode 100644 index 00000000..a2310579 Binary files /dev/null and b/assets/stickers/10916.webp differ diff --git a/assets/stickers/10917.webp b/assets/stickers/10917.webp new file mode 100644 index 00000000..be94b8d5 Binary files /dev/null and b/assets/stickers/10917.webp differ diff --git a/assets/stickers/10918.webp b/assets/stickers/10918.webp new file mode 100644 index 00000000..add1abdd Binary files /dev/null and b/assets/stickers/10918.webp differ diff --git a/assets/stickers/10919.webp b/assets/stickers/10919.webp new file mode 100644 index 00000000..3d811598 Binary files /dev/null and b/assets/stickers/10919.webp differ diff --git a/assets/stickers/10920.webp b/assets/stickers/10920.webp new file mode 100644 index 00000000..817fe7fa Binary files /dev/null and b/assets/stickers/10920.webp differ diff --git a/assets/stickers/10921.webp b/assets/stickers/10921.webp new file mode 100644 index 00000000..98dfa94c Binary files /dev/null and b/assets/stickers/10921.webp differ diff --git a/assets/stickers/10922.webp b/assets/stickers/10922.webp new file mode 100644 index 00000000..a674a201 Binary files /dev/null and b/assets/stickers/10922.webp differ diff --git a/assets/stickers/10923.webp b/assets/stickers/10923.webp new file mode 100644 index 00000000..37c33b50 Binary files /dev/null and b/assets/stickers/10923.webp differ diff --git a/assets/stickers/10924.webp b/assets/stickers/10924.webp new file mode 100644 index 00000000..84a135e4 Binary files /dev/null and b/assets/stickers/10924.webp differ diff --git a/assets/stickers/10925.webp b/assets/stickers/10925.webp new file mode 100644 index 00000000..6daa695b Binary files /dev/null and b/assets/stickers/10925.webp differ diff --git a/assets/stickers/10926.webp b/assets/stickers/10926.webp new file mode 100644 index 00000000..03fe742c Binary files /dev/null and b/assets/stickers/10926.webp differ diff --git a/assets/stickers/10927.webp b/assets/stickers/10927.webp new file mode 100644 index 00000000..b6289fa3 Binary files /dev/null and b/assets/stickers/10927.webp differ diff --git a/assets/stickers/10928.webp b/assets/stickers/10928.webp new file mode 100644 index 00000000..36aadb2c Binary files /dev/null and b/assets/stickers/10928.webp differ diff --git a/assets/stickers/10929.webp b/assets/stickers/10929.webp new file mode 100644 index 00000000..a4526326 Binary files /dev/null and b/assets/stickers/10929.webp differ diff --git a/assets/stickers/10930.webp b/assets/stickers/10930.webp new file mode 100644 index 00000000..70cb1662 Binary files /dev/null and b/assets/stickers/10930.webp differ diff --git a/assets/stickers/10931.webp b/assets/stickers/10931.webp new file mode 100644 index 00000000..763f828c Binary files /dev/null and b/assets/stickers/10931.webp differ diff --git a/assets/stickers/10932.webp b/assets/stickers/10932.webp new file mode 100644 index 00000000..67dab0be Binary files /dev/null and b/assets/stickers/10932.webp differ diff --git a/assets/stickers/10933.webp b/assets/stickers/10933.webp new file mode 100644 index 00000000..9c55ad73 Binary files /dev/null and b/assets/stickers/10933.webp differ diff --git a/assets/stickers/10934.webp b/assets/stickers/10934.webp new file mode 100644 index 00000000..e86106c4 Binary files /dev/null and b/assets/stickers/10934.webp differ diff --git a/assets/stickers/10935.webp b/assets/stickers/10935.webp new file mode 100644 index 00000000..e5adeac8 Binary files /dev/null and b/assets/stickers/10935.webp differ diff --git a/assets/stickers/10936.webp b/assets/stickers/10936.webp new file mode 100644 index 00000000..90cf38c7 Binary files /dev/null and b/assets/stickers/10936.webp differ diff --git a/assets/stickers/10937.webp b/assets/stickers/10937.webp new file mode 100644 index 00000000..d2531ea3 Binary files /dev/null and b/assets/stickers/10937.webp differ diff --git a/assets/stickers/10938.webp b/assets/stickers/10938.webp new file mode 100644 index 00000000..88e93a3c Binary files /dev/null and b/assets/stickers/10938.webp differ diff --git a/assets/stickers/10939.webp b/assets/stickers/10939.webp new file mode 100644 index 00000000..99030149 Binary files /dev/null and b/assets/stickers/10939.webp differ diff --git a/assets/stickers/10940.webp b/assets/stickers/10940.webp new file mode 100644 index 00000000..2bea1814 Binary files /dev/null and b/assets/stickers/10940.webp differ diff --git a/assets/stickers/10941.webp b/assets/stickers/10941.webp new file mode 100644 index 00000000..3e1b89d5 Binary files /dev/null and b/assets/stickers/10941.webp differ diff --git a/assets/stickers/10942.webp b/assets/stickers/10942.webp new file mode 100644 index 00000000..d832fd55 Binary files /dev/null and b/assets/stickers/10942.webp differ diff --git a/assets/stickers/10943.webp b/assets/stickers/10943.webp new file mode 100644 index 00000000..09d673bf Binary files /dev/null and b/assets/stickers/10943.webp differ diff --git a/assets/stickers/10944.webp b/assets/stickers/10944.webp new file mode 100644 index 00000000..ba00dfe1 Binary files /dev/null and b/assets/stickers/10944.webp differ diff --git a/assets/stickers/10945.webp b/assets/stickers/10945.webp new file mode 100644 index 00000000..0ee24621 Binary files /dev/null and b/assets/stickers/10945.webp differ diff --git a/assets/stickers/10946.webp b/assets/stickers/10946.webp new file mode 100644 index 00000000..0b64668d Binary files /dev/null and b/assets/stickers/10946.webp differ diff --git a/assets/stickers/10947.webp b/assets/stickers/10947.webp new file mode 100644 index 00000000..22ad04c3 Binary files /dev/null and b/assets/stickers/10947.webp differ diff --git a/assets/stickers/10948.webp b/assets/stickers/10948.webp new file mode 100644 index 00000000..54b3ebdf Binary files /dev/null and b/assets/stickers/10948.webp differ diff --git a/assets/stickers/10949.webp b/assets/stickers/10949.webp new file mode 100644 index 00000000..ce426310 Binary files /dev/null and b/assets/stickers/10949.webp differ diff --git a/assets/stickers/10950.webp b/assets/stickers/10950.webp new file mode 100644 index 00000000..abde6e35 Binary files /dev/null and b/assets/stickers/10950.webp differ diff --git a/assets/stickers/10951.webp b/assets/stickers/10951.webp new file mode 100644 index 00000000..23b46293 Binary files /dev/null and b/assets/stickers/10951.webp differ diff --git a/assets/stickers/10952.webp b/assets/stickers/10952.webp new file mode 100644 index 00000000..310b126c Binary files /dev/null and b/assets/stickers/10952.webp differ diff --git a/assets/stickers/10953.webp b/assets/stickers/10953.webp new file mode 100644 index 00000000..6694ec0b Binary files /dev/null and b/assets/stickers/10953.webp differ diff --git a/assets/stickers/10954.webp b/assets/stickers/10954.webp new file mode 100644 index 00000000..591c7761 Binary files /dev/null and b/assets/stickers/10954.webp differ diff --git a/assets/stickers/10955.webp b/assets/stickers/10955.webp new file mode 100644 index 00000000..1e1265db Binary files /dev/null and b/assets/stickers/10955.webp differ diff --git a/assets/stickers/10956.webp b/assets/stickers/10956.webp new file mode 100644 index 00000000..53f9eef9 Binary files /dev/null and b/assets/stickers/10956.webp differ diff --git a/assets/stickers/10957.webp b/assets/stickers/10957.webp new file mode 100644 index 00000000..202d5b8f Binary files /dev/null and b/assets/stickers/10957.webp differ diff --git a/assets/stickers/10958.webp b/assets/stickers/10958.webp new file mode 100644 index 00000000..dafb438a Binary files /dev/null and b/assets/stickers/10958.webp differ diff --git a/assets/stickers/10959.webp b/assets/stickers/10959.webp new file mode 100644 index 00000000..fcc7f7aa Binary files /dev/null and b/assets/stickers/10959.webp differ diff --git a/assets/stickers/10960.webp b/assets/stickers/10960.webp new file mode 100644 index 00000000..83fa2b94 Binary files /dev/null and b/assets/stickers/10960.webp differ diff --git a/assets/stickers/10961.webp b/assets/stickers/10961.webp new file mode 100644 index 00000000..dafcbb7f Binary files /dev/null and b/assets/stickers/10961.webp differ diff --git a/assets/stickers/10962.webp b/assets/stickers/10962.webp new file mode 100644 index 00000000..856a3318 Binary files /dev/null and b/assets/stickers/10962.webp differ diff --git a/assets/stickers/10963.webp b/assets/stickers/10963.webp new file mode 100644 index 00000000..357e791b Binary files /dev/null and b/assets/stickers/10963.webp differ diff --git a/assets/stickers/10964.webp b/assets/stickers/10964.webp new file mode 100644 index 00000000..79898e09 Binary files /dev/null and b/assets/stickers/10964.webp differ diff --git a/assets/stickers/10965.webp b/assets/stickers/10965.webp new file mode 100644 index 00000000..05ed3777 Binary files /dev/null and b/assets/stickers/10965.webp differ diff --git a/assets/stickers/10966.webp b/assets/stickers/10966.webp new file mode 100644 index 00000000..b178d932 Binary files /dev/null and b/assets/stickers/10966.webp differ diff --git a/assets/stickers/10967.webp b/assets/stickers/10967.webp new file mode 100644 index 00000000..0183a49b Binary files /dev/null and b/assets/stickers/10967.webp differ diff --git a/assets/stickers/10968.webp b/assets/stickers/10968.webp new file mode 100644 index 00000000..058e57ab Binary files /dev/null and b/assets/stickers/10968.webp differ diff --git a/assets/stickers/10969.webp b/assets/stickers/10969.webp new file mode 100644 index 00000000..e33fe7e6 Binary files /dev/null and b/assets/stickers/10969.webp differ diff --git a/assets/stickers/10970.webp b/assets/stickers/10970.webp new file mode 100644 index 00000000..6deb3254 Binary files /dev/null and b/assets/stickers/10970.webp differ diff --git a/assets/stickers/10971.webp b/assets/stickers/10971.webp new file mode 100644 index 00000000..cfd3dcc6 Binary files /dev/null and b/assets/stickers/10971.webp differ diff --git a/assets/stickers/10972.webp b/assets/stickers/10972.webp new file mode 100644 index 00000000..edd39c5d Binary files /dev/null and b/assets/stickers/10972.webp differ diff --git a/assets/stickers/10973.webp b/assets/stickers/10973.webp new file mode 100644 index 00000000..b8968e5f Binary files /dev/null and b/assets/stickers/10973.webp differ diff --git a/assets/stickers/10974.webp b/assets/stickers/10974.webp new file mode 100644 index 00000000..69fbd711 Binary files /dev/null and b/assets/stickers/10974.webp differ diff --git a/assets/stickers/10975.webp b/assets/stickers/10975.webp new file mode 100644 index 00000000..f16b14eb Binary files /dev/null and b/assets/stickers/10975.webp differ diff --git a/assets/stickers/10976.webp b/assets/stickers/10976.webp new file mode 100644 index 00000000..a70c6039 Binary files /dev/null and b/assets/stickers/10976.webp differ diff --git a/assets/stickers/10977.webp b/assets/stickers/10977.webp new file mode 100644 index 00000000..df87375b Binary files /dev/null and b/assets/stickers/10977.webp differ diff --git a/assets/stickers/10978.webp b/assets/stickers/10978.webp new file mode 100644 index 00000000..f3f835f2 Binary files /dev/null and b/assets/stickers/10978.webp differ diff --git a/assets/stickers/10979.webp b/assets/stickers/10979.webp new file mode 100644 index 00000000..9b3b6265 Binary files /dev/null and b/assets/stickers/10979.webp differ diff --git a/assets/stickers/10980.webp b/assets/stickers/10980.webp new file mode 100644 index 00000000..f1518fe2 Binary files /dev/null and b/assets/stickers/10980.webp differ diff --git a/assets/stickers/10981.webp b/assets/stickers/10981.webp new file mode 100644 index 00000000..da1ce1bf Binary files /dev/null and b/assets/stickers/10981.webp differ diff --git a/assets/stickers/10982.webp b/assets/stickers/10982.webp new file mode 100644 index 00000000..956f6e89 Binary files /dev/null and b/assets/stickers/10982.webp differ diff --git a/assets/stickers/10983.webp b/assets/stickers/10983.webp new file mode 100644 index 00000000..db180277 Binary files /dev/null and b/assets/stickers/10983.webp differ diff --git a/assets/stickers/10984.webp b/assets/stickers/10984.webp new file mode 100644 index 00000000..b2676adc Binary files /dev/null and b/assets/stickers/10984.webp differ diff --git a/assets/stickers/10985.webp b/assets/stickers/10985.webp new file mode 100644 index 00000000..c931cd92 Binary files /dev/null and b/assets/stickers/10985.webp differ diff --git a/assets/stickers/10986.webp b/assets/stickers/10986.webp new file mode 100644 index 00000000..46adb9e7 Binary files /dev/null and b/assets/stickers/10986.webp differ diff --git a/assets/stickers/10987.webp b/assets/stickers/10987.webp new file mode 100644 index 00000000..a21e9552 Binary files /dev/null and b/assets/stickers/10987.webp differ diff --git a/assets/stickers/10988.webp b/assets/stickers/10988.webp new file mode 100644 index 00000000..f0f4f448 Binary files /dev/null and b/assets/stickers/10988.webp differ diff --git a/assets/stickers/10989.webp b/assets/stickers/10989.webp new file mode 100644 index 00000000..e2217e03 Binary files /dev/null and b/assets/stickers/10989.webp differ diff --git a/assets/stickers/10990.webp b/assets/stickers/10990.webp new file mode 100644 index 00000000..8164d094 Binary files /dev/null and b/assets/stickers/10990.webp differ diff --git a/assets/stickers/10991.webp b/assets/stickers/10991.webp new file mode 100644 index 00000000..e863e676 Binary files /dev/null and b/assets/stickers/10991.webp differ diff --git a/assets/stickers/10992.webp b/assets/stickers/10992.webp new file mode 100644 index 00000000..4e2adbb8 Binary files /dev/null and b/assets/stickers/10992.webp differ diff --git a/assets/stickers/10993.webp b/assets/stickers/10993.webp new file mode 100644 index 00000000..bd28063b Binary files /dev/null and b/assets/stickers/10993.webp differ diff --git a/assets/stickers/10994.webp b/assets/stickers/10994.webp new file mode 100644 index 00000000..c87875a1 Binary files /dev/null and b/assets/stickers/10994.webp differ diff --git a/assets/stickers/10995.webp b/assets/stickers/10995.webp new file mode 100644 index 00000000..248e0f35 Binary files /dev/null and b/assets/stickers/10995.webp differ diff --git a/assets/stickers/10996.webp b/assets/stickers/10996.webp new file mode 100644 index 00000000..acc1dec3 Binary files /dev/null and b/assets/stickers/10996.webp differ diff --git a/assets/stickers/10997.webp b/assets/stickers/10997.webp new file mode 100644 index 00000000..d9fad9f6 Binary files /dev/null and b/assets/stickers/10997.webp differ diff --git a/assets/stickers/10998.webp b/assets/stickers/10998.webp new file mode 100644 index 00000000..c9531018 Binary files /dev/null and b/assets/stickers/10998.webp differ diff --git a/assets/stickers/10999.webp b/assets/stickers/10999.webp new file mode 100644 index 00000000..b11dbe59 Binary files /dev/null and b/assets/stickers/10999.webp differ diff --git a/assets/stickers/11000.webp b/assets/stickers/11000.webp new file mode 100644 index 00000000..a3986307 Binary files /dev/null and b/assets/stickers/11000.webp differ diff --git a/assets/stickers/11001.webp b/assets/stickers/11001.webp new file mode 100644 index 00000000..38de7239 Binary files /dev/null and b/assets/stickers/11001.webp differ diff --git a/assets/stickers/11002.webp b/assets/stickers/11002.webp new file mode 100644 index 00000000..aeca794d Binary files /dev/null and b/assets/stickers/11002.webp differ diff --git a/assets/stickers/11003.webp b/assets/stickers/11003.webp new file mode 100644 index 00000000..d3a58d02 Binary files /dev/null and b/assets/stickers/11003.webp differ diff --git a/assets/stickers/11004.webp b/assets/stickers/11004.webp new file mode 100644 index 00000000..83c417a0 Binary files /dev/null and b/assets/stickers/11004.webp differ diff --git a/assets/stickers/11005.webp b/assets/stickers/11005.webp new file mode 100644 index 00000000..ea760d34 Binary files /dev/null and b/assets/stickers/11005.webp differ diff --git a/assets/stickers/11006.webp b/assets/stickers/11006.webp new file mode 100644 index 00000000..ef545c4d Binary files /dev/null and b/assets/stickers/11006.webp differ diff --git a/assets/stickers/11007.webp b/assets/stickers/11007.webp new file mode 100644 index 00000000..8ce8e272 Binary files /dev/null and b/assets/stickers/11007.webp differ diff --git a/assets/stickers/11008.webp b/assets/stickers/11008.webp new file mode 100644 index 00000000..f4d79d97 Binary files /dev/null and b/assets/stickers/11008.webp differ diff --git a/assets/stickers/11009.webp b/assets/stickers/11009.webp new file mode 100644 index 00000000..2a3e2e81 Binary files /dev/null and b/assets/stickers/11009.webp differ diff --git a/assets/stickers/11010.webp b/assets/stickers/11010.webp new file mode 100644 index 00000000..fa45ea22 Binary files /dev/null and b/assets/stickers/11010.webp differ diff --git a/assets/stickers/11011.webp b/assets/stickers/11011.webp new file mode 100644 index 00000000..2a8cddba Binary files /dev/null and b/assets/stickers/11011.webp differ diff --git a/assets/stickers/11012.webp b/assets/stickers/11012.webp new file mode 100644 index 00000000..d1831018 Binary files /dev/null and b/assets/stickers/11012.webp differ diff --git a/assets/stickers/11013.webp b/assets/stickers/11013.webp new file mode 100644 index 00000000..ca9cb474 Binary files /dev/null and b/assets/stickers/11013.webp differ diff --git a/assets/stickers/11014.webp b/assets/stickers/11014.webp new file mode 100644 index 00000000..1ae83e12 Binary files /dev/null and b/assets/stickers/11014.webp differ diff --git a/assets/stickers/11015.webp b/assets/stickers/11015.webp new file mode 100644 index 00000000..5368b0d1 Binary files /dev/null and b/assets/stickers/11015.webp differ diff --git a/assets/stickers/11016.webp b/assets/stickers/11016.webp new file mode 100644 index 00000000..a04ccaf3 Binary files /dev/null and b/assets/stickers/11016.webp differ diff --git a/assets/stickers/11017.webp b/assets/stickers/11017.webp new file mode 100644 index 00000000..bb90e99a Binary files /dev/null and b/assets/stickers/11017.webp differ diff --git a/assets/stickers/11018.webp b/assets/stickers/11018.webp new file mode 100644 index 00000000..5214db28 Binary files /dev/null and b/assets/stickers/11018.webp differ diff --git a/assets/stickers/11019.webp b/assets/stickers/11019.webp new file mode 100644 index 00000000..7c2eef69 Binary files /dev/null and b/assets/stickers/11019.webp differ diff --git a/assets/stickers/11020.webp b/assets/stickers/11020.webp new file mode 100644 index 00000000..9074501d Binary files /dev/null and b/assets/stickers/11020.webp differ diff --git a/assets/stickers/11021.webp b/assets/stickers/11021.webp new file mode 100644 index 00000000..d66525c0 Binary files /dev/null and b/assets/stickers/11021.webp differ diff --git a/assets/stickers/11022.webp b/assets/stickers/11022.webp new file mode 100644 index 00000000..74755aad Binary files /dev/null and b/assets/stickers/11022.webp differ diff --git a/assets/stickers/11023.webp b/assets/stickers/11023.webp new file mode 100644 index 00000000..95be31f9 Binary files /dev/null and b/assets/stickers/11023.webp differ diff --git a/assets/stickers/11024.webp b/assets/stickers/11024.webp new file mode 100644 index 00000000..153aa912 Binary files /dev/null and b/assets/stickers/11024.webp differ diff --git a/assets/stickers/11025.webp b/assets/stickers/11025.webp new file mode 100644 index 00000000..21f2e799 Binary files /dev/null and b/assets/stickers/11025.webp differ diff --git a/assets/stickers/11026.webp b/assets/stickers/11026.webp new file mode 100644 index 00000000..b470331c Binary files /dev/null and b/assets/stickers/11026.webp differ diff --git a/assets/stickers/11027.webp b/assets/stickers/11027.webp new file mode 100644 index 00000000..ee0851e5 Binary files /dev/null and b/assets/stickers/11027.webp differ diff --git a/assets/stickers/11028.webp b/assets/stickers/11028.webp new file mode 100644 index 00000000..542e1f53 Binary files /dev/null and b/assets/stickers/11028.webp differ diff --git a/assets/stickers/11029.webp b/assets/stickers/11029.webp new file mode 100644 index 00000000..7697fae9 Binary files /dev/null and b/assets/stickers/11029.webp differ diff --git a/assets/stickers/11030.webp b/assets/stickers/11030.webp new file mode 100644 index 00000000..bfaba4e3 Binary files /dev/null and b/assets/stickers/11030.webp differ diff --git a/assets/stickers/11031.webp b/assets/stickers/11031.webp new file mode 100644 index 00000000..cf1be796 Binary files /dev/null and b/assets/stickers/11031.webp differ diff --git a/assets/stickers/11032.webp b/assets/stickers/11032.webp new file mode 100644 index 00000000..732302c9 Binary files /dev/null and b/assets/stickers/11032.webp differ diff --git a/assets/stickers/11033.webp b/assets/stickers/11033.webp new file mode 100644 index 00000000..838cec77 Binary files /dev/null and b/assets/stickers/11033.webp differ diff --git a/assets/stickers/11034.webp b/assets/stickers/11034.webp new file mode 100644 index 00000000..6a663d0b Binary files /dev/null and b/assets/stickers/11034.webp differ diff --git a/assets/stickers/11035.webp b/assets/stickers/11035.webp new file mode 100644 index 00000000..591d9aa0 Binary files /dev/null and b/assets/stickers/11035.webp differ diff --git a/assets/stickers/11036.webp b/assets/stickers/11036.webp new file mode 100644 index 00000000..51971920 Binary files /dev/null and b/assets/stickers/11036.webp differ diff --git a/assets/stickers/11037.webp b/assets/stickers/11037.webp new file mode 100644 index 00000000..a5b9f6a5 Binary files /dev/null and b/assets/stickers/11037.webp differ diff --git a/assets/stickers/11038.webp b/assets/stickers/11038.webp new file mode 100644 index 00000000..a14c4552 Binary files /dev/null and b/assets/stickers/11038.webp differ diff --git a/assets/stickers/11039.webp b/assets/stickers/11039.webp new file mode 100644 index 00000000..fc2b14de Binary files /dev/null and b/assets/stickers/11039.webp differ diff --git a/assets/stickers/11040.webp b/assets/stickers/11040.webp new file mode 100644 index 00000000..e384e8f2 Binary files /dev/null and b/assets/stickers/11040.webp differ diff --git a/assets/stickers/11041.webp b/assets/stickers/11041.webp new file mode 100644 index 00000000..7b2b5d79 Binary files /dev/null and b/assets/stickers/11041.webp differ diff --git a/assets/stickers/11042.webp b/assets/stickers/11042.webp new file mode 100644 index 00000000..7b0b7bdf Binary files /dev/null and b/assets/stickers/11042.webp differ diff --git a/assets/stickers/11043.webp b/assets/stickers/11043.webp new file mode 100644 index 00000000..0003a16a Binary files /dev/null and b/assets/stickers/11043.webp differ diff --git a/assets/stickers/11044.webp b/assets/stickers/11044.webp new file mode 100644 index 00000000..24e78838 Binary files /dev/null and b/assets/stickers/11044.webp differ diff --git a/assets/stickers/11045.webp b/assets/stickers/11045.webp new file mode 100644 index 00000000..a8b8e3de Binary files /dev/null and b/assets/stickers/11045.webp differ diff --git a/assets/stickers/11046.webp b/assets/stickers/11046.webp new file mode 100644 index 00000000..1b042a2b Binary files /dev/null and b/assets/stickers/11046.webp differ diff --git a/assets/stickers/11047.webp b/assets/stickers/11047.webp new file mode 100644 index 00000000..c7ac5f9b Binary files /dev/null and b/assets/stickers/11047.webp differ diff --git a/assets/stickers/11048.webp b/assets/stickers/11048.webp new file mode 100644 index 00000000..d7ba6db6 Binary files /dev/null and b/assets/stickers/11048.webp differ diff --git a/assets/stickers/11049.webp b/assets/stickers/11049.webp new file mode 100644 index 00000000..b6210b4b Binary files /dev/null and b/assets/stickers/11049.webp differ diff --git a/assets/stickers/11050.webp b/assets/stickers/11050.webp new file mode 100644 index 00000000..91501cdb Binary files /dev/null and b/assets/stickers/11050.webp differ diff --git a/assets/stickers/11051.webp b/assets/stickers/11051.webp new file mode 100644 index 00000000..6035d183 Binary files /dev/null and b/assets/stickers/11051.webp differ diff --git a/assets/stickers/11052.webp b/assets/stickers/11052.webp new file mode 100644 index 00000000..ed86fb3e Binary files /dev/null and b/assets/stickers/11052.webp differ diff --git a/assets/stickers/11053.webp b/assets/stickers/11053.webp new file mode 100644 index 00000000..9a77b7ed Binary files /dev/null and b/assets/stickers/11053.webp differ diff --git a/assets/stickers/11054.webp b/assets/stickers/11054.webp new file mode 100644 index 00000000..fb96f835 Binary files /dev/null and b/assets/stickers/11054.webp differ diff --git a/assets/stickers/11055.webp b/assets/stickers/11055.webp new file mode 100644 index 00000000..85d35af8 Binary files /dev/null and b/assets/stickers/11055.webp differ diff --git a/assets/stickers/11056.webp b/assets/stickers/11056.webp new file mode 100644 index 00000000..abbe816a Binary files /dev/null and b/assets/stickers/11056.webp differ diff --git a/assets/stickers/11057.webp b/assets/stickers/11057.webp new file mode 100644 index 00000000..ec8a46c5 Binary files /dev/null and b/assets/stickers/11057.webp differ diff --git a/assets/stickers/11058.webp b/assets/stickers/11058.webp new file mode 100644 index 00000000..7a331c9b Binary files /dev/null and b/assets/stickers/11058.webp differ diff --git a/assets/stickers/11059.webp b/assets/stickers/11059.webp new file mode 100644 index 00000000..ce239db0 Binary files /dev/null and b/assets/stickers/11059.webp differ diff --git a/assets/stickers/11060.webp b/assets/stickers/11060.webp new file mode 100644 index 00000000..57a861f5 Binary files /dev/null and b/assets/stickers/11060.webp differ diff --git a/assets/stickers/11061.webp b/assets/stickers/11061.webp new file mode 100644 index 00000000..089fbf8d Binary files /dev/null and b/assets/stickers/11061.webp differ diff --git a/assets/stickers/11062.webp b/assets/stickers/11062.webp new file mode 100644 index 00000000..332e2eb8 Binary files /dev/null and b/assets/stickers/11062.webp differ diff --git a/assets/stickers/11063.webp b/assets/stickers/11063.webp new file mode 100644 index 00000000..6ddd1294 Binary files /dev/null and b/assets/stickers/11063.webp differ diff --git a/assets/stickers/11064.webp b/assets/stickers/11064.webp new file mode 100644 index 00000000..1ac3ceb9 Binary files /dev/null and b/assets/stickers/11064.webp differ diff --git a/assets/stickers/11065.webp b/assets/stickers/11065.webp new file mode 100644 index 00000000..2415fa47 Binary files /dev/null and b/assets/stickers/11065.webp differ diff --git a/assets/stickers/11066.webp b/assets/stickers/11066.webp new file mode 100644 index 00000000..10af434b Binary files /dev/null and b/assets/stickers/11066.webp differ diff --git a/assets/stickers/11067.webp b/assets/stickers/11067.webp new file mode 100644 index 00000000..8976f1e9 Binary files /dev/null and b/assets/stickers/11067.webp differ diff --git a/assets/stickers/11068.webp b/assets/stickers/11068.webp new file mode 100644 index 00000000..c3e2545e Binary files /dev/null and b/assets/stickers/11068.webp differ diff --git a/assets/stickers/11069.webp b/assets/stickers/11069.webp new file mode 100644 index 00000000..afd716d4 Binary files /dev/null and b/assets/stickers/11069.webp differ diff --git a/assets/stickers/11070.webp b/assets/stickers/11070.webp new file mode 100644 index 00000000..4d4b9fad Binary files /dev/null and b/assets/stickers/11070.webp differ diff --git a/assets/stickers/11071.webp b/assets/stickers/11071.webp new file mode 100644 index 00000000..92fb8038 Binary files /dev/null and b/assets/stickers/11071.webp differ diff --git a/assets/stickers/11072.webp b/assets/stickers/11072.webp new file mode 100644 index 00000000..4b74eeac Binary files /dev/null and b/assets/stickers/11072.webp differ diff --git a/assets/stickers/11073.webp b/assets/stickers/11073.webp new file mode 100644 index 00000000..a87a73ef Binary files /dev/null and b/assets/stickers/11073.webp differ diff --git a/assets/stickers/11074.webp b/assets/stickers/11074.webp new file mode 100644 index 00000000..927d5648 Binary files /dev/null and b/assets/stickers/11074.webp differ diff --git a/assets/stickers/11075.webp b/assets/stickers/11075.webp new file mode 100644 index 00000000..92742af9 Binary files /dev/null and b/assets/stickers/11075.webp differ diff --git a/assets/stickers/11076.webp b/assets/stickers/11076.webp new file mode 100644 index 00000000..d7817926 Binary files /dev/null and b/assets/stickers/11076.webp differ diff --git a/assets/stickers/11077.webp b/assets/stickers/11077.webp new file mode 100644 index 00000000..dc910af4 Binary files /dev/null and b/assets/stickers/11077.webp differ diff --git a/assets/stickers/11078.webp b/assets/stickers/11078.webp new file mode 100644 index 00000000..b625b4fe Binary files /dev/null and b/assets/stickers/11078.webp differ diff --git a/assets/stickers/11079.webp b/assets/stickers/11079.webp new file mode 100644 index 00000000..22f2645d Binary files /dev/null and b/assets/stickers/11079.webp differ diff --git a/assets/stickers/11080.webp b/assets/stickers/11080.webp new file mode 100644 index 00000000..835a81fa Binary files /dev/null and b/assets/stickers/11080.webp differ diff --git a/assets/stickers/11081.webp b/assets/stickers/11081.webp new file mode 100644 index 00000000..1123d056 Binary files /dev/null and b/assets/stickers/11081.webp differ diff --git a/assets/stickers/11082.webp b/assets/stickers/11082.webp new file mode 100644 index 00000000..7cc44d1e Binary files /dev/null and b/assets/stickers/11082.webp differ diff --git a/assets/stickers/11083.webp b/assets/stickers/11083.webp new file mode 100644 index 00000000..cbbcc5d4 Binary files /dev/null and b/assets/stickers/11083.webp differ diff --git a/assets/stickers/11084.webp b/assets/stickers/11084.webp new file mode 100644 index 00000000..34359878 Binary files /dev/null and b/assets/stickers/11084.webp differ diff --git a/assets/stickers/11085.webp b/assets/stickers/11085.webp new file mode 100644 index 00000000..f63cd7d4 Binary files /dev/null and b/assets/stickers/11085.webp differ diff --git a/assets/stickers/11086.webp b/assets/stickers/11086.webp new file mode 100644 index 00000000..75d922bc Binary files /dev/null and b/assets/stickers/11086.webp differ diff --git a/assets/stickers/11087.webp b/assets/stickers/11087.webp new file mode 100644 index 00000000..eebac91a Binary files /dev/null and b/assets/stickers/11087.webp differ diff --git a/assets/stickers/11088.webp b/assets/stickers/11088.webp new file mode 100644 index 00000000..6d4dc7e9 Binary files /dev/null and b/assets/stickers/11088.webp differ diff --git a/assets/stickers/11089.webp b/assets/stickers/11089.webp new file mode 100644 index 00000000..cd6e59c0 Binary files /dev/null and b/assets/stickers/11089.webp differ diff --git a/assets/stickers/11090.webp b/assets/stickers/11090.webp new file mode 100644 index 00000000..3d11b11f Binary files /dev/null and b/assets/stickers/11090.webp differ diff --git a/assets/stickers/11091.webp b/assets/stickers/11091.webp new file mode 100644 index 00000000..973cae8a Binary files /dev/null and b/assets/stickers/11091.webp differ diff --git a/assets/stickers/11092.webp b/assets/stickers/11092.webp new file mode 100644 index 00000000..415e0aac Binary files /dev/null and b/assets/stickers/11092.webp differ diff --git a/assets/stickers/11093.webp b/assets/stickers/11093.webp new file mode 100644 index 00000000..ce14bee3 Binary files /dev/null and b/assets/stickers/11093.webp differ diff --git a/assets/stickers/11094.webp b/assets/stickers/11094.webp new file mode 100644 index 00000000..14a48df8 Binary files /dev/null and b/assets/stickers/11094.webp differ diff --git a/assets/stickers/11095.webp b/assets/stickers/11095.webp new file mode 100644 index 00000000..6bc1d73c Binary files /dev/null and b/assets/stickers/11095.webp differ diff --git a/assets/stickers/11096.webp b/assets/stickers/11096.webp new file mode 100644 index 00000000..57d2d711 Binary files /dev/null and b/assets/stickers/11096.webp differ diff --git a/assets/stickers/11097.webp b/assets/stickers/11097.webp new file mode 100644 index 00000000..503d392a Binary files /dev/null and b/assets/stickers/11097.webp differ diff --git a/assets/stickers/11098.webp b/assets/stickers/11098.webp new file mode 100644 index 00000000..9f877b58 Binary files /dev/null and b/assets/stickers/11098.webp differ diff --git a/assets/stickers/11099.webp b/assets/stickers/11099.webp new file mode 100644 index 00000000..8478f8cb Binary files /dev/null and b/assets/stickers/11099.webp differ diff --git a/assets/stickers/11100.webp b/assets/stickers/11100.webp new file mode 100644 index 00000000..0bf06d4b Binary files /dev/null and b/assets/stickers/11100.webp differ diff --git a/assets/stickers/11101.webp b/assets/stickers/11101.webp new file mode 100644 index 00000000..493e1dd2 Binary files /dev/null and b/assets/stickers/11101.webp differ diff --git a/assets/stickers/11102.webp b/assets/stickers/11102.webp new file mode 100644 index 00000000..827b6105 Binary files /dev/null and b/assets/stickers/11102.webp differ diff --git a/assets/stickers/11103.webp b/assets/stickers/11103.webp new file mode 100644 index 00000000..0a759ccc Binary files /dev/null and b/assets/stickers/11103.webp differ diff --git a/assets/stickers/11104.webp b/assets/stickers/11104.webp new file mode 100644 index 00000000..6962596e Binary files /dev/null and b/assets/stickers/11104.webp differ diff --git a/assets/stickers/11105.webp b/assets/stickers/11105.webp new file mode 100644 index 00000000..a6182a00 Binary files /dev/null and b/assets/stickers/11105.webp differ diff --git a/assets/stickers/11106.webp b/assets/stickers/11106.webp new file mode 100644 index 00000000..be2e1756 Binary files /dev/null and b/assets/stickers/11106.webp differ diff --git a/assets/stickers/11107.webp b/assets/stickers/11107.webp new file mode 100644 index 00000000..46072f54 Binary files /dev/null and b/assets/stickers/11107.webp differ diff --git a/assets/stickers/11108.webp b/assets/stickers/11108.webp new file mode 100644 index 00000000..0d51240a Binary files /dev/null and b/assets/stickers/11108.webp differ diff --git a/assets/stickers/11109.webp b/assets/stickers/11109.webp new file mode 100644 index 00000000..4650e7df Binary files /dev/null and b/assets/stickers/11109.webp differ diff --git a/assets/stickers/11110.webp b/assets/stickers/11110.webp new file mode 100644 index 00000000..0d05a59e Binary files /dev/null and b/assets/stickers/11110.webp differ diff --git a/assets/stickers/11111.webp b/assets/stickers/11111.webp new file mode 100644 index 00000000..1419d57d Binary files /dev/null and b/assets/stickers/11111.webp differ diff --git a/assets/stickers/11112.webp b/assets/stickers/11112.webp new file mode 100644 index 00000000..2d8ff270 Binary files /dev/null and b/assets/stickers/11112.webp differ diff --git a/assets/stickers/11113.webp b/assets/stickers/11113.webp new file mode 100644 index 00000000..42f1e203 Binary files /dev/null and b/assets/stickers/11113.webp differ diff --git a/assets/stickers/11114.webp b/assets/stickers/11114.webp new file mode 100644 index 00000000..a4014976 Binary files /dev/null and b/assets/stickers/11114.webp differ diff --git a/assets/stickers/11115.webp b/assets/stickers/11115.webp new file mode 100644 index 00000000..bc435ab8 Binary files /dev/null and b/assets/stickers/11115.webp differ diff --git a/assets/stickers/11116.webp b/assets/stickers/11116.webp new file mode 100644 index 00000000..990edcf2 Binary files /dev/null and b/assets/stickers/11116.webp differ diff --git a/assets/stickers/11117.webp b/assets/stickers/11117.webp new file mode 100644 index 00000000..bac273ca Binary files /dev/null and b/assets/stickers/11117.webp differ diff --git a/assets/stickers/11118.webp b/assets/stickers/11118.webp new file mode 100644 index 00000000..1328b0aa Binary files /dev/null and b/assets/stickers/11118.webp differ diff --git a/assets/stickers/11119.webp b/assets/stickers/11119.webp new file mode 100644 index 00000000..04b6d81e Binary files /dev/null and b/assets/stickers/11119.webp differ diff --git a/assets/stickers/11120.webp b/assets/stickers/11120.webp new file mode 100644 index 00000000..1acab4fb Binary files /dev/null and b/assets/stickers/11120.webp differ diff --git a/assets/stickers/11121.webp b/assets/stickers/11121.webp new file mode 100644 index 00000000..4313528d Binary files /dev/null and b/assets/stickers/11121.webp differ diff --git a/assets/stickers/11122.webp b/assets/stickers/11122.webp new file mode 100644 index 00000000..48e42da2 Binary files /dev/null and b/assets/stickers/11122.webp differ diff --git a/assets/stickers/11123.webp b/assets/stickers/11123.webp new file mode 100644 index 00000000..24ba0066 Binary files /dev/null and b/assets/stickers/11123.webp differ diff --git a/assets/stickers/11124.webp b/assets/stickers/11124.webp new file mode 100644 index 00000000..7077aae2 Binary files /dev/null and b/assets/stickers/11124.webp differ diff --git a/assets/stickers/11125.webp b/assets/stickers/11125.webp new file mode 100644 index 00000000..b28a7562 Binary files /dev/null and b/assets/stickers/11125.webp differ diff --git a/assets/stickers/11126.webp b/assets/stickers/11126.webp new file mode 100644 index 00000000..6313ce04 Binary files /dev/null and b/assets/stickers/11126.webp differ diff --git a/assets/stickers/11127.webp b/assets/stickers/11127.webp new file mode 100644 index 00000000..c91927b3 Binary files /dev/null and b/assets/stickers/11127.webp differ diff --git a/assets/stickers/11128.webp b/assets/stickers/11128.webp new file mode 100644 index 00000000..eb8dd08e Binary files /dev/null and b/assets/stickers/11128.webp differ diff --git a/assets/stickers/11129.webp b/assets/stickers/11129.webp new file mode 100644 index 00000000..9ecad9c8 Binary files /dev/null and b/assets/stickers/11129.webp differ diff --git a/assets/stickers/11130.webp b/assets/stickers/11130.webp new file mode 100644 index 00000000..fb214364 Binary files /dev/null and b/assets/stickers/11130.webp differ diff --git a/assets/stickers/11131.webp b/assets/stickers/11131.webp new file mode 100644 index 00000000..f4f7a2eb Binary files /dev/null and b/assets/stickers/11131.webp differ diff --git a/assets/stickers/11132.webp b/assets/stickers/11132.webp new file mode 100644 index 00000000..ba931c39 Binary files /dev/null and b/assets/stickers/11132.webp differ diff --git a/assets/stickers/11133.webp b/assets/stickers/11133.webp new file mode 100644 index 00000000..d1b72202 Binary files /dev/null and b/assets/stickers/11133.webp differ diff --git a/assets/stickers/11134.webp b/assets/stickers/11134.webp new file mode 100644 index 00000000..3fbb86c4 Binary files /dev/null and b/assets/stickers/11134.webp differ diff --git a/assets/stickers/11135.webp b/assets/stickers/11135.webp new file mode 100644 index 00000000..c549a546 Binary files /dev/null and b/assets/stickers/11135.webp differ diff --git a/assets/stickers/11136.webp b/assets/stickers/11136.webp new file mode 100644 index 00000000..738ebec0 Binary files /dev/null and b/assets/stickers/11136.webp differ diff --git a/assets/stickers/11137.webp b/assets/stickers/11137.webp new file mode 100644 index 00000000..f6c425d5 Binary files /dev/null and b/assets/stickers/11137.webp differ diff --git a/assets/stickers/11138.webp b/assets/stickers/11138.webp new file mode 100644 index 00000000..7b1f11ef Binary files /dev/null and b/assets/stickers/11138.webp differ diff --git a/assets/stickers/11139.webp b/assets/stickers/11139.webp new file mode 100644 index 00000000..f7192279 Binary files /dev/null and b/assets/stickers/11139.webp differ diff --git a/assets/stickers/11140.webp b/assets/stickers/11140.webp new file mode 100644 index 00000000..935f715e Binary files /dev/null and b/assets/stickers/11140.webp differ diff --git a/assets/stickers/11141.webp b/assets/stickers/11141.webp new file mode 100644 index 00000000..1cc184eb Binary files /dev/null and b/assets/stickers/11141.webp differ diff --git a/assets/stickers/11142.webp b/assets/stickers/11142.webp new file mode 100644 index 00000000..2a43c8dd Binary files /dev/null and b/assets/stickers/11142.webp differ diff --git a/assets/stickers/11143.webp b/assets/stickers/11143.webp new file mode 100644 index 00000000..f7bdfa99 Binary files /dev/null and b/assets/stickers/11143.webp differ diff --git a/assets/stickers/11144.webp b/assets/stickers/11144.webp new file mode 100644 index 00000000..d0fad29a Binary files /dev/null and b/assets/stickers/11144.webp differ diff --git a/assets/stickers/11145.webp b/assets/stickers/11145.webp new file mode 100644 index 00000000..4b42f66e Binary files /dev/null and b/assets/stickers/11145.webp differ diff --git a/assets/stickers/11146.webp b/assets/stickers/11146.webp new file mode 100644 index 00000000..0938b94c Binary files /dev/null and b/assets/stickers/11146.webp differ diff --git a/assets/stickers/11147.webp b/assets/stickers/11147.webp new file mode 100644 index 00000000..10f47d57 Binary files /dev/null and b/assets/stickers/11147.webp differ diff --git a/assets/stickers/11148.webp b/assets/stickers/11148.webp new file mode 100644 index 00000000..061b7e29 Binary files /dev/null and b/assets/stickers/11148.webp differ diff --git a/assets/stickers/11149.webp b/assets/stickers/11149.webp new file mode 100644 index 00000000..c0968845 Binary files /dev/null and b/assets/stickers/11149.webp differ diff --git a/assets/stickers/11150.webp b/assets/stickers/11150.webp new file mode 100644 index 00000000..2dfed40f Binary files /dev/null and b/assets/stickers/11150.webp differ diff --git a/assets/stickers/11151.webp b/assets/stickers/11151.webp new file mode 100644 index 00000000..35f37c59 Binary files /dev/null and b/assets/stickers/11151.webp differ diff --git a/assets/stickers/11152.webp b/assets/stickers/11152.webp new file mode 100644 index 00000000..6c9d181e Binary files /dev/null and b/assets/stickers/11152.webp differ diff --git a/assets/stickers/11153.webp b/assets/stickers/11153.webp new file mode 100644 index 00000000..843c8de1 Binary files /dev/null and b/assets/stickers/11153.webp differ diff --git a/assets/stickers/11154.webp b/assets/stickers/11154.webp new file mode 100644 index 00000000..017ba4a9 Binary files /dev/null and b/assets/stickers/11154.webp differ diff --git a/assets/stickers/11155.webp b/assets/stickers/11155.webp new file mode 100644 index 00000000..5ac957bb Binary files /dev/null and b/assets/stickers/11155.webp differ diff --git a/assets/stickers/11156.webp b/assets/stickers/11156.webp new file mode 100644 index 00000000..29c864bd Binary files /dev/null and b/assets/stickers/11156.webp differ diff --git a/assets/stickers/11157.webp b/assets/stickers/11157.webp new file mode 100644 index 00000000..25810b6c Binary files /dev/null and b/assets/stickers/11157.webp differ diff --git a/assets/stickers/11158.webp b/assets/stickers/11158.webp new file mode 100644 index 00000000..b99b8622 Binary files /dev/null and b/assets/stickers/11158.webp differ diff --git a/assets/stickers/11159.webp b/assets/stickers/11159.webp new file mode 100644 index 00000000..0d0da376 Binary files /dev/null and b/assets/stickers/11159.webp differ diff --git a/assets/stickers/11160.webp b/assets/stickers/11160.webp new file mode 100644 index 00000000..9478b069 Binary files /dev/null and b/assets/stickers/11160.webp differ diff --git a/assets/stickers/11161.webp b/assets/stickers/11161.webp new file mode 100644 index 00000000..7bd95786 Binary files /dev/null and b/assets/stickers/11161.webp differ diff --git a/assets/stickers/11162.webp b/assets/stickers/11162.webp new file mode 100644 index 00000000..397b0988 Binary files /dev/null and b/assets/stickers/11162.webp differ diff --git a/assets/stickers/11163.webp b/assets/stickers/11163.webp new file mode 100644 index 00000000..5f9cf3a6 Binary files /dev/null and b/assets/stickers/11163.webp differ diff --git a/assets/stickers/11164.webp b/assets/stickers/11164.webp new file mode 100644 index 00000000..90ee8b07 Binary files /dev/null and b/assets/stickers/11164.webp differ diff --git a/assets/stickers/11165.webp b/assets/stickers/11165.webp new file mode 100644 index 00000000..a8f1954e Binary files /dev/null and b/assets/stickers/11165.webp differ diff --git a/assets/stickers/11166.webp b/assets/stickers/11166.webp new file mode 100644 index 00000000..090cb03e Binary files /dev/null and b/assets/stickers/11166.webp differ diff --git a/assets/stickers/11167.webp b/assets/stickers/11167.webp new file mode 100644 index 00000000..1a9b1bab Binary files /dev/null and b/assets/stickers/11167.webp differ diff --git a/assets/stickers/11168.webp b/assets/stickers/11168.webp new file mode 100644 index 00000000..ef2dae39 Binary files /dev/null and b/assets/stickers/11168.webp differ diff --git a/assets/stickers/11169.webp b/assets/stickers/11169.webp new file mode 100644 index 00000000..b1c10738 Binary files /dev/null and b/assets/stickers/11169.webp differ diff --git a/assets/stickers/11170.webp b/assets/stickers/11170.webp new file mode 100644 index 00000000..2b1ecd27 Binary files /dev/null and b/assets/stickers/11170.webp differ diff --git a/assets/stickers/11171.webp b/assets/stickers/11171.webp new file mode 100644 index 00000000..078361d0 Binary files /dev/null and b/assets/stickers/11171.webp differ diff --git a/assets/stickers/11172.webp b/assets/stickers/11172.webp new file mode 100644 index 00000000..3950f70b Binary files /dev/null and b/assets/stickers/11172.webp differ diff --git a/assets/stickers/11173.webp b/assets/stickers/11173.webp new file mode 100644 index 00000000..673c49df Binary files /dev/null and b/assets/stickers/11173.webp differ diff --git a/assets/tournament_logos/iem_cologne_2026.png b/assets/tournament_logos/iem_cologne_2026.png new file mode 100644 index 00000000..87beaad9 Binary files /dev/null and b/assets/tournament_logos/iem_cologne_2026.png differ diff --git a/lib/data/repositories/local_data_repository_queries.dart b/lib/data/repositories/local_data_repository_queries.dart index ed375d10..45398dbf 100644 --- a/lib/data/repositories/local_data_repository_queries.dart +++ b/lib/data/repositories/local_data_repository_queries.dart @@ -79,6 +79,13 @@ mixin _LocalDataRepositoryQueries on _LocalDataRepositoryLoaders { } } + for (final entry in metadata) { + final builder = ensureBuilder(entry.name); + if (builder.name.isEmpty) continue; + builder.imagePath ??= entry.tournamentLogo; + builder.releaseDate = _earlierDate(builder.releaseDate, entry.startDate); + } + final tournaments = tournamentBuilders.values .where((builder) => builder.imagePath != null) .map((builder) { diff --git a/lib/domain/dropped_skin.dart b/lib/domain/dropped_skin.dart index f7c4fc17..18fbfb0a 100644 --- a/lib/domain/dropped_skin.dart +++ b/lib/domain/dropped_skin.dart @@ -20,9 +20,9 @@ class DroppedSkin { bool get isVanillaKnife => skin.isKnife && skin.name == 'Vanilla'; String get fullDisplayName { - final star = skin.isSpecialItem ? '★ ' : ''; + final star = skin.isSpecialItem ? '\u2605 ' : ''; final souvenirPrefix = isSouvenir ? 'Souvenir ' : ''; - final statTrakPrefix = isStatTrak ? 'StatTrak™ ' : ''; + final statTrakPrefix = isStatTrak ? 'StatTrak\u2122 ' : ''; return '$star$souvenirPrefix$statTrakPrefix${skin.itemDisplayName} | ${skin.name}'; } } diff --git a/lib/domain/tradeup_service.dart b/lib/domain/tradeup_service.dart index 20373c28..e416b1ef 100644 --- a/lib/domain/tradeup_service.dart +++ b/lib/domain/tradeup_service.dart @@ -329,15 +329,16 @@ class TradeUpService { }) { if (input.isEmpty) return null; - if (input.any((item) => item.isSouvenir)) { - return 'Souvenir items cannot be used in trade-up contracts'; - } - final firstQuality = input.first.quality; if (input.any((item) => item.quality != firstQuality)) { return 'All selected skins must use the same quality mode'; } + if (firstQuality == TradeUpInputQuality.souvenir && + input.first.skin.rarity == 'COVERT') { + return 'Souvenir trade-up contracts require 10 non-Covert skins'; + } + if (input.first.skin.rarity == 'COVERT' && _buildRegularCaseWeightsOrNull( input: input, diff --git a/lib/presentation/screens/glossary_hub_screen.dart b/lib/presentation/screens/glossary_hub_screen.dart index 6a8f8bc3..9e9bcf07 100644 --- a/lib/presentation/screens/glossary_hub_screen.dart +++ b/lib/presentation/screens/glossary_hub_screen.dart @@ -72,46 +72,48 @@ class GlossaryHubScreen extends StatelessWidget { return Scaffold( appBar: AppBar(title: const Text('Item Glossary')), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 420), - child: Padding( + body: LayoutBuilder( + builder: (context, constraints) { + final wide = constraints.maxWidth >= 720; + final cardWidth = wide + ? (constraints.maxWidth - 48 - 12) / 2 + : constraints.maxWidth - 32; + + return SingleChildScrollView( padding: const EdgeInsets.all(16), child: Center( - child: ListView.separated( - shrinkWrap: true, - itemCount: items.length, - separatorBuilder: (_, _) => const SizedBox(height: 16), - itemBuilder: (context, index) { - final item = items[index]; - return SizedBox( - width: double.infinity, - height: 64, - child: ElevatedButton( - onPressed: () { - AppNavigationHelper.pushScreen( - context, - item.buildScreen(), - ); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(item.icon), - const SizedBox(width: 10), - Text( - item.title, - style: const TextStyle(fontSize: 18), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 920), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const _HubIntroCard(), + const SizedBox(height: 16), + Wrap( + spacing: 12, + runSpacing: 12, + children: [ + for (final item in items) + SizedBox( + width: cardWidth, + child: _GlossaryHubCard( + item: item, + onTap: () { + AppNavigationHelper.pushScreen( + context, + item.buildScreen(), + ); + }, + ), ), - ], - ), + ], ), - ); - }, + ], + ), ), ), - ), - ), + ); + }, ), ); } @@ -128,3 +130,77 @@ class _GlossaryHubItem { required this.buildScreen, }); } + +class _HubIntroCard extends StatelessWidget { + const _HubIntroCard(); + + @override + Widget build(BuildContext context) { + return Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: const [ + Text( + 'Browse Every Item Type', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w700), + ), + SizedBox(height: 6), + Text( + 'Open the full glossary by category and jump from collection tracking straight into detailed item pages.', + style: TextStyle(color: Colors.white70, height: 1.35), + ), + ], + ), + ), + ); + } +} + +class _GlossaryHubCard extends StatelessWidget { + final _GlossaryHubItem item; + final VoidCallback onTap; + + const _GlossaryHubCard({required this.item, required this.onTap}); + + @override + Widget build(BuildContext context) { + return InkWell( + borderRadius: BorderRadius.circular(16), + onTap: onTap, + child: Ink( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.white10), + color: Colors.white.withValues(alpha: 0.03), + ), + child: Row( + children: [ + Container( + width: 46, + height: 46, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + color: Colors.white.withValues(alpha: 0.06), + ), + child: Icon(item.icon), + ), + const SizedBox(width: 14), + Expanded( + child: Text( + item.title, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w700, + ), + ), + ), + const Icon(Icons.chevron_right, color: Colors.white38), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/my_collection_screen.dart b/lib/presentation/screens/my_collection_screen.dart index 1e00a8a9..e3c17c2b 100644 --- a/lib/presentation/screens/my_collection_screen.dart +++ b/lib/presentation/screens/my_collection_screen.dart @@ -4,6 +4,7 @@ import '../../core/collection/collection_entry.dart'; import '../../core/collection/collection_summary.dart'; import '../../core/collection/collection_tracking_service.dart'; import '../../core/settings/settings_controller.dart'; +import '../../data/models/container_dto.dart'; import '../../data/repositories/local_data_repository.dart'; import '../helpers/app_navigation_helper.dart'; import 'agent_details_screen.dart'; @@ -46,22 +47,23 @@ class _MyCollectionScreenState extends State { } Future<_CollectionData> _loadData() async { - final results = await Future.wait([ - _service.loadEntries(), - _service.loadSummaries(), - _loadProgress(), - ]); + final entries = await _service.loadEntries(); + final summaries = await _service.loadSummaries(); + final progress = await _loadProgress(summaries); + final sourceHighlights = await _loadSourceHighlights(entries); return _CollectionData( - entries: results[0] as List, - summaries: results[1] as List, - progress: results[2] as List<_CollectionProgressItem>, + entries: entries, + summaries: summaries, + progress: progress, + sourceHighlights: sourceHighlights, ); } - Future> _loadProgress() async { + Future> _loadProgress( + List summaries, + ) async { final results = await Future.wait([ - _service.loadSummaries(), widget.repository.loadSkinGroups(), widget.repository.loadStickers(), widget.repository.loadPins(), @@ -72,15 +74,14 @@ class _MyCollectionScreenState extends State { widget.repository.loadCharms(), ]); - final summaries = results[0] as List; - final skinGroups = results[1] as List; - final stickers = results[2] as List; - final pins = results[3] as List; - final musicKits = results[4] as List; - final agents = results[5] as List; - final graffiti = results[6] as List; - final patches = results[7] as List; - final charms = results[8] as List; + final skinGroups = results[0] as List; + final stickers = results[1] as List; + final pins = results[2] as List; + final musicKits = results[3] as List; + final agents = results[4] as List; + final graffiti = results[5] as List; + final patches = results[6] as List; + final charms = results[7] as List; final collectedByCategory = >{}; for (final summary in summaries) { @@ -199,6 +200,158 @@ class _MyCollectionScreenState extends State { ]; } + Future> _loadSourceHighlights( + List entries, + ) async { + final sourceEntriesByKey = >{}; + for (final entry in entries) { + final key = '${entry.sourceType}|${entry.sourceName}'; + sourceEntriesByKey.putIfAbsent(key, () => []).add(entry); + } + + if (sourceEntriesByKey.isEmpty) { + return const []; + } + + final results = await Future.wait([ + widget.repository.loadContainers(), + widget.repository.loadContainerContents(), + widget.repository.loadStickerContents(), + widget.repository.loadPinContents(), + widget.repository.loadMusicKitContents(), + widget.repository.loadGraffitiContents(), + widget.repository.loadPatchContents(), + widget.repository.loadCharmContents(), + widget.repository.loadAgentCollectionContents(), + widget.repository.loadRewardCollectionContents(), + widget.repository.loadOperationCollectionContents(), + ]); + + final containers = results[0] as List; + final containerItemCounts = { + for (final item in results[1] as List) + item.containerId as String: (item.skinIds as List).length, + }; + final stickerItemCounts = { + for (final item in results[2] as List) + item.containerId as String: (item.stickerIds as List).length, + }; + final pinItemCounts = { + for (final item in results[3] as List) + item.containerId as String: (item.pinIds as List).length, + }; + final musicKitItemCounts = { + for (final item in results[4] as List) + item.containerId as String: (item.items as List) + .map((entry) => entry.musicKitId as String) + .toSet() + .length, + }; + final graffitiItemCounts = { + for (final item in results[5] as List) + item.containerId as String: (item.graffitiIds as List).length, + }; + final patchItemCounts = { + for (final item in results[6] as List) + item.containerId as String: (item.patchIds as List).length, + }; + final charmItemCounts = { + for (final item in results[7] as List) + item.containerId as String: (item.charmIds as List).length, + }; + final agentItemCounts = { + for (final item in results[8] as List) + item.agentCollectionId as String: + (item.agentIds as List).length, + }; + final rewardItemCounts = { + for (final item in results[9] as List) + item.rewardCollectionId as String: + (item.skinIds as List).length, + }; + final operationItemCounts = { + for (final item in results[10] as List) + item.operationCollectionId as String: + (item.skinIds as List).length, + }; + + int? totalCountFor(ContainerDto container) { + switch (container.type) { + case 'CASE': + case 'SOUVENIR_PACKAGE': + case 'TERMINAL': + case 'XRAY_PACKAGE': + return containerItemCounts[container.id]; + case 'STICKER_CAPSULE': + case 'STICKER_COLLECTION': + return stickerItemCounts[container.id]; + case 'PIN_CAPSULE': + return pinItemCounts[container.id]; + case 'MUSIC_KIT_BOX': + return musicKitItemCounts[container.id]; + case 'GRAFFITI_BOX': + return graffitiItemCounts[container.id]; + case 'PATCH_PACK': + case 'PATCH_COLLECTION': + return patchItemCounts[container.id]; + case 'CHARM_COLLECTION': + return charmItemCounts[container.id]; + case 'AGENT_COLLECTION': + return agentItemCounts[container.id]; + case 'REWARD_COLLECTION': + return rewardItemCounts[container.id]; + case 'OPERATION_COLLECTION': + return operationItemCounts[container.id]; + default: + return null; + } + } + + final highlights = <_SourceProgressItem>[]; + for (final container in containers) { + final key = '${container.type}|${container.name}'; + final sourceEntries = sourceEntriesByKey[key]; + if (sourceEntries == null || sourceEntries.isEmpty) { + continue; + } + + final totalCount = totalCountFor(container); + if (totalCount == null || totalCount == 0) { + continue; + } + + highlights.add( + _SourceProgressItem( + container: container, + openedCount: sourceEntries.length, + collectedCount: sourceEntries + .map((item) => '${item.category}:${item.itemId}') + .toSet() + .length, + totalCount: totalCount, + ), + ); + } + + highlights.sort((a, b) { + final completionCompare = b.completion.compareTo(a.completion); + if (completionCompare != 0) { + return completionCompare; + } + final collectedCompare = b.collectedCount.compareTo(a.collectedCount); + if (collectedCompare != 0) { + return collectedCompare; + } + final openedCompare = b.openedCount.compareTo(a.openedCount); + if (openedCompare != 0) { + return openedCompare; + } + return a.container.name.compareTo(b.container.name); + }); + + return highlights.take(6).toList(); + } + Future _refresh() async { final future = _loadData(); setState(() { @@ -302,15 +455,7 @@ class _MyCollectionScreenState extends State { actions: [ IconButton( tooltip: 'Recent activity', - onPressed: () { - AppNavigationHelper.pushScreen( - context, - CollectionHistoryScreen( - repository: widget.repository, - settingsController: widget.settingsController, - ), - ); - }, + onPressed: _openHistory, icon: const Icon(Icons.history), ), IconButton( @@ -350,8 +495,14 @@ class _MyCollectionScreenState extends State { uniqueItems: data.summaries.length, totalCollected: totalCollected, totalAvailable: totalAvailable, + onOpenHistory: _openHistory, + onRefresh: _refresh, ), _CollectionProgressSection(items: data.progress), + _SourceHighlightsSection( + items: data.sourceHighlights, + onItemTap: _openSourceHighlight, + ), Expanded( child: _InventoryTab( summaries: filteredSummaries, @@ -450,7 +601,22 @@ class _CollectionHistoryScreenState extends State { return const Center(child: CircularProgressIndicator()); } - return _HistoryTab(entries: snapshot.data!, onItemTap: _openEntry); + return Column( + children: [ + const _SecondaryScreenHint( + icon: Icons.history, + title: 'Recent Activity', + subtitle: + 'Newest drops and Trade-Up results appear first. Tap any entry to open it in the glossary.', + ), + Expanded( + child: _HistoryTab( + entries: snapshot.data!, + onItemTap: _openEntry, + ), + ), + ], + ); }, ), ); @@ -492,12 +658,16 @@ class _CollectionOverview extends StatelessWidget { final int uniqueItems; final int totalCollected; final int totalAvailable; + final VoidCallback onOpenHistory; + final VoidCallback onRefresh; const _CollectionOverview({ required this.totalEntries, required this.uniqueItems, required this.totalCollected, required this.totalAvailable, + required this.onOpenHistory, + required this.onRefresh, }); @override @@ -511,25 +681,47 @@ class _CollectionOverview extends StatelessWidget { child: Card( child: Padding( padding: const EdgeInsets.all(14), - child: Wrap( - spacing: 12, - runSpacing: 12, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - _StatChip( - icon: Icons.inventory_2_outlined, - label: 'Collected entries', - value: '$totalEntries', - ), - _StatChip( - icon: Icons.collections_bookmark_outlined, - label: 'Unique items', - value: '$uniqueItems', + Wrap( + spacing: 12, + runSpacing: 12, + children: [ + _StatChip( + icon: Icons.inventory_2_outlined, + label: 'Collected entries', + value: '$totalEntries', + ), + _StatChip( + icon: Icons.collections_bookmark_outlined, + label: 'Unique items', + value: '$uniqueItems', + ), + _StatChip( + icon: Icons.checklist_outlined, + label: 'Overall completion', + value: + '$totalCollected / $totalAvailable (${(completion * 100).floor()}%)', + ), + ], ), - _StatChip( - icon: Icons.checklist_outlined, - label: 'Overall completion', - value: - '$totalCollected / $totalAvailable (${(completion * 100).floor()}%)', + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + OutlinedButton.icon( + onPressed: onOpenHistory, + icon: const Icon(Icons.history), + label: const Text('Recent Activity'), + ), + OutlinedButton.icon( + onPressed: onRefresh, + icon: const Icon(Icons.refresh), + label: const Text('Refresh Collection'), + ), + ], ), ], ), @@ -578,6 +770,140 @@ class _CollectionProgressSection extends StatelessWidget { } } +class _SourceHighlightsSection extends StatelessWidget { + final List<_SourceProgressItem> items; + final ValueChanged<_SourceProgressItem> onItemTap; + + const _SourceHighlightsSection({ + required this.items, + required this.onItemTap, + }); + + @override + Widget build(BuildContext context) { + if (items.isEmpty) { + return const SizedBox.shrink(); + } + + return Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Best Source Progress', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 4), + const Text( + 'Your most completed containers and collection sources.', + style: TextStyle(color: Colors.white70, fontSize: 12), + ), + const SizedBox(height: 12), + ...items.map( + (item) => Padding( + padding: const EdgeInsets.only(bottom: 10), + child: _SourceHighlightTile( + item: item, + onTap: () => onItemTap(item), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + +class _SourceHighlightTile extends StatelessWidget { + final _SourceProgressItem item; + final VoidCallback onTap; + + const _SourceHighlightTile({required this.item, required this.onTap}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(14), + onTap: onTap, + child: Ink( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + border: Border.all(color: Colors.white10), + color: Colors.white.withValues(alpha: 0.03), + ), + child: Row( + children: [ + SizedBox( + width: 54, + height: 54, + child: Image.asset( + item.container.containerImage, + fit: BoxFit.contain, + errorBuilder: (_, _, _) => + const Icon(Icons.image_not_supported), + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item.container.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontWeight: FontWeight.w700), + ), + const SizedBox(height: 4), + Text( + '${item.container.typeLabel} • ${item.collectedCount}/${item.totalCount} collected • ${item.openedCount} opened', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.white70, + fontSize: 12, + ), + ), + const SizedBox(height: 8), + ClipRRect( + borderRadius: BorderRadius.circular(999), + child: LinearProgressIndicator( + value: item.completion, + minHeight: 8, + backgroundColor: Colors.white10, + ), + ), + ], + ), + ), + const SizedBox(width: 8), + Text( + '${(item.completion * 100).floor()}%', + style: const TextStyle( + color: Colors.white70, + fontSize: 12, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(width: 4), + const Icon(Icons.chevron_right, color: Colors.white38), + ], + ), + ), + ), + ); + } +} + class _ProgressTile extends StatelessWidget { final _CollectionProgressItem item; @@ -687,6 +1013,60 @@ class _StatChip extends StatelessWidget { } } +class _SecondaryScreenHint extends StatelessWidget { + final IconData icon; + final String title; + final String subtitle; + + const _SecondaryScreenHint({ + required this.icon, + required this.title, + required this.subtitle, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(14), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(icon, size: 20, color: Colors.white70), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(height: 4), + Text( + subtitle, + style: const TextStyle( + color: Colors.white70, + fontSize: 12, + height: 1.35, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} + class _InventoryTab extends StatelessWidget { final List summaries; final int totalCount; @@ -728,193 +1108,202 @@ class _InventoryTab extends StatelessWidget { final categoryOptions = ['ALL', ...categoryValues]; final rarityOptions = ['ALL', ...rarityValues]; - return Column( - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), - child: Card( - child: Padding( - padding: const EdgeInsets.all(12), - child: LayoutBuilder( - builder: (context, constraints) { - final wide = constraints.maxWidth >= 720; - final fieldWidth = wide - ? (constraints.maxWidth - 24) / 3 - : null; - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextFormField( - initialValue: search, - decoration: const InputDecoration( - hintText: 'Search your collection...', - prefixIcon: Icon(Icons.search), - isDense: true, + return CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(12), + child: LayoutBuilder( + builder: (context, constraints) { + final wide = constraints.maxWidth >= 720; + final fieldWidth = wide + ? (constraints.maxWidth - 24) / 3 + : null; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextFormField( + initialValue: search, + decoration: const InputDecoration( + hintText: 'Search your collection...', + prefixIcon: Icon(Icons.search), + isDense: true, + ), + onChanged: onSearchChanged, ), - onChanged: onSearchChanged, - ), - const SizedBox(height: 10), - Wrap( - spacing: 10, - runSpacing: 10, - children: [ - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedCategory, - decoration: const InputDecoration( - labelText: 'Category', - isDense: true, - ), - items: categoryOptions - .map( - (option) => DropdownMenuItem( - value: option, - child: Text( - option == 'ALL' - ? 'All' - : _categoryLabelFor(option), + const SizedBox(height: 10), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: selectedCategory, + decoration: const InputDecoration( + labelText: 'Category', + isDense: true, + ), + items: categoryOptions + .map( + (option) => DropdownMenuItem( + value: option, + child: Text( + option == 'ALL' + ? 'All' + : _categoryLabelFor(option), + ), ), - ), - ) - .toList(), - onChanged: (value) { - if (value != null) { - onCategoryChanged(value); - } - }, - ), - ), - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedRarity, - decoration: const InputDecoration( - labelText: 'Rarity', - isDense: true, + ) + .toList(), + onChanged: (value) { + if (value != null) { + onCategoryChanged(value); + } + }, ), - items: rarityOptions - .map( - (option) => DropdownMenuItem( - value: option, - child: Text( - option == 'ALL' - ? 'All' - : _rarityLabel(option), - ), - ), - ) - .toList(), - onChanged: (value) { - if (value != null) { - onRarityChanged(value); - } - }, ), - ), - SizedBox( - width: fieldWidth, - child: DropdownButtonFormField( - initialValue: selectedStatTrak, - decoration: const InputDecoration( - labelText: 'StatTrak', - isDense: true, - ), - items: const [ - DropdownMenuItem( - value: 'ALL', - child: Text('All'), + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: selectedRarity, + decoration: const InputDecoration( + labelText: 'Rarity', + isDense: true, ), - DropdownMenuItem( - value: 'ONLY', - child: Text('Only StatTrak'), - ), - DropdownMenuItem( - value: 'NONE', - child: Text('No StatTrak'), - ), - ], - onChanged: (value) { - if (value != null) { - onStatTrakChanged(value); - } - }, - ), - ), - ], - ), - const SizedBox(height: 10), - Row( - children: [ - Expanded( - child: DropdownButtonFormField( - initialValue: selectedSort, - decoration: const InputDecoration( - labelText: 'Sort by', - isDense: true, + items: rarityOptions + .map( + (option) => DropdownMenuItem( + value: option, + child: Text( + option == 'ALL' + ? 'All' + : _rarityLabel(option), + ), + ), + ) + .toList(), + onChanged: (value) { + if (value != null) { + onRarityChanged(value); + } + }, ), - items: const [ - DropdownMenuItem( - value: 'LATEST', - child: Text('Latest'), - ), - DropdownMenuItem( - value: 'MOST_OWNED', - child: Text('Most collected'), - ), - DropdownMenuItem( - value: 'BEST_FLOAT', - child: Text('Best float'), + ), + SizedBox( + width: fieldWidth, + child: DropdownButtonFormField( + initialValue: selectedStatTrak, + decoration: const InputDecoration( + labelText: 'StatTrak', + isDense: true, ), - DropdownMenuItem( - value: 'A_Z', - child: Text('Name A-Z'), + items: const [ + DropdownMenuItem( + value: 'ALL', + child: Text('All'), + ), + DropdownMenuItem( + value: 'ONLY', + child: Text('Only StatTrak'), + ), + DropdownMenuItem( + value: 'NONE', + child: Text('No StatTrak'), + ), + ], + onChanged: (value) { + if (value != null) { + onStatTrakChanged(value); + } + }, + ), + ), + ], + ), + const SizedBox(height: 10), + Row( + children: [ + Expanded( + child: DropdownButtonFormField( + initialValue: selectedSort, + decoration: const InputDecoration( + labelText: 'Sort by', + isDense: true, ), - ], - onChanged: (value) { - if (value != null) { - onSortChanged(value); - } - }, + items: const [ + DropdownMenuItem( + value: 'LATEST', + child: Text('Latest'), + ), + DropdownMenuItem( + value: 'MOST_OWNED', + child: Text('Most collected'), + ), + DropdownMenuItem( + value: 'BEST_FLOAT', + child: Text('Best float'), + ), + DropdownMenuItem( + value: 'A_Z', + child: Text('Name A-Z'), + ), + ], + onChanged: (value) { + if (value != null) { + onSortChanged(value); + } + }, + ), ), - ), - const SizedBox(width: 12), - Text( - '${summaries.length} / $totalCount', - style: const TextStyle( - color: Colors.white54, - fontSize: 12, - fontWeight: FontWeight.w600, + const SizedBox(width: 12), + Text( + '${summaries.length} / $totalCount', + style: const TextStyle( + color: Colors.white54, + fontSize: 12, + fontWeight: FontWeight.w600, + ), ), - ), - ], - ), - ], - ); - }, + ], + ), + ], + ); + }, + ), ), ), ), ), - Expanded( - child: summaries.isEmpty - ? const _EmptyCollectionState( - icon: Icons.inventory_2_outlined, - title: 'No items match these filters', - subtitle: - 'Try a broader search or clear one of the active filters.', - ) - : ListView.separated( - padding: const EdgeInsets.all(12), - itemCount: summaries.length, - separatorBuilder: (_, _) => const SizedBox(height: 10), - itemBuilder: (context, index) => _InventoryCard( - summary: summaries[index], - onTap: () => onItemTap(summaries[index]), - ), - ), - ), + if (summaries.isEmpty) + const SliverFillRemaining( + hasScrollBody: false, + child: _EmptyCollectionState( + icon: Icons.inventory_2_outlined, + title: 'No items match these filters', + subtitle: + 'Try a broader search or clear one of the active filters.', + ), + ) + else + SliverPadding( + padding: const EdgeInsets.all(12), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) => index.isOdd + ? const SizedBox(height: 10) + : _InventoryCard( + summary: summaries[index ~/ 2], + onTap: () => onItemTap(summaries[index ~/ 2]), + ), + childCount: summaries.length * 2 - 1, + ), + ), + ), ], ); } @@ -1200,11 +1589,13 @@ class _CollectionData { final List entries; final List summaries; final List<_CollectionProgressItem> progress; + final List<_SourceProgressItem> sourceHighlights; const _CollectionData({ required this.entries, required this.summaries, required this.progress, + required this.sourceHighlights, }); } @@ -1224,6 +1615,22 @@ class _CollectionProgressItem { }); } +class _SourceProgressItem { + final ContainerDto container; + final int openedCount; + final int collectedCount; + final int totalCount; + + const _SourceProgressItem({ + required this.container, + required this.openedCount, + required this.collectedCount, + required this.totalCount, + }); + + double get completion => totalCount == 0 ? 0 : collectedCount / totalCount; +} + Color _rarityColor(String rarity) { switch (rarity) { case 'CONSUMER': @@ -1326,6 +1733,27 @@ String _rarityLabel(String rarity) { } extension on _MyCollectionScreenState { + void _openHistory() { + AppNavigationHelper.pushScreen( + context, + CollectionHistoryScreen( + repository: widget.repository, + settingsController: widget.settingsController, + ), + ); + } + + void _openSourceHighlight(_SourceProgressItem item) { + AppNavigationHelper.pushScreen( + context, + AppNavigationHelper.buildContainerOpenScreen( + containerDto: item.container, + repository: widget.repository, + settingsController: widget.settingsController, + ), + ); + } + Future _openSummary(CollectionSummary summary) async { final screen = await _buildDetailsScreen( repository: widget.repository, diff --git a/lib/presentation/screens/player_details_screen.dart b/lib/presentation/screens/player_details_screen.dart index 21fe846d..d67bc129 100644 --- a/lib/presentation/screens/player_details_screen.dart +++ b/lib/presentation/screens/player_details_screen.dart @@ -8,8 +8,11 @@ import '../helpers/app_navigation_helper.dart'; import '../widgets/adaptive_logo_image.dart'; import '../widgets/async_collection_loader.dart'; import '../widgets/detail_info_row.dart'; +import '../widgets/detail_navigation_card.dart'; import '../widgets/major_summary_card.dart'; +import 'player_list_screen.dart'; import 'team_details_screen.dart'; +import 'tournament_list_screen.dart'; import 'tournament_details_screen.dart'; class PlayerDetailsScreen extends StatefulWidget { @@ -40,7 +43,31 @@ class _PlayerDetailsScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(widget.playerName)), + appBar: AppBar( + title: Text(widget.playerName), + actions: [ + IconButton( + tooltip: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.emoji_events_outlined), + ), + IconButton( + tooltip: 'Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.person_search_outlined), + ), + ], + ), body: AsyncCollectionLoader( future: _future, builder: (context, items) { @@ -116,6 +143,34 @@ class _PlayerDetailsScreenState extends State { ], ), const SizedBox(height: 12), + DetailNavigationCard( + title: 'Explore Related Major Views', + subtitle: + 'Move from this player into the wider Major archive and linked team history.', + actions: [ + DetailNavigationAction( + icon: Icons.emoji_events_outlined, + label: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + ), + DetailNavigationAction( + icon: Icons.person_search_outlined, + label: 'All Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + ), + ], + ), + const SizedBox(height: 12), const MajorSectionHeader( icon: Icons.timeline_outlined, title: 'Major Timeline', diff --git a/lib/presentation/screens/player_list_screen.dart b/lib/presentation/screens/player_list_screen.dart index 7ff21fb0..25d48a8d 100644 --- a/lib/presentation/screens/player_list_screen.dart +++ b/lib/presentation/screens/player_list_screen.dart @@ -3,8 +3,11 @@ import 'package:flutter/material.dart'; import '../../core/utils/date_format_helper.dart'; import '../../data/models/tournament_player_dto.dart'; import '../../data/repositories/local_data_repository.dart'; +import '../helpers/app_navigation_helper.dart'; import '../widgets/async_collection_loader.dart'; import 'player_details_screen.dart'; +import 'team_list_screen.dart'; +import 'tournament_list_screen.dart'; class PlayerListScreen extends StatefulWidget { final LocalDataRepository repository; @@ -28,7 +31,31 @@ class _PlayerListScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Major Players')), + appBar: AppBar( + title: const Text('Major Players'), + actions: [ + IconButton( + tooltip: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.emoji_events_outlined), + ), + IconButton( + tooltip: 'Teams', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.groups_2_outlined), + ), + ], + ), body: AsyncCollectionLoader( future: _future, builder: (context, items) { @@ -40,6 +67,21 @@ class _PlayerListScreenState extends State { return Column( children: [ + _PlayerListHeader( + playerCount: items.length, + onOpenMajors: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + onOpenTeams: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: widget.repository), + ); + }, + ), Padding( padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), child: TextField( @@ -67,13 +109,11 @@ class _PlayerListScreenState extends State { return _PlayerSummaryCard( player: player, onTap: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => PlayerDetailsScreen( - playerName: player.playerName, - repository: widget.repository, - ), + PlayerDetailsScreen( + playerName: player.playerName, + repository: widget.repository, ), ); }, @@ -89,6 +129,61 @@ class _PlayerListScreenState extends State { } } +class _PlayerListHeader extends StatelessWidget { + final int playerCount; + final VoidCallback onOpenMajors; + final VoidCallback onOpenTeams; + + const _PlayerListHeader({ + required this.playerCount, + required this.onOpenMajors, + required this.onOpenTeams, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Major Player History', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 6), + Text( + '$playerCount players with Major appearances, autograph coverage, and tournament timelines.', + style: const TextStyle(color: Colors.white70, height: 1.35), + ), + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + OutlinedButton.icon( + onPressed: onOpenMajors, + icon: const Icon(Icons.emoji_events_outlined), + label: const Text('Majors'), + ), + OutlinedButton.icon( + onPressed: onOpenTeams, + icon: const Icon(Icons.groups_2_outlined), + label: const Text('Teams'), + ), + ], + ), + ], + ), + ), + ), + ); + } +} + class _PlayerSummaryCard extends StatelessWidget { final TournamentPlayerSummaryDto player; final VoidCallback onTap; diff --git a/lib/presentation/screens/team_details_screen.dart b/lib/presentation/screens/team_details_screen.dart index 7ba0f4bc..3aab92bc 100644 --- a/lib/presentation/screens/team_details_screen.dart +++ b/lib/presentation/screens/team_details_screen.dart @@ -7,9 +7,13 @@ import '../../data/models/tournament_metadata_dto.dart'; import '../../data/repositories/local_data_repository.dart'; import '../helpers/app_navigation_helper.dart'; import '../widgets/adaptive_logo_image.dart'; +import '../widgets/detail_navigation_card.dart'; import '../widgets/detail_info_row.dart'; import '../widgets/detail_tag.dart'; import '../widgets/major_summary_card.dart'; +import 'player_list_screen.dart'; +import 'team_list_screen.dart'; +import 'tournament_list_screen.dart'; import 'player_details_screen.dart'; import 'tournament_details_screen.dart'; @@ -51,7 +55,31 @@ class _TeamDetailsScreenState extends State { final canonicalTeamName = TeamNameHelper.canonicalize(widget.teamName); return Scaffold( - appBar: AppBar(title: Text(canonicalTeamName)), + appBar: AppBar( + title: Text(canonicalTeamName), + actions: [ + IconButton( + tooltip: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.emoji_events_outlined), + ), + IconButton( + tooltip: 'Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.person_search_outlined), + ), + ], + ), body: FutureBuilder<_TeamDetailsData>( future: _future, builder: (context, snapshot) { @@ -138,6 +166,46 @@ class _TeamDetailsScreenState extends State { ], ), ), + Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: DetailNavigationCard( + title: 'Explore Related Major Views', + subtitle: + 'Move from this team into the broader Major archive or player history.', + actions: [ + DetailNavigationAction( + icon: Icons.emoji_events_outlined, + label: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + ), + DetailNavigationAction( + icon: Icons.person_search_outlined, + label: 'Major Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + ), + DetailNavigationAction( + icon: Icons.groups_2_outlined, + label: 'All Teams', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: widget.repository), + ); + }, + ), + ], + ), + ), if (recurringPlayers.isNotEmpty) Padding( padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), @@ -195,21 +263,19 @@ class _TeamDetailsScreenState extends State { result: result, roster: roster, onOpenTournament: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => TournamentDetailsScreen( - repository: widget.repository, - tournament: TournamentDto( - name: result.tournamentName, - imagePath: result.tournamentImagePath, - releaseDate: result.startDate, - startDate: result.startDate, - endDate: result.endDate, - organizer: result.organizer, - souvenirPackageCount: 0, - stickerContainerCount: 0, - ), + TournamentDetailsScreen( + repository: widget.repository, + tournament: TournamentDto( + name: result.tournamentName, + imagePath: result.tournamentImagePath, + releaseDate: result.startDate, + startDate: result.startDate, + endDate: result.endDate, + organizer: result.organizer, + souvenirPackageCount: 0, + stickerContainerCount: 0, ), ), ); diff --git a/lib/presentation/screens/team_list_screen.dart b/lib/presentation/screens/team_list_screen.dart index 1acf8a69..9e126796 100644 --- a/lib/presentation/screens/team_list_screen.dart +++ b/lib/presentation/screens/team_list_screen.dart @@ -3,8 +3,11 @@ import 'package:flutter/material.dart'; import '../../core/utils/date_format_helper.dart'; import '../../data/models/tournament_dto.dart'; import '../../data/repositories/local_data_repository.dart'; +import '../helpers/app_navigation_helper.dart'; import '../widgets/adaptive_logo_image.dart'; import '../widgets/async_collection_loader.dart'; +import 'player_list_screen.dart'; +import 'tournament_list_screen.dart'; import 'team_details_screen.dart'; class TeamListScreen extends StatefulWidget { @@ -29,7 +32,31 @@ class _TeamListScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: const Text('Major Teams')), + appBar: AppBar( + title: const Text('Major Teams'), + actions: [ + IconButton( + tooltip: 'Majors', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.emoji_events_outlined), + ), + IconButton( + tooltip: 'Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + icon: const Icon(Icons.person_search_outlined), + ), + ], + ), body: AsyncCollectionLoader( future: _future, builder: (context, items) { @@ -41,6 +68,21 @@ class _TeamListScreenState extends State { return Column( children: [ + _TeamListHeader( + teamCount: items.length, + onOpenMajors: () { + AppNavigationHelper.pushScreen( + context, + TournamentListScreen(repository: widget.repository), + ); + }, + onOpenPlayers: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + ), Padding( padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), child: TextField( @@ -68,13 +110,11 @@ class _TeamListScreenState extends State { return _TeamSummaryCard( team: team, onTap: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => TeamDetailsScreen( - teamName: team.teamName, - repository: widget.repository, - ), + TeamDetailsScreen( + teamName: team.teamName, + repository: widget.repository, ), ); }, @@ -90,6 +130,61 @@ class _TeamListScreenState extends State { } } +class _TeamListHeader extends StatelessWidget { + final int teamCount; + final VoidCallback onOpenMajors; + final VoidCallback onOpenPlayers; + + const _TeamListHeader({ + required this.teamCount, + required this.onOpenMajors, + required this.onOpenPlayers, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 0), + child: Card( + child: Padding( + padding: const EdgeInsets.all(14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Major Team History', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 6), + Text( + '$teamCount organizations with appearance counts, best placements, titles, and tournament history.', + style: const TextStyle(color: Colors.white70, height: 1.35), + ), + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + OutlinedButton.icon( + onPressed: onOpenMajors, + icon: const Icon(Icons.emoji_events_outlined), + label: const Text('Majors'), + ), + OutlinedButton.icon( + onPressed: onOpenPlayers, + icon: const Icon(Icons.person_search_outlined), + label: const Text('Players'), + ), + ], + ), + ], + ), + ), + ), + ); + } +} + class _TeamSummaryCard extends StatelessWidget { final TournamentTeamSummaryDto team; final VoidCallback onTap; diff --git a/lib/presentation/screens/tournament_details_screen.dart b/lib/presentation/screens/tournament_details_screen.dart index 3d928562..69d2cec9 100644 --- a/lib/presentation/screens/tournament_details_screen.dart +++ b/lib/presentation/screens/tournament_details_screen.dart @@ -8,11 +8,14 @@ import '../../data/models/tournament_metadata_dto.dart'; import '../../data/repositories/local_data_repository.dart'; import '../helpers/app_navigation_helper.dart'; import '../widgets/detail_info_row.dart'; +import '../widgets/detail_navigation_card.dart'; import '../widgets/detail_source_section.dart'; import '../widgets/detail_source_tile.dart'; import '../widgets/detail_tag.dart'; import '../widgets/adaptive_logo_image.dart'; import '../widgets/major_summary_card.dart'; +import 'player_list_screen.dart'; +import 'team_list_screen.dart'; import 'player_details_screen.dart'; import 'team_details_screen.dart'; @@ -29,7 +32,31 @@ class TournamentDetailsScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text(tournament.name)), + appBar: AppBar( + title: Text(tournament.name), + actions: [ + IconButton( + tooltip: 'Major Teams', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: repository), + ); + }, + icon: const Icon(Icons.groups_2_outlined), + ), + IconButton( + tooltip: 'Major Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: repository), + ); + }, + icon: const Icon(Icons.person_search_outlined), + ), + ], + ), body: FutureBuilder<_TournamentDetailsData>( future: _loadData(), builder: (context, snapshot) { @@ -72,7 +99,7 @@ class TournamentDetailsScreen extends StatelessWidget { title: 'Organizer', value: tournament.organizer, ), - if (data.metadata != null) + if ((data.metadata?.winner ?? '').trim().isNotEmpty) DetailInfoRow( title: 'Winner', value: data.metadata!.winner, @@ -100,6 +127,34 @@ class TournamentDetailsScreen extends StatelessWidget { ], ), const SizedBox(height: 12), + DetailNavigationCard( + title: 'Explore Major History', + subtitle: + 'Jump from this Major into the full team and player history views.', + actions: [ + DetailNavigationAction( + icon: Icons.groups_2_outlined, + label: 'Major Teams', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: repository), + ); + }, + ), + DetailNavigationAction( + icon: Icons.person_search_outlined, + label: 'Major Players', + onPressed: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: repository), + ); + }, + ), + ], + ), + const SizedBox(height: 12), if (_hasMeaningfulPlayoffBracket(data.metadata)) ...[ DetailSourceSection( title: 'Playoff Bracket', diff --git a/lib/presentation/screens/tournament_list_screen.dart b/lib/presentation/screens/tournament_list_screen.dart index c1f19ae8..5a39cec8 100644 --- a/lib/presentation/screens/tournament_list_screen.dart +++ b/lib/presentation/screens/tournament_list_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import '../../core/utils/date_format_helper.dart'; import '../../data/models/tournament_dto.dart'; import '../../data/repositories/local_data_repository.dart'; +import '../helpers/app_navigation_helper.dart'; import '../helpers/source_color_helper.dart'; import '../widgets/async_collection_loader.dart'; import '../widgets/chip_badge.dart'; @@ -39,12 +40,9 @@ class _TournamentListScreenState extends State { IconButton( tooltip: 'Players', onPressed: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => - PlayerListScreen(repository: widget.repository), - ), + PlayerListScreen(repository: widget.repository), ); }, icon: const Icon(Icons.person_search_outlined), @@ -52,11 +50,9 @@ class _TournamentListScreenState extends State { IconButton( tooltip: 'Teams', onPressed: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => TeamListScreen(repository: widget.repository), - ), + TeamListScreen(repository: widget.repository), ); }, icon: const Icon(Icons.groups_2_outlined), @@ -68,6 +64,21 @@ class _TournamentListScreenState extends State { builder: (context, items) { return ResponsiveCollectionGrid( items: items, + header: _MajorListHeader( + tournamentCount: items.length, + onOpenPlayers: () { + AppNavigationHelper.pushScreen( + context, + PlayerListScreen(repository: widget.repository), + ); + }, + onOpenTeams: () { + AppNavigationHelper.pushScreen( + context, + TeamListScreen(repository: widget.repository), + ); + }, + ), emptyMessage: 'No tournaments found.', itemBuilder: (context, tournament) { final eraColor = tournament.isCs2Era @@ -105,13 +116,11 @@ class _TournamentListScreenState extends State { ), ], onTap: () { - Navigator.push( + AppNavigationHelper.pushScreen( context, - MaterialPageRoute( - builder: (_) => TournamentDetailsScreen( - repository: widget.repository, - tournament: tournament, - ), + TournamentDetailsScreen( + repository: widget.repository, + tournament: tournament, ), ); }, @@ -123,3 +132,57 @@ class _TournamentListScreenState extends State { ); } } + +class _MajorListHeader extends StatelessWidget { + final int tournamentCount; + final VoidCallback onOpenPlayers; + final VoidCallback onOpenTeams; + + const _MajorListHeader({ + required this.tournamentCount, + required this.onOpenPlayers, + required this.onOpenTeams, + }); + + @override + Widget build(BuildContext context) { + return Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Major Tournament Archive', + style: Theme.of( + context, + ).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700), + ), + const SizedBox(height: 6), + Text( + '$tournamentCount events across CS:GO and CS2, with linked teams, players, stickers, autograph capsules, and souvenir sources.', + style: const TextStyle(color: Colors.white70, height: 1.35), + ), + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + OutlinedButton.icon( + onPressed: onOpenTeams, + icon: const Icon(Icons.groups_2_outlined), + label: const Text('Major Teams'), + ), + OutlinedButton.icon( + onPressed: onOpenPlayers, + icon: const Icon(Icons.person_search_outlined), + label: const Text('Major Players'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/screens/tradeup_screen.dart b/lib/presentation/screens/tradeup_screen.dart index 33eb09dd..e8504350 100644 --- a/lib/presentation/screens/tradeup_screen.dart +++ b/lib/presentation/screens/tradeup_screen.dart @@ -371,6 +371,7 @@ class _TradeUpScreenState extends State { List get _editableQualities => const [ TradeUpInputQuality.regular, TradeUpInputQuality.statTrak, + TradeUpInputQuality.souvenir, ]; @override diff --git a/lib/presentation/widgets/detail_navigation_card.dart b/lib/presentation/widgets/detail_navigation_card.dart new file mode 100644 index 00000000..1348e7d5 --- /dev/null +++ b/lib/presentation/widgets/detail_navigation_card.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class DetailNavigationCard extends StatelessWidget { + final String title; + final String subtitle; + final List actions; + + const DetailNavigationCard({ + super.key, + required this.title, + required this.subtitle, + required this.actions, + }); + + @override + Widget build(BuildContext context) { + return Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w700), + ), + const SizedBox(height: 6), + Text( + subtitle, + style: const TextStyle(color: Colors.white70, height: 1.35), + ), + const SizedBox(height: 12), + Wrap( + spacing: 10, + runSpacing: 10, + children: [ + for (final action in actions) + OutlinedButton.icon( + onPressed: action.onPressed, + icon: Icon(action.icon), + label: Text(action.label), + ), + ], + ), + ], + ), + ), + ); + } +} + +class DetailNavigationAction { + final IconData icon; + final String label; + final VoidCallback onPressed; + + const DetailNavigationAction({ + required this.icon, + required this.label, + required this.onPressed, + }); +} diff --git a/lib/presentation/widgets/tradeup_selected_slot.dart b/lib/presentation/widgets/tradeup_selected_slot.dart index e9463029..f3e5c9e4 100644 --- a/lib/presentation/widgets/tradeup_selected_slot.dart +++ b/lib/presentation/widgets/tradeup_selected_slot.dart @@ -103,7 +103,7 @@ class TradeUpSelectedSlot extends StatelessWidget { case TradeUpInputQuality.statTrak: return 'StatTrak™'; case TradeUpInputQuality.souvenir: - return ''; + return 'Souvenir'; } } } diff --git a/pubspec.yaml b/pubspec.yaml index d9a3292d..ca451f1a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: cs2_simulator description: "Counter-Strike 2 case opening and Trade-Up contract creation simulator written in Flutter + Dart." publish_to: 'none' -version: 0.13.0 +version: 0.14.0 environment: sdk: ^3.11.3 diff --git a/test/core/collection/collection_entry_test.dart b/test/core/collection/collection_entry_test.dart new file mode 100644 index 00000000..9803b67b --- /dev/null +++ b/test/core/collection/collection_entry_test.dart @@ -0,0 +1,55 @@ +import 'package:cs2_simulator/core/collection/collection_entry.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('CollectionEntry', () { + test('round-trips through json', () { + final entry = CollectionEntry( + entryId: 'entry-1', + category: 'skin', + filterCategory: 'knife', + itemId: '9001', + stackKey: 'skin:9001:true:false', + title: '★ Karambit | Doppler', + subtitle: 'Factory New', + imagePath: 'assets/skins/9001.webp', + rarity: 'COVERT', + sourceName: 'Gamma Case', + sourceType: 'CASE', + acquiredAt: DateTime.parse('2026-04-12T12:00:00Z'), + isStatTrak: true, + isSouvenir: false, + floatValue: 0.0321, + exterior: 'Factory New', + patternSeed: 305, + ); + + final decoded = CollectionEntry.fromJson(entry.toJson()); + + expect(decoded.entryId, entry.entryId); + expect(decoded.filterCategory, 'knife'); + expect(decoded.isStatTrak, isTrue); + expect(decoded.patternSeed, 305); + expect(decoded.acquiredAt, entry.acquiredAt); + }); + + test('falls back to category when legacy filter category is missing', () { + final decoded = CollectionEntry.fromJson({ + 'entryId': 'entry-2', + 'category': 'sticker', + 'itemId': '10', + 'stackKey': 'sticker:10', + 'title': 'Sticker', + 'subtitle': 'Paper', + 'imagePath': 'assets/stickers/10.webp', + 'rarity': 'HIGH_GRADE', + 'acquiredAt': '2026-04-12T12:00:00.000Z', + }); + + expect(decoded.filterCategory, 'sticker'); + expect(decoded.sourceName, ''); + expect(decoded.sourceType, ''); + expect(decoded.isStatTrak, isFalse); + }); + }); +} diff --git a/test/core/collection/collection_tracking_service_test.dart b/test/core/collection/collection_tracking_service_test.dart new file mode 100644 index 00000000..fe5c4d99 --- /dev/null +++ b/test/core/collection/collection_tracking_service_test.dart @@ -0,0 +1,150 @@ +import 'package:cs2_simulator/core/collection/collection_tracking_service.dart'; +import 'package:cs2_simulator/domain/dropped_skin.dart'; +import 'package:cs2_simulator/domain/dropped_sticker.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; +import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; + +import '../../test_data_builders.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + SharedPreferencesAsyncPlatform.instance = + InMemorySharedPreferencesAsync.empty(); + }); + + tearDown(() { + SharedPreferencesAsyncPlatform.instance = null; + }); + + group('CollectionTrackingService', () { + test('records skin drops and preserves knife filter category', () async { + final service = CollectionTrackingService(); + final knife = buildSkin( + id: '301', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Doppler', + ); + + await service.recordSkinDrop( + drop: DroppedSkin( + skin: knife, + isStatTrak: false, + isSouvenir: false, + skinFloat: 0.12345, + exterior: 'Minimal Wear', + patternSeed: 17, + ), + sourceName: 'Dreams & Nightmares Case', + sourceType: 'Case', + ); + + final entries = await service.loadEntries(); + + expect(entries, hasLength(1)); + expect(entries.single.category, 'skin'); + expect(entries.single.filterCategory, 'knife'); + expect(entries.single.patternSeed, 17); + }); + + test('groups summaries and computes best float and flags', () async { + final service = CollectionTrackingService(); + final skin = buildSkin(id: '302', name: 'Printstream'); + + await service.recordSkinDrop( + drop: DroppedSkin( + skin: skin, + isStatTrak: false, + isSouvenir: false, + skinFloat: 0.30, + exterior: 'Field-Tested', + patternSeed: null, + ), + sourceName: 'Container A', + sourceType: 'Case', + ); + await service.recordSkinDrop( + drop: DroppedSkin( + skin: skin, + isStatTrak: true, + isSouvenir: false, + skinFloat: 0.12, + exterior: 'Minimal Wear', + patternSeed: null, + ), + sourceName: 'Container A', + sourceType: 'Case', + ); + + final summaries = await service.loadSummaries(); + + expect(summaries, hasLength(2)); + expect(summaries.map((summary) => summary.bestFloat), contains(0.12)); + expect(summaries.any((summary) => summary.hasStatTrak), isTrue); + }); + + test('calculates per-source stats with unique item counting', () async { + final service = CollectionTrackingService(); + final skin = buildSkin(id: '303', name: 'Redline'); + final sticker = buildSticker(id: '401', name: 'Team Spirit'); + + await service.recordSkinDrop( + drop: DroppedSkin( + skin: skin, + isStatTrak: false, + isSouvenir: false, + skinFloat: 0.20, + exterior: 'Field-Tested', + patternSeed: null, + ), + sourceName: 'Source A', + sourceType: 'Case', + ); + await service.recordSkinDrop( + drop: DroppedSkin( + skin: skin, + isStatTrak: false, + isSouvenir: false, + skinFloat: 0.25, + exterior: 'Field-Tested', + patternSeed: null, + ), + sourceName: 'Source A', + sourceType: 'Case', + ); + await service.recordStickerDrop( + drop: DroppedSticker(sticker: sticker), + sourceName: 'Source A', + sourceType: 'Case', + ); + + final stats = await service.loadSourceStats( + sourceName: 'Source A', + sourceType: 'Case', + ); + + expect(stats.openedCount, 3); + expect(stats.collectedUniqueCount, 2); + }); + + test('clears saved collection data', () async { + final service = CollectionTrackingService(); + + await service.recordStickerDrop( + drop: DroppedSticker(sticker: buildSticker(id: '402')), + sourceName: 'Source B', + sourceType: 'Capsule', + ); + expect(await service.loadEntries(), isNotEmpty); + + await service.clearAll(); + + expect(await service.loadEntries(), isEmpty); + expect(await service.loadSummaries(), isEmpty); + }); + }); +} diff --git a/test/core/utils/date_format_helper_test.dart b/test/core/utils/date_format_helper_test.dart new file mode 100644 index 00000000..de38c38d --- /dev/null +++ b/test/core/utils/date_format_helper_test.dart @@ -0,0 +1,30 @@ +import 'package:cs2_simulator/core/utils/date_format_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('DateFormatHelper', () { + test('formats release date', () { + expect(DateFormatHelper.formatReleaseDate('2025-06-22'), '22 Jun 2025'); + }); + + test('returns null for empty date', () { + expect(DateFormatHelper.formatReleaseDate(null), isNull); + expect(DateFormatHelper.formatReleaseDate(''), isNull); + }); + + test('keeps unknown formats unchanged', () { + expect(DateFormatHelper.formatReleaseDate('June 2025'), 'June 2025'); + }); + + test('formats date range and collapses identical dates', () { + expect( + DateFormatHelper.formatDateRange('2025-06-03', '2025-06-22'), + '03 Jun 2025 - 22 Jun 2025', + ); + expect( + DateFormatHelper.formatDateRange('2025-06-03', '2025-06-03'), + '03 Jun 2025', + ); + }); + }); +} diff --git a/test/core/utils/team_name_helper_test.dart b/test/core/utils/team_name_helper_test.dart new file mode 100644 index 00000000..2c617039 --- /dev/null +++ b/test/core/utils/team_name_helper_test.dart @@ -0,0 +1,17 @@ +import 'package:cs2_simulator/core/utils/team_name_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('TeamNameHelper', () { + test('canonicalizes known aliases', () { + expect(TeamNameHelper.canonicalize('mousesports'), 'MOUZ'); + expect(TeamNameHelper.canonicalize('Heroic'), 'HEROIC'); + expect(TeamNameHelper.canonicalize('Complexity Gaming'), 'Complexity'); + expect(TeamNameHelper.canonicalize('Gambit Gaming'), 'Gambit Esports'); + }); + + test('normalizes whitespace without changing unknown teams', () { + expect(TeamNameHelper.canonicalize(' Team Spirit '), 'Team Spirit'); + }); + }); +} diff --git a/test/data/models/collectible_models_test.dart b/test/data/models/collectible_models_test.dart new file mode 100644 index 00000000..fe760199 --- /dev/null +++ b/test/data/models/collectible_models_test.dart @@ -0,0 +1,96 @@ +import 'package:cs2_simulator/data/models/agent_dto.dart'; +import 'package:cs2_simulator/data/models/charm_dto.dart'; +import 'package:cs2_simulator/data/models/graffiti_dto.dart'; +import 'package:cs2_simulator/data/models/patch_dto.dart'; +import 'package:cs2_simulator/data/models/pin_dto.dart'; +import 'package:cs2_simulator/data/models/sticker_dto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('StickerDto', () { + test('uses collection before tournament for source label', () { + final sticker = StickerDto.fromJson({ + 'id': '1', + 'name': 'Sticker | Test', + 'stickerImage': 'assets/stickers/1.webp', + 'rarity': 'HIGH_GRADE', + 'stickerType': 'AUTOGRAPH', + 'effect': 'OTHER', + 'collection': 'Capsule Collection', + 'tournament': 'PGL Copenhagen 2024', + }); + + expect(sticker.sourceLabel, 'Capsule Collection'); + expect(sticker.stickerTypeLabel, 'Autograph'); + }); + + test('falls back to tournament and sticker type labels', () { + final eventSticker = StickerDto.fromJson({ + 'id': '2', + 'name': 'Sticker | Event', + 'stickerImage': 'assets/stickers/2.webp', + 'rarity': 'HIGH_GRADE', + 'stickerType': 'EVENT', + 'effect': 'OTHER', + 'tournament': 'BLAST.tv Paris 2023', + }); + final plainSticker = StickerDto.fromJson({ + 'id': '3', + 'name': 'Sticker | Plain', + 'stickerImage': 'assets/stickers/3.webp', + 'rarity': 'HIGH_GRADE', + 'stickerType': 'STICKER', + 'effect': 'OTHER', + }); + + expect(eventSticker.sourceLabel, 'BLAST.tv Paris 2023'); + expect(eventSticker.stickerTypeLabel, 'Event'); + expect(plainSticker.sourceLabel, 'Sticker'); + }); + }); + + group('simple collectible DTO parsing', () { + test('agent defaults unknown team when omitted', () { + final agent = AgentDto.fromJson({ + 'id': '10', + 'name': 'Agent', + 'agentImage': 'assets/agents/10.webp', + 'rarity': 'DISTINGUISHED', + }); + + expect(agent.team, 'UNKNOWN'); + }); + + test('pin, graffiti, patch, and charm parse nullable collection', () { + final pin = PinDto.fromJson({ + 'id': '11', + 'name': 'Pin', + 'pinImage': 'assets/pins/11.webp', + 'rarity': 'HIGH_GRADE', + }); + final graffiti = GraffitiDto.fromJson({ + 'id': '12', + 'name': 'Graffiti', + 'graffitiImage': 'assets/graffiti/12.webp', + 'rarity': 'BASE_GRADE', + }); + final patch = PatchDto.fromJson({ + 'id': '13', + 'name': 'Patch', + 'patchImage': 'assets/patches/13.webp', + 'rarity': 'HIGH_GRADE', + }); + final charm = CharmDto.fromJson({ + 'id': '14', + 'name': 'Charm', + 'charmImage': 'assets/charms/14.webp', + 'rarity': 'HIGH_GRADE', + }); + + expect(pin.collection, isNull); + expect(graffiti.collection, isNull); + expect(patch.collection, isNull); + expect(charm.collection, isNull); + }); + }); +} diff --git a/test/data/models/container_dto_test.dart b/test/data/models/container_dto_test.dart new file mode 100644 index 00000000..9c5cd2de --- /dev/null +++ b/test/data/models/container_dto_test.dart @@ -0,0 +1,36 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('ContainerDto', () { + test('exposes type flags and labels', () { + final reward = buildContainer( + id: '1', + type: 'REWARD_COLLECTION', + sourceType: 'ARMORY_REWARD', + sourceName: 'The Armory', + currency: 'STARS', + cost: 2, + ); + + expect(reward.isRewardCollection, isTrue); + expect(reward.isArmoryRewardCollection, isTrue); + expect(reward.typeLabel, 'Reward Collection'); + expect(reward.sourceTypeLabel, 'Armory Reward'); + expect(reward.sourceLabel, 'The Armory'); + expect(reward.currencyLabel, 'Stars'); + expect(reward.actionLabel, 'Spend 2 Stars'); + }); + + test('builds readable fallback source label from source id', () { + final container = buildContainer( + id: '2', + sourceId: 'BROKEN_FANG', + sourceName: null, + ); + + expect(container.sourceLabel, 'Broken Fang'); + }); + }); +} diff --git a/test/data/models/content_and_tournament_models_test.dart b/test/data/models/content_and_tournament_models_test.dart new file mode 100644 index 00000000..59cff598 --- /dev/null +++ b/test/data/models/content_and_tournament_models_test.dart @@ -0,0 +1,119 @@ +import 'package:cs2_simulator/data/models/container_content_dto.dart'; +import 'package:cs2_simulator/data/models/music_kit_content_dto.dart'; +import 'package:cs2_simulator/data/models/sticker_content_dto.dart'; +import 'package:cs2_simulator/data/models/tournament_dto.dart'; +import 'package:cs2_simulator/data/models/tournament_metadata_dto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('content DTOs', () { + test('parse ids and legacy music kit content payloads', () { + final containerContent = ContainerContentDto.fromJson({ + 'containerId': '100', + 'skinIds': ['1', '2'], + }); + final stickerContent = StickerContentDto.fromJson({ + 'containerId': '200', + 'stickerIds': ['3', '4'], + }); + final musicKitContent = MusicKitContentDto.fromJson({ + 'containerId': '300', + 'musicKitIds': ['5', '6'], + }); + + expect(containerContent.skinIds, ['1', '2']); + expect(stickerContent.stickerIds, ['3', '4']); + expect(musicKitContent.items.length, 2); + expect(musicKitContent.items.first.hasRegular, isTrue); + expect(musicKitContent.items.first.hasStatTrak, isFalse); + }); + + test('parse structured music kit content entries', () { + final musicKitContent = MusicKitContentDto.fromJson({ + 'containerId': '301', + 'items': [ + {'musicKitId': '7', 'hasRegular': true, 'hasStatTrak': false}, + {'musicKitId': '8', 'hasRegular': false, 'hasStatTrak': true}, + ], + }); + + expect(musicKitContent.items.first.musicKitId, '7'); + expect(musicKitContent.items.last.hasStatTrak, isTrue); + }); + }); + + group('tournament DTOs', () { + test('infers year and era from tournament name', () { + const csGo = TournamentDto( + name: 'DreamHack Winter 2014', + imagePath: 'assets/tournament_logos/dhw2014.png', + releaseDate: '2014-11-27', + startDate: '2014-11-27', + endDate: '2014-11-29', + organizer: 'DreamHack', + souvenirPackageCount: 1, + stickerContainerCount: 0, + ); + const cs2 = TournamentDto( + name: 'PGL Copenhagen 2024', + imagePath: 'assets/tournament_logos/pgl2024.png', + releaseDate: '2024-03-17', + startDate: '2024-03-17', + endDate: '2024-03-31', + organizer: 'PGL', + souvenirPackageCount: 1, + stickerContainerCount: 2, + ); + + expect(csGo.year, 2014); + expect(csGo.eraLabel, 'CS:GO Era'); + expect(cs2.year, 2024); + expect(cs2.eraLabel, 'CS2 Era'); + }); + + test('parses tournament metadata, rosters, and stage dates', () { + final metadata = TournamentMetadataDto.fromJson({ + 'name': 'BLAST.tv Austin 2025', + 'winner': 'Team Vitality', + 'tournamentLogo': 'assets/tournament_logos/austin2025.png', + 'startDate': '2025-06-03', + 'endDate': '2025-06-22', + 'placements': [ + { + 'place': '1st', + 'team': 'Team Vitality', + 'teamLogo': 'assets/tournament_logos/team_vitality.png', + }, + ], + 'teamRosters': [ + { + 'team': 'Team Vitality', + 'teamLogo': 'assets/tournament_logos/team_vitality.png', + 'players': ['apEX', 'ZywOo', '', 'flameZ'], + }, + ], + 'stageDates': [ + { + 'phase': 'Playoffs', + 'startDate': '2025-06-19', + 'endDate': '2025-06-22', + }, + ], + 'playoffMatches': [ + { + 'round': 'Grand Final', + 'team1': 'Team Vitality', + 'team2': 'The MongolZ', + 'score1': '2', + 'score2': '1', + }, + ], + }); + + expect(metadata.placements.single.team, 'Team Vitality'); + expect(metadata.teamRosters.single.players, ['apEX', 'ZywOo', 'flameZ']); + expect(metadata.stageDates.single.phase, 'Playoffs'); + expect(metadata.playoffMatches.single.round, 'Grand Final'); + }); + }); +} diff --git a/test/data/models/music_kit_dto_test.dart b/test/data/models/music_kit_dto_test.dart new file mode 100644 index 00000000..ede978f1 --- /dev/null +++ b/test/data/models/music_kit_dto_test.dart @@ -0,0 +1,37 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('MusicKitDto', () { + test('splits artist and track name', () { + final kit = buildMusicKit(id: '1', name: 'AWOLNATION, I Am'); + + expect(kit.artist, 'AWOLNATION'); + expect(kit.trackName, 'I Am'); + }); + + test('keeps full name when comma is missing', () { + final kit = buildMusicKit(id: '2', name: 'NoCommaTrack'); + + expect(kit.artist, isNull); + expect(kit.trackName, 'NoCommaTrack'); + }); + + test('adds StatTrak prefix only for stattrak-only kits', () { + final stattrakOnly = buildMusicKit( + id: '3', + hasRegular: false, + hasStatTrak: true, + ); + final shared = buildMusicKit( + id: '4', + hasRegular: true, + hasStatTrak: true, + ); + + expect(stattrakOnly.displayName, startsWith('StatTrak™ ')); + expect(shared.displayName, 'Artist, Track'); + }); + }); +} diff --git a/test/data/models/skin_dto_test.dart b/test/data/models/skin_dto_test.dart new file mode 100644 index 00000000..2f4318dc --- /dev/null +++ b/test/data/models/skin_dto_test.dart @@ -0,0 +1,92 @@ +import 'package:cs2_simulator/data/models/skin_dto.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('SkinDto', () { + test('maps display names for weapons, knives, and gloves', () { + expect( + buildSkin(id: '1', itemKind: 'WEAPON', itemId: 'USP_S').itemDisplayName, + 'USP-S', + ); + expect( + buildSkin( + id: '2', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BUTTERFLY', + ).itemDisplayName, + 'Butterfly Knife', + ); + expect( + buildSkin( + id: '3', + itemKind: 'GLOVES', + weaponType: 'GLOVES', + itemId: 'SPORT', + ).itemDisplayName, + 'Sport Gloves', + ); + }); + + test('exposes special item and collection flags', () { + final armorySkin = SkinDto.fromJson({ + 'id': '4', + 'name': 'Test', + 'skinImage': 'assets/skins/4.webp', + 'floatTop': 0, + 'floatBottom': 1, + 'rarity': 'MIL_SPEC', + 'weaponType': 'RIFLE', + 'itemKind': 'WEAPON', + 'itemId': 'AK_47', + 'collection': 'Test', + 'finishCatalogName': 'Test', + 'variantName': null, + 'phase': null, + 'apiPaintIndex': '123', + 'collectionSourceType': 'ARMORY', + 'collectionSourceId': 'ARMORY', + }); + final operationSkin = SkinDto.fromJson({ + 'id': '5', + 'name': 'Test', + 'skinImage': 'assets/skins/5.webp', + 'floatTop': 0, + 'floatBottom': 1, + 'rarity': 'MIL_SPEC', + 'weaponType': 'RIFLE', + 'itemKind': 'WEAPON', + 'itemId': 'AK_47', + 'collection': 'Test', + 'finishCatalogName': 'Test', + 'variantName': null, + 'phase': null, + 'apiPaintIndex': '111', + 'collectionSourceType': 'OPERATION', + 'collectionSourceId': 'RIPTIDE', + 'operationCollectionIds': ['10008'], + 'isOperationCollection': true, + }); + + expect(armorySkin.isArmoryRewardCollection, isTrue); + expect(armorySkin.isOperationRewardCollection, isFalse); + expect(operationSkin.isOperationRewardCollection, isTrue); + expect(operationSkin.belongsToAnyOperationCollection, isTrue); + expect(operationSkin.isOperationCollection, isTrue); + }); + + test('prefers variant name over phase for display variant', () { + final withVariant = buildSkin( + id: '6', + variantName: 'Ruby', + phase: 'Phase 2', + ); + final withPhaseOnly = buildSkin(id: '7', phase: 'Phase 4'); + + expect(withVariant.displayVariant, 'Ruby'); + expect(withPhaseOnly.displayVariant, 'Phase 4'); + }); + }); +} diff --git a/test/data/repositories/local_data_repository_test.dart b/test/data/repositories/local_data_repository_test.dart new file mode 100644 index 00000000..b5908b0d --- /dev/null +++ b/test/data/repositories/local_data_repository_test.dart @@ -0,0 +1,275 @@ +import 'package:cs2_simulator/data/repositories/local_data_repository.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + late LocalDataRepository repository; + + setUp(() { + repository = LocalDataRepository(); + }); + + test('loads containers sorted by release date', () async { + final containers = await repository.loadContainers(); + + expect(containers, isNotEmpty); + expect( + (containers.first.releaseDate ?? '').compareTo( + containers.last.releaseDate ?? '', + ) <= + 0, + isTrue, + ); + + for (var i = 1; i < containers.length; i++) { + expect( + (containers[i - 1].releaseDate ?? '').compareTo( + containers[i].releaseDate ?? '', + ) <= + 0, + isTrue, + ); + } + }); + + test('groups phased skins into a shared skin family', () async { + final groups = await repository.loadSkinGroups(); + final gammaDopplerGroup = groups.firstWhere( + (group) => + group.primary.itemId == 'GLOCK_18' && group.name == 'Gamma Doppler', + ); + + expect(gammaDopplerGroup.hasMultipleVariants, isTrue); + expect(gammaDopplerGroup.variantLabels, contains('Emerald')); + expect(gammaDopplerGroup.variantLabels, contains('Phase 3')); + }); + + test('loads all variants for a selected grouped skin', () async { + final groups = await repository.loadSkinGroups(); + final gammaDopplerGroup = groups.firstWhere( + (group) => + group.primary.itemId == 'GLOCK_18' && group.name == 'Gamma Doppler', + ); + + final variants = await repository.loadSkinVariantsForSkin( + gammaDopplerGroup.primary.id, + ); + + expect(variants.length, gammaDopplerGroup.variants.length); + expect( + variants.map((variant) => variant.id), + containsAll([ + for (final variant in gammaDopplerGroup.variants) variant.id, + ]), + ); + }); + + test('groups music kit variants by shared identity', () async { + final groups = await repository.loadGroupedMusicKits(); + final group = groups.firstWhere( + (item) => + item.name == 'Austin Wintory, The Devil Went Clubbing In Georgia' && + item.collection == 'Masterminds 2', + ); + + expect(group.hasRegular, isTrue); + expect(group.hasStatTrak, isTrue); + expect(group.variants, isNotEmpty); + }); + + test('resolves grouped music kit sources back to their container', () async { + final containers = await repository.loadContainersForMusicKitGroup( + 'Austin Wintory, The Devil Went Clubbing In Georgia', + 'Masterminds 2', + ); + + expect(containers, isNotEmpty); + expect( + containers.any( + (container) => container.name == 'Masterminds 2 Music Kit Box', + ), + isTrue, + ); + }); + + test( + 'loads tournaments with canonical names and ignored RMR removed', + () async { + final tournaments = await repository.loadTournaments(); + + expect(tournaments, isNotEmpty); + expect( + tournaments.any((tournament) => tournament.name.contains('2020 RMR')), + isFalse, + ); + expect( + tournaments + .where((tournament) => tournament.name.contains('Krak')) + .length, + 1, + ); + expect( + tournaments.any( + (tournament) => tournament.name == 'BLAST.tv Austin 2025', + ), + isTrue, + ); + final cologne = tournaments.firstWhere( + (tournament) => tournament.name == 'IEM Cologne 2026', + ); + expect(cologne.startDate, '2026-06-02'); + expect(cologne.endDate, '2026-06-21'); + expect(cologne.souvenirPackageCount, 0); + expect(cologne.stickerContainerCount, 0); + }, + ); + + test('loads tournament metadata with stage dates and winner', () async { + final metadata = await repository.loadTournamentMetadataByName( + 'BLAST.tv Austin 2025', + ); + + expect(metadata, isNotNull); + expect(metadata!.winner, 'Team Vitality'); + expect(metadata.startDate, '2025-06-03'); + expect(metadata.endDate, '2025-06-22'); + expect(metadata.stageDates.map((item) => item.phase), contains('Stage 3')); + }); + + test('loads souvenir packages for a tournament', () async { + final packages = await repository.loadSouvenirPackagesForTournament( + 'DreamHack Winter 2013', + ); + + expect(packages, isNotEmpty); + expect( + packages.every( + (container) => + container.isSouvenirPackage && + container.tournamentName == 'DreamHack Winter 2013', + ), + isTrue, + ); + }); + + test('loads sticker containers linked to a tournament', () async { + final containers = await repository.loadStickerContainersForTournament( + 'BLAST.tv Paris 2023', + ); + + expect(containers, isNotEmpty); + expect( + containers.every( + (container) => + container.isStickerCapsule || container.isStickerCollection, + ), + isTrue, + ); + }); + + test( + 'canonicalizes team summaries across legacy organization names', + () async { + final teams = await repository.loadTournamentTeams(); + + expect(teams.any((team) => team.teamName == 'MOUZ'), isTrue); + expect(teams.any((team) => team.teamName == 'mousesports'), isFalse); + expect(teams.any((team) => team.teamName == 'Gambit Esports'), isTrue); + expect(teams.any((team) => team.teamName == 'Gambit Gaming'), isFalse); + }, + ); + + test('canonicalizes team tournament results for legacy aliases', () async { + final results = await repository.loadTeamTournamentResults('mousesports'); + + expect(results, isNotEmpty); + expect(results.every((result) => result.teamName == 'MOUZ'), isTrue); + }); + + test('loads player summaries with canonical player display names', () async { + final players = await repository.loadTournamentPlayers(); + + expect(players.any((player) => player.playerName == 'electroNic'), isTrue); + expect(players.any((player) => player.playerName == 'electronic'), isFalse); + }); + + test('loads player appearances from tournament rosters', () async { + final appearances = await repository.loadPlayerTournamentAppearances( + 'ropz', + ); + + expect(appearances, isNotEmpty); + expect( + appearances.any( + (appearance) => + appearance.tournamentName == 'PGL Stockholm 2021' && + appearance.teamName == 'MOUZ', + ), + isTrue, + ); + }); + + test('loads tournament players from roster context', () async { + final players = await repository.loadPlayersForTournament( + 'PGL Stockholm 2021', + ); + + expect(players.any((player) => player.playerName == 'ropz'), isTrue); + }); + + test('resolves item source lookups back to their owning sources', () async { + final containerContents = await repository.loadContainerContents(); + final stickerContents = await repository.loadStickerContents(); + final pinContents = await repository.loadPinContents(); + final rewardContents = await repository.loadRewardCollectionContents(); + final agentContents = await repository.loadAgentCollectionContents(); + + final skinSources = await repository.loadContainersForSkin( + containerContents.first.skinIds.first, + ); + final stickerSources = await repository.loadContainersForSticker( + stickerContents.first.stickerIds.first, + ); + final pinSources = await repository.loadContainersForPin( + pinContents.first.pinIds.first, + ); + final rewardSources = await repository.loadRewardCollectionsForSkin( + rewardContents.first.skinIds.first, + ); + final agentSources = await repository.loadAgentCollectionsForAgent( + agentContents.first.agentIds.first, + ); + + expect( + skinSources.any( + (container) => container.id == containerContents.first.containerId, + ), + isTrue, + ); + expect( + stickerSources.any( + (container) => container.id == stickerContents.first.containerId, + ), + isTrue, + ); + expect( + pinSources.any( + (container) => container.id == pinContents.first.containerId, + ), + isTrue, + ); + expect( + rewardSources.any( + (container) => container.id == rewardContents.first.rewardCollectionId, + ), + isTrue, + ); + expect( + agentSources.any( + (container) => container.id == agentContents.first.agentCollectionId, + ), + isTrue, + ); + }); +} diff --git a/test/domain/dropped_collectibles_test.dart b/test/domain/dropped_collectibles_test.dart new file mode 100644 index 00000000..5b77f026 --- /dev/null +++ b/test/domain/dropped_collectibles_test.dart @@ -0,0 +1,30 @@ +import 'package:cs2_simulator/domain/dropped_agent.dart'; +import 'package:cs2_simulator/domain/dropped_charm.dart'; +import 'package:cs2_simulator/domain/dropped_graffiti.dart'; +import 'package:cs2_simulator/domain/dropped_music_kit.dart'; +import 'package:cs2_simulator/domain/dropped_patch.dart'; +import 'package:cs2_simulator/domain/dropped_pin.dart'; +import 'package:cs2_simulator/domain/dropped_sticker.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + test('dropped collectible wrappers preserve their underlying dto', () { + final sticker = DroppedSticker(sticker: buildSticker(id: '1')); + final musicKit = DroppedMusicKit(musicKit: buildMusicKit(id: '2')); + final pin = DroppedPin(pin: buildPin(id: '3')); + final agent = DroppedAgent(agent: buildAgent(id: '4')); + final graffiti = DroppedGraffiti(graffiti: buildGraffiti(id: '5')); + final patch = DroppedPatch(patch: buildPatch(id: '6')); + final charm = DroppedCharm(charm: buildCharm(id: '7')); + + expect(sticker.sticker.id, '1'); + expect(musicKit.musicKit.id, '2'); + expect(pin.pin.id, '3'); + expect(agent.agent.id, '4'); + expect(graffiti.graffiti.id, '5'); + expect(patch.patch.id, '6'); + expect(charm.charm.id, '7'); + }); +} diff --git a/test/domain/dropped_skin_test.dart b/test/domain/dropped_skin_test.dart new file mode 100644 index 00000000..319096e5 --- /dev/null +++ b/test/domain/dropped_skin_test.dart @@ -0,0 +1,40 @@ +import 'package:cs2_simulator/domain/dropped_skin.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('DroppedSkin', () { + test('detects vanilla knives', () { + final vanilla = DroppedSkin( + skin: buildSkin( + id: '1', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Vanilla', + ), + isStatTrak: false, + isSouvenir: false, + skinFloat: null, + exterior: null, + patternSeed: null, + ); + + expect(vanilla.isVanillaKnife, isTrue); + }); + + test('builds readable full display name', () { + final drop = DroppedSkin( + skin: buildSkin(id: '2', itemId: 'AK_47', name: 'Redline'), + isStatTrak: true, + isSouvenir: false, + skinFloat: 0.15, + exterior: 'Minimal Wear', + patternSeed: 33, + ); + + expect(drop.fullDisplayName, 'StatTrak™ AK-47 | Redline'); + }); + }); +} diff --git a/test/domain/odds_test.dart b/test/domain/odds_test.dart new file mode 100644 index 00000000..a49526cc --- /dev/null +++ b/test/domain/odds_test.dart @@ -0,0 +1,45 @@ +import 'package:cs2_simulator/domain/case_odds.dart'; +import 'package:cs2_simulator/domain/package_odds.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('CaseOdds', () { + test('sum to 100% within a tiny tolerance', () { + final total = CaseOdds.values.fold( + 0, + (sum, entry) => sum + entry.chance, + ); + + expect(total, closeTo(1.0, 0.0001)); + }); + + test('decrease monotonically from mil-spec to special item', () { + for (var i = 1; i < CaseOdds.values.length; i++) { + expect( + CaseOdds.values[i - 1].chance, + greaterThan(CaseOdds.values[i].chance), + ); + } + }); + }); + + group('PackageOdds', () { + test('sum to 100% within a tiny tolerance', () { + final total = PackageOdds.values.fold( + 0, + (sum, entry) => sum + entry.chance, + ); + + expect(total, closeTo(1.0, 0.0001)); + }); + + test('decrease monotonically from consumer to covert', () { + for (var i = 1; i < PackageOdds.values.length; i++) { + expect( + PackageOdds.values[i - 1].chance, + greaterThan(PackageOdds.values[i].chance), + ); + } + }); + }); +} diff --git a/test/domain/simulator_services_test.dart b/test/domain/simulator_services_test.dart new file mode 100644 index 00000000..47c686f9 --- /dev/null +++ b/test/domain/simulator_services_test.dart @@ -0,0 +1,181 @@ +import 'package:cs2_simulator/domain/agent_collection_simulator_service.dart'; +import 'package:cs2_simulator/domain/charm_collection_simulator_service.dart'; +import 'package:cs2_simulator/domain/container_simulator_service.dart'; +import 'package:cs2_simulator/domain/graffiti_simulator_service.dart'; +import 'package:cs2_simulator/domain/music_kit_simulator_service.dart'; +import 'package:cs2_simulator/domain/operation_collection_simulator_service.dart'; +import 'package:cs2_simulator/domain/patch_simulator_service.dart'; +import 'package:cs2_simulator/domain/pin_simulator_service.dart'; +import 'package:cs2_simulator/domain/reward_collection_simulator_service.dart'; +import 'package:cs2_simulator/domain/sticker_simulator_service.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('Opening simulator services', () { + test('ContainerSimulatorService throws for invalid inputs', () { + final service = ContainerSimulatorService(); + + expect( + () => service.openCase( + skins: const [], + containerDto: buildContainer(id: '1'), + ), + throwsException, + ); + + expect( + () => service.openCase( + skins: [buildSkin(id: '10')], + containerDto: buildContainer(id: '2', type: 'TERMINAL'), + ), + throwsException, + ); + }); + + test('xray package reveals the guaranteed first skin', () { + final service = ContainerSimulatorService(); + final first = buildSkin(id: '11', floatTop: 0.05, floatBottom: 0.07); + final second = buildSkin(id: '12'); + + final drop = service.openCase( + skins: [first, second], + containerDto: buildContainer(id: '3', type: 'XRAY_PACKAGE'), + ); + + expect(drop.skin.id, '11'); + expect(drop.isStatTrak, isFalse); + expect(drop.isSouvenir, isFalse); + }); + + test('terminal offers build requested number of offers', () { + final service = ContainerSimulatorService(); + final offers = service.buildTerminalOffers( + skins: [ + buildSkin(id: '13', rarity: 'MIL_SPEC'), + buildSkin(id: '14', rarity: 'RESTRICTED'), + ], + count: 3, + ); + + expect(offers, hasLength(3)); + expect(offers.first.offerIndex, 1); + expect(offers.last.offerIndex, 3); + }); + + test( + 'sticker simulator throws on empty input and returns provided sticker', + () { + final service = StickerSimulatorService(); + expect( + () => service.openContainer(stickers: const []), + throwsException, + ); + + final sticker = buildSticker(id: '21'); + final drop = service.openContainer(stickers: [sticker]); + expect(drop.sticker.id, '21'); + }, + ); + + test( + 'music kit simulator throws on empty input and returns provided kit', + () { + final service = MusicKitSimulatorService(); + expect( + () => service.openContainer(musicKits: const []), + throwsException, + ); + + final kit = buildMusicKit(id: '31'); + final drop = service.openContainer(musicKits: [kit]); + expect(drop.musicKit.id, '31'); + }, + ); + + test('pin simulator throws on empty input and returns provided pin', () { + final service = PinSimulatorService(); + expect(() => service.openContainer(pins: const []), throwsException); + + final pin = buildPin(id: '41'); + final drop = service.openContainer(pins: [pin]); + expect(drop.pin.id, '41'); + }); + + test( + 'graffiti simulator throws on empty input and returns provided graffiti', + () { + final service = GraffitiSimulatorService(); + expect( + () => service.openContainer(graffiti: const []), + throwsException, + ); + + final graffiti = buildGraffiti(id: '51'); + final drop = service.openContainer(graffiti: [graffiti]); + expect(drop.graffiti.id, '51'); + }, + ); + + test( + 'patch simulator throws on empty input and returns provided patch', + () { + final service = PatchSimulatorService(); + expect(() => service.openContainer(patches: const []), throwsException); + + final patch = buildPatch(id: '61'); + final drop = service.openContainer(patches: [patch]); + expect(drop.patch.id, '61'); + }, + ); + + test('reward and operation collection simulators reject empty pools', () { + expect( + () => RewardCollectionSimulatorService().openRewardCollection( + skins: const [], + collection: buildContainer(id: '71', type: 'REWARD_COLLECTION'), + ), + throwsException, + ); + + expect( + () => OperationCollectionSimulatorService().openCollection( + skins: const [], + collection: buildContainer(id: '72', type: 'OPERATION_COLLECTION'), + ), + throwsException, + ); + }); + + test( + 'agent and charm simulators reject empty pools and return entries', + () { + expect( + () => AgentCollectionSimulatorService().openCollection( + agents: const [], + collection: buildContainer(id: '81', type: 'AGENT_COLLECTION'), + ), + throwsException, + ); + expect( + () => CharmCollectionSimulatorService().openCollection( + charms: const [], + ), + throwsException, + ); + + final agentDrop = AgentCollectionSimulatorService().openCollection( + agents: [buildAgent(id: '82')], + collection: buildContainer(id: '82', type: 'AGENT_COLLECTION'), + ); + final charmDrop = CharmCollectionSimulatorService().openCollection( + charms: [buildCharm(id: '83')], + ); + + expect(agentDrop.agent.id, '82'); + expect(charmDrop.charm.id, '83'); + }, + ); + }); +} diff --git a/test/domain/skin_float_helper_test.dart b/test/domain/skin_float_helper_test.dart new file mode 100644 index 00000000..2fa69809 --- /dev/null +++ b/test/domain/skin_float_helper_test.dart @@ -0,0 +1,40 @@ +import 'dart:math'; + +import 'package:cs2_simulator/domain/skin_float_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('SkinFloatHelper', () { + test('exteriorFromFloat uses expected thresholds', () { + expect(SkinFloatHelper.exteriorFromFloat(0.07), 'Factory New'); + expect(SkinFloatHelper.exteriorFromFloat(0.08), 'Minimal Wear'); + expect(SkinFloatHelper.exteriorFromFloat(0.20), 'Field-Tested'); + expect(SkinFloatHelper.exteriorFromFloat(0.40), 'Well-Worn'); + expect(SkinFloatHelper.exteriorFromFloat(0.80), 'Battle-Scarred'); + }); + + test('generateWear stays within supplied bounds', () { + final random = Random(42); + for (var index = 0; index < 50; index++) { + final result = SkinFloatHelper.generateWear( + random: random, + minFloat: 0.10, + maxFloat: 0.20, + ); + expect(result.floatValue, isNotNull); + expect(result.floatValue!, inInclusiveRange(0.10, 0.20)); + expect(result.exterior, isNotNull); + } + }); + + test('generateWear collapses when max is not above min', () { + final result = SkinFloatHelper.generateWear( + random: Random(1), + minFloat: 0.45, + maxFloat: 0.45, + ); + expect(result.floatValue, 0.45); + expect(result.exterior, 'Well-Worn'); + }); + }); +} diff --git a/test/domain/skin_pattern_helper_test.dart b/test/domain/skin_pattern_helper_test.dart new file mode 100644 index 00000000..bbc4b19d --- /dev/null +++ b/test/domain/skin_pattern_helper_test.dart @@ -0,0 +1,119 @@ +import 'dart:math'; + +import 'package:cs2_simulator/domain/skin_pattern_helper.dart'; +import 'package:cs2_simulator/domain/special_item_variant_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('SkinPatternHelper', () { + final gammaPhase1 = buildSkin( + id: '201', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Gamma Doppler', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Phase 1', + ); + final gammaEmerald = buildSkin( + id: '202', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Gamma Doppler', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Emerald', + ); + final fade = buildSkin( + id: '203', + itemKind: 'WEAPON', + weaponType: 'PISTOL', + itemId: 'GLOCK_18', + name: 'Fade', + finishCatalogName: 'FADE', + ); + final caseHardened = buildSkin( + id: '204', + itemKind: 'WEAPON', + weaponType: 'RIFLE', + itemId: 'AK_47', + name: 'Case Hardened', + finishCatalogName: 'CASE HARDENED', + ); + final vanillaKnife = buildSkin( + id: '205', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Vanilla', + ); + + test('detects seed support for seed-driven and special items', () { + expect(SkinPatternHelper.supportsPatternSeed(fade), isTrue); + expect(SkinPatternHelper.supportsPatternSeed(vanillaKnife), isTrue); + expect( + SkinPatternHelper.supportsPatternSeed( + buildSkin(id: '206', name: 'Redline', finishCatalogName: 'REDLINE'), + ), + isFalse, + ); + }); + + test('detects explicit phase variants', () { + expect(SkinPatternHelper.hasExplicitPhaseVariant(gammaPhase1), isTrue); + expect(SkinPatternHelper.hasExplicitPhaseVariant(fade), isFalse); + }); + + test('generateSeed keeps doppler seed within selected variant bucket', () { + final variants = [gammaPhase1, gammaEmerald]; + final seed = SkinPatternHelper.generateSeed( + random: Random(3), + skin: gammaEmerald, + siblingVariants: variants, + ); + + expect(seed, isNotNull); + final resolved = SpecialItemVariantHelper.variantForSeed(variants, seed!); + expect(resolved.id, gammaEmerald.id); + }); + + test('does not duplicate phase in generic pattern description', () { + expect( + SkinPatternHelper.describePattern(skin: gammaPhase1, patternSeed: 123), + isNull, + ); + expect( + SkinPatternHelper.describePatternMetric( + skin: gammaPhase1, + patternSeed: 123, + ), + isNull, + ); + }); + + test('provides descriptions and metrics for supported finishes', () { + expect( + SkinPatternHelper.describePattern(skin: fade, patternSeed: 20), + isNotNull, + ); + expect( + SkinPatternHelper.describePatternMetric(skin: fade, patternSeed: 20), + contains('Fade index'), + ); + expect( + SkinPatternHelper.describePattern(skin: caseHardened, patternSeed: 999), + isNotNull, + ); + expect( + SkinPatternHelper.patternExplanation(gammaEmerald), + contains('Emerald'), + ); + expect( + SkinPatternHelper.possiblePatternOutcomes(gammaEmerald), + isNotEmpty, + ); + }); + }); +} diff --git a/test/domain/special_item_variant_helper_test.dart b/test/domain/special_item_variant_helper_test.dart new file mode 100644 index 00000000..66062d58 --- /dev/null +++ b/test/domain/special_item_variant_helper_test.dart @@ -0,0 +1,110 @@ +import 'dart:math'; + +import 'package:cs2_simulator/domain/special_item_variant_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('SpecialItemVariantHelper', () { + final phase1 = buildSkin( + id: '101', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Doppler', + finishCatalogName: 'DOPPLER', + phase: 'Phase 1', + ); + final ruby = buildSkin( + id: '102', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Doppler', + finishCatalogName: 'DOPPLER', + phase: 'Ruby', + ); + final sapphire = buildSkin( + id: '103', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Doppler', + finishCatalogName: 'DOPPLER', + phase: 'Sapphire', + ); + final tigerTooth = buildSkin( + id: '104', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Tiger Tooth', + finishCatalogName: 'TIGER TOOTH', + ); + + test('groups skins by family', () { + final families = SpecialItemVariantHelper.groupFamilies([ + sapphire, + tigerTooth, + ruby, + phase1, + ]); + + expect(families, hasLength(2)); + expect(families.first.map((skin) => skin.id), ['101', '102', '103']); + expect(families.last.single.id, '104'); + }); + + test('uses weighted probabilities for configured doppler variants', () { + final probabilities = SpecialItemVariantHelper.variantProbabilities([ + phase1, + ruby, + sapphire, + ]); + + expect( + probabilities.values.reduce((a, b) => a + b), + closeTo(1.0, 0.000001), + ); + expect(probabilities['101']!, greaterThan(probabilities['102']!)); + expect(probabilities['101']!, greaterThan(probabilities['103']!)); + }); + + test('maps generated seed back to selected variant bucket', () { + final variants = [phase1, ruby, sapphire]; + final random = Random(7); + + for (final selected in variants) { + final seed = SpecialItemVariantHelper.generateSeedForVariant( + random, + variants, + selected, + ); + final resolved = SpecialItemVariantHelper.variantForSeed( + variants, + seed, + ); + expect(resolved.id, selected.id); + } + }); + + test('falls back to uniform probabilities for non-configured variants', () { + final probabilities = SpecialItemVariantHelper.variantProbabilities([ + tigerTooth, + buildSkin( + id: '105', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Tiger Tooth', + finishCatalogName: 'TIGER TOOTH', + variantName: 'Alt', + ), + ]); + + expect(probabilities['104'], closeTo(0.5, 0.000001)); + expect(probabilities['105'], closeTo(0.5, 0.000001)); + }); + }); +} diff --git a/test/domain/terminal_session_test.dart b/test/domain/terminal_session_test.dart new file mode 100644 index 00000000..f751d1f7 --- /dev/null +++ b/test/domain/terminal_session_test.dart @@ -0,0 +1,67 @@ +import 'package:cs2_simulator/domain/terminal_offer.dart'; +import 'package:cs2_simulator/domain/terminal_session.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('TerminalSession', () { + test('returns current offer when index is in range', () { + final offers = [ + TerminalOffer( + skin: buildSkin(id: '1'), + isStatTrak: false, + skinFloat: 0.15, + exterior: 'Field-Tested', + patternSeed: 123, + offerIndex: 1, + ), + TerminalOffer( + skin: buildSkin(id: '2'), + isStatTrak: true, + skinFloat: 0.02, + exterior: 'Factory New', + patternSeed: 456, + offerIndex: 2, + ), + ]; + + final session = TerminalSession( + offers: offers, + currentIndex: 1, + acceptedOffer: null, + ); + + expect(session.currentOffer, same(offers[1])); + expect(session.isFinished, isFalse); + expect(session.offersRemaining, 1); + }); + + test('treats accepted or exhausted sessions as finished', () { + final offer = TerminalOffer( + skin: buildSkin(id: '1'), + isStatTrak: false, + skinFloat: 0.15, + exterior: 'Field-Tested', + patternSeed: 123, + offerIndex: 1, + ); + + final accepted = TerminalSession( + offers: [offer], + currentIndex: 0, + acceptedOffer: offer, + ); + final exhausted = TerminalSession( + offers: [offer], + currentIndex: 1, + acceptedOffer: null, + ); + + expect(accepted.isFinished, isTrue); + expect(exhausted.isFinished, isTrue); + expect(exhausted.currentOffer, isNull); + expect(exhausted.offersRemaining, 0); + }); + }); +} diff --git a/test/domain/tradeup_service_test.dart b/test/domain/tradeup_service_test.dart new file mode 100644 index 00000000..0b3dfc74 --- /dev/null +++ b/test/domain/tradeup_service_test.dart @@ -0,0 +1,240 @@ +import 'package:cs2_simulator/domain/tradeup_service.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../test_data_builders.dart'; + +void main() { + group('TradeUpService', () { + final service = TradeUpService(); + + test('allows souvenir inputs for standard trade-up contracts', () { + final input = [ + ...List.generate( + 10, + (_) => TradeUpInputItem( + skin: buildSkin( + id: '1', + rarity: 'MIL_SPEC', + collection: 'Collection A', + ), + floatValue: 0.1, + quality: TradeUpInputQuality.souvenir, + ), + ), + ]; + final outputSkin = buildSkin( + id: '2', + rarity: 'RESTRICTED', + collection: 'Collection A', + ); + + final issue = service.validationIssue( + input: input, + skinIdToRegularCaseIds: const {}, + ); + final chances = service.getTradeUpChances( + input: input, + allSkins: [input.first.skin, outputSkin], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + expect(issue, isNull); + expect(chances.single.isStatTrak, isFalse); + expect(chances.single.isSouvenir, isFalse); + }); + + test('returns validation issue for souvenir covert inputs', () { + final input = [ + TradeUpInputItem( + skin: buildSkin(id: '1', rarity: 'COVERT'), + floatValue: 0.1, + quality: TradeUpInputQuality.souvenir, + ), + ]; + + final issue = service.validationIssue( + input: input, + skinIdToRegularCaseIds: const {}, + ); + + expect(issue, 'Souvenir trade-up contracts require 10 non-Covert skins'); + }); + + test('returns validation issue for mixed quality contract', () { + final skin = buildSkin(id: '1', rarity: 'MIL_SPEC'); + final issue = service.validationIssue( + input: [ + TradeUpInputItem( + skin: skin, + floatValue: 0.1, + quality: TradeUpInputQuality.regular, + ), + TradeUpInputItem( + skin: skin, + floatValue: 0.1, + quality: TradeUpInputQuality.statTrak, + ), + ], + skinIdToRegularCaseIds: const {}, + ); + + expect(issue, 'All selected skins must use the same quality mode'); + }); + + test('weights standard outcomes by represented collections', () { + final inputSkinA = buildSkin( + id: '10', + rarity: 'RESTRICTED', + collection: 'Collection A', + ); + final inputSkinB = buildSkin( + id: '11', + rarity: 'RESTRICTED', + collection: 'Collection B', + ); + final outputA = buildSkin( + id: '20', + rarity: 'CLASSIFIED', + collection: 'Collection A', + ); + final outputB = buildSkin( + id: '21', + rarity: 'CLASSIFIED', + collection: 'Collection B', + ); + + final input = [ + ...List.generate( + 7, + (_) => TradeUpInputItem(skin: inputSkinA, floatValue: 0.15), + ), + ...List.generate( + 3, + (_) => TradeUpInputItem(skin: inputSkinB, floatValue: 0.15), + ), + ]; + + final chances = service.getTradeUpChances( + input: input, + allSkins: [inputSkinA, inputSkinB, outputA, outputB], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + expect(chances, hasLength(2)); + expect( + chances.fold(0, (sum, chance) => sum + chance.probability), + closeTo(1.0, 0.000001), + ); + expect( + chances.firstWhere((chance) => chance.skin.id == '20').probability, + closeTo(0.7, 0.000001), + ); + expect( + chances.firstWhere((chance) => chance.skin.id == '21').probability, + closeTo(0.3, 0.000001), + ); + }); + + test('projects output float using normalized input wear', () { + final inputSkin = buildSkin( + id: '30', + rarity: 'RESTRICTED', + collection: 'Collection A', + floatTop: 0.0, + floatBottom: 0.8, + ); + final outputSkin = buildSkin( + id: '40', + rarity: 'CLASSIFIED', + collection: 'Collection A', + floatTop: 0.06, + floatBottom: 0.8, + ); + + final input = [ + ...List.generate( + 8, + (_) => TradeUpInputItem(skin: inputSkin, floatValue: 0.8), + ), + ...List.generate( + 2, + (_) => TradeUpInputItem(skin: inputSkin, floatValue: 0.4), + ), + ]; + + final chances = service.getTradeUpChances( + input: input, + allSkins: [inputSkin, outputSkin], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + expect(chances.single.floatValue, closeTo(0.726, 0.000001)); + expect(chances.single.exterior, 'Battle-Scarred'); + }); + + test('builds covert outcomes from linked regular cases', () { + final covertInput = buildSkin( + id: '50', + rarity: 'COVERT', + collection: 'Collection A', + ); + final knifePhase1 = buildSkin( + id: '60', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Gamma Doppler', + rarity: 'CONTRABAND', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Phase 1', + ); + final knifeEmerald = buildSkin( + id: '61', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Gamma Doppler', + rarity: 'CONTRABAND', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Emerald', + ); + final gloves = buildSkin( + id: '62', + itemKind: 'GLOVES', + weaponType: 'GLOVES', + itemId: 'SPORT', + name: 'Nocts', + rarity: 'CONTRABAND', + ); + + final chances = service.getTradeUpChances( + input: List.generate( + 5, + (_) => TradeUpInputItem(skin: covertInput, floatValue: 0.3), + ), + allSkins: [covertInput, knifePhase1, knifeEmerald, gloves], + skinIdToRegularCaseIds: const { + '50': ['900'], + }, + regularCaseIdToSkinIds: const { + '900': ['60', '61', '62'], + }, + ); + + expect( + chances.fold(0, (sum, chance) => sum + chance.probability), + closeTo(1.0, 0.000001), + ); + expect(chances.any((chance) => chance.skin.id == '61'), isTrue); + expect( + chances.firstWhere((chance) => chance.skin.id == '61').probability, + lessThan( + chances.firstWhere((chance) => chance.skin.id == '60').probability, + ), + ); + }); + }); +} diff --git a/test/presentation/helpers/misc_ui_helpers_test.dart b/test/presentation/helpers/misc_ui_helpers_test.dart new file mode 100644 index 00000000..80bec1b5 --- /dev/null +++ b/test/presentation/helpers/misc_ui_helpers_test.dart @@ -0,0 +1,186 @@ +import 'package:cs2_simulator/data/models/music_kit_group_dto.dart'; +import 'package:cs2_simulator/presentation/helpers/agent_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/charm_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/graffiti_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/music_kit_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/patch_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/pin_ui_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/responsive_grid_helper.dart'; +import 'package:cs2_simulator/presentation/helpers/source_color_helper.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('SourceColorHelper', () { + test('returns expected reward and operation colors', () { + expect( + SourceColorHelper.rewardSourceColor(isArmory: true), + Colors.deepPurpleAccent, + ); + expect( + SourceColorHelper.rewardSourceColor(isArmory: false), + Colors.amber, + ); + expect(SourceColorHelper.operationColor('BRAVO'), Colors.greenAccent); + expect(SourceColorHelper.operationColor('UNKNOWN'), Colors.blueGrey); + }); + + test('maps container and collectible source types to colors', () { + expect( + SourceColorHelper.containerTypeColor('PATCH_PACK'), + Colors.pinkAccent, + ); + expect( + SourceColorHelper.containerTypeColor('CHARM_COLLECTION'), + Colors.deepOrangeAccent, + ); + expect( + SourceColorHelper.collectibleSourceColor('ARMORY_REWARD', null), + Colors.deepPurpleAccent, + ); + expect( + SourceColorHelper.collectibleSourceColor('GENERAL', null), + Colors.blueGrey, + ); + expect( + SourceColorHelper.collectibleSourceColor('UNKNOWN', null), + Colors.white24, + ); + }); + }); + + group('MusicKitUiHelper', () { + test('formats mixed-variant music kits with StatTrak text', () { + final musicKit = buildMusicKit( + id: '1', + hasRegular: true, + hasStatTrak: true, + collection: 'Masterminds 2', + ); + + expect(MusicKitUiHelper.typeLabel(musicKit), 'Music Kit / StatTrak™'); + expect( + MusicKitUiHelper.secondaryText(musicKit), + 'Music Kit / StatTrak™ | Both variants | Masterminds 2', + ); + }); + + test('formats grouped music kit secondary text', () { + final group = MusicKitGroupDto.fromVariants([ + buildMusicKit( + id: '1', + name: 'Austin Wintory, The Devil Went Clubbing In Georgia', + collection: 'Masterminds 2', + hasRegular: true, + hasStatTrak: false, + ), + buildMusicKit( + id: '2', + name: 'Austin Wintory, The Devil Went Clubbing In Georgia', + collection: 'Masterminds 2', + hasRegular: false, + hasStatTrak: true, + ), + ]); + + expect( + MusicKitUiHelper.groupedSecondaryText(group), + 'Austin Wintory | Music Kit / StatTrak™ | Both variants | Masterminds 2', + ); + }); + }); + + group('Collectible UI helpers', () { + test('returns readable labels and secondary text', () { + expect( + PinUiHelper.rarityLabel(buildPin(id: '1', rarity: 'EXTRAORDINARY')), + 'Extraordinary', + ); + expect( + PinUiHelper.secondaryText( + buildPin(id: '2', rarity: 'GENUINE', collection: null), + ), + 'Genuine Pin', + ); + expect( + AgentUiHelper.secondaryText( + buildAgent(id: '3', team: 'COUNTER-TERRORIST'), + ), + 'CT Side', + ); + expect( + CharmUiHelper.secondaryText(buildCharm(id: '4', collection: null)), + 'Charm', + ); + expect( + GraffitiUiHelper.secondaryText( + buildGraffiti(id: '5', collection: null), + ), + 'Graffiti', + ); + expect( + PatchUiHelper.secondaryText(buildPatch(id: '6', collection: null)), + 'Patch', + ); + }); + + test('returns expected rarity colors for collectible helpers', () { + expect( + PinUiHelper.rarityColor(buildPin(id: '1', rarity: 'EXTRAORDINARY')), + const Color(0xFFEB4B4B), + ); + expect( + AgentUiHelper.rarityColor(buildAgent(id: '2', rarity: 'MASTER')), + const Color(0xFFEB4B4B), + ); + expect( + CharmUiHelper.rarityColor(buildCharm(id: '3', rarity: 'EXOTIC')), + const Color(0xFFD32CE6), + ); + expect( + GraffitiUiHelper.rarityColor( + buildGraffiti(id: '4', rarity: 'BASE_GRADE'), + ), + const Color(0xFFB0C3D9), + ); + expect( + PatchUiHelper.rarityColor(buildPatch(id: '5', rarity: 'REMARKABLE')), + const Color(0xFF8847FF), + ); + }); + }); + + group('ResponsiveGridHelper', () { + test('uses expected breakpoints for list layout', () { + expect(ResponsiveGridHelper.listCrossAxisCount(500), 1); + expect(ResponsiveGridHelper.listCrossAxisCount(800), 2); + expect(ResponsiveGridHelper.listCrossAxisCount(1200), 3); + expect(ResponsiveGridHelper.listCrossAxisCount(1600), 4); + + expect(ResponsiveGridHelper.listChildAspectRatio(500), 2.25); + expect(ResponsiveGridHelper.listChildAspectRatio(800), 1.35); + expect(ResponsiveGridHelper.listChildAspectRatio(1200), 1.45); + }); + + test('uses expected breakpoints for skin and trade grids', () { + expect(ResponsiveGridHelper.skinGridCrossAxisCount(550), 2); + expect(ResponsiveGridHelper.skinGridCrossAxisCount(650), 3); + expect(ResponsiveGridHelper.skinGridCrossAxisCount(950), 4); + expect(ResponsiveGridHelper.skinGridCrossAxisCount(1250), 5); + expect(ResponsiveGridHelper.skinGridCrossAxisCount(1600), 6); + + expect(ResponsiveGridHelper.skinGridChildAspectRatio(550), 0.7); + expect(ResponsiveGridHelper.skinGridChildAspectRatio(650), 0.74); + expect(ResponsiveGridHelper.skinGridChildAspectRatio(950), 0.78); + expect(ResponsiveGridHelper.skinGridChildAspectRatio(1250), 0.82); + + expect(ResponsiveGridHelper.tradeGridCrossAxisCount(500), 3); + expect(ResponsiveGridHelper.tradeGridCrossAxisCount(700), 4); + expect(ResponsiveGridHelper.tradeGridCrossAxisCount(900), 5); + expect(ResponsiveGridHelper.tradeGridCrossAxisCount(1200), 6); + expect(ResponsiveGridHelper.tradeGridCrossAxisCount(1500), 7); + }); + }); +} diff --git a/test/presentation/helpers/skin_ui_helper_test.dart b/test/presentation/helpers/skin_ui_helper_test.dart new file mode 100644 index 00000000..e98740b5 --- /dev/null +++ b/test/presentation/helpers/skin_ui_helper_test.dart @@ -0,0 +1,63 @@ +import 'package:cs2_simulator/presentation/helpers/skin_ui_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('SkinUiHelper', () { + test('secondary text includes display variant when present', () { + final skin = buildSkin( + id: '1', + name: 'Gamma Doppler', + variantName: 'Phase 2', + ); + + expect(SkinUiHelper.secondaryText(skin), 'Gamma Doppler - Phase 2'); + }); + + test('family text collapses configured weighted variants', () { + final variants = [ + buildSkin( + id: '1', + itemKind: 'WEAPON', + weaponType: 'PISTOL', + itemId: 'GLOCK_18', + name: 'Gamma Doppler', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Phase 1', + ), + buildSkin( + id: '2', + itemKind: 'WEAPON', + weaponType: 'PISTOL', + itemId: 'GLOCK_18', + name: 'Gamma Doppler', + finishCatalogName: 'GAMMA DOPPLER', + phase: 'Emerald', + ), + ]; + + expect(SkinUiHelper.familySecondaryText(variants), 'Gamma Doppler'); + expect(SkinUiHelper.familyDetailText(variants), 'Phase 1, Emerald'); + }); + + test('full drop display name includes prefixes', () { + final knife = buildSkin( + id: '3', + itemKind: 'KNIFE', + weaponType: 'KNIFE', + itemId: 'BAYONET', + name: 'Doppler', + ); + + expect( + SkinUiHelper.fullDropDisplayName( + skin: knife, + isStatTrak: true, + isSouvenir: false, + ), + '★ StatTrak™ Bayonet | Doppler', + ); + }); + }); +} diff --git a/test/presentation/helpers/sticker_ui_helper_test.dart b/test/presentation/helpers/sticker_ui_helper_test.dart new file mode 100644 index 00000000..9833dbf4 --- /dev/null +++ b/test/presentation/helpers/sticker_ui_helper_test.dart @@ -0,0 +1,34 @@ +import 'package:cs2_simulator/presentation/helpers/sticker_ui_helper.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('StickerUiHelper', () { + test('builds secondary text from effect and collection', () { + final sticker = buildSticker( + id: '1', + effect: 'FOIL', + collection: 'Antwerp 2022', + ); + + expect(StickerUiHelper.secondaryText(sticker), 'Foil • Antwerp 2022'); + }); + + test('falls back to sticker type label when no extra parts exist', () { + final sticker = buildSticker( + id: '2', + collection: null, + tournament: null, + stickerType: 'AUTOGRAPH', + ); + + expect(StickerUiHelper.secondaryText(sticker), 'Autograph'); + }); + + test('maps effect labels', () { + expect(StickerUiHelper.effectLabel('GLITTER'), 'Glitter'); + expect(StickerUiHelper.effectLabel('UNKNOWN'), 'Standard'); + }); + }); +} diff --git a/test/presentation/helpers/tradeup_controller_test.dart b/test/presentation/helpers/tradeup_controller_test.dart new file mode 100644 index 00000000..8da9a40e --- /dev/null +++ b/test/presentation/helpers/tradeup_controller_test.dart @@ -0,0 +1,165 @@ +import 'package:cs2_simulator/domain/tradeup_service.dart'; +import 'package:cs2_simulator/presentation/helpers/tradeup_controller.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../../test_data_builders.dart'; + +void main() { + group('TradeUpController', () { + test('starts with default empty state', () { + final controller = TradeUpController(service: _FakeTradeUpService()); + + expect(controller.selected, isEmpty); + expect(controller.tradeReady, isFalse); + expect(controller.canExecuteTrade, isFalse); + expect(controller.maxSelectable(), 10); + expect(controller.canAddMore, isTrue); + }); + + test('caps covert contracts at five items', () { + final controller = TradeUpController(service: _FakeTradeUpService()); + final covert = buildSkin(id: '1', rarity: 'COVERT'); + + for (var index = 0; index < 6; index++) { + controller.add( + covert, + allSkins: [covert], + skinIdToRegularCaseIds: const { + '1': ['100'], + }, + regularCaseIdToSkinIds: const { + '100': ['1'], + }, + ); + } + + expect(controller.selected, hasLength(5)); + expect(controller.maxSelectable(), 5); + expect(controller.tradeReady, isTrue); + }); + + test('throws when trying to mix rarities', () { + final controller = TradeUpController(service: _FakeTradeUpService()); + final milSpec = buildSkin(id: '1', rarity: 'MIL_SPEC'); + final restricted = buildSkin(id: '2', rarity: 'RESTRICTED'); + + controller.add( + milSpec, + allSkins: [milSpec], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + expect( + () => controller.add( + restricted, + allSkins: [milSpec, restricted], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ), + throwsException, + ); + }); + + test('recalculates chances and can execute when trade is valid', () { + final service = _FakeTradeUpService(); + final controller = TradeUpController(service: service); + final skin = buildSkin(id: '1', rarity: 'MIL_SPEC'); + + for (var index = 0; index < 10; index++) { + controller.add( + skin, + allSkins: [skin], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + } + + expect(controller.tradeReady, isTrue); + expect(controller.tradeIssue, isNull); + expect(controller.chances, isNotEmpty); + expect(controller.canExecuteTrade, isTrue); + + controller.executeTrade( + allSkins: [skin], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + expect(controller.result, isNotNull); + expect(service.tradeUpCalls, 1); + }); + + test('clear resets controller state', () { + final controller = TradeUpController(service: _FakeTradeUpService()); + final skin = buildSkin(id: '1', rarity: 'MIL_SPEC'); + + controller.add( + skin, + allSkins: [skin], + skinIdToRegularCaseIds: const {}, + regularCaseIdToSkinIds: const {}, + ); + + controller.clear(); + + expect(controller.selected, isEmpty); + expect(controller.chances, isEmpty); + expect(controller.tradeIssue, isNull); + expect(controller.result, isNull); + }); + }); +} + +class _FakeTradeUpService extends TradeUpService { + int tradeUpCalls = 0; + + @override + String? validationIssue({ + required List input, + required Map> skinIdToRegularCaseIds, + }) { + return null; + } + + @override + List getTradeUpChances({ + required List input, + required List allSkins, + required Map> skinIdToRegularCaseIds, + required Map> regularCaseIdToSkinIds, + }) { + if (input.isEmpty) { + return const []; + } + + return [ + TradeUpChance( + skin: input.first.skin, + probability: 1.0, + floatValue: 0.2, + exterior: 'Field-Tested', + isStatTrak: false, + isSouvenir: false, + ), + ]; + } + + @override + TradeUpResult tradeUp({ + required List input, + required List allSkins, + required Map> skinIdToRegularCaseIds, + required Map> regularCaseIdToSkinIds, + }) { + tradeUpCalls += 1; + return TradeUpResult( + skin: input.first.skin, + floatValue: 0.2, + exterior: 'Field-Tested', + isStatTrak: false, + isSouvenir: false, + patternSeed: 7, + ); + } +} diff --git a/test/test_data_builders.dart b/test/test_data_builders.dart new file mode 100644 index 00000000..d381ae2f --- /dev/null +++ b/test/test_data_builders.dart @@ -0,0 +1,190 @@ +import 'package:cs2_simulator/data/models/skin_dto.dart'; +import 'package:cs2_simulator/data/models/sticker_dto.dart'; +import 'package:cs2_simulator/data/models/pin_dto.dart'; +import 'package:cs2_simulator/data/models/music_kit_dto.dart'; +import 'package:cs2_simulator/data/models/graffiti_dto.dart'; +import 'package:cs2_simulator/data/models/patch_dto.dart'; +import 'package:cs2_simulator/data/models/charm_dto.dart'; +import 'package:cs2_simulator/data/models/agent_dto.dart'; +import 'package:cs2_simulator/data/models/container_dto.dart'; + +SkinDto buildSkin({ + required String id, + String name = 'Test Finish', + String rarity = 'MIL_SPEC', + String weaponType = 'RIFLE', + String itemKind = 'WEAPON', + String itemId = 'AK_47', + double floatTop = 0.0, + double floatBottom = 1.0, + String? collection = 'Test Collection', + String? finishCatalogName, + String? variantName, + String? phase, + String? apiPaintIndex, +}) { + return SkinDto( + id: id, + name: name, + skinImage: 'assets/skins/$id.png', + floatTop: floatTop, + floatBottom: floatBottom, + rarity: rarity, + weaponType: weaponType, + itemKind: itemKind, + itemId: itemId, + collection: collection, + finishCatalogName: finishCatalogName, + variantName: variantName, + phase: phase, + apiPaintIndex: apiPaintIndex, + collectionSourceType: null, + collectionSourceId: null, + isRewardCollection: false, + operationCollectionIds: const [], + isOperationCollection: false, + ); +} + +StickerDto buildSticker({ + required String id, + String name = 'Test Sticker', + String rarity = 'HIGH_GRADE', + String stickerType = 'STICKER', + String effect = 'OTHER', + String? collection = 'Test Collection', + String? tournament, +}) { + return StickerDto( + id: id, + name: name, + stickerImage: 'assets/stickers/$id.png', + rarity: rarity, + stickerType: stickerType, + effect: effect, + collection: collection, + tournament: tournament, + ); +} + +PinDto buildPin({ + required String id, + String name = 'Test Pin', + String rarity = 'HIGH_GRADE', + String? collection = 'Test Pins', +}) { + return PinDto( + id: id, + name: name, + pinImage: 'assets/pins/$id.png', + rarity: rarity, + collection: collection, + ); +} + +MusicKitDto buildMusicKit({ + required String id, + String name = 'Artist, Track', + String rarity = 'HIGH_GRADE', + String? collection = 'Test Music Kits', + bool hasRegular = true, + bool hasStatTrak = false, +}) { + return MusicKitDto( + id: id, + name: name, + musicKitImage: 'assets/music_kits/$id.png', + rarity: rarity, + collection: collection, + hasRegular: hasRegular, + hasStatTrak: hasStatTrak, + ); +} + +GraffitiDto buildGraffiti({ + required String id, + String name = 'Test Graffiti', + String rarity = 'BASE_GRADE', + String? collection = 'Test Graffiti', +}) { + return GraffitiDto( + id: id, + name: name, + graffitiImage: 'assets/graffiti/$id.png', + rarity: rarity, + collection: collection, + ); +} + +PatchDto buildPatch({ + required String id, + String name = 'Test Patch', + String rarity = 'HIGH_GRADE', + String? collection = 'Test Patches', +}) { + return PatchDto( + id: id, + name: name, + patchImage: 'assets/patches/$id.png', + rarity: rarity, + collection: collection, + ); +} + +CharmDto buildCharm({ + required String id, + String name = 'Test Charm', + String rarity = 'HIGH_GRADE', + String? collection = 'Test Charms', +}) { + return CharmDto( + id: id, + name: name, + charmImage: 'assets/charms/$id.png', + rarity: rarity, + collection: collection, + ); +} + +AgentDto buildAgent({ + required String id, + String name = 'Test Agent', + String rarity = 'DISTINGUISHED', + String? collection = 'Test Agents', + String team = 'CT', +}) { + return AgentDto( + id: id, + name: name, + agentImage: 'assets/agents/$id.png', + rarity: rarity, + collection: collection, + team: team, + ); +} + +ContainerDto buildContainer({ + required String id, + String name = 'Test Container', + String type = 'CASE', + String? sourceType, + String? sourceId, + String? sourceName, + String? currency, + int? cost, +}) { + return ContainerDto( + id: id, + name: name, + containerImage: 'assets/containers/$id.png', + releaseDate: '2025-01-01', + type: type, + sourceType: sourceType, + sourceId: sourceId, + sourceName: sourceName, + tournamentName: null, + tournamentLogo: null, + currency: currency, + cost: cost, + ); +} diff --git a/tool/importer/src/config.dart b/tool/importer/src/config.dart index 7cd4a5c7..d2e45315 100644 --- a/tool/importer/src/config.dart +++ b/tool/importer/src/config.dart @@ -212,6 +212,26 @@ const stickerCollectionSourceOverrides = >{ }, }; +const musicKitCollectionOverrides = { + 'ALRT, DOPAMINE HIT': 'NIGHTMODE II', + 'Altare, Change My Mind': 'NIGHTMODE II', + 'borne, Give It To Me': 'NIGHTMODE II', + 'Pirapus, EVERYNITE': 'NIGHTMODE II', + 'Repiet & Julia Kleijn, On And On': 'NIGHTMODE II', + 'ShockOne, Voices': 'NIGHTMODE II', +}; + +const excludedContainerNames = { + 'Cologne 2026 Autograph Capsule', + 'Cologne 2026 Sticker Capsule', + 'Cologne 2026 Team Sticker Capsule', +}; + +const tournamentLogoUrlOverrides = { + 'IEM Cologne 2026': + 'https://liquipedia.net/commons/images/4/4d/Intel_Extreme_Masters_2022_icon_allmode.png', +}; + const weaponTypeMap = { 'Pistols': 'PISTOL', 'SMGs': 'SMG', @@ -613,6 +633,7 @@ const tournamentNameAliases = { 'Shanghai 2024': 'Perfect World Shanghai 2024', 'Austin 2025': 'BLAST.tv Austin 2025', 'Budapest 2025': 'StarLadder Budapest 2025', + 'Cologne 2026': 'IEM Cologne 2026', 'Katowice 2019': 'IEM Katowice 2019', 'Krakow 2017': 'PGL Kraków 2017', 'London 2018': 'FACEIT London 2018', @@ -633,6 +654,7 @@ const tournamentStartDates = { 'Shanghai 2024': '2024-11-30', 'Austin 2025': '2025-06-03', 'Budapest 2025': '2025-11-24', + 'Cologne 2026': '2026-06-02', }; const tournamentContainerStartDates = { diff --git a/tool/importer/src/dart_backend.dart b/tool/importer/src/dart_backend.dart index 16e0c5f9..29b5b0b4 100644 --- a/tool/importer/src/dart_backend.dart +++ b/tool/importer/src/dart_backend.dart @@ -219,6 +219,32 @@ class DartImporterBackend implements ImporterBackend { _io.printInfo('Fetching keychains.json ...'); final keychainsData = _asJsonList(await _io.fetchJson(keychainsUrl)); + var tournamentLogosCreated = 0; + for (final entry in tournamentMetadata) { + final tournamentName = (entry['name'] ?? '').toString().trim(); + final logoUrl = tournamentLogoUrlOverrides[tournamentName]; + if (logoUrl == null) { + continue; + } + + final logoSlug = makeSafeSlug(tournamentName); + final existingLogoRel = findExistingLogoPathBySlug(logoSlug); + if (existingLogoRel != null) { + entry['tournamentLogo'] = existingLogoRel; + continue; + } + + final ext = await _io.downloadFileWithRealExtension( + logoUrl, + '${tournamentLogosDir.path}/$logoSlug', + ); + if (ext != null) { + entry['tournamentLogo'] = 'assets/tournament_logos/$logoSlug$ext'; + tournamentLogosCreated += 1; + } + } + await _io.writeJson(tournamentMetadataFile, tournamentMetadata); + final collectionImageByName = buildCollectionImageMap(skinsData); buildCollectionMetaMap(collectionsData); final tournamentLogoByName = { @@ -303,7 +329,6 @@ class DartImporterBackend implements ImporterBackend { ); } - var tournamentLogosCreated = 0; for (final crate in supportedCrates) { final crateName = (crate['name'] ?? '').toString().trim(); if (crateName.isEmpty) { @@ -762,7 +787,7 @@ class DartImporterBackend implements ImporterBackend { } final crateRef = crateRefRaw.map((k, v) => MapEntry(k.toString(), v)); final crateName = (crateRef['name'] ?? '').toString().trim(); - if (crateName.isEmpty) { + if (crateName.isEmpty || excludedContainerNames.contains(crateName)) { continue; } @@ -899,7 +924,7 @@ class DartImporterBackend implements ImporterBackend { } final crateRef = crateRefRaw.map((k, v) => MapEntry(k.toString(), v)); final crateName = (crateRef['name'] ?? '').toString().trim(); - if (crateName.isEmpty) { + if (crateName.isEmpty || excludedContainerNames.contains(crateName)) { continue; } @@ -1354,6 +1379,7 @@ class DartImporterBackend implements ImporterBackend { : ''; final musicKitCollection = musicKitCollectionBySourceId[sourceMusicKitId] ?? + musicKitCollectionOverrides[musicKitName] ?? (explicitCollection.isEmpty ? null : explicitCollection); final key = ( canonicalName(musicKitName), @@ -1368,16 +1394,23 @@ class DartImporterBackend implements ImporterBackend { variantPresence['hasStatTrak'] = (variantPresence['hasStatTrak'] ?? false) || isStatTrak; - if (existingMusicKitByKey.containsKey(key)) { - final existingRecord = existingMusicKitByKey[key]; - if (existingRecord != null) { - final existingId = existingRecord['id']?.toString(); - if (existingId != null && newMusicKits.containsKey(existingId)) { - newMusicKits[existingId]!['hasRegular'] = - variantPresence['hasRegular'] ?? false; - newMusicKits[existingId]!['hasStatTrak'] = - variantPresence['hasStatTrak'] ?? false; - } + final existingRecord = + existingMusicKitByKey[key] ?? + (musicKitCollectionOverrides.containsKey(musicKitName) + ? existingMusicKitByKey[(canonicalName(musicKitName), '')] + : null); + if (existingRecord != null) { + final existingId = existingRecord['id']?.toString(); + if (existingId != null) { + final musicKitRecord = Map.from(existingRecord); + musicKitRecord['collection'] = musicKitCollection; + musicKitRecord['hasRegular'] = variantPresence['hasRegular'] ?? false; + musicKitRecord['hasStatTrak'] = + variantPresence['hasStatTrak'] ?? false; + newMusicKits[existingId] = musicKitRecord; + existingMusicKitByKey[key] = musicKitRecord; + musicKitCollectionBySourceId[sourceMusicKitId] = musicKitCollection; + reusedMusicKitCount += 1; } continue; } diff --git a/tool/importer/src/normalization.dart b/tool/importer/src/normalization.dart index caf0a377..988db4a8 100644 --- a/tool/importer/src/normalization.dart +++ b/tool/importer/src/normalization.dart @@ -273,6 +273,10 @@ String inferWeaponTypeFromWeaponName(String name) { bool isSupportedContainer(Map crate) { final crateType = (crate['type'] ?? '').toString().trim(); final crateName = (crate['name'] ?? '').toString().trim(); + if (excludedContainerNames.contains(crateName)) { + return false; + } + final lowerName = crateName.toLowerCase(); final lowerType = crateType.toLowerCase();