Willy-JL 1 год назад
Родитель
Сommit
eafa11373c
72 измененных файлов с 1377 добавлено и 23 удалено
  1. 191 0
      pokemon_trading/.clang-format
  2. BIN
      pokemon_trading/.flipcorg/banner.png
  3. BIN
      pokemon_trading/.flipcorg/gallery/1.png
  4. BIN
      pokemon_trading/.flipcorg/gallery/2.png
  5. BIN
      pokemon_trading/.flipcorg/gallery/3.png
  6. BIN
      pokemon_trading/.flipcorg/gallery/4.png
  7. BIN
      pokemon_trading/.flipcorg/gallery/5.png
  8. BIN
      pokemon_trading/.flipcorg/gallery/6.png
  9. 13 0
      pokemon_trading/.github/FUNDING.yml
  10. 45 0
      pokemon_trading/.github/ISSUE_TEMPLATE/01_bug_report.yml
  11. 21 0
      pokemon_trading/.github/ISSUE_TEMPLATE/02_implemented.yml
  12. 35 0
      pokemon_trading/.github/workflows/flipperZeroAction.yml
  13. 1 0
      pokemon_trading/.gitsubtree
  14. 34 2
      pokemon_trading/README.md
  15. 1 1
      pokemon_trading/README_catalog.md
  16. 1 1
      pokemon_trading/README_es.md
  17. 2 2
      pokemon_trading/application.fam
  18. 3 0
      pokemon_trading/changelog.md
  19. BIN
      pokemon_trading/docs/images/EXT-Link.png
  20. BIN
      pokemon_trading/docs/images/GPIO-GBPIN-v2.png
  21. BIN
      pokemon_trading/docs/images/GPIO-GBPIN_light-v2.png
  22. BIN
      pokemon_trading/docs/images/back.png
  23. 9 0
      pokemon_trading/docs/images/back.svg
  24. BIN
      pokemon_trading/docs/images/cut-cable-v3.png
  25. BIN
      pokemon_trading/docs/images/dmg_link_port_pinout.png
  26. BIN
      pokemon_trading/docs/images/flipper-zero-flat-00.png
  27. BIN
      pokemon_trading/docs/images/flipper-zero-flat-01.png
  28. BIN
      pokemon_trading/docs/images/flipper-zero-flat-02.png
  29. BIN
      pokemon_trading/docs/images/flipper-zero-flat-1-1.png
  30. BIN
      pokemon_trading/docs/images/flipper-zero-flat-1.png
  31. BIN
      pokemon_trading/docs/images/flipper-zero-flat-10.png
  32. BIN
      pokemon_trading/docs/images/flipper-zero-flat-11.png
  33. BIN
      pokemon_trading/docs/images/flipper-zero-flat-12.png
  34. BIN
      pokemon_trading/docs/images/flipper-zero-flat-13.png
  35. BIN
      pokemon_trading/docs/images/flipper-zero-flat-2.png
  36. BIN
      pokemon_trading/docs/images/flipper-zero-flat-3.png
  37. BIN
      pokemon_trading/docs/images/flipper-zero-flat-5.png
  38. BIN
      pokemon_trading/docs/images/flipper-zero-flat-6-1.png
  39. BIN
      pokemon_trading/docs/images/flipper-zero-flat-6-2.png
  40. BIN
      pokemon_trading/docs/images/flipper-zero-flat-6.png
  41. BIN
      pokemon_trading/docs/images/flipper-zero-flat-7.png
  42. BIN
      pokemon_trading/docs/images/flipper-zero-flat-8-1.png
  43. BIN
      pokemon_trading/docs/images/flipper-zero-flat-8.png
  44. BIN
      pokemon_trading/docs/images/flipper-zero-flat-9.png
  45. BIN
      pokemon_trading/docs/images/flipper-zero-flat.png
  46. BIN
      pokemon_trading/docs/images/flipper-zero-flat.psd
  47. BIN
      pokemon_trading/docs/images/flipper-zero-flat.xcf
  48. BIN
      pokemon_trading/docs/images/flipper-zero-pcb.png
  49. BIN
      pokemon_trading/docs/images/game_boy_pokemon_center.png
  50. BIN
      pokemon_trading/docs/images/game_boy_save.png
  51. BIN
      pokemon_trading/docs/images/game_boy_save_trade.png
  52. BIN
      pokemon_trading/docs/images/game_boy_trade_list.png
  53. BIN
      pokemon_trading/docs/images/game_boy_trade_list_select_trade.png
  54. BIN
      pokemon_trading/docs/images/game_boy_trade_list_select_trade_confirm.png
  55. BIN
      pokemon_trading/docs/images/game_boy_trade_room.png
  56. BIN
      pokemon_trading/docs/images/game_boy_trade_room_2.png
  57. BIN
      pokemon_trading/docs/images/gb_spi.png
  58. BIN
      pokemon_trading/docs/images/gblpof.gif
  59. 7 0
      pokemon_trading/docs/images/implemented.svg
  60. BIN
      pokemon_trading/docs/images/left.png
  61. 6 0
      pokemon_trading/docs/images/left.svg
  62. BIN
      pokemon_trading/docs/images/pcb.png
  63. BIN
      pokemon_trading/docs/images/qFlipper.png
  64. BIN
      pokemon_trading/docs/images/reboot.png
  65. BIN
      pokemon_trading/docs/images/wgbl-0.png
  66. 744 0
      pokemon_trading/docs/images/white_flat.svg
  67. BIN
      pokemon_trading/docs/images/youtube.png
  68. 1 0
      pokemon_trading/lib/flipper-gblink/.gitsubtree
  69. 22 8
      pokemon_trading/lib/flipper-gblink/README.md
  70. 228 8
      pokemon_trading/lib/flipper-gblink/gblink.c
  71. 12 0
      pokemon_trading/lib/flipper-gblink/gblink.h
  72. 1 1
      pokemon_trading/pokemon_app.c

+ 191 - 0
pokemon_trading/.clang-format

@@ -0,0 +1,191 @@
+---
+Language:        Cpp
+AccessModifierOffset: -4
+AlignAfterOpenBracket: AlwaysBreak
+AlignArrayOfStructures: None
+AlignConsecutiveMacros: None
+AlignConsecutiveAssignments: None
+AlignConsecutiveBitFields: None
+AlignConsecutiveDeclarations: None
+AlignEscapedNewlines: Left
+AlignOperands:   Align
+AlignTrailingComments: false
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortEnumsOnASingleLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortLambdasOnASingleLine: All
+AllowShortIfStatementsOnASingleLine: WithoutElse
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: Yes
+AttributeMacros:
+  - __capability
+BinPackArguments: false
+BinPackParameters: false
+BraceWrapping:
+  AfterCaseLabel:  false
+  AfterClass:      false
+  AfterControlStatement: Never
+  AfterEnum:       false
+  AfterFunction:   false
+  AfterNamespace:  false
+  AfterObjCDeclaration: false
+  AfterStruct:     false
+  AfterUnion:      false
+  AfterExternBlock: false
+  BeforeCatch:     false
+  BeforeElse:      false
+  BeforeLambdaBody: false
+  BeforeWhile:     false
+  IndentBraces:    false
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeConceptDeclarations: true
+BreakBeforeBraces: Attach
+BreakBeforeInheritanceComma: false
+BreakInheritanceList: BeforeColon
+BreakBeforeTernaryOperators: false
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeComma
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: false
+ColumnLimit:     99
+CommentPragmas:  '^ IWYU pragma:'
+QualifierAlignment: Leave
+CompactNamespaces: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+DisableFormat:   false
+EmptyLineAfterAccessModifier: Never
+EmptyLineBeforeAccessModifier: LogicalBlock
+ExperimentalAutoDetectBinPacking: false
+PackConstructorInitializers: BinPack
+BasedOnStyle:    ''
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+AllowAllConstructorInitializersOnNextLine: true
+FixNamespaceComments: false
+ForEachMacros:
+  - foreach
+  - Q_FOREACH
+  - BOOST_FOREACH
+IfMacros:
+  - KJ_IF_MAYBE
+IncludeBlocks:   Preserve
+IncludeCategories:
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '^(<|"(gtest|gmock|isl|json)/)'
+    Priority:        3
+    SortPriority:    0
+    CaseSensitive:   false
+  - Regex:           '.*'
+    Priority:        1
+    SortPriority:    0
+    CaseSensitive:   false
+IncludeIsMainRegex: '(Test)?$'
+IncludeIsMainSourceRegex: ''
+IndentAccessModifiers: false
+IndentCaseLabels: false
+IndentCaseBlocks: false
+IndentGotoLabels: true
+IndentPPDirectives: None
+IndentExternBlock: AfterExternBlock
+IndentRequires:  false
+IndentWidth:     4
+IndentWrappedFunctionNames: true
+InsertTrailingCommas: None
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+LambdaBodyIndentation: Signature
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 4
+ObjCBreakBeforeNestedBlockParam: true
+ObjCSpaceAfterProperty: true
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakAssignment: 10
+PenaltyBreakBeforeFirstCallParameter: 30
+PenaltyBreakComment: 10
+PenaltyBreakFirstLessLess: 0
+PenaltyBreakOpenParenthesis: 0
+PenaltyBreakString: 10
+PenaltyBreakTemplateDeclaration: 10
+PenaltyExcessCharacter: 100
+PenaltyReturnTypeOnItsOwnLine: 60
+PenaltyIndentedWhitespace: 0
+PointerAlignment: Left
+PPIndentWidth:   -1
+ReferenceAlignment: Pointer
+ReflowComments:  false
+RemoveBracesLLVM: false
+SeparateDefinitionBlocks: Leave
+ShortNamespaceLines: 1
+SortIncludes:    Never
+SortJavaStaticImport: Before
+SortUsingDeclarations: false
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCaseColon: false
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: Never
+SpaceBeforeParensOptions:
+  AfterControlStatements: false
+  AfterForeachMacros: false
+  AfterFunctionDefinitionName: false
+  AfterFunctionDeclarationName: false
+  AfterIfMacros:   false
+  AfterOverloadedOperator: false
+  BeforeNonEmptyParentheses: false
+SpaceAroundPointerQualifiers: Default
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  Never
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: false
+SpacesInCStyleCastParentheses: false
+SpacesInLineCommentPrefix:
+  Minimum:         1
+  Maximum:         -1
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+SpaceBeforeSquareBrackets: false
+BitFieldColonSpacing: Both
+Standard:        c++03
+StatementAttributeLikeMacros:
+  - Q_EMIT
+StatementMacros:
+  - Q_UNUSED
+  - QT_REQUIRE_VERSION
+TabWidth:        4
+UseCRLF:         false
+UseTab:          Never
+WhitespaceSensitiveMacros:
+  - STRINGIZE
+  - PP_STRINGIZE
+  - BOOST_PP_STRINGIZE
+  - NS_SWIFT_NAME
+  - CF_SWIFT_NAME
+...
+

BIN
pokemon_trading/.flipcorg/banner.png


BIN
pokemon_trading/.flipcorg/gallery/1.png


BIN
pokemon_trading/.flipcorg/gallery/2.png


BIN
pokemon_trading/.flipcorg/gallery/3.png


BIN
pokemon_trading/.flipcorg/gallery/4.png


BIN
pokemon_trading/.flipcorg/gallery/5.png


BIN
pokemon_trading/.flipcorg/gallery/6.png


+ 13 - 0
pokemon_trading/.github/FUNDING.yml

@@ -0,0 +1,13 @@
+# These are supported funding model platforms
+
+github: EstebanFuentealba # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: #
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

+ 45 - 0
pokemon_trading/.github/ISSUE_TEMPLATE/01_bug_report.yml

@@ -0,0 +1,45 @@
+name: Bug report
+description: File a bug reports regarding the app.
+labels: ["bug"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        Thank you for taking the time to fill out an issue, this template is meant for any issues related to application.
+  - type: textarea
+    id: description
+    attributes:
+      label: Describe the bug.
+      description: "A clear and concise description of what the bug is."
+    validations:
+      required: true
+  - type: textarea
+    id: repro
+    attributes:
+      label: Reproduction
+      description: "How can this bug be reproduced?"
+      placeholder: |
+        1. Switch on...
+        2. Press button '....'
+        3. Wait for the moon phase
+        4. It burns
+    validations:
+      required: true
+  - type: input
+    id: target
+    attributes:
+      label: Target Framework
+      description: Specify the target
+      # Target seems to be largely ignored by outside sources.
+  - type: textarea
+    id: logs
+    attributes:
+      label: Logs
+      description: Attach your debug logs here
+      render: Text
+      # Avoid rendering as Markdown here.
+  - type: textarea
+    id: anything-else
+    attributes:
+      label: Anything else?
+      description: Let us know if you have anything else to share.

+ 21 - 0
pokemon_trading/.github/ISSUE_TEMPLATE/02_implemented.yml

@@ -0,0 +1,21 @@
+name: I implemented it
+description: Share your process.
+labels: ["implemented"]
+body:
+- type: markdown
+  attributes:
+    value: |
+      Thank you for taking the time to fill out. If you have already implemented the application, could you share which Flipper Zero framework you have used? Additionally, could you specify the required type of Game Boy and cartridge? Lastly, it would be great if you could share some images of the process.
+- type: textarea
+  id: desc
+  attributes:
+    label: "Describe the process."
+    description: |
+      Feel free to describe in as much detail as you wish.
+  validations:
+    required: true
+- type: input
+  id: type
+  attributes:
+    label: Game boy
+    description: (Color, Pocket, Advance)

+ 35 - 0
pokemon_trading/.github/workflows/flipperZeroAction.yml

@@ -0,0 +1,35 @@
+name: "FAP: Build and lint"
+on: [push, pull_request]
+jobs:
+  ufbt-build-action:
+    runs-on: ubuntu-latest
+    name: 'ufbt: Build'
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          submodules: recursive  # Ensure submodules are also checked out
+
+      - name: Setup flipper-gblink submodule
+        run: git submodule update --init --recursive
+
+      # Add any additional steps needed for the build process
+      # Replace this with your existing build steps
+
+      - name: Build with ufbt GAME BOY Pokemon Trading
+        uses: flipperdevices/flipperzero-ufbt-action@v0.1.3
+        id: build-app-gb-pokemon-trading
+        with:
+          sdk-channel: release
+          app-dir: ./
+      - name: Upload app artifacts GAME BOY Pokemon Trading
+        uses: actions/upload-artifact@v3
+        with:
+          name: ${{ github.event.repository.name }}-${{ steps.build-app-gb-pokemon-trading.outputs.suffix }}
+          path: ${{ steps.build-app-gb-pokemon-trading.outputs.fap-artifacts }}
+      - name: Release
+        uses: softprops/action-gh-release@v1
+        if: startsWith(github.ref, 'refs/tags/')
+        with:
+          files: |
+            ${{ steps.build-app-gb-pokemon-trading.outputs.fap-artifacts }}

+ 1 - 0
pokemon_trading/.gitsubtree

@@ -1 +1,2 @@
 https://github.com/xMasterX/all-the-plugins dev non_catalog_apps/gb-pokemon-trading
+https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading main /

+ 34 - 2
pokemon_trading/README.md

@@ -1,4 +1,4 @@
-# 🐬 Flipper Zero - Pokemon Trading in Game Boy
+# GAME BOY Pokemon Trading MALVEKE
 
 <p align="center">
 <a target="_blank" href="https://www.reddit.com/r/flipperzero/comments/121ncot/flipper_zero_game_boy_pokemon_trading/">
@@ -22,12 +22,23 @@ It currently trades a Pokemon based on your choice of Pokemon, Level, Stats and
 
 ## Hardware Interface
 The Game Boy is connected to the Flipper Zero's GPIO pins via a GBC style Game Link Cable. The [Flipper GB Link module](https://www.tindie.com/products/kbembedded/game-link-gpio-module-for-flipper-zero-game-boy/) is an easy way to connect a Game Boy via a Game Link Cable to the Flipper Zero.
+
+<p align='center'>
+  <a href="https://www.tindie.com/stores/kbembedded/?ref=offsite_badges&utm_source=sellers_kbembedded&utm_medium=badges&utm_campaign=badge_large">
+<img src="https://i.imgur.com/WQIJK8G.png" alt="Flipper GB Link module" width="680">
+  </a>
+</p>
 <p align='center'>
 <a href="https://www.tindie.com/stores/kbembedded/?ref=offsite_badges&utm_source=sellers_kbembedded&utm_medium=badges&utm_campaign=badge_large"><img src="https://d2ss6ovg47m0r5.cloudfront.net/badges/tindie-larges.png" alt="I sell on Tindie" width="200" height="104"></a>
 </p>
 
 Additionally, the [MALVEKE - GAME BOY Tools for Flipper Zero](https://www.tindie.com/products/efuentealba/malveke-game-boy-tools-for-flipper-zero/) is supported by this tool.
 
+<p align='center'>
+<a href="https://www.tindie.com/stores/efuentealba/?ref=offsite_badges&utm_source=sellers_efuentealba&utm_medium=badges&utm_campaign=badge_large">
+<img src="https://i.imgur.com/xdbLXBP.png" alt="MALVEKE" width="680">
+</a>
+</p>
 <p align='center'>
 <a href="https://www.tindie.com/stores/efuentealba/?ref=offsite_badges&utm_source=sellers_efuentealba&utm_medium=badges&utm_campaign=badge_large"><img src="https://d2ss6ovg47m0r5.cloudfront.net/badges/tindie-larges.png" alt="I sell on Tindie" width="200" height="104"></a>
 </p>
@@ -62,7 +73,28 @@ And use [**qFlipper**](https://flipperzero.one/update) to copy the generated **p
 
 These instructions assume that you are starting at the Flipper Zero desktop. Otherwise, press the Back button until you are at the desktop.
 
-- If using a MALVEKE board, plug it in to the GPIO header now. The app will auto-detect and select the correct pinout to support the MALVEKE EXT1 interface. If using the Flipper GB Link board, or any other pinout, they can be connected to the Flipper Zero now, or at any point in the future.
+- If you're using a MALVEKE PCB version, verify the **Pinout** configuration:
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-00.png" width="400" />
+        <br />
+    </p>
+
+    - MALVEKE **2.5** PCB Version: If you're using this version, select the `MALVEKE` configuration.
+        <p align='center'>
+            <br />
+            <img src="./docs/images/flipper-zero-flat-01.png" width="400" />
+            <br />
+        </p>
+
+    - MALVEKE **2.5.1** PCB Version: If you're using this version, select the `ORIGINAL`
+        <p align='center'>
+            <br />
+            <img src="./docs/images/flipper-zero-flat-02.png" width="400" />
+            <br />
+        </p>
+
 - Press the `OK` button on the Flipper to open the main menu.
 - Choose `Applications` from the menu.
 - Choose `GPIO` from the submenu.

+ 1 - 1
pokemon_trading/README_catalog.md

@@ -1,4 +1,4 @@
-# 🐬 Flipper Zero - Pokemon Trading in Game Boy
+# GAME BOY Pokemon Trading MALVEKE
 
 ## Introduction
 

+ 1 - 1
pokemon_trading/README_es.md

@@ -1,4 +1,4 @@
-# 🐬 Flipper Zero - Pokemon Trading in Game Boy
+# GAME BOY Pokemon Trading MALVEKE
 
 <p align="center">
 <a target="_blank" href="https://www.reddit.com/r/flipperzero/comments/121ncot/flipper_zero_game_boy_pokemon_trading/">

+ 2 - 2
pokemon_trading/application.fam

@@ -1,11 +1,11 @@
 App(
     appid="pokemon",
-    name="Pokemon Trading",
+    name="[GB] Pokemon Trading",
     apptype=FlipperAppType.EXTERNAL,
     entry_point="pokemon_app",
     requires=["gui"],
     stack_size=2 * 1024,
-    fap_version=[1,5],
+    fap_version=[1, 6],
     fap_category="GPIO",
     fap_icon="pokemon_10px.png",
     fap_icon_assets="assets",

+ 3 - 0
pokemon_trading/changelog.md

@@ -1,5 +1,8 @@
 # Changelog - Patch Notes
 
+## Version 1.6
+- **Change Name:** All the application names for GAME BOY/MALVEKE were standardized for better readability on the screen.
+
 ## Version 1.5
 - **Add Features:** Incorporate flipper-gblink library; Add support for MALVEKE board as well as custom pin selection; If MALVEKE board is detected, default to that pinout, otherwise use the original documented pinout.
 - **BUG:** The current MALVEKE pinout and interrupt use breaks the OK button after entering the trade screen.

BIN
pokemon_trading/docs/images/EXT-Link.png


BIN
pokemon_trading/docs/images/GPIO-GBPIN-v2.png


BIN
pokemon_trading/docs/images/GPIO-GBPIN_light-v2.png


BIN
pokemon_trading/docs/images/back.png


+ 9 - 0
pokemon_trading/docs/images/back.svg

@@ -0,0 +1,9 @@
+<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
+    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    width="24" height="24" viewBox="0 0 24 24">
+    <path
+        d="M22,12C22,6.514 17.486,2 12,2C6.514,2 2,6.514 2,12C2,17.486 6.514,22 12,22C17.486,22 22,17.486 22,12M20,12C20,16.389 16.389,20 12,20C7.611,20 4,16.389 4,12C4,7.611 7.611,4 12,4C16.389,4 20,7.611 20,12"></path>
+    <path
+        d="M7.154,9.781L9.62,8L9.62,9.096L14.004,9.096C15.874,9.096 17.154,10.969 17.154,12.52C17.154,14.333 15.959,15.945 14.278,15.945L9.757,15.945L9.757,14.712L14.141,14.712C15.224,14.712 15.785,13.409 15.785,12.657C15.785,11.906 15.425,10.466 14.141,10.466L9.62,10.466L9.62,11.425L7.154,9.781Z"
+        style="stroke-width:0.55px;"></path>
+</svg>

BIN
pokemon_trading/docs/images/cut-cable-v3.png


BIN
pokemon_trading/docs/images/dmg_link_port_pinout.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-00.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-01.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-02.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-1-1.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-1.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-10.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-11.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-12.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-13.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-2.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-3.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-5.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-6-1.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-6-2.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-6.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-7.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-8-1.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-8.png


BIN
pokemon_trading/docs/images/flipper-zero-flat-9.png


BIN
pokemon_trading/docs/images/flipper-zero-flat.png


BIN
pokemon_trading/docs/images/flipper-zero-flat.psd


BIN
pokemon_trading/docs/images/flipper-zero-flat.xcf


BIN
pokemon_trading/docs/images/flipper-zero-pcb.png


BIN
pokemon_trading/docs/images/game_boy_pokemon_center.png


BIN
pokemon_trading/docs/images/game_boy_save.png


BIN
pokemon_trading/docs/images/game_boy_save_trade.png


BIN
pokemon_trading/docs/images/game_boy_trade_list.png


BIN
pokemon_trading/docs/images/game_boy_trade_list_select_trade.png


BIN
pokemon_trading/docs/images/game_boy_trade_list_select_trade_confirm.png


BIN
pokemon_trading/docs/images/game_boy_trade_room.png


BIN
pokemon_trading/docs/images/game_boy_trade_room_2.png


BIN
pokemon_trading/docs/images/gb_spi.png


BIN
pokemon_trading/docs/images/gblpof.gif


Разница между файлами не показана из-за своего большого размера
+ 7 - 0
pokemon_trading/docs/images/implemented.svg


BIN
pokemon_trading/docs/images/left.png


+ 6 - 0
pokemon_trading/docs/images/left.svg

@@ -0,0 +1,6 @@
+<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
+    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
+    width="24" height="24" viewBox="0 0 24 24">
+    <path
+        d="M22,12A10,10 0 0,0 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12M14,7L9,12L14,17V7Z"></path>
+</svg>

BIN
pokemon_trading/docs/images/pcb.png


BIN
pokemon_trading/docs/images/qFlipper.png


BIN
pokemon_trading/docs/images/reboot.png


BIN
pokemon_trading/docs/images/wgbl-0.png


+ 744 - 0
pokemon_trading/docs/images/white_flat.svg

@@ -0,0 +1,744 @@
+<svg version="1.1" id="Flipper_1" xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+    viewBox="0 0 202.5 85.4" style="enable-background:new 0 0 202.5 85.4;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+	.st1{fill:#231F20;}
+	.st2{fill:#fe8a2c;}
+	.st3{display:none;}
+	.st4{display:inline;fill:#FF8200;}
+	.st5{fill:#808080;}
+</style>
+<g id="white">
+	<g>
+		<g>
+			<path class="st0" d="M40.9,0.6h126.7c3.9,0.1,7.9,1,11.1,4.7C181.9,9,195.6,26,197,27.8s2.9,4.1,3.3,7.9
+				c0.4,3.8,1.5,29.3,1.5,32.8c0,3.7-1.1,5.2-1.9,6.9c-0.8,1.5-2,4-2.8,5.5s-3.5,3.8-7.8,3.9H32.2c-4.6,0-8.4-1.7-10.9-5.1
+				C18.8,76.4,5.1,57.5,4.5,56.5c-1-1.6-1.8-4.1-3.2-6.9c-0.9-1.8-1.3-4.6,1-7.8c2.4-3.2,25.8-33.6,27.9-36
+				C32.3,3.3,35.9,0.5,40.9,0.6z"/>
+			<path class="st1" d="M32.1,85.4c-4.7,0-8.6-1.8-11.2-5.3C18.6,77,4.6,57.9,4,56.8c-0.6-1-1.1-2.2-1.7-3.6c-0.4-1-0.9-2.2-1.5-3.4
+				s-1.7-4.4,1.1-8.3c2.5-3.4,26-33.8,27.9-36.1c1.7-2,5.5-5.4,11-5.4h0.1h126.7c3.2,0.1,7.9,0.7,11.6,4.9c1.9,2.3,8.1,9.9,17.9,22
+				l0.4,0.5c1.5,1.9,3,4.2,3.4,8.2c0.5,4,1.5,29.5,1.5,32.9c0,3.4-0.9,5.1-1.7,6.6c-0.1,0.2-0.2,0.4-0.3,0.6c-0.8,1.5-2,4-2.8,5.5
+				c-0.8,1.6-3.7,4.1-8.3,4.2H32.2C32.2,85.4,32.1,85.4,32.1,85.4z M40.8,1.1c-5.1,0-8.6,3.1-10.2,5c-1.9,2.3-25.4,32.6-27.8,36
+				c-2.5,3.4-1.6,6.1-1,7.2c0.6,1.2,1.1,2.4,1.6,3.5C4,54.2,4.5,55.3,5,56.2C5.5,57.1,19.3,76,21.8,79.4c2.4,3.2,6,4.9,10.4,4.9
+				h157.3c4.1-0.1,6.6-2.2,7.3-3.6c0.8-1.6,2-4,2.8-5.5c0.1-0.2,0.2-0.4,0.3-0.6c0.8-1.4,1.5-2.9,1.6-6.1c0-3.9-1.1-29.1-1.5-32.8
+				s-1.8-5.9-3.2-7.6l-0.4-0.5c-12.3-15.3-16.5-20.4-17.9-22c-2.6-3-6-4.4-10.7-4.5H41.1C40.9,1.1,40.8,1.1,40.8,1.1z"/>
+		</g>
+		<g>
+			<path class="st1" d="M27.3,78.5c-4.6,0-7-1.8-12.6-9.5c-5.4-7.3-12.9-17.8-13-17.9l0.5-0.3c0.1,0.1,7.5,10.6,12.9,17.9
+				c5.5,7.5,7.8,9.2,12.2,9.2h165.4c3.3-0.2,6.7-1.8,7.6-3.6l0.5,0.3c-1,2-4.6,3.8-8.1,3.9H27.3z"/>
+		</g>
+		<g>
+			<path class="st0" d="M164.8,2.9c4,0,6.6,0.5,9.2,3.6s18,22.2,19.3,23.8c1.3,1.6,2.4,4,2.4,6.6s0.6,14.8,0.4,18
+				c-0.2,3.3-2.9,5.7-6.4,5.8H42c-4.7-0.1-6.7-1.3-8.9-3.6c-2.2-2.4-7.9-8.5-9.6-10.7c-1.9-2.4-1-4.2,0.1-5.9
+				C24.9,38.9,43.4,11,45.2,8.1c1.7-2.8,4.9-5.2,8.8-5.2L164.8,2.9z"/>
+			<path class="st1" d="M42.1,61.1c-4.8-0.1-6.8-1.3-9.1-3.7s-7.9-8.6-9.6-10.8c-2-2.5-1.1-4.5,0.1-6.2C24.8,38.6,43.3,10.7,44.9,8
+				c2.1-3.3,5.4-5.3,9-5.3l0,0h110.8c4.2,0,6.8,0.6,9.4,3.7c2.6,3.1,18.2,22.4,19.3,23.8c1.5,2,2.4,4.5,2.4,6.8
+				c0,0.9,0.1,2.9,0.2,5.2c0.2,4.8,0.4,10.7,0.3,12.8c-0.2,3.4-3,6-6.6,6.1H42.1z M54,3.2c-3.4,0-6.6,1.9-8.5,5.1
+				C43.8,11,25.2,38.9,24,40.7c-1,1.5-2,3.2-0.1,5.5c1.7,2.2,7.3,8.3,9.6,10.7c2.2,2.3,4.1,3.5,8.7,3.5h147.7
+				c3.3-0.1,5.9-2.5,6.1-5.6c0.1-2.1-0.1-8.3-0.3-12.8c-0.1-2.3-0.2-4.3-0.2-5.2c0-3.2-1.6-5.6-2.3-6.4C192,29,176.5,9.7,173.8,6.7
+				c-2.5-2.9-5-3.4-9-3.5L54,3.2L54,3.2z"/>
+		</g>
+		<g>
+			<path class="st0" d="M191.3,39.6c2.5,3.2,0.8,11-4.7,11.9h-32.8c-11.3-0.1-22.8-9.4-22.7-22.7S142.7,7,154.1,7
+				c10.4,0.1,16.8,7.3,17.4,8.2C173.4,17.7,189.1,36.8,191.3,39.6z"/>
+			<path class="st1" d="M153.8,51.8c-5.7,0-11.5-2.4-15.8-6.5c-4.7-4.4-7.2-10.3-7.2-16.6C130.9,15,142.9,6.6,154,6.6h0.1
+				c11.1,0.1,17.6,8.2,17.6,8.3c0.9,1.2,5,6.1,9.2,11.4c4.6,5.7,9.4,11.6,10.6,13.1l0,0c1.4,1.7,1.6,4.9,0.5,7.6
+				c-1,2.6-3,4.3-5.4,4.7L153.8,51.8z M154,7.2c-10.8,0-22.5,8.2-22.6,21.5c0,6.1,2.5,11.9,7,16.1c4.3,4,9.9,6.3,15.4,6.3h32.8
+				c2.1-0.4,3.9-1.9,4.9-4.4s0.8-5.4-0.4-7l0,0c-1.2-1.5-5.9-7.4-10.6-13.1c-4.3-5.2-8.3-10.2-9.2-11.4
+				C171.2,15.1,164.9,7.2,154,7.2L154,7.2z"/>
+		</g>
+		<g>
+			<path class="st0" d="M147.8,80.3h23.9c0.9,0,1.8,1.1,0.1,1.2h-24.3C146.8,81.5,146.2,80.6,147.8,80.3z"/>
+			<path class="st1" d="M147.5,81.8c-0.5,0-0.9-0.4-0.9-0.8c0-0.3,0.1-0.8,1.2-1l0,0h23.9c0.7,0,1.3,0.5,1.3,1
+				c0,0.3-0.2,0.7-1.2,0.8H147.5z M147.8,80.6c-0.6,0.1-0.7,0.3-0.7,0.4s0.2,0.3,0.4,0.3h24.3c0.5,0,0.7-0.2,0.7-0.2
+				c0-0.1-0.3-0.4-0.8-0.4L147.8,80.6z"/>
+		</g>
+		<g>
+			<path class="st0" d="M195.4,80.4c0.3,0.1,0.3,1.7-2.4,2.3c-4.1,1-6,0.3-5.4-0.7s1.3-0.4,4.2-0.9S194.7,80,195.4,80.4z"/>
+			<path class="st1" d="M189.6,83.5c-1.1,0-1.9-0.2-2.2-0.6c-0.2-0.3-0.2-0.6,0-0.9c0.4-0.7,1-0.8,1.9-0.8c0.6,0,1.4-0.1,2.5-0.2
+				c1.4-0.2,2.1-0.5,2.5-0.7c0.5-0.2,0.8-0.3,1.2,0c0.2,0.1,0.3,0.3,0.3,0.6c0,0.3-0.2,1.7-2.7,2.2
+				C191.8,83.3,190.5,83.5,189.6,83.5z M195,80.6c-0.1,0-0.2,0-0.5,0.1c-0.5,0.2-1.2,0.5-2.6,0.7c-1.1,0.2-1.9,0.2-2.5,0.3
+				c-1,0-1.2,0.1-1.5,0.5c-0.1,0.2,0,0.3,0,0.3c0.3,0.4,1.9,0.7,5.2-0.1c1.5-0.3,2-0.9,2.2-1.3c0.1-0.2,0.1-0.4,0.1-0.5
+				C195.2,80.6,195.1,80.6,195,80.6z"/>
+		</g>
+		<g>
+			<path class="st2" d="M154,8.6c12.2,0.2,21.3,10.3,21.3,20.4c-0.1,10.6-8.5,20.6-20.7,20.6c-12.2-0.1-22-9.2-21.9-21.1
+				C132.8,17.1,142.7,8.4,154,8.6z"/>
+			<path class="st1" d="M154.8,49.9h-0.1c-12.6-0.1-22.4-9.5-22.3-21.5c0-5.3,2.2-10.3,6-14.1c4.1-4,9.8-6.2,15.7-6.2l0,0
+				c12.9,0.2,21.8,11.1,21.7,20.8C175.7,39.1,167.7,49.9,154.8,49.9z M153.6,9c-5.5,0-10.8,2.1-14.7,5.9c-3.7,3.6-5.8,8.4-5.8,13.5
+				c-0.1,11.5,9.4,20.6,21.5,20.7h0.1c12.4,0,20.1-10.4,20.1-20.1c0-9.2-8.5-19.7-20.9-19.9C153.9,9,153.8,9,153.6,9z"/>
+		</g>
+		<g>
+			<path class="st2" d="M183.4,36.5c4.3,0,6.9,3.5,6.9,6.7c0,3.1-2.2,6.4-6.6,6.4c-4.2-0.1-6.9-3.5-6.9-6.7
+				C176.9,39.7,179.6,36.6,183.4,36.5z"/>
+			<path class="st1" d="M183.8,50.1h-0.1c-2,0-3.9-0.8-5.3-2.2c-1.3-1.4-2-3.2-2-4.9c0.1-3.2,2.8-6.7,7.1-6.8l0,0
+				c2.1,0,4,0.8,5.4,2.3c1.2,1.3,1.9,3.1,1.9,4.9c0,1.8-0.7,3.6-2,4.9C187.5,49.4,185.8,50.1,183.8,50.1z M183.5,37L183.5,37
+				c-3.8,0-6.2,3.1-6.3,5.9c0,1.6,0.6,3.1,1.8,4.3c1.2,1.3,2.9,2,4.7,2s3.4-0.5,4.5-1.7c1.1-1.1,1.7-2.7,1.7-4.3s-0.6-3.1-1.7-4.3
+				C187.4,38.1,185.9,37,183.5,37z"/>
+		</g>
+		<g>
+			<path class="st1" d="M154.5,46c-0.3,0-0.5-0.1-0.7-0.4c-0.2-0.2-1.3-2-2.3-3.7L151,41c-0.2-0.4-0.3-0.8-0.1-1
+				c0.1-0.1,0.3-0.3,0.7-0.3s1.8,0,3.1,0c1.1,0,2.2,0,2.5,0c0.5,0,0.7,0.3,0.8,0.4c0.1,0.2,0.1,0.6-0.1,0.8
+				c-0.1,0.1-0.3,0.6-0.7,1.2c-0.9,1.6-1.8,3.2-2,3.5S154.7,46,154.5,46L154.5,46z M151.5,40.2c-0.1,0-0.1,0-0.1,0.1s0,0.3,0.1,0.5
+				l0.5,0.8c0.7,1.2,2.1,3.5,2.3,3.7c0.1,0.1,0.2,0.2,0.3,0.2l0,0c0.1,0,0.2-0.1,0.2-0.2c0.2-0.3,1.3-2.2,2-3.4
+				c0.3-0.6,0.6-1,0.7-1.2c0.1-0.1,0.1-0.2,0-0.3c0-0.1-0.2-0.1-0.3-0.1c-0.3,0-1.3,0-2.5,0C153.3,40.2,152,40.2,151.5,40.2
+				L151.5,40.2L151.5,40.2z"/>
+		</g>
+		<g>
+			<path class="st1" d="M142,32c-0.2,0-0.3,0-0.6-0.1s-2.5-1.3-4.5-2.5l-0.5-0.3c-0.4-0.2-0.5-0.5-0.5-0.7c0-0.3,0.2-0.6,0.6-0.8
+				c0.3-0.2,2.2-1.2,3.4-1.9l1.1-0.6c0.3-0.2,0.8-0.4,1.1-0.2c0.4,0.2,0.3,0.7,0.3,0.8c0,0.6,0,3.8,0.1,5v0.4c0,0.3-0.1,0.6-0.3,0.7
+				C142.3,32,142.1,32,142,32z M141.9,25.5c-0.1,0-0.2,0-0.5,0.2l-1.1,0.6c-1.3,0.7-3.1,1.7-3.4,1.9c-0.2,0.1-0.3,0.2-0.3,0.3
+				c0,0.1,0.1,0.1,0.2,0.2l0.5,0.3c1.1,0.6,4.1,2.3,4.4,2.5c0.3,0.1,0.4,0.1,0.4,0.1s0-0.1,0-0.2V31c0-1.2-0.1-4.4-0.1-5h0.3H142
+				C142,25.6,142,25.5,141.9,25.5L141.9,25.5z"/>
+		</g>
+		<g>
+			<path class="st1" d="M166.6,32c-0.1,0-0.3,0-0.4-0.1c-0.2-0.1-0.4-0.3-0.4-0.8c0-0.3,0-1,0-1.8c0-1.3-0.1-2.9,0-3.4l0,0
+				c0-0.4,0.1-0.7,0.4-0.9c0.3-0.2,0.7-0.1,1.3,0.2c0.5,0.3,3.4,2,4.2,2.5l0.2,0.1c0.3,0.2,0.5,0.4,0.5,0.7c0,0.2-0.1,0.5-0.6,0.8
+				c-0.6,0.4-4.1,2.4-4.5,2.6C167,32,166.8,32,166.6,32z M166.3,25.9c0,0.6,0,2.1,0,3.4c0,0.8,0,1.5,0,1.8c0,0.1,0,0.3,0.1,0.3
+				c0.1,0.1,0.2,0,0.4-0.1c0.4-0.2,3.9-2.2,4.5-2.6c0.2-0.1,0.3-0.3,0.3-0.3c0-0.1-0.1-0.1-0.2-0.2l-0.2-0.1
+				c-0.8-0.5-3.7-2.1-4.2-2.4c-0.4-0.2-0.7-0.3-0.7-0.2C166.3,25.5,166.3,25.7,166.3,25.9L166.3,25.9z"/>
+		</g>
+		<g>
+			<path class="st1" d="M156.8,17.5L156.8,17.5c-0.3,0-4,0-5.2,0h-0.5c-0.4,0-0.7-0.1-0.8-0.4c-0.1-0.1-0.2-0.4,0-0.9
+				c0.1-0.3,0.7-1.2,1.3-2.2c0.6-0.9,1.1-1.8,1.3-2.2c0.3-0.4,0.5-0.7,0.8-0.7s0.5,0.1,0.7,0.5c0.1,0.2,0.7,1.1,1.3,2.1
+				c0.7,1.1,1.4,2.3,1.6,2.5c0.2,0.3,0.2,0.6,0.1,0.9C157.4,17.3,157.1,17.5,156.8,17.5z M151.1,16.9h0.5c2.3,0,5,0,5.2,0
+				c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0-0.2-0.1-0.3c-0.2-0.3-0.9-1.4-1.6-2.6c-0.6-1-1.2-1.9-1.3-2.1c-0.1-0.2-0.2-0.2-0.2-0.2l0,0
+				c0,0-0.2,0.1-0.4,0.4c-0.2,0.4-0.8,1.3-1.3,2.2c-0.6,1-1.2,1.9-1.3,2.2c-0.1,0.1-0.1,0.2-0.1,0.3C150.9,16.9,151,16.9,151.1,16.9
+				L151.1,16.9z"/>
+		</g>
+		<g>
+			<path class="st1" d="M185.4,46.2L185.4,46.2h-3.8v-1.5h3.6l0,0c0.6,0,1-0.8,1-1.3c0-0.2-0.1-0.6-0.2-0.9
+				c-0.2-0.3-0.4-0.5-0.7-0.5h-3.2v1l-2.7-1.8l2.7-1.9v1.1h3.1c0.7,0,1.4,0.4,2,1c0.5,0.6,0.7,1.3,0.7,1.9c0,0.8-0.2,1.5-0.7,2
+				C186.7,45.9,186.1,46.2,185.4,46.2z M182.2,45.6h3.2l0,0c0.5,0,1-0.2,1.4-0.7c0.4-0.4,0.6-1,0.6-1.7c0-0.5-0.2-1.1-0.6-1.6
+				c-0.4-0.5-0.9-0.8-1.5-0.8h-3.6v-0.6l-1.1,0.8l1.1,0.7v-0.5h3.7c0.5,0,1,0.3,1.2,0.8c0.3,0.5,0.3,1,0.3,1.2
+				c0,0.8-0.6,1.8-1.5,1.8l0,0h-3.1L182.2,45.6z"/>
+		</g>
+		<g>
+			<path class="st0" d="M133.3,47.9c0.7,0,1.3,0.7,1.3,1.3c0,0.5-0.4,1.2-1.2,1.1s-1.4-0.5-1.4-1.2C132,48.5,132.5,47.9,133.3,47.9z
+				"/>
+			<path class="st1" d="M133.4,50.6L133.4,50.6c-0.9,0-1.7-0.6-1.6-1.4c0-0.8,0.7-1.5,1.5-1.5l0,0l0,0c0.9,0,1.5,0.8,1.5,1.6
+				C134.8,49.9,134.3,50.6,133.4,50.6z M133.3,48.2c-0.5,0-1,0.4-1,1c0,0.5,0.5,0.9,1.1,0.9l0,0c0.6,0,0.9-0.5,0.9-0.9
+				C134.2,48.8,133.8,48.2,133.3,48.2L133.3,48.2z"/>
+		</g>
+		<g>
+			<path class="st1" d="M154.4,35.9L154.4,35.9c-2.2,0-4.3-0.9-5.7-2.3c-1.3-1.3-2-3.1-1.9-5.1c0.1-4.8,4.4-7,7.4-7l0,0l0,0
+				c1.9,0,3.7,0.8,5.1,2.2c1.4,1.4,2.2,3.2,2.1,5.1c0,1.9-0.7,3.7-2,5C158.2,35.1,156.4,35.9,154.4,35.9z M154.2,22.3L154.2,22.3
+				c-2.7,0-6.5,1.9-6.5,6.2c0,1.7,0.6,3.3,1.7,4.4c1.3,1.3,3.2,2.1,5.1,2.1l0,0c1.7,0,3.3-0.6,4.4-1.8c1.1-1.2,1.8-2.7,1.8-4.4
+				c0-1.7-0.7-3.3-1.9-4.5C157.5,23,155.8,22.4,154.2,22.3z"/>
+		</g>
+		<g>
+			<path class="st0" d="M121.6,51.5H54.1c-2.7,0-5-2.2-5-5V11.7c0-2.7,2.2-5,5-5h67.5c2.7,0,5,2.2,5,5v34.8
+				C126.6,49.3,124.4,51.5,121.6,51.5z"/>
+			<path class="st1" d="M121.6,52H54.1c-3,0-5.5-2.4-5.5-5.5V11.7c0-3,2.4-5.5,5.5-5.5h67.5c3,0,5.5,2.5,5.5,5.5v34.8
+				C127.1,49.6,124.6,52,121.6,52z M54.1,7.3c-2.5,0-4.5,2-4.5,4.5v34.8c0,2.5,2,4.5,4.5,4.5h67.5c2.5,0,4.5-2,4.5-4.5V11.7
+				c0-2.5-2-4.5-4.5-4.5H54.1V7.3z"/>
+		</g>
+		<g>
+			<path class="st2" d="M121.4,49.1H54.5c-1.6,0-2.9-1.3-2.9-2.9V11.9c0-1.6,1.3-2.9,2.9-2.9h66.8c1.6,0,2.9,1.3,2.9,2.9v34.3
+				C124.3,47.8,123,49.1,121.4,49.1z"/>
+			<path class="st1" d="M121.4,49.4H54.5c-1.8,0-3.2-1.4-3.2-3.2V11.9c0-1.8,1.4-3.2,3.2-3.2h66.8c1.8,0,3.2,1.4,3.2,3.2v34.3
+				C124.5,48,123.1,49.4,121.4,49.4z M54.5,9.3c-1.4,0-2.6,1.2-2.6,2.6v34.3c0,1.4,1.2,2.6,2.6,2.6h66.8c1.4,0,2.6-1.2,2.6-2.6V11.9
+				c0-1.4-1.2-2.6-2.6-2.6C121.3,9.3,54.5,9.3,54.5,9.3z"/>
+		</g>
+	</g>
+	<g id="dolphin_1_">
+		<g>
+			<polygon points="86.7,35.8 86.1,35.8 85.6,35.8 85,35.8 85,36.4 85.6,36.4 86.1,36.4 86.7,36.4 87.2,36.4 87.8,36.4 87.8,35.8 
+				87.2,35.8 			"/>
+		</g>
+		<g>
+			<polygon points="70,35.8 69.5,35.8 69.5,36.3 70,36.3 70.6,36.3 70.6,35.8 			"/>
+		</g>
+		<g>
+			<rect x="58.97" y="35.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1959 94.8637)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.79" y="35.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8589 93.8361)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.7" y="35.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.7184 92.8058)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="88.9,35.3 88.3,35.3 88.3,34.7 87.8,34.7 87.2,34.7 87.2,35.3 87.8,35.3 87.8,35.8 88.3,35.8 88.9,35.9 
+				89.5,35.9 90,35.9 90,35.3 89.5,35.3 			"/>
+		</g>
+		<g>
+			<rect x="68.93" y="35.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 33.3228 104.5986)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="59.44" y="35.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.0809 94.909)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="58.35" y="35.01" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0409 93.7807)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.27" y="35.07" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9013 92.7517)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.18" y="34.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9613 91.5241)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="90.6,34.8 90,34.7 90,35.3 90.6,35.3 91.1,35.3 91.7,35.3 91.7,34.8 91.1,34.8 			"/>
+		</g>
+		<g>
+			<rect x="60" y="34.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2657 94.8522)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="58.92" y="34.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2264 93.7232)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.93" y="34.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1847 92.7943)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.74" y="34.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9479 91.6674)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.66" y="34.46" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9082 90.5384)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="91.7,34.2 91.7,34.8 92.2,34.8 92.8,34.8 92.8,34.2 92.2,34.2 			"/>
+		</g>
+		<g>
+			<polygon points="86.7,34.7 87.2,34.7 87.2,34.2 86.7,34.2 86.1,34.2 86.1,34.7 			"/>
+		</g>
+		<g>
+			<rect x="59.48" y="33.96" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2096 93.8691)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="58.49" y="33.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2686 92.8401)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.31" y="33.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0293 91.7103)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.12" y="33.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8907 90.4827)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.03" y="33.9" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.8514 89.3535)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="59.06" y="33.4" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3532 92.8826)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.97" y="33.36" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.3134 91.753)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.88" y="33.42" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1746 90.7263)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.7" y="33.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9363 89.5974)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="93.9,33.1 93.3,33.1 92.8,33.1 92.2,33.1 91.7,33.1 91.1,33.1 90.6,33.1 90,33.1 89.5,33.1 88.9,33.1 88.4,33.1 
+				87.8,33.1 87.2,33.1 86.7,33.1 86.1,33.1 85.6,33.1 85,33.1 84.5,33.1 84.5,32.5 85,32.5 85,31.9 85.6,32 85.6,31.4 86.1,31.4 
+				86.2,30.8 86.7,30.8 86.7,30.3 87.3,30.3 87.3,29.7 87.8,29.7 87.8,29.2 88.4,29.2 88.4,28.6 88.9,28.6 88.9,28.1 89.5,28.1 
+				89.5,27.5 90.1,27.5 90.1,27 90.6,27 90.6,26.4 91.2,26.4 91.2,25.9 91.7,25.9 91.7,25.3 92.3,25.3 92.3,24.8 92.8,24.8 
+				92.8,24.2 93.4,24.2 93.4,23.7 93.4,23.1 93.4,22.6 93.4,22 92.9,22 92.9,21.5 92.3,21.5 91.7,21.4 91.2,21.4 91.2,20.9 
+				90.6,20.9 90.1,20.9 89.5,20.9 89,20.9 88.4,20.9 87.9,20.9 87.3,20.9 86.8,20.9 86.2,20.9 86.2,21.4 85.6,21.4 85.1,21.4 
+				85.1,22 84.5,22 84,22 84,22.5 83.4,22.5 82.9,22.5 82.9,22 82.3,22 82.3,21.4 82.3,20.8 81.8,20.8 81.8,20.3 81.8,19.7 
+				81.2,19.7 81.2,19.2 80.7,19.2 80.7,18.6 80.1,18.6 80.1,18.1 79.6,18.1 79.6,17.5 79,17.5 78.5,17.5 78.5,16.9 77.9,16.9 
+				77.4,16.9 77.4,16.4 76.8,16.4 76.2,16.4 75.7,16.4 75.7,15.8 75.1,15.8 74.6,15.8 74,15.8 73.5,15.8 72.9,15.8 72.9,15.3 
+				72.4,15.2 71.8,15.2 71.3,15.2 70.7,15.2 70.2,15.2 69.6,15.2 69,15.2 68.5,15.2 67.9,15.2 67.4,15.2 66.8,15.2 66.3,15.2 
+				65.7,15.2 65.2,15.2 64.6,15.2 64.6,15.8 64,15.8 63.5,15.8 62.9,15.8 62.4,15.8 62.4,16.3 61.8,16.3 61.3,16.3 60.7,16.3 
+				60.7,16.9 60.2,16.9 60.2,17.4 59.6,17.4 59.1,17.4 59,18 58.5,18 57.9,17.9 57.9,18.5 57.4,18.5 57.4,19.1 56.8,19.1 56.8,19.6 
+				56.3,19.6 56.3,20.2 55.7,20.2 55.7,20.7 55.2,20.7 55.1,21.3 55.1,21.8 54.6,21.8 54.6,22.4 54.6,22.9 54,22.9 54,23.5 54,24 
+				53.5,24 53.5,24.6 53.5,25.1 53.5,25.7 54,25.7 54,25.1 54,24.6 54.6,24.6 54.6,24 54.6,23.5 55.1,23.5 55.1,22.9 55.1,22.4 
+				55.7,22.4 55.7,21.8 55.7,21.3 56.3,21.3 56.3,20.7 56.8,20.7 56.8,20.2 57.4,20.2 57.4,19.6 57.9,19.6 57.9,19.1 58.5,19.1 
+				58.5,18.5 59,18.5 59.6,18.5 59.6,18 60.2,18 60.7,18 60.7,17.4 61.3,17.4 61.8,17.4 62.4,17.4 62.9,17.4 63.5,17.4 64,17.4 
+				64.6,17.4 65.1,17.4 65.7,17.4 66.3,17.4 66.8,17.4 67.4,17.4 67.4,16.9 66.8,16.9 66.3,16.9 65.7,16.9 65.2,16.9 64.6,16.9 
+				64,16.9 63.5,16.9 62.9,16.9 62.9,16.3 63.5,16.3 64,16.3 64.6,16.3 65.2,16.3 65.2,15.8 65.7,15.8 66.3,15.8 66.8,15.8 
+				67.4,15.8 67.9,15.8 68.5,15.8 69,15.8 69.6,15.8 70.1,15.8 70.7,15.8 71.3,15.8 71.8,15.8 72.4,15.8 72.4,16.4 72.9,16.4 
+				72.9,16.9 73.5,16.9 73.5,16.4 74,16.4 74,16.9 74.6,16.9 75.1,16.9 75.7,16.9 76.2,16.9 76.8,16.9 76.8,17.5 76.8,18 77.3,18 
+				77.9,18.1 78.5,18.1 79,18.1 79,18.6 79.6,18.6 79.6,19.2 80.1,19.2 80.1,19.7 80.7,19.7 80.7,20.3 81.2,20.3 81.2,20.8 
+				81.2,21.4 81.2,21.9 80.7,21.9 80.6,22.5 81.2,22.5 81.8,22.5 82.3,22.5 82.3,23.1 82.3,23.6 82.9,23.6 83.4,23.6 83.4,23.1 
+				84,23.1 84.5,23.1 84.5,22.5 85.1,22.5 85.6,22.5 85.6,22 86.2,22 86.8,22 86.8,21.4 87.3,21.4 87.9,21.4 88.4,21.4 89,21.4 
+				89.5,21.4 90.1,21.4 90.6,21.4 90.6,22 91.2,22 91.7,22 92.3,22 92.3,22.6 92.8,22.6 92.8,23.1 92.3,23.1 91.7,23.1 91.2,23.1 
+				90.6,23.1 90.6,23.7 90.1,23.7 89.5,23.7 89,23.7 89,24.2 88.4,24.2 87.8,24.2 87.8,24.8 87.3,24.8 86.7,24.7 86.7,25.3 
+				86.2,25.3 86.2,25.9 85.6,25.9 85.6,26.4 85.1,26.4 85.1,27 84.5,27 84.5,27.5 84,27.5 83.9,28.1 83.4,28.1 83.4,28.6 82.8,28.6 
+				82.8,29.2 82.3,29.2 82.3,29.7 81.7,29.7 81.7,30.3 81.2,30.3 81.2,30.8 80.6,30.8 80.6,31.4 80,31.4 80,31.9 79.5,31.9 
+				79.5,32.5 78.9,32.5 78.9,33 78.4,33 78.4,33.6 77.8,33.6 77.8,34.1 77.3,34.1 77.3,34.7 76.7,34.7 76.2,34.7 76.1,35.2 
+				75.6,35.2 75,35.2 75,35.8 74.5,35.8 73.9,35.8 73.4,35.8 73.4,36.3 72.8,36.3 72.3,36.3 71.7,36.3 71.2,36.3 70.6,36.3 
+				70.6,36.9 71.1,36.9 71.7,36.9 72.3,36.9 72.8,36.9 73.4,36.9 73.9,36.9 74.5,36.9 75,36.9 75.6,36.9 76.1,36.9 76.7,36.9 
+				77.2,36.9 77.8,36.9 78.4,36.9 78.9,36.9 79.5,36.9 80,36.9 80.6,36.9 81.1,36.9 81.7,36.9 82.2,36.9 82.8,36.9 83.3,36.9 
+				83.9,36.9 84.5,36.9 85,36.9 85,36.4 84.5,36.4 83.9,36.4 83.4,36.4 82.8,36.4 82.2,36.4 81.7,36.4 81.1,36.4 80.6,36.4 80,36.4 
+				79.5,36.4 78.9,36.4 78.4,36.4 78.4,35.8 78.4,35.2 78.9,35.2 78.9,34.7 79.5,34.7 79.5,34.1 80,34.1 80,33.6 80.6,33.6 
+				81.1,33.6 81.7,33.6 82.3,33.6 82.8,33.6 83.4,33.6 83.9,33.6 83.9,34.2 84.5,34.2 85,34.2 85.6,34.2 86.1,34.2 86.1,33.6 
+				86.7,33.6 87.2,33.6 87.8,33.6 88.4,33.6 88.9,33.6 89.5,33.6 90,33.6 90.6,33.6 91.1,33.6 91.7,33.6 92.2,33.6 92.8,33.7 
+				92.8,34.2 93.3,34.2 93.9,34.2 93.9,34.8 93.9,35.3 93.9,35.9 93.3,35.9 93.3,36.4 92.8,36.4 92.8,37 92.2,37 92.2,37.5 
+				91.7,37.5 91.7,38.1 91.1,38.1 90.6,38.1 90.5,38.6 90,38.6 89.4,38.6 88.9,38.6 88.9,39.2 88.3,39.2 87.8,39.2 87.2,39.2 
+				87.2,39.7 86.7,39.7 86.1,39.7 85.6,39.7 85.5,40.3 85,40.3 84.4,40.3 83.9,40.3 83.3,40.3 83.3,40.8 82.8,40.8 82.2,40.8 
+				81.7,40.8 81.1,40.8 81.1,41.4 80.6,41.4 80,41.4 79.4,41.3 79.4,41.9 78.9,41.9 78.9,42.5 79.4,42.5 80,42.5 80.5,42.5 
+				81.1,42.5 81.7,42.5 82.2,42.5 82.8,42.5 82.8,41.9 83.3,41.9 83.9,41.9 83.9,41.4 83.9,40.8 84.4,40.8 85,40.8 85.5,40.8 
+				86.1,40.8 86.1,40.3 86.7,40.3 87.2,40.3 87.8,40.3 87.8,39.7 88.3,39.7 88.9,39.7 89.4,39.7 89.4,39.2 90,39.2 90.5,39.2 
+				91.1,39.2 91.1,38.6 91.7,38.6 92.2,38.6 92.2,38.1 92.8,38.1 92.8,37.5 93.3,37.5 93.3,37 93.9,37 93.9,36.4 94.4,36.4 
+				94.4,35.9 94.4,35.3 94.4,34.8 94.5,34.2 94.5,33.7 93.9,33.7 			"/>
+		</g>
+		<g>
+			<rect x="58.43" y="32.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.1982 91.7988)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.35" y="32.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.1586 90.6696)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.16" y="32.85" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.02 89.442)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.07" y="32.91" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8786 88.4149)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.91" y="32.37" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2429 90.7118)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.92" y="32.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.4021 89.5849)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.74" y="32.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0652 88.5576)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="60.55" y="31.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 28.4088 92.8184)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="58.4,31.8 58.4,32.4 59,32.4 59,32.9 59.5,32.9 59.5,33.5 60.1,33.5 60.1,34 60.6,34 60.6,34.6 61.2,34.6 
+				61.2,35.2 61.7,35.2 61.7,34.6 61.7,34 61.7,33.5 62.3,33.5 62.3,32.9 62.3,32.4 61.7,32.4 61.2,32.4 61.2,32.9 61.2,33.5 
+				60.6,33.5 60.6,32.9 60.1,32.9 60.1,32.4 59.5,32.4 59.5,31.8 59.5,31.3 59,31.3 59,31.8 			"/>
+		</g>
+		<g>
+			<rect x="57.39" y="31.81" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2872 89.6305)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.3" y="31.76" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2473 88.5013)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.02" y="31.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0083 87.1761)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="57.95" y="31.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3722 89.6722)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.87" y="31.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.4326 88.4445)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="55.68" y="31.1" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2895 87.218)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="60.6,30.7 60.1,30.7 60.1,31.3 60.1,31.8 60.6,31.8 60.6,31.3 			"/>
+		</g>
+		<g>
+			<rect x="57.33" y="30.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3174 88.4904)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="56.24" y="30.58" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3767 87.2628)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<path d="M68.4,30.2v-0.6V29v-0.6v-0.6v-0.6h-0.6v-0.6V26h-0.6v-0.6h-0.6H66v-0.6h-0.6h-0.6h-0.6h-0.6H63v0.6h-0.6h-0.6V26h-0.6
+				v0.6v0.6h-0.6v0.6v0.6V29v0.6v0.6h0.6v0.6v0.6h0.6V32v0.6h0.6V32H63h0.6v-0.6h0.6h0.6h0.6v-0.6H66h0.6h0.6h0.6h0.6H69v-0.6
+				L68.4,30.2z M63.4,28v-0.6H64h0.6V28v0.6H64h-0.6V28z"/>
+		</g>
+		<g>
+			<rect x="56.71" y="30.06" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3595 87.2071)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="71.2,29.7 71.2,29.1 71.2,28.6 71.2,28 71.2,27.4 71.2,26.9 71.2,26.3 70.6,26.3 70.6,26.9 70.6,27.4 70.6,28 
+				70.6,28.5 70.6,29.1 70.6,29.7 70.6,30.2 71.2,30.2 71.7,30.2 72.3,30.2 72.3,29.7 71.7,29.7 			"/>
+		</g>
+		<g>
+			<polygon points="60.1,29.6 60.1,29 60.1,28.5 60.1,27.9 60.1,27.4 60.1,26.8 59.6,26.8 59.6,27.4 59.6,27.9 59.5,28.5 59.5,29 
+				59.5,29.6 59.5,30.2 59.5,30.7 60.1,30.7 60.1,30.2 			"/>
+		</g>
+		<g>
+			<polygon points="72.3,29.1 72.3,29.7 72.8,29.7 73.4,29.7 73.4,29.1 72.9,29.1 			"/>
+		</g>
+		<g>
+			<polygon points="73.4,28.6 73.4,29.1 74,29.1 74.5,29.1 74.5,28.6 74,28.6 			"/>
+		</g>
+		<g>
+			<polygon points="74.5,28 74.5,28.6 75.1,28.6 75.6,28.6 75.6,28 75.1,28 			"/>
+		</g>
+		<g>
+			<polygon points="75.6,27.5 75.6,28 76.2,28 76.7,28 76.7,27.5 76.2,27.5 			"/>
+		</g>
+		<g>
+			<polygon points="69.5,28 69.5,28.5 69.5,29.1 69.5,29.7 69.5,30.2 69.5,30.8 69,30.8 69,31.3 69.5,31.3 70.1,31.3 70.1,30.8 
+				70.1,30.2 70.1,29.7 70.1,29.1 70.1,28.5 70.1,28 70.1,27.4 70.1,26.9 69.5,26.9 69.5,27.4 			"/>
+		</g>
+		<g>
+			<rect x="76.7" y="26.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.3644 104.0994)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="77.3,26.4 77.3,26.9 77.9,26.9 78.4,26.9 78.4,26.4 77.9,26.4 			"/>
+		</g>
+		<g>
+			<polygon points="69,26.9 69.5,26.9 69.5,26.3 69.5,25.8 69,25.8 69,26.3 			"/>
+		</g>
+		<g>
+			<polygon points="60.7,26.3 60.7,25.7 60.1,25.7 60.1,26.3 60.1,26.8 60.7,26.8 			"/>
+		</g>
+		<g>
+			<polygon points="58.4,26.8 58.4,27.4 58.4,27.9 58.4,28.5 58.4,29 58.4,29.6 58.4,30.1 57.9,30.1 57.9,30.7 58.4,30.7 58.4,31.3 
+				59,31.3 59,30.7 59,30.2 59,29.6 59,29 59,28.5 59,27.9 59,27.4 59,26.8 59,26.3 58.5,26.3 			"/>
+		</g>
+		<g>
+			<rect x="78.42" y="25.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1503 104.7495)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="79,25.3 79,25.8 79.5,25.8 80.1,25.8 80.1,25.3 79.5,25.3 			"/>
+		</g>
+		<g>
+			<polygon points="75.1,25.2 74.5,25.2 74,25.2 74,25.8 74.5,25.8 75.1,25.8 75.6,25.8 76.2,25.8 76.2,25.3 75.6,25.2 			"/>
+		</g>
+		<g>
+			<polygon points="70.7,25.2 70.1,25.2 70.1,25.8 70.1,26.3 70.6,26.3 70.7,25.8 			"/>
+		</g>
+		<g>
+			<rect x="68.31" y="25.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 42.7596 93.9763)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="60.7" y="25.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.2776 86.2758)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="59,25.7 59,26.3 59.6,26.3 59.6,25.7 59.6,25.2 59,25.2 			"/>
+		</g>
+		<g>
+			<rect x="80.04" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0393 105.1025)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="76.2,24.7 76.2,25.3 76.8,25.3 77.3,25.3 77.3,24.7 76.8,24.7 			"/>
+		</g>
+		<g>
+			<rect x="73.52" y="24.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5014 98.6335)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="69.57" y="24.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.5623 94.6831)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="67.99" y="24.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 43.0018 93.0898)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="61.16" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.2632 86.2221)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="59.48" y="24.57" transform="matrix(5.134305e-03 -1 1 5.134305e-03 34.6008 84.5275)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="80.6,24.2 80.6,24.7 81.2,24.7 81.7,24.7 81.8,24.2 81.2,24.2 			"/>
+		</g>
+		<g>
+			<polygon points="77.3,24.1 77.3,24.7 77.9,24.7 78.4,24.7 78.4,24.2 77.9,24.1 			"/>
+		</g>
+		<g>
+			<rect x="72.9" y="23.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5423 97.3489)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="69.04" y="24.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.6043 93.5989)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="67.3,24.7 67.9,24.7 67.9,24.1 67.3,24.1 66.8,24.1 66.8,24.6 			"/>
+		</g>
+		<g>
+			<polygon points="62.9,24.6 62.9,24.1 62.3,24.1 61.8,24.1 61.8,24.6 62.3,24.6 			"/>
+		</g>
+		<g>
+			<rect x="60.15" y="24.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.7867 84.6725)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="81.76" y="23.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.8264 105.7553)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="78.4" y="23.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.3101 102.5693)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="64,24.1 64.6,24.1 65.1,24.1 65.7,24.1 66.2,24.1 66.8,24.1 66.8,23.5 66.2,23.5 65.7,23.5 65.1,23.5 64.6,23.5 
+				64,23.5 63.5,23.5 62.9,23.5 62.9,24.1 63.5,24.1 			"/>
+		</g>
+		<g>
+			<rect x="60.61" y="23.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.8701 84.518)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="79,23 79,23.6 79.5,23.6 80.1,23.6 80.1,23.1 79.5,23 			"/>
+		</g>
+		<g>
+			<rect x="76.3" y="22.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.9897 99.6957)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="72.9,23 72.9,22.5 72.3,22.5 72.3,23 72.3,23.6 72.3,24.1 72.9,24.1 72.9,23.6 			"/>
+		</g>
+		<g>
+			<polygon points="69.6,23.6 69.6,23 69.6,22.4 69,22.4 69,23 68.4,23 68.5,22.4 67.9,22.4 67.9,21.9 67.3,21.9 67.3,22.4 
+				66.8,22.4 66.2,22.4 65.7,22.4 65.1,22.4 64.6,22.4 64,22.4 63.5,22.4 62.9,22.4 62.4,22.4 62.3,23 62.9,23 63.5,23 64,23 
+				64.6,23 65.1,23 65.7,23 66.2,23 66.8,23 67.3,23 67.3,23.5 67.9,23.5 68.4,23.5 68.4,24.1 69,24.1 69,23.5 			"/>
+		</g>
+		<g>
+			<polygon points="61.2,23 61.2,23.5 61.8,23.5 62.3,23.5 62.3,23 61.8,23 			"/>
+		</g>
+		<g>
+			<rect x="80.03" y="22.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.0965 103.0237)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="75.78" y="22.35" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.0348 98.6083)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="77.92" y="21.84" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6797 100.2473)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="75.15" y="21.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.8798 97.5249)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="73.4,21.9 73.4,21.4 72.9,21.4 72.9,21.9 72.9,22.5 73.4,22.5 			"/>
+		</g>
+		<g>
+			<rect x="68.53" y="21.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.4396 90.7545)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="77.4" y="21.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.7244 99.1622)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="67.91" y="21.27" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.2849 89.6707)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="79.45" y="20.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.1702 100.8023)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="76.68" y="20.71" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5681 97.8796)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="73.42" y="20.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1523 94.7938)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="68.57" y="20.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.5681 89.7142)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="78.92" y="20.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3146 99.6165)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="76.15" y="20.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5148 96.894)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="73.98" y="20.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.4324 94.6384)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="70.1,20.8 69.6,20.8 69.6,21.3 69,21.3 69,21.9 69.6,21.9 69.6,22.4 70.1,22.4 70.1,21.9 70.1,21.3 70.7,21.3 
+				70.7,20.8 70.7,20.2 70.1,20.2 			"/>
+		</g>
+		<g>
+			<rect x="69.04" y="20.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4527 89.7598)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="67.95" y="20.19" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.413 88.6307)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="78.4" y="19.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.2585 98.6329)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="74.54" y="19.54" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.6153 94.5821)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="70.69" y="19.55" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.7784 90.7335)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="69.6" y="19.61" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.6376 89.7032)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="68.51" y="19.66" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4975 88.6725)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="77.88" y="19.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3033 97.5454)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="75.01" y="19.02" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6008 94.5286)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="70.07" y="19.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.6235 89.6503)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="68.98" y="19.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.4831 88.6196)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="75.67" y="18.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.7848 94.6709)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="70.1,18.6 70.7,18.6 70.7,18 70.1,18 69.6,18 69,18 69,18.6 69.6,18.6 69.6,19.1 70.1,19.1 			"/>
+		</g>
+		<g>
+			<rect x="76.14" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.77 94.6179)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="72.38" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0291 90.8649)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="71.8,18 71.2,18 71.2,18.6 70.7,18.6 70.7,19.1 71.2,19.1 71.2,19.7 71.8,19.7 71.8,19.1 72.3,19.1 72.4,18.6 
+				71.8,18.6 			"/>
+		</g>
+		<g>
+			<rect x="72.95" y="17.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.1161 90.9096)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="71.86" y="17.41" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0754 89.7809)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="68.5,17.4 67.9,17.4 67.4,17.4 67.4,18 67.9,18 68.5,18 69,18 69,17.5 			"/>
+		</g>
+		<g>
+			<rect x="73.41" y="16.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.0985 90.8536)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="72.32" y="16.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0591 89.7247)" width="0.6" height="0.6"/>
+		</g>
+	</g>
+	<g id="furippa_1_">
+		<g>
+			<polygon points="107.3,30.9 107.3,31.5 107.8,31.5 108.4,31.5 108.4,30.9 107.8,30.9 			"/>
+		</g>
+		<g>
+			<rect x="108.43" y="30.34" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.5309 139.205)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="116.8,29.3 116.8,28.7 116.3,28.7 116.3,28.2 116.3,27.6 115.7,27.6 115.7,27 115.7,26.5 115.2,26.5 114.6,26.5 
+				114.6,27 114.6,27.6 114.6,28.2 115.1,28.2 115.1,28.7 115.1,29.3 115.7,29.3 115.7,29.9 115.7,30.4 116.3,30.4 116.3,31 
+				116.3,31.5 116.8,31.5 117.4,31.5 117.4,31 117.4,30.4 117.4,29.9 116.8,29.9 			"/>
+		</g>
+		<g>
+			<polygon points="108.4,29.3 108.4,28.7 107.8,28.7 107.8,29.3 107.8,29.8 108.4,29.8 			"/>
+		</g>
+		<g>
+			<polygon points="107.3,29.3 107.3,28.7 106.7,28.7 106.7,29.2 106.7,29.8 107.3,29.8 			"/>
+		</g>
+		<g>
+			<polygon points="109,29.3 109,29.8 109,30.4 109.5,30.4 109.5,29.8 109.5,29.3 109.5,28.7 109,28.7 			"/>
+		</g>
+		<g>
+			<polygon points="121.9,28.2 121.3,28.2 120.8,28.2 120.2,28.2 119.6,28.2 119.1,28.2 119.1,28.7 119.1,29.3 119.6,29.3 
+				120.2,29.3 120.8,29.3 121.3,29.3 121.9,29.3 122.4,29.3 122.4,28.8 122.4,28.2 			"/>
+		</g>
+		<g>
+			<polygon points="103.4,28.7 103.4,28.1 103.4,27.5 103.4,27 103.4,26.4 102.8,26.4 102.2,26.4 102.2,27 102.2,27.5 102.2,28.1 
+				102.2,28.7 102.8,28.7 			"/>
+		</g>
+		<g>
+			<polygon points="112.4,26.5 112.3,27 112.3,27.6 111.8,27.6 111.8,28.2 111.8,28.7 111.2,28.7 111.2,29.3 111.2,29.8 110.7,29.8 
+				110.6,30.4 110.6,31 110.6,31.5 111.2,31.5 111.8,31.5 111.8,31 111.8,30.4 112.3,30.4 112.3,29.8 112.3,29.3 112.9,29.3 
+				112.9,28.7 112.9,28.2 113.5,28.2 113.5,27.6 113.5,27 113.5,26.5 112.9,26.5 			"/>
+		</g>
+		<g>
+			<polygon points="104.5,26.4 104.5,27 104.5,27.6 104.5,28.1 104.5,28.7 104.5,29.2 103.9,29.2 103.9,29.8 103.4,29.8 103.3,30.4 
+				102.8,30.4 102.2,30.3 102.2,30.9 102.2,31.5 102.8,31.5 103.3,31.5 103.9,31.5 103.9,30.9 104.5,30.9 104.5,30.4 105,30.4 
+				105,29.8 105.6,29.8 105.6,29.2 105.6,28.7 105.6,28.1 105.6,27.6 105.6,27 105.6,26.4 105.1,26.4 			"/>
+		</g>
+		<g>
+			<polygon points="100,26.4 99.4,26.4 98.9,26.4 98.3,26.4 97.8,26.4 97.2,26.4 96.6,26.4 96.1,26.4 95.5,26.4 95.5,26.9 
+				95.5,27.5 96.1,27.5 96.6,27.5 97.2,27.5 97.8,27.5 98.3,27.5 98.9,27.5 99.4,27.5 100,27.5 100,28.1 100,28.7 99.4,28.6 
+				99.4,29.2 98.9,29.2 98.9,29.8 98.3,29.8 97.7,29.8 97.7,30.3 97.2,30.3 96.6,30.3 96.1,30.3 95.5,30.3 95.5,30.9 95.5,31.4 
+				96,31.4 96.6,31.4 97.2,31.4 97.7,31.4 98.3,31.5 98.3,30.9 98.9,30.9 99.4,30.9 99.4,30.3 100,30.3 100,29.8 100.5,29.8 
+				100.5,29.2 101.1,29.2 101.1,28.7 101.1,28.1 101.1,27.5 101.1,27 101.1,26.4 100.6,26.4 			"/>
+		</g>
+		<g>
+			<path d="M117.4,25.9h-0.6v0.6v0.6v0.6h0.6h0.6h0.6v-0.6v-0.6v-0.6H118H117.4z M118,27.1h-0.6v-0.6h0.6V27.1z"/>
+		</g>
+	</g>
+	<g id="waves_1_">
+		<g>
+			<polygon points="96.2,19.7 96.2,20.3 96.8,20.3 96.8,19.7 96.8,19.1 96.2,19.1 			"/>
+		</g>
+		<g>
+			<polygon points="94,19.7 94,20.3 94.5,20.3 94.5,19.7 94.5,19.1 94,19.1 			"/>
+		</g>
+		<g>
+			<polygon points="98.5,18 98.5,18.6 98.5,19.2 98.5,19.7 98.5,20.3 99,20.3 99,19.7 99,19.2 99,18.6 99,18 			"/>
+		</g>
+		<g>
+			<polygon points="96.2,18 95.7,18 95.7,18.6 95.7,19.1 96.2,19.1 96.2,18.6 			"/>
+		</g>
+		<g>
+			<rect x="93.43" y="18.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 74.3037 112.5742)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="92.9,18 92.3,18 92.3,18.6 92.9,18.6 93.4,18.6 93.4,18 			"/>
+		</g>
+		<g>
+			<polygon points="98.5,16.9 97.9,16.9 97.9,17.5 97.9,18 98.5,18 98.5,17.5 			"/>
+		</g>
+		<g>
+			<rect x="95.21" y="17.44" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.2823 113.1613)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<rect x="94.49" y="16.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.1711 111.8337)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="97.9,15.8 97.4,15.8 97.4,16.3 97.4,16.9 97.9,16.9 97.9,16.3 			"/>
+		</g>
+		<g>
+			<polygon points="94,16.3 93.4,16.3 93.4,16.9 94,16.9 94.5,16.9 94.5,16.3 			"/>
+		</g>
+		<g>
+			<polygon points="92.9,15.8 92.3,15.8 92.3,16.3 92.9,16.3 93.4,16.3 93.4,15.8 			"/>
+		</g>
+		<g>
+			<rect x="96.88" y="15.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 81.2768 112.5089)" width="0.6" height="0.6"/>
+		</g>
+		<g>
+			<polygon points="96.2,14.7 95.7,14.6 95.7,15.2 96.2,15.2 96.8,15.2 96.8,14.7 			"/>
+		</g>
+		<g>
+			<polygon points="95.1,14.1 94.6,14.1 94.6,14.6 95.1,14.6 95.7,14.6 95.7,14.1 			"/>
+		</g>
+		<g>
+			<polygon points="94,13.5 93.4,13.5 92.9,13.5 92.3,13.5 92.3,14.1 92.9,14.1 93.4,14.1 94,14.1 94.6,14.1 94.6,13.5 			"/>
+		</g>
+	</g>
+	<g class="st3">
+		<path class="st4" d="M93.5,71.9c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
+			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10.1,0v-0.8h0.8v-0.8C94.7,71.9,93.9,71.9,93.5,71.9z"/>
+		<path class="st4" d="M101,68.6v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8
+			c0-0.4,0-1.3,0-1.7h0.8V68.6z"/>
+		<path class="st4" d="M127.8,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
+			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
+			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C127.8,68.8,127.8,67.7,127.8,67.7z M126.1,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
+			c2.2,0,4.5,0,6.7,0V67.7z"/>
+		<path class="st4" d="M114.4,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
+			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H101c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
+			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8L114.4,67.7L114.4,67.7z M112.7,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
+			c2.2,0,4.5,0,6.7,0V67.7z"/>
+		<path class="st4" d="M142.1,66.9v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H128c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0V73h0.8v-0.8c-3.1,0-6.2,0-9.2,0v-0.8h0.8
+			v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8V69c-2.5,0-5.1,0-7.5,0v-0.8h0.8v-0.8C135.9,66.9,139,66.9,142.1,66.9z"/>
+		<path class="st4" d="M85.1,66.9v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H70c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
+			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5.1,0-7.5,0v-0.8H75v-0.8
+			C78.3,66.9,81.7,66.9,85.1,66.9z"/>
+		<path class="st4" d="M156.3,65.2c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H143c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72
+			h0.8v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8v-0.8h-0.8v-0.8H153c0-0.4,0-1.3,0-1.7h0.8
+			v-0.8h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.7L156.3,65.2L156.3,65.2z M153,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
+			c2.2,0,4.5,0,6.7,0V67.7z"/>
+	</g>
+	<g>
+		<path class="st5" d="M93.2,72c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
+			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H84
+			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10,0V73h0.8v-1C94.5,72,93.7,72,93.2,72z"/>
+		<path class="st5" d="M100.8,68.7v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8
+			c0-0.4,0-1.3,0-1.7h0.8V68.7z"/>
+		<path class="st5" d="M127.6,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
+			h-0.8c0,0.4,0,1.3,0,1.7H115c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
+			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8v-1.1H127.6z M125.9,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"
+			/>
+		<path class="st5" d="M114.2,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
+			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
+			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C114.2,68.9,114.2,67.8,114.2,67.8z M112.5,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67
+			c2.2,0,4.5,0,6.7,0V67.8z"/>
+		<path class="st5" d="M141.8,67v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0v-0.8h0.8V72c-3,0-6.2,0-9.2,0v-0.8h0.8
+			v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5,0-7.5,0V68h0.8v-1C135.7,67,138.8,67,141.8,67z"/>
+		<path class="st5" d="M84.9,67v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
+			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H69c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
+			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8V69c-2.5,0-5,0-7.5,0v-0.8h0.8V67
+			C78.2,67,81.6,67,84.9,67z"/>
+		<path class="st5" d="M156.1,65.3c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H142
+			c0,0.4,0,1.3,0,1.7h-1c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72h0.8
+			v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8V72h-0.8v-0.8h-0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
+			h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.6V65.3z M152.7,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"/>
+	</g>
+</g>
+</svg>

BIN
pokemon_trading/docs/images/youtube.png


+ 1 - 0
pokemon_trading/lib/flipper-gblink/.gitsubtree

@@ -0,0 +1 @@
+https://github.com/kbembedded/flipper-gblink main /

+ 22 - 8
pokemon_trading/lib/flipper-gblink/README.md

@@ -1,7 +1,7 @@
 # Flipper Game Boy Game Link Cable API
 Simple API that can be included in projects to provide a flexible and easy way to handle data exchange over a Game Link Cable.
 
-Current Version: 0.5
+Current Version: 0.6
 
 Available from: https://github.com/kbembedded/flipper-gblink
 
@@ -11,15 +11,29 @@ Available from: https://github.com/kbembedded/flipper-gblink
 - [x] Callback on byte transfer completion  
 - [x] Flexibility in IO pin selection at alloc time  
 - [x] Ability to enable and disable interrupt on input clock  
-- [x] Ability to set timeout in microseconds between clock edges. If exceeded, it is assumed the next clock is the first bit of a byte
+- [x] Ability to set timeout in microseconds between clock edges. If exceeded, it is assumed the next clock is the first bit of a byte  
 - [x] Set a NO\_DATA\_BYTE pattern. i.e. after a byte transfer is complete, a default byte is prepared to be sent out if no new data is provided before the transfer starts  
-- [x] Supports communication to GBC
-- [x] Supports communication to GBA using GBC games
-- [ ] Supports communication to GB (untested, but should work)
-- [ ] Supports communication to GBA using GBA games
+- [x] Supports communication to GBC  
+- [x] Supports communication to GBA using GBC games  
+- [x] Supports older MALVEKE pinouts that would previously cause the Okay button to stop functioning after a trade  
+- [ ] Supports communication to GB (untested, but should work)  
+- [ ] Supports communication to GBA using GBA games  
 - [ ] Function as INT clock source. i.e. Flipper Zero drives the clock line  
-- [ ] Drive clock at varying speeds as GBC supports
-- [ ] Proper documentation
+- [ ] Drive clock at varying speeds as GBC supports  
+- [ ] Proper documentation  
 
 ## Use example
 See https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading
+
+To include this in a Flipper Zero application, add this repo as a submodule in the `lib/` directory of the application source. Then add the following to `application.fam`:
+```
+App(
+...
+    fap_private_libs=[
+        Lib(
+            name="flipper-gblink",
+        ),
+    ],
+...
+)
+```

+ 228 - 8
pokemon_trading/lib/flipper-gblink/gblink.c

@@ -3,6 +3,10 @@
 
 #include <furi.h>
 #include <furi_hal.h>
+#include <stm32wbxx_ll_exti.h>
+#include <stm32wbxx_ll_system.h>
+
+#include <stdint.h>
 
 #include "gblink.h"
 
@@ -53,6 +57,12 @@ struct gblink {
 
 	void (*callback)(void* cb_context, uint8_t in);
 	void *cb_context;
+
+	uint32_t* ivt_mirror;
+	uint32_t ivt_mirror_offs;
+	bool exti3_rise_enable;
+	bool exti3_fall_enable;
+	bool exti3_event_enable;
 };
 
 static void gblink_shift_in(struct gblink *gblink)
@@ -98,7 +108,7 @@ static void gblink_shift_out(struct gblink *gblink)
 	gblink->out <<= 1;
 }
 
-static void gblink_clk_callback(void *context)
+static void gblink_clk_isr(void *context)
 {
 	furi_assert(context);
 	struct gblink *gblink = context;
@@ -112,6 +122,189 @@ static void gblink_clk_callback(void *context)
 	}
 }
 
+/* NOTE WELL! This function is absurdly hacky and a stupid workaround to a
+ * stupid issue that doesn't really have any other solution in the current
+ * Flipper/FURI API. I'm over-commenting this so we know exactly what is going
+ * on if we ever have to re-visit this mess.
+ *
+ * This block of text below describes the overall idea, more specific comments
+ * in the function body.
+ *
+ * TODO: make this more generic for any other GPIOs that might conflict with
+ * exti interrupts. PA6, PB3, PC3, PB2? (NFC), PA13, PB6
+ * NOTE: This is only set up at the moment for PB3, hardcoded
+ *
+ * There are multiple problems that this workaround is handling. EXTI interrupts
+ * are shared among multiple pins. The FURI core maintains per-pin ISRs in a
+ * private struct that has no way to read, save, or otherwise be able to put
+ * back the ISR that would service a conflicting EXTI. e.g. PB3 and PH3
+ * (the OK button) both share EXTI3. Setting an interrupt on PB3 will clobber
+ * the FURI ISR callback/context pair as well as change EXTI3 to use PB3 as
+ * the interrupt source.
+ *
+ * To make an interrupt work correctly on PB3 and not break the OK button
+ * we need a way to set an interrupt for PB3 in a way that doesn't clobber the
+ * private FURI GPIO ISR handles and can let the interrupt for the OK button
+ * work again when we're done.
+ *
+ * The general concept of this workaround is to modify the IVT to create our
+ * own handler for EXTI3 interrupts. Doing this leaves the aforementioned private
+ * GPIO struct unmodified and disables the OK button from triggering an interrupt.
+ * The IVT is normally located at the lowest addresses of flash (which is located
+ * at 0x08000000 and mapped at runtime to 0x00000000); this means the IVT cannot
+ * be changed at runtime.
+ *
+ * To make this work, we use the Vector Table Offset Register (VTOR) in the
+ * System Control Block (SCB). The VTOR allows for changing the location of the
+ * IVT. We copy the IVT to a location in memory, and then do a dance to safely
+ * set up the GPIO interrupt to PB3, and swap in our IVT with the modified EXTI3
+ * handler.
+ *
+ * When undoing this, the process is not quite in reverse as we have to put back
+ * specific interrupt settings that we very likely would have clobbered but have
+ * the ability to save beforehand.
+ *
+ * Wrapping the steps in disabling the EXTI3 interrupt is probably not needed,
+ * but is a precaution since we are changing the interrupt sources in weird ways.
+ */
+/* Used to map our callback context in a way the handler can access */
+static void *exti3_cb_context;
+static void gblink_exti3_IRQHandler(void) {
+	if(LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_3)) {
+		gblink_clk_isr(exti3_cb_context);
+		LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_3);
+	}
+}
+
+static void gblink_gross_exti_workaround(struct gblink *gblink)
+{
+	/* This process makes a number of assumptions, including that the IVT
+	 * is located at 0x00000000, that the lowest flash page is mapped to
+	 * that base address, and that the VTOR points to 0x00000000.
+	 * There are runtime protections in place to prevent reading from the
+	 * first 1 MB of addresses. So we have to always assume that the lowest
+	 * page of flash is mapped to 0x00000000 and read the IVT from the that
+	 * page in flash directly.
+	 * The only check we can really do here is ensuring VTOR is 0 and that
+	 * Main memory is mapped to 0x00000000. If either of those are not true,
+	 * then we can't continue.
+	 */
+	furi_check(SCB->VTOR == 0x0);
+	furi_check(LL_SYSCFG_GetRemapMemory() == LL_SYSCFG_REMAP_FLASH);
+
+	/* Create a mirror of the existing IVT from CPU 1
+	 * The IVT on this platform has 79 entries; 63 maskable, 10 non-maskable,
+	 * 6 reserved. The maskable interrupts start at offset 16.
+	 * CMSIS documentation says that the boundary for IVT must be aligned to
+	 * the number of interrupts, rounded up to the nearest power of two, and
+	 * then multiplied by the word width of the CPU. 79 rounds up to 128
+	 * with a word width of 4, this is 512/0x200 bytes.
+	 * As there is no good way with FreeRTOS to request an alloc at an
+	 * aligned boundary, allocate the amount of data we need, plus 0x200
+	 * bytes, to guarantee that we can put the table in a location that is
+	 * properly aligned. Once we find a suitable base address, this offset
+	 * is saved for later.
+	 */
+	gblink->ivt_mirror = malloc((79 * sizeof(uint32_t)) + 0x200);
+	gblink->ivt_mirror_offs = (uint32_t)gblink->ivt_mirror;
+	while (gblink->ivt_mirror_offs & 0x1FF)
+		gblink->ivt_mirror_offs++;
+	/* 0x08000000 is used instead of 0x00000000 because everything complains
+	 * using a NULL pointer.
+	 */
+	memcpy((uint32_t *)gblink->ivt_mirror_offs, ((uint32_t *)0x08000000), 79 * sizeof(uint32_t));
+
+	/* Point our IVT's EXTI3 interrupt to our desired interrupt handler.
+	 * Also copy the gblink struct to the global var that the interrupt
+	 * handler will use to make further calls.
+	 */
+	((uint32_t *)gblink->ivt_mirror_offs)[25] = (uint32_t)gblink_exti3_IRQHandler; // 16 NMI + offset of 9 for EXTI3
+	exti3_cb_context = gblink;
+
+	/* Disable the EXTI3 interrupt. This lets us do bad things without
+	 * fear of an IRQ hitting in the middle.
+	 */
+	LL_EXTI_DisableIT_0_31(LL_EXTI_LINE_3);
+
+	/* Save the existing rise/fall trigger settings. In theory, these should
+	 * really never change through the life of the flipper OS. But for safety
+	 * we always save them rather than just blindly restoring the same settings
+	 * back when we undo this later.
+	 */
+	gblink->exti3_rise_enable = LL_EXTI_IsEnabledRisingTrig_0_31(LL_EXTI_LINE_3);
+	gblink->exti3_fall_enable = LL_EXTI_IsEnabledFallingTrig_0_31(LL_EXTI_LINE_3);
+	gblink->exti3_event_enable = LL_EXTI_IsEnabledEvent_0_31(LL_EXTI_LINE_3);
+
+	/* Now, set up our desired pin settings. This will only clobber exti3
+	 * settings and will not affect the actual interrupt vector address.
+	 * Settings include the rising/falling/event triggers which we just
+	 * saved.
+	 */
+	furi_hal_gpio_init(gblink->clk, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedVeryHigh);
+
+	/* Update the NVIC table to point at our desired table.
+	 * Out of safety, stop the world around changing the VTOR reg.
+	 */
+	FURI_CRITICAL_ENTER();
+	SCB->VTOR = gblink->ivt_mirror_offs;
+	FURI_CRITICAL_EXIT();
+
+	/* Last, enable the interrupts and hope everything works. */
+	LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_3);
+}
+
+static void gblink_gross_exti_workaround_undo(struct gblink *gblink)
+{
+	/* First, disable the EXTI3 interrupt. This lets us do bad things without
+	 * fear of an IRQ hitting in the middle.
+	 */
+	LL_EXTI_DisableIT_0_31(LL_EXTI_LINE_3);
+
+	/* Set the correct input source, PH3/OK button, to EXTI3. It is important
+	 * to do this before calling furi_hal_gpio_init() on PB3. When that func
+	 * is called with no interrupt settings enabled, if the EXTI source
+	 * matches the pin, and the interrupt is enabled, interrupts will be
+	 * disabled. By manually setting the EXTI3 source here, it no longer
+	 * matches the PB3 pin, and our changing of IO settings on our GPIO pin
+	 * to no longer have interrupts will not affect the shared IRQ.
+	 */
+	LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTH, LL_SYSCFG_EXTI_LINE3);
+
+	/* Set the correct rise/fall/event settings back */
+	if (gblink->exti3_rise_enable)
+		LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_3);
+	else
+		LL_EXTI_DisableRisingTrig_0_31(LL_EXTI_LINE_3);
+
+	if (gblink->exti3_fall_enable)
+		LL_EXTI_EnableFallingTrig_0_31(LL_EXTI_LINE_3);
+	else
+		LL_EXTI_DisableFallingTrig_0_31(LL_EXTI_LINE_3);
+
+	if (gblink->exti3_event_enable)
+		LL_EXTI_EnableEvent_0_31(LL_EXTI_LINE_3);
+	else
+		LL_EXTI_DisableEvent_0_31(LL_EXTI_LINE_3);
+
+	/* "Release" the GPIO by putting it back in a known idle state. */
+	furi_hal_gpio_init_simple(gblink->clk, GpioModeAnalog);
+
+	/* Set the IVT back to the normal, in-flash table. Stopping the world
+	 * while we do so.
+	 * NOTE: This just assumes the VTOR is always at 0x0 by default, if this
+	 * ever changes in the Flipper OS, then that will be a problem.
+	 */
+	FURI_CRITICAL_ENTER();
+	SCB->VTOR = 0x0;
+	FURI_CRITICAL_EXIT();
+
+	/* Re-enable the interrupt, OK button should work again. */
+	LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_3);
+
+	/* Free the alloc()ed mirror space */
+	free(gblink->ivt_mirror);
+}
+
 void gblink_clk_source_set(void *handle, int source)
 {
 	furi_assert(handle);
@@ -151,6 +344,9 @@ void gblink_transfer(void *handle, uint8_t val)
 	 * out_buf and set out_buf_valid. When the ISR is finished writing the
 	 * next byte it will check out_buf_valid and copy in out_buf.
 	 *
+	 * The correct/smart way of doing this would be a mutex rather than
+	 * stopping the world.
+	 *
 	 * Realistically, this should only ever be called from the transfer
 	 * complete callback. There are few situations outside of that which
 	 * would make sense.
@@ -216,18 +412,35 @@ void *gblink_alloc(struct gblink_def *gblink_def)
 	gblink->cb_context = gblink_def->cb_context;
 
 	/* Set up pins */
-	/* Currently assumes external clock source only */
+	/* TODO: Set up a list of pins that are not safe to use with interrupts.
+	 * I do believe the main FURI GPIO struct has this data baked in so that
+	 * could be used. For now though, we're only checking for the MALVEKE
+	 * pinout which uses a clk pin that has its IRQ shared with the Okay
+	 * button.
+	 * See the work done in pokemon trade tool custom pinout selection for
+	 * an idea of how to check all that.
+	 */
+	/* TODO: Currently assumes external clock source only */
 	/* XXX: This might actually be open-drain on real GB hardware */
 	furi_hal_gpio_write(gblink->serout, false);
 	furi_hal_gpio_init(gblink->serout, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
 	furi_hal_gpio_write(gblink->serin, false);
 	furi_hal_gpio_init(gblink->serin, GpioModeInput, GpioPullUp, GpioSpeedVeryHigh);
-	furi_hal_gpio_init(gblink->clk, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedVeryHigh);
 
 	/* Set up interrupt on clock */
-	/* This may not be needed after NFC refactor */
-	furi_hal_gpio_remove_int_callback(gblink->clk);
-	furi_hal_gpio_add_int_callback(gblink->clk, gblink_clk_callback, gblink);
+	if (gblink->clk == &gpio_ext_pb3) {
+		/* The clock pin is on a pin that is not safe to set an interrupt
+		 * on, so we do a gross workaround to get an interrupt enabled
+		 * on that pin in a way that can be undone safely later with
+		 * no impact to the shared IRQ.
+		 */
+		gblink_gross_exti_workaround(gblink);
+	} else {
+		furi_hal_gpio_init(gblink->clk, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedVeryHigh);
+		/* This may not be needed after NFC refactor */
+		furi_hal_gpio_remove_int_callback(gblink->clk);
+		furi_hal_gpio_add_int_callback(gblink->clk, gblink_clk_isr, gblink);
+	}
 
 	return gblink;
 }
@@ -237,8 +450,15 @@ void gblink_free(void *handle)
 	furi_assert(handle);
 	struct gblink *gblink = handle;
 
-	/* Remove interrupt, set IO to sane state */
-	furi_hal_gpio_remove_int_callback(gblink->clk);
+	if (gblink->clk == &gpio_ext_pb3) {
+		/* This handles switching the IVT back and putting the EXTI
+		 * regs and pin regs in a valid state for normal use.
+		 */
+		gblink_gross_exti_workaround_undo(gblink);
+	} else {
+		/* Remove interrupt, set IO to sane state */
+		furi_hal_gpio_remove_int_callback(gblink->clk);
+	}
 	furi_hal_gpio_init_simple(gblink->serin, GpioModeAnalog);
 	furi_hal_gpio_init_simple(gblink->serout, GpioModeAnalog);
 	furi_hal_gpio_init_simple(gblink->clk, GpioModeAnalog);

+ 12 - 0
pokemon_trading/lib/flipper-gblink/gblink.h

@@ -6,6 +6,14 @@
 
 #pragma once
 
+#include <furi.h>
+#include <furi_hal.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 typedef enum {
 	/* Flipper drives the clock line */
 	/* Unsupported at this time */
@@ -71,4 +79,8 @@ void *gblink_alloc(struct gblink_def *gblink_def);
 
 void gblink_free(void *handle);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif // __GBLINK_H__

+ 1 - 1
pokemon_trading/pokemon_app.c

@@ -1934,7 +1934,7 @@ void pokemon_trade_block_set_default_name(char* dest, PokemonFap* pokemon_fap, s
 
 #define UINT32_TO_EXP(input, output_array)                     \
     do {                                                       \
-        (output_array)[2] = (uint8_t)((input)&0xFF);           \
+        (output_array)[2] = (uint8_t)((input) & 0xFF);         \
         (output_array)[1] = (uint8_t)(((input) >> 8) & 0xFF);  \
         (output_array)[0] = (uint8_t)(((input) >> 16) & 0xFF); \
     } while(0)

Некоторые файлы не были показаны из-за большого количества измененных файлов