From 9441aa63cb45853847d93dc3a131f8ea96ebb208 Mon Sep 17 00:00:00 2001 From: veclav talica Date: Fri, 24 Nov 2023 04:02:18 +0500 Subject: [PATCH] simple composable grid context and grid controller, fiend sprite, godotxel addon --- .gitattributes | 1 + .import/.gdignore | 1 + ...e.png-dd250909fee7964ffc38f7e4fcfe9c07.md5 | 3 + ....png-dd250909fee7964ffc38f7e4fcfe9c07.stex | Bin 0 -> 126 bytes ...d.png-ae1a4d835af51e8a293b71d6a241b71c.md5 | 3 + ....png-ae1a4d835af51e8a293b71d6a241b71c.stex | Bin 0 -> 140 bytes ...e.png-9182ec8ac804af16d356bf911782e299.md5 | 3 + ....png-9182ec8ac804af16d356bf911782e299.stex | Bin 0 -> 98 bytes ...d.png-e51d5f3c1628c510a225057f3ed60d5a.md5 | 3 + ....png-e51d5f3c1628c510a225057f3ed60d5a.stex | Bin 0 -> 112 bytes ...t.png-2b2d0ae4889c1fbc5c7bee7ae5515663.md5 | 3 + ....png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex | Bin 0 -> 82 bytes ...d.png-b09066b673d6082ce887a03a19f17977.md5 | 3 + ....png-b09066b673d6082ce887a03a19f17977.stex | Bin 0 -> 86 bytes ...e.png-022220d888fe2fe2f8a081bcca62b4b2.md5 | 3 + ....png-022220d888fe2fe2f8a081bcca62b4b2.stex | Bin 0 -> 92 bytes ...d.png-104e29757699756f1b44bd32a622df2c.md5 | 3 + ....png-104e29757699756f1b44bd32a622df2c.stex | Bin 0 -> 102 bytes ...l.png-56f84f9044d8bd8d0a4f3430dba126f6.md5 | 3 + ....png-56f84f9044d8bd8d0a4f3430dba126f6.stex | Bin 0 -> 19148 bytes ...w.png-e30103581d3fc0ed2a2c92cdf72b5c70.md5 | 3 + ....png-e30103581d3fc0ed2a2c92cdf72b5c70.stex | Bin 0 -> 25216 bytes ...s.png-bd1a4956e0778c5ddf36cdc3bb058831.md5 | 3 + ....png-bd1a4956e0778c5ddf36cdc3bb058831.stex | Bin 0 -> 10028 bytes ...n.png-9edbf9aa07338136f99ac434cbed09e5.md5 | 3 + ....png-9edbf9aa07338136f99ac434cbed09e5.stex | Bin 0 -> 88 bytes ...p.png-8957357689f69c848f5f33d20a50a416.md5 | 3 + ....png-8957357689f69c848f5f33d20a50a416.stex | Bin 0 -> 88 bytes ...n.png-d2bd93428c0bc172a28a43c55aac576e.md5 | 3 + ....png-d2bd93428c0bc172a28a43c55aac576e.stex | Bin 0 -> 78 bytes ...p.png-2598e148d1b795a628ce80a4fd5cf401.md5 | 3 + ....png-2598e148d1b795a628ce80a4fd5cf401.stex | Bin 0 -> 78 bytes ...d.png-46f0c65314f5bbca8d0599edf0d36a2b.md5 | 3 + ....png-46f0c65314f5bbca8d0599edf0d36a2b.stex | Bin 0 -> 140 bytes ...t.png-43fb83f678511237490ee7f96939d8cd.md5 | 3 + ....png-43fb83f678511237490ee7f96939d8cd.stex | Bin 0 -> 29434 bytes ...d.png-e3d637acacdb891e09f422df261dbd1e.md5 | 3 + ....png-e3d637acacdb891e09f422df261dbd1e.stex | Bin 0 -> 84 bytes ...n.png-487276ed1e3a0c39cad0279d744ee560.md5 | 3 + ....png-487276ed1e3a0c39cad0279d744ee560.stex | Bin 0 -> 1496 bytes ...r.png-076954b389746de9e13c853ed5d9ba59.md5 | 3 + ....png-076954b389746de9e13c853ed5d9ba59.stex | Bin 0 -> 150 bytes ...1.png-4848d5f2cd0f48c68b880712b6b38776.md5 | 3 + ....png-4848d5f2cd0f48c68b880712b6b38776.stex | Bin 0 -> 150 bytes ...a.png-adac81df344972ef82e2499656aa288e.md5 | 3 + ....png-adac81df344972ef82e2499656aa288e.stex | Bin 0 -> 278 bytes ...s.png-5232a113bb226997ae55212b2aa90bd4.md5 | 3 + ....png-5232a113bb226997ae55212b2aa90bd4.stex | Bin 0 -> 204 bytes ...r.png-ae7c97a04fb889522c7c466fdc9dd8f6.md5 | 3 + ....png-ae7c97a04fb889522c7c466fdc9dd8f6.stex | Bin 0 -> 148 bytes addons/Godoxel/Animation.gd | 24 + addons/Godoxel/BrushPrefabs.gd | 106 ++ addons/Godoxel/Canvas.gd | 517 ++++++ addons/Godoxel/CanvasOutline.gd | 31 + addons/Godoxel/Colors.gd | 34 + addons/Godoxel/DebugTextDisplay.gd | 9 + addons/Godoxel/Editor.gd | 1577 +++++++++++++++++ addons/Godoxel/Editor.tscn | 1309 ++++++++++++++ addons/Godoxel/Frame.gd | 107 ++ addons/Godoxel/LICENSE | 22 + addons/Godoxel/Layer.gd | 107 ++ addons/Godoxel/LayerButton.tscn | 108 ++ addons/Godoxel/MenuButtonExtended.gd | 13 + addons/Godoxel/Navbar.gd | 139 ++ addons/Godoxel/PaintCanvas.gd | 500 ++++++ addons/Godoxel/PaintCanvas.tscn | 29 + addons/Godoxel/PaintCanvasChunk.gd | 27 + addons/Godoxel/PaintCanvasChunk.tscn | 13 + addons/Godoxel/PaintCanvasContainer.gd | 2 + addons/Godoxel/PreviewWindow.gd | 14 + addons/Godoxel/SaveFileDialog.gd | 129 ++ addons/Godoxel/SelectionBox.gd | 24 + addons/Godoxel/Settings.gd | 24 + addons/Godoxel/Settings.tscn | 64 + addons/Godoxel/TextInfo.gd | 39 + addons/Godoxel/Util.gd | 94 + addons/Godoxel/ViewportContainer.gd | 6 + addons/Godoxel/VisualGrid.gd | 41 + addons/Godoxel/VisualGrid.tscn | 9 + addons/Godoxel/actions/Action.gd | 123 ++ addons/Godoxel/actions/Brighten.gd | 53 + addons/Godoxel/actions/Brush.gd | 47 + addons/Godoxel/actions/Bucket.gd | 49 + addons/Godoxel/actions/Cut.gd | 82 + addons/Godoxel/actions/Darken.gd | 55 + addons/Godoxel/actions/Line.gd | 59 + addons/Godoxel/actions/MultiLine.gd | 44 + addons/Godoxel/actions/PasteCut.gd | 59 + addons/Godoxel/actions/Pencil.gd | 43 + addons/Godoxel/actions/Rainbow.gd | 58 + addons/Godoxel/actions/Rect.gd | 69 + addons/Godoxel/assets/BrushCircle.png | 3 + addons/Godoxel/assets/BrushCircle.png.import | 35 + addons/Godoxel/assets/BrushCircle_Hovered.png | 3 + .../assets/BrushCircle_Hovered.png.import | 35 + addons/Godoxel/assets/BrushHLine.png | 3 + addons/Godoxel/assets/BrushHLine.png.import | 35 + addons/Godoxel/assets/BrushHLine_Hovered.png | 3 + .../assets/BrushHLine_Hovered.png.import | 35 + addons/Godoxel/assets/BrushRect.png | 3 + addons/Godoxel/assets/BrushRect.png.import | 35 + addons/Godoxel/assets/BrushRect_Hovered.png | 3 + .../assets/BrushRect_Hovered.png.import | 35 + addons/Godoxel/assets/BrushVLine.png | 3 + addons/Godoxel/assets/BrushVLine.png.import | 35 + addons/Godoxel/assets/BrushVLine_Hovered.png | 3 + .../assets/BrushVLine_Hovered.png.import | 35 + addons/Godoxel/assets/Godoxel_Anim_Panel.png | 3 + .../assets/Godoxel_Anim_Panel.png.import | 35 + addons/Godoxel/assets/Godoxel_Preview.png | 3 + .../Godoxel/assets/Godoxel_Preview.png.import | 35 + addons/Godoxel/assets/Godoxel_Shortcuts.png | 3 + .../assets/Godoxel_Shortcuts.png.import | 35 + .../Godoxel/assets/animation_arrow_down.png | 3 + .../assets/animation_arrow_down.png.import | 35 + addons/Godoxel/assets/animation_arrow_up.png | 3 + .../assets/animation_arrow_up.png.import | 35 + addons/Godoxel/assets/arrow_down.png | 3 + addons/Godoxel/assets/arrow_down.png.import | 35 + addons/Godoxel/assets/arrow_up.png | 3 + addons/Godoxel/assets/arrow_up.png.import | 35 + .../COPYRIGHT.TXT | 124 ++ .../bitstream_vera_sans_font_6016/README.TXT | 11 + .../RELEASENOTES.TXT | 162 ++ .../bitstream_vera_sans_font_6016/Vera.ttf | Bin 0 -> 65932 bytes .../bitstream_vera_sans_font_6016/VeraBI.ttf | Bin 0 -> 63208 bytes .../bitstream_vera_sans_font_6016/VeraBd.ttf | Bin 0 -> 58716 bytes .../bitstream_vera_sans_font_6016/VeraIt.ttf | Bin 0 -> 63684 bytes .../all-free-download.com.url | 8 + addons/Godoxel/assets/godoxel_screenshot.png | 3 + .../assets/godoxel_screenshot.png.import | 35 + addons/Godoxel/assets/grid.png | 3 + addons/Godoxel/assets/grid.png.import | 35 + addons/Godoxel/assets/lock_layer.png | 3 + addons/Godoxel/assets/lock_layer.png.import | 35 + addons/Godoxel/assets/lock_layer_1.png | 3 + addons/Godoxel/assets/lock_layer_1.png.import | 35 + addons/Godoxel/assets/minidotta.png | 3 + addons/Godoxel/assets/minidotta.png.import | 35 + addons/Godoxel/assets/minidotta_invis.png | 3 + .../Godoxel/assets/minidotta_invis.png.import | 35 + addons/Godoxel/assets/unlock_layer.png | 3 + addons/Godoxel/assets/unlock_layer.png.import | 35 + addons/Godoxel/components/AnimationButton.gd | 73 + .../Godoxel/components/AnimationButton.tscn | 64 + addons/Godoxel/components/AnimationPanel.gd | 157 ++ addons/Godoxel/components/AnimationPanel.tscn | 109 ++ addons/Godoxel/components/AnimationStripe.gd | 141 ++ .../Godoxel/components/AnimationStripe.tscn | 132 ++ addons/Godoxel/components/FrameButton.gd | 55 + addons/Godoxel/components/FrameButton.tscn | 50 + addons/Godoxel/components/ShortcutPanel.gd | 29 + addons/Godoxel/components/ShortcutPanel.tscn | 39 + addons/Godoxel/components/ShortcutWindow.gd | 59 + addons/Godoxel/components/ShortcutWindow.tscn | 114 ++ addons/Godoxel/dialogs/ChangeCanvasDialog.gd | 29 + .../Godoxel/dialogs/ChangeGridSizeDialog.gd | 28 + addons/Godoxel/dialogs/ConfirmationDialog.gd | 20 + addons/Godoxel/dialogs/DraggableWindow.gd | 128 ++ addons/Godoxel/dialogs/DraggableWindow.tscn | 172 ++ addons/Godoxel/dialogs/LoadFileDialog.gd | 112 ++ addons/Godoxel/dialogs/LoadFileDialog.tscn | 22 + addons/Godoxel/plugin.cfg | 7 + addons/Godoxel/plugin.gd | 37 + .../AnimationStripe_Panel_draggable.tres | 4 + .../AnimationStripe_Panel_dragging.tres | 4 + .../themes/AnimationStripe_Panel_normal.tres | 4 + .../themes/ShortcutPanel_deselected.tres | 13 + .../themes/ShortcutPanel_selected.tres | 9 + art/entities/fiend.png | 3 + art/entities/fiend.png.import | 35 + nodes/FittingSprite.gd | 14 + nodes/GridContext.gd | 13 + nodes/GridContext.tscn | 6 + nodes/GridController.gd | 26 + nodes/GridController.tscn | 6 + nodes/singletons/Arithmetic.gd | 8 + nodes/singletons/InputUtils.gd | 13 + project.godot | 210 +++ scenes/Game.tscn | 21 + 180 files changed, 9040 insertions(+) create mode 100644 .gitattributes create mode 100644 .import/.gdignore create mode 100644 .import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.md5 create mode 100644 .import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex create mode 100644 .import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.md5 create mode 100644 .import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex create mode 100644 .import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.md5 create mode 100644 .import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex create mode 100644 .import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.md5 create mode 100644 .import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex create mode 100644 .import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.md5 create mode 100644 .import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex create mode 100644 .import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.md5 create mode 100644 .import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex create mode 100644 .import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.md5 create mode 100644 .import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex create mode 100644 .import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.md5 create mode 100644 .import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex create mode 100644 .import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.md5 create mode 100644 .import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.stex create mode 100644 .import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.md5 create mode 100644 .import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex create mode 100644 .import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.md5 create mode 100644 .import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.stex create mode 100644 .import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.md5 create mode 100644 .import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.stex create mode 100644 .import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.md5 create mode 100644 .import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.stex create mode 100644 .import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.md5 create mode 100644 .import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex create mode 100644 .import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.md5 create mode 100644 .import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex create mode 100644 .import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.md5 create mode 100644 .import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.stex create mode 100644 .import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.md5 create mode 100644 .import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.stex create mode 100644 .import/grid.png-e3d637acacdb891e09f422df261dbd1e.md5 create mode 100644 .import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex create mode 100644 .import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 create mode 100644 .import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex create mode 100644 .import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.md5 create mode 100644 .import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex create mode 100644 .import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.md5 create mode 100644 .import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex create mode 100644 .import/minidotta.png-adac81df344972ef82e2499656aa288e.md5 create mode 100644 .import/minidotta.png-adac81df344972ef82e2499656aa288e.stex create mode 100644 .import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.md5 create mode 100644 .import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex create mode 100644 .import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.md5 create mode 100644 .import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex create mode 100644 addons/Godoxel/Animation.gd create mode 100644 addons/Godoxel/BrushPrefabs.gd create mode 100644 addons/Godoxel/Canvas.gd create mode 100644 addons/Godoxel/CanvasOutline.gd create mode 100644 addons/Godoxel/Colors.gd create mode 100644 addons/Godoxel/DebugTextDisplay.gd create mode 100644 addons/Godoxel/Editor.gd create mode 100644 addons/Godoxel/Editor.tscn create mode 100644 addons/Godoxel/Frame.gd create mode 100644 addons/Godoxel/LICENSE create mode 100644 addons/Godoxel/Layer.gd create mode 100644 addons/Godoxel/LayerButton.tscn create mode 100644 addons/Godoxel/MenuButtonExtended.gd create mode 100644 addons/Godoxel/Navbar.gd create mode 100644 addons/Godoxel/PaintCanvas.gd create mode 100644 addons/Godoxel/PaintCanvas.tscn create mode 100644 addons/Godoxel/PaintCanvasChunk.gd create mode 100644 addons/Godoxel/PaintCanvasChunk.tscn create mode 100644 addons/Godoxel/PaintCanvasContainer.gd create mode 100644 addons/Godoxel/PreviewWindow.gd create mode 100644 addons/Godoxel/SaveFileDialog.gd create mode 100644 addons/Godoxel/SelectionBox.gd create mode 100644 addons/Godoxel/Settings.gd create mode 100644 addons/Godoxel/Settings.tscn create mode 100644 addons/Godoxel/TextInfo.gd create mode 100644 addons/Godoxel/Util.gd create mode 100644 addons/Godoxel/ViewportContainer.gd create mode 100644 addons/Godoxel/VisualGrid.gd create mode 100644 addons/Godoxel/VisualGrid.tscn create mode 100644 addons/Godoxel/actions/Action.gd create mode 100644 addons/Godoxel/actions/Brighten.gd create mode 100644 addons/Godoxel/actions/Brush.gd create mode 100644 addons/Godoxel/actions/Bucket.gd create mode 100644 addons/Godoxel/actions/Cut.gd create mode 100644 addons/Godoxel/actions/Darken.gd create mode 100644 addons/Godoxel/actions/Line.gd create mode 100644 addons/Godoxel/actions/MultiLine.gd create mode 100644 addons/Godoxel/actions/PasteCut.gd create mode 100644 addons/Godoxel/actions/Pencil.gd create mode 100644 addons/Godoxel/actions/Rainbow.gd create mode 100644 addons/Godoxel/actions/Rect.gd create mode 100644 addons/Godoxel/assets/BrushCircle.png create mode 100644 addons/Godoxel/assets/BrushCircle.png.import create mode 100644 addons/Godoxel/assets/BrushCircle_Hovered.png create mode 100644 addons/Godoxel/assets/BrushCircle_Hovered.png.import create mode 100644 addons/Godoxel/assets/BrushHLine.png create mode 100644 addons/Godoxel/assets/BrushHLine.png.import create mode 100644 addons/Godoxel/assets/BrushHLine_Hovered.png create mode 100644 addons/Godoxel/assets/BrushHLine_Hovered.png.import create mode 100644 addons/Godoxel/assets/BrushRect.png create mode 100644 addons/Godoxel/assets/BrushRect.png.import create mode 100644 addons/Godoxel/assets/BrushRect_Hovered.png create mode 100644 addons/Godoxel/assets/BrushRect_Hovered.png.import create mode 100644 addons/Godoxel/assets/BrushVLine.png create mode 100644 addons/Godoxel/assets/BrushVLine.png.import create mode 100644 addons/Godoxel/assets/BrushVLine_Hovered.png create mode 100644 addons/Godoxel/assets/BrushVLine_Hovered.png.import create mode 100644 addons/Godoxel/assets/Godoxel_Anim_Panel.png create mode 100644 addons/Godoxel/assets/Godoxel_Anim_Panel.png.import create mode 100644 addons/Godoxel/assets/Godoxel_Preview.png create mode 100644 addons/Godoxel/assets/Godoxel_Preview.png.import create mode 100644 addons/Godoxel/assets/Godoxel_Shortcuts.png create mode 100644 addons/Godoxel/assets/Godoxel_Shortcuts.png.import create mode 100644 addons/Godoxel/assets/animation_arrow_down.png create mode 100644 addons/Godoxel/assets/animation_arrow_down.png.import create mode 100644 addons/Godoxel/assets/animation_arrow_up.png create mode 100644 addons/Godoxel/assets/animation_arrow_up.png.import create mode 100644 addons/Godoxel/assets/arrow_down.png create mode 100644 addons/Godoxel/assets/arrow_down.png.import create mode 100644 addons/Godoxel/assets/arrow_up.png create mode 100644 addons/Godoxel/assets/arrow_up.png.import create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBI.ttf create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraIt.ttf create mode 100644 addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url create mode 100644 addons/Godoxel/assets/godoxel_screenshot.png create mode 100644 addons/Godoxel/assets/godoxel_screenshot.png.import create mode 100644 addons/Godoxel/assets/grid.png create mode 100644 addons/Godoxel/assets/grid.png.import create mode 100644 addons/Godoxel/assets/lock_layer.png create mode 100644 addons/Godoxel/assets/lock_layer.png.import create mode 100644 addons/Godoxel/assets/lock_layer_1.png create mode 100644 addons/Godoxel/assets/lock_layer_1.png.import create mode 100644 addons/Godoxel/assets/minidotta.png create mode 100644 addons/Godoxel/assets/minidotta.png.import create mode 100644 addons/Godoxel/assets/minidotta_invis.png create mode 100644 addons/Godoxel/assets/minidotta_invis.png.import create mode 100644 addons/Godoxel/assets/unlock_layer.png create mode 100644 addons/Godoxel/assets/unlock_layer.png.import create mode 100644 addons/Godoxel/components/AnimationButton.gd create mode 100644 addons/Godoxel/components/AnimationButton.tscn create mode 100644 addons/Godoxel/components/AnimationPanel.gd create mode 100644 addons/Godoxel/components/AnimationPanel.tscn create mode 100644 addons/Godoxel/components/AnimationStripe.gd create mode 100644 addons/Godoxel/components/AnimationStripe.tscn create mode 100644 addons/Godoxel/components/FrameButton.gd create mode 100644 addons/Godoxel/components/FrameButton.tscn create mode 100644 addons/Godoxel/components/ShortcutPanel.gd create mode 100644 addons/Godoxel/components/ShortcutPanel.tscn create mode 100644 addons/Godoxel/components/ShortcutWindow.gd create mode 100644 addons/Godoxel/components/ShortcutWindow.tscn create mode 100644 addons/Godoxel/dialogs/ChangeCanvasDialog.gd create mode 100644 addons/Godoxel/dialogs/ChangeGridSizeDialog.gd create mode 100644 addons/Godoxel/dialogs/ConfirmationDialog.gd create mode 100644 addons/Godoxel/dialogs/DraggableWindow.gd create mode 100644 addons/Godoxel/dialogs/DraggableWindow.tscn create mode 100644 addons/Godoxel/dialogs/LoadFileDialog.gd create mode 100644 addons/Godoxel/dialogs/LoadFileDialog.tscn create mode 100644 addons/Godoxel/plugin.cfg create mode 100644 addons/Godoxel/plugin.gd create mode 100644 addons/Godoxel/themes/AnimationStripe_Panel_draggable.tres create mode 100644 addons/Godoxel/themes/AnimationStripe_Panel_dragging.tres create mode 100644 addons/Godoxel/themes/AnimationStripe_Panel_normal.tres create mode 100644 addons/Godoxel/themes/ShortcutPanel_deselected.tres create mode 100644 addons/Godoxel/themes/ShortcutPanel_selected.tres create mode 100644 art/entities/fiend.png create mode 100644 art/entities/fiend.png.import create mode 100644 nodes/FittingSprite.gd create mode 100644 nodes/GridContext.gd create mode 100644 nodes/GridContext.tscn create mode 100644 nodes/GridController.gd create mode 100644 nodes/GridController.tscn create mode 100644 nodes/singletons/Arithmetic.gd create mode 100644 nodes/singletons/InputUtils.gd create mode 100644 project.godot create mode 100644 scenes/Game.tscn diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..24a8e87 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/.import/.gdignore b/.import/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.import/.gdignore @@ -0,0 +1 @@ + diff --git a/.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.md5 b/.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.md5 new file mode 100644 index 0000000..2b626cc --- /dev/null +++ b/.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.md5 @@ -0,0 +1,3 @@ +source_md5="02600b8740456771affee06983e57ba2" +dest_md5="da049aced7d51eead426dccecd83e17d" + diff --git a/.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex b/.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex new file mode 100644 index 0000000000000000000000000000000000000000..53da3079b849911867b1e57e5059675c32d4f61c GIT binary patch literal 126 zcmZ>F2@a8DU|;}Y79eI|P+(^Sl1V@u?&=f}R;Yy#p2|3BOR zXKGUV@6LUIpGV3w=!(10x$|BXH@@jV`zh-3rJhOa_^HyUh6{{KxK>Qt?09EZ`04+T T3?3-GXIRLrz^b)8U6cU;Kz=7X literal 0 HcmV?d00001 diff --git a/.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.md5 b/.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.md5 new file mode 100644 index 0000000..637228e --- /dev/null +++ b/.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.md5 @@ -0,0 +1,3 @@ +source_md5="fdff01762759c532cf06f6c399898003" +dest_md5="fe9b15be81847e11ef7929564db675ca" + diff --git a/.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex b/.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex new file mode 100644 index 0000000000000000000000000000000000000000..4170c7995d88e80f96dbfd81c929bc8d4e70c562 GIT binary patch literal 140 zcmZ>F2@a8DU|;}Y79eI|P+(^Sk_A8R;Yy#p60v?lY z%V+X7I!wCr&x4y~(vxrQRsSA`I~sJToIJVSy-kJDUcd3f;>l|i7X81-7+}FV%XZ-_ ipA0R>t@h_vZa-c6cmJw$4==sr2u)}5^F2@a8DU|;}Y79eI|P+(^Sl5Rj8?&=f}R;Yy#p2|3BOR pXKGUV@6LUIpX1iHvnG7W-zJ${mUDFZug-AeTuA(+JK?bj)&O>58U6qO literal 0 HcmV?d00001 diff --git a/.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.md5 b/.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.md5 new file mode 100644 index 0000000..507efa1 --- /dev/null +++ b/.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.md5 @@ -0,0 +1,3 @@ +source_md5="c767c1f5f8db79fd5b9edf9508fc4d1b" +dest_md5="14567b18c33c4cd5dee7d4b11f07b7f2" + diff --git a/.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex b/.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex new file mode 100644 index 0000000000000000000000000000000000000000..70747dda90e0d722c8b62eecfe813f4662268930 GIT binary patch literal 112 zcmZ>F2@a8DU|;}Y79eI|P+(^Sk|97G?&=f}R;Yy#p60v?xc z%V+R5I!wCv&w-m|(wA@SRsSA`J8GmTbKYu>=``N`bkBT+MgN5x`h9XWRZhkm-aX_F E0RDdF2@a8DU|;}Y79eI|P+(^Sl4d|0?&=f}R;Yy$iOf}iD` Yd>NQ}o^`E1t?uCRU!5WN=|Wxx0NTV57ytkO literal 0 HcmV?d00001 diff --git a/.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.md5 b/.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.md5 new file mode 100644 index 0000000..d6b4e56 --- /dev/null +++ b/.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.md5 @@ -0,0 +1,3 @@ +source_md5="b2f8bc01566c3fa839501355155541c6" +dest_md5="d10f6c9b72dba11f0356fa63b0efbddd" + diff --git a/.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex b/.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex new file mode 100644 index 0000000000000000000000000000000000000000..466cd12be72d0c7b2cca4744161d64c81dfa5207 GIT binary patch literal 86 zcmZ>F2@a8DU|;}Y79eI|P+(^Sl2$+*?&=f}R;Yy$iS0nDZW cpXJ*Fgc}$Z?|k(76Q{t%|C|RxDl?cF04~H5yZ`_I literal 0 HcmV?d00001 diff --git a/.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.md5 b/.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.md5 new file mode 100644 index 0000000..5d602f3 --- /dev/null +++ b/.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.md5 @@ -0,0 +1,3 @@ +source_md5="3e197fa301ef03f312365bd01429d08b" +dest_md5="0913df5f9c2a29dd74c7b88f6a7f37e3" + diff --git a/.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex b/.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex new file mode 100644 index 0000000000000000000000000000000000000000..87527dbd39027b591da3094ab1494fcd427926fc GIT binary patch literal 92 zcmZ>F2@a8DU|;}Y79eI|P+(^Sk`6!|?&=f}R;Yy#p2|3BOR kXKGUV@6LUIKke4GkEb@uEN{Fkd-1=;jX7oe4zn=;004s-i~s-t literal 0 HcmV?d00001 diff --git a/.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.md5 b/.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.md5 new file mode 100644 index 0000000..9080744 --- /dev/null +++ b/.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.md5 @@ -0,0 +1,3 @@ +source_md5="9d4fb491eb4bf3869fca7d038c928759" +dest_md5="9ebfff15dc061a68c6bf82d1cb83e6af" + diff --git a/.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex b/.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex new file mode 100644 index 0000000000000000000000000000000000000000..e2221912f405ec2ee839680892808fc4485edb9f GIT binary patch literal 102 zcmZ>F2@a8DU|;}Y79eI|P+(^Sl3qX@?&=f}R;Yy#p60v<_s t?x*rLItV@fr^n4QN#c8X<-f<_jx#cEFJpb#sB`14;NN}+;oG(CYyioc92Ecn literal 0 HcmV?d00001 diff --git a/.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.md5 b/.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.md5 new file mode 100644 index 0000000..6d6f224 --- /dev/null +++ b/.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.md5 @@ -0,0 +1,3 @@ +source_md5="e1db1064c72265a01a992e8d77615cd0" +dest_md5="8de5f0178bb0f6b0773e245a52d2df9a" + diff --git a/.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.stex b/.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.stex new file mode 100644 index 0000000000000000000000000000000000000000..a90632c5fd3c40575035fbe13d8833e13e8ebc08 GIT binary patch literal 19148 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 H*?!&M3L`+D literal 0 HcmV?d00001 diff --git a/.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.md5 b/.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.md5 new file mode 100644 index 0000000..e0726f8 --- /dev/null +++ b/.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.md5 @@ -0,0 +1,3 @@ +source_md5="5a6b6ab9dca02fb1f80c7468b43a982c" +dest_md5="e5448547844aef6e50771770909354c4" + diff --git a/.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex b/.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex new file mode 100644 index 0000000000000000000000000000000000000000..06c29c99b6e47a3a20d0c2736c9a91c11765513f GIT binary patch literal 25216 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 literal 0 HcmV?d00001 diff --git a/.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.md5 b/.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.md5 new file mode 100644 index 0000000..ba23d3b --- /dev/null +++ b/.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.md5 @@ -0,0 +1,3 @@ +source_md5="8a10fc33b613b33b4d51afda12ea1d74" +dest_md5="22b5b124b8176533aa5cd11928ff8e1a" + diff --git a/.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.stex b/.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.stex new file mode 100644 index 0000000000000000000000000000000000000000..90e44ed9f7c268fe5c24bb5713798453ec62d0e8 GIT binary patch literal 10028 zcmX}S1yCE`7xx{!xCM9D;t(8ymEZ-6w@7Jlx8h#B4Nh=(3Y6mB0!4xqDGtTm0;NI9 z!|(sT&$BZ-b7uC;**m*;_kOs0Nzh0Cg8t=8RsbkkZ=J2#;Qts`VciW z%>O?&(v#G>;RFB#=lU%GJKXlm9~{0FTzk`~3}9|EVHLf#UJhf{QjuB4CMhMggVd(7 zG@CB34U98wQlLK{JA?<%;M265H^J7(sf-TfUMkIJ_vg`AcnG~!riH!vyWMtkS| zJ4Bn9u8&{9e6Qr!sRlsIVeQGu(m#U+&7XnLsD|GCi)bq7#+G)w1&EN6{WJYG~A z^w5M`=OFSe8Bxq(Iq}zq=8qW8F%0uYO{#8MkL2vAhn{t}5QTSV?qrY@=2tDD{y4hd zn?BhoIMYG!L>s0;-AZRSNTg1BF+nMqkT_Bf(hjgGmRvL9AG7$Ua_DX^{1N&u2XzL< z7+N`KqWL5YGWc@yMW&FKWO=*OGtl|5{j^IJ zSjVas8S#6UPqnC+&ehU*3TeDrEObn3e_+1}buAnPE>8tu7?!294s`JZi#Lx3DeMOs z?`XIZv)b`eI_Z)bf0^Z944n2eY{~L-;? z6-{J1D_Dhu4P=?4g=gE%e7&iNXgsZ|Qrx>Ms#0`OCV7?k`3vF6VZP;|<;#4<&Rn(@ z#J4@|p-jSwbyT~hKPvu8-i&MM`pZOITZbxp)o0*4&)c=ongOGjbALAt$t^3<9uoPn zzh<;8zw8KIPZz%67i4Zb$@9l#MS@o{_>9Yy@wnqU3&T?}HWe1^uI5@|YT|ZC63TsDo zSqug0Kc8{O!q@jYZvx9;hy7PV7lkw+nOb3-y(mQo_w&Tx(kHD9(6YahNY&uQW!cld z#Pel&+$f#!1p>)fr%^mO_Paf?Glf?6dWDMMZ+mlbkc+g5^tMGGvw3y0bvGr!HEDy|sJCmgDoNBzBHCo0kXx_}ae29g?rnlIIBg$kI^ z^?qJ4Q&Zvbf{DUrG-+P~V4Mc$Mhgcov^^Vg3v3o>zNuetrFnD}@D zYhs`qA(U63AC~PmGe|*9S}9CyjFeF9R^w2)GpzD=PURLlBs=Qg**(rd-Rp(@EaQHs z)!r5&ZrrC4vNE-8bo%jWiZ)RA$-1{o-9hCQ=obTpAxQ-o>;Mg}u5{bT>w8$3Cxk_v z0v8~Jm6u}sG)^)n-H0kN;#WEt(^#WLBX!%dI;n(K(`$wiV|8llCOYW2+?iz!xe4le zfV2qBkcf!Vr~-vhrIh7JO}v;!HFN+%`QHV30|`+4et`{L%>ZO7l9 z_WRAFRw80D$XfAy5JxH^XJt%B=i^CpcWN1Yxl1UN?mNkEd)pL$P`6hzZ4&xd&$sEg z0OPQo{rQ+jPEpBd=$Y-}n`Ida64@jfmSdWiPF1_q_%x+{O-ZT!6YxZSFA7x>r&yCJ zH6bwD;<|4(x+E{#Od(+gl`$y~o1B>RvXs|l#Eza@>laCU{2P@{ad=zo% z&f=EXp6!QNcx2W`N0n#07T26|QW{0fMUzZS|2n<;{jBBhrtIy!46_?c@Hw&h^A|^^ zYuA?wfcV&QT~%u|`AW2a1XwUVHbdKz*-RMYn)km0O}jBnZkre@#`zkaJ; zE4_A5FEkl3Lb`>wTU0)Q z@?jG^k3vWgVSIph%-J??=+}~*C_0ZzT(nyyfrVk50_1pzehCdUMGrUMkGFmNTn>6# z-pN5HvVqBP0odYY*YYZi8D%2a+8&QNaw;(}LX|)j{?1il zq)dF=;=QkTO2HcU>ne|~8bBdn!8J0CDjFOc3l&m^?3&HcNqLjO$5m3y?d4Y3Wa(l5JImLQC>?HZ-%$QV?hY%fF^ zo!M5E$+Ww{p76OpU;tX1tjj-m4kgkNAYl|edI=~XW>EqKoIo$EhNXDKhP$!$h z)}(i7rUYjcHO&C}r509k*tdLY;>-?avI%M4b&oI>Wm|7*r_jIiXP3lyin-*xYcz+4fP?!HiMj7-BbH`N(_7S z{i`bslz){S+%8Q= zCKvT3u7rko$v(!m;clg6nVcvxZ~0Ac?Sn<}ra`%hvvMPu5|m*&TSq{M99jKl?RIG@ zqOSszaBR+s5w;#z^V;N+@d@=WE5iLj|I(ML(nVQ z2#3>TnPNwxx$cdNrK-Gl$2v)~(aSe>!`@SJ+8|4H>1jTuLV{9doFv^>YUuA%UJdc{?=OvEJu@ZQ9>uC`c`k2VKuF7-KbB<~YoO~ZTxQD&lX|3WaFE}!KEen*7%$j7e zaP_$z!m6(MY3EdJL9FC4DZ?MsWR$ywc%3jjzBgDKR8RA55+5;1(6(}Tl|*1@fNzK} zH!ux!l7bP~-rwTqJvtm-SzJQ*(MuY0`0PXbXMnKv|~D z@)HsW8N2Ngl+oz4$Y&!47v~*uc_aphZ1pWY1~F3R0;U?K2*q}T0xjo?Vu^9pl%Wy; zz~(CF(IPfLqnxD)RvE4=Ws5KtR`#?(Xyd_e2a2NgmZV0ozpwgKM~Yv=02{o^k^oB2 zRN6S5lJK9SueAY=h1$hazeICv9^(q9t!0{mHJu}#UJJ{SpDqU z7XZgC0z`^}H!hK$8K0y$@W=d=jpogG8pE*gn6Wa@U^+?$w^mtiILUmdqdo*NH^Ek} zx6#97y?z;J4I{)3g@)5EauOP1k+2K(Rnd|r!q$zLO?L!e%l=eg-$J?~Du$FK+v_k%Bm{_yhNbkeSH@~m!P5$@&?#Y=be zYgAsD@v$_%`v9yg!&EVw5utt2J;9W!WjBt&&P(Bx&$)&n;K%j?3V#9O=CYk9Pmh-f zEaFY+4JqwI51@U|mu}M2oR>l5Xe~lOuU5~kr9j|tYB&s*9xxA`PyBuIXyL^^h%04V zI4(PbrDKM*+4FgBrP_jx#RX|c8+W6aD#Mbu^9lJ&Z@0(Jd*SM3taZ_(9_uz>Jb zGzcC8-=;h!=;R@hk6if2nb5zZQ|NXHsba(Z>Y$2UD>dwmW}ixz1%MyG5-_v6Y^7$f z3ZGLG;B=n>-8&^#wz`4?Q`$>Oo!2wA$U@$1pk{(F1wj7m1PiQaWO{I(Mk?HRNP5^o zaoFj$2syK;wnj1_mF-@OD$Mt#61wfd#WUQ7cGiLe^r<6mVWX|<_XFZTdXq4~uA{*g zkYqiK`{i0S?vs9s%W&UDgybtZqKj`xIazMcnY;_LD_r~m%inDJ7bS+b;itBM$cyPu z+VuYjW#Dm=S1DNWBc$M6RwB7DGTzaHVo{2bCFsz6FfV)`6jF8&w5`C?^O zRozq{AoV8?I=Yy)4}S%4OrJ@B=Hx?kt{x<2Ew_aN2BrujM9>U1m|jUHf?ez|$kovN zg9XTK8P!~Ke_VIL-G;SF!@9p~(~htxR`rqd77aj%FU8O)tv#vHa~1lD&&XhZno{dYbfBG$u9%n?92UL# z0k`m#e$3P6Me8*1#7`}`BiyF%a&7Axjt4ukrXu7Rd*9bOP{xi`m1#yd5g2(B#SltNk|EaiT6>9zZqBDNP}71`)Q|IeD1xf!On1VZONHMB6|XV|d2L+fC+C_Nt9POaW*`f6u3QP-7X@^gp;r%gtmyee zU}+vU*(yc7a|w2JnAHaIe;Vjm(-zwoOt($5W+n4;B`CksEwTZ$;$?5h87|n09xT`s zB6GVaQ(H{T<7}@-LLLLs;Ct=gUisHImly2c0r8Ss1qJ~@44b`R5M|%ExnONKP-EBzUo9w6pDytBjw2|>0 zV{$QSD=r%5xla)uRbqH}A)mu3om!Mq&8vDe{VD866ovqCx9_wv7O@^IE=aiWYW(S# zRp;5rswBGzNpfVPZIv1Zj+iZ9j>b}mqb$(A=V?T-jG9Lmg=WPD8ULyJ5?TZdX%R`SkPKx&9cTEY^^xClF=fc zS7KrD2_}abX6!SgMbIsjDkUn1QsX51tT3rCv0M+#vZ(TCjN7=ff+0wu%;dsnlr~I` z;G$#&7PKl%VKsEj8h8C>SP3~z)*dx))chn*WP^{Nv!twg%MkwDOAfmG)eb3+-6C|p zGogW{>0x$JN#d3_I@#uHtzHI(0yvtd)`ikIZ|0g3wa&cf$XHX2htUMUuKthyC;TEb zQP4dV2G)vxBdO(}bZ4PHQ^*R#7P7VrOm9CH^x6?MpcG*5-QuN3c5_^t`oC(c`xtzS zo;?iCCuM1~DF*`hX*|9YwrvSkiaZF?F9jt%k;~4Ynbc68i-p~46drP#-r-}joB7Z9+r7toJ}JouZ)|?!-(U~eVnaF~u#Q)y|C*Cw zL*5zbsMv};F?w(6C-JX@et@XD1h2W}D`z=|!6%Lf=oKQSjtF#bGF(+^&mZnXYu`?3 z`L^tJOq@thHA-FG=|KLpW_I>CzsRtOrpH5gq7T?SX$wG@i0YGEphgUJn4$iPxupP_ ze43TOmtU3_`3Ihv`*hnVUUuZWeTrZFO2tlXk<^3`!FxuyvdzRm##4Vd0%cR(Rwc9* z(6bd8kaTqGAWLzuc|W5RHk;y};iV5fTr~O)*TTn9EL}tGz>*?lv|5p0Wk-!F+8I!t zPIjF-jGM882^%h26|C1xym`R|%X&DfI7R$ida$$r+e4MyXk1y*GeMSlFA6+tI$T#5 z%(yp7rm78APiq+zEUf~?Pu}(u*U5vDz$5^0AC>Hvg2|}LDMF%_>5q!hjg@ zz9&QQT~g930H;!UC{o+*2b>`z&4gHwU2ETZ25Fk4g8k)ZVN z7c*VWPVYlpf1zHt`pU5>Gqu)y?PrnUD$9bIDt%%8WDBOe#}4|c^p8z~3~q!D(7sl#=dPhG)+CNT5P`4MH2 z_>rQUrB{wtzzlZ@uaxy?@`onMpDQ}PN1?0YB%`uYx99%@f7~3GY|k$=E{Y0Y%qI15 zejXPAo0z^feq>E$$wz6Jx_P~dP%CcANd385HlmQXwBGyl_&Sb~c0XE1cm$26)m#KT z=P=UO;8&}@la|H-9b!gD*meY5lG;VZl-9q6k0H8_(hBF*#XK9eebt2!vo&?iz!Z&- zJ@pTIx=s06MR{Xr{AY(DfmV!)_cTH~e@yA79#az_%%56_PFborAM%KVx=wXk9Y2$l zAB-a~E`mLSu(`j@|AIhoPMr5Hi!$$oYhqQ{{4I4sbi!~Wfz{Zv)Yos;uY=gye&!zr zm@@7J_}4RxMew^fQN; z27UN@+2z{e9v~5jqj>x72C;mY^SgcdtJ-o4cVubso;-qsHa1QbdmlEd|iIS4V%5`P&zs?xtpK+ zDNXihnf_RqJ=PR`M+E-e8`*}`Of`r1cucZnuUP!+VO~KJ;XZZ^oS0>=j9w+(Arw<{ z#wINo)?FAup0-BGrF-F~ZvRdsR#9o1p1Da{B4@jE7PV#D>zFmyHaRsTM6d*xX0y0x zZ})MFFHQRRaf@Q)#`tAPn*ME@XfC-<#ZBq>P|C`(Uqf67a;Vzw1e{w9h~T^C7l$2w)e0`2(`)?&%Z0jC7)?V(t@DLMMQ-Xn#kph}{hH&&eJV$TC`8S1 z;qTbzD5hwqa-AdTQ#?9ac?iZp%9sGY_Tld1&C^K7tglM(j3J2mluLUIO{w;r_OQ}e zm;;OBbTl5|S@ziac+Q-P_=HkCb_jwp<&qlUBx^a+mD8xYYhIl)A)=nem6FMPlMv8e zRpt_cTP46|Yo=8_Q%Ge^S|Jn#CALGuH?jJH)UB&DRD-`u;mW2e=*+;^Wp+#l!K1&_ z&VMI_jPg+ksM71UhqeSN>B^2_B5^Co2>I=WlEG%GiB@cg>Jjc z?nRp4&kvgq)fa<>&P?w{)vD0UDiKdfi`tVfr7-T+e#x;6yn=Jg1(zLcmT#UuU<)2&-R zL$Z;XH)5+p-;@E97ZN2DwLV|4k%gpb^v>gv9rGO6(sK4DL?6C`nMPT zJ~S1@A=>I50C*P$NhhyWnK06~<0s@R0V{A8l1YtmNSopbfZna+--F=clsWDp#c9p^ zFs!X3Rvgnr>aTAx>^3{UUYZYV(3ozh>~Uc~fp-5;c8-`0GhlfU@Pg9i3A0Jj77!rj z*hyUg?|Br~bnxFOgAe}MLGoP5!IdOqttvUv5=8C{*L*W0LV>coGku<0vZ5vZUe&gy zv~AEy!I#~f68pH^bQBl!_o*P7ZT|7ui;MHhfyjf^HV*@$iI~M8i38HLaBhP7aiS7} zpX0q>;GS*m9`gD1xn}<|&xusf5T6`fneHFD6B{o!N@Au(|Mp!?06l&%xUE><-Y3?h zOEN+EY?9&#i9Y}O5uQW0w}qnrI-*5MABK84ezK*o4t(cqLDS7A*zic}{%>OPVRVej zKC40aV*o;a2qmL%qq1a@?Y#T=erXQH^E(M7za|tMez6mQv~D4rAUQK|n%~$RLcQ;4 zp2n#`LzZMOmv*zlMP7AZHKj-O{Hm*fHxYeumfJ`Vn0q?TAv1GDf@%fDc2ZNwe{Ib&t!RG#@qSQHUHTf0}s zrHXlV#S)$5K}R9(I132M7IOf)=jRyg2~qVQ>}`0?Tz6-M&R|t613XLa^%j68FH*G( z1+imA+;tApT2wMQ&)9LqKaYwlz@+RB z(%Dpa77V1mrcK}QN%Pcc)hA$KZ+nE5z|f z9D&x$;9n8u+g$igA+Qw-dES1q4n2H8$4=cnCUfIh7dt-b*$Si?@D5LUhYRqXfFKU@ z8TJCJSVBQ_-A}Aq(NFK@dBp{1Y%vhugxtETFf+}QdK#V4kC5p9tH&7LPdQr*Nc+}t zkBJ4r>QaedZ41|~#sU=dc|P4hDmD`H**uHtbKtk0djkGl2@$>6V0Ss_pZcO*b=vVA zx>~JETDDh`JfAph6)I*K1e38|Hn+8&>U?$+aC1+@RGs<_zU+UZY@};I>rS@jCTgWa zN`lcVHI1CxxbPV=U1A^d;yL?a(XI~}GyeZa-MiI;Y9B$_ZcD>V6=1;I(*=`iDbDrT z#&i|Wq2e5d1B?Xr2%;kFQ;Ms5iZdY zraz?NxGCb>(yjq|kHF#rvMWiX>57Z};KpXbks+Y|Vpa8F*XN`6gmj;EAM-Z#Yqz4S zZR)|We$$b}x@){0`L2WenaqzFxax(^%t3pOpo5W@*;W}w-<^u4p4th6iDTFNGnnz| zZP|htUhPnHAon+;AHlUnQa@QpC1h~0#*EDC9G(EaO5tHyX$))0N%zLMbMrTN%?*&R748;_H~^epsls9 zmQ^tx^4^FXb?2|^8eWQ!5PnO_GD83$D2*PAlJ#oP_69tqZJoS&&H`8C_qtxr-~_yx z${Tl1Y?zy`S#S~uU&5m72(3rt#<*v9dY-8MwFUO%{Kzz+8m8{CieLg&f6P9?#1y+% z*_tTOxP(iv7&MKFRgPd+R^r*Ld=kHZmp;hwIFMwQVd4QqSq!*@*Is4&brSkq0wl4d z3-7bERZ@J?KGy+_DMUM41zcBvO(ox8bXOWu1|$)A$Po;lDX`6kB%*!% zGQ??*ZlU-?@baw$34pRmpBO3G-9E=XDUHj=2fw1K4TBvN{2TAZ;)GL@y^T%18dU+! zQWL<%RS1`u!(2ASCeTEllm!ff9-E(9#f8I`7Jz|GaLVa;*y!BC6OWcq^U_jlnEyX} z-bRy6FRHG-#2<9Xo?cL<2MyQBBoRq~e8!zn*bfd9dGneO4`_X~H-Px&+xUF8D%g~JCkCzdn}21?V1AEXdM%wfMldjgIbnCZx%h60tb$cC!~ zkX>DjEX(F#Z}apBnp1uSmdufIFuH;6nT$TOSAG@7KNpFqKN)RD3jl05+Z-I(L#t=l zTNuK`Vi7-bvviNs+qD8pdR&_G%ifgId^C59!NiS1`l*@axh?Mpjf$Z>0|y3`#v+`# zxpGbl2;=D0bLUq1^#E>8-lNEjQ#WiO5#J&vOm$#BUDuCZEm*FPeBGP{S)1Mpj4 zu~y%tW5>{gfY=0xA)^JP=eT>b=@wk>W?n~305JW6a3m~q`{>iDosYh-_|2;d{VyTs z{v2iAe_URMajA^_!zMD>dLuqLl{;DEhOcAivaua5vhvz3K=HEp&G`Nm0zNue3UY*H zSv3ZWO5$@YuwNgk zm3O~anj{Gy3973NVQPA z`PpVV^NyWw@8gVy+PBQ5dDx#UV&iLRpOh7>vCKcoEd5g>52*(!+p10z5`HZitoo`( zS8=Up6)cOoL&gI*%1V}2O6C|iiX8N#Ea;KAN=@W0O!#1v;oJ1WKVkx@+N zrUt|ey~Dp;deHRnT^x(hN4x^so*TYUEf%XqktTD3n(8qMDRFhzl$e&klC9VL4VF}| zhhi&+7pFWKj8A@17W$hQ+YPQzbGNA7GrED1wIw*v06i z0P$2G&N!Ezyj!-F?eW?hpx`-5cyFA|)`)CQB~%&JZJy_PrxDa?pEAVu|P6 z=2l4M-3idg!_`x$Rf`O;>5mFjgaDnhUWorudZ7K)H(TnC6-PPdjj%d$3>rx&Db4=C zMh{z{;7a2-IqiTi-?+S?rkyEVP2G#Hb`i-oE=LHYhmCDZBqSHw?#9QEwz%)UFtvxS zB_Vz@ixleeiEOx&G_tVxVrPzPX0V}|N^i6BcA;_1cTxTgrI zoUDw9ppB~kk*$vQm$B?AYvn0R9c^5^rVhwX$7}FXkVoH71 zhl*1sF5Ds^Lps|Ip8H6WYQ*A$uF$wd*QX%@#a2_A!2Np_>*vz+2`MHwiLACE|LzaY zQGv*t$tU6*V*ODN`ebIuTlkr~sncRIB%~p3Fn}`px0TaMJ1&@MS^QR64+Tp{1XnS1re?={rrtA> zUJNYTE#mi8+nI1k@NfNAB(NCBLyJ6}mAx8VGI;oS``#lx#Mh*wbsBc2F|G_9=t5>} zj&pZ9wj}8X{|tERs*vt*_G!c9=4%rAYPmFgFa1nE*SJLXpvg-v?dUb`!(>}?Mc&Jr ybbimrJ*d1)VEqasNh}4ER5+S@eJa literal 0 HcmV?d00001 diff --git a/.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.md5 b/.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.md5 new file mode 100644 index 0000000..474df21 --- /dev/null +++ b/.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.md5 @@ -0,0 +1,3 @@ +source_md5="9e8801de4bef4983cca7e993585bb944" +dest_md5="75483eb7190f06ec5b7c17b158dff864" + diff --git a/.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.stex b/.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.stex new file mode 100644 index 0000000000000000000000000000000000000000..fbb6f643aa5c245cc3cc04451ae2dc013c1d395d GIT binary patch literal 88 zcmZ>F2@c_7U|?VaVhB)RX9O~AfH>UMDImzx&CLMH4hyjGQ30~`c^w!9_yq(%%R2?; cNMHFJ%jv-VH=KzhQ8n1*|Kn`sy-zb3072su0ssI2 literal 0 HcmV?d00001 diff --git a/.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.md5 b/.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.md5 new file mode 100644 index 0000000..ac66192 --- /dev/null +++ b/.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.md5 @@ -0,0 +1,3 @@ +source_md5="f4c7f3ffcadcda366aedce818d6efbfe" +dest_md5="e02525cb50c283e4e58be85a22e82e3a" + diff --git a/.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.stex b/.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.stex new file mode 100644 index 0000000000000000000000000000000000000000..bac322a174971533c629f7cb796309762d2456bc GIT binary patch literal 88 zcmZ>F2@c_7U|?VaVhB)RX9O~AfH>UMDImzx&CLMH4hyjGQ30~`c^w!9_yq(%%R2?; dNMHFJ%jv-VH=KzhQ8n1*e{#WF2@c_4U|;}Y79eI|P+(^Sl14xr?&=f}F2@c_4U|;}Y79eI|P+(^Sl14xr?&=f}<{9 literal 0 HcmV?d00001 diff --git a/.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.md5 b/.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.md5 new file mode 100644 index 0000000..8c7ca14 --- /dev/null +++ b/.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.md5 @@ -0,0 +1,3 @@ +source_md5="7c1193f6500d1fc0411cdeb3000c36df" +dest_md5="81ad6cf73db3ebed1cf028a8ba220086" + diff --git a/.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.stex b/.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.stex new file mode 100644 index 0000000000000000000000000000000000000000..808edd5136c1d635bfb6efe60998d8593ca63a7a GIT binary patch literal 140 zcmZ>F2@VlpU|;}Y2vA^W1TqSMINa4KAjs3rEd|OB3$XAB2eS3~4=@X;D+qXeiY||6 zbP)PCZ8Zl=kj%vhZjP=$^12J!^*MMHJtr;MaFy*Y+jowde?i8Zc?AE?Z(w!WV6a2s fipt%>pn1RlaP#fmrE-){tK`r!-nADW$T9!`<3KB1 literal 0 HcmV?d00001 diff --git a/.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.md5 b/.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.md5 new file mode 100644 index 0000000..0399980 --- /dev/null +++ b/.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.md5 @@ -0,0 +1,3 @@ +source_md5="854d565fe87c02a40a91d093e1942111" +dest_md5="ad1a81cfcbcbdb6d5a9f99dd98a9e5e0" + diff --git a/.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.stex b/.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.stex new file mode 100644 index 0000000000000000000000000000000000000000..73a8356cbf535c07fbe860d2ff86487fdad1f521 GIT binary patch literal 29434 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 Y?%!forbdOV literal 0 HcmV?d00001 diff --git a/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 b/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 new file mode 100644 index 0000000..5328bc7 --- /dev/null +++ b/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 @@ -0,0 +1,3 @@ +source_md5="47313fa4c47a9963fddd764e1ec6e4a8" +dest_md5="26ea799ea0a3da9e753b3ebe822e0570" + diff --git a/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex b/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex new file mode 100644 index 0000000000000000000000000000000000000000..71f69131f1bad5ac84f9f5fb77b8014d6f855868 GIT binary patch literal 1496 zcmV;}1t8#jQIRc$f~c)tQiw!~w%QUQ6exqX5cknk z0+d35DiDbTDuoE4>Lo>6B7>ey@m$S@5kjOuv{fWhh-@ho&(;2WkwS$K6`&Ldl|Us> zi4+J0k-+z7D#fx5bCy(4v8-W?7^7rF3d=UlIm}g3kr8v2*TVsYG0L(HsaUol6{$#J zzu%jyB(dI3x&O7SY0hEJfqi2jQf;@JF@lOwkr88**UM&PLd-R!kcy0;loU$Knm#_B zpssT<`uctM`T6EPm%A7K9*tSP|39fzMMT%Jh>GrWxv%zI|5WGxr!+(rs;IWI7+u$| ztA8kAM1hddg9IT6zY$?4T#831gq|cT869IJntT)|=01mwu*fe$Smy`ebi^HL+s-xg7chk284pq%~oy)o1W?`nc*zBC=zRt+_#M70<6PFG z6}tee5v>KVd&MI&-P+`h3e5&K^|-6M0EkEyjlf*9+`s@4^=sduefxeS9)KHW zxry#hT9*zlA+*bJIQpy4c0ZhsA-z^ z>#WBV&J`yU4D>m2?bqM)mFeH8@`b;@t{w3iXa*Wm8VHI_5p)5%2vTB$fYL+A6hukG z$!S`fHfaJP8lFT>jWhoL$`1ibnR*S{w;v;KO#Alr>y=RgAjwy$tV9ApAt(LXJMHJB z5CB9fl}q_biX|eNFsP!BlcI21)QL~UK@*6GVkMnytRt$6Bte>2l|jNPUTK0P)Fok~ z<8pRY5;Z~3$-3c)Ct*B>>n8U^6H%qzayG_@T0>t#DTYp>PAI07fWEaTdcB-^=q5<& z*tTB18j2DbF@k^@@+ev1QMg zL5#haz6F3%uU@HhjobH`e9qrvh%#pS={PAR-X0k%SWDWbr)+o y|M)fYRW9dto5g$WGgZ~$_?(~f&V283@;^HqstN$fY}?!b literal 0 HcmV?d00001 diff --git a/.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.md5 b/.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.md5 new file mode 100644 index 0000000..d52d5c5 --- /dev/null +++ b/.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.md5 @@ -0,0 +1,3 @@ +source_md5="1f208aa17bb746f72d0c708960e161b8" +dest_md5="9a39a80a2cbcca6412c335d0d192b71e" + diff --git a/.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex b/.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex new file mode 100644 index 0000000000000000000000000000000000000000..03eaf90b2176b2a434489ee7fea0f6f638e4d9a4 GIT binary patch literal 150 zcmZ>F2@a89U|;}Y2vA^W1Tw0CINa4KAjs3rEf2~L3$XA>1hVzT53mZzE2t<0%S9{} z6q=yPzb25=6bm@ pIt_+3AMRCayG5+Ma4vSf4#THU_p1N;{!h94xBvTAR)<|_3;^cFGR6P^ literal 0 HcmV?d00001 diff --git a/.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.md5 b/.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.md5 new file mode 100644 index 0000000..3130109 --- /dev/null +++ b/.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.md5 @@ -0,0 +1,3 @@ +source_md5="f5c365385f1229bba28c2118b09557f0" +dest_md5="215730718d238613f5ecfb60c77fd1c3" + diff --git a/.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex b/.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex new file mode 100644 index 0000000000000000000000000000000000000000..49a5b7be5ad4fc40f7ef8311678281c19da6d376 GIT binary patch literal 150 zcmZ>F2@a89U|UMDImzx%`Feg4hyjGNd&U>#SgFu$SbHQ1j|J% z78IJG$-gF$)8oVx_G29l3m*J`v1l3FAI4^nNpn0LgtXdJ9@eJXyNGfuc=ef?PwAIE r<2nt7H6QL(Yr93Py>Kpez7E5uPxq>0U(a8&`~Sy#uUQ>-DKP*5F2@VlpU|;}Y2vA^W1TuaBak#5fK#-@K+dC*bEWpC&5sD)+@9CIsqf9@75qED;rEjJ&ubr6GO*7R zXS`v2wN&dih|URB%X}|O zoUQ5FzEfn;oc+JdzK1^jysiGC%?sJ&b^JT(W-Locyxq1Y<4p48GKu4bGHdS0-B|77 WKGAQL>;mrf#~ZJ|wtM-#k{JMMl6<8A literal 0 HcmV?d00001 diff --git a/.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.md5 b/.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.md5 new file mode 100644 index 0000000..54cfbf4 --- /dev/null +++ b/.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.md5 @@ -0,0 +1,3 @@ +source_md5="ed7ea9ed6750cf2fbe5141c6745f1a80" +dest_md5="365e095f05917944fca1b11c61acdd5b" + diff --git a/.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex b/.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex new file mode 100644 index 0000000000000000000000000000000000000000..ea7bf55fb80495d07b87ae9f859ee49866f1ce4d GIT binary patch literal 204 zcmZ>F2@VlpU|;}Y2vA^W1Tr=Nak#5fK#-@K+Y%@{EWpBNI*_f;e}GvaUqQelFn zECvzYJ_;NYWzBY`=l?k@xQav6u}MMcK<1Xe*~QaEH#vlz*qbOF8F_OxZ+cTzo~@PJ z@sv!4cNRbS1uy>R3=r^I<rIFN literal 0 HcmV?d00001 diff --git a/.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.md5 b/.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.md5 new file mode 100644 index 0000000..5210da3 --- /dev/null +++ b/.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.md5 @@ -0,0 +1,3 @@ +source_md5="14b94da08f95d2ae578c2be11f83ccd8" +dest_md5="ece14a0ab6aa8577445cdcf27ed7ac33" + diff --git a/.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex b/.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex new file mode 100644 index 0000000000000000000000000000000000000000..8f3ddbc316b8390e79553c7f8fbdfe8c8f0d83d0 GIT binary patch literal 148 zcmZ>F2@a89U|yG-*o&=f|YKyTs;~FgPoE{+%m5SLVIEXDz$In&}JxKVLC= literal 0 HcmV?d00001 diff --git a/addons/Godoxel/Animation.gd b/addons/Godoxel/Animation.gd new file mode 100644 index 0000000..75a90b9 --- /dev/null +++ b/addons/Godoxel/Animation.gd @@ -0,0 +1,24 @@ +extends Node +class_name GEAnimation + + +var frames = [] +var anim_idx = -1 + + +func _ready(): + pass + + +func add_frame(frame): + frames.append(frame) + + +func get_anim_index(): + return anim_idx + + +func set_anim_index(index): + anim_idx = index + + diff --git a/addons/Godoxel/BrushPrefabs.gd b/addons/Godoxel/BrushPrefabs.gd new file mode 100644 index 0000000..fe809ae --- /dev/null +++ b/addons/Godoxel/BrushPrefabs.gd @@ -0,0 +1,106 @@ +class_name BrushPrefabs + + +const list = [ + [ Vector2(0, -1), + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + Vector2(0, 1) + ], + [Vector2(-1, -1), Vector2(0, -1), Vector2(1, -1), + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + Vector2(-1, 1), Vector2(0, 1), Vector2(1, 1), + ], + [ + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + ], + [ Vector2(0, -1), + Vector2(0, 0), + Vector2(0, 1) + ] +] + + +enum Type { + V_LINE, + H_LINE, + RECT, + CIRCLE, +} + +static func get_brush(type, size: int): + var pixels = [] + if size < 1: + size = 1 + + match type: + Type.CIRCLE: + size += 1 + var center = Vector2.ZERO + var last = center + var radius = size / 2.0 + for x in range(size): + for y in range(size): + if Vector2(x - radius, y - radius).length() < size / 3.0: + pixels.append(Vector2(x, y)) + + var avg = Vector2(size / 2, size / 2) + avg = Vector2(floor(avg.x), floor(avg.y)) + + for i in range(pixels.size()): + pixels[i] -= avg + + Type.RECT: + var center = Vector2.ZERO + var last = center + for x in range(size): + for y in range(size): + pixels.append(Vector2(x, y)) + + var avg = Vector2.ZERO + for cell in pixels: + avg += cell + + avg.x /= pixels.size() + avg.y /= pixels.size() + + avg = Vector2(floor(avg.x), floor(avg.y)) + + for i in range(pixels.size()): + pixels[i] -= avg + + Type.V_LINE: + var center = Vector2.ZERO + var last = center + pixels.append(Vector2.ZERO) + + for i in range(size - 1): + var sig = sign(last.y) + if sig == 0: + sig = 1 + + if last.y < 0: + center.y = abs(last.y) * -sig + else: + center.y = abs(last.y+1) * -sig + last = center + pixels.append(center) + Type.H_LINE: + var center = Vector2.ZERO + var last = center + pixels.append(Vector2.ZERO) + + for i in range(size - 1): + var sig = sign(last.x) + if sig == 0: + sig = 1 + + if last.x < 0: + center.x = abs(last.x) * -sig + else: + center.x = abs(last.x+1) * -sig + last = center + pixels.append(center) + + return pixels + + diff --git a/addons/Godoxel/Canvas.gd b/addons/Godoxel/Canvas.gd new file mode 100644 index 0000000..a0618ff --- /dev/null +++ b/addons/Godoxel/Canvas.gd @@ -0,0 +1,517 @@ +extends Control +class_name GECanvas +tool + +export var pixel_size: float = 16 setget set_pixel_size +export(int, 1, 2500) var canvas_width = 48 setget set_canvas_width # == pixels +export(int, 1, 2500) var canvas_height = 28 setget set_canvas_height # == pixels +export var grid_size = 16 setget set_grid_size +export var big_grid_size = 10 setget set_big_grid_size +export var can_draw = true + +var mouse_in_region +var mouse_on_top + +var frame: GEFrame + +#var layers : Array = [] # Key: layer_name, val: GELayer +var active_layer: GELayer +var preview_layer: GELayer +var tool_layer: GELayer +var canvas_layers: Control + +var canvas +var grid +var big_grid +var selected_pixels = [] + +var symmetry_x = false +var symmetry_y = false + + +func _ready(): + #------------------------------- + # Set nodes + #------------------------------- + canvas = find_node("Canvas") + grid = find_node("Grid") + big_grid = find_node("BigGrid") + canvas_layers = find_node("CanvasLayers") + + #------------------------------- + # setup layers and canvas + #------------------------------- + if not is_connected("mouse_entered", self, "_on_mouse_entered"): + connect("mouse_entered", self, "_on_mouse_entered") + if not is_connected("mouse_exited", self, "_on_mouse_exited"): + connect("mouse_exited", self, "_on_mouse_exited") + + #------------------------------- + # setup layers and canvas + #------------------------------- + #canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size)) + #pixel_size = canvas_size + + create_preview_layer() + create_tool_layer() + + set_process(true) + + +func _process(delta): + if not is_visible_in_tree(): + return + var mouse_position = get_local_mouse_position() + var rect = Rect2(Vector2(0, 0), rect_size) + mouse_in_region = rect.has_point(mouse_position) + + +func _draw(): + if preview_layer: + preview_layer.update_texture() + if tool_layer: + tool_layer.update_texture() +# for layer in layers: +# layer.update_texture() + # TODO + #if frame: + #frame._draw() + + +func resize(width: int, height: int): + if width < 0: + width = 1 + if height < 0: + height = 1 + + # TODO move resize to editor.gd -> for all frames + + set_canvas_width(width) + set_canvas_height(height) + + preview_layer.resize(width, height) + tool_layer.resize(width, height) + + #frame.resize(width, height) + + + +func set_frame(new_frame): + frame = new_frame + if canvas_layers.get_child_count() > 0: + canvas_layers.remove_child(canvas_layers.get_child(0)) + canvas_layers.add_child(frame) + + frame.width = canvas_width + frame.height = canvas_height + + frame.anchor_right = 1 + frame.anchor_bottom = 1 + frame.margin_right = 0 + frame.margin_bottom = 0 + + if not frame.layers.empty(): + active_layer = frame.layers[owner.current_layer_idx] + + + +################################################################ +# Export +################################################################ + +func get_current_frame_image() -> Image: + var image = Image.new() + image.create(canvas_width, canvas_height, true, Image.FORMAT_RGBA8) + image.lock() + image.fill(Color.transparent) + image.unlock() + image.lock() + + for layer in frame.layers: + if not layer.visible: + continue + + for x in range(frame.width): + for y in range(frame.height): + var color = layer.get_pixel(x, y) + var image_color = image.get_pixel(x, y) + + if color.a != 0: + image.set_pixel(x, y, color) + else: + image.set_pixel(x, y, image_color.blend(color)) + image.unlock() + return image + + +func get_current_layer_image() -> Image: + var image = Image.new() + image.create(canvas_width, canvas_height, true, Image.FORMAT_RGBA8) + image.lock() + image.fill(Color.transparent) + image.unlock() + image.lock() + + for layer in frame.layers: + if layer != active_layer: + continue + + for x in range(frame.width): + for y in range(frame.height): + var color = layer.get_pixel(x, y) + var image_color = image.get_pixel(x, y) + + if color.a != 0: + image.set_pixel(x, y, color) + else: + image.set_pixel(x, y, image_color.blend(color)) + image.unlock() + return image + + + +################################################################ +# Pixel/Grid size +################################################################ + +func set_pixel_size(size: float): + pixel_size = size + set_grid_size(grid_size) + set_big_grid_size(big_grid_size) + set_canvas_width(canvas_width) + set_canvas_height(canvas_height) + + +func set_grid_size(size): + grid_size = size + if not find_node("Grid"): + return + find_node("Grid").size = size * pixel_size + + +func set_big_grid_size(size): + big_grid_size = size + if not find_node("BigGrid"): + return + find_node("BigGrid").size = size * pixel_size + + +func set_canvas_width(val: int): + canvas_width = val + rect_size.x = canvas_width * pixel_size + + +func set_canvas_height(val: int): + canvas_height = val + rect_size.y = canvas_height * pixel_size + + + +#------------------------------- +# Layer +#------------------------------- + +func toggle_alpha_locked(layer_name: String): + var layer = find_layer_by_name(layer_name) + layer.toggle_alpha_locked() + + +func is_alpha_locked() -> bool: + return active_layer.alpha_locked + + +func get_content_margin() -> Rect2: + return frame.get_content_margin() + + +func crop_to_content(): + frame.crop_to_content() + + +func get_active_layer() -> GELayer: + return active_layer + + +func get_preview_layer(): + return preview_layer + + +func clear_active_layer(): + active_layer.clear() + + +func clear_preview_layer(): + preview_layer.clear() + + +func clear_layer(layer_name: String): + for layer in frame.layers: + if layer.name == layer_name: + layer.clear() + break + + +func remove_layer(layer_name: String): + # change current layer if the active layer is removed + var del_layer = find_layer_by_name(layer_name) + del_layer.clear() + if del_layer == active_layer: + for layer in frame.layers: + if layer == preview_layer or layer == active_layer or layer == tool_layer: + continue + active_layer = layer + print("Select active layer: ", active_layer) + break + frame.layers.erase(del_layer) + return active_layer + + +func create_preview_layer(): + var layer = GELayer.new() + layer.create($PreviewLayer, canvas_width, canvas_height) + preview_layer = layer + return layer + + +func create_tool_layer(): + var layer = GELayer.new() + layer.create($ToolPreviewLayer, canvas_width, canvas_height) + tool_layer = layer + return layer + + +func duplicate_layer(layer: GELayer): + for existing_layer in frame.layers: + if layer.name == existing_layer.name: + return + + var new_layer: GELayer = GELayer.new() + new_layer.image.copy_from(layer.image) + return new_layer + + +func toggle_layer_visibility(layer_name: String): + var layer_idx = get_layer_index(layer_name) + assert(layer_idx != -1, "Layer name not found!") + var layer = frame.layers[layer_idx] + layer.visible = not layer.visible + return layer.visible + + +func get_layer_index(layer_name: String): + var idx = 0 + for layer in frame.layers: + if layer.name == layer_name: + return idx + idx += 1 + return -1 + + +func find_layer_by_name(layer_name: String): + for layer in frame.layers: + if layer.name == layer_name: + return layer + return null + + +func toggle_lock_layer(layer_name: String): + find_layer_by_name(layer_name).toggle_lock() + + +func is_active_layer_locked() -> bool: + return active_layer.locked + + +func get_active_layer_index() -> int: + return get_layer_index(active_layer.name) + + +func move_layer_forward(layer_name: String): + var layer = find_layer_by_name(layer_name).texture_rect_ref + var new_idx = max(layer.get_index() - 1, 0) + layer.get_parent().move_child(layer, new_idx) + + +func move_layer_back(layer_name: String): + var layer = find_layer_by_name(layer_name).texture_rect_ref + layer.get_parent().move_child(layer, layer.get_index() + 1) + + +func select_layer(layer: GELayer): + active_layer = layer + + +#------------------------------- +# Check +#------------------------------- + +func _on_mouse_entered(): + mouse_on_top = true + + +func _on_mouse_exited(): + mouse_on_top = false + + +func is_inside_canvas(x, y): + if x < 0 or y < 0: + return false + if x >= canvas_width or y >= canvas_height: + return false + return true + + + +#------------------------------- +# Basic pixel-layer options +#------------------------------- + + +#Note: Arrays are always passed by reference. To get a copy of an array which +# can be modified independently of the original array, use duplicate. +# (https://docs.godotengine.org/en/stable/classes/class_array.html) +func set_pixel_arr(pixels: Array, color: Color): + for pixel in pixels: + _set_pixel(active_layer, pixel.x, pixel.y, color) + + +func set_pixel_v(pos: Vector2, color: Color): + set_pixel(pos.x, pos.y, color) + + +func set_pixel(x: int, y: int, color: Color): + _set_pixel(active_layer, x, y, color) + + +func _set_pixel_v(layer: GELayer, v: Vector2, color: Color): + _set_pixel(layer, v.x, v.y, color) + + +func _set_pixel(layer: GELayer, x: int, y: int, color: Color): + if not is_inside_canvas(x, y): + return + layer.set_pixel(x, y, color) + + +func get_pixel_v(pos: Vector2): + return get_pixel(pos.x, pos.y) + + +func get_pixel(x: int, y: int): + if active_layer: + return active_layer.get_pixel(x, y) + return null + + +func set_preview_pixel_v(pos: Vector2, color: Color): + set_preview_pixel(pos.x, pos.y, color) + + +func set_preview_pixel(x:int, y: int, color: Color): + if not is_inside_canvas(x, y): + return + preview_layer.set_pixel(x, y, color) + + +func get_preview_pixel_v(pos: Vector2): + return get_preview_pixel(pos.x, pos.y) + + +func get_preview_pixel(x: int, y: int): + if not preview_layer: + return null + return preview_layer.get_pixel(x, y) + + + +#------------------------------- +# Grid +#------------------------------- + + +func toggle_grid(): + $Grid.visible = not $Grid.visible + + +func show_grid(): + $Grid.show() + + +func hide_grid(): + $Grid.hide() + + +#------------------------------- +# Handy tools +#------------------------------- + + +func select_color(x, y): + print("???") + var same_color_pixels = [] + var color = get_pixel(x, y) + for x in range(active_layer.layer_width): + for y in range(active_layer.layer_height): + var pixel_color = active_layer.get_pixel(x, y) + if pixel_color == color: + same_color_pixels.append(color) + return same_color_pixels + + +func select_same_color(x, y): + return get_neighbouring_pixels(x, y) + + +# returns array of Vector2 +# yoinked from +# https://www.geeksforgeeks.org/flood-fill-algorithm-implement-fill-paint/ +func get_neighbouring_pixels(pos_x: int, pos_y: int) -> Array: + var pixels = [] + + var to_check_queue = [] + var checked_queue = [] + + to_check_queue.append(GEUtils.to_1D(pos_x, pos_y, canvas_width)) + + var color = get_pixel(pos_x, pos_y) + + while not to_check_queue.empty(): + var idx = to_check_queue.pop_front() + var p = GEUtils.to_2D(idx, canvas_width) + + if idx in checked_queue: + continue + + checked_queue.append(idx) + + if get_pixel(p.x, p.y) != color: + continue + + # add to result + pixels.append(p) + + # check neighbours + var x = p.x - 1 + var y = p.y + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + x = p.x + 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + x = p.x + y = p.y - 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + y = p.y + 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + return pixels + diff --git a/addons/Godoxel/CanvasOutline.gd b/addons/Godoxel/CanvasOutline.gd new file mode 100644 index 0000000..964be71 --- /dev/null +++ b/addons/Godoxel/CanvasOutline.gd @@ -0,0 +1,31 @@ +tool +extends Control + +export var color = Color() + + +func _ready(): + pass + + +func _draw(): + var size = get_parent().rect_size + var pos = Vector2.ZERO #get_parent().rect_global_position + draw_outline_box(pos, size, color, 1) + + +func draw_outline_box(pos, size, color, width): + #Top line + draw_line(pos+Vector2(-1, 0), pos + Vector2(size.x, 0), color, width) + #Left line + draw_line(pos, pos + Vector2(0, size.y), color, width) + #Bottom line + draw_line(pos + Vector2(0, size.y), pos + Vector2(size.x, size.y), color, width) + #Right line + draw_line(pos + Vector2(size.x, 0), pos + Vector2(size.x, size.y), color, width) + + +func _process(delta): + if not is_visible_in_tree(): + return + update() diff --git a/addons/Godoxel/Colors.gd b/addons/Godoxel/Colors.gd new file mode 100644 index 0000000..ccd2d56 --- /dev/null +++ b/addons/Godoxel/Colors.gd @@ -0,0 +1,34 @@ +tool +extends GridContainer + +signal color_change_request + +func _enter_tree(): + for child in get_children(): + child.set("custom_styles/normal", StyleBoxFlat.new()) + child.get("custom_styles/normal").set("bg_color", Color(randf(), randf(), randf())) + for child in get_children(): + if child.is_connected("pressed", self, "change_color_to"): + return + child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color]) + + +func change_color_to(color): + emit_signal("color_change_request", color) + + +func add_color_prefab(color: Color): + var dup = get_child(0).duplicate() + add_child(dup) + move_child(dup, 0) + dup.set("custom_styles/normal", StyleBoxFlat.new()) + dup.get("custom_styles/normal").set("bg_color", color) + for child in get_children(): + if child.is_connected("pressed", self, "change_color_to"): + return + child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color]) + + + + + diff --git a/addons/Godoxel/DebugTextDisplay.gd b/addons/Godoxel/DebugTextDisplay.gd new file mode 100644 index 0000000..bdb7616 --- /dev/null +++ b/addons/Godoxel/DebugTextDisplay.gd @@ -0,0 +1,9 @@ +extends RichTextLabel +tool + +func _ready(): + pass + + +func display_text(text): + self.text = text diff --git a/addons/Godoxel/Editor.gd b/addons/Godoxel/Editor.gd new file mode 100644 index 0000000..afd44c4 --- /dev/null +++ b/addons/Godoxel/Editor.gd @@ -0,0 +1,1577 @@ +tool +extends Control + +enum Tools { + PAINT, + BRUSH, + BUCKET, + RAINBOW, + LINE, + RECT, + DARKEN, + BRIGHTEN + COLORPICKER, + CUT, + PASTECUT, +} + +var shortcuts = { + KEY_CONTROL: { + KEY_Z: "undo_action", + KEY_Y: "redo_action", + }, + KEY_SHIFT: { + KEY_Q: Tools.PAINT, + KEY_W: Tools.BUCKET, + KEY_E: Tools.RAINBOW, + + KEY_A: Tools.LINE, + KEY_S: Tools.RECT, + KEY_D: Tools.COLORPICKER, + + KEY_Z: Tools.BRIGHTEN, + KEY_X: Tools.DARKEN, + KEY_C: Tools.CUT, + }, + KEY_Z: "undo_action", + KEY_Y: "redo_action", +} + +const LayerButton = preload("res://addons/Godoxel/LayerButton.tscn") + +onready var right_panel: Panel = find_node("RightPanel") +onready var left_panel: Panel = find_node("LeftPanel") +onready var layer_buttons: Control = find_node("LayerButtons") +onready var paint_canvas_container_node = find_node("PaintCanvasContainer") +onready var paint_canvas: GECanvas = find_node("Canvas") +onready var canvas_background: TextureRect = find_node("CanvasBackground") +onready var colors_grid = find_node("Colors") +onready var debug_text = find_node("DebugTextDisplay") +onready var preview_window: Control = find_node("PreviewWindow") +onready var preview_layer_textures = find_node("PreviewLayerTextures") +onready var shift_shortcut_window = find_node("ShortcutWindow") +onready var frame_selection_container = find_node("FrameSelectionContainer") +onready var anim_panel = find_node("AnimationPanel") +onready var color_picker_button = find_node("ColorPicker") + +var allow_drawing = true +var selected_color = Color(1, 1, 1, 1) setget set_selected_color +var util = preload("res://addons/Godoxel/Util.gd") + +var mouse_in_region = false +var mouse_on_top = false + +var _preview_drag_start_pos = null +var _preview_drag_pos = null + +var _middle_mouse_pressed_pos = null +var _middle_mouse_pressed_start_pos = null +var _previous_tool +var brush_mode + +var _layer_button_ref = {} + +var _total_added_layers = 0 + +var selected_brush_prefab = 0 +var _last_drawn_pixel = Vector2.ZERO +var _last_preview_draw_cell_pos = Vector2.ZERO + +var _selection_cells = [] +var _selection_colors = [] + +var _cut_pos = Vector2.ZERO +var _cut_size = Vector2.ZERO + +var _actions_history = [] # for undo +var _redo_history = [] +var _current_action + +var _last_mouse_pos_canvas_area = Vector2.ZERO + +var _picked_color = false + +var mouse_position = Vector2() +var canvas_position = Vector2() +var canvas_mouse_position = Vector2() +var cell_mouse_position = Vector2() +var cell_color = Color() + +var last_mouse_position = Vector2() +var last_canvas_position = Vector2() +var last_canvas_mouse_position = Vector2() +var last_cell_mouse_position = Vector2() +var last_cell_color = Color() + +const current_layer_highlight = Color(0.354706, 0.497302, 0.769531) +const other_layer_highlight = Color(0.180392, 0.176471, 0.176471) +const locked_layer_highlight = Color(0.098039, 0.094118, 0.094118) + +var big_grid_pixels = 4 # 1 grid-box is big_grid_pixels big + +var _preview_scale := 1.0 + +var animations = [] +var current_animation_idx = 0 +var current_animation: GEAnimation +var current_frame_idx = 0 +var current_frame: GEFrame +var current_layer_idx = 0 + +var animation_looped := true +var animation_playing := false +var animation_fps = 5.0 +var next_anim_time = 0.0 +var animation_frame_duration: float = 1 / animation_fps + +var preview_thread = Thread.new() + + +func _ready(): + #-------------------- + #Setup nodes + #-------------------- + selected_color = color_picker_button.color + _center_element(paint_canvas) + + #-------------------- + #connect nodes + #-------------------- + if not anim_panel.is_connected("on_add_animation", self, "_on_add_animation"): + anim_panel.connect("on_add_animation", self, "_on_add_animation") + anim_panel.connect("on_add_frame_pressed", self, "_on_add_frame_pressed") + anim_panel.connect("on_frame_pressed", self, "_on_frame_pressed") + anim_panel.connect("on_animation_pressed", self, "_on_animation_pressed") + anim_panel.connect("on_animation_move", self, "_on_animation_move") + anim_panel.connect("on_animation_duplicated", self, "_on_animation_duplicated") + anim_panel.connect("on_animation_selected", self, "_on_animation_selected") + anim_panel.connect("on_animation_deleted", self, "_on_animation_deleted") + + + if not colors_grid.is_connected("color_change_request", self, "change_color"): + colors_grid.connect("color_change_request", self, "change_color") + + if not is_connected("visibility_changed", self, "_on_Editor_visibility_changed"): + connect("visibility_changed", self, "_on_Editor_visibility_changed") + + canvas_background.material.set_shader_param( + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + + # ready + set_tool(Tools.PAINT) + + find_node("BrushSizeLabel").text = str(int(find_node("BrushSize").value)) + + paint_canvas.update() + + shift_shortcut_window.setup(shortcuts[KEY_SHIFT]) + + #-------------------- + # animation + #-------------------- + current_animation = add_new_animation() + current_frame = add_new_frame(current_animation) + paint_canvas.set_frame(current_frame) + add_new_layer() + +# var animation = GEAnimation.new() +# animations.append(animation) +# +# var frame = GEFrame.new() +# frame.resize(paint_canvas.canvas_width, paint_canvas.canvas_height) +# animation.add_frame(frame) +# var layer = frame.add_new_layer(layer_buttons.get_child(0).name) +# +# anim_panel.set_frame_preview(animations.size()-1, 0, frame) +# +# var anim = _on_add_animation(anim_panel.add_animation_stripe()) + + # data +# var frame = paint_canvas.frame +# var anim = GEAnimation.new() +# anim.add_frame(frame) +# animations.append(anim) +# +# # ui +# var anim_stripe = anim_panel.add_animation_stripe() +# anim_stripe.connect("on_frame_pressed", self, "_on_frame_pressed") +# +# # data -> ui +# anim_stripe.set_animation(anim) +# #anim_stripe.add_frame(frame) +# #anim_panel._on_add_frame_pressed(0, 0) #ugly + + #-------------------- + # animation + #-------------------- + preview_window.update_preview(current_frame) + anim_panel.set_frame_preview(current_animation_idx, current_frame_idx, current_frame) + + set_process(true) + + # start thread +# preview_thread.start(self, "_update_frame_preview") + + +#func _update_frame_preview(data): +# while true: +# print("update preview") +# current_frame._update_preview() +# yield(get_tree().create_timer(2.0), "timeout") + + +func _exit_tree(): + if preview_thread != null and preview_thread.is_active(): + preview_thread.wait_to_finish() + + +func _input(event: InputEvent) -> void: + if is_any_menu_open(): + return + if not is_visible_in_tree(): + return + if paint_canvas_container_node == null or paint_canvas == null: + return + + if event is InputEventMouseButton: + if event.pressed and not event.is_echo(): + if is_mouse_in_preview_window(): + _preview_drag_start_pos = preview_layer_textures.get_child(0).rect_position + _preview_drag_pos = get_global_mouse_position() + elif is_mouse_in_canvas(): + _middle_mouse_pressed_start_pos = paint_canvas.rect_position + _middle_mouse_pressed_pos = get_global_mouse_position() + + _handle_zoom(event) + + if paint_canvas.is_active_layer_locked(): + return + + _handle_paint(event) + + +func _unhandled_input(event:InputEvent): + if is_any_menu_open(): + return + if not is_visible_in_tree(): + return + if paint_canvas_container_node == null or paint_canvas == null: + return + + _handle_shortcuts(event) + + +func _handle_paint(event: InputEvent): + if brush_mode == Tools.CUT: + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT: + if not event.pressed: + commit_action() + + if is_mouse_in_canvas(): + if event is InputEventMouseButton: + match brush_mode: + Tools.BUCKET: + if event.button_index == BUTTON_LEFT: + if event.pressed: + if _current_action == null: + _current_action = get_action() + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + + Tools.COLORPICKER: + if event.button_index == BUTTON_LEFT: + if event.pressed: + if paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y).a == 0: + return + selected_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y) + _picked_color = true + find_node("Colors").add_color_prefab(selected_color) + color_picker_button.color = selected_color + elif _picked_color: + set_tool(_previous_tool) + elif event.button_index == BUTTON_RIGHT: + if event.pressed: + set_tool(_previous_tool) + + Tools.PASTECUT: + if event.button_index == BUTTON_RIGHT: + if event.pressed: + commit_action() + set_tool(Tools.PAINT) + + +func _process(delta): + if not is_visible_in_tree(): + return + if paint_canvas_container_node == null or paint_canvas == null: + return + + _handle_scroll() + + if is_any_menu_open(): + return + + #Update commonly used variables + var grid_size = paint_canvas.pixel_size + mouse_position = get_global_mouse_position() #paint_canvas.get_local_mouse_position() + canvas_position = paint_canvas.rect_global_position + canvas_mouse_position = Vector2(mouse_position.x - canvas_position.x, mouse_position.y - canvas_position.y) + if is_mouse_in_canvas(): + cell_mouse_position = Vector2( + floor(canvas_mouse_position.x / grid_size), + floor(canvas_mouse_position.y / grid_size)) + cell_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y) + update_text_info() + + if animation_playing: + next_anim_time += delta + if next_anim_time >= animation_frame_duration: + next_anim_time = 0 + current_frame_idx += 1 + if current_frame_idx >= current_animation.frames.size(): + current_frame_idx = 0 + if not animation_looped: + animation_playing = false + anim_panel.set_play_pause_button(animation_playing) + _on_frame_pressed(current_animation_idx, current_frame_idx) + else: + if is_mouse_in_canvas(): + if not paint_canvas.is_active_layer_locked(): + if is_position_in_canvas(get_global_mouse_position()) or \ + is_position_in_canvas(_last_mouse_pos_canvas_area): + + brush_process() + else: + print(cell_mouse_position, " not in ", paint_canvas_container_node.rect_size) + print("not in canvas") + + _draw_tool_brush() + + #Update last variables with the current variables + last_mouse_position = mouse_position + last_canvas_position = canvas_position + last_canvas_mouse_position = canvas_mouse_position + last_cell_mouse_position = cell_mouse_position + last_cell_color = cell_color + _last_mouse_pos_canvas_area = get_global_mouse_position() + #paint_canvas_container_node.get_local_mouse_position() + + +var ctrl_pressed = false +var shift_pressed = false +func _handle_shortcuts(event: InputEvent): + if not event is InputEventKey: + return + + # check modifiers + if event.scancode == KEY_SHIFT: + shift_pressed = event.pressed + shift_shortcut_window.visible = shift_pressed + elif event.scancode == KEY_CONTROL: + ctrl_pressed = event.pressed + + if not event.pressed: + return + + # delegate shortcuts depending on modifiers + if shift_pressed: + if shortcuts[KEY_SHIFT].has(event.scancode): + if shift_shortcut_window.check_input_for_shorcut(event, event.shift): + if shortcuts[KEY_SHIFT].has(event.scancode): + _handle_shortcut(shortcuts[KEY_SHIFT][event.scancode]) + accept_event() + return + elif ctrl_pressed: + if shortcuts[KEY_CONTROL].has(event.scancode): + _handle_shortcut(shortcuts[KEY_CONTROL][event.scancode]) + accept_event() + return + elif shortcuts.has(event.scancode): + accept_event() + _handle_shortcut(shortcuts[event.scancode]) + return + + +func _handle_shortcut(shortcut): + if typeof(shortcut) == TYPE_STRING: + call(shortcut) + else: + set_tool(shortcut) + + +func _draw_tool_brush(): + paint_canvas.tool_layer.clear() + + match brush_mode: + Tools.PASTECUT: + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] +# if pixel.x < 0 or pixel.y < 0: +# print(pixel) + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += cell_mouse_position + paint_canvas._set_pixel_v(paint_canvas.tool_layer, pixel, color) + Tools.BRUSH: + var pixels = BrushPrefabs.get_brush(selected_brush_prefab, find_node("BrushSize").value) + for pixel in pixels: + + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x + pixel.x, cell_mouse_position.y + pixel.y, selected_color) + + Tools.RAINBOW: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, Color(0.46875, 0.446777, 0.446777, 0.196078)) + + Tools.COLORPICKER: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, Color(0.866667, 0.847059, 0.847059, 0.196078)) + _: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, selected_color) + + paint_canvas.update() + #TODO add here brush prefab drawing + paint_canvas.tool_layer.update_texture() + + + +############################################ +# Animation Panel +############################################ + +var change_grid = true +func _on_AnimationPanel_on_play_pause_pressed(): + animation_playing = not animation_playing + + if animation_playing and not paint_canvas.grid.visible: + change_grid = false + + if change_grid: + if animation_playing: + paint_canvas.hide_grid() + elif not paint_canvas.grid.visible: + paint_canvas.show_grid() + + +func _on_AnimationPanel_on_animation_loop_toggled(): + animation_looped = not animation_looped + + +func _on_AnimationPanel_on_animation_frame_rate_changed(new_frame_rate): + animation_fps = new_frame_rate + animation_frame_duration = 1.0 / animation_fps + + + +############################################ +# Frames +############################################ + +func _create_new_frame(): + var frame = GEFrame.new() + frame.resize(paint_canvas.canvas_width, paint_canvas.canvas_height) + + for idx in range(get_layer_count()): + var layer = _create_layer(get_layer_name(idx), frame.width, frame.height) + frame.add_frame_layer(layer) + + return frame + + +func add_new_frame(animation): + var frame = _create_new_frame() + animation.add_frame(frame) + + anim_panel.set_frame_preview(current_animation_idx, current_frame_idx, frame) + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + + return frame + + +func duplicate_frame(): + pass + + +func copy_current_frame_to_all_frames(): + pass + + +func _on_frame_pressed(anim_idx, frame_idx): + _update_anim_and_frame_idx(anim_idx, frame_idx) + paint_canvas.set_frame(current_frame) + preview_window.update_preview(current_frame) + + +func _on_add_frame_pressed(anim_idx, frame_idx): + current_animation_idx = anim_idx + current_frame_idx = frame_idx + add_new_frame(animations[anim_idx]) + + +func _update_anim_and_frame_idx(anim_idx, frame_idx): + current_animation_idx = anim_idx + current_animation = animations[current_animation_idx] + current_frame_idx = min(frame_idx, animations[current_animation_idx].frames.size() - 1) + current_frame = animations[current_animation_idx].frames[current_frame_idx] + + + +############################################ +# Animations +############################################ + +func _on_add_animation(): + var animation = add_new_animation() + add_new_frame_to_animation(animation) + return animation + + +func add_new_frame_to_animation(animation: GEAnimation): + var frame = _create_new_frame() + animation.add_frame(frame) + + anim_panel.set_frame_preview(animation.get_anim_index(), animation.frames.size()-1, frame) + + return frame + + +func add_new_animation(): + var animation = GEAnimation.new() + animation.set_anim_index(animations.size()) + animations.append(animation) + + anim_panel.add_animation_stripe() + return animation + + +func add_animation(): + var animation = GEAnimation.new() + animations.append(animation) + + var frame = GEFrame.new() + frame.resize(paint_canvas.canvas_width, paint_canvas.canvas_height) + animation.add_frame(frame) + + for idx in range(preview_layer_textures.get_child_count()): + frame.add_new_layer(layer_buttons.get_child(idx).name) + + anim_panel.set_frame_preview(animations.size()-1, 0, frame) + return animation + + +func _on_animation_pressed(anim_idx): + current_animation_idx = anim_idx + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + paint_canvas.set_frame(current_frame) + preview_window.update_preview(current_frame) + + +func _on_animation_selected(anim_idx): + current_animation_idx = anim_idx + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + paint_canvas.set_frame(current_frame) + preview_window.update_preview(current_frame) + + +func _on_animation_deleted(anim_idx): + if animations.size() <= 1: + return + animations.remove(anim_idx) + var anim_stripe = anim_panel.anim_button_container.get_child(anim_idx) + anim_panel.anim_button_container.remove_child(anim_stripe) + anim_stripe.queue_free() + + if current_animation_idx >= anim_idx: + current_animation_idx -= 1 + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + + +func _on_animation_duplicated(anim_idx): + var anim = add_new_animation() + + for i in range(animations[anim_idx].frames.size()): + if i > 0: + anim_panel.get_last_animation_stripe().add_new_frame_button() + var frame = add_new_frame_to_animation(anim) + + frame.width = animations[anim_idx].frames[i].width + frame.height = animations[anim_idx].frames[i].height + + for frame_idx in range(anim.frames.size()): + for layer_idx in range(anim.frames[frame_idx].layers.size()): + var layer = animations[anim_idx].frames[frame_idx].layers[layer_idx] + var dup_layer = anim.frames[frame_idx].layers[layer_idx] + dup_layer.image.copy_from(layer.image) + dup_layer.update_texture() + + +func _on_animation_move(from, to): + var anim = animations[to] + animations[to] = animations[from] + animations[from] = anim + + if current_animation_idx == from: + current_animation_idx = to + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + elif current_animation_idx == to: + current_animation_idx = from + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + + + +############################################ +# Save/Load +############################################ + +func get_save_project_data(): + var data = {} + data["canvas"] = { + "width": paint_canvas.canvas_width, + "height": paint_canvas.canvas_height, + } + data["animations"] = {} + var anim_idx = 0 + for anim in animations: + data["animations"][anim_idx] = { + "name": anim_panel.get_animation_stripe(anim_idx).get_animation_name(), + "frames": {} + } + + var frame_idx = 0 + for frame in anim.frames: + data["animations"][anim_idx]["frames"][frame_idx] = { + "layers": {} + } + + var layer_idx = 0 + for layer in frame.layers: + data["animations"][anim_idx]["frames"][frame_idx]["layers"][layer_idx] = {} + data["animations"][anim_idx]["frames"][frame_idx]["layers"][layer_idx] = { + "name": str(anim_idx) + " - "+ str(frame_idx) + " - " + str(layer_idx), + "image_data": Array(layer.image.save_png_to_buffer()) + } + layer_idx += 1 + frame.layers + frame_idx += 1 + anim_idx += 1 + return data + + +func load_project(data): + resize(data.canvas.width, data.canvas.height) + + var layer_amount = 0 + var anim_amount = 0 + var frame_amounts = [] + for anim in data.animations: + var frame_amount = 0 + for frame in data.animations[anim].frames: + layer_amount = 0 + for layer in data.animations[anim].frames[frame].layers: + layer_amount += 1 + frame_amount += 1 + frame_amounts.append(frame_amount) + anim_amount += 1 + + print("Loading...") + print("Animations: ", anim_amount) + print("Frames: ", frame_amounts) + print("Layers: ", layer_amount) + + reset_project() + current_animation_idx = 0 + current_frame_idx = 0 + + for i in range(layer_amount): + add_new_layer() + + for anim_key in data.animations: + var frames_data = data.animations[anim_key].frames + var anim = add_new_animation() + var anim_stripe = anim_panel.get_last_animation_stripe() + if "name" in data.animations[anim_key]: + anim_stripe.set_animation_name(data.animations[anim_key].name) + for frame_key in frames_data: + if current_frame_idx > 0: + anim_stripe.add_new_frame_button() + var frame = add_new_frame_to_animation(anim) + var layer_data = frames_data[frame_key].layers + for layer_key in layer_data: + var new_img = layer_data[layer_key] + var img_data = Array(new_img.image_data) + frame.layers[int(layer_key)].image.load_png_from_buffer(img_data) + frame.layers[int(layer_key)].update_texture() + current_frame_idx += 1 + current_frame_idx = 0 + current_animation_idx += 1 + + for anim_idx in range(animations.size()): + if current_animation == null and not animations[anim_idx].frames.empty(): + current_animation = animations[anim_idx] + current_animation_idx = anim_idx + current_frame_idx = 0 + current_frame = animations[anim_idx].frames[current_frame_idx] + + if get_layer_count() <= 0: + add_new_layer() + + current_layer_idx = 0 + paint_canvas.set_frame(current_frame) + preview_window.update_preview(current_frame) + + +func reset_project(): + anim_panel.clear_all() + for layer_button in layer_buttons.get_children(): + layer_buttons.remove_child(layer_button) + layer_button.queue_free() + animations.clear() + _total_added_layers = 0 + for preview_texture in preview_layer_textures.get_children(): + preview_layer_textures.remove_child(preview_texture) + preview_texture.queue_free() + paint_canvas.frame = null + paint_canvas.update() + + current_animation = null + current_frame = null + current_layer_idx = -1 + current_frame_idx = -1 + current_animation_idx = -1 + + +func delete_current_animation(): + delete_animation(current_animation_idx) + + +func delete_animation(anim_idx): + animations.remove(anim_idx) + + +func delete_current_frame(): + delete_frame(current_animation_idx, current_frame_idx) + + +func delete_frame(anim_idx, frame_idx): + if animations[anim_idx].frames.size() <= 1: + return + animations[anim_idx].frames.remove(frame_idx) + anim_panel.get_last_animation_stripe().remove_frame(frame_idx) + + if current_frame_idx >= frame_idx: + current_frame_idx -= 1 + + _update_anim_and_frame_idx(current_animation_idx, current_frame_idx) + paint_canvas.set_frame(current_frame) + preview_window.update_preview(current_frame) + + +####################################################### +# Zoom & Scroll +####################################################### + +func _handle_scroll(): + if is_mouse_in_preview_window(): + _handle_preview_scroll() + elif control_has_point(anim_panel, get_global_mouse_position()): + pass + elif control_has_point(self, get_global_mouse_position()): + _handle_canvas_scroll() + + +func _handle_preview_scroll(): + if is_preview_dragging(): + if Input.is_mouse_button_pressed(BUTTON_MIDDLE): + if not is_preview_dragging(): + return + for child in preview_layer_textures.get_children(): + child.rect_position = _preview_drag_start_pos + child.rect_position += get_global_mouse_position() - _preview_drag_pos + elif is_preview_dragging(): + _preview_drag_start_pos = null + + +func _handle_canvas_scroll(): + if is_dragging(): + if Input.is_mouse_button_pressed(BUTTON_MIDDLE): + if not is_dragging(): + return + paint_canvas.rect_position = _middle_mouse_pressed_start_pos + paint_canvas.rect_position += get_global_mouse_position() - _middle_mouse_pressed_pos + if paint_canvas.rect_position.y < -paint_canvas.rect_size.y: + paint_canvas.rect_position.y = -paint_canvas.rect_size.y + if paint_canvas.rect_position.x < -paint_canvas.rect_size.x: + paint_canvas.rect_position.x = -paint_canvas.rect_size.x + + if paint_canvas.rect_position.x > rect_global_position.x + rect_size.x: + paint_canvas.rect_position.x = rect_global_position.x + rect_size.x + + if paint_canvas.rect_position.y > rect_global_position.y + rect_size.y: + paint_canvas.rect_position.y = rect_global_position.y + rect_size.y + + + elif is_dragging(): + _middle_mouse_pressed_start_pos = null + + +func is_dragging() -> bool: + return _middle_mouse_pressed_start_pos != null + + +func is_preview_dragging() -> bool: + return _preview_drag_start_pos != null + + +const max_zoom_out = 0.25 +const max_zoom_in = 50 + +func _handle_zoom(event): + if not event is InputEventMouseButton: + return + if is_mouse_in_preview_window(): + _handle_preview_zoom(event) + elif control_has_point(anim_panel, get_global_mouse_position()): + pass + elif is_mouse_in_canvas(): + _handle_canvas_zoom(event) + + +func _handle_preview_zoom(event: InputEvent): + if event.is_pressed(): + if event.button_index == BUTTON_WHEEL_UP: + set_preview_scale(_preview_scale * 2) + _update_preview_layers_size() + for child in preview_layer_textures.get_children(): + child.rect_position -= child.get_local_mouse_position() + child.rect_position.x = clamp(child.rect_position.x, + -child.rect_size.x * 0.8, + rect_size.x) + child.rect_position.y = clamp(child.rect_position.y, + -child.rect_size.y * 0.8, + rect_size.y) + elif event.button_index == BUTTON_WHEEL_DOWN: + set_preview_scale(_preview_scale / 2) + _update_preview_layers_size() + for child in preview_layer_textures.get_children(): + child.rect_position += child.get_local_mouse_position() + child.rect_position.x = clamp(child.rect_position.x, + -child.rect_size.x * 0.8, + rect_size.x) + child.rect_position.y = clamp(child.rect_position.y, + -child.rect_size.y * 0.8, + rect_size.y) + + +func _handle_canvas_zoom(event: InputEvent): + if event.is_pressed(): + if event.button_index == BUTTON_WHEEL_UP: + var px = min(paint_canvas.pixel_size * 2, max_zoom_in) + if px == paint_canvas.pixel_size: + return + paint_canvas.set_pixel_size(px) + find_node("CanvasBackground").material.set_shader_param( + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + paint_canvas.rect_position -= paint_canvas.get_local_mouse_position() + paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, + -paint_canvas.rect_size.x * 0.8, + rect_size.x) + paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, + -paint_canvas.rect_size.y * 0.8, + rect_size.y) + + elif event.button_index == BUTTON_WHEEL_DOWN: + var px = max(paint_canvas.pixel_size / 2.0, max_zoom_out) + if px == paint_canvas.pixel_size: + return + paint_canvas.set_pixel_size(px) + find_node("CanvasBackground").material.set_shader_param( + # 4 2 1 + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + paint_canvas.rect_position += paint_canvas.get_local_mouse_position() / 2 + paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, + -paint_canvas.rect_size.x * 0.8, + rect_size.x) + paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, + -paint_canvas.rect_size.y * 0.8, + rect_size.y) + + +func _handle_cut(): + if Input.is_mouse_button_pressed(BUTTON_RIGHT): + paint_canvas.clear_preview_layer() + set_tool(_previous_tool) + return + + if Input.is_mouse_button_pressed(BUTTON_LEFT): + for pixel_pos in GEUtils.get_pixels_in_line(cell_mouse_position, last_cell_mouse_position): + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += pixel_pos + paint_canvas.set_pixel_v(pixel, color) + else: + if _last_preview_draw_cell_pos == cell_mouse_position: + return + paint_canvas.clear_preview_layer() + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += cell_mouse_position + paint_canvas.set_preview_pixel_v(pixel, color) + _last_preview_draw_cell_pos = cell_mouse_position + + +func brush_process(): + if Input.is_mouse_button_pressed(BUTTON_LEFT): + if _current_action == null: + _current_action = get_action() + if brush_mode == Tools.COLORPICKER: + _current_action = null + #TODO only draw if cell != last cell pos AND! already drawn + # -> last_drawn_at .. +# if cell_mouse_position == last_cell_mouse_position: +# return + + + match brush_mode: + Tools.PAINT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.BRUSH: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color, + selected_brush_prefab, find_node("BrushSize").value]) + Tools.LINE: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.RECT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.DARKEN: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.BRIGHTEN: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.COLORPICKER: + pass + Tools.CUT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.PASTECUT: + do_action([cell_mouse_position, last_cell_mouse_position, + _selection_cells, _selection_colors, + _cut_pos, _cut_size]) + Tools.RAINBOW: + do_action([cell_mouse_position, last_cell_mouse_position]) + paint_canvas.update() + if current_frame: + current_frame.preview_dirty = true + + elif Input.is_mouse_button_pressed(BUTTON_RIGHT): + paint_canvas.update() + if _current_action == null: + _current_action = get_action() + + match brush_mode: + Tools.PAINT: + do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent]) + Tools.BRUSH: + do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent, + selected_brush_prefab, find_node("BrushSize").value]) + current_frame.preview_dirty = true + + else: + if _current_action and _current_action.can_commit(): + commit_action() + paint_canvas.update() + if current_frame: + current_frame.preview_dirty = true + paint_canvas.active_layer.update_texture() + + +func update_text_info(): + var text = "" + + var cell_color_text = cell_color + cell_color_text = Color(0, 0, 0, 0) + + text += \ + str("FPS %s\t" + \ + "Mouse Position %s\t" + \ + "Canvas Mouse Position %s \t" + \ + "Canvas Position %s\t\n" + \ + "Cell Position %s \t" + \ + "Cell Color %s\t" + \ + "inside canvas %s\t") % [ + str(Engine.get_frames_per_second()), + str(mouse_position), + str(canvas_mouse_position), + str(canvas_position), + str(cell_mouse_position), + str(cell_color_text), + str(is_mouse_in_canvas()) + ] + + + debug_text.display_text(text) + + +func _on_Save_pressed(): + get_node("SaveFileDialog").show() + + + +################################################## +# Actions +################################################## + +func do_action(data: Array): + if _current_action == null: + #print("clear redo") + _redo_history.clear() + _current_action.do_action(paint_canvas, data) + + +func commit_action(): + if not _current_action: + return + + var commit_data = _current_action.commit_action(paint_canvas) + var action = get_action() + action.action_data = _current_action.action_data.duplicate(true) + _actions_history.push_back(action) + _redo_history.clear() + + match brush_mode: + Tools.CUT: + _cut_pos = _current_action.mouse_start_pos + _cut_size = _current_action.mouse_end_pos - _current_action.mouse_start_pos + _selection_cells = _current_action.action_data.redo.cells.duplicate() + _selection_colors = _current_action.action_data.redo.colors.duplicate() + set_tool(Tools.PASTECUT) + _: + _current_action = null + + +func redo_action(): + if _redo_history.empty(): + print("Godoxel: Nothing to redo.") + return + var action = _redo_history.pop_back() + if not action: + return + _actions_history.append(action) + action.redo_action(paint_canvas) + paint_canvas.update() + print("Godoxel: redo.") + + +func undo_action(): + var action = _actions_history.pop_back() + if not action: + print("Godoxel: Nothing to undo.") + return + _redo_history.append(action) + action.undo_action(paint_canvas) + update() + paint_canvas.update() + print("Godoxel: undo.") + + +func get_action(): + match brush_mode: + Tools.PAINT: + return GEPencil.new() + Tools.BRUSH: + return GEBrush.new() + Tools.LINE: + return GELine.new() + Tools.RAINBOW: + return GERainbow.new() + Tools.BUCKET: + return GEBucket.new() + Tools.RECT: + return GERect.new() + Tools.DARKEN: + return GEDarken.new() + Tools.BRIGHTEN: + return GEBrighten.new() + Tools.CUT: + return GECut.new() + Tools.PASTECUT: + return GEPasteCut.new() + _: + #print("no tool!") + return null + + + +############################################ +# Brushes +############################################ + +func set_selected_color(color): + selected_color = color + + +func set_tool(new_mode): + if brush_mode == new_mode: + return + _previous_tool = brush_mode + brush_mode = new_mode + + _current_action = get_action() + + match _previous_tool: + Tools.CUT: + paint_canvas.clear_preview_layer() + Tools.PASTECUT: + _selection_cells.clear() + _selection_colors.clear() + Tools.BUCKET: + _current_action = null + #print("Selected: ", Tools.keys()[brush_mode]) + + +func change_color(new_color): + if new_color.a == 0: + return + selected_color = new_color + color_picker_button.color = selected_color + + +func _on_ColorPicker_color_changed(color): + selected_color = color + + +func _on_PaintTool_pressed(): + set_tool(Tools.PAINT) + + +func _on_BucketTool_pressed(): + set_tool(Tools.BUCKET) + + +func _on_RainbowTool_pressed(): + set_tool(Tools.RAINBOW) + + +func _on_BrushTool_pressed(): + set_tool(Tools.BRUSH) + + +func _on_LineTool_pressed(): + set_tool(Tools.LINE) + + +func _on_RectTool_pressed(): + set_tool(Tools.RECT) + + +func _on_DarkenTool_pressed(): + set_tool(Tools.DARKEN) + + +func _on_BrightenTool_pressed(): + set_tool(Tools.BRIGHTEN) + + +func _on_ColorPickerTool_pressed(): + set_tool(Tools.COLORPICKER) + + +func _on_CutTool_pressed(): + set_tool(Tools.CUT) + + +func _on_Editor_visibility_changed(): + pause_mode = not visible + + + +############################################ +# Preview +############################################ + +func _adjust_preview_layer_size(): + _preview_scale = max_preview_scale + _on_canvas_resized() + var width = paint_canvas.canvas_width + var height = paint_canvas.canvas_height + + while _preview_scale > min_preview_scale: + if width * _preview_scale < preview_layer_textures.rect_size.x: + break + set_preview_scale(_preview_scale / 2) + + while _preview_scale > min_preview_scale: + if height * _preview_scale < preview_layer_textures.rect_size.y: + break + set_preview_scale(_preview_scale / 2) + + _update_preview_layers_size() + + +const max_preview_scale = pow(2, 10) +const min_preview_scale = pow(0.5, 10) + +func set_preview_scale(new_scale: float): + _preview_scale = clamp(new_scale, min_preview_scale, max_preview_scale) + + +func _update_preview_layers_size(): + for child in preview_layer_textures.get_children(): + child.rect_scale.x = _preview_scale + child.rect_scale.y = _preview_scale + _center_element(child) + preview_window.set_title(str("Preview (x", _preview_scale, ")")) + + +func _add_preview_layer(): + var preview_texture = TextureRect.new() + preview_texture.expand = false + preview_texture.mouse_filter = Control.MOUSE_FILTER_IGNORE + + preview_layer_textures.add_child(preview_texture) + preview_texture.owner = owner + preview_texture.set_anchors_preset(Control.PRESET_CENTER) + + _adjust_preview_layer_size() + + +# only updates preview atm +func _on_canvas_resized(): + if not paint_canvas.frame: + return + for idx in range(preview_layer_textures.get_child_count()): + preview_layer_textures.get_child(idx).texture = paint_canvas.frame.layers[idx].texture + _center_element(preview_layer_textures.get_child(idx)) + + +func _center_element(element: Control): + var width = element.get_rect().size.x / 2 + var height = element.get_rect().size.y / 2 + element.margin_left = -width + element.margin_top = -height + element.margin_right = width + element.margin_bottom = height + + + +############################################ +# Layer +############################################ + + +func get_layer_count(): + return _total_added_layers + + +func get_layer_name(index: int): + return layer_buttons.get_child(index).name + + +func resize(width: int, height: int): + paint_canvas.resize(width, height) + + for anim in animations: + for frame in anim.frames: + frame.resize(width, height) + + _adjust_preview_layer_size() + + +func highlight_layer(layer_name: String): + if animations.empty() or animations[0].frames.empty(): + return + for button in layer_buttons.get_children(): + if paint_canvas.find_layer_by_name(button.name).locked: + button.get("custom_styles/panel").set("bg_color", locked_layer_highlight) + elif button.name == layer_name: + button.get("custom_styles/panel").set("bg_color", current_layer_highlight) + else: + button.get("custom_styles/panel").set("bg_color", other_layer_highlight) + + +func toggle_layer_visibility(button, layer_name: String): + var index = paint_canvas.get_layer_index(layer_name) + preview_layer_textures.get_child(index).visible = paint_canvas.toggle_layer_visibility(layer_name) + + for anim_stripe in anim_panel.anim_button_container.get_children(): + for frame_button in anim_stripe.frame_button_container.get_children(): + frame_button.set_layer_visibility(index, preview_layer_textures.get_child(index).visible) + frame_button.update_preview() + + _update_frame_button_previews() + + +func select_layer(layer_button): + current_layer_idx = layer_button.get_index() + var layer = paint_canvas.find_layer_by_name(layer_button.name) + paint_canvas.select_layer(layer) + highlight_layer(layer_button.name) + + +func lock_layer(button, layer_name: String): + paint_canvas.toggle_lock_layer(layer_name) + highlight_layer(paint_canvas.get_active_layer().name) + + +func _add_layer_button(): + var layer_button = LayerButton.instance() + layer_buttons.add_child(layer_button, true) + _total_added_layers += 1 + layer_button.find_node("Select").text = "Layer " + str(get_layer_count()) + _layer_button_ref[layer_button.name] = layer_button + _connect_layer_buttons() + return layer_button + + +func _create_layer(layer_name: String, width: int, height: int): + var layer: GELayer = GELayer.new() + layer.name = layer_name + var texture_rect = TextureRect.new() + texture_rect.expand = true + texture_rect.anchor_right = 1 + texture_rect.anchor_bottom = 1 + texture_rect.margin_right = 0 + texture_rect.margin_bottom = 0 + texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + layer.create(texture_rect, width, height) + return layer + + +func add_new_layer(): + var layer_button = _add_layer_button() + + for anim in animations: + for frame in anim.frames: + var layer: GELayer = _create_layer(layer_button.name, + paint_canvas.canvas_width, paint_canvas.canvas_height) + frame.add_frame_layer(layer) + + _add_preview_layer() + + if current_frame: + preview_window.update_preview(current_frame) + paint_canvas.set_frame(current_frame) + highlight_layer(paint_canvas.get_active_layer().name) + + _update_frame_button_previews() + + +func duplicate_active_layer(): + var layer_button = _add_layer_button() + for anim in animations: + for frame in anim.frames: + var new_layer: GELayer = _create_layer(layer_button.name, + paint_canvas.canvas_width, paint_canvas.canvas_height) + new_layer.copy_from(frame.layers[paint_canvas.get_active_layer_index()]) + frame.add_frame_layer(new_layer) + new_layer.update_texture() + + _add_preview_layer() + + if current_frame: + preview_window.update_preview(current_frame) + paint_canvas.set_frame(current_frame) + + # update highlight + highlight_layer(paint_canvas.get_active_layer().name) + _update_frame_button_previews() + + +func remove_active_layer(): + if layer_buttons.get_child_count() <= 1: + return + var layer_name = paint_canvas.active_layer.name + var index = paint_canvas.get_layer_index(paint_canvas.active_layer.name) + paint_canvas.remove_layer(layer_name) + layer_buttons.remove_child(_layer_button_ref[layer_name]) + _layer_button_ref[layer_name].queue_free() + _layer_button_ref.erase(layer_name) + + var preview_layer = preview_layer_textures.get_child(index) + preview_layer.remove_child(preview_layer) + preview_layer.queue_free() + + _update_frame_button_previews() + + highlight_layer(paint_canvas.get_active_layer().name) + + +func move_up(layer_btn): + var index = layer_btn.get_index() + var new_idx = min(index + 1, layer_buttons.get_child_count() - 1) + if index == new_idx: + return + + # layer buttons + layer_buttons.move_child(layer_btn, new_idx) + # canvas + paint_canvas.move_layer_forward(layer_btn.name) + # preview window + preview_layer_textures.move_child(preview_layer_textures.get_child(index), new_idx) + # Frame previews + for anim_idx in range(animations.size()): + var anim = animations[anim_idx] + for frame_idx in range(anim.frames.size()): + var frame = anim.frames[frame_idx] + var layer = frame.layers[index] + frame.layers.remove(index) + frame.layers.insert(new_idx, layer) + anim_panel.set_frame_preview(anim_idx, frame_idx, frame) + + _update_frame_button_previews() + + +func move_down(layer_btn): + var index = layer_btn.get_index() + var new_idx = max(index - 1, 0) + if index == new_idx: + return + + # layer buttons + layer_buttons.move_child(layer_btn, new_idx) + # canvas + paint_canvas.move_layer_forward(layer_btn.name) + # preview window + preview_layer_textures.move_child(preview_layer_textures.get_child(index), new_idx) + # Frame previews + for anim_idx in range(animations.size()): + var anim = animations[anim_idx] + for frame_idx in range(anim.frames.size()): + var frame = anim.frames[frame_idx] + var layer = frame.layers[index] + frame.layers.remove(index) + frame.layers.insert(new_idx, layer) + anim_panel.set_frame_preview(anim_idx, frame_idx, frame) + + _update_frame_button_previews() + + +func _connect_layer_buttons(): + for layer_btn in layer_buttons.get_children(): + if layer_btn.find_node("Select").is_connected("pressed", self, "select_layer"): + continue + layer_btn.find_node("Select").connect("pressed", self, "select_layer", [layer_btn]) + layer_btn.find_node("Visible").connect("pressed", self, "toggle_layer_visibility", + [layer_btn.find_node("Visible"), layer_btn.name]) + layer_btn.find_node("Up").connect("pressed", self, "move_down", [layer_btn]) + layer_btn.find_node("Down").connect("pressed", self, "move_up", [layer_btn]) + layer_btn.find_node("Lock").connect("pressed", self, "lock_layer", + [layer_btn, layer_btn.name]) + + +func _on_AddNewLayer_pressed(): + add_new_layer() + #_update_frame_button_previews() + + +func _update_frame_button_previews(): + for anim_stripe in anim_panel.anim_button_container.get_children(): + for frame_button in anim_stripe.frame_button_container.get_children(): + frame_button.update_preview() + + +func _on_PaintCanvasContainer_mouse_entered(): + if mouse_on_top: + return + mouse_on_top = true + paint_canvas.tool_layer.clear() + paint_canvas.update() + paint_canvas.tool_layer.update_texture() + + +func _on_PaintCanvasContainer_mouse_exited(): + if not mouse_on_top: + return + mouse_on_top = false + paint_canvas.tool_layer.clear() + paint_canvas.update() + paint_canvas.tool_layer.update_texture() + + +func _on_ColorPicker_popup_closed(): + find_node("Colors").add_color_prefab(color_picker_button.color) + + + +############################################ +# MISC +############################################ + +func is_position_in_canvas(pos): + if control_has_point(left_panel, pos): + return false + if control_has_point(right_panel, pos): + return false + if control_has_point(preview_window, pos): + return false + + return control_has_point(paint_canvas_container_node, pos) + + +func control_has_point(control, point) -> bool: + if not control.visible: + return false + return Rect2(control.rect_global_position, control.rect_size).has_point(point) + + +func is_mouse_in_canvas() -> bool: + return is_position_in_canvas(get_global_mouse_position()) + + +func is_mouse_in_preview_window() -> bool: + return control_has_point(preview_window, get_global_mouse_position()) + + +func is_any_menu_open() -> bool: + return $ChangeCanvasSize.visible or \ + $ChangeGridSizeDialog.visible or \ + $Settings.visible or \ + $LoadFileDialog.visible or \ + $SaveFileDialog.visible or \ + find_node("Navbar").is_any_menu_open() + + +func _on_LockAlpha_pressed(): + var checked = find_node("LockAlpha").pressed + paint_canvas.active_layer.toggle_alpha_locked() + for i in range(find_node("Layer").get_popup().get_item_count()): + if find_node("Layer").get_popup().get_item_text(i) == "Toggle Alpha Locked": + find_node("Layer").get_popup().set_item_checked(i, + not find_node("Layer").get_popup().is_item_checked(i)) + + +func _on_BrushRect_pressed(): + if brush_mode != Tools.BRUSH: + set_tool(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.RECT + + +func _on_BrushCircle_pressed(): + if brush_mode != Tools.BRUSH: + set_tool(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.CIRCLE + + +func _on_BrushVLine_pressed(): + if brush_mode != Tools.BRUSH: + set_tool(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.V_LINE + + +func _on_BrushHLine_pressed(): + if brush_mode != Tools.BRUSH: + set_tool(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.H_LINE + + +func _on_BrushSize_value_changed(value: float): + find_node("BrushSizeLabel").text = str(int(value)) + + +func _on_XSymmetry_pressed(): + paint_canvas.symmetry_x = not paint_canvas.symmetry_x + + +func _on_YSymmetry_pressed(): + paint_canvas.symmetry_y = not paint_canvas.symmetry_y diff --git a/addons/Godoxel/Editor.tscn b/addons/Godoxel/Editor.tscn new file mode 100644 index 0000000..7b654bf --- /dev/null +++ b/addons/Godoxel/Editor.tscn @@ -0,0 +1,1309 @@ +[gd_scene load_steps=60 format=2] + +[ext_resource path="res://addons/Godoxel/Editor.gd" type="Script" id=1] +[ext_resource path="res://addons/Godoxel/dialogs/LoadFileDialog.gd" type="Script" id=2] +[ext_resource path="res://addons/Godoxel/Canvas.gd" type="Script" id=3] +[ext_resource path="res://addons/Godoxel/VisualGrid.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/Godoxel/CanvasOutline.gd" type="Script" id=5] +[ext_resource path="res://addons/Godoxel/Navbar.gd" type="Script" id=6] +[ext_resource path="res://addons/Godoxel/MenuButtonExtended.gd" type="Script" id=7] +[ext_resource path="res://addons/Godoxel/Colors.gd" type="Script" id=8] +[ext_resource path="res://addons/Godoxel/SaveFileDialog.gd" type="Script" id=9] +[ext_resource path="res://addons/Godoxel/Settings.tscn" type="PackedScene" id=10] +[ext_resource path="res://addons/Godoxel/DebugTextDisplay.gd" type="Script" id=11] +[ext_resource path="res://addons/Godoxel/assets/grid.png" type="Texture" id=13] +[ext_resource path="res://addons/Godoxel/PreviewWindow.gd" type="Script" id=14] +[ext_resource path="res://addons/Godoxel/dialogs/ChangeGridSizeDialog.gd" type="Script" id=15] +[ext_resource path="res://addons/Godoxel/assets/BrushVLine.png" type="Texture" id=16] +[ext_resource path="res://addons/Godoxel/assets/BrushRect.png" type="Texture" id=17] +[ext_resource path="res://addons/Godoxel/assets/BrushCircle.png" type="Texture" id=18] +[ext_resource path="res://addons/Godoxel/assets/BrushHLine.png" type="Texture" id=19] +[ext_resource path="res://addons/Godoxel/assets/BrushRect_Hovered.png" type="Texture" id=20] +[ext_resource path="res://addons/Godoxel/assets/BrushCircle_Hovered.png" type="Texture" id=21] +[ext_resource path="res://addons/Godoxel/assets/BrushVLine_Hovered.png" type="Texture" id=22] +[ext_resource path="res://addons/Godoxel/assets/BrushHLine_Hovered.png" type="Texture" id=23] +[ext_resource path="res://addons/Godoxel/dialogs/DraggableWindow.tscn" type="PackedScene" id=24] +[ext_resource path="res://addons/Godoxel/dialogs/ChangeCanvasDialog.gd" type="Script" id=25] +[ext_resource path="res://addons/Godoxel/components/ShortcutWindow.tscn" type="PackedScene" id=26] +[ext_resource path="res://addons/Godoxel/components/AnimationPanel.tscn" type="PackedScene" id=27] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.14902, 0.172549, 0.231373, 1 ) + +[sub_resource type="Shader" id=2] +code = "shader_type canvas_item; + +uniform float pixel_size : hint_range(0.01, 1.0); + + +void fragment() { + vec4 color = texture(TEXTURE, UV); + + float light = 0.8; + float dark = 0.4; + + float val = dark; + + if ( int(UV.y * 8.0 * pixel_size) % 2 == 1 ) { + if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) { + val = dark; + } + else { + val = light; + } + } + else { + if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) { + val = light; + } + else { + val = dark; + } + } + + color.rgb = vec3(val, val, val); + + COLOR = color; +}" + +[sub_resource type="ShaderMaterial" id=3] +shader = SubResource( 2 ) +shader_param/pixel_size = 0.125 + +[sub_resource type="Image" id=62] +data = { +"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=35] +flags = 0 +flags = 0 +image = SubResource( 62 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=63] +data = { +"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=37] +flags = 0 +flags = 0 +image = SubResource( 63 ) +size = Vector2( 64, 64 ) + +[sub_resource type="StyleBoxFlat" id=8] +bg_color = Color( 0.12549, 0.141176, 0.192157, 0.792157 ) + +[sub_resource type="StyleBoxFlat" id=38] +bg_color = Color( 0.832851, 0.34549, 0.232149, 1 ) + +[sub_resource type="StyleBoxFlat" id=39] +bg_color = Color( 0.270873, 0.550955, 0.493098, 1 ) + +[sub_resource type="StyleBoxFlat" id=40] +bg_color = Color( 0.836322, 0.920572, 0.395286, 1 ) + +[sub_resource type="StyleBoxFlat" id=41] +bg_color = Color( 0.306443, 0.405122, 0.767277, 1 ) + +[sub_resource type="StyleBoxFlat" id=42] +bg_color = Color( 0.890179, 0.0747555, 0.914933, 1 ) + +[sub_resource type="StyleBoxFlat" id=43] +bg_color = Color( 0.810691, 0.535597, 0.0676325, 1 ) + +[sub_resource type="StyleBoxFlat" id=44] +bg_color = Color( 0.199354, 0.367441, 0.643453, 1 ) + +[sub_resource type="StyleBoxFlat" id=45] +bg_color = Color( 0.954982, 0.106064, 0.902508, 1 ) + +[sub_resource type="StyleBoxFlat" id=46] +bg_color = Color( 0.732566, 0.707789, 0.17506, 1 ) + +[sub_resource type="StyleBoxFlat" id=47] +bg_color = Color( 0.270643, 0.479343, 0.77945, 1 ) + +[sub_resource type="StyleBoxFlat" id=48] +bg_color = Color( 0.568264, 0.643972, 0.774615, 1 ) + +[sub_resource type="StyleBoxFlat" id=49] +bg_color = Color( 0.00528907, 0.238746, 0.495341, 1 ) + +[sub_resource type="StyleBoxFlat" id=50] +bg_color = Color( 0.854929, 0.096905, 0.750924, 1 ) + +[sub_resource type="StyleBoxFlat" id=51] +bg_color = Color( 0.128049, 0.0938824, 0.463044, 1 ) + +[sub_resource type="StyleBoxFlat" id=52] +bg_color = Color( 0.777614, 0.713933, 0.113727, 1 ) + +[sub_resource type="StyleBoxFlat" id=53] +bg_color = Color( 0.145854, 0.296341, 0.370148, 1 ) + +[sub_resource type="StyleBoxFlat" id=54] +bg_color = Color( 0.255997, 0.877668, 0.774858, 1 ) + +[sub_resource type="StyleBoxFlat" id=55] +bg_color = Color( 0.406142, 0.348892, 0.208062, 1 ) + +[sub_resource type="StyleBoxFlat" id=56] +bg_color = Color( 0.757542, 0.337039, 0.256694, 1 ) + +[sub_resource type="StyleBoxFlat" id=57] +bg_color = Color( 0.838079, 0.501353, 0.0603895, 1 ) + +[sub_resource type="StyleBoxFlat" id=58] +bg_color = Color( 0.610624, 0.706239, 0.920417, 1 ) + +[sub_resource type="StyleBoxFlat" id=59] +bg_color = Color( 0.627376, 0.0700438, 0.522361, 1 ) + +[sub_resource type="StyleBoxFlat" id=60] +bg_color = Color( 0.055693, 0.90498, 0.768635, 1 ) + +[sub_resource type="StyleBoxFlat" id=61] +bg_color = Color( 0.940186, 0.101324, 0.499248, 1 ) + +[sub_resource type="StyleBoxFlat" id=33] +bg_color = Color( 0.180392, 0.2, 0.243137, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color( 0.12549, 0.141176, 0.192157, 1 ) + +[node name="Editor" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_clip_content = true +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Panel" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_styles/panel = SubResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NoBCViewportsnotworking26181" type="Control" parent="Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "https://github.com/godotengine/godot/issues/26181" +} + +[node name="Control" type="Control" parent="Panel/NoBCViewportsnotworking26181"] +anchor_top = 0.0833333 +anchor_right = 1.0 +anchor_bottom = 0.918 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PaintCanvasContainer" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_clip_content = true +focus_mode = 1 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 6.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Canvas" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -128.0 +margin_top = -128.0 +margin_right = 128.0 +margin_bottom = 128.0 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 3 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} +pixel_size = 4.0 +canvas_width = 64 +canvas_height = 64 +grid_size = 1 +big_grid_size = 8 + +[node name="CanvasBackground" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +show_behind_parent = true +material = SubResource( 3 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 13 ) +expand = true +stretch_mode = 2 +__meta__ = { +"_edit_lock_": true +} + +[node name="CanvasLayers" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="PreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +texture = SubResource( 35 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToolPreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +texture = SubResource( 37 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Grid" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas" instance=ExtResource( 4 )] +mouse_filter = 2 +color = Color( 1, 1, 1, 0.415686 ) +size = 4 + +[node name="CanvasOutline" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 5 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} +color = Color( 0, 1, 0, 1 ) + +[node name="RightPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 8 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 4.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToolMenu" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer"] +margin_right = 132.0 +margin_bottom = 592.96 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Tools" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"] +margin_right = 132.0 +margin_bottom = 294.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PaintTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_right = 132.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Pencil" + +[node name="BrushTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +visible = false +margin_top = 24.0 +margin_right = 132.0 +margin_bottom = 44.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Brush" + +[node name="MultiTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +visible = false +margin_top = 24.0 +margin_right = 132.0 +margin_bottom = 44.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Polygon" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BucketTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 29.0 +margin_right = 132.0 +margin_bottom = 55.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Bucket Fill" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RainbowTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 59.0 +margin_right = 132.0 +margin_bottom = 85.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Rainbow" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 89.0 +margin_right = 132.0 +margin_bottom = 115.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Line" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RectTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 119.0 +margin_right = 132.0 +margin_bottom = 144.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Rectangle" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DarkenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 148.0 +margin_right = 132.0 +margin_bottom = 174.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Darken" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BrightenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 178.0 +margin_right = 132.0 +margin_bottom = 204.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Brighten" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorPickerTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 208.0 +margin_right = 132.0 +margin_bottom = 234.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Color Picker" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CutTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 238.0 +margin_right = 132.0 +margin_bottom = 264.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Cut Section" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorPicker" type="ColorPickerButton" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 268.0 +margin_right = 132.0 +margin_bottom = 294.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Control" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"] +margin_top = 298.0 +margin_right = 132.0 +margin_bottom = 592.0 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control"] +margin_right = 132.0 +margin_bottom = 294.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="LayerButtons" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"] +margin_right = 132.0 +margin_bottom = 265.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AddNewLayer" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"] +margin_top = 269.0 +margin_right = 132.0 +margin_bottom = 294.0 +rect_min_size = Vector2( 0, 25 ) +size_flags_horizontal = 3 +text = "+" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LeftPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_right = 0.0166016 +anchor_bottom = 0.824803 +margin_right = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 8 ) +__meta__ = { +"_edit_use_anchors_": true, +"_editor_description_": "" +} + +[node name="MarginContainer" type="MarginContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer"] +margin_right = 161.0 +margin_bottom = 495.0 +custom_constants/separation = 12 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_right = 161.0 +margin_bottom = 144.0 +rect_min_size = Vector2( 0, 144 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Colors" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer"] +margin_right = 149.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 0, 144 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 4 +script = ExtResource( 8 ) + +[node name="Button1" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_right = 34.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 38 ) + +[node name="Button2" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_right = 72.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 39 ) + +[node name="Button3" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_right = 110.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 40 ) + +[node name="Button4" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_right = 148.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 41 ) + +[node name="Button5" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 29.0 +margin_right = 34.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 42 ) + +[node name="Button6" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_top = 29.0 +margin_right = 72.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 43 ) + +[node name="Button7" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_top = 29.0 +margin_right = 110.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 44 ) + +[node name="Button8" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_top = 29.0 +margin_right = 148.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 45 ) + +[node name="Button9" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 58.0 +margin_right = 34.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 46 ) + +[node name="Button10" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_top = 58.0 +margin_right = 72.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 47 ) + +[node name="Button11" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_top = 58.0 +margin_right = 110.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 48 ) + +[node name="Button12" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_top = 58.0 +margin_right = 148.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 49 ) + +[node name="Button13" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 87.0 +margin_right = 34.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 50 ) + +[node name="Button14" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_top = 87.0 +margin_right = 72.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 51 ) + +[node name="Button15" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_top = 87.0 +margin_right = 110.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 52 ) + +[node name="Button16" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_top = 87.0 +margin_right = 148.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 53 ) + +[node name="Button17" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 116.0 +margin_right = 34.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 54 ) + +[node name="Button18" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_top = 116.0 +margin_right = 72.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 55 ) + +[node name="Button19" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_top = 116.0 +margin_right = 110.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 56 ) + +[node name="Button20" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_top = 116.0 +margin_right = 148.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 57 ) + +[node name="Button21" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 145.0 +margin_right = 34.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 58 ) + +[node name="Button22" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 38.0 +margin_top = 145.0 +margin_right = 72.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 59 ) + +[node name="Button23" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 76.0 +margin_top = 145.0 +margin_right = 110.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 60 ) + +[node name="Button24" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 114.0 +margin_top = 145.0 +margin_right = 148.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 61 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 156.0 +margin_right = 161.0 +margin_bottom = 196.0 + +[node name="LockAlpha" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer"] +margin_right = 161.0 +margin_bottom = 40.0 +text = "Lock Alpha" +align = 2 + +[node name="BrushSelection" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 208.0 +margin_right = 161.0 +margin_bottom = 233.0 +columns = 4 + +[node name="BrushRect" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_right = 25.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 17 ) +texture_hover = ExtResource( 20 ) + +[node name="BrushCircle" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 29.0 +margin_right = 54.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 18 ) +texture_hover = ExtResource( 21 ) + +[node name="BrushVLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 58.0 +margin_right = 83.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 16 ) +texture_hover = ExtResource( 22 ) + +[node name="BrushHLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 87.0 +margin_right = 112.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 19 ) +texture_hover = ExtResource( 23 ) + +[node name="VSplitContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 245.0 +margin_right = 161.0 +margin_bottom = 279.0 +size_flags_horizontal = 3 + +[node name="BrushLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"] +margin_right = 161.0 +margin_bottom = 14.0 +text = "Brush Size" + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"] +margin_top = 18.0 +margin_right = 161.0 +margin_bottom = 34.0 + +[node name="BrushSizeLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"] +margin_top = 1.0 +margin_right = 30.0 +margin_bottom = 15.0 +rect_min_size = Vector2( 30, 0 ) +text = "1" + +[node name="BrushSize" type="HSlider" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"] +margin_left = 34.0 +margin_right = 161.0 +margin_bottom = 16.0 +size_flags_horizontal = 3 +size_flags_vertical = 2 +min_value = 1.0 +value = 1.0 + +[node name="XSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 291.0 +margin_right = 161.0 +margin_bottom = 331.0 +text = "X Symmetry" + +[node name="YSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 343.0 +margin_right = 161.0 +margin_bottom = 383.0 +text = "Y Symmetry" + +[node name="PreviewWindow" parent="Panel/NoBCViewportsnotworking26181/Control" instance=ExtResource( 24 )] +visible = true +anchor_left = 1.0 +anchor_top = 0.762 +anchor_right = 1.0 +anchor_bottom = 0.762 +margin_left = -361.0 +margin_top = -0.0960083 +margin_right = -145.003 +margin_bottom = 159.904 +script = ExtResource( 14 ) +show_ok_cancel = false +show_close = false +title = "Preview (x2)" + +[node name="PreviewLayerTextures" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PreviewWindow"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 5.0 +margin_top = 25.0 +margin_right = -5.0 +margin_bottom = -5.0 +rect_clip_content = true +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="ShortcutWindow" parent="Panel/NoBCViewportsnotworking26181/Control" instance=ExtResource( 26 )] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -175.0 +margin_top = -154.0 +margin_right = 175.0 +margin_bottom = 154.0 + +[node name="Navbar" type="Control" parent="Panel/NoBCViewportsnotworking26181"] +anchor_right = 1.0 +anchor_bottom = 0.0833333 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Panel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +self_modulate = Color( 0.854902, 0.854902, 0.854902, 1 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Buttons" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +anchor_left = 0.0078125 +anchor_top = 0.12 +anchor_right = 0.628906 +anchor_bottom = 0.62 +custom_constants/separation = 20 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="File" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_right = 81.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "File" +flat = false +items = [ "New Project", null, 0, false, false, 0, 0, null, "", false, "Save Project", null, 0, false, false, 1, 0, null, "", false, "Load Project", null, 0, false, false, 2, 0, null, "", false, "Recent Sessions...", null, 0, false, true, 3, 0, null, "", false, "", null, 0, false, false, 4, 0, null, "", true, "Export (PNG)", null, 0, false, false, 5, 0, null, "", false, "Export Frame", null, 0, false, false, 6, 0, null, "", false, "Export Layer", null, 0, false, false, 7, 0, null, "", false, "Export Selection", null, 0, false, true, 8, 0, null, "", false, "", null, 0, false, false, 9, 0, null, "", true, "Import (PNG)", null, 0, false, false, 10, 0, null, "", false, "Recent Images...", null, 0, false, true, 11, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Edit" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 101.0 +margin_right = 183.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +disabled = true +text = "Edit" +flat = false +items = [ "Undo", null, 0, false, false, 0, 0, null, "", false, "Redo", null, 0, false, false, 1, 0, null, "", false, "Cut", null, 0, false, false, 2, 0, null, "", false, "Copy", null, 0, false, false, 3, 0, null, "", false, "Paste", null, 0, false, false, 4, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Canvas" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 203.0 +margin_right = 285.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Canvas" +flat = false +items = [ "Change Size", null, 0, false, false, 0, 0, null, "", false, "Crop To Content", null, 0, false, true, 1, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Layer" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 305.0 +margin_right = 387.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Layer" +flat = false +items = [ "Add Layer", null, 0, false, false, 0, 0, null, "", false, "Delete Layer", null, 0, false, false, 1, 0, null, "", false, "Duplicate Layer", null, 0, false, false, 2, 0, null, "", false, "Clear Layer", null, 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, 4, 0, null, "", true, "Toggle Alpha Locked", null, 1, false, false, 5, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Frame" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 407.0 +margin_right = 488.0 +margin_bottom = 29.0 +focus_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Frame" +flat = false +items = [ "Add Frame", null, 0, false, false, 0, 0, null, "", false, "Delete Frame", null, 0, false, false, 1, 0, null, "", false, "Duplicate Frame", null, 0, false, true, 2, 0, null, "", false, "Clear Frame Layers", null, 0, false, true, 3, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="Grid" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 508.0 +margin_right = 590.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Grid" +flat = false +items = [ "Toggle Grid", null, 0, false, false, 0, 0, null, "", false, "Change Grid Size", null, 0, false, false, 1, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Magic" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 610.0 +margin_right = 692.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +disabled = true +text = "Magic" +flat = false +items = [ "ChangeSingleColor", null, 0, false, false, 0, 0, null, "", false, "ChangeColorRange", null, 0, false, false, 1, 0, null, "", false, "HSV Noise", null, 0, false, false, 2, 0, null, "", false, "HSV Color Modulation", null, 0, false, false, 3, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Editor" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 712.0 +margin_right = 794.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Editor" +flat = false +items = [ "Settings", null, 0, false, false, 0, 0, null, "", false, "", null, 0, false, true, 1, 0, null, "", true, "Show Preview", null, 1, true, false, 2, 0, null, "", false, "Show Animation Panel", null, 1, true, false, 3, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Modes" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +visible = false +anchor_left = 0.904297 +anchor_top = 11.16 +anchor_right = 0.943359 +anchor_bottom = 11.96 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Draw" type="Button" parent="Panel/NoBCViewportsnotworking26181/Navbar/Modes"] +margin_right = 12.0 +margin_bottom = 48.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FrameEdit" type="Button" parent="Panel/NoBCViewportsnotworking26181/Navbar/Modes"] +margin_left = 16.0 +margin_right = 28.0 +margin_bottom = 48.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +modulate = Color( 1, 1, 1, 0.184314 ) +anchor_left = 0.682 +anchor_right = 0.865 +anchor_bottom = 0.88 +margin_left = -0.368042 +margin_top = 6.0 +margin_right = 0.239929 +margin_bottom = 1.52588e-05 +text = "Shortcut Menu (Shift + )" +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" type="Label" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +modulate = Color( 1, 1, 1, 0.184314 ) +anchor_left = 0.887 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -0.288025 +margin_bottom = 1.90735e-05 +text = "Undo (Ctrl + Z) +Redo (Ctrl + Y)" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPanel" parent="Panel/NoBCViewportsnotworking26181" instance=ExtResource( 27 )] +anchor_left = 0.003125 +anchor_top = 0.786111 +anchor_right = 0.633594 +anchor_bottom = 0.994444 +margin_right = -0.000305176 +margin_bottom = 0.000305176 + +[node name="DebugPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181"] +visible = false +anchor_top = 0.913333 +anchor_right = 0.642578 +anchor_bottom = 0.998333 +rect_min_size = Vector2( 0, 40 ) +size_flags_horizontal = 3 +custom_styles/panel = SubResource( 33 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": true +} + +[node name="DebugTextDisplay" type="RichTextLabel" parent="Panel/NoBCViewportsnotworking26181/DebugPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +text = "FPS 60 Mouse Position (1508.907471, -64.579575) Canvas Mouse Position (996.907471, -297.059509) Canvas Position (512, 232.47995) +Cell Position (142, 4) Cell Color 0,0,0,0 inside canvas False " +scroll_active = false +script = ExtResource( 11 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SaveFileDialog" type="FileDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -340.0 +margin_top = -165.0 +margin_right = 340.0 +margin_bottom = 165.0 +mouse_filter = 1 +filters = PoolStringArray( "*.png ; PNG Images" ) +script = ExtResource( 9 ) + +[node name="LoadFileDialog" type="FileDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -340.0 +margin_top = -165.0 +margin_right = 340.0 +margin_bottom = 165.0 +mouse_filter = 1 +window_title = "Open a File" +mode = 0 +filters = PoolStringArray( "*.png ; PNG Images" ) +script = ExtResource( 2 ) + +[node name="Settings" parent="." instance=ExtResource( 10 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -150.0 +margin_top = -50.0 +margin_right = 150.0 +margin_bottom = 50.0 +mouse_filter = 1 + +[node name="ChangeCanvasSize" parent="." instance=ExtResource( 24 )] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -125.5 +margin_top = -70.0 +margin_right = 125.5 +margin_bottom = 70.0 +script = ExtResource( 25 ) +title = "Change Canvas Size?" + +[node name="ChangeGridSizeDialog" type="AcceptDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -127.0 +margin_top = -74.0 +margin_right = 128.0 +margin_bottom = 73.0 +window_title = "Change Grid Size" +resizable = true +script = ExtResource( 15 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ChangeGridSizeDialog"] +anchor_left = 0.0313726 +anchor_top = 0.0816327 +anchor_right = 0.968627 +anchor_bottom = 0.727891 +margin_left = -1.23978e-05 +margin_top = -4.00001 +margin_right = 0.00012207 +margin_bottom = 4.00002 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_right = 239.0 +margin_bottom = 31.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Change Grid Size" +align = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_top = 35.0 +margin_right = 239.0 +margin_bottom = 67.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"] +margin_top = 9.0 +margin_right = 117.0 +margin_bottom = 23.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Grid 1" + +[node name="GridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"] +margin_left = 121.0 +margin_top = 4.0 +margin_right = 239.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +max_value = 2500.0 +value = 1.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_top = 71.0 +margin_right = 239.0 +margin_bottom = 103.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"] +margin_top = 9.0 +margin_right = 117.0 +margin_bottom = 23.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Grid 2" + +[node name="BigGridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"] +margin_left = 121.0 +margin_top = 4.0 +margin_right = 239.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +max_value = 2500.0 +value = 8.0 + +[connection signal="mouse_entered" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_entered"] +[connection signal="mouse_exited" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_exited"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/PaintTool" to="." method="_on_PaintTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrushTool" to="." method="_on_BrushTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/MultiTool" to="." method="_on_MultiTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BucketTool" to="." method="_on_BucketTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RainbowTool" to="." method="_on_RainbowTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/LineTool" to="." method="_on_LineTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RectTool" to="." method="_on_RectTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/DarkenTool" to="." method="_on_DarkenTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrightenTool" to="." method="_on_BrightenTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPickerTool" to="." method="_on_ColorPickerTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/CutTool" to="." method="_on_CutTool_pressed"] +[connection signal="color_changed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_color_changed"] +[connection signal="popup_closed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_popup_closed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer/AddNewLayer" to="." method="_on_AddNewLayer_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer/LockAlpha" to="." method="_on_LockAlpha_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushRect" to="." method="_on_BrushRect_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushCircle" to="." method="_on_BrushCircle_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushVLine" to="." method="_on_BrushVLine_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushHLine" to="." method="_on_BrushHLine_pressed"] +[connection signal="value_changed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer/BrushSize" to="." method="_on_BrushSize_value_changed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/XSymmetry" to="." method="_on_XSymmetry_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/YSymmetry" to="." method="_on_YSymmetry_pressed"] +[connection signal="on_animation_frame_rate_changed" from="Panel/NoBCViewportsnotworking26181/AnimationPanel" to="." method="_on_AnimationPanel_on_animation_frame_rate_changed"] +[connection signal="on_animation_loop_toggled" from="Panel/NoBCViewportsnotworking26181/AnimationPanel" to="." method="_on_AnimationPanel_on_animation_loop_toggled"] +[connection signal="on_play_pause_pressed" from="Panel/NoBCViewportsnotworking26181/AnimationPanel" to="." method="_on_AnimationPanel_on_play_pause_pressed"] +[connection signal="about_to_show" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_about_to_show"] +[connection signal="confirmed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_confirmed"] +[connection signal="file_selected" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_file_selected"] +[connection signal="visibility_changed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_visibility_changed"] +[connection signal="about_to_show" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_about_to_show"] +[connection signal="confirmed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_confirmed"] +[connection signal="file_selected" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_file_selected"] +[connection signal="visibility_changed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_visibility_changed"] +[connection signal="confirmed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_confirmed"] +[connection signal="visibility_changed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_visibility_changed"] +[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer/GridValue" to="ChangeGridSizeDialog" method="_on_GridValue_value_changed"] +[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2/BigGridValue" to="ChangeGridSizeDialog" method="_on_BigGridValue_value_changed"] diff --git a/addons/Godoxel/Frame.gd b/addons/Godoxel/Frame.gd new file mode 100644 index 0000000..53e66d7 --- /dev/null +++ b/addons/Godoxel/Frame.gd @@ -0,0 +1,107 @@ +extends Control +class_name GEFrame +tool + + +var layers = [] + +var width: int +var height: int + +var preview_texture: ImageTexture = ImageTexture.new() +var preview_dirty = false +var preview_updated = true + + +func _ready(): + pass + + +func _draw(): +# return +# if not preview_dirty: +# return +# preview_dirty = false + for layer in layers: + layer.update_texture() + #_update_preview() + + +func _update_preview(): + var image = Image.new() + image.create(width, height, true, Image.FORMAT_RGBA8) + image.lock() + image.fill(Color.transparent) + image.unlock() + image.lock() + + for layer in layers: + if not layer.visible: + continue + + for x in range(width): + for y in range(height): + var color = layer.get_pixel(x, y) + var image_color = image.get_pixel(x, y) + + if color.a != 0: + image.set_pixel(x, y, color) + else: + image.set_pixel(x, y, image_color.blend(color)) + image.unlock() + preview_texture.create_from_image(image) + preview_updated = true + + +func get_preview_texture(): + return preview_texture + + +func set_layers(new_layers: Array): + for layer in new_layers: + add_frame_layer(layer) + + +func add_frame_layer(layer: GELayer): + layers.append(layer) + add_child(layer.texture_rect_ref, true) + return layer + + +func resize(width: int, height: int): + self.width = width + self.height = height + for layer in layers: + layer.resize(width, height) + + +func get_content_margin() -> Rect2: + var rect = Rect2(999999, 999999, -999999, -999999) + for layer in layers: + var r = layer.image.get_used_rect() + if r.position.x < rect.position.x: + rect.position.x = r.position.x + if r.position.y < rect.position.y: + rect.position.y = r.position.y + if r.size.x > rect.size.x: + rect.size.x = r.size.x + if r.size.y > rect.size.y: + rect.size.y = r.size.y + return rect + + +func crop_to_content(): + var rect = get_content_margin() + + #print(rect) + + for layer in layers: + layer.image + +# set_canvas_width(rect.size.x) +# set_canvas_height(rect.size.x) + +# preview_layer.resize(width, height) +# tool_layer.resize(width, height) +# for layer in layers: +# layer.resize(width, height) diff --git a/addons/Godoxel/LICENSE b/addons/Godoxel/LICENSE new file mode 100644 index 0000000..11b9025 --- /dev/null +++ b/addons/Godoxel/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2019 Flairieve +Copyright (c) 2020 cobrapitz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/Godoxel/Layer.gd b/addons/Godoxel/Layer.gd new file mode 100644 index 0000000..889b47c --- /dev/null +++ b/addons/Godoxel/Layer.gd @@ -0,0 +1,107 @@ +extends Reference +class_name GELayer +tool + + +var name +var layer_width +var layer_height +var visible = true setget set_visible +var locked = false +var alpha_locked = false + +var texture: ImageTexture +var image: Image +var texture_rect_ref + + +func _init(): + texture = ImageTexture.new() + + +func create(texture_rect_ref, width: int, height: int): + self.texture_rect_ref = texture_rect_ref + + assert(width > 0 and height > 0, "Texture size invalid!") + + layer_width = width + layer_height = height + + image = Image.new() + image.create(width, height, false, Image.FORMAT_RGBA8) + image.fill(Color.transparent) + update_texture() + + +func resize(width: int, height: int): + var pixel_colors = [] + var prev_width = layer_width + var prev_height = layer_height + + image.lock() + for y in range(prev_height): + for x in range(prev_width): + pixel_colors.append(image.get_pixel(x, y)) + image.unlock() + + layer_width = width + layer_height = height + + image.create(width, height, false, Image.FORMAT_RGBA8) + image.fill(Color.transparent) + + image.lock() + for x in range(prev_width): + for y in range(prev_height): + if x >= width or y >= height: + continue + image.set_pixel(x, y, pixel_colors[GEUtils.to_1D(x, y, prev_width)]) + image.unlock() + + update_texture() + + +func set_pixel(x, y, color): + image.lock() + image.set_pixel(x, y, color) + image.unlock() + + +func get_pixel(x: int, y: int): + if x < 0 or y < 0 or x >= image.get_width() or y >= image.get_height(): + return null + image.lock() + var pixel = image.get_pixel(x, y) + image.unlock() + return pixel + + +func clear(): + image.fill(Color.transparent) + update_texture() + + +func update_texture(): + texture.create_from_image(image, 0) + texture_rect_ref.texture = texture + texture_rect_ref.margin_right = 0 + texture_rect_ref.margin_bottom = 0 + + +func set_visible(vis: bool): + # TODO upate frame preview when hide/show + visible = vis + texture_rect_ref.visible = visible + + +func toggle_lock(): + locked = not locked + + +func toggle_alpha_locked(): + alpha_locked = not alpha_locked + + +func copy_from(other: GELayer): + image.copy_from(other.image) + diff --git a/addons/Godoxel/LayerButton.tscn b/addons/Godoxel/LayerButton.tscn new file mode 100644 index 0000000..841cdd6 --- /dev/null +++ b/addons/Godoxel/LayerButton.tscn @@ -0,0 +1,108 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://addons/Godoxel/assets/minidotta_invis.png" type="Texture" id=1] +[ext_resource path="res://addons/Godoxel/assets/minidotta.png" type="Texture" id=2] +[ext_resource path="res://addons/Godoxel/assets/arrow_down.png" type="Texture" id=3] +[ext_resource path="res://addons/Godoxel/assets/arrow_up.png" type="Texture" id=4] +[ext_resource path="res://addons/Godoxel/assets/lock_layer_1.png" type="Texture" id=5] +[ext_resource path="res://addons/Godoxel/assets/unlock_layer.png" type="Texture" id=6] + +[sub_resource type="StyleBoxFlat" id=4] +resource_local_to_scene = true +bg_color = Color( 0.354706, 0.497302, 0.769531, 1 ) + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.25098, 0.25098, 0.25098, 0 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[node name="Layer1" type="Panel"] +show_behind_parent = true +anchor_right = 0.113281 +anchor_bottom = 0.0416667 +margin_bottom = -1.90735e-06 +rect_min_size = Vector2( 0, 32 ) +mouse_filter = 2 +custom_styles/panel = SubResource( 4 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Select" type="Button" parent="." groups=["layer_button"]] +anchor_right = 0.827586 +anchor_bottom = 1.0 +custom_styles/hover = SubResource( 1 ) +custom_styles/pressed = SubResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/disabled = SubResource( 1 ) +custom_styles/normal = SubResource( 1 ) +text = "Layer 1" +align = 2 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Visible" type="CheckButton" parent="."] +anchor_top = 0.5 +anchor_bottom = 0.5 +margin_left = 3.0 +margin_top = -8.5 +margin_right = 19.0 +margin_bottom = 7.5 +custom_icons/off = ExtResource( 1 ) +custom_icons/on = ExtResource( 2 ) +custom_styles/normal = SubResource( 2 ) +pressed = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Lock" type="CheckButton" parent="."] +anchor_top = 0.5 +anchor_bottom = 0.5 +margin_left = 22.0 +margin_top = -11.0 +margin_right = 46.0 +margin_bottom = 11.0 +custom_icons/off = ExtResource( 6 ) +custom_icons/on = ExtResource( 5 ) +custom_styles/normal = SubResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -20.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Up" type="TextureButton" parent="VBoxContainer"] +margin_right = 20.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 20, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture_normal = ExtResource( 4 ) +texture_pressed = ExtResource( 2 ) +expand = true +stretch_mode = 3 + +[node name="Down" type="TextureButton" parent="VBoxContainer"] +margin_top = 18.0 +margin_right = 20.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 20, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture_normal = ExtResource( 3 ) +texture_pressed = ExtResource( 2 ) +expand = true +stretch_mode = 3 diff --git a/addons/Godoxel/MenuButtonExtended.gd b/addons/Godoxel/MenuButtonExtended.gd new file mode 100644 index 0000000..dd442f6 --- /dev/null +++ b/addons/Godoxel/MenuButtonExtended.gd @@ -0,0 +1,13 @@ +tool +extends MenuButton + +var popup = get_popup() +signal item_pressed + +func _ready(): + popup.connect("id_pressed", self, "id_pressed") + +func id_pressed(id): + emit_signal("item_pressed", name, popup.get_item_text(id), id) + + diff --git a/addons/Godoxel/Navbar.gd b/addons/Godoxel/Navbar.gd new file mode 100644 index 0000000..9e75237 --- /dev/null +++ b/addons/Godoxel/Navbar.gd @@ -0,0 +1,139 @@ +tool +extends Control + +var editor +var paint_canvas + +func _ready(): + editor = owner + paint_canvas = editor.find_node("PaintCanvas") + + for i in get_node("Buttons").get_children(): + i.connect("item_pressed", self, "button_pressed") + + +func button_pressed(button_name, button_item, id): +# print("pressed: ", button_name) +# print("pressed item is: '%s'" % button_item) + + match button_name: + "File": + handle_file_menu(button_item, id) + "Edit": + handle_edit_menu(button_item, id) + "Canvas": + handle_canvas_menu(button_item, id) + "Layer": + handle_layer_menu(button_item, id) + "Frame": + handle_frame_menu(button_item, id) + "Grid": + handle_grid_menu(button_item, id) + "Magic": + handle_magic_menu(button_item, id) + "Editor": + handle_editor_menu(button_item, id) + + +func handle_file_menu(pressed_item: String, id): + match pressed_item: + "Save Project": + owner.get_node("SaveFileDialog").open_save_project() + "Load Project": + owner.get_node("LoadFileDialog").open_load_project() + "New Project": + owner.get_node("ConfirmationDialog").show() + "Export (PNG)": + owner.get_node("SaveFileDialog").open_save_current_frame() + "Export Frame": + owner.get_node("SaveFileDialog").open_save_current_frame() + "Export Layer": + owner.get_node("SaveFileDialog").open_save_current_layer() + "Export Selection": + print("Not implemented!") + "Import (PNG)": + owner.get_node("LoadFileDialog").open_import_image() + + +func handle_edit_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + + +func handle_canvas_menu(pressed_item: String, id): + match pressed_item: + "Change Size": + owner.get_node("ChangeCanvasSize").show() + "Crop To Content": + owner.paint_canvas.crop_to_content() + + +func handle_layer_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + "Delete Layer": + editor.remove_active_layer() + "Duplicate Layer": + editor.duplicate_active_layer() + "Clear Layer": + owner.paint_canvas.clear_active_layer() + "Toggle Alpha Locked": + owner.paint_canvas.active_layer.toggle_alpha_locked() + $Buttons/Layer.get_popup().set_item_checked(id, not $Buttons/Layer.get_popup().is_item_checked(id)) + owner.find_node("LockAlpha").pressed = $Buttons/Layer.get_popup().is_item_checked(id) + + +func handle_frame_menu(pressed_item: String, id): + match pressed_item: + "Add Frame": + var frame_button = editor.anim_panel.get_animation_stripe(editor.current_animation_idx).add_new_frame_button() + editor._on_add_frame_pressed(editor.current_animation_idx, frame_button.get_index()) + "Delete Frame": + editor.delete_current_frame() + "Duplicate Frame": + pass + "Clear Frame Layers": + pass + _: + printerr("Pressed: ", pressed_item, " not found!") + + +func handle_grid_menu(pressed_item: String, id): + match pressed_item: + "Change Grid Size": + owner.get_node("ChangeGridSizeDialog").show() + "Toggle Grid": + owner.paint_canvas.toggle_grid() + + +func handle_magic_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + + +func handle_editor_menu(pressed_item: String, id): + match pressed_item: + "Settings": + owner.get_node("Settings").show() + "Show Preview": + owner.preview_window.visible = not owner.preview_window.visible + $Buttons/Editor.get_popup().set_item_checked(id, owner.preview_window.visible) + "Toggle Grid": + var grids_node = owner.find_node("Grids") + grids_node.visible = !grids_node.visible + "Reset Canvas Position": + owner.paint_canvas_node.rect_position = Vector2(0, 0) + "Show Animation Panel": + owner.anim_panel.visible = not owner.anim_panel.visible + $Buttons/Editor.get_popup().set_item_checked(id, owner.anim_panel.visible) + + +func is_any_menu_open() -> bool: + for child in $Buttons.get_children(): + if child.get_popup().visible: + return true + return false + diff --git a/addons/Godoxel/PaintCanvas.gd b/addons/Godoxel/PaintCanvas.gd new file mode 100644 index 0000000..39fa0ba --- /dev/null +++ b/addons/Godoxel/PaintCanvas.gd @@ -0,0 +1,500 @@ +tool +extends Control + +var image = Image.new() +var last_pixel = [] +onready var canvas_image_node = get_node("CanvasImage") +export var grid_size = 16 +export var canvas_size = Vector2(48, 28) +export var region_size = 10 +export var can_draw = true + +var mouse_in_region +var mouse_on_top + +#terms +#global cell - a cell that has a global grid position on the canvas +#local cell - a cell that has a local grid position in a chunk region on the canvas +#chunk region - a set of cells contained in an even number + +#TODO: Maybe each chunk region can hold an image resource +# so that way the engine wouldn't lag at all when updating the canvas + +var layers = {} +var active_layer + +var preview_layer = "preview" +var preview_enabled = false + + +func _enter_tree(): + #---------------------- + # init Layer + #---------------------- + layers[preview_layer] = { + "layer": null, + "data": [], + "chunks": null, + } + + canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size)) + #print("canvas_size: ", canvas_size) + + +func _ready(): + active_layer = add_existing_layer(get_tree().get_nodes_in_group("layer")[0]) + #print("active Layer: ", active_layer) + + +func get_layer_data(layer_name): + return layers[layer_name] + + +func get_active_layer(): + return layers[active_layer] + + +func get_preview_layer(): + return layers[preview_layer] + + +func clear_active_layer(): + for pixel in layers[active_layer].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func clear_layer(layer_name: String): + for pixel in layers[layer_name].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func clear_preview_layer(): + for pixel in layers["preview"].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func remove_layer(layer_name): + get_node("ChunkNodes").remove_child(layers[layer_name].chunks) + layers[layer_name].chunks.queue_free() + + layers.erase(layer_name) + + if active_layer == layer_name: + for layer in layers: + if layer == preview_layer: + continue + active_layer = layer + break + + return active_layer + + + +# only needed for init +func add_existing_layer(layer): + layers[layer.name] = { + "layer": layer, + "data": [], + "chunks": null, + } + generate_chunks() + return layer.name + + +func add_new_layer(layer_name): + layers[layer_name] = { + "layer": null, + "data": [], + "chunks": null, + } + + generate_chunks() + + return layer_name + + +func duplicate_layer(layer: String, neu_layer_name: String): + var _preview = preview_enabled + preview_enabled = false + var _temp = active_layer + active_layer = neu_layer_name + + layers[neu_layer_name] = { + "layer": null, + "data": layers[layer].data.duplicate(true), + "chunks": null, + } + + generate_chunks() +# get_node("ChunkNodes").remove_child(layers[neu_layer_name].chunks) +# get_node("ChunkNodes").add_child_below_node(layers[layer].chunks, layers[neu_layer_name].chunks, true) + + for pixel in layers[neu_layer_name].data: + set_pixel_cell(pixel[0], pixel[1], pixel[2]) + active_layer = _temp + + preview_enabled = _preview + return neu_layer_name + + +func toggle_layer_visibility(layer_name): + layers[layer_name].chunks.visible = not layers[layer_name].chunks.visible + #print("Layer: ", layer_name, " is now: ", layers[layer_name].chunks.visible) + + +var util = preload("res://addons/Godoxel/Util.gd") + + +func _on_mouse_entered(): + mouse_on_top = true + + +func _on_mouse_exited(): + mouse_on_top = false + + +func _process(delta: float) -> void: + var mouse_position = get_local_mouse_position() + var rect = Rect2(Vector2(0, 0), rect_size) + mouse_in_region = rect.has_point(mouse_position) + + update() + #if not Engine.editor_hint: + # print(mouse_on_canvas, " | ", has_focus()) + #draw_canvas_out just updates the image constantly + #if can_draw: + # draw_canvas_out() + + +func generate_chunks(): + var maxium_chunk_size = get_maxium_filled_chunks() + #TODO: We probably don't need to check for x and y anymore + for key in layers: + if layers[key].chunks != null: + continue + + var chunk_node = Control.new() + get_node("ChunkNodes").add_child(chunk_node) + chunk_node.owner = self + + layers[key].chunks = chunk_node + + for x in maxium_chunk_size.x: + for y in maxium_chunk_size.y: + var paint_canvas_chunk = load("res://addons/Godoxel/PaintCanvasChunk.tscn").instance() + paint_canvas_chunk.setup(region_size) + paint_canvas_chunk.name = "C-%s-%s" % [x, y] + paint_canvas_chunk.rect_position = \ + Vector2(x * (grid_size * region_size), y * (grid_size * region_size)) + layers[key].chunks.add_child(paint_canvas_chunk) + + +func get_maxium_filled_chunks(): + return Vector2(canvas_size.x / region_size, canvas_size.y / region_size).ceil() + + +##TODO: Remake these functions with godot's setget features +#func resize_grid(grid): +# #print(grid) +# if grid <= 0: +# return +# grid_size = grid +# canvas_image_node.rect_scale = Vector2(grid, grid) +# +# +#func resize_canvas(x, y): +# image.unlock() +# image.create(x, y, true, Image.FORMAT_RGBA8) +# canvas_size = Vector2(x, y) +# #setup_all_chunks() +# image.lock() + +#func draw_canvas_out(a = ""): +# if canvas_image_node == null: +# return +# var image_texture = ImageTexture.new() +# image_texture.create_from_image(image) +# image_texture.set_flags(0) +# canvas_image_node.texture = image_texture + + +func get_wrapped_region_cell(x, y): + return Vector2(wrapi(x, 0, region_size), wrapi(y, 0, region_size)) + + +func get_region_from_cell(x, y): + return Vector2(floor(x / region_size), floor(y / region_size)) + + +func set_local_cell_in_chunk(chunk_x, chunk_y, local_cell_x, local_cell_y, color): + var chunk_node + + if preview_enabled: + chunk_node = layers.preview.chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y]) + else: + chunk_node = layers[active_layer].chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y]) + + if chunk_node == null: + #print("Can't find chunk node!") + return + chunk_node.set_cell(local_cell_x, local_cell_y, color) + + +func set_global_cell_in_chunk(cell_x, cell_y, color): + var chunk = get_region_from_cell(cell_x, cell_y) + var wrapped_cell = get_wrapped_region_cell(cell_x, cell_y) + set_local_cell_in_chunk(chunk.x, chunk.y, wrapped_cell.x, wrapped_cell.y, color) + +#func update_chunk_region_from_cell(x, y): +# var region_to_update = get_region_from_cell(x, y) +# update_chunk_region(region_to_update.x, region_to_update.y) + +func get_pixel_cell_color(x, y): + if not cell_in_canvas_region(x, y): + return null + var pixel_cell = get_pixel_cell(x, y) + if pixel_cell == null: + #We already checked that the cell can't be out of the canvas + #region so we can assume the pixel cell is completely transparent if it's null + return Color(0, 0, 0, 0) + else: + return util.color_from_array(pixel_cell[2]) + +func get_pixel_cell_color_v(vec2): + return get_pixel_cell_color(vec2.x, vec2.y) + +func get_pixel_cell(x, y): + if active_layer == null: + return + if not cell_in_canvas_region(x, y): + return null + + for pixel in get_active_layer().data: + if pixel[0] == x and pixel[1] == y: + return pixel + + return null + +func get_pixel_cell_v(vec2): + return get_pixel_cell(vec2.x, vec2.y) + +#func remove_pixel_cell(x, y): +# if can_draw == false: +# return false +# if not cell_in_canvas_region(x, y): +# return false +# var layer_data = get_layer_data("Layer 1") +# for pixel in range(0, layer_data.size()): +# if layer_data[pixel][0] == x and layer_data[pixel][1] == y: +# layer_data.remove(pixel) +# #update_chunk_region_from_cell(x, y) +# #TOOD: If pixel exists in temp_pool_pixels then remove it +# image.set_pixel(x, y, Color(0, 0, 0, 0)) +# return true +# return false + +#func remove_pixel_cell_v(vec2): +# return remove_pixel_cell(vec2.x, vec2.y) + +func set_pixel_cell(x, y, color): + if can_draw == false: + return false + + if not cell_in_canvas_region(x, y): + return false + + var layer + if preview_enabled: + layer = get_preview_layer() + else: + layer = get_active_layer() + + var index = 0 + for pixel in layer.data: + #TODO: Make a better way of accessing the array because the more pixels we have, + #the longer it takes to + #set the pixel + if pixel[0] == x and pixel[1] == y: + #No reason to set the pixel again if the colors are the same + + #If the color we are setting is 0, 0, 0, 0 then there is + #no reason to keep the information about the pixel + #so we remove it from the layer data + if color == Color(0, 0, 0, 0): + layer.data.remove(index) + else: + pixel[2] = color + #TODO: The new system is going to allow chunks to each have their own TextureRect and Image + #nodes so what we are doing in here is + #that we are setting the local cell in the region of that image + set_global_cell_in_chunk(x, y, color) + last_pixel = [x, y, color] + return true + index += 1 + #don't append any data if the color is 0, 0, 0, 0 + if color != Color(0, 0, 0, 0): + #if the pixel data doesn't exist then we add it in + layer.data.append([x, y, color]) + set_global_cell_in_chunk(x, y, color) + last_pixel = [x, y, color] + return true + +func set_pixel_cell_v(vec2, color): + return set_pixel_cell(vec2.x, vec2.y, color) + +func set_pixels_from_line(vec2_1, vec2_2, color): + var points = get_pixels_from_line(vec2_1, vec2_2) + for i in points: + set_pixel_cell_v(i, color) + +func set_random_pixels_from_line(vec2_1, vec2_2): + var points = get_pixels_from_line(vec2_1, vec2_2) + for i in points: + set_pixel_cell_v(i, util.random_color_alt()) + +func get_pixels_from_line(vec2_1, vec2_2): + var points = PoolVector2Array() + + var dx = abs(vec2_2.x - vec2_1.x) + var dy = abs(vec2_2.y - vec2_1.y) + + var x = vec2_1.x + var y = vec2_1.y + + var sx = 0 + if vec2_1.x > vec2_2.x: + sx = -1 + else: + sx = 1 + + var sy = 0 + if vec2_1.y > vec2_2.y: + sy = -1 + else: + sy = 1 + + if dx > dy: + var err = dx / 2 + while(true): + if x == vec2_2.x: + break + points.push_back(Vector2(x, y)) + + err -= dy + if err < 0: + y += sy + err += dx + x += sx + else: + var err = dy / 2 + while (true): + if y == vec2_2.y: + break + points.push_back(Vector2(x, y)) + + err -= dx + if err < 0: + x += sx + err += dy + y += sy + points.push_back(Vector2(x, y)) + return points + + +#even though the function checks for it, we can't afford adding more functions to the call stack +#because godot has a limit until it crashes +var flood_fill_queue = 0 +func flood_fill(x, y, target_color, replacement_color): + #yield(get_tree().create_timer(1), "timeout") + flood_fill_queue += 1 + if not cell_in_canvas_region(x, y): + flood_fill_queue -= 1 + return + if target_color == replacement_color: + flood_fill_queue -= 1 + return + elif not get_pixel_cell_color(x, y) == target_color: + flood_fill_queue -= 1 + return + else: + set_pixel_cell(x, y, replacement_color) + if flood_fill_queue >= 500: + #print(flood_fill_queue) + yield(get_tree().create_timer(0.01), "timeout") + #up + if get_pixel_cell_color(x, y - 1) == target_color: + flood_fill(x, y - 1, target_color, replacement_color) + #down + if get_pixel_cell_color(x, y + 1) == target_color: + flood_fill(x, y + 1, target_color, replacement_color) + #left + if get_pixel_cell_color(x - 1, y) == target_color: + flood_fill(x - 1, y, target_color, replacement_color) + #right + if get_pixel_cell_color(x + 1, y) == target_color: + flood_fill(x + 1, y, target_color, replacement_color) + flood_fill_queue -= 1 + return + +#func flood_fill_erase(x, y, target_color): +# yield(get_tree().create_timer(0.001), "timeout") +# if not cell_in_canvas_region(x, y): +# print("cell not in canvas") +# return +# #if target_color == replacement_color: +# # return +# elif not get_pixel_cell_color(x, y) == target_color: +# print("cell doesn't match pixel color") +# return +# elif not get_pixel_cell(x, y): +# print("cell already erased") +# return +# else: +# print("removed pixel") +# remove_pixel_cell(x, y) +# print("x: ", x, " y: ", y, " color: ", target_color) +# #up +# flood_fill_erase(x, y - 1, target_color) +# #down +# flood_fill_erase(x, y + 1, target_color) +# #left +# flood_fill_erase(x - 1, y, target_color) +# #right +# flood_fill_erase(x + 1, y, target_color) +# return + +func cell_in_canvas_region(x, y): + if x > canvas_size.x - 1 or x < 0 or y > canvas_size.y - 1 or y < 0: + #out of bounds, return false + return false + else: + return true + +#Both of these functions right now just return the starting +#position of the canvas and the last position of the canvas +func get_all_used_regions_in_canvas(): + var first_used_region = get_first_used_region_in_canvas() + var last_used_region = get_last_used_region_in_canvas() + var chunk_pool = PoolVector2Array() + for chunk_x in range(first_used_region.x, last_used_region.x): + for chunk_y in range(first_used_region.y, last_used_region.y): + chunk_pool.append(Vector2(chunk_x, chunk_y)) + return chunk_pool + +func get_first_used_region_in_canvas(): + return get_region_from_cell(0, 0) + +func get_last_used_region_in_canvas(): + return get_region_from_cell(canvas_size.x - 1, canvas_size.y - 1) + +func get_cells_in_region(x, y): + var start_cell = Vector2(x * region_size, y * region_size) + var end_cell = Vector2((x * region_size) + region_size, (y * region_size) + region_size) + var cell_array = [] + for cx in range(start_cell.x, end_cell.x): + for cy in range(start_cell.y, end_cell.y): + var pixel_cell = get_pixel_cell(cx, cy) + if pixel_cell == null: + pixel_cell = [cx, cy, Color(0, 0, 0, 0)] + cell_array.append(pixel_cell) + return cell_array diff --git a/addons/Godoxel/PaintCanvas.tscn b/addons/Godoxel/PaintCanvas.tscn new file mode 100644 index 0000000..b2d66d1 --- /dev/null +++ b/addons/Godoxel/PaintCanvas.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/PaintCanvas.gd" type="Script" id=1] + +[node name="PaintCanvas" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +canvas_size = Vector2( 0, 0 ) + +[node name="ChunkNodes" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CanvasImage" type="TextureRect" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +expand = true +stretch_mode = 3 diff --git a/addons/Godoxel/PaintCanvasChunk.gd b/addons/Godoxel/PaintCanvasChunk.gd new file mode 100644 index 0000000..3a49c02 --- /dev/null +++ b/addons/Godoxel/PaintCanvasChunk.gd @@ -0,0 +1,27 @@ +tool +extends Control + +var image = Image.new() +var image_texture = ImageTexture.new() + +func _ready(): + mouse_filter = Control.MOUSE_FILTER_IGNORE + +func setup(region_size): + image.create(region_size, region_size, true, Image.FORMAT_RGBA8) + image.lock() + +func update_chunk(): + image_texture.create_from_image(image) + image_texture.set_flags(0) + self.texture = image_texture + +func set_cell(x, y, color): + image.set_pixel(x, y, color) + update_chunk() + +func _on_VisibilityNotifier2D_screen_entered(): + visible = true + +func _on_VisibilityNotifier2D_screen_exited(): + visible = false diff --git a/addons/Godoxel/PaintCanvasChunk.tscn b/addons/Godoxel/PaintCanvasChunk.tscn new file mode 100644 index 0000000..1f2f2b0 --- /dev/null +++ b/addons/Godoxel/PaintCanvasChunk.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/PaintCanvasChunk.gd" type="Script" id=1] + + +[node name="PaintCanvasChunk" type="TextureRect"] +margin_right = 10.0 +margin_bottom = 10.0 +rect_scale = Vector2( 16, 16 ) +mouse_filter = 2 +expand = true +stretch_mode = 1 +script = ExtResource( 1 ) diff --git a/addons/Godoxel/PaintCanvasContainer.gd b/addons/Godoxel/PaintCanvasContainer.gd new file mode 100644 index 0000000..34ca400 --- /dev/null +++ b/addons/Godoxel/PaintCanvasContainer.gd @@ -0,0 +1,2 @@ +tool +extends Control diff --git a/addons/Godoxel/PreviewWindow.gd b/addons/Godoxel/PreviewWindow.gd new file mode 100644 index 0000000..8150c7e --- /dev/null +++ b/addons/Godoxel/PreviewWindow.gd @@ -0,0 +1,14 @@ +extends GEDraggableWindow +tool + +onready var preview_layers = $PreviewLayerTextures + + +func _ready() -> void: + show() + + +func update_preview(frame: GEFrame): + for idx in range(preview_layers.get_child_count()): + preview_layers.get_child(idx).texture = frame.layers[idx].texture + diff --git a/addons/Godoxel/SaveFileDialog.gd b/addons/Godoxel/SaveFileDialog.gd new file mode 100644 index 0000000..b310820 --- /dev/null +++ b/addons/Godoxel/SaveFileDialog.gd @@ -0,0 +1,129 @@ +tool +extends FileDialog + +enum SaveMode { + CURRENT_FRAME, + PROJECT, + CURRENT_LAYER, +} + +var save_mode = SaveMode.CURRENT_FRAME +onready var canvas = get_parent().find_node("Canvas") +var file_path = "" + + +func _ready(): + # warning-ignore:return_value_discarded + get_line_edit().connect("text_entered", self, "_on_LineEdit_text_entered") + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + + + +####################################################### +# dialogs +####################################################### + +func open_save_current_frame(): + show() + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + save_mode = SaveMode.CURRENT_FRAME + + +func open_save_project(): + show() + invalidate() + clear_filters() + add_filter("*.godoxel ; Godot - Godoxel") + save_mode = SaveMode.PROJECT + + +func open_save_current_layer(): + show() + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + save_mode = SaveMode.CURRENT_LAYER + + + +####################################################### +# dialogs +####################################################### + +func _on_SaveFileDialog_file_selected(path: String): + file_path = path + match save_mode: + SaveMode.CURRENT_FRAME: + save_current_frame() + SaveMode.CURRENT_LAYER: + save_current_layer() + SaveMode.PROJECT: + save_project() + + +func save_current_layer(): + var image = canvas.get_current_layer_image() + + # overwrite image if exists + var dir = Directory.new() + if dir.file_exists(file_path): + dir.remove(file_path) + + image.save_png(file_path) + + # update file doc if using inside the editor + if Engine.is_editor_hint(): + EditorPlugin.new().get_editor_interface().get_resource_filesystem().scan() + + +func save_project(): + var save_data = owner.get_save_project_data() + + # overwrite image if exists + var dir = Directory.new() + if dir.file_exists(file_path): + dir.remove(file_path) + + var file = File.new() + file.open(file_path, File.WRITE) + file.store_string(JSON.print(save_data)) + file.close() + + # update file doc if using inside the editor + if Engine.is_editor_hint(): + EditorPlugin.new().get_editor_interface().get_resource_filesystem().scan() + + +func save_current_frame(): + var image = canvas.get_current_frame_image() + + # overwrite image if exists + var dir = Directory.new() + if dir.file_exists(file_path): + dir.remove(file_path) + + image.save_png(file_path) + + # update file doc if using inside the editor + if Engine.is_editor_hint(): + EditorPlugin.new().get_editor_interface().get_resource_filesystem().scan() + + +func _on_SaveFileDialog_about_to_show(): + invalidate() + + +func _on_SaveFileDialog_visibility_changed(): + invalidate() + + +#func _on_LineEdit_text_entered(text): +# return + + +func _on_SaveFileDialog_confirmed(): + return diff --git a/addons/Godoxel/SelectionBox.gd b/addons/Godoxel/SelectionBox.gd new file mode 100644 index 0000000..7ddfd2a --- /dev/null +++ b/addons/Godoxel/SelectionBox.gd @@ -0,0 +1,24 @@ +tool +extends Control + +export var outline_size = 3 + +func _ready(): + pass + +func _process(delta): + update() + +func _draw(): + if not rect_size == Vector2(): + draw_outline_box(rect_size, Color.gray, outline_size) + +func draw_outline_box(size, color, width): + #Top line + draw_line(Vector2(0 + 1, 0), Vector2(size.x, 0), color, width) + #Left line + draw_line(Vector2(0 + 1, 0), Vector2(0, size.y), color, width) + #Bottom line + draw_line(Vector2(0 + 1, size.y), Vector2(size.x, size.y), color, width) + #Right line + draw_line(Vector2(size.x, 0), Vector2(size.x, size.y), color, width) diff --git a/addons/Godoxel/Settings.gd b/addons/Godoxel/Settings.gd new file mode 100644 index 0000000..8657585 --- /dev/null +++ b/addons/Godoxel/Settings.gd @@ -0,0 +1,24 @@ +tool +extends Control + +var editor +var canvas_outline +var start_time +var end_time + + +func _enter_tree(): + canvas_outline = get_parent().find_node("CanvasOutline") + editor = get_parent() + + +func _on_ColorPickerButton_color_changed(color): + canvas_outline.color = color + + +func _on_CheckButton_toggled(button_pressed): + canvas_outline.visible = button_pressed + + +func _on_Ok_pressed(): + hide() diff --git a/addons/Godoxel/Settings.tscn b/addons/Godoxel/Settings.tscn new file mode 100644 index 0000000..f2d9c24 --- /dev/null +++ b/addons/Godoxel/Settings.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/Settings.gd" type="Script" id=1] + + +[node name="Settings" type="WindowDialog"] +visible = true +margin_top = 20.0 +margin_right = 300.0 +margin_bottom = 120.0 +window_title = "Settings" +script = ExtResource( 1 ) + +[node name="Ok" type="Button" parent="."] +margin_left = 210.0 +margin_top = 70.0 +margin_right = 290.0 +margin_bottom = 90.0 +text = "Ok" + +[node name="CanvasOutlineToggle" type="Control" parent="."] +margin_left = 10.0 +margin_top = 10.0 +margin_right = 290.0 +margin_bottom = 30.0 +__meta__ = { +"_edit_group_": true +} + +[node name="Label" type="Label" parent="CanvasOutlineToggle"] +margin_right = 130.0 +margin_bottom = 20.0 +text = "Canvas Outline:" +valign = 1 + +[node name="CheckButton" type="CheckButton" parent="CanvasOutlineToggle"] +margin_left = 210.0 +margin_top = -10.0 +margin_right = 286.0 +margin_bottom = 30.0 +pressed = true + +[node name="CanvasOutlineColor" type="Control" parent="."] +margin_left = 10.0 +margin_top = 40.0 +margin_right = 290.0 +margin_bottom = 60.0 +__meta__ = { +"_edit_group_": true +} + +[node name="Label" type="Label" parent="CanvasOutlineColor"] +margin_right = 130.0 +margin_bottom = 20.0 +text = "Canvas Outline Color:" +valign = 1 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="CanvasOutlineColor"] +margin_left = 170.0 +margin_right = 280.0 +margin_bottom = 20.0 +[connection signal="pressed" from="Ok" to="." method="_on_Ok_pressed"] +[connection signal="toggled" from="CanvasOutlineToggle/CheckButton" to="." method="_on_CheckButton_toggled"] +[connection signal="color_changed" from="CanvasOutlineColor/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"] diff --git a/addons/Godoxel/TextInfo.gd b/addons/Godoxel/TextInfo.gd new file mode 100644 index 0000000..e9368e1 --- /dev/null +++ b/addons/Godoxel/TextInfo.gd @@ -0,0 +1,39 @@ +tool +extends Control + +var size = 240 + +#TODO: To make reading the text easier, the text info with the longest text should have it's length applied to all the +#the other text infos + +func add_text_info(text_name, custom_node = null): + var last_text_info_child = null + var child_count = get_child_count() + if not child_count <= 0: + last_text_info_child = get_children()[get_children().size() - 1] + var label = Label.new() + label.name = text_name + label.rect_size = Vector2(size, 14) + if not last_text_info_child == null: + var x = last_text_info_child.rect_position.x + var y = last_text_info_child.rect_position.y + var temp_size = size + if child_count == 4: + x = 0 + y = 20 + temp_size = 0 + label.rect_position = Vector2(x + temp_size, y) + if not custom_node == null: + label.add_child(custom_node) + add_child(label) + +func update_text_info(text_name, text_value = null, node = null, node_target_value = null, node_value = null): + var text_label = self.get_node(text_name) + if text_label == null: + return + if not node == null: + get_node(text_name).get_node(node).set(node_target_value, node_value) + if text_value == null: + text_label.text = "%s: %s" % [text_name, null] + else: + text_label.text = "%s: %s" % [text_name, String(text_value)] diff --git a/addons/Godoxel/Util.gd b/addons/Godoxel/Util.gd new file mode 100644 index 0000000..d2246a5 --- /dev/null +++ b/addons/Godoxel/Util.gd @@ -0,0 +1,94 @@ +tool +extends Node +class_name GEUtils + + +static func get_pixels_in_line(from: Vector2, to: Vector2): + var dx = to[0] - from[0] + var dy = to[1] - from[1] + var nx = abs(dx) + var ny = abs(dy) + var signX = sign(dx) + var signY = sign(dy) + var p = from + var points : Array = [p] + + var ix = 0 + var iy = 0 + + while ix < nx || iy < ny: + if (1 + (ix << 1)) * ny < (1 + (iy << 1)) * nx: + p[0] += signX + ix +=1 + else: + p[1] += signY + iy += 1 + points.append(p) + return points + + +static func to_1D_v(p, w) -> int: + return p.x + p.y * w + + +static func to_1D(x, y, w) -> int: + return x + y * w + + +static func to_2D(idx, w) -> Vector2: + var p = Vector2() + p.x = int(idx) % int(w) + p.y = int(idx / w) + return p + + + +static func color_from_array(color_array): + var r = color_array[0] + var g = color_array[1] + var b = color_array[2] + var a = color_array[3] + return Color(r, g, b, a) + +static func random_color(): + return Color(randf(), randf(), randf()) + +static func random_color_alt(): + var rand = randi() % 6 + + match rand: + #red + 0: + return Color.red + #blue + 1: + return Color.blue + #green + 2: + return Color.green + #orange + 3: + return Color.orange + #yellow + 4: + return Color.yellow + #purple + 5: + return Color.purple + +static func get_line_string(file, number): + return file.get_as_text().split("\n")[number - 1].strip_edges() + +static func printv(variable): + var stack = get_stack()[get_stack().size() - 1] + var line = stack.line + var source = stack.source + var file = File.new() + file.open(source, File.READ) + var line_string = get_line_string(file, line) + file.close() + var left_p = line_string.find("(") + var left_p_string = line_string.right(left_p + 1) + var right_p = left_p_string.find(")") + var variable_name = left_p_string.left(right_p) + print("%s: %s" % [variable_name, variable]) diff --git a/addons/Godoxel/ViewportContainer.gd b/addons/Godoxel/ViewportContainer.gd new file mode 100644 index 0000000..5ff1df6 --- /dev/null +++ b/addons/Godoxel/ViewportContainer.gd @@ -0,0 +1,6 @@ +extends ViewportContainer +tool + +func _ready(): + get_child(0).size = rect_size + diff --git a/addons/Godoxel/VisualGrid.gd b/addons/Godoxel/VisualGrid.gd new file mode 100644 index 0000000..a935a15 --- /dev/null +++ b/addons/Godoxel/VisualGrid.gd @@ -0,0 +1,41 @@ +tool +extends Control + +export var color = Color() +export var size:int = 16 +export var zoom = 0 +export var offset = Vector2(0, 0) + + +func _enter_tree(): + set_process(true) + + +func _draw(): + if size == 0: + size = 1 + + var temp_size = size + zoom + + var wrap_offset = Vector2(wrapf(offset.x, 0, temp_size), wrapf(offset.y, 0, temp_size)) + + var ceil_x = ceil(rect_size.x / temp_size) + var ceil_y = ceil(rect_size.y / temp_size) + + for i in ceil_y: + var start_x = Vector2(0, (i * temp_size) + wrap_offset.y) + var end_x = Vector2(rect_size.x, (i * temp_size) + wrap_offset.y) +# var end_x = Vector2(int(rect_size.x) + size - int(rect_size.x) % size, (i * temp_size) + wrap_offset.y) + draw_line(start_x, end_x, color, 1) + + for i in ceil_x: + var start_y = Vector2((i * temp_size) + wrap_offset.x, 0) + var end_y = Vector2((i * temp_size) + (wrap_offset.x), rect_size.y) +# var end_y = Vector2((i * temp_size) + (wrap_offset.x), int(rect_size.y) + size - int(rect_size.y) % size) + draw_line(start_y, end_y, color, 1) + + +func _process(delta): + if not is_visible_in_tree(): + return + update() diff --git a/addons/Godoxel/VisualGrid.tscn b/addons/Godoxel/VisualGrid.tscn new file mode 100644 index 0000000..ac8345a --- /dev/null +++ b/addons/Godoxel/VisualGrid.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/VisualGrid.gd" type="Script" id=1] + + +[node name="VisualGrid" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) diff --git a/addons/Godoxel/actions/Action.gd b/addons/Godoxel/actions/Action.gd new file mode 100644 index 0000000..97292c2 --- /dev/null +++ b/addons/Godoxel/actions/Action.gd @@ -0,0 +1,123 @@ +extends Node +class_name GEAction + + +var action_data = {} + + +func _init(): + action_data["redo"] = {} + action_data["undo"] = {} + action_data["preview"] = {} + + +func do_action(canvas, data: Array): + if not "cells" in action_data.redo: + action_data.redo["cells"] = [] + action_data.redo["colors"] = [] + + if not "cells" in action_data.undo: + action_data.undo["cells"] = [] + action_data.undo["colors"] = [] + + if not "cells" in action_data.preview: + action_data.preview["cells"] = [] + action_data.preview["colors"] = [] + + if not "layer" in action_data: + action_data["layer"] = canvas.active_layer + + +func commit_action(canvas): + print("NO IMPL commit_action ") + return [] + + +func undo_action(canvas): + print("NO IMPL undo_action ") + + +func redo_action(canvas): + print("NO IMPL redo_action ") + + +func can_commit() -> bool: + return not action_data.redo.empty() + + +func get_x_sym_points(canvas_width, pixel): + var p = int(canvas_width - pixel.x) + var all_points = [pixel, Vector2(p-1, pixel.y)] + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + return points + + +func get_y_sym_points(canvas_height, pixel): + var p = int(canvas_height - pixel.y) + var all_points = [pixel, Vector2(pixel.x, p-1)] + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + return points + + +func get_xy_sym_points(canvas_width, canvas_height, pixel): + var all_points = [] + var xpoints = get_x_sym_points(canvas_width, pixel) + + all_points += get_y_sym_points(canvas_height, xpoints[0]) + all_points += get_y_sym_points(canvas_height, xpoints[1]) + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + + return points + + +func get_points(canvas, pixel): + var points = [] + if canvas.symmetry_x and canvas.symmetry_y: + var sym_points = get_xy_sym_points(canvas.canvas_width, canvas.canvas_height, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + elif canvas.symmetry_y: + var sym_points = get_y_sym_points(canvas.canvas_height, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + elif canvas.symmetry_x: + var sym_points = get_x_sym_points(canvas.canvas_width, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + else: + if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null: + return [] + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + return [] + points.append(pixel) + + return points + + diff --git a/addons/Godoxel/actions/Brighten.gd b/addons/Godoxel/actions/Brighten.gd new file mode 100644 index 0000000..faf7f81 --- /dev/null +++ b/addons/Godoxel/actions/Brighten.gd @@ -0,0 +1,53 @@ +extends GEAction +class_name GEBrighten + + +const brighten_color = 0.1 + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1) + canvas.set_pixel_v(pixel, brightened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(brightened_color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1) + canvas.set_pixel_v(pixel, brightened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(brightened_color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) diff --git a/addons/Godoxel/actions/Brush.gd b/addons/Godoxel/actions/Brush.gd new file mode 100644 index 0000000..edeccaf --- /dev/null +++ b/addons/Godoxel/actions/Brush.gd @@ -0,0 +1,47 @@ +extends GEAction +class_name GEBrush + + +func do_action(canvas: GECanvas, data: Array): + .do_action(canvas, data) + + for pixel in GEUtils.get_pixels_in_line(data[0], data[1]): + for off in BrushPrefabs.get_brush(data[3], data[4]): + var p = pixel + off + + if p in action_data.undo.cells or canvas.get_pixel_v(p) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(p) == Color.transparent: + continue + + action_data.undo.colors.append(canvas.get_pixel_v(p)) + action_data.undo.cells.append(p) + + canvas.set_pixel_v(p, data[2]) + + action_data.redo.cells.append(p) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Bucket.gd b/addons/Godoxel/actions/Bucket.gd new file mode 100644 index 0000000..8ff2f90 --- /dev/null +++ b/addons/Godoxel/actions/Bucket.gd @@ -0,0 +1,49 @@ +extends GEAction +class_name GEBucket + + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if canvas.get_pixel_v(data[0]) == data[2]: + return + var pixels = canvas.select_same_color(data[0].x, data[0].y) + + for pixel in pixels: + if pixel in action_data.undo.cells: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + canvas.set_pixel_v(pixel, data[2]) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.preview.cells + var colors = action_data.preview.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Cut.gd b/addons/Godoxel/actions/Cut.gd new file mode 100644 index 0000000..4f60815 --- /dev/null +++ b/addons/Godoxel/actions/Cut.gd @@ -0,0 +1,82 @@ +extends GEAction +class_name GECut + +const selection_color = Color(0.8, 0.8, 0.8, 0.5) +var mouse_start_pos = null +var mouse_end_pos = null + + +func can_commit() -> bool: + return false #ugly way of handling a cut + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + mouse_end_pos = data[0] + + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var p = mouse_start_pos + var s = mouse_end_pos - mouse_start_pos + + var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0)) + pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0)) + + for pixel in pixels: + canvas.set_preview_pixel_v(pixel, selection_color) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(selection_color) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var p = mouse_start_pos + var s = mouse_end_pos - mouse_start_pos + + for x in range(abs(s.x)+1): + for y in range(abs(s.y)+1): + var px = x + var py = y + if s.x < 0: + px *= -1 + if s.y < 0: + py *= -1 + + var pos = p + Vector2(px, py) + var color = canvas.get_pixel(pos.x, pos.y) + + if color == null or color.a == 0.0: + continue + + action_data.redo.cells.append(pos) + action_data.redo.colors.append(canvas.get_pixel_v(pos)) + + canvas.set_pixel_v(pos, Color.transparent) + + action_data.undo.cells.append(pos) + action_data.undo.colors.append(Color.transparent) + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Darken.gd b/addons/Godoxel/actions/Darken.gd new file mode 100644 index 0000000..3832a17 --- /dev/null +++ b/addons/Godoxel/actions/Darken.gd @@ -0,0 +1,55 @@ +extends GEAction +class_name GEDarken + +const dark_factor = 0.1 + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor) + canvas.set_pixel_v(pixel, darkened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(darkened_color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor) + canvas.set_pixel_v(pixel, darkened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(darkened_color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Line.gd b/addons/Godoxel/actions/Line.gd new file mode 100644 index 0000000..6f17316 --- /dev/null +++ b/addons/Godoxel/actions/Line.gd @@ -0,0 +1,59 @@ +extends GEAction +class_name GELine + + +var mouse_start_pos = null + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var pixels = GEUtils.get_pixels_in_line(data[0], mouse_start_pos) + for pixel in pixels: + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + canvas.set_preview_pixel_v(pixel, data[2]) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(data[2]) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var cells = action_data.preview.cells + var colors = action_data.preview.colors + for idx in range(cells.size()): + if canvas.get_pixel_v(cells[idx]) == null: + continue + action_data.undo.cells.append(cells[idx]) + action_data.undo.colors.append(canvas.get_pixel_v(cells[idx])) + + canvas.set_pixel_v(cells[idx], colors[idx]) + + action_data.redo.cells.append(cells[idx]) + action_data.redo.colors.append(colors[idx]) + mouse_start_pos = null + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/MultiLine.gd b/addons/Godoxel/actions/MultiLine.gd new file mode 100644 index 0000000..b3850ff --- /dev/null +++ b/addons/Godoxel/actions/MultiLine.gd @@ -0,0 +1,44 @@ +extends GEAction +class_name GEMultiLine + + +func can_commit() -> bool: + return false + + +func update_action(canvas, data: Array): + .update_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null or canvas.is_alpha_locked(): + continue + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + canvas.set_pixel_v(pixel, data[2]) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/PasteCut.gd b/addons/Godoxel/actions/PasteCut.gd new file mode 100644 index 0000000..5ffaa8e --- /dev/null +++ b/addons/Godoxel/actions/PasteCut.gd @@ -0,0 +1,59 @@ +extends GEAction +class_name GEPasteCut + + +#data[2] = selection_pos +#data[3] = selection_color +#data[4] = cut pos +#data[5] = cut size +func do_action(canvas, data: Array): + .do_action(canvas, data) + + for pixel_pos in GEUtils.get_pixels_in_line(data[0], data[1]): + for idx in range(data[2].size()): + var pixel = data[2][idx] + var color = data[3][idx] + pixel -= data[4] + data[5] / 2 + pixel += pixel_pos + + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + var found = action_data.redo.cells.find(pixel) + if found == -1: + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + else: + action_data.redo.colors[found] = color + + found = action_data.undo.cells.find(pixel) + if found == -1: + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + canvas.set_pixel_v(pixel, color) + + +func commit_action(canvas): + canvas.clear_preview_layer() + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Pencil.gd b/addons/Godoxel/actions/Pencil.gd new file mode 100644 index 0000000..906236f --- /dev/null +++ b/addons/Godoxel/actions/Pencil.gd @@ -0,0 +1,43 @@ +extends GEAction +class_name GEPencil + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + for p in get_points(canvas, pixel): + _set_pixel(canvas, p, data[2]) + + +func _set_pixel(canvas, pixel, color): + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + canvas.set_pixel_v(pixel, color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Rainbow.gd b/addons/Godoxel/actions/Rainbow.gd new file mode 100644 index 0000000..618bdd1 --- /dev/null +++ b/addons/Godoxel/actions/Rainbow.gd @@ -0,0 +1,58 @@ +extends GEAction +class_name GERainbow + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var color = GEUtils.random_color() + canvas.set_pixel_v(pixel, color) + + var idx = action_data.redo.cells.find(pixel) + action_data.redo.cells.remove(idx) + action_data.redo.colors.remove(idx) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + var color = GEUtils.random_color() + canvas.set_pixel_v(pixel, color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/actions/Rect.gd b/addons/Godoxel/actions/Rect.gd new file mode 100644 index 0000000..770e28b --- /dev/null +++ b/addons/Godoxel/actions/Rect.gd @@ -0,0 +1,69 @@ +extends GEAction +class_name GERect + + +var mouse_start_pos = null + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + #print("init:", mouse_start_pos) + + + action_data.undo.cells.clear() + action_data.undo.colors.clear() + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var p = mouse_start_pos + var s = data[0] - mouse_start_pos + var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0)) + pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0)) + + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + canvas.set_preview_pixel_v(pixel, data[2]) + action_data.undo.cells.append(pixel) + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(data[2]) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var cells = action_data.preview.cells + var colors = action_data.preview.colors + for idx in range(cells.size()): + canvas.set_pixel_v(cells[idx], colors[idx]) + + action_data.redo.cells.append(cells[idx]) + action_data.redo.colors.append(colors[idx]) + mouse_start_pos = null + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/addons/Godoxel/assets/BrushCircle.png b/addons/Godoxel/assets/BrushCircle.png new file mode 100644 index 0000000..994f4ac --- /dev/null +++ b/addons/Godoxel/assets/BrushCircle.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34cae0d90dd86270b0b2d5cb5e9d461d91a2c39c060d397094059f9a28d2f57f +size 195 diff --git a/addons/Godoxel/assets/BrushCircle.png.import b/addons/Godoxel/assets/BrushCircle.png.import new file mode 100644 index 0000000..6c0c697 --- /dev/null +++ b/addons/Godoxel/assets/BrushCircle.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushCircle.png" +dest_files=[ "res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushCircle_Hovered.png b/addons/Godoxel/assets/BrushCircle_Hovered.png new file mode 100644 index 0000000..b1d1dc4 --- /dev/null +++ b/addons/Godoxel/assets/BrushCircle_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36d8248278e07c92ffec9d673e42a6fbde4357ca913f992ebed6a27f147fac5b +size 3413 diff --git a/addons/Godoxel/assets/BrushCircle_Hovered.png.import b/addons/Godoxel/assets/BrushCircle_Hovered.png.import new file mode 100644 index 0000000..262712b --- /dev/null +++ b/addons/Godoxel/assets/BrushCircle_Hovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushCircle_Hovered.png" +dest_files=[ "res://.import/BrushCircle_Hovered.png-ae1a4d835af51e8a293b71d6a241b71c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushHLine.png b/addons/Godoxel/assets/BrushHLine.png new file mode 100644 index 0000000..5b148cb --- /dev/null +++ b/addons/Godoxel/assets/BrushHLine.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8af5a36a1a9ad1db6593cfe6d5d755b408ad7ffd82ca4a4a31b0c1b9c208d05b +size 127 diff --git a/addons/Godoxel/assets/BrushHLine.png.import b/addons/Godoxel/assets/BrushHLine.png.import new file mode 100644 index 0000000..dc4eaf1 --- /dev/null +++ b/addons/Godoxel/assets/BrushHLine.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushHLine.png" +dest_files=[ "res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushHLine_Hovered.png b/addons/Godoxel/assets/BrushHLine_Hovered.png new file mode 100644 index 0000000..41961de --- /dev/null +++ b/addons/Godoxel/assets/BrushHLine_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5205a28621d8bd821f9ac55dd3646fd1b2ea68cb18c4777205fe4861b8447f70 +size 1930 diff --git a/addons/Godoxel/assets/BrushHLine_Hovered.png.import b/addons/Godoxel/assets/BrushHLine_Hovered.png.import new file mode 100644 index 0000000..a5a460b --- /dev/null +++ b/addons/Godoxel/assets/BrushHLine_Hovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushHLine_Hovered.png" +dest_files=[ "res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushRect.png b/addons/Godoxel/assets/BrushRect.png new file mode 100644 index 0000000..6c8bf46 --- /dev/null +++ b/addons/Godoxel/assets/BrushRect.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dae20c1d91fb189b8661b0cd16672f4db394f0aa5c9d2676cf4204d3af1e487f +size 128 diff --git a/addons/Godoxel/assets/BrushRect.png.import b/addons/Godoxel/assets/BrushRect.png.import new file mode 100644 index 0000000..73e3317 --- /dev/null +++ b/addons/Godoxel/assets/BrushRect.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushRect.png" +dest_files=[ "res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushRect_Hovered.png b/addons/Godoxel/assets/BrushRect_Hovered.png new file mode 100644 index 0000000..f5cbe08 --- /dev/null +++ b/addons/Godoxel/assets/BrushRect_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4518db3eafa9fb90ac3b32aa0cbb287dcb825569d8685b511fa7b7539f9f27df +size 1819 diff --git a/addons/Godoxel/assets/BrushRect_Hovered.png.import b/addons/Godoxel/assets/BrushRect_Hovered.png.import new file mode 100644 index 0000000..df4596c --- /dev/null +++ b/addons/Godoxel/assets/BrushRect_Hovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushRect_Hovered.png" +dest_files=[ "res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushVLine.png b/addons/Godoxel/assets/BrushVLine.png new file mode 100644 index 0000000..12d7c38 --- /dev/null +++ b/addons/Godoxel/assets/BrushVLine.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e731a70c278759c163036f3ecc97fc1edb63752340c571267a6eaa512c291ca +size 129 diff --git a/addons/Godoxel/assets/BrushVLine.png.import b/addons/Godoxel/assets/BrushVLine.png.import new file mode 100644 index 0000000..6eaf85a --- /dev/null +++ b/addons/Godoxel/assets/BrushVLine.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushVLine.png" +dest_files=[ "res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/BrushVLine_Hovered.png b/addons/Godoxel/assets/BrushVLine_Hovered.png new file mode 100644 index 0000000..b771e31 --- /dev/null +++ b/addons/Godoxel/assets/BrushVLine_Hovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1e9fbf07b966d638c774300516a03f06874e870eba9af1280479cf774e57bb8 +size 1998 diff --git a/addons/Godoxel/assets/BrushVLine_Hovered.png.import b/addons/Godoxel/assets/BrushVLine_Hovered.png.import new file mode 100644 index 0000000..d1ec261 --- /dev/null +++ b/addons/Godoxel/assets/BrushVLine_Hovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushVLine_Hovered.png" +dest_files=[ "res://.import/BrushVLine_Hovered.png-104e29757699756f1b44bd32a622df2c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/Godoxel_Anim_Panel.png b/addons/Godoxel/assets/Godoxel_Anim_Panel.png new file mode 100644 index 0000000..367ca6d --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Anim_Panel.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef8ca7bd83b0646da103d0c9d4d3df1cda916e4f4c6511d2079b3eb02532cdcc +size 52771 diff --git a/addons/Godoxel/assets/Godoxel_Anim_Panel.png.import b/addons/Godoxel/assets/Godoxel_Anim_Panel.png.import new file mode 100644 index 0000000..474429a --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Anim_Panel.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/Godoxel_Anim_Panel.png" +dest_files=[ "res://.import/Godoxel_Anim_Panel.png-56f84f9044d8bd8d0a4f3430dba126f6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/Godoxel_Preview.png b/addons/Godoxel/assets/Godoxel_Preview.png new file mode 100644 index 0000000..c5a2c4c --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Preview.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65857240a730ea849c9a2d6ded456e070fef98f2d4f659cd30272148990903dc +size 67122 diff --git a/addons/Godoxel/assets/Godoxel_Preview.png.import b/addons/Godoxel/assets/Godoxel_Preview.png.import new file mode 100644 index 0000000..53fe208 --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Preview.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/Godoxel_Preview.png" +dest_files=[ "res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/Godoxel_Shortcuts.png b/addons/Godoxel/assets/Godoxel_Shortcuts.png new file mode 100644 index 0000000..911bd1b --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Shortcuts.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7ac2ef01841ba01ecf381ae54eeff3d19ef2d5edd4de7a2cb18cbbc72993033 +size 26603 diff --git a/addons/Godoxel/assets/Godoxel_Shortcuts.png.import b/addons/Godoxel/assets/Godoxel_Shortcuts.png.import new file mode 100644 index 0000000..06ba76a --- /dev/null +++ b/addons/Godoxel/assets/Godoxel_Shortcuts.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/Godoxel_Shortcuts.png" +dest_files=[ "res://.import/Godoxel_Shortcuts.png-bd1a4956e0778c5ddf36cdc3bb058831.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/animation_arrow_down.png b/addons/Godoxel/assets/animation_arrow_down.png new file mode 100644 index 0000000..fc0356e --- /dev/null +++ b/addons/Godoxel/assets/animation_arrow_down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c01e05f8d8ca6bbddc79091afcbbe70e1224d9cb423f1e586946e6ab44b9b2ad +size 118 diff --git a/addons/Godoxel/assets/animation_arrow_down.png.import b/addons/Godoxel/assets/animation_arrow_down.png.import new file mode 100644 index 0000000..3ba74ad --- /dev/null +++ b/addons/Godoxel/assets/animation_arrow_down.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/animation_arrow_down.png" +dest_files=[ "res://.import/animation_arrow_down.png-9edbf9aa07338136f99ac434cbed09e5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/animation_arrow_up.png b/addons/Godoxel/assets/animation_arrow_up.png new file mode 100644 index 0000000..e188ac2 --- /dev/null +++ b/addons/Godoxel/assets/animation_arrow_up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:093ac2c890ec1aee110dc9fe37f9dc4f5cd51fb9bddfa0d67df16e2065555a5c +size 112 diff --git a/addons/Godoxel/assets/animation_arrow_up.png.import b/addons/Godoxel/assets/animation_arrow_up.png.import new file mode 100644 index 0000000..ad89377 --- /dev/null +++ b/addons/Godoxel/assets/animation_arrow_up.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/animation_arrow_up.png" +dest_files=[ "res://.import/animation_arrow_up.png-8957357689f69c848f5f33d20a50a416.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/arrow_down.png b/addons/Godoxel/assets/arrow_down.png new file mode 100644 index 0000000..00795e9 --- /dev/null +++ b/addons/Godoxel/assets/arrow_down.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2d3dc2463161956db5a22304fc259637e019412634e94a9a81b3c2354416b33 +size 562 diff --git a/addons/Godoxel/assets/arrow_down.png.import b/addons/Godoxel/assets/arrow_down.png.import new file mode 100644 index 0000000..b9e87b6 --- /dev/null +++ b/addons/Godoxel/assets/arrow_down.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/arrow_down.png" +dest_files=[ "res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/arrow_up.png b/addons/Godoxel/assets/arrow_up.png new file mode 100644 index 0000000..d447bc2 --- /dev/null +++ b/addons/Godoxel/assets/arrow_up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d500266f596487515794fb573ac5fea3683551b0a45d6539ab5354fdbf0d5f4c +size 565 diff --git a/addons/Godoxel/assets/arrow_up.png.import b/addons/Godoxel/assets/arrow_up.png.import new file mode 100644 index 0000000..4ea01b4 --- /dev/null +++ b/addons/Godoxel/assets/arrow_up.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/arrow_up.png" +dest_files=[ "res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT new file mode 100644 index 0000000..40e3562 --- /dev/null +++ b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT @@ -0,0 +1,124 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT new file mode 100644 index 0000000..0f71795 --- /dev/null +++ b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT @@ -0,0 +1,11 @@ +Contained herin is the Bitstream Vera font family. + +The Copyright information is found in the COPYRIGHT.TXT file (along +with being incoporated into the fonts themselves). + +The releases notes are found in the file "RELEASENOTES.TXT". + +We hope you enjoy Vera! + + Bitstream, Inc. + The Gnome Project diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT new file mode 100644 index 0000000..270bc0d --- /dev/null +++ b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT @@ -0,0 +1,162 @@ +Bitstream Vera Fonts - April 16, 2003 +===================================== + +The version number of these fonts is 1.10 to distinguish them from the +beta test fonts. + +Note that the Vera copyright is incorporated in the fonts themselves. +The License field in the fonts contains the copyright license as it +appears below. The TrueType copyright field is not large enough to +contain the full license, so the license is incorporated (as you might +think if you thought about it) into the license field, which +unfortunately can be obscure to find. (In pfaedit, see: Element->Font +Info->TTFNames->License). + +Our apologies for it taking longer to complete the fonts than planned. +Beta testers requested a tighter line spacing (less leading) and Jim +Lyles redesigned Vera's accents to bring its line spacing to more +typical of other fonts. This took additional time and effort. Our +thanks to Jim for this effort above and beyond the call of duty. + +There are four monospace and sans faces (normal, oblique, bold, bold +oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see +www.fontconfig.org) can artificially oblique the serif faces for you: +this loses hinting and distorts the faces slightly, but is visibly +different than normal and bold, and reasonably pleasing. + +On systems with fontconfig 2.0 or 2.1 installed, making your sans, +serif and monospace fonts default to these fonts is very easy. Just +drop the file local.conf into your /etc/fonts directory. This will +make the Bitstream fonts your default fonts for all applications using +fontconfig (if sans, serif, or monospace names are used, as they often +are as default values in many desktops). The XML in local.conf may +need modification to enable subpixel decimation, if appropriate, +however, the commented out phrase does so for XFree86 4.3, in the case +that the server does not have sufficient information to identify the +use of a flat panel. Fontconfig 2.2 adds Vera to the list of font +families and will, by default use it as the default sans, serif and +monospace fonts. + +During the testing of the final Vera fonts, we learned that screen +fonts in general are only typically hinted to work correctly at +integer pixel sizes. Vera is coded internally for integer sizes only. +We need to investigate further to see if there are commonly used fonts +that are hinted to be rounded but are not rounded to integer sizes due +to oversights in their coding. + +Most fonts work best at 8 pixels and below if anti-aliased only, as +the amount of work required to hint well at smaller and smaller sizes +becomes astronomical. GASP tables are typically used to control +whether hinting is used or not, but Freetype/Xft does not currently +support GASP tables (which are present in Vera). + +To mitigate this problem, both for Vera and other fonts, there will be +(very shortly) a new fontconfig 2.2 release that will, by default not +apply hints if the size is below 8 pixels. if you should have a font +that in fact has been hinted more agressively, you can use fontconfig +to note this exception. We believe this should improve many hinted +fonts in addition to Vera, though implemeting GASP support is likely +the right long term solution. + +Font rendering in Gnome or KDE is the combination of algorithms in +Xft2 and Freetype, along with hinting in the fonts themselves. It is +vital to have sufficient information to disentangle problems that you +may observe. + +Note that having your font rendering system set up correctly is vital +to proper judgement of problems of the fonts: + + * Freetype may or may not be configured to in ways that may + implement execution of possibly patented (in some parts of the world) + TrueType hinting algorithms, particularly at small sizes. Best + results are obtained while using these algorithms. + + * The freetype autohinter (used when the possibly patented + algorithms are not used) continues to improve with each release. If + you are using the autohinter, please ensure you are using an up to + date version of freetype before reporting problems. + + * Please identify what version of freetype you are using in any + bug reports, and how your freetype is configured. + + * Make sure you are not using the freetype version included in + XFree86 4.3, as it has bugs that significantly degrade most fonts, + including Vera. if you build XFree86 4.3 from source yourself, you may + have installed this broken version without intending it (as I + did). Vera was verified with the recently released Freetype 2.1.4. On + many systems, 'ldd" can be used to see which freetype shared library + is actually being used. + + * Xft/X Render does not (yet) implement gamma correction. This + causes significant problems rendering white text on a black background + (causing partial pixels to be insufficiently shaded) if the gamma of + your monitor has not been compensated for, and minor problems with + black text on a while background. The program "xgamma" can be used to + set a gamma correction value in the X server's color pallette. Most + monitors have a gamma near 2. + + * Note that the Vera family uses minimal delta hinting. Your + results on other systems when not used anti-aliased may not be + entirely satisfying. We are primarily interested in reports of + problems on open source systems implementing Xft2/fontconfig/freetype + (which implements antialiasing and hinting adjustements, and + sophisticated subpixel decimation on flatpanels). Also, the + algorithms used by Xft2 adjust the hints to integer widths and the + results are crisper on open source systems than on Windows or + MacIntosh. + + * Your fontconfig may (probably does) predate the release of + fontconfig 2.2, and you may see artifacts not present when the font is + used at very small sizes with hinting enabled. "vc-list -V" can be + used to see what version you have installed. + +We believe and hope that these fonts will resolve the problems +reported during beta test. The largest change is the reduction of +leading (interline spacing), which had annoyed a number of people, and +reduced Vera's utility for some applcations. The Vera monospace font +should also now make '0' and 'O' and '1' and 'l' more clearly +distinguishable. + +The version of these fonts is version 1.10. Fontconfig should be +choosing the new version of the fonts if both the released fonts and +beta test fonts are installed (though please discard them: they have +names of form tt20[1-12]gn.ttf). Note that older versions of +fontconfig sometimes did not rebuild their cache correctly when new +fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" +can be used to force rebuilding fontconfig's cache files. + +If you note problems, please send them to fonts at gnome dot org, with +exactly which face and size and unicode point you observe the problem +at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd +-fa sans"). A possibly more useful program to examine fonts at a +variety of sizes is the "waterfall" program found in Keith Packard's +CVS. + + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login + Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS + CVS password: + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall + $ cd waterfall + $ xmkmf -a + $ make + # make install + # make install.man + +Again, please make sure you are running an up-to-date freetype, and +that you are only examining integer sizes. + +Reporting Problems +================== + +Please send problem reports to fonts at gnome org, with the following +information: + + 1. Version of Freetype, Xft2 and fontconfig + 2. Whether TT hinting is being used, or the autohinter + 3. Application being used + 4. Character/Unicode code point that has problems (if applicable) + 5. Version of which operating system + 6. Please include a screenshot, when possible. + +Please check the fonts list archives before reporting problems to cut +down on duplication. diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* zC^QzD=7A5@!hAMQtdbVU3v~1J<@)*N#pcD<8ljf06jwpfN)(KwZpZzF^0u2a0p-|!ObcW!}m_*E{=TZbfN8XRDk9()43 z^bP|YgmykD6|i~dJ`>KjIO|O5Cb*~wU%^FHpFlKXG(&K&oz_fa8y~g3ucYqeTf%SN z{1Bc(gOdw2D+D^=XD)Ul1RKt5us+a~pieM$7kcY^nnvg+N)PIbg-7)Bgn6bKVTn*H zt=6wFZ4%ZCTcoG-n@yqcQkY(+GawWI=Qhw_x5U#9LL!ToI_MG%i6*zD2jN~o=NqTVAwyT6x1cLziBqm2}Qk#f_k%@{ls=PlC&v=#|>^ zqfp(vf`vn4HbG;4gEgfmn>-!7yMh)DKqff{^y%D@L)L=mk)TU;2341;ak^hu8^p-f zMt@207kUWELNcT^Q}75L$)kTjctCnUUnD#(Y!vJPG=xPO<7p!6MSC-k5&L#FpOqVT z8~N!FQzZ@BSG<(Jc``@lvoS78Pzkp`_uJ29xQTQkS-A(w&s@((;Fma(i2kv z3(?z6Nv0mGk3P*blnvL9HjQJG^u?@1UuK%e=Ia-mcAEk?XK+3NJJN$jRf_dZIqdA+ z0qjWAbm_|WyJZKriyJs5Ja=LuGSqZrtj8uEkdF!n$V=GFv%y4<6Z{K2_R9kmEdfy^ z_@NuP#Uk}!7=FXv9km8sKhZKgGE_QSnPj|$9;S#*su^0-{f}qemoF9!2Y?1 zP^L`${(IT~$3NG}B8T-V+m9>9kL6!KYIHDj2H!2_{UBOk>`|Q z%CK_+groTqU9HSPQUfIZh7vCND~GVVxBZqJfK?RjJo<7OWCedj|GR%w4%O9hYz~UI zgjI4eT6Xgo=rQuL$c9j)GH@io1#g@d$z?#{{&)aifwYWjcN16f+R&pRvK4EpZYa&mEorr04tO+!eKo(>%=uMGK@1GG5dR@2-+oXvu zeC{U1Sy-f$cxB}%yZ{Ol}D6Emb=TNmP9OxT;g65 z71Z`DaRBWFHnoJBquRyZh1Wkjw6tv7iN?mXQ!5XhZ@x=~=eFb>&nS<}K77x+HXc zXhSI9ytTN-JPyx;o$9U$@mTgv_ER}8pE>h#&QsZ=_D*SrgV%-1fs|Bi({63DFBf9ZpjQrxyHQ9u(84 zb-Eq3cwkIrrk3y$(DpomJ=56O_oc_q-@AAIv6q_9f^7TugLLe;F!iS!`wR2w5UR&( zNWS9ol84cfS8g#Js!WJsBZ5Z5d%I zh^N(4AWl5(X#2K$Wba8#3oj3E2>&4bR=AW#(rB8H=1L2dI_r}3NrukGGEzp%gfdrI zsA0;ZoWN0PT19Ih89P!PBFs1f5f?WdHD7#X=GkclA3UPmR?gDIrZ1?jQP{h3`w6Qs zb@J_SdZhAmXW_>q1*2$^^5KaiM-IOx`)|vcQBc>E#6GOce)V~k z2g-PHGI(G@w##swA(+Dr&Kkdf6E=1tKBh6@l;MQ!wUF@mV4^n-IxB7~zS_RQY;O?&rls^8nFD0lJ?J@CM; zF~2?5=jdanv=1?6LYoCr+flJm;-5!k*@bgk8ILy}qZpR`ze+RaE#rr{7y(`U1?$&!szI zSNXd55;=u)X}w4?Th65sx5fJAdqyqI9_yP&fcY`?TaEZn%)8ql`~MZ=-TOotua0LT zHZsH$W)gJ7`np+HE4@ZenP0N&?UFp&LiJ{nX;+V|uS3a0k$?~UjFdA06FEGN97mp` z+@Ve6?+XHJ6F&Rf%x)zk)mhhk^ybd|ZE}adLZUbYcLEb5tWV;v$AV9hExur|o@BNU z24DB>kocK!yI`rx3ev}gX}r!xb9uuN4kHrTkPNBEir^gc6neI zZXpj&o;)GMeb;Z%=vT-VfdZSBIKIbX_r~kX zrCSJ5s_X)*WdEP=d&DZObm3Sv(PXkGUUnLSY(x&%xy-fUZq^ujD%h?g4x3&t=Q#AX zoUkC6q8Mndl%^)c>r~IUfB);Z)i5p>L62W@Y)))>?E2USyxxfYEcRZk0Wzsdp{uQA zwu-1r6Vb$sHl+eR?MsSYg*QJKlJ< zxmL_OJbl_@UJS%SVBm+-xOVI1)Gx0WZa&rZaxBmFdnB0Ow_?2D{OXFq#C*YMI)9F; zZvvrj{Nxi(a>Crm^DCXU2bj~9abJF=CnhbpnpDe+b&K_jvDaB_sx~jSEVeGTEw(Rq zR684jZv{I5O`DXPc4?TEn+`o+zwywajkl;%xq0jF%JR!NLdJLL> z@s|i31n`{QRFyP5Jru4*JC~#K#EBNqLg?*tH}*FlmW>D7_!jg#pUDLETC}wao6qlQ zw5h%nT|I@~n`(T6X(+;+_=KDUKj4*MM&x8w=Eq1+cV`Gc=(|ov%Q7=6B z)4#kj#fF1&4wCHgmk~X2;JT%?(QryP>kVR# zMKseJ#DovFO7yRBtqS5kSR8yXUlempsNSm6`$uPV;80y|7sZ5Ah772G-sFo@-3e+@ zO!bq;cM|yKb#|CB%oJws3fH2usk6DCp`Wpzsh`>8CTb@WT}PjYn(=n&B% zGSQtF6`N3FtTEM?Yb;IzdI^GTlugXcEX>Mm%+7*Y2n%IlxK5Rjl$e(IaN^>`C5h`3 z8xn6N24R!EnLb|&DiSf{gYR%nzkwJ^xl8}aq>H}iqGUPTT}GB z=lQLF`CaibG3{`N4!OCWtSD>8ZL4-3kBND`M~_JljL3md zcoYiWXdc3CPEW%9u?`uz1=iaodL%ppG!Q^5Ueb>{rB!F8#- z!=EKFt{aBHAP))hP|^lrkD%xC8<0uD4-!IHh!~H6Y9dP%-TEG+2kp!HiU^<}%$LQo z#7t?J?9q=W&Bp;PJ9ca(?jhKjBw-PoFD?Sp7t0HEixD|oU|4LZ zHqJFIGS~7Gc^q!>6=H1qPWFOrl>|xJ~&r1j71G?w+d(1Cd ze=EGiUK8=#0fslMr-gUe1@V1pfhs7WG!_47jETmKZ~XeJt6zWBsC;tu?>}6H$ZTda z`TK4I+uSr0#O{YRhhKm|D0i|aQ{utfK#8aPI%<^^8cgAuMz7J_a?nJC?P`-n)}1Q5HNqf2SdgMV8ZEv zPgJ%VMbQ`{x{UG00b)1fIB|k*qOsUGmo60N>Z*)u#bw5A;%;$^?n&c%<34&od{Nx1 zd)C-s3`3ww!cm0@L4C<(2r==HaGaqd0>X%zvtCkn9S`FtTe4WDlwlZd@>p<8LMI86 z*aT_3JV`fRKi)9Olw&Eg%%_VjJLo3e^K_5yh~@W|&n)*WNnnXV;1ORnEH4%+kI;ix zm6OWJtMp~1;wnv~iDF*!XU%WXMrD{VTnJDer97540GEgXk6jfGjY_V z2B%u0tgS~%>S+qjiBr^j1e_;&l@oS#`P$)?wJcwi6Zj5jQSRf!E!=EIDpwZvtZw|4B*b+!A zOt@QgONmH^h%?5TV$BJbj@FJgx1$&IEkf2}veety)6~=4+tSC{$Cm6EL_8D$Y^0}n zyvsG+kYOBZ$+BkIJdRxQ0DV9h$8y9RaBUp8Ho-6fOLm-jl68_T$5Bj+g&D>YYl$t- zQLUeEoo`!3o-nL1tuU{$tg^1MZ8OxH>do7&+iiPHd(6*UpSK-x{NC}I5)v$PqHwFKf!s7g%2QJcLMcf}2$4XJ}@8MQEX5*(|-W;WL zu2kcNp+c5UGU;umAQr0cq<5QoB1oQW;xx=qX*gIv0ip7TO?fm=C}w$Lo-_^N@+GDh zO`%-Pv;@o_Wiy*c3dfoj3CEg?#Jv4YpKRREkOM}EauheT{gH9J%+o#C<}%4~h7h|e z+$6c97%?3%AiVpg!F9mzr8u*}D8&W@lW?QtC-@V0@L;1&io>lu9-)DA15cH2t@#^! zZCrBYn{7CU{KmGgvL)<}{9|AY{qDv1C`|PfiMv1p;QniT!c$MxEke9TO|QhCfK)MX z;7#wn7JNY`L2Zc(L53drIm$S=}GE%efc z(?xZG?$6Igxf;*jV~Ot{FGEtZeeQHJNEYJvVFJz=7*# zJ@-@E>*MQw+_^3^c->P!uA5M|@zY!Nm338HzW;O+_;QtALI!;|w1TXq5EU9aG02VBL<69@0+~m^5(I*rTH}`m2v4$-R5fR>)P>WeZR<;0lhd zDI=%o9Pm)9nT=?il|+&Ao?NrTVh#-pwK~E=Bk&G)goTA#98tC?v%_k(*`nMITT~?f zo^B4cSq$tgmm#9wVp!)6iwF-3az{p4oU#?$!ca0kD9k30cZNkpa|?MR#eVrF4h`_~ z2{8{t_W$~$o2cNpw;uTWPEEZ59sJQsuoH6Q7-NdZ9b&FD?=bU>v(TKFVoQm2j-}eV zAZ$VST=(3lB{60!*tR=ghO|4L+TptvqvboZ+(~Jk2@})OCT&%22~o<#0RwkeRy>{7 zU+~xRpXJGElO_yGn>bPV2NI#P6DzYS8=kJnoSS%OwVDzQ%2q0Kc#bhBi-ZqOS@J2x zu?}i@F6?UEBdF=1)j+g&(K%X;l&YJGnr_}2i70A~nh~b*DaBjEXo6a!W_GAGy?r(0 zrdp$(;vkD5f#)OOKOI?%p9tg-{JduHuhx9rt_C+tTSi;guBKO;nm@L!K^A{&pKIQl zN0mAJbOJS*Uf4dxFJW=m)JVJv^{^JGSN}@QVDf7 zQAYz;@E_+7e)Y>sgZ4Fpf3@c0b~PLV-)QUF)o=)WHGlNhsQX(L0@z?L1o#~@K=AXL z!TcA_ezE4`b~PLV-)QT24K!V!d;J*lW1veCkOM8AFycofn?mt4ylnqCe4gBW-l!vz6eO8>Z4Fo6eusLjinkN}T+#ZMg zj_Wje$GjobFxmMan;aCXUSxq9y^YMKc30u>0~&$+1{@DtVDSqir?fODr?hOeXKtsi zT~E~19&41!%5p}}o;`YW`Ori18U&^Va!5IgT=uOv+l?X*cslt7_!FC% znshiYGTCcvE6peT1578vBf}a4)9q16xb31!EQvCt~gnb+L>=Eq4R}P_>tA-6)HLCdU z{6_cRi)q%XmirWhpe# zG|(@U&;>V*%Z9NZf>v=i@~G|GNZ~^94OVm%{33iwJ z<1&z%NDmXLUVREvT@L*2h1cac#&Ze7 z5V|x)-Z*>qqi+Xnk&YctOx$t#<2ohj;6eIf-AyX}Ba+kqp?d@H`-D6@b|Bf{>7SI` z5&yTk@Z_GNCE%{*vX?KfqgE#khOi{ zgiU>mAN@4=qa{-w?APzTeOcSs{;rd|j$BdO<-x8aRtg*UBqZbvom^?t&)Z%!c})+$DV)wu|w|s1V zs(uI_a}wF^N$!#mWfoZ(w z&(kv_eQ;XJxnarY`V1fZzPZo)&dL_?J_sOqu%7 z)Gr_3N_Dem&zd!Rw(`@~t;$c@Gu17st}dN0vG~a0lDwe7T~{4i+AphT`VOgh>eQ)U zEnE8K)Ts|YJax(!%U66kW$M)FrRaTU`&Q-d?AfJwrqb5!RK~M1O}Q~}#K^Si^A?OR zcj!lDefD8qsxO@$=rE_yOk!_PsFZ{n&2jle=FS`hL(k@?PvYbFcg%1Cpn9 zG{{4y;^wGxI5K+Fi;D z1)ob_mR|qd^E*5X(+980{Nvrbf6Q7bUHmnYO#dYU{&Q)R`^BerAC8P(93FQ2gAacQ zgWjbHY@?is^=`(A|3FU^#ie+o=(HlZc+LWYj+6;$8Z%5YSqf~^{0bZ{HTmu`bgP-F7Q!R*Z%lE^L{@wc|+a_353Li5CTC)L<^{hC8O==)e2QFYBg{zy;UlYO#a{Xotf~^d++alKL3GPIdjh5 zXYak%+H0-7_TFn(NRTxz_{h&mXT*~OALL_}P8G?u)bN#lTw=YGu4layW!L|<-bws{y0zix&Yxqs(?g<9 z-ZNgUFGeg^nKyr2R%5?wP=B^))0J^Lg4Z3v5DYR5)=7mdq!Kq!ES$upYqF^U&#&0L z=7kh`Bfhg_Ok8`{ypR@qNacYEsf5eOI}JXDX;}EWNL!>^WL#vj+^S(}UgGcRroR1l zbotwFn>=s5^_IxU4^$C$ejml`#O1+Uc)0Ysy$0;|cI^>YuBo z`=@8l?XyBH_1}|O-^UJJWW}xp*~fz5aH4J$rkzsE*euOx87b8%W{788W0uZbWO${k z^75x|!>*vBqqjUW%P{fW*5H-0MQG8h zuLiG_JwuCL8?kYwX4x$JTduoi*Q7URMNe_x&^6cWnh3ldRY#3`^{Xf( zu)@!kpK1uWi*f=P?woQ5e)&u#zTV|AC%No55W@q;rJ#cTEO2JTWAc~-mVh;26OU=SC(E1V%krlur3ccJ^L6?9e0Wc@ zu{1s3l8=cE@tu}<%DiR1G6Ya7!K7%Ft_sW4vGCVaZmzOaS*vV=U4z|&J;S`ie8c>M zlLiL{Ctn3$;8k&d>Q$Dj;7=Xx8toqKx!!xd?|T2}q|t%V$rH9^y^#Gv&I`FO6uwaO zLZ5BL=)AITCZ+<#X%n*qI3ozNp+~;MT7;C34M+4px$ME4W~{tt(zplqT=u~DnN7HQ zu=(m=PJL)6A_x6^uY2jjho}?fzEn{e3sN-THtJ5r4fi{aAaS>6~dZ&M@oKNHYkPiWBTEGIS9u7b+Ga6kn0- z-!rSh$qWwF(l}I0!wS*3KfKR_?q>IM?#=F(-Nqu!G8DOrJ$<}=eATWR&uYg*zUQ33 zcC~t1ye@H~$;v)ximDy#&sA3M}7#@w@5s6OIHs2K8rdgtIyskB9%XdZpi0hYc z!bbFPv_=azRQ{p?duK-IUh8_L;TM&Hp%7+yKEo^kj%W!MAY6bx*`&8R^qS9YTAi6J zQ|{{bIcZj(OuJ{vygMTZVD*L=_gGniNSi0P&w@*XUdhUxmb*6>%l|H#f@jZ*EnzKW zT*Ja5Z|K#BS3mLOt9b?1?9Ad(c~^~dSFEd>`B+JGg2~o3a@`ZpKd*cA+%vT`cE=Mb z$z#S|fBl#-UGE8h&F=oYez&m{{@Y?z7fe${Io1qQQNV{I-X4U<7 z^~<`vF8US%SG*X#`u$(MscE--d{<*My7#UIxFkW7wCKIq4YM1P{MKNS&EU`(&Dav| zupwA7Vj`Ikt}hmv!h6-Ln z)HGP{vOlJK3^!MrM0rUF0qo>OFS2UYhR$Y-Jf)yG_)d8e;z#Bm)UiJtlpR%{Hr@XS$&ZEzWZ>hqjyGnT55_Z--lp~ zIzwJ^z?hrmbL9DE8}qXAVW-HZOHfeMcp_3F_V3G@Wq1KELmUL^L7pq^e z7(kzrlpOG4K$V%AndZ&wBb_o2YfZ@m1FI29CdMe$j8iPyCl6{S$FTa9Ic|4ZwYPsk z@7~qv_bdS%h(}UF|gB&KSXP(Po@cw?!^)p5c z%_(==Y|%5i7w)Xl>9yBxx?!?S4Qg9TzYClT-Ti~eeD%F|gLGUZBkJmKMaA#`n zJZA}-fRSBA1;YsnslioWe=1uV_I&l97~;vy1Xuus7VgFLR#ne{4a=R;y!aFi7H!CY zS!{r+wYnF&#_B>(_G`X%HF%&&HkZoY=iFAXmHW6 z5vv!ke%Nr!ExEZ(nVBz~yz=_sbdHq&&+wEJo zuGLCj#gf&BqxVMN{$uogM6%S&oQHWK*65iK;rVh+AH1@tv|y;qsRpzZBtIB<$fsId zgMB+P)A~PHy0b*T!_{uS%=T(l+9L(S22>ZC+^V2D(_H8dD2sDwp~YQVZOOfA7{tsw zhtAa^0w&rMpTHuc>=AXe=hJft-wJktNbq21g?JdH;pM?q<$cThm6w+HFE1-E5B3fA z3zi1^2g`!xWBZQnH@0+a|FLCb%OB|bK>5mGb8vI;h2S58`+^_i-^pMvcp6Q^oWoqh z+{VN^68RH(vAw{w(7DjH&^@i+w9;w)riZp*?(nOFK#=aHENCp z*Mno0hU!JiQF`XZTV?bKh8e1vUeSKN=I1+HBSs(k(SK+bY*Tn=`|LkWpT2MIZ@#^5 z)ccS9{=kJBX?}e8AF)j~x+i3Rf>u6xYV_!t$-DkkRfXLP%kN#bto`}(J8PyzQ{%gC zK)I3K&lolsUW<>zJ`L9P?N^x9EB!m;upNcY9qF%rXB>u6STD0L?}lQJFXbv3hk@lP z;$sXUM_e(3QeRy(4vWpFmj@U1(T0^yN}7;4zSo58xq+EEIBUkxWNf-%9dMJQ!C4<@ zNN>t$%53V@)VnFGDZ3%3DYq%FDZi3VX`zhY#`l`sXO5cbpMf!4 zy}FBIxHY|>OkJPxGg&U;OF%yVn;NA3r#9 zLI0m!*Kx0gmBy6=p1=O3>)u=@tB(g%K0gMw4I(}2e+PRt8*1ypU|DuLHny756sI>- z&i#3gC;gA)ttv3(rX^dAno7?_r~)lFGp7)N36l{i?ZhF*c49{dj$<|&P#pa;dIE3` z`yRHB2ab@$;y5haxODnGXuk`aeeW{eWxglVD1MMwjI_9d<3=P=9uiAU!mc8)TBY{& z>(!Gd53am_{+Mmkrv72ps~?Y=G_kx8;k5R=^_F48h8aJ+dE)m*P8+DX5S{O$QxocV zYJzT+!GaL5dbBbYnU4!hzy2RiO+drqI|dWy99+8cq~}}(O%|f&dHt1sox-^afoGBo z??n;c=P_+Y^cSLOKhUzUMqnz&zbQeRVS^4q@={=WA@C{v^m|04iy@BD$Ma{O(@(|X zsV61h(C+t)X{JVu!%Bjw*hP+m4`9aV6n2#J3X(*|t?L?sw`WBsAeclFtfz;AK@23_4sTlTG}*0g zFnfFVP8*))Kw$UYTDq;p;(yrpd2)+edsuyLXvz7RJJXWiyBCZrhaI)DDIbifSS|Kc zAjF*X!c*demVSwEVg!>?A-gzWSe+lfTxwUvXPC@9oIz)j&Jl}NTMfp@@pFi6)D@2H zH*HB;EvCTUXd3+5&cV~m2HakD`~2KB-)bqt^56Vf6?E&fy)x^66pcLA^+5F4!9enJ zIXP>d)3rUOjo$u-PsWuvgylp1*RcDCU~gSk|E!u4RhsLU6&$@wHe6P-As5Ry92@+# zy;Z5Z7Q?ijScu|Fqz{NbGaFZjOlZ+9 zd}+*8L*N)R4ZZdzxisoBH$7Eihnv}$Kg@F&>YmV-B(W&|oUH|x4 zcjcM&*nPjp=sq(HZ{DaLH54E&CSuA$;*8RNA#tC+i0$zH0#(JTW6TVhY+vAD4(k^d zt3&?StWLAj@`c B$Rw4SzSQ=Ui5YQD@exg+`lsp<{syr;k8E%leX-35St!f~_w0 zE+oQ7#)2sDcnf$J5l7M=`(r4OGbW;a^J0GtdAqP3@9SOKGvl;pdM;&LxEn1QdA=o% zFL3gR&1(MwQI(uuV8y5dO~9H_;}?j@pw}6`z#eAP7wA<+G+EQsa0lW|u_X?RW>l7i zHnX-+uNI*twdXLfj~h=sP9@P2S+scGFOg_LqD2UZDecg-g4mzk+TmzlH020fO#yvM<9Eh0h*iLr84cnyC5N%zvrpX`>Y%TJrOgttP z<>IVPeDyy)bV%27`0$yw!-u2%$Qpv!+9Fv2lUQ|Rl2u1NPha(E z1*}vu$_g0Z8*3&k4(KWmJQ+iRS@1N&&#YFZikI1%idaPfxR<@~G6&L}4C)65GdKd> zFSb{J27$y+Pk4(1ITHRy<)q}r{#KgLB%<1#eJ^@_^a^d4_TsEn(OnWoUb_M=Qzhg(TzmI;0r9HPG>(w;> zBLhq-IrlQF8zDBXxy)z1p|3CVssS)rWGgjo%$Opjafx+P3DXj+T^=kLR&`s|qN+_* zd#mZQ=es>BY}1@jlo zPwZ`4c;~!D(W9#qd!IyODeX&x(k%zZJg*>}z?YbQD0`D5`Ev2$5)vrQVG^Lrbup7)PrwzOV&qegm zyE3=~^Oi#)c4E$hDCR`5rXF~dAC)+(S$I0R+~A^q+#YH4KwMm zf!^^P`Ramq^8^C)3`FwP)cJQC4>OkU?-CJx@ouaPlzOKI?P{Zb6$0a;wov-#7!?>J zrdTy&6^vI+Ftb%3)!s|w#5o9(Q(G+NLhKj>$r&r&AjKOGKNa1r4U^H)2kNJoOInC4 z>E*@2B-N=ibsBV*4F;P77Tyx9zC@FFD1+d7&pAXVmp+5OE?YUpd87O26h2*N#2sr` zcq;1qMt6mHg-y{s{Z}SgQ;2{~K`%tP1@Zf0@l6p?1wNaE8N!v=RB zyol1GYr2o={>+hc-=H6>$r1exM*``G>mE_-44@k7fu?=>X~O0Ziv#9{%omn!J~w5v z@#N`$iF}``#u;8SY=!kxrtXKPvStJfrM*>ArY@(K!&jPQx9RB)uu+h6lkOhy&!aS z+_Jn_arP+69u0Y+UKHA6PrYF@EZ+ch%`bv|>`AF+>_+pfcBQ_a{G#h;R`r@u!+fV9 z86IkPlEGq0Q8v@H2(kbpP*!lu@(Peubmiw2UtvW`+}7>!7N*l%n6A>}-a-r}xHK8R z(PZ3D%oL}4l07L11ej(h&lsDr(!J8N65$&5W&9(KZY@KMa8W2CgYkkeBGb)=! zZ_#Y9WIUSBb#1aVG1kKK4V3m>6i6VMtxHzPm$VMQQ6TOoTIVfK8Jn`ww$i>bWpm2D zlz*gPDvbl3OT!9apNQHK-F`l@fb5GlHe4KA;QR_inJdrsnRY0TWrq#=#$|J?()}^X zttNS$Sc_Xe7y&n7Cs#LUyk$kIPW2IAK2UnvFFXvhvTagWrZTw zDryTqicZm0FdMH^K4Aw-4+=IPu_)UBz~R^v{JWEKcD%i@u-#VcTgXhshcj=N;2UV ze^KmpI_kRUOi>Q8m&TP6Kf$?RQGjexN_{*A_&QeLwjN| zG-UWkvB!BGm^uiH3tJ~PEWAWE%N{6+h;++^>+&v$nRPAs3g_G>=1?xMXf8TL?E;@@ z4g|jcf^=9g8FN}+;xDy)ee?9`7ap#5`mXqKYK8(Hu9i4zZEO7SwN3HE*mU1>+SJrO^j?Y#9o{{kD?9Ji5UE6e3cpSbQb$5)nr*Wxx@lt=Vs zB9H$3YV=Fisl$Y#mHrGwVHQ`g_luWf=q{5d-BCQ5W|kTxo|t1#Fs@U&iPX!9C;Ir4 zArR&}FM69P{v>Ae%Qzun^Bdx;-eXUsoWv9JMNclwV~RhCt(2E1iIwt(_)7WM6M0+W ziTR=@7v?d^6ZFyDsP%HpSL#*vcC|~VT@Cbb)@mxf{Wl1WwL zY)_-CU&7H`cVi$OTP_LrWKV4U*cwwa#pVTDb}RjPML6gBl_$PgyKUQAS;+LwH+b_a z#$Ni-rfSR!+!4%IKC{bi(0pdM-Qarz#~8g4u>WT!4jEA9z=Y&`vG41iOs&0Lqa#U?dLDzvM!DwFz>hT5N*wYd8gBFNNdr(i7ZJSdRxUw)^tZvxEGV z7q&KhkNx(WCroqRW81iH-A2>MYpxl6?PJZ&SgE$&I6^m*Ys>ltt-5#BpAA@77MJ>o zR-poy2IZnBZv8v&m^|-@)$x_#6TJ_SEM-N_Z9y-#*8G=sxBH)|YJy`KHqxX*FMKU} zL?W9fFcqU&Dmf<=>kfMMD#{AB#Icho`a3BuuoSBk3*=!z>YkbyyyE7YuLw@8-?Vh; zCixn_9yal2+?*I(x_PtQ1MamvgfBziz?!M7pv!8qIsb(t^^~VbZ^a6H=?10wJ-k^qu8+l~{y`ukPH|Z&$Bs{Rm;y zq7O-&WNFK_J#EPjy6rBT`CqQD!Cp2)krzgS1df0qcP`eLO0J8Q9?-LLQ+xH^(!SLL zvoFso9MQXeY1Pn)S^fLF-4EDoH{V)52QRuv66n=7gZ2_m!@C>7PUDgQ3-m6o{&ysS zzA~k{Qm?&2LGX>?D{a{~-=OkZ_kY1sy&GdeCw!E>5lK|seaZyChz0h5-Gw75v`mM2 zFhXIwWaulVTSDt1iZ~p4<=e{LW8Dadfu))SDH=^3j4KYlt<{W;-iv_ZQ=ho*6GW_g z>cfT6uMp*5H)QUDjneycVA+wdk?m?~5J6961)>RIQ&FrHYyIjGkjPda+w<}1x!O;A z3Y9fKoD%?3erHp&-xCifztm7~Tjc!MdD3Z>iecyjdkobIzuI_h+{~a;`$ieQF~VDBH0iL66t)(6s5r{F7t)VvV?QKz zHayj3)15LXfzsEpt=YH}baP;YF)Ntuv9{QqpqlSVm)&gE(qM)=lhX_pHm@_&qL!!A zZ6TXLV`qfCSrNCBf_<_xnlfI<&~LJCvTd?&!tVJ^?oFOe-d)yRwq5pJj$N)@?p>Z; zUJut_(9u~lbzb90BMcA z-6n_6cZ127Dxtt2`=H5sR#yVq@y)RqN6Rod7Ci+A!&%~Am;C)tvnw7TiU+3*E0G1I z_aqne&FYg|mRFWvTu@qAT2#_!V8PV|6SF7gOhcr>nYnjo-<@-JuD>7;!)UC2FX}Te z9|`iWDwv!-Ij1hW4s(P}T9d9`-@rIQO&7!oYVtMto01v=^%?b?E0leS%W^lDoGdAl zaa&@#FScgTFN^ABS{#$(;+8AIv71GeDFrD;{nZr{i+{5t^!U2aKm)oU2JxKqcw1yAA^HVAvQurU@I3c2N_=<+M#Mvd8LlU-&L_dg ztLy={6&>D}hPi5+hJgAQAHp}>6C++`2N49wosyL@EakS8*hvLEE|Ia}v1luH{7d95 z9M%;J4*wRy#sB=r;JI% z`~EmdCt`7uE{#RRI7tk;_J4|#WPZKtnePph1bO%Y&MW;;_a5ZJ`BO$?yL)2`GPrV3 z_nxd1#E@_pj=<`G?0g`2ooz!b!o&v578r1{7lKh3H(&#XVM8n;#RiE;fy2I(Z381x z47bU#L70}YAn2=AqDPx$r4|-gG8hF`efKQ?PV@)yeo9%+Q}Nzy7=@;)(XenE5i>uf(PT0V$JD0ls9PP?{o8)j?OT_o zT$cN^fD5Z65lk21!nk@zBE)lSnHWW4R*^0~n2%Kh5l!L3Wjlc+&4k&I=et^ShiMaM zj~`G!^126V)`g-k57N7qEXW$9T{d<24S9JDnVCPjb8Ym~a@4L)_b5G#ebmTck(}0f z)S7iP+kZ6RJZk;c^zY20+27`^D^B*Sq_q1AJ@?5uoyDjiW+P;i1dVX`_+%_BixFfL zT&{iBNXmndj`fb7HAWbq>Ks#My#8WMkAtg?CPvI`#JHxAmEM!>ED#4k?~<7kLAD3^ReWKYrn4{ljP(>@TysV(5juz-Jy~* zcQ`$dB)@9>nO&FVK(ug+#b)|Jn$LfgoRx`HL+4UzvGuxZW|JkdhU=PT7#+PZC z!NJ+SgSno*=7ZL>r_)2pPxjJy{8rhzUXK)8EBfZ<6z3IU=1z}YB9?yHg?_Ww0)r<_ z6_(_b)gIbYagNbS;|}te&S&@8Q-L*@J&OpA3hrQ2_MB2j*AOG?U~|qjFQjr4P6fwE z74Rg)7iiYwEN{)OvtM>o(j3Q~t_ALeo`v3pzJ>ldN%OK6W-rWHn7c4U4<24-d1!~}?K8a3ybb7EUbaSK+Fg$ik z%gkTCm94v?y6bbD?D2hlQ1s#Kw|+UZ<(5f1ru}F1?LG&q*J|1yt2gw~2A-(ffpf^_ zO#V}QLu&uL?Ea|@?QczG^lrB z%qF%*$^K5UX~m6*A+rku%h+i7d$vZ&Lt_8G-4*3UitpbQg?Fd&6busTd=&BEcXvyn zgP>=~>~mtfl<@;Btbu05o-y4?dKa272ZebbOeE@uE8Q7P{b23~+fGCgy%Sdr@$-XG zGMCCW!z5xA`aI|_^q>XWTCDA$Ex5U72O2gTy2&Pv$<|93rA&_sWJ@*(W8bK zZdUL3^ykJ?(QlzOUIC6r8^6SQlDmUB$sV`f@4yl8dP|Dq4TJxU49l6`9?gx@i6^9* zCs+{}B(5x|(rWRe0@f`Ty(emW>0!W$+Fp8i@HUS?(t;wb~-AHP1Eo70Mia&dMz=% zCWteZaDInGX;<3+znI3RZU3(V?c7HHeQWKB=}7@Gh~bA0?zfoxgI#z6X!U( zMhoxx`R9Uj`06yZ7k-4xjNifwcP~~}$uW{}!pUNmJu$@Y;mDiRzjV-@z~`mG@)C13 zm!=Q;g#{c2VS-**bY7;F8m#E(aWCF8uN_?b+;eM<-$qYu-Fi{Y9*o6~KLe)#4?u}o zF){C;M2w^38)pH~p#yfjwBY}HMbRhpm@ig7y~mWTa`o9Jsc78E@C@sD5Kac$)~!*F zR)@hJ`xz83#Kn))uhq+{cWl*C?9}f77LiqHN270RRmsn- zUfmq6GtP|Os>|&9bpFnr%f&VgJ=N{YU$C@`8za3apJ?P$sdejb{NSAJ=@x$0CM5JEA zxeA$=a5ox1{4;GY9a#&iM-#E?T@~ z>0NiWBCL=z#}UKeXoIwU0ddt(Z7B4u`=i`N1F$$YzY2zb)V|i%$irr!bvt?-7;9A5O+ z%C#%BaR_C(Olw5mH+AnbuOE49m{*tUX5MMYt6_!(TVT4s!S{W9H+N$c-hE~F>~4ho zSL)oUa~~@8@lQW~;NuA&&6PWUTl}}%l=|yGjJrrYncYC78Z4!e4_5W@b0+p%>!GNY zt#K|$8y-*bJM}Aci3im0)lb#m)q_}Tu~z+3wWw!7^oOx_~?@Cy7)J*3`% z6@C({0b13+P}(=@8Px_qL0E-Uow`FctLf@(HADSLy`}c5chsNNyXp%yQyozI)PA)^ z%~JnR>(pU&P#sdURVUV;txS@&k>a0|&)N%Enh``f@Inmgs8>@r-{tHtB9!*zYQv)n;ir*41=>Xm}=eZGKzrl>3Iyn0}|E(~rjQzG|U9PgUbt z$nYBQwN_2Q-yw2ss8kb;STL>IiYOzpa2n;a-O_fnTiTpxlhj}8^u1ryQR;W$7ximK z{lfVE4d1U5b(8vC_?3EH_(j`m@O=aH`JK=R*Ha9yYL&R&XvB%pFitY!-y(y8-Kx}k zQg5{10^H9uwW^~DTCzPUY8>*0uo7mrak@&wzN`&~SGqp|Udr?xYAL?cOuf_?^M`2L zXKEzq|CsO|^QNhx$eYFM$=zr0d?UWQ!5=4ZUnOuQG`Bp4ZyDMK9>#NJC_tI`f+yv> zRo;PB(I(;@wAUs?*Wevf^_5t|R;hNQZDsOB{u=Tz@=1Q%YoMplLuirsi)--TGvL1{ z{+jR|B6Uc7$!o%I_zIuko$`GJ-^2KZfw%Se`xXA?;qOWOy%v9W8=AWROLw)>fp=C5 z-w1ySj|hK&?`@drR2N8a8k?J{k{Sy@$T4Zc(HtuyadYvSKJ=`X^I(qDSs3*I7M zC;rOwc>fi=qAu^nX^T3;G*qxh@x{A`;VenmH>vUP!`zIxV3X8jbql=6x59sXo0_Je)S(lm zs~M1uvmo#1K-SNLoSzR#zYtP>G3ESSkn|$wmqEtYs|LvUM#%RjB@+IJ&_1G@9)x^; z2)g27=%z=YiGB>MHA9m;4&4Ol3(fU2$nBp)V*f&IfcDy`HbIv>4ej(R^{o1}dQSaD zJrAAMs(!0}2aOeiE_y+|s6;1-77&f_s@ef<(yp)-S-q}ysXt&9z#pOS_CQCx2@Urr z=()Gl+i|V7ml{p<*kS0L_n=`uh-;gp&@~@H_k5!MgL>#Q^*QwF7tmv!&{!v+v%Z2B zJV~AUFKE!O)hXyL(OPGrt3{i2YcS~~DlxoQMpzPN9BE^PFU<~@rPI1}=3TRwFPc4L zfosu>C36-|zhlONyJjqzG2L+0-Afi4?-)3ssz%_za>C09D+ntI2NG5j4kD}}+vS2= zccRdbR+^Roi$T2K1JZ0Esc+2oNL~FRp_(PM?bf4)H^R?#f=5v-Amc5p* ztjX4K)}_{vEz96vkn&M#M(UNRD^tHsOHR8t z?Ij%XI4=F^^!GDXXY4@~vS0SviF2gx&H5tymh2_j|H7iJ;W_`2^N*Z!xz^ldOgNS2 z4$U2%dvose+{L-~<*vOey(Q$(McW`yT8!qTgfv zUMwA3y1Bor|G56GWvk1tDF6Ls#>;Xp8++N_ijfud6(3bzUAYMV8Y>^J{8{Da1L_An zHsDtS_7CW;%B-rXnpL%~YGc)JtM(4OW#CT+{<-?f>Xz!`gVdnRL8EKjHJLTVH3Ms| ztQlK#Yt7u6dux7Fv#w@i&2MX7t?8&aQ1g$$nS&b!Zyx;F5X+FMLw-DD&ycTcb8By_ z{Y~w*+TFG9)_zzU9eT&*LoOeA`S{D9y8Q2#cMZFJ*rUUa1P2GN2~G*l57q})2cHN& z9SjBAgMSJh4*tg#!7Cm-)!&`^{`^wv{+5r8$_4*?GDZUY?By&kZ(+X*OhwI0YIff8-e1L;!;IG)#&x+A!r%n^~2#Fah>=tY`*)r&A6@5xt%ye=WEARIs_KJk2D>~=u0 z{E@o55pZyKGay!70oL;A)lB~b!jXidK(%}|j@LI4-b^@=xh4Vs`D!xopO0vKcLUb3 zCexW_7U68BT*&K1go_E65H2NLPFPRaK)8aik?=mgp^0!M;VQxw)(z8TD7TH}h6uMX z*Eaan^3}`Th&O{Ma#FW;wy^`8l@A#$7>f|@WBUDs2M7=Horeey6JoT5^qqXealY*o zQ=aDiv%Ee>*hPqAwxLV0+De-LgA1? z)Isjo@w$cAQhFh9D^Ej&+X!FA??T{Hp311G5cm`rArxE{0$1`>@KeOHu#*ROiokmU z2lKwPx(K~b?nsG6N=ht3ZxR?H+y-th0v#iO(&{4Bfxcg)!h9Mbl$I8=lw#$LZpU>m zP^uUujsO&F7lZ!=j^Leb7yq?JWQ<$cXa1P;I!g+*u63!=FK)8sx z785QZTuQi{Z>}e7AY4J%NO&L9G!d>OTt(Od%oM}=5ZK1|hX@4^#jro*{!ZTM!1|tI z;6d6LAr!h7tK+;DikA>4C8Tl*Ft8nW1oI`J^?E>|bqO(FLd=(t)+MBM3Ha?Gp1w@j z&h#CiLJ4VILRy!A%IhJ!g_rtLBK3tuDc919zHCKbyk|SEUj{$-1?{#&%6kZfA4*C6 zQr4lAbtonEOG*7w<}GF3Qsiw$dZBwM+Is|g!qZ(0DDUZyUe*j)K`64WzZ!(v_Gka< zkM?fI^$4aMi8}WO-33l0oC50iXHEK}56XLH5zgit<}lY>!g+*u63!=FK)8tSSxmTu za4F$(!g|66!WD##g!d6P5w0X$Mc4xQ+@IL%Pi*ujHu|eAtkpJPvOjUsADkdHZ)fYI zC-x_P`p5CJkLmXl9w0o(79AoyOxVf1$N8SKOw$Ee2HYN@q=cIqSltd-9sL||5NcS4 zUYrFu7@St7YNICsN1*gF?9rE8;|M1bN^dFyr^$O}@jbKohB-_x-l;NJ`U3AHoKJ{J ze%uj#fsrQR5<<}zWlHo#nG$_bhIkGFMPHOD(HCXvKEfu#m4vGZg(u61)iUt8)F(u^ zg|*riy&b<^?vgf2|0+}MY?olQ3_LICBZT{yem~&>!h>wlA;QCioy;peu>!rL2G9#x zT|s?aL5_uGgIZOTpays8IhbiY0&Lg~&a6aJz z!bQxxm~aWpw|dMFYN7V&?^ftA6lat^m+(Ttc7Yd zBH9Lcb@W-lk%ZTRvejxFug6CZ;(7wpOpHcwJ(<^2(C@0zN91kO`L;Q{KbLSG;hlu@ z2^SD9 zau+F7LuV`Q2x}=Zm*%;UPHUR29{d{(pe5TL%L(+X1Jb^ufT4q@Tm|a|!1W-bpy0 zZ~@^WzF{%p62hf~%L(fV8wghrHWJ>)vYH5260RZ?i7}W~++g5Du0w>|SSztz2Ll^Y zL*cibP7Wb=4MES6r?dD}`j`dUhlT3VsCv_fkkJwC_%k$ieB@KX!9At@(Hc3 zIZQv7a30~Eg!2g(5H8{y785QZTuQi{u%57ia0Ou_;e9NziEt(1D#8}Xy;{&qS|swJ zmhz#Nc4jT`(~LV}Z`6`rwUiIFln=GQk31FIvKHJcP^`yVj4qque-Z0(C^hC#;(sXK zCU@j*LxJrh@DbkvI0`A70llchC~*6BK=Ck)f>%MH@bf6pQSOT-8ik&91)%WKDDu)M zye)uh;h!1O0a3!JmdB&6a zGSg2c2Tlggi!qNOezRM^b-Mw_5sJU-7VwhX zSxmTua4F$(!g|66!WD##gy)!7JV;a6kETG*$aODp$Q0IO3TrZjHJQSiOhL^LLNbcw zUq_y)BlYVbOQ9(tmyQ6I5Q>JaQv(Ra)~bVamH8JL9l(DF{;7kF+6*YZ!8%x~@>JSb zM=q*EOXXU8gLP=HTno3(!y($sHN%)p4v>$FW`=$9i=f>(z0rSBKdjd4upw9eJh>GeL4K5~GehQwPZ} z<%(~xj@r3SiEpqD6xRcaZ?F#IDQTnl2J4^&Bqc2j>gYP^=sN1?I;=;K_sgiEj-!S; z%-qPe_y+4Bh2(AGbE~7xSqG^o*Fw`edfw`kP{pI zbZV~Y)Lhd^@#&y=A<~HdZ94sL)2X?pQ*%vceWug@Hl1~tg|c8Lfh*boMJCLGwh|~K z&{-UT&O+(UxE5dBES5ft*qa5tAa}$UHw)6{AfU+bSsa1R0{@S|wfJOaK`#iD5$J5T zYc_4d*|Z5~qxA~+#g{mnZJEtF&t{!x(6ha@yKzS(=W^y+&RolpYdh|Ut8x(tAV*1m}>=dtzfPd%(a5KRxsBJ z=32pAE0}8qb2TzoBXcz}S0i&ZGFKyWH8NKtb2T#88s=KVG;5e<4bn7YhEy=N25H(b zhanhlW}0TEX+|2k|1$8|j5P90tg;r&;~W7LdD5ba2#a}NWJ?P?e3GV=*D{aOf*vJM z#&<0kVGEQ|UJFK(0;~CE85g%e=ExgF=Cptt=K&7owP>prXhnhJ2*(pnVtTO?T4*P< zkjGjmVOqe6l71QCa>9DT2ErADjf86mn=vokLjG(af3{%WSKc7@Y74ks>LXt67IJJ0 z=5*y+#+xlzvm{XFaS*VGu#@S3+fkgo4jj;b^GWzBcNb^GWzBcNb^GWzBcNRmy04A8 zuZ_B|jk>Rmy04A8uZ_B|jk>Rmy04A8uZ_B|jk>Rmy04A8uMK#T_lxe6H4Fj;|83NL zZRpo}T#N2&11+SDqWjvY`(%}#q!)^`QTMe`_q9>?wNdxAQTMe`*R)ahwNdxAkR7|+yp|b_ zZE6`)E@!TK!Un<>gpGu2Sd-=`G_-2t8$yIK`>+l471+-Dgn2(gD0275)wv?IL} z^$^cSJ3Sli^lY?)7R|UL^K0$&Y_!v}(GE}4cH9xqMms$l?euK4qX$V!nMZ4#k0`?NhNdMqP07SlMe8wTo)4xe|D(8gr(@G9jZUC%LoN~9jcPo z19)Asl7tclq_*38{w6_Bi3_co2FnPat z&O3Yx?WLH_JeolGzO{|@k{ykGdUgZS(qKEu=nVd{b~B}|yQ0A--P zVQTF#bwQZAAWU5lrY;Cm7htpoT@a=&2vZk?sSCo?1!3xfFm*wgeLPHE5T-5&Qx}A( z3&PX|Vd{b~bwQZAAWU5lrY;Cm7lf$`!qf#}>VhzJL72KAOkEJBE(lW>gsBU{)CFPc zf-rSKn7SZLT@a=&2vc%~sS9MCJp9Gf1z~FKFm*wgx*$wl5C$$~Zc;|9Vd{b~bwQZA zAWU5lrY;Cm7lf$`!qf#}>VhzJL72KAOkEJBE(lW>gsBU{)CE{G1sNV8r6QzMgp>jw zfKpf&Kq&TAgp`VqQkWG%&x(*zuqr?)c(}n25mG8bN<~Pi2q_gIr6QzMgp`VqQV~)r zLQ27x1L++hr6QzMgp`VqQV~)rLP|wQsR$_*A*CXuRD_g@kWvv+Dnd#{NT~=Z6(OY} zq*R2IijYzfQYu19MM$X#DHS25BBWG=l!}m25mG8bO3CgAc>nQFpx9RtQYu19MM$X# zDHS25BBWG=l!}m25mG8bN<~Pi2q_gIr6Q!%K5FfK)Y|(3_|QETs`*4{_0 zy^k7UA6vAKT6-V0_C9LueUy{?sI~V|Ywx4h-bbyyk6L>_OWe;A_p`+PED@{R(8m2N zaX(Ak&l2~u#QiLBKTF)t68E#j{VZ`mOWe;A_p`+PEO9?eJirnUu*3r_@c>K2iaL~d zfF&Mai3eEX0hV}xB_3dj2Uy|(mUw_A9$<+FSmFVecz`7yV2QHkPJu!)&vlSCgLvBH zT6`J@!2<$igebj4plIqt%yo#l4l&mu<~qb&hnVXSa~)!?L(FxUxehbeVdgr_T!)$K zFmoMduEWfAn7NK2S0Ok?=2eez{CJGx?qeJw9%FwzhWALC=}aSIKN( z5ea_`Zx$%y++!T)9^*Lo7=FnenO8kVK0L;G)nlAj{fzd;XBg=!XaX67dyV9WSTFL=2_ekkHnWqvmNW7#SZDD9nwiVq?2|?Cv|Qo?T}8|A)T~C zI%$V=(hljQ9nwiVq?3BElX|d|c1S1fkWShmowP$bX@_*u4(X&F(n&j{lXgfa?T}8| zA)T~CI%$V=(hljQ9nwiVq?2|?C+(0<+993bx-7Ip?2t~{A)T~CI;mAV(duU07tD0h z4(X&F(n&j{le)E&y0w$KwUc_YlX~+w@qCLh%%xCdZy8$DSs~ zo+ihhrdQ`QIrcO;_B1*6G&%M(IrcO;_B1*6G&%M(IrcQlmp7j#JWJRGc$O_a%a)#H ziD%KqBe*YZJj*toWgE}3jc3`$v&8UOdScI_jgnqg3Y}#e&$5kYS?*c1RGvz?T`a4M zWp%NvE|%5BvbtDS7t88mSzRovi)D4OtS*+-#j?6sRu{|aVp&}*tBYlEnrkiQe>Fg%G-eS<{3@eq|;!)Y7C7*nT&$(+U%F8~B^C6;1+IsVRP2>j3 zCdEV=#0+ZQa2r;tcQ-2)Lxa$v=vapmO-FXJZ(FYzF@ zKQ<`qabTzw2TmJ|7W~kgdOoO=#bUIX%!rf&fJa6PF7eMO(1>U_28+?i^vI^y8}(NC zfujZxh#C*Dd%=R7u@_wM+6xPj{PMM0twy88YDSUBgPpHbf8is+@bc#XwiFrXkaZmXB!+8-sAL0YQY&IM4VH0%V6h%bhlZqm?i4oMoTaW-~wb*S&Btyl3u=DtE z#;^cR7 zNOJ@eF??9fpdtQQ&1OjsstL=OkqxNCes+9}_$B0&zetAEIJ<-&;S{7x&{2LdKknP@ zcJP25)C2wSM!~1iVh1UuBqWqqBTADA$xy7|!z`5*CUMJ)_+Dg2Z7<+)lO9zCPFYE- z)EEU>&A4j;$>a?&%7B6jQRuM`9h_nV-oaxgo8TjcVu1z&aA|Vl3hl941s^t)Cp>~< z7J(RW85lxX#)52kuD44*^cD0#v*aSZjxyp=C(iW@JX+kno3~1D$ug37<;j0ACf=$%4hx^cri4QsA2Co5c8Bq{u zi>k;!G&hzOoU4@6Yau@D7Ka`9Fx$cD7vTfAG&@lM>H`kKOYEqu4Ryr<9ylN#_=xqU z9()M$h!2t!_z;4l9Im6K9Eq-CFm%>&FOc~ie1L#PkOk!k3z|@n-KqzXgs?_~bVYoCUxkqERweSxX>-}Z zV-}}~AYzz+xU}FHLLdP>7udHr?GCF0C%f2fZUD$fFobj=w4C^GOU2MJtrif$0^#RG zZmXPO!_W8NL%0}06s$M`54^j#j0Uts!2ad=&|2fas zk~oeJo5uqw;PePOfB*~dj#@fAc(dRGRQI4O;lObVlA&T~o!|p0fscS494Oo>odGDh z03TKZDr+^eHa6k|1>uNO5DEXFzAnUvH%0Jawz%vbCpwVT1=VCi1L7a@memUuMt$U6 z4yzlLbs`j>)9!QH9N;o=G3o@dYeV0(8NI@;5LCiHXq3tB0y6DvA{#G2>MhB@cKDzZ zpk8*n*Xu=}@HoNF$YX^h5t#veAnY^VVzYUX*y;0Hk<4gxp-53?U_PVKn!*Z;U=(aR zofq_Z8^jNUvaqSmCSB4Dd^l|;x$6*h9_L*2CZ&9-cANuiwz%zHCsdc!4IO+|{0Cvf-zKDY}>0(`iDUj)F$TaW;Baryl?LKt$xjXo&&KuUC)R0og_Jxl_k zuuJgaw3;B7PzI!r*$l+HP%(?s>a;?gUx*KXy5IvxA~<|5;KSw-e274ceM~rM+hg+s z;i!*W@L~730W(lm-ZwS z02FxK;6}UG?QwWqPKVnCe7K-Ly=afq?sOm<@MTIu&72TbNQw4BIeL-XiNkVZ7$yeD z*ZeKTKscc1Ih{#KN$3+v9+1x~oze}NWp(=jLQln#Qi`ZfIgArMUg%*hsy&gW%DFC?G~RCZ$Sbi_a-OXk<4uN0gDFWLpn`n z4?ciQ!3VjIzyTs6RB=pB`+UF$5HI+U&`S=OHzM%y0jDXI+*|NrwfS5DFH~0yA0TM_ zgJOL?M=}cVx`123hoAUxIX&)VoRbWlF8Bba;0Sf}C#NYHHFH65yIeqo!)12)go8ca zSbe@99}r2%l#Hg@eF5SFcidjlDc%4y6W-(lK9eC@ys61{Btyj@#SD<;z$Ng}8z(kP z`QRI`7c6oSKJYGw8Pq||L_}GEc&`frMeqTNp6|&@rDP#GKTIFLJJ|<(IQ(M5q5<&_ zdCQT40#F~H*KBq>K|hzz<92y*7>vsUo$iM$krSkmjrfr63kBzP`GF4@3x45XuTQ!S zKI90gw>wpxLBpBo*>1Lf|vNKcXv>%*Fk#rs(X0ywb3QD;# z3URxW+(47XorK(OpFdWg7(T=t{0=_csi~=u5h;EYiL4F}x(M)*;&R&XGYQR21wQ=g zsSYGV#ehWvR60_^O3CiQ2apMrm}6}eNPIXge&Sw4lnsdY3qH{C!QqxTJ|NYVO3TI3 za2A^*;7Lt_Dt871A0TM_W3hm@oM}L~-vitNAFgD7k~_)kar?Y!Ubh!gC;(XkPH|g3 z9^k_)Sn|M}^bjA2M;Q((^pTN3u7K_(+za2pSOokhfgvC;;?HO0rnIf)7s;LOc6?={}DS zhG{a|gExDuUew2JP6Io55$fOL4xsfgo|2Ip_>gXck4pgYAs75Wd4Nt{PkMSfWJFpL z*f|+@d`WH>_$A%rvf*bknwt*Ml9ZX@L^6vd87MSBx5e<0hq_Rg3PXcMF2IM|?1d=9 z;RzrVq%rUT#3vyfD(?DFLD63FAwDwlJqlvfk>X7cz_f9t$S@#*4Y3!&TdoXr>3|oS z4yxOok`(X+{2-Js!|(OOo=Abv2d8*#qRTv%bjb~Y?!|Fa9>GV7&*%3h1(ITKMMCO4 zOYEmW$q#|+&B(}rj7UcaxRey!0SQE>WWaX9&lE_74B#WsE7OH!s2HdKV;EK~ez@{| zkWivag`t5G2=~Otjh6deR zx*4Uv8_rEm!L?Uxj7gCl4HvId<{D<={ws06 zx3i(6Iln#gFMu_cvG~Y!T|K?u@4I-Av7?t^{1xlEo7er~^LsGA_j|^aHMl37I~Y-j z{wu{tKjth1-}GaN*;rNJSTOJKd3n^af-y@2V+<^gwFHihESEhWI5shdX=~uv$|BAC z0>^f92;0E~<58kyC>E1$c(Oa{oU=YZN1*~#td(MZf=2hRloOw_THY}?&gM$ zEN^*dV~%(F+O^&q8r9>iY3^z6-q75XGd#w-u(`XzTiejtF__pTmW}w{K-O$27YO8ynjix?7vGyuDrChR%NP zy5{a4+|aeEx1qhWy|WeTG=g?CvbU|-+tSqu;xsfic6F@7a2n9thS}G)H#T>I3h9Zn zXhdQLCTsFG^z?K!wl`osZ&O!eUq^FiZ$mG^)6%}SxyPGMGio<@Yr9%{H#T%PCuV4n zK$g3^n)(`>wP~8#!KL<9eZ9>Z479@V4O!my&c?NUO$5ot_TILxzFq*+(H>ZcR?zs~ zLkRZu08v6G%iGbcVZE*oTh|_DLmV)=9iRr#KW}Nm5z~TZSTI03 zZJ~{AT^&D$mDteI*WHN)K@r^8)aC8z%JTN~tyKlHvrP!>7`R6 zn09qSGP=DTUEP|55KLnb_xAR$Yi?=4LODUO#$NAe=%*Drx|-Ts+DX_N*7idDaDZtW znwm81H9FJc>l(TNb>G^CZVmmW=AQOeY%-7>I(Jc)`6^OxP3H$GFnCrlGaji(LzHX#z_F|M#L5WUaOo6c#eStzp#8}*-UTZ^jdsR%S#7O%evP-hvbv(Y4Cl(LW>hSgSza~UdjamNnqTLwD6cH9 z!=!cdwOa#Im6zeZS>DRBni+F2^YjbKE6VGZWO-+m*HzJ+voPs&Z}s$=y7CzdDyG+X zs~6N%&#x`R95XR(Re9B{8mv-QSq3C9(Tw@kOKQqz&#BA8O?5b#<*lokKC`THdd<8n zf^dG_oU$6PHY5j7Vh(TFLb|zj&h&~3?*-*`wRJUR(<^B#hI(gL&95XHEvT9~y{>$I zmG^=&pfde}3OWhcK!q6<)5|Nfyfdd)PM=Na1Q(%U0dz*lK{w1Ut17FRUXkUktuC8U zP6wc4c}>|2K#P%}Jt%>*m}$oRs@k#(7vKcO1(yIr=9Fo80D(mZwZ zYe0|yD2vK#%d))FYszbhBeQDe16<-K?jRf&fSwpyUKN0sctq#u+F0qpD7rg9#hGQ( zD=;C1r0U0GHTf#LxUqR1c3e+zlj}-SQ>eNYg^|L})Rh6GdUhwauYOKD#P-Dg(oCJM z<%acv=4U|TYf6~Z2-GC3lCFfCHZ(&M_K@a>*61RovauaTl}t=`S4UUC{`EAh#bUT? zc$BxPxnV7C3n)iy^|5LpXc*UZw`1as-R-?lDc*)Yn9J_=O#zdP6*R2Q$ADHjAO7y< zo^`NT?Hiic_UB-+ZnA3xFSK(@S9eDMbxlV$_Lc_ShF)(gQ3`esTBEx)r>(blUFrDo z8#ivuSrv4}a-a&?4A#Zgv3}Og+F2`WW4-W4(^(_Sz~6lMow=+4N2@Tx%Pzo}Ue<$8 zH*01Mtb=9YY&q-1_#7NfXKV4}Wi`Wd^=RLkaZfYu*?`|o82RIQylkO1q5@#G zp!K>iUlWez1A?`fbv^6DxEg%c;?tnb>t%VEGY^pdc;4Ww!8x;s=NvoZ|2-<$ndN^? z2O9fhm`Bs1U84h0g=pRYS~P>|4LDwdb6toK{uNhf4f<5$&TiaGGxp$j7ijF&zInlQ zy4D=va;vsdCsrhG5r`uwP|#Wg8A%z<*r<)`fQ0I^2WOzsI&DZQ8nGft3_+OA64|WbITAHF zrh7?>NL~o8M%>d7z|V^-bfyoqp;-vlUR>Ad(}E+CG=e4_=ZR9@Q7e$N5*K>eM%+g< zq!mYKLTA?Dd>2;f)8N$UM9?&0ZhbGcgGPOrgXRvd5yaugE70sjheklwr_G{MbtBHw z-Cf#TUTwb+zsF(}oPT7$6K*;O`v8y5(I9tdEuzZ^uh(IAeJ}Q4ExP_wc+h#B>f-@V zH@?x#x^~d#ZpU|8S(o7;RR0|7ARl#Tbve^9^n%I+r7m?N7;V(((SddT^$Nk=&;ks* zL0{qy@tb(1uSk+Ym~?4)_h^(@jS-Ew9vl-~hvb;>?SfDvVGpxL-!7Hd+sizK<}Z{jGCrl?KOX zdDAIEXK4PP=PBVzIOzQE(EjS*Noxh^^z$62G5s1}TdbPU}9*Lf=NPqI*fpwt@yDQr?Pj zgi%}I9NiJrrG%jl360mOdp?cm%0I_xgyT8}Ba%j#dI8V>7J{+soKKGtOoR0A(e?!K zoK_$VMst~V!-!TVYI`-BcY69S z`zY*!Yc{isHEt7DGfZ&-~aj=v*QDMK+zRoi6)i*GO{4 z%Kr$II(9#$$B8d}xSQm8G?jmfvLk*A(RhT9V<}0P{WA>4${p!i-2>FI3GTX}-5}3M z-+SbX5QKEcXnU;h)JFJA4UigIUAMKmbd6}(;Eex&Xsz>i?Fd%7UrlnX+sBqMayN&S zY1EpJ%yAu#YT*aZ!qFmlm^Iq9a-8$Rx2wUGh492@;_OVENyG@cLe~?uow*3db!-mC zEzsuD=cvIrntKVx(%j_3S83noVSE+lBF$IE7HeyiVK$m|KGvhTD{;00e`!q`M|aG? znFaVx$Fp(ng1~xJxQlS0@s;@01t6`%`H@w}LPay{>k(v?_*R4Y=LBG$j=9UV`3Qbm zf0j0Hm39~1H!A??bR1XXt{SXbju{rXhK{jSVm@{Sc=xx z;UM}i49rI|K=@bShiFT5tkqU1!`Vul)92M^^#Urwgy7bxu>jv^VkFUlFr+!?8gYf_ zSus44APUL?@pL*yRBDjZ{e%foWJDT9V-lQgEO&lNI)W?ET*Nn`RE4%mEht+CUJ+dS z8M>e3iX?vqFc^_IUG9nA!Ld3Oh(A>tXD z4AN|b`?My(9E69YnWQYphY_mK{v#Qql}HNc8?8Wlgk+4kMAw4*Q(q&<#|7HG!CC3P zvC>acM*Ao@E_fg909|5#tUGiX1=pszM{p-;C0gnb5|?#q{Ofr~w0#+D99heC0UOtY zS#%FL7!T@pf5g|(?a*jnlqeFknIje@sH0;pMNU) zF2{JvXVAFOo^a3`(Y;AMRwDbT!%rR(`Ruw+NWP!$rRcr}dF6VPP0@fJsRpAMiVn#( zkB$F&03-PU1ckm<(Eg9iMX?uULCABU)ri76G_;yd&3|TV&yN@>Ql+@08}n?`j(atz zI`O>$P|&P&wViFk_h1a8=LZOf5nlZ(9t3guSM(=Ou?G^Q$5`zeg~`9n!CHhFL8`}V zLHg2=r|&MPE9Brizl!24@c;3Pbcnf=)eNM$;K7|d6Nh}j*TX-EC;M@5Y`AxZnKh2(G zpW^&>zR$4SP@=qtJIC`r`K+UtVd?bF}{QC zkusHI>_zqodk^OsTg@f>juY9+G5mbZ4zbm2fPKOx<(MJV=#yKd@7aKKQ2HJiO8D{c z1d+g2iZ|tY`4xE=@B%(u5(OebT!7!pX#~54ePU?g{TM?(o3X-x^rG~H^d|cV&|_6; zxwKijg?+>y}uJ-z7`d{UOvQLz}OV!1%@R+j;_=63 zE01pxkIfd34vI%q@vth6sN&zB5{FgsP`r3h6%X8RQ65mm{T6Y*U%u~Ni*jGSxYr_n zGbj!%30DrO;@5-X;Gp;wzWhoR_o(9ERB`v9xa-bH<*p`iXQa5JEnc~!N!;!~cUy{b z`=GcjMcj(Pw+@P5-V&<(GF;qpvrD-pRNU+m2liW)175M;D)!x!qU;+KH(}sSDdNVx zp~{V^V($$eWpAjs!6UB6`Rn7vb)jOL7c}1zRb5LB-8>3uNDlWe)TDd%5T(-llTox^MT+=MOI5K1=r0Kui(O(-idd+M1*)i1MXf4oRB@pys^_OD)%(Q! z6j9|8m8z&v#XMEa9Teq*VvbqN@yoNy4l1)$QFc(woDrkU927HR#0`C_6fit|NLp+zb3pHoGlMHKqw2?Z8qf=v`y zM7}EWWVe#HMdXf;QF5EaczhclBXU%cJt(p=qm-<9A`|B_qr^D;88=U4q&t+1NRggq zQPLeE%_34=A|=_Oq~wcahe%3vDM_Is(ItG&6va0vyxgLA^F>0WNbt+?aTX=sDdH?5 z)+}QEa*U@`iPe3y0EbHz zPW*AE2nYT+<_UYGu&KhT3X9pISoR6CMVS4vaZnhVgn}VTsgV8A!hvHU96|zAQl#J( z!TmCe5c~<=bop+c`TyuY_Wx+z|Le=fvBwOG4Dzxpuj{asQr>jff8k>9t4n;@S?7KA zx{Th#topFM-}}V5bJdIG7-h*}CHAmLF&&mul0Nyli=Sj?&8uGQJ^bggnSoi$>Sy9y z?P4r|e{>qFmCejXn-^|(p9Az1Nl}=>6*P{S6tlr> zR1D@)vA}>h&LkTYlTip|6V z+$V%DMEHb{ALi}rcc^OYTHaQs?pKZty{N9_cMrXx-U?`56!(fYKtmYC`<)73C}UM- zlw_m9U~-*3`ypX!F*LC`h2*PUe$^3UG zW5K}hT%e*MQy_ds9O9D{qJ4^eAwGO$rhY$*n=8d2SH?4n)c5N@s#m|S z|F~W~QOKiash<||xO&m1p2BA<->z;wrk;9F-Ojht=RNK@#0J4ZeiDysf#+Nd2f40{l_0} zdxo3O{`_ZfS0siOaGz+Z@W`b;ZHAXmes}7-Q#kJ_3CNDN<6VxgFw%J5 zALXkhiARi#^A-Mjvo+c}&RSxfXPuX}%(^^n74NWirdf^530vokbH<0W7)z`*JT)pe z&5~x#Ov}ujlr|~1Tq+mkmO0irX>)UzN=wCZ%W~`T$mL0k)7p3!@08Yvc1yc;ZEo@k zw!+M(@?xJsGIC#7fvWD&fyT(g8c9Zk%LpjPNReCOf422JY(w8SYDiY$Hknf zbL%z?Z2ngL!*j1iNAsM&E_<%IaMA7a7dB1)dv)!B?#UY_iM{Go(+>AMr2h9h_1V=k zXMFd{{-N%yrMZVs#>J^$>W1_J+IJZ{II6W!u%G#kk!i2V+PrE zR#RaEngZj81F8$-Z&$w&&muCgGq2yt)*9D17}#etSzWTj_3qiD*rudraX)lWs#NIm zaGxZ(Lp{=R^`ojv6@f$I=bsj--yG!AZs%!ICC^ZQKXjM+);<-X3qSXo`i=CtHh;X| zVO-1BIE*GVz3yGMz``t0GJFqb5J9*=v1#4~wHWyO%H9{>D*iVU86)EDkl z|1k8h`T;MJ>UsV?o&nf1q!O5hubG?8@~6A(R*Tsv!%kXkCZTk=ZH^|7$p)vz;1*m+ z%qd&Vc7wG*SpU@3A0|XHx@RR+f(OtD zHr^j5DT0w%W}=kUNgzFraQjKu^SFP!ZkGc_S%brOFK?Tt?gtE82(wA&E)e~itmgPb zB$^5nNf24+6n&}ow|8n-;zbMCk=zxxzd+vlX2a*th zE`vnBhxNqUdeWNW>&KZxBE!N$eB)dn4xFYPa1u7=RBlRsQE?IdgNnuegq6oX>`xvl z84WU-vI(BzBJ5x$HC1j*kIe~nd#dZIHl)SpdEA~FF|o6;S^e+B->PRiR<-ijBY)?{ z&zCQmc30<;eTD1Vmn@rpaMjXV3cJ=wr(RL7y!M8hcsN&%^8Rb~?o&Sp4XOM7PT*}} zz5Z;A*#y7C!zFI;fP|%@PnPlfR zwut2cLTfzd^A20;<{h@yEnEByvz~h%i(2vHpXe^0xFp0EqJ*T7L*d)a>z-0?D&XzB z^DACcaOO+6?=Q{ahB;>n)$eeV3-X)*x<;~J_%oQS$l(!ESfrxJrAj1oEOuIZJV@^W zv@nOlgfmi@JYgaVP!70DN=SQaazG&BFaYIin$p(TI1J^y!*&hSC=Jvo78L;X5k*l9 z(hBl^LZD~^>KTh+;FG*HIGq0<#GJu z>U%0{md>l4LzAbq!5kOCqr<3HisNcdoL4Od*gScd9xMV;gb+Yq# zm;mNWgi908b@QIdi}eE%!jP#r3v+J}udKgB-KZYA^vkxACI8j_o0sRRJq@?hS2_;+CELrk>cSA*W);J#R^&UES(<|7f=TvYn z6mlj(yWi!X#O=b4V}aiaXR=wA6tir_$D)|caw!v5W1qrBt=Ve9R#qG)qXOk=mSh`L z^}8pZC#ln%)06MQGlhc|lsdTGmIPkIYp)pkir>=3AN%dG!efQ%-lC!U>GJNOTf~EBYt+xdT^FBAoQwe{(|}_f zyTM;#P$XH7Lw-(1lCD&aHo8{2SA@o`i0(1=hxXW|4XoB)A0OuyOpb6N8HnFJBE;f~ zCy5Purn*tk6vcPyNqD5>iw04}CetE|d56vV{+f4q6ngO*dhski$a2W7k=QDSxyEvy z7|vIVXNre5WM^HJ`ze>yZuPz`1HF^F-d=nAv)BEi?!{i^nEL5wHv8MZRXQUIaPoVKmVN<8EZoe-ioY_{|SGZVDxS=Q3)sxZ`Tb~|c7IvFCBua!N zq>p&tK`r=)Qvuu{wdOkLiF6J6bZiP;VEs|`tln5}syEkL>aF$R^%3=v^-=ZF^)a>; zqn%W)dpR1S;TodD`ZHYmwEKpo)$8{zmfS@P@4oQK|B0&l)ru#+Q1`1Ra;#k!06 z>^D{(kv@6)#wCrv-Cf@zy{QglWxe`nLEZnBxx3Of|Vs9=IQk(N7}~qFhfr~+n5YB7hj(nnH^&jX(3LtCnh^2OoTXn2x`b> z)tpvxO?BFybdfgD)ImTCYw|zuu#0wrhkk`<>MmEKI5m?7RKzHkK1FjPeVU##22=+* zm!l~!9qzlWW%0&aTh$|L*YHZ7I>6;e4{hpIZ&qLVhx*k!QbEh+CFS@?x8BiP+i+W7 z?W(QW*EPTXm&12n`}^$ixA*^#ditfqcl=d~+_-9H-NsdAwa^cBkgQ@z7R5H({0YWb z3tP!o$gw>ZxhKk!*yC!7s!unjB!q;dgxGbt(tJ4Vn4^UFh*VjBN~$1jPVGGNgQ1YN zbI)s5$sf{X?Xq>*yBuB4uH>$iuGFqH^NM0!R~D0Nomz-Zl+WA&Bb~~%5J~s1>k1c< zbVXL)v*PhDV9sLC@rYlnzgT_hjf)3Z5&^Bu+3C-~GY~DUs-9Ll3Rj3E#dUcC>kbENP+!OHjXl=@jEcNFE zb0G%vXwQ!+rKUQA=KXE5n7Gl*3^Keh%8VQZ2%7hXya+sFRi4beUYj4k!Wn+>uhP7YlXvclCKA)`Sg zqDhL24zZY#vH>m3B0f6QC+v=BWM`53g4RLYN^TF757A#eeF`Bfs1slVv0x-erAq_% zkt;gli-r^x>283L+)^IH+h(Z;`0MI^lWWnAx%1~-SW*32&(y8|)$qFyS8uDRE-~>Y z^;Z6UUiFri(kZKpN~X-XfR~O-zwf4vPq$2-TA2x)m#cRgS1WfyvsJJa{=)Lg?3{7V zNVYX9EXJ_aRx!(Y$+)d~VVC%}PFYlm{FGUa%+9H>De)rG6CW`nEy5FCTnXk3e5l9f zdeAfgt#@`ZWo}$YPaUPuoKiNU6c}~icO2YSF*Viq6?S_RbhmOsw zedgC6@eAt8E+3i~&SRcC#vKRtbgJK9tNvZRZ&B^-t5(%iuH{o-JIv?oI{eIv;5rE{pxDLY|-jPTxX_fNNYOcn@^*<(-`K1L4&$K({UusF>Y8GF_#3r^ol zEi&sf$+ZRv4!=!wywIT!vjNBsW|pN^ZnEED4rO%XrH) z%O1;f_%SIalO@5NY0j`*VKTs>BClDqcgP%`8oK{RwGUOnC%8$yLG|$KmvWc-wQ_7Q zQ%aDgA=+X{Vk!rKnF;YU`sDnjZclWS%M%qHWx|2c6CE8@>S5cQmm9W4*P6FQB7sTC zO9P9Hk)v%MVT%qE(ecqzRFuzk8pw?HlgC3Lo*o#BorV(jfUd=pL`d*}Q*w{_0J~Rn zhYMPJFRXZPYV&2+u4+C}A>F@f4eZ-fL)#GpPUn_$`^4V1Ws|0=M~8YY*)VU8+Al@L z-qiUw^>50tTmNm>ThJU79lnk|AIs+YW1S&3CSs%dge#=a)+FlVVqH$=3=fYn*yEte zT+buo)b04$qb~KRmZi+~J8UkSTQax|?u?j>Sa}6skph$C9dUH@R1b_3W$udQ_pgFK z_l|m?yK4tuf2{Y5{;Bo9>-tQ6_4(g4pV&PM&fHw?dYDhyam&HtiR$a+Gu2zwZ|^@^ zUWMHXJ{aa|e28FvzmIz&%n{6Ejwoe2&9!`IxCxp^wuGCN7?)X!h>FyR4b?No@aSR# z>WTsaGBpXr)OMF3n_v(0l6Hnxc^$n|jz5g=x-_(8TYWc|7^*o33 z2T>_6yYRx#Zg^e2c~b`-GUu9gUC|Gfk0u}S}N}}TrTZI`h2H_ z1YOH*n`!4*qilfGHEbV8S;%1-AF+>G(!NS|lnnJ0Nv)+rw_G6IU3}&^T;h+^FYvin z&qk2U5;SHu-=7I+%tnuynE{QNpfQg?6M)1>keH(^Bao0>j@fiUvDD1;kHFZhZVkdP zw3Fxo*+N&s*V>LLit~7xH#$a&#p2%5*tjTH0*PCch})I`iPHrx!AErfnT2~@PLew8 zmH}8&w;oU))dCMK*9o1fr9p$>QLdA+n<-G6Ba$aah}2a2u1j7B>H|TEr-}tvHxa+b>n?B#5s_N6v+&^($Ny(Ra(!#FUWqbyYcob52=j{`V)z@dwQV*%$ zJp8iL1$jUwNRvd;byn8rpKc1OHyH=Q1EpsH)6K+v2?x}cU@et)nl4A}#9|=cL;G

1$W7r@e0!HPu@g0mkJPQ3hhEb-G4zU50u9!$ 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 W_YF69v_ymE68(IXMraZLEdC#Jb*K;k literal 0 HcmV?d00001 diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51d6111d722981a86766cc99c53f1956e5c0a229 GIT binary patch literal 58716 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 V!o5>kzlbDRJjU5v3Ujx#{eMf40U-bY literal 0 HcmV?d00001 diff --git a/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url new file mode 100644 index 0000000..be505ef --- /dev/null +++ b/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url @@ -0,0 +1,8 @@ +[InternetShortcut] +URL=http://www.all-free-download.com/ +IDList= +HotKey=0 +IconFile=C:\WINDOWS\system32\SHELL32.dll +IconIndex=23 +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 diff --git a/addons/Godoxel/assets/godoxel_screenshot.png b/addons/Godoxel/assets/godoxel_screenshot.png new file mode 100644 index 0000000..bb88818 --- /dev/null +++ b/addons/Godoxel/assets/godoxel_screenshot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f65e5dfbed1c0bffa1d2f4096b94845cd8cf0d6c910a684cb910a1112fb97b37 +size 76642 diff --git a/addons/Godoxel/assets/godoxel_screenshot.png.import b/addons/Godoxel/assets/godoxel_screenshot.png.import new file mode 100644 index 0000000..0130f1e --- /dev/null +++ b/addons/Godoxel/assets/godoxel_screenshot.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/godoxel_screenshot.png" +dest_files=[ "res://.import/godoxel_screenshot.png-43fb83f678511237490ee7f96939d8cd.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/grid.png b/addons/Godoxel/assets/grid.png new file mode 100644 index 0000000..c68dc5b --- /dev/null +++ b/addons/Godoxel/assets/grid.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e906d39f57bc454a2e042443b2562b9df24a092856018cfe6cbbd6a360c303b +size 148 diff --git a/addons/Godoxel/assets/grid.png.import b/addons/Godoxel/assets/grid.png.import new file mode 100644 index 0000000..eac50ac --- /dev/null +++ b/addons/Godoxel/assets/grid.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/grid.png" +dest_files=[ "res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/lock_layer.png b/addons/Godoxel/assets/lock_layer.png new file mode 100644 index 0000000..45edce1 --- /dev/null +++ b/addons/Godoxel/assets/lock_layer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8101850a2043d8f25ea4869c17a4886fadb748bf1d119f6d9acd58882eafa33 +size 251 diff --git a/addons/Godoxel/assets/lock_layer.png.import b/addons/Godoxel/assets/lock_layer.png.import new file mode 100644 index 0000000..5fd8060 --- /dev/null +++ b/addons/Godoxel/assets/lock_layer.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/lock_layer.png" +dest_files=[ "res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/lock_layer_1.png b/addons/Godoxel/assets/lock_layer_1.png new file mode 100644 index 0000000..e8175b5 --- /dev/null +++ b/addons/Godoxel/assets/lock_layer_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1820fa3576f462d10682211d0d7e0661993ca0cae9bd80c252be75faf79d7b33 +size 242 diff --git a/addons/Godoxel/assets/lock_layer_1.png.import b/addons/Godoxel/assets/lock_layer_1.png.import new file mode 100644 index 0000000..e3cb23a --- /dev/null +++ b/addons/Godoxel/assets/lock_layer_1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/lock_layer_1.png" +dest_files=[ "res://.import/lock_layer_1.png-4848d5f2cd0f48c68b880712b6b38776.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/minidotta.png b/addons/Godoxel/assets/minidotta.png new file mode 100644 index 0000000..f2765b2 --- /dev/null +++ b/addons/Godoxel/assets/minidotta.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00fcc85d7665ce7878e2e59130ac3832c656fbee0ac9538807a988018f06f7b6 +size 2330 diff --git a/addons/Godoxel/assets/minidotta.png.import b/addons/Godoxel/assets/minidotta.png.import new file mode 100644 index 0000000..462757f --- /dev/null +++ b/addons/Godoxel/assets/minidotta.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/minidotta.png" +dest_files=[ "res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/minidotta_invis.png b/addons/Godoxel/assets/minidotta_invis.png new file mode 100644 index 0000000..536e3dd --- /dev/null +++ b/addons/Godoxel/assets/minidotta_invis.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23abd300d8f912d918aa6e6e0b6b6f2040f666c03ebed9650b0728219e790203 +size 1746 diff --git a/addons/Godoxel/assets/minidotta_invis.png.import b/addons/Godoxel/assets/minidotta_invis.png.import new file mode 100644 index 0000000..607a755 --- /dev/null +++ b/addons/Godoxel/assets/minidotta_invis.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/minidotta_invis.png" +dest_files=[ "res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/assets/unlock_layer.png b/addons/Godoxel/assets/unlock_layer.png new file mode 100644 index 0000000..ef34c1f --- /dev/null +++ b/addons/Godoxel/assets/unlock_layer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:682e33fee04aba3e33c8a3e197d66a25c1d1f872f90d13046e03b65d44c8793c +size 240 diff --git a/addons/Godoxel/assets/unlock_layer.png.import b/addons/Godoxel/assets/unlock_layer.png.import new file mode 100644 index 0000000..17d2172 --- /dev/null +++ b/addons/Godoxel/assets/unlock_layer.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/unlock_layer.png" +dest_files=[ "res://.import/unlock_layer.png-ae7c97a04fb889522c7c466fdc9dd8f6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/addons/Godoxel/components/AnimationButton.gd b/addons/Godoxel/components/AnimationButton.gd new file mode 100644 index 0000000..d009c17 --- /dev/null +++ b/addons/Godoxel/components/AnimationButton.gd @@ -0,0 +1,73 @@ +extends Button +tool + +signal on_animation_button_pressed() + +onready var line_edit = $LineEdit +onready var label = $Label + +var press_pos +var release_pos +var moved = false + + +func _ready(): + line_edit.hide() + set_process_input(false) + + +func _input(event: InputEvent): + if event is InputEventKey: + if event.pressed and event.scancode == KEY_ESCAPE: + line_edit.hide() + line_edit.text = label.text + elif event is InputEventMouseButton: + if line_edit.visible and event.pressed and event.button_index == BUTTON_LEFT: + line_edit.hide() + line_edit.text = label.text + + +func _on_TextButton_gui_input(event: InputEvent): + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT: + if not event.pressed: + if !moved: + if not line_edit.visible: + line_edit.show() + line_edit.grab_focus() + line_edit.grab_click_focus() + line_edit.caret_position = line_edit.text.length() - 1 + else: + line_edit.hide() + elif line_edit.visible: + line_edit.hide() + else: + moved = false + elif event is InputEventMouseMotion: + moved = true + + +func _on_LineEdit_focus_exited(): + label.text = line_edit.text + if not Rect2(rect_global_position, rect_size).has_point(get_global_mouse_position()): + line_edit.hide() + + +func _on_LineEdit_text_entered(new_text: String): + label.text = new_text + line_edit.hide() + + +func _on_AnimationButton_pressed(): + line_edit.hide() + emit_signal("on_animation_button_pressed") +# if line_edit.visible: +# line_edit.hide() +# else: +# line_edit.show() +# line_edit.grab_focus() +# line_edit.grab_click_focus() + + +func _on_LineEdit_visibility_changed(): + set_process_input(line_edit.visible) diff --git a/addons/Godoxel/components/AnimationButton.tscn b/addons/Godoxel/components/AnimationButton.tscn new file mode 100644 index 0000000..38ebca1 --- /dev/null +++ b/addons/Godoxel/components/AnimationButton.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/Godoxel/components/AnimationButton.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.6, 0.6, 0.6, 0.12549 ) + +[node name="AnimationButton" type="Button"] +margin_right = 250.0 +margin_bottom = 42.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextButton" type="Button" parent="."] +anchor_left = 0.14 +anchor_top = 0.261905 +anchor_right = 0.86 +anchor_bottom = 0.738095 +margin_top = -9.53674e-07 +custom_styles/hover = SubResource( 1 ) +custom_styles/pressed = SubResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/disabled = SubResource( 1 ) +custom_styles/normal = SubResource( 1 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Label" type="Label" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +text = "Animation" +align = 1 +valign = 1 +clip_text = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineEdit" type="LineEdit" parent="."] +visible = false +anchor_left = 0.108 +anchor_top = 0.5 +anchor_right = 0.892 +anchor_bottom = 0.5 +margin_left = -0.0559998 +margin_top = -12.0 +margin_right = 0.0559998 +margin_bottom = 12.0 +mouse_filter = 2 +text = "Animation" +caret_blink = true +caret_blink_speed = 0.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="." to="." method="_on_AnimationButton_pressed"] +[connection signal="gui_input" from="TextButton" to="." method="_on_TextButton_gui_input"] +[connection signal="focus_exited" from="LineEdit" to="." method="_on_LineEdit_focus_exited"] +[connection signal="text_entered" from="LineEdit" to="." method="_on_LineEdit_text_entered"] +[connection signal="visibility_changed" from="LineEdit" to="." method="_on_LineEdit_visibility_changed"] diff --git a/addons/Godoxel/components/AnimationPanel.gd b/addons/Godoxel/components/AnimationPanel.gd new file mode 100644 index 0000000..39c0fa9 --- /dev/null +++ b/addons/Godoxel/components/AnimationPanel.gd @@ -0,0 +1,157 @@ +extends Panel +tool + +signal on_add_animation() +signal on_frame_pressed(anim, frame_button) +signal on_add_frame_pressed(anim, frame_button) +signal on_animation_pressed(anim) + +signal on_play_pause_pressed() +signal on_animation_frame_rate_changed(new_frame_rate) +signal on_animation_loop_toggled() + +signal on_animation_move(from, to) +signal on_animation_duplicated(anim) + +signal on_animation_selected(anim) +signal on_animation_deleted(anim) + + +const AnimationStripe = preload("res://addons/Godoxel/components/AnimationStripe.tscn") + +onready var anim_button_container = find_node("AnimationButtons") +onready var play_pause_button = find_node("PlayPause") +onready var add_animation_button = find_node("AddAnimation") # for dragging + + +func _ready(): + pass + + +func _on_moved(from, to): + if from > to: + _move_animation_up(from, to) + elif from != to: + _move_animation_up(from, to) + anim_button_container.queue_sort() + + +func _move_animation_up(anim_idx, pos): + anim_button_container.move_child(anim_button_container.get_child(anim_idx), pos) + emit_signal("on_animation_move", anim_idx, pos) + + +func move_animation_up(anim_idx): + var pos = max(anim_idx - 1, 0) + anim_button_container.move_child(anim_button_container.get_child(anim_idx), pos) + emit_signal("on_animation_move", anim_idx, pos) + + +func move_animation_down(anim_idx): + var pos = min(anim_idx + 1, anim_button_container.get_child_count() - 1) + anim_button_container.move_child(anim_button_container.get_child(anim_idx), pos) + emit_signal("on_animation_move", anim_idx, pos) + + +func clear_all(): + for anim_button in anim_button_container.get_children(): + anim_button_container.remove_child(anim_button) + anim_button.queue_free() + + +func update_all_frame_button_previews(): + for anim_stripe in anim_button_container.get_children(): + for frame_button in anim_stripe.frame_button_container.get_children(): + for layer in frame_button.frame.layers: + layer.update_texture() + frame_button.update_preview() + + +func set_frame_preview(anim_idx, frame_idx, frame): + if anim_button_container.get_child(anim_idx).get_frame_button(frame_idx): + anim_button_container.get_child(anim_idx).get_frame_button(frame_idx).set_frame(frame) + + +func get_frame_button(anim_idx, frame_idx): + return anim_button_container.get_child(anim_idx).get_frame_button(frame_idx) + + +func get_animation_stripe(anim_idx): + return anim_button_container.get_child(anim_idx) + + +func get_last_animation_stripe(): + return get_animation_stripe(anim_button_container.get_child_count()-1) + + +func _on_AddAnimation_pressed(): + emit_signal("on_add_animation") + + +func add_animation_stripe(): + var anim_stripe = AnimationStripe.instance() + anim_button_container.add_child(anim_stripe) + anim_stripe.connect("on_frame_pressed", self, "_on_frame_pressed") + anim_stripe.connect("on_add_frame_pressed", self, "_on_add_frame_pressed") + anim_stripe.connect("on_animation_pressed", self, "_on_animation_pressed") + anim_stripe.connect("on_move_down_pressed", self, "move_animation_down") + anim_stripe.connect("on_move_up_pressed", self, "move_animation_up") + anim_stripe.connect("on_moved", self, "_on_moved") + anim_stripe.connect("on_animation_duplicated", self, "_on_animation_duplicated") + anim_stripe.connect("on_animation_selected", self, "_on_animation_selected") + anim_stripe.connect("on_deleted", self, "_on_deleted") + + anim_stripe.add_new_frame_button() + + return anim_stripe + + +func _on_animation_pressed(anim_idx): + emit_signal("on_animation_pressed", anim_idx) + + +func _on_add_frame_pressed(anim, frame_button): + emit_signal("on_add_frame_pressed", anim, frame_button) + + +func _on_frame_pressed(anim, frame_button): + emit_signal("on_frame_pressed", anim, frame_button) + + +func get_animation_container(): + return anim_button_container + + +func set_play_pause_button(playing: bool): + if playing: + play_pause_button.text = "Pause" + else: + play_pause_button.text = "Play" + + +func _on_PlayPause_pressed(): + if play_pause_button.text == "Play": + play_pause_button.text = "Pause" + else: + play_pause_button.text = "Play" + emit_signal("on_play_pause_pressed") + + +func _on_FrameRate_value_changed(value): + emit_signal("on_animation_frame_rate_changed", value) + + +func _on_ToggleAnimationLoop_pressed(): + emit_signal("on_animation_loop_toggled") + + +func _on_animation_duplicated(anim): + emit_signal("on_animation_duplicated", anim) + + +func _on_animation_selected(anim): + emit_signal("on_animation_selected", anim) + + +func _on_deleted(anim): + emit_signal("on_animation_deleted", anim) diff --git a/addons/Godoxel/components/AnimationPanel.tscn b/addons/Godoxel/components/AnimationPanel.tscn new file mode 100644 index 0000000..a652961 --- /dev/null +++ b/addons/Godoxel/components/AnimationPanel.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/Godoxel/components/AnimationPanel.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.2, 0.227451, 0.309804, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.12549, 0.141176, 0.192157, 1 ) + +[node name="AnimationPanel" type="Panel"] +margin_right = 653.0 +margin_bottom = 120.0 +custom_styles/panel = SubResource( 1 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Panel" parent="VBoxContainer"] +margin_right = 653.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 0, 40 ) +custom_styles/panel = SubResource( 2 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/separation = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PlayPause" type="Button" parent="VBoxContainer/Panel/HBoxContainer"] +margin_top = 5.0 +margin_right = 60.0 +margin_bottom = 35.0 +rect_min_size = Vector2( 60, 30 ) +size_flags_vertical = 4 +text = "Play" + +[node name="FrameRate" type="SpinBox" parent="VBoxContainer/Panel/HBoxContainer"] +margin_left = 80.0 +margin_top = 4.0 +margin_right = 154.0 +margin_bottom = 36.0 +rect_min_size = Vector2( 0, 32 ) +size_flags_vertical = 4 +min_value = 0.001 +max_value = 200.0 +step = 0.1 +value = 5.0 +align = 1 +suffix = "fps" + +[node name="ToggleAnimationLoop" type="CheckButton" parent="VBoxContainer/Panel/HBoxContainer"] +margin_left = 174.0 +margin_right = 285.0 +margin_bottom = 40.0 +pressed = true +text = "Loop" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 44.0 +margin_right = 653.0 +margin_bottom = 120.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer2" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] +margin_right = 653.0 +margin_bottom = 76.0 +rect_min_size = Vector2( 450, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="AnimationButtons" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/HBoxContainer2"] +margin_right = 653.0 +size_flags_horizontal = 3 +custom_constants/separation = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/HBoxContainer2"] +margin_top = 4.0 +margin_right = 120.0 +margin_bottom = 34.0 +size_flags_horizontal = 0 + +[node name="AddAnimation" type="Button" parent="VBoxContainer/ScrollContainer/HBoxContainer2/VBoxContainer"] +margin_right = 120.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 120, 30 ) +text = "+" + +[connection signal="pressed" from="VBoxContainer/Panel/HBoxContainer/PlayPause" to="." method="_on_PlayPause_pressed"] +[connection signal="value_changed" from="VBoxContainer/Panel/HBoxContainer/FrameRate" to="." method="_on_FrameRate_value_changed"] +[connection signal="pressed" from="VBoxContainer/Panel/HBoxContainer/ToggleAnimationLoop" to="." method="_on_ToggleAnimationLoop_pressed"] +[connection signal="pressed" from="VBoxContainer/ScrollContainer/HBoxContainer2/VBoxContainer/AddAnimation" to="." method="_on_AddAnimation_pressed"] diff --git a/addons/Godoxel/components/AnimationStripe.gd b/addons/Godoxel/components/AnimationStripe.gd new file mode 100644 index 0000000..7cbfbe2 --- /dev/null +++ b/addons/Godoxel/components/AnimationStripe.gd @@ -0,0 +1,141 @@ +extends Panel +tool + +signal on_frame_pressed(anim, btn) +signal on_add_frame_pressed(anim, btn) +signal on_animation_pressed(anim) + +signal on_move_up_pressed(index) +signal on_move_down_pressed(index) +signal on_moved(form, to) + +signal on_animation_duplicated(anim) +signal on_animation_selected(anim) + +signal on_deleted(anim) + +const FrameButton = preload("res://addons/Godoxel/components/FrameButton.tscn") + +const StyleNormal = preload("res://addons/Godoxel/themes/AnimationStripe_Panel_normal.tres") +const StyleDragging = preload("res://addons/Godoxel/themes/AnimationStripe_Panel_dragging.tres") +const StyleDraggable = preload("res://addons/Godoxel/themes/AnimationStripe_Panel_draggable.tres") + +onready var frame_button_container = find_node("FrameContainer") +onready var anim_button = find_node("AnimationButton") +var frames = [] +var animation: GEAnimation + + +func _ready(): + set("custom_styles/panel", StyleNormal) + + +var previous_index = -1 +var current_index = -1 +var dragging = false +var mouse_offset = Vector2.ZERO +func _input(event): + if not dragging: + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and event.pressed: + if not dragging and get_global_rect().has_point(get_global_mouse_position()): + dragging = true + set("custom_styles/panel", StyleDragging) + var mp = get_global_mouse_position() + mouse_offset = mp - rect_global_position + emit_signal("on_animation_selected", get_index()) + if event is InputEventMouseMotion: + if get_global_rect().has_point(get_global_mouse_position()): + set("custom_styles/panel", StyleDraggable) + else: + set("custom_styles/panel", StyleNormal) + return + + if dragging and event is InputEventMouseButton: + if not event.pressed and event.button_index == BUTTON_LEFT: + dragging = false + current_index = -1 + current_index = -1 + mouse_offset = Vector2.ZERO + get_parent().update() + return + + previous_index = current_index + + var mp = get_global_mouse_position().y - get_parent().rect_global_position.y + var y_index = mp / (rect_size.y + get_parent().get("custom_constants/separation")) + y_index = clamp(int(y_index), 0, get_parent().get_child_count()-1) + current_index = y_index + + if previous_index != current_index and previous_index != -1: + emit_signal("on_moved", previous_index, current_index) + + +func set_animation(animation): + self.animation = animation + + +func get_animation_name() -> String: + return anim_button.label.text + + +func set_animation_name(anim_name: String): + anim_button.label.text = anim_name + anim_button.line_edit.text = anim_name + + +func get_frame_button(idx): + return frame_button_container.get_child(idx) + + +func add_new_frame_button(): + var frame_button = FrameButton.instance() + frame_button_container.add_child(frame_button) + frame_button.connect("on_frame_pressed", self, "_on_frame_pressed") + return frame_button + + +func add_frame(frame): + var frame_button = add_new_frame_button() + frame_button.set_frame(frame) + return frame_button + + +func remove_frame(idx): + var child = frame_button_container.get_child(idx) + frame_button_container.remove_child(child) + child.queue_free() + + +func _on_frame_pressed(frame_btn_index): + emit_signal("on_frame_pressed", get_index(), frame_btn_index) + + +func _on_AddFrame_pressed(): + var frame_button = add_new_frame_button() + emit_signal("on_add_frame_pressed", get_index(), frame_button.get_index()) + + +func _on_AnimationButton_on_animation_button_pressed(): + emit_signal("on_animation_pressed", get_index()) + + +func _on_AnimationButton_pressed(): + pass # Replace with function body. + + +func _on_Up_pressed(): + emit_signal("on_move_up_pressed", get_index()) + + +func _on_Down_pressed(): + emit_signal("on_move_down_pressed", get_index()) + + +func _on_Duplicate_pressed(): + emit_signal("on_animation_duplicated", get_index()) + + +func _on_Delete_pressed(): + emit_signal("on_deleted", get_index()) + diff --git a/addons/Godoxel/components/AnimationStripe.tscn b/addons/Godoxel/components/AnimationStripe.tscn new file mode 100644 index 0000000..53d681c --- /dev/null +++ b/addons/Godoxel/components/AnimationStripe.tscn @@ -0,0 +1,132 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/Godoxel/components/AnimationButton.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/Godoxel/components/AnimationStripe.gd" type="Script" id=2] +[ext_resource path="res://addons/Godoxel/themes/AnimationStripe_Panel_normal.tres" type="StyleBox" id=3] +[ext_resource path="res://addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf" type="DynamicFontData" id=4] +[ext_resource path="res://addons/Godoxel/assets/animation_arrow_up.png" type="Texture" id=5] +[ext_resource path="res://addons/Godoxel/assets/animation_arrow_down.png" type="Texture" id=6] + +[sub_resource type="DynamicFont" id=1] +size = 12 +use_filter = true +font_data = ExtResource( 4 ) + +[node name="AnimationStripe" type="Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -813.0 +margin_bottom = -666.0 +rect_min_size = Vector2( 0, 54 ) +size_flags_horizontal = 3 +custom_styles/panel = ExtResource( 3 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_right = -4.0 +rect_pivot_offset = Vector2( -149, -134 ) +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationButton" parent="HBoxContainer" instance=ExtResource( 1 )] +margin_top = 7.0 +margin_right = 120.0 +margin_bottom = 47.0 +rect_min_size = Vector2( 120, 40 ) +size_flags_vertical = 4 +custom_fonts/font = SubResource( 1 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_left = 124.0 +margin_right = 152.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 20, 0 ) +custom_constants/separation = 5 +alignment = 1 + +[node name="Up" type="TextureButton" parent="HBoxContainer/VBoxContainer"] +margin_top = 6.0 +margin_right = 28.0 +margin_bottom = 18.0 +rect_min_size = Vector2( 28, 12 ) +size_flags_vertical = 6 +texture_normal = ExtResource( 5 ) +expand = true +stretch_mode = 5 + +[node name="Down" type="TextureButton" parent="HBoxContainer/VBoxContainer"] +margin_top = 35.0 +margin_right = 28.0 +margin_bottom = 47.0 +rect_min_size = Vector2( 28, 12 ) +size_flags_vertical = 6 +texture_normal = ExtResource( 6 ) +expand = true +stretch_mode = 5 + +[node name="ScrollContainer" type="ScrollContainer" parent="HBoxContainer"] +margin_left = 156.0 +margin_right = 333.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 80, 0 ) +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_vertical_enabled = false + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/ScrollContainer"] +margin_right = 54.0 +margin_bottom = 54.0 +size_flags_vertical = 3 + +[node name="FrameContainer" type="HBoxContainer" parent="HBoxContainer/ScrollContainer/HBoxContainer"] +margin_bottom = 54.0 +rect_min_size = Vector2( 0, 38 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/ScrollContainer/HBoxContainer"] +margin_left = 4.0 +margin_right = 54.0 +margin_bottom = 54.0 +size_flags_vertical = 5 + +[node name="AddFrame" type="Button" parent="HBoxContainer/ScrollContainer/HBoxContainer/HBoxContainer"] +margin_right = 50.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 50, 0 ) +text = "+" + +[node name="Duplicate" type="Button" parent="HBoxContainer"] +margin_left = 337.0 +margin_top = 9.0 +margin_right = 406.0 +margin_bottom = 44.0 +rect_min_size = Vector2( 0, 35 ) +size_flags_vertical = 4 +custom_fonts/font = SubResource( 1 ) +text = "Duplicate" + +[node name="Delete" type="Button" parent="HBoxContainer"] +margin_left = 410.0 +margin_top = 9.0 +margin_right = 459.0 +margin_bottom = 44.0 +rect_min_size = Vector2( 0, 35 ) +size_flags_vertical = 4 +custom_fonts/font = SubResource( 1 ) +text = "delete" + +[connection signal="on_animation_button_pressed" from="HBoxContainer/AnimationButton" to="." method="_on_AnimationButton_on_animation_button_pressed"] +[connection signal="pressed" from="HBoxContainer/AnimationButton" to="." method="_on_AnimationButton_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer/Up" to="." method="_on_Up_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer/Down" to="." method="_on_Down_pressed"] +[connection signal="pressed" from="HBoxContainer/ScrollContainer/HBoxContainer/HBoxContainer/AddFrame" to="." method="_on_AddFrame_pressed"] +[connection signal="pressed" from="HBoxContainer/Duplicate" to="." method="_on_Duplicate_pressed"] +[connection signal="pressed" from="HBoxContainer/Delete" to="." method="_on_Delete_pressed"] diff --git a/addons/Godoxel/components/FrameButton.gd b/addons/Godoxel/components/FrameButton.gd new file mode 100644 index 0000000..a756018 --- /dev/null +++ b/addons/Godoxel/components/FrameButton.gd @@ -0,0 +1,55 @@ +extends Button +tool + +signal on_frame_pressed(btn) + +onready var frame_preview := find_node("TextureRect") + +var frame: GEFrame + + +func _ready(): + pass + + +func set_frame(frame: GEFrame): + self.frame = frame + update_preview() + + +func set_layer_visibility(layer_idx: int, visibility: bool): + frame.layers[layer_idx].visible = visibility + + +func update_preview(): + for child in get_children(): + remove_child(child) + child.queue_free() + + for layer in frame.layers: + if not layer.visible: + continue + var texture_rect = TextureRect.new() + add_child(texture_rect) + texture_rect.expand = true + texture_rect.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED + texture_rect.anchor_bottom = 1 + texture_rect.anchor_right = 1 + texture_rect.margin_left = 3 + texture_rect.margin_top = 3 + texture_rect.margin_right = -3 + texture_rect.margin_bottom = -3 + + texture_rect.texture = layer.texture + + +func move_layer_forward(): + pass + + +func move_layer_back(): + pass + + +func _on_FrameButton_pressed(): + emit_signal("on_frame_pressed", get_index()) diff --git a/addons/Godoxel/components/FrameButton.tscn b/addons/Godoxel/components/FrameButton.tscn new file mode 100644 index 0000000..51395e4 --- /dev/null +++ b/addons/Godoxel/components/FrameButton.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/Godoxel/components/FrameButton.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.933333, 0.933333, 0.933333, 1 ) +border_color = Color( 0.266667, 0.266667, 0.266667, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.933333, 0.933333, 0.933333, 1 ) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color( 0.662745, 0.662745, 0.662745, 1 ) + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.721569, 0.721569, 0.721569, 1 ) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color( 0.45098, 0.45098, 0.45098, 1 ) + +[node name="FrameButton" type="Button"] +margin_right = 50.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 50, 50 ) +custom_styles/hover = SubResource( 3 ) +custom_styles/focus = SubResource( 2 ) +custom_styles/normal = SubResource( 1 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 3.0 +margin_top = 3.0 +margin_right = -3.0 +margin_bottom = -3.0 +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="." to="." method="_on_FrameButton_pressed"] diff --git a/addons/Godoxel/components/ShortcutPanel.gd b/addons/Godoxel/components/ShortcutPanel.gd new file mode 100644 index 0000000..507f69e --- /dev/null +++ b/addons/Godoxel/components/ShortcutPanel.gd @@ -0,0 +1,29 @@ +extends Panel +tool + +onready var name_label = find_node("Name") +onready var shortcut_label = find_node("Shortcut") + +const select_theme = preload("res://addons/Godoxel/themes/ShortcutPanel_selected.tres") +const deselect_theme = preload("res://addons/Godoxel/themes/ShortcutPanel_deselected.tres") + + +func _ready(): + set("custom_styles/panel", deselect_theme) + + +func set_tool(tool_name, tool_shortcut): + name_label.text = tool_name + shortcut_label.text = tool_shortcut + + +func select(): + set("custom_styles/panel", select_theme) + + +func deselect(): + set("custom_styles/panel", deselect_theme) + + +func get_shortcut(): + return shortcut_label.text diff --git a/addons/Godoxel/components/ShortcutPanel.tscn b/addons/Godoxel/components/ShortcutPanel.tscn new file mode 100644 index 0000000..263da77 --- /dev/null +++ b/addons/Godoxel/components/ShortcutPanel.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/Godoxel/components/ShortcutPanel.gd" type="Script" id=1] +[ext_resource path="res://addons/Godoxel/themes/ShortcutPanel_deselected.tres" type="StyleBox" id=2] + +[node name="ShortcutPanel" type="Panel"] +margin_right = 85.0 +margin_bottom = 75.0 +rect_min_size = Vector2( 85, 75 ) +size_flags_horizontal = 0 +size_flags_vertical = 0 +custom_styles/panel = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Name" type="Label" parent="VBoxContainer"] +margin_right = 85.0 +margin_bottom = 35.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 2 + +[node name="Shortcut" type="Label" parent="VBoxContainer"] +margin_top = 39.0 +margin_right = 85.0 +margin_bottom = 75.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 diff --git a/addons/Godoxel/components/ShortcutWindow.gd b/addons/Godoxel/components/ShortcutWindow.gd new file mode 100644 index 0000000..17181b7 --- /dev/null +++ b/addons/Godoxel/components/ShortcutWindow.gd @@ -0,0 +1,59 @@ +extends Panel +tool + +onready var shortcut_container = find_node("ShortcutContainer") + +var shortcuts = {} +var shift_pressed = false +var panels = [] + + +func _ready(): + hide() + panels.clear() + for child in get_child(0).get_children(): + for panel in child.get_children(): + if panel is Panel: + panels.append(panel) + + +func setup(shortcuts: Dictionary): + self.shortcuts = shortcuts + var idx = 0 + for panel in panels: + var tool_name = "" + if typeof(shortcuts.values()[idx]) == TYPE_STRING: + tool_name = str(shortcuts.values()[idx]) + else: + tool_name = str(owner.Tools.keys()[shortcuts.values()[idx]]) + tool_name = tool_name.to_lower().capitalize() + + var shortcut = OS.get_scancode_string(shortcuts.keys()[idx]) + panel.set_tool(tool_name, shortcut) + idx += 1 + + +func check_input_for_shorcut(event: InputEvent, shift_pressed: bool): + if not event is InputEventKey: + return + + if event.pressed: + if event.scancode in shortcuts.keys(): + for panel in panels: + panel.deselect() + get_panel(event.as_text()).select() + return true + else: + for panel in panels: + panel.deselect() + return false + + +func get_panel(scancode: String): + var character = scancode.substr(scancode.length() - 1, 1) + for panel in panels: + if panel.get_shortcut() == character: + return panel + return null + + diff --git a/addons/Godoxel/components/ShortcutWindow.tscn b/addons/Godoxel/components/ShortcutWindow.tscn new file mode 100644 index 0000000..aae430e --- /dev/null +++ b/addons/Godoxel/components/ShortcutWindow.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/Godoxel/components/ShortcutWindow.gd" type="Script" id=1] +[ext_resource path="res://addons/Godoxel/components/ShortcutPanel.tscn" type="PackedScene" id=2] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.247059, 0.239216, 0.239216, 0.819608 ) +border_color = Color( 1, 1, 1, 1 ) +border_blend = true +corner_radius_top_left = 20 +corner_radius_top_right = 80 +corner_radius_bottom_right = 20 +corner_radius_bottom_left = 80 + +[node name="ShortcutWindow" type="Panel"] +visible = false +margin_right = 390.0 +margin_bottom = 328.0 +rect_pivot_offset = Vector2( -497, -187 ) +custom_styles/panel = SubResource( 1 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ShortcutContainer" type="VBoxContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -189.0 +margin_top = -124.0 +margin_right = 158.0 +margin_bottom = 158.0 +custom_constants/separation = 15 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="ShortcutContainer"] +margin_right = 355.0 +margin_bottom = 75.0 +size_flags_vertical = 0 +custom_constants/separation = 15 +alignment = 1 + +[node name="PAINT" parent="ShortcutContainer/HBoxContainer" instance=ExtResource( 2 )] +margin_left = 35.0 +margin_right = 120.0 + +[node name="BUCKET" parent="ShortcutContainer/HBoxContainer" instance=ExtResource( 2 )] +margin_left = 135.0 +margin_right = 220.0 + +[node name="RAINBOW" parent="ShortcutContainer/HBoxContainer" instance=ExtResource( 2 )] +margin_left = 235.0 +margin_right = 320.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="ShortcutContainer"] +margin_top = 90.0 +margin_right = 355.0 +margin_bottom = 165.0 +size_flags_vertical = 0 +custom_constants/separation = 15 +alignment = 1 + +[node name="Control" type="Control" parent="ShortcutContainer/HBoxContainer2"] +margin_left = 17.0 +margin_right = 37.0 +margin_bottom = 75.0 +rect_min_size = Vector2( 20, 0 ) + +[node name="LINE" parent="ShortcutContainer/HBoxContainer2" instance=ExtResource( 2 )] +margin_left = 52.0 +margin_right = 137.0 + +[node name="RECT" parent="ShortcutContainer/HBoxContainer2" instance=ExtResource( 2 )] +margin_left = 152.0 +margin_right = 237.0 + +[node name="COLORPICKER" parent="ShortcutContainer/HBoxContainer2" instance=ExtResource( 2 )] +margin_left = 252.0 +margin_right = 337.0 + +[node name="HBoxContainer3" type="HBoxContainer" parent="ShortcutContainer"] +margin_top = 180.0 +margin_right = 355.0 +margin_bottom = 255.0 +size_flags_vertical = 0 +custom_constants/separation = 15 +alignment = 1 + +[node name="Control" type="Control" parent="ShortcutContainer/HBoxContainer3"] +margin_right = 20.0 +margin_bottom = 75.0 +rect_min_size = Vector2( 20, 0 ) + +[node name="Control2" type="Control" parent="ShortcutContainer/HBoxContainer3"] +margin_left = 35.0 +margin_right = 55.0 +margin_bottom = 75.0 +rect_min_size = Vector2( 20, 0 ) + +[node name="BRIGHTEN" parent="ShortcutContainer/HBoxContainer3" instance=ExtResource( 2 )] +margin_left = 70.0 +margin_right = 155.0 + +[node name="DARKEN" parent="ShortcutContainer/HBoxContainer3" instance=ExtResource( 2 )] +margin_left = 170.0 +margin_right = 255.0 + +[node name="CUT" parent="ShortcutContainer/HBoxContainer3" instance=ExtResource( 2 )] +margin_left = 270.0 +margin_right = 355.0 diff --git a/addons/Godoxel/dialogs/ChangeCanvasDialog.gd b/addons/Godoxel/dialogs/ChangeCanvasDialog.gd new file mode 100644 index 0000000..0d0a511 --- /dev/null +++ b/addons/Godoxel/dialogs/ChangeCanvasDialog.gd @@ -0,0 +1,29 @@ +extends GEDraggableWindow +tool + + +var width_comp: SpinBox +var height_comp: SpinBox + + +func _ready() -> void: + connect("on_ok", self, "_on_ConfirmationDialog_confirmed") + connect("visibility_changed", self, "_on_ChangeCanvasSize_visibility_changed") + + yield(owner, "ready") + + width_comp = add_component_float("Width (px)", owner.paint_canvas.canvas_width, 1, 5000) + height_comp = add_component_float("Height (px)", owner.paint_canvas.canvas_height, 1, 5000) + + +func _on_ConfirmationDialog_confirmed(): + var width = width_comp.value + var height = height_comp.value + print("change canvas size: ", width, " ", height) + owner.resize(width, height) + + +func _on_ChangeCanvasSize_visibility_changed(): + if visible: + width_comp.value = owner.paint_canvas.canvas_width + height_comp.value = owner.paint_canvas.canvas_height diff --git a/addons/Godoxel/dialogs/ChangeGridSizeDialog.gd b/addons/Godoxel/dialogs/ChangeGridSizeDialog.gd new file mode 100644 index 0000000..2aea630 --- /dev/null +++ b/addons/Godoxel/dialogs/ChangeGridSizeDialog.gd @@ -0,0 +1,28 @@ +extends AcceptDialog +tool + +func _ready(): + yield(owner, "ready") + find_node("GridValue").value = owner.paint_canvas.grid_size + find_node("BigGridValue").value = owner.paint_canvas.big_grid_size + + +func _on_ChangeGridSizeDialog_confirmed(): + var grid_size = find_node("GridValue").value + var big_grid_size = find_node("BigGridValue").value + owner.paint_canvas.grid_size = grid_size + owner.paint_canvas.big_grid_size = big_grid_size + + +func _on_GridValue_value_changed(value): + var grid_size = value + owner.paint_canvas.grid_size = grid_size + + +func _on_BigGridValue_value_changed(value): + var big_grid_size = value + owner.paint_canvas.big_grid_size = big_grid_size + + +func _on_ChangeGridSizeDialog_visibility_changed(): + pass # Replace with function body. diff --git a/addons/Godoxel/dialogs/ConfirmationDialog.gd b/addons/Godoxel/dialogs/ConfirmationDialog.gd new file mode 100644 index 0000000..07b15a0 --- /dev/null +++ b/addons/Godoxel/dialogs/ConfirmationDialog.gd @@ -0,0 +1,20 @@ +extends ConfirmationDialog +tool + +func _ready(): + yield(owner, "ready") + find_node("Width").value = owner.paint_canvas.canvas_width + find_node("Height").value = owner.paint_canvas.canvas_height + + +func _on_ConfirmationDialog_confirmed(): + var width = find_node("Width").value + var height = find_node("Height").value + print("change canvas size: ", width, " ", height) + owner.paint_canvas.resize(width, height) + + +func _on_ChangeCanvasSize_visibility_changed(): + if visible: + find_node("Width").value = owner.paint_canvas.canvas_width + find_node("Height").value = owner.paint_canvas.canvas_height diff --git a/addons/Godoxel/dialogs/DraggableWindow.gd b/addons/Godoxel/dialogs/DraggableWindow.gd new file mode 100644 index 0000000..fb56c59 --- /dev/null +++ b/addons/Godoxel/dialogs/DraggableWindow.gd @@ -0,0 +1,128 @@ +extends Control +class_name GEDraggableWindow +tool + +signal on_cancel() +signal on_ok() + +export(bool) var show_ok_cancel = true setget set_ok_cancel_visible +export(bool) var show_close = true setget set_close_visible +export(String) var title = "" setget set_title + +onready var title_bar = find_node("TitleBar") +onready var close_button = find_node("CloseButton") +onready var title_label = find_node("Title") +onready var main = find_node("Main") +var _main_child = null + +var dragging = false +var mouse_offset = Vector2.ZERO +var children = [] + + +func _ready() -> void: + _main_child = main.get_child(0) + + set_title(title) + set_ok_cancel_visible(show_ok_cancel) + set_close_visible(show_close) + + hide() + + +func set_title(new_title: String): + title = new_title + + if title_label: + title_label.text = title + + +func set_ok_cancel_visible(new_visible: bool): + show_ok_cancel = new_visible + if _main_child: + _main_child.visible = show_ok_cancel + + +func set_close_visible(new_visible: bool): + show_close = new_visible + if close_button: + close_button.visible = show_close + + +func _add_child(child, legible_unique_name=false): + main.add_child(child, legible_unique_name) + _main_child.raise() + + +func _input(event: InputEvent) -> void: + if not dragging or not visible: + return + rect_global_position = get_global_mouse_position() - mouse_offset + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and not event.pressed: + dragging = false + + +func _on_ColorRect2_gui_input(event: InputEvent) -> void: + if not visible: + return + + if event is InputEventMouseButton: + if not Rect2(title_bar.rect_global_position, title_bar.rect_size).has_point( + get_global_mouse_position()): + return + if event.button_index == BUTTON_LEFT and event.pressed: + dragging = true + mouse_offset = get_global_mouse_position() - rect_global_position + + + +################################################## +# Components +################################################## + +func add_component_float(comp_name: String, + default: float, from: float = -1, to: float = -1) -> SpinBox: + var label = Label.new() + label.text = comp_name + + var spinbox = SpinBox.new() + spinbox.value = default + + if not is_equal_approx(from, to): + spinbox.min_value = from + spinbox.max_value = to + + var hbox = HBoxContainer.new() + hbox.add_child(label) + hbox.add_child(spinbox) + label.size_flags_horizontal = Label.SIZE_EXPAND_FILL + label.size_flags_vertical = Label.SIZE_EXPAND_FILL + spinbox.size_flags_horizontal = Label.SIZE_EXPAND_FILL + spinbox.size_flags_vertical = Label.SIZE_EXPAND_FILL + + _add_child(hbox) + + return spinbox + + + +################################################## +# Signals +################################################## + +func _on_Button_pressed() -> void: + hide() + emit_signal("on_cancel") + + +func _on_Ok_pressed() -> void: + emit_signal("on_ok") + hide() + + +func _on_Cancel_pressed() -> void: + hide() + emit_signal("on_cancel") + + diff --git a/addons/Godoxel/dialogs/DraggableWindow.tscn b/addons/Godoxel/dialogs/DraggableWindow.tscn new file mode 100644 index 0000000..ef000a1 --- /dev/null +++ b/addons/Godoxel/dialogs/DraggableWindow.tscn @@ -0,0 +1,172 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/Godoxel/dialogs/DraggableWindow.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=62] +bg_color = Color( 0.88, 0.3696, 0.3696, 1 ) + +[sub_resource type="StyleBoxFlat" id=63] +content_margin_left = 5.0 +content_margin_right = 5.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 + +[node name="Window" type="Control"] +visible = false +margin_right = 236.0 +margin_bottom = 136.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +rect_min_size = Vector2( 0, 24 ) +size_flags_horizontal = 3 +color = Color( 0.12549, 0.141176, 0.192157, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="HBoxContainer" parent="ColorRect"] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/separation = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TitleBar" type="Control" parent="ColorRect/VBoxContainer"] +margin_right = 212.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Title" type="Label" parent="ColorRect/VBoxContainer/TitleBar"] +anchor_right = 1.0 +anchor_bottom = 1.0 +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CloseButton" type="Button" parent="ColorRect/VBoxContainer"] +margin_left = 212.0 +margin_right = 236.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 24, 24 ) +custom_styles/normal = SubResource( 62 ) + +[node name="ColorRect" type="ColorRect" parent="ColorRect/VBoxContainer/CloseButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -5.0 +margin_top = -6.0 +margin_right = 11.0 +margin_bottom = -5.0 +rect_rotation = 45.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect2" type="ColorRect" parent="ColorRect/VBoxContainer/CloseButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -6.0 +margin_top = 5.0 +margin_right = 10.0 +margin_bottom = 6.0 +rect_rotation = -45.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect2" type="ColorRect" parent="."] +show_behind_parent = true +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +color = Color( 0.2, 0.227451, 0.309804, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect" type="ColorRect" parent="ColorRect2"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 5.0 +margin_top = 5.0 +margin_right = -5.0 +margin_bottom = -5.0 +mouse_filter = 2 +color = Color( 0.234, 0.2655, 0.36, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Main" type="VBoxContainer" parent="ColorRect2"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 5.0 +margin_top = 5.0 +margin_right = -5.0 +margin_bottom = -5.0 +mouse_filter = 2 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ColorRect2/Main"] +margin_top = 98.0 +margin_right = 226.0 +margin_bottom = 126.0 +mouse_filter = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="ColorRect2/Main/VBoxContainer"] +margin_right = 226.0 +margin_bottom = 24.0 +mouse_filter = 2 +alignment = 1 + +[node name="Ok" type="Button" parent="ColorRect2/Main/VBoxContainer/HBoxContainer"] +margin_left = 58.0 +margin_right = 88.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 30, 19 ) +custom_styles/normal = SubResource( 63 ) +text = "Ok" + +[node name="Control" type="Control" parent="ColorRect2/Main/VBoxContainer/HBoxContainer"] +margin_left = 92.0 +margin_right = 112.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 20, 0 ) +mouse_filter = 2 + +[node name="Cancel" type="Button" parent="ColorRect2/Main/VBoxContainer/HBoxContainer"] +margin_left = 116.0 +margin_right = 168.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 30, 19 ) +custom_styles/normal = SubResource( 63 ) +text = "Cancel" + +[node name="Control" type="Control" parent="ColorRect2/Main/VBoxContainer"] +margin_top = 28.0 +margin_right = 226.0 +margin_bottom = 28.0 +mouse_filter = 2 + +[connection signal="pressed" from="ColorRect/VBoxContainer/CloseButton" to="." method="_on_Button_pressed"] +[connection signal="gui_input" from="ColorRect2" to="." method="_on_ColorRect2_gui_input"] +[connection signal="pressed" from="ColorRect2/Main/VBoxContainer/HBoxContainer/Ok" to="." method="_on_Ok_pressed"] +[connection signal="pressed" from="ColorRect2/Main/VBoxContainer/HBoxContainer/Cancel" to="." method="_on_Cancel_pressed"] diff --git a/addons/Godoxel/dialogs/LoadFileDialog.gd b/addons/Godoxel/dialogs/LoadFileDialog.gd new file mode 100644 index 0000000..50a75fc --- /dev/null +++ b/addons/Godoxel/dialogs/LoadFileDialog.gd @@ -0,0 +1,112 @@ +tool +extends FileDialog + + +enum LoadMode { + IMPORT_IMAGE, + LOAD_PROJECT, +} + +var canvas: GECanvas +var file_path = "" +var load_mode = LoadMode.IMPORT_IMAGE + + +func _ready(): + get_line_edit().connect("text_entered", self, "_on_LineEdit_text_entered") + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + + +func _on_LineEdit_text_entered(_text): + return +# print(_text) + #load_img() +# print("hsadfasd") + + + +####################################################### +# dialogs +####################################################### + +func open_load_project(): + invalidate() + clear_filters() + add_filter("*.godoxel ; Godot - Godoxel") + load_mode = LoadMode.LOAD_PROJECT + show() + + +func open_import_image(): + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + load_mode = LoadMode.IMPORT_IMAGE + show() + + + +####################################################### +# dialogs +####################################################### + +func _on_LoadFileDialog_file_selected(path): + file_path = path + + match load_mode: + LoadMode.IMPORT_IMAGE: + import_image() + LoadMode.LOAD_PROJECT: + load_project() + + +func load_project(): + var file = File.new() + file.open(file_path, File.READ) + var data = JSON.parse(file.get_as_text()).result + file.close() + + owner.load_project(data) + + +func import_image(): + var image = Image.new() + if image.load(file_path) != OK: + print("couldn't load image!") + return + + var image_data = image.get_data() + var layer: GELayer = owner.add_new_layer() + + var width = image.get_width() + var height = image.get_height() + + if owner.paint_canvas.canvas_width < width: + owner.resize(width, owner.paint_canvas.canvas_height) + + if owner.paint_canvas.canvas_height < height: + owner.resize(owner.paint_canvas.canvas_width, height) + + for i in range(image_data.size() / 4): + var color = Color(image_data[i*4] / 255.0, image_data[i*4+1] / 255.0, image_data[i*4+2] / 255.0, image_data[i*4+3] / 255.0) + var pos = GEUtils.to_2D(i, image.get_width()) + if pos.x > layer.layer_width: + continue + + layer.set_pixel(pos.x, pos.y, color) + layer.update_texture() + owner._update_frame_button_previews() + + +func _on_LoadFileDialog_confirmed(): + return + + +func _on_LoadFileDialog_about_to_show(): + invalidate() + + +func _on_LoadFileDialog_visibility_changed(): + invalidate() diff --git a/addons/Godoxel/dialogs/LoadFileDialog.tscn b/addons/Godoxel/dialogs/LoadFileDialog.tscn new file mode 100644 index 0000000..0d083c0 --- /dev/null +++ b/addons/Godoxel/dialogs/LoadFileDialog.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=2] + +[sub_resource type="GDScript" id=1] +script/source = "extends ConfirmationDialog + +func _ready(): + get_ok().connect(\"pressed\", self, \"hide\") + get_cancel().connect(\"pressed\", self, \"hide\") + + + +" + +[node name="LoadFileDialog" type="FileDialog"] +margin_right = 604.0 +margin_bottom = 367.0 +window_title = "Open a File" +mode = 0 +access = 2 +current_dir = "/Projects/BitBucket/GraphicsEditor" +current_path = "/Projects/BitBucket/GraphicsEditor/" +script = SubResource( 1 ) diff --git a/addons/Godoxel/plugin.cfg b/addons/Godoxel/plugin.cfg new file mode 100644 index 0000000..526cfb3 --- /dev/null +++ b/addons/Godoxel/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godoxel - Pixel Image Editor" +description="" +author="" +version="" +script="plugin.gd" diff --git a/addons/Godoxel/plugin.gd b/addons/Godoxel/plugin.gd new file mode 100644 index 0000000..c288aaf --- /dev/null +++ b/addons/Godoxel/plugin.gd @@ -0,0 +1,37 @@ +tool +extends EditorPlugin + +var editor_scene = load("res://addons/Godoxel/Editor.tscn").instance() + +func _enter_tree(): + editor_scene.name = "Editor" + if get_editor_interface().get_editor_viewport().has_node("Editor"): + var n = get_editor_interface().get_editor_viewport().get_node("Editor") + n.name = "EditorDel" + n.queue_free() + get_editor_interface().get_editor_viewport().add_child(editor_scene, true) + editor_scene.owner = get_editor_interface().get_editor_viewport() + make_visible(false) + + +func _exit_tree(): + if editor_scene: + editor_scene.queue_free() + + +func has_main_screen(): + return true + + +func make_visible(visible): + if editor_scene: + editor_scene.visible = visible + + +func get_plugin_name(): + return "Godoxel" + + +func get_plugin_icon(): + # Must return some kind of Texture for the icon. + return get_editor_interface().get_base_control().get_icon("CanvasModulate", "EditorIcons") diff --git a/addons/Godoxel/themes/AnimationStripe_Panel_draggable.tres b/addons/Godoxel/themes/AnimationStripe_Panel_draggable.tres new file mode 100644 index 0000000..0200614 --- /dev/null +++ b/addons/Godoxel/themes/AnimationStripe_Panel_draggable.tres @@ -0,0 +1,4 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.442, 0.5015, 0.68, 1 ) diff --git a/addons/Godoxel/themes/AnimationStripe_Panel_dragging.tres b/addons/Godoxel/themes/AnimationStripe_Panel_dragging.tres new file mode 100644 index 0000000..c25d34d --- /dev/null +++ b/addons/Godoxel/themes/AnimationStripe_Panel_dragging.tres @@ -0,0 +1,4 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.7426, 0.77221, 0.94, 1 ) diff --git a/addons/Godoxel/themes/AnimationStripe_Panel_normal.tres b/addons/Godoxel/themes/AnimationStripe_Panel_normal.tres new file mode 100644 index 0000000..699cc0b --- /dev/null +++ b/addons/Godoxel/themes/AnimationStripe_Panel_normal.tres @@ -0,0 +1,4 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.27451, 0.309804, 0.419608, 1 ) diff --git a/addons/Godoxel/themes/ShortcutPanel_deselected.tres b/addons/Godoxel/themes/ShortcutPanel_deselected.tres new file mode 100644 index 0000000..d724934 --- /dev/null +++ b/addons/Godoxel/themes/ShortcutPanel_deselected.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.141176, 0.141176, 0.141176, 0.607843 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_blend = true +corner_radius_top_left = 7 +corner_radius_top_right = 25 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 25 diff --git a/addons/Godoxel/themes/ShortcutPanel_selected.tres b/addons/Godoxel/themes/ShortcutPanel_selected.tres new file mode 100644 index 0000000..5b89768 --- /dev/null +++ b/addons/Godoxel/themes/ShortcutPanel_selected.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.411765, 0.411765, 0.411765, 0.607843 ) +border_blend = true +corner_radius_top_left = 7 +corner_radius_top_right = 25 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 25 diff --git a/art/entities/fiend.png b/art/entities/fiend.png new file mode 100644 index 0000000..897d6c5 --- /dev/null +++ b/art/entities/fiend.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42e68360f3f01617f9e5b8ecb68b159793531dfda6b64ca37a270fc28d86f83a +size 180 diff --git a/art/entities/fiend.png.import b/art/entities/fiend.png.import new file mode 100644 index 0000000..c89daf5 --- /dev/null +++ b/art/entities/fiend.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://art/entities/fiend.png" +dest_files=[ "res://.import/fiend.png-46f0c65314f5bbca8d0599edf0d36a2b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/nodes/FittingSprite.gd b/nodes/FittingSprite.gd new file mode 100644 index 0000000..1cf264b --- /dev/null +++ b/nodes/FittingSprite.gd @@ -0,0 +1,14 @@ +tool +extends Sprite +class_name TK_FittingSprite + +## A Sprite that is resized to absolute pixel size, no matter the texture. + +export var target_size: Vector2 setget _set_target_size + +func _set_target_size(p_size: Vector2) -> void: + target_size = p_size + _update_scale() + +func _update_scale() -> void: + scale = target_size / texture.get_size() diff --git a/nodes/GridContext.gd b/nodes/GridContext.gd new file mode 100644 index 0000000..5f21175 --- /dev/null +++ b/nodes/GridContext.gd @@ -0,0 +1,13 @@ +extends Node2D +class_name TK_GridContext + +## todo: Cell visualization. +## todo: Integration of TileMap. + +export var cell_size: Vector2 = Vector2(64, 64) + +func position_to_cell_position(p_position: Vector2) -> Vector2: + return Arithmetic.vector2_mod(global_position - p_position, cell_size) + +func is_cell_traversible(p_cell_position: Vector2) -> bool: + return true diff --git a/nodes/GridContext.tscn b/nodes/GridContext.tscn new file mode 100644 index 0000000..3522db6 --- /dev/null +++ b/nodes/GridContext.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://nodes/GridContext.gd" type="Script" id=1] + +[node name="GridContext" type="Node2D"] +script = ExtResource( 1 ) diff --git a/nodes/GridController.gd b/nodes/GridController.gd new file mode 100644 index 0000000..eb5dd72 --- /dev/null +++ b/nodes/GridController.gd @@ -0,0 +1,26 @@ +extends Node +class_name TK_GridController + +## Composable 4-way grid controller. +## Depends on placement below some Node2D below some GridContext. + +signal moved(p_new_cell_position) + +func _input(p_event: InputEvent): + var direction := InputUtils.input_event_to_4way_direction(p_event) + if direction == Vector2.ZERO: + return + + var context := _get_grid_context() + var cell = context.position_to_cell_position(get_parent().global_position) + var new_cell = cell + direction + if context.is_cell_traversible(new_cell): + # todo: Should we move the outmost node2d? + get_parent().position += context.cell_size * direction + emit_signal("moved", new_cell) + +func _get_grid_context() -> Node: + var current := self.get_parent().get_parent() + while current.name != "GridContext": + current = current.get_parent() + return current diff --git a/nodes/GridController.tscn b/nodes/GridController.tscn new file mode 100644 index 0000000..59c9e3f --- /dev/null +++ b/nodes/GridController.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://nodes/GridController.gd" type="Script" id=1] + +[node name="GridController" type="Node"] +script = ExtResource( 1 ) diff --git a/nodes/singletons/Arithmetic.gd b/nodes/singletons/Arithmetic.gd new file mode 100644 index 0000000..5be6587 --- /dev/null +++ b/nodes/singletons/Arithmetic.gd @@ -0,0 +1,8 @@ +extends Node +class_name TK_Arithmetic + +static func float_mod(p_a: float, p_b: float) -> float: + return p_a - (p_b * floor(p_a / p_b)) + +static func vector2_mod(p_a: Vector2, p_b: Vector2) -> Vector2: + return p_a - (p_b * (p_a / p_b).floor()) diff --git a/nodes/singletons/InputUtils.gd b/nodes/singletons/InputUtils.gd new file mode 100644 index 0000000..06a5e1e --- /dev/null +++ b/nodes/singletons/InputUtils.gd @@ -0,0 +1,13 @@ +extends Node + +func input_event_to_4way_direction(p_event: InputEvent) -> Vector2: + var result := Vector2.ZERO + if p_event.is_action_pressed("move_down"): + result.y += 1 + if p_event.is_action_pressed("move_right"): + result.x += 1 + if p_event.is_action_pressed("move_up"): + result.y -= 1 + if p_event.is_action_pressed("move_left"): + result.x -= 1 + return result diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..7062b5a --- /dev/null +++ b/project.godot @@ -0,0 +1,210 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ { +"base": "Reference", +"class": "BrushPrefabs", +"language": "GDScript", +"path": "res://addons/Godoxel/BrushPrefabs.gd" +}, { +"base": "Node", +"class": "GEAction", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Action.gd" +}, { +"base": "Node", +"class": "GEAnimation", +"language": "GDScript", +"path": "res://addons/Godoxel/Animation.gd" +}, { +"base": "GEAction", +"class": "GEBrighten", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Brighten.gd" +}, { +"base": "GEAction", +"class": "GEBrush", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Brush.gd" +}, { +"base": "GEAction", +"class": "GEBucket", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Bucket.gd" +}, { +"base": "Control", +"class": "GECanvas", +"language": "GDScript", +"path": "res://addons/Godoxel/Canvas.gd" +}, { +"base": "GEAction", +"class": "GECut", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Cut.gd" +}, { +"base": "GEAction", +"class": "GEDarken", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Darken.gd" +}, { +"base": "Control", +"class": "GEDraggableWindow", +"language": "GDScript", +"path": "res://addons/Godoxel/dialogs/DraggableWindow.gd" +}, { +"base": "Control", +"class": "GEFrame", +"language": "GDScript", +"path": "res://addons/Godoxel/Frame.gd" +}, { +"base": "Reference", +"class": "GELayer", +"language": "GDScript", +"path": "res://addons/Godoxel/Layer.gd" +}, { +"base": "GEAction", +"class": "GELine", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Line.gd" +}, { +"base": "GEAction", +"class": "GEMultiLine", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/MultiLine.gd" +}, { +"base": "GEAction", +"class": "GEPasteCut", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/PasteCut.gd" +}, { +"base": "GEAction", +"class": "GEPencil", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Pencil.gd" +}, { +"base": "GEAction", +"class": "GERainbow", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Rainbow.gd" +}, { +"base": "GEAction", +"class": "GERect", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Rect.gd" +}, { +"base": "Node", +"class": "GEUtils", +"language": "GDScript", +"path": "res://addons/Godoxel/Util.gd" +}, { +"base": "Node", +"class": "TK_Arithmetic", +"language": "GDScript", +"path": "res://nodes/singletons/Arithmetic.gd" +}, { +"base": "Sprite", +"class": "TK_FittingSprite", +"language": "GDScript", +"path": "res://nodes/FittingSprite.gd" +}, { +"base": "Node2D", +"class": "TK_GridContext", +"language": "GDScript", +"path": "res://nodes/GridContext.gd" +}, { +"base": "Node", +"class": "TK_GridController", +"language": "GDScript", +"path": "res://nodes/GridController.gd" +} ] +_global_script_class_icons={ +"BrushPrefabs": "", +"GEAction": "", +"GEAnimation": "", +"GEBrighten": "", +"GEBrush": "", +"GEBucket": "", +"GECanvas": "", +"GECut": "", +"GEDarken": "", +"GEDraggableWindow": "", +"GEFrame": "", +"GELayer": "", +"GELine": "", +"GEMultiLine": "", +"GEPasteCut": "", +"GEPencil": "", +"GERainbow": "", +"GERect": "", +"GEUtils": "", +"TK_Arithmetic": "", +"TK_FittingSprite": "", +"TK_GridContext": "", +"TK_GridController": "" +} + +[application] + +config/name="TochieKit" +run/main_scene="res://scenes/Game.tscn" +config/icon="res://icon.png" + +[autoload] + +Arithmetic="*res://nodes/singletons/Arithmetic.gd" +InputUtils="*res://nodes/singletons/InputUtils.gd" + +[editor_plugins] + +enabled=PoolStringArray( "res://addons/Godoxel/plugin.cfg" ) + +[gui] + +common/drop_mouse_on_gui_input_disabled=true + +[input] + +move_up={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":87,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_right={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":68,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_down={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":83,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} +move_left={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":0,"physical_scancode":65,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"physical_scancode":0,"unicode":0,"echo":false,"script":null) + ] +} + +[physics] + +common/enable_pause_aware_picking=true + +[rendering] + +quality/driver/driver_name="GLES2" +2d/snapping/use_gpu_pixel_snap=true +vram_compression/import_etc=true +vram_compression/import_etc2=false +environment/default_clear_color=Color( 0.00784314, 0, 0.117647, 1 ) +environment/default_environment="res://default_env.tres" diff --git a/scenes/Game.tscn b/scenes/Game.tscn new file mode 100644 index 0000000..a2fd1a4 --- /dev/null +++ b/scenes/Game.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://nodes/FittingSprite.gd" type="Script" id=1] +[ext_resource path="res://art/entities/fiend.png" type="Texture" id=2] +[ext_resource path="res://nodes/GridController.gd" type="Script" id=3] +[ext_resource path="res://nodes/GridContext.tscn" type="PackedScene" id=4] + +[node name="Game" type="Node"] + +[node name="GridContext" parent="." instance=ExtResource( 4 )] + +[node name="Fiend" type="Sprite" parent="GridContext"] +position = Vector2( 128, 128 ) +scale = Vector2( 4, 4 ) +texture = ExtResource( 2 ) +centered = false +script = ExtResource( 1 ) +target_size = Vector2( 64, 64 ) + +[node name="GridController" type="Node" parent="GridContext/Fiend"] +script = ExtResource( 3 )