CANNOT DEPLOY CODE

Hello - I am the head programmer from the LF robotics team. I am trying to deploy some code that did work about a week ago - I added in some motors and was attempting to deploy the code again - no errors came up - I went to the driver station and everything was green and good-to-go - I enabled teleop and nothing happened - IP’s are good - subnet mask is correct for deploying and running code - firewall is disabled - netbeans team number is set - the image is good on the cRIO - I checked everything I could think of and the problem still occurs.

Does anyone happen to know what I could do to fix this issue?

THANKS!

Are there any messages on the Diagnostic tab of the Driver Station?

What is the Robot Signal Light doing? Describe its pattern of blinks.

Does the Dashboard show you what the joysticks are doing? Does it show what is being commanded to the drive motors?

Go back to the previous working program if possible, just to make sure it still works. That will help rule out a hardware problem and let you know to focus on your code changes.

**When the robot is first turned on(not connected to anything) it is a fast blink(200ms 200ms). When the driver station is initiated the blinking is correct for disabled, teleop, and autonoous.

When I try to deploy the old code it does the same thing.

Here is the deployment stuff for the new code:**

ant -f C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014 deploy run
clean:
Deleting directory C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build
Created dir: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build
Created dir: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\classes
[crio-compile] ./src, C:/Users/Developer/sunspotfrcsdk\lib\wpilibj.jar;C:/Users/Developer/sunspotfrcsdk\lib
etworktables-crio.jar, C:/Users/Developer/sunspotfrcsdk\lib\squawk.jar -> ./build/classes
Compiling 12 source files to C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\classes
compile:
preverify:
Created dir: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\preverify
Created dir: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\preverify.raw.util
[crio-preverify] ./build/classes, , C:/Users/Developer/sunspotfrcsdk\lib\wpilibj.jar;C:/Users/Developer/sunspotfrcsdk\lib
etworktables-crio.jar, C:/Users/Developer/sunspotfrcsdk\lib\squawk.jar -> ./build/preverify
Expanding: C:\Users\Developer\sunspotfrcsdk\lib\wpilibj.jar into C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\preverify
Expanding: C:\Users\Developer\sunspotfrcsdk\lib
etworktables-crio.jar into C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\preverify
jar:
[crio-jar] ./build/preverify, ./resources -> ./build/app.jar
Building jar: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\app.jar
suite:
Created dir: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\suite
[crio-suite] ./build/app.jar -> ./build/suite/image
CompilerOracle: exclude com/sun/squawk/Method.getParameterTypes
CompilerOracle: exclude com/sun/squawk/SymbolParser.getSignatureTypeAt
CompilerOracle: exclude com/sun/squawk/SymbolParser.stripMethods
[translating suite image [closed: false, parent: squawk] …]

Excluding compile: com.sun.squawk.Method::getParameterTypes

Excluding compile: com.sun.squawk.SymbolParser::getSignatureTypeAt

[Including resource: META-INF/MANIFEST.MF]
[Including resource: META-INF/maven/edu.wpi.first.wpilib.networktables.java/NetworkTablesAzalea/pom.properties]
[Including resource: META-INF/maven/edu.wpi.first.wpilib.networktables.java/NetworkTablesAzalea/pom.xml]
Romizer processed 399 classes and generated 4 files.
Expanding: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\app.jar into C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\build\suite
Deleting: C:\Users\Developer\Documents\NetBeansProjects\LFRobot2014\image.suite.api
deploy:
[crio-configure] Configuration files not included in this version of the sdk
[crio-configure] Checking that crio is configured for Java
Host OS: Windows 7 6.1, 6.1
Host JVM: Java HotSpot™ Client VM 24.51-b03
Target IP: 10.46.23.2
Network interfaces on host:
Realtek PCIe FE Family Controller: address: 10.46.23.5 netmask: 255.255.255.0 <— on robot’s subnet
Realtek RTL8192CE Wireless LAN 802.11n PCI-E NIC: address: 10.110.6.101 netmask: 255.255.255.254
Connecting FTP @10.46.23.2
[crio-deploy] ./build/suite/image.suite -> 10.46.23.2
Sending local file image.suite
run:
[cRIO] [OTA Server] ********* REBOOTING cRIO *********
[cRIO]
Waiting for cRIO to reboot (1s)
Waiting for cRIO to reboot (2s)
Waiting for cRIO to reboot (3s)
Waiting for cRIO to reboot (4s)
Waiting for cRIO to reboot (5s)
Waiting for cRIO to reboot (6s)
Waiting for cRIO to reboot (7s)
Waiting for cRIO to reboot (8s)
Waiting for cRIO to reboot (9s)
Waiting for cRIO to reboot (10s)
Waiting for cRIO to reboot (11s)
Waiting for cRIO to reboot (12s)
[cRIO]
[cRIO] -> * Loading debug.o: debug
[cRIO] Debugging is up, target server mounted at /tsfs
[cRIO]
[cRIO]
[cRIO] VxWorks
[cRIO]
[cRIO] Copyright 1984-2006 Wind River Systems, Inc.
[cRIO]
[cRIO] CPU: cRIO-FRC II
[cRIO] Runtime Name: VxWorks
[cRIO] Runtime Version: 6.3
[cRIO] BSP version: 1.0/0
[cRIO] Created: May 23 2013, 16:00:09
[cRIO] ED&R Policy Mode: Deployed
[cRIO] WDB Comm Type: WDB_COMM_END
[cRIO] WDB: Ready.
[cRIO]
[cRIO] * Loading nisysrpc.out: nisysrpc
[cRIO] * Loading NiRioRpc.out: NiRioRpc
[cRIO] * Loading nivissvc.out: nivissvc
[cRIO] task 0x18bc2c0 (VISA Jungo Init Thread) deleted: errno=196709 (0x30065) status=-1073807360 (0xbfff0000)
[cRIO] * Loading nivision.out: nivision
[cRIO] task 0x1898840 (Service Locator Thread 5) deleted: errno=0 (0) status=0 (0)
[cRIO] NI-RIO Server 13.0 started successfully.
[cRIO] task 0x17668b8 (NiRioRpc) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x19172c0 (Service Locator Thread 6) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x19172c0 (Service Locator Thread 7) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x19172c0 (Service Locator Thread 8) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x165d258 (nisysapi-mDns) deleted: errno=0 (0) status=0 (0)
[cRIO] * Loading visa32.out: visa32
[cRIO] * Loading niserial.out: niserial
[cRIO] * Loading NiFpgaLv.out: NiFpgaLv
[cRIO] * Loading FRC_FPGA_ChipObject.out: FRC_FPGA_ChipObject
[cRIO] * Loading FRC_NetworkCommunication.out: FRC_NetworkCommunication
[cRIO] FRC_NetworkCommunication version: p4-1.4.0a18
[cRIO] FPGA Hardware GUID: 0x1394F6DC1FEB42EC6910E5767ED1D22C
[cRIO] FPGA Software GUID: 0x1394F6DC1FEB42EC6910E5767ED1D22C
[cRIO] FPGA Hardware Version: 2012
[cRIO] FPGA Software Version: 2012
[cRIO] FPGA Hardware Revision: 1.6.4
[cRIO] FPGA Software Revision: 1.6.4
[cRIO] * Loading FRC_JavaVM.out: FRC_JavaVM
[cRIO]
[cRIO]
[cRIO] [OTA Server] Version: 2012 FRC, Jan 5 2012, 17:20:48
[cRIO]
[cRIO]
[cRIO] Welcome to LabVIEW Real-Time 13.0
[cRIO] task 0x187c300 (sysapi-rpc) deleted: errno=0 (0) status=0 (0)
[cRIO]
[cRIO] [Squawk VM] Version: 2011 FRC, Nov 5 2011, 14:34:13
[cRIO] FPGA Hardware GUID: 0x1394f6dc1feb42ec6910e5767ed1d22c
[cRIO] FPGA Software GUID: 0xa14c11bde4bb64aef6a86fc52a294cd9
[cRIO] java.lang.NullPointerException
[cRIO] at edu.wpi.first.wpilibj.buttons.JoystickButton.get(JoystickButton.java:36)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.grab(Trigger.java:45)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.access$000(Trigger.java:29)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger$1.<init>(Trigger.java:55)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.whenActive(Trigger.java:53)
[cRIO] at edu.wpi.first.wpilibj.buttons.Button.whenPressed(Button.java:32)
[cRIO] at edu.wpi.first.LFRobot2014.OI.<init>(OI.java:64)
[cRIO] at edu.wpi.first.LFRobot2014.commands.CommandBase.init(CommandBase.java:30)
[cRIO] at edu.wpi.first.LFRobot2014.LFRobot.robotInit(LFRobot.java:38)
[cRIO] at edu.wpi.first.wpilibj.IterativeRobot.startCompetition(IterativeRobot.java:72)
[cRIO] at edu.wpi.first.wpilibj.RobotBase.startApp(RobotBase.java:235)
[cRIO] in virtual method #10 of javax.microedition.midlet.MIDlet(bci=17)
[cRIO] at javax.microedition.midlet.MIDletTunnelImpl.callStartApp(64)
[cRIO] at com.sun.squawk.imp.MIDletMainWrapper.main(110)
[cRIO] in virtual method #95 of com.sun.squawk.Klass(bci=25)
[cRIO] at com.sun.squawk.Isolate.run(1506)
[cRIO] at java.lang.Thread.run(231)
[cRIO] in virtual method #47 of com.sun.squawk.VMThread(bci=42)
[cRIO] in static method #3 of com.sun.squawk.VM(bci=6)
[cRIO] WARNING: Robots don’t quit!
[cRIO] —> The startCompetition() method (or methods called by it) should have handled the exception above.
[cRIO] task 0xca7f88 (worker.0) deleted: errno=0 (0) status=0 (0)

For the old code:

ant -f C:\Users\Developer\Documents\NetBeansProjects\Robotics deploy run
clean:
Deleting directory C:\Users\Developer\Documents\NetBeansProjects\Robotics\build
Created dir: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build
Created dir: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\classes
[crio-compile] ./src, C:/Users/Developer/sunspotfrcsdk\lib\wpilibj.jar;C:/Users/Developer/sunspotfrcsdk\lib
etworktables-crio.jar, C:/Users/Developer/sunspotfrcsdk\lib\squawk.jar -> ./build/classes
Compiling 6 source files to C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\classes
compile:
preverify:
Created dir: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\preverify
Created dir: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\preverify.raw.util
[crio-preverify] ./build/classes, , C:/Users/Developer/sunspotfrcsdk\lib\wpilibj.jar;C:/Users/Developer/sunspotfrcsdk\lib
etworktables-crio.jar, C:/Users/Developer/sunspotfrcsdk\lib\squawk.jar -> ./build/preverify
Expanding: C:\Users\Developer\sunspotfrcsdk\lib\wpilibj.jar into C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\preverify
Expanding: C:\Users\Developer\sunspotfrcsdk\lib
etworktables-crio.jar into C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\preverify
jar:
[crio-jar] ./build/preverify, ./resources -> ./build/app.jar
Building jar: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\app.jar
suite:
Created dir: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\suite
[crio-suite] ./build/app.jar -> ./build/suite/image
CompilerOracle: exclude com/sun/squawk/Method.getParameterTypes
CompilerOracle: exclude com/sun/squawk/SymbolParser.getSignatureTypeAt
CompilerOracle: exclude com/sun/squawk/SymbolParser.stripMethods
[translating suite image [closed: false, parent: squawk] …]

Excluding compile: com.sun.squawk.Method::getParameterTypes

Excluding compile: com.sun.squawk.SymbolParser::getSignatureTypeAt

[Including resource: META-INF/MANIFEST.MF]
[Including resource: META-INF/maven/edu.wpi.first.wpilib.networktables.java/NetworkTablesAzalea/pom.properties]
[Including resource: META-INF/maven/edu.wpi.first.wpilib.networktables.java/NetworkTablesAzalea/pom.xml]
Romizer processed 393 classes and generated 4 files.
Expanding: C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\app.jar into C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\suite
Moving 1 file to C:\Users\Developer\Documents\NetBeansProjects\Robotics\build\suite
Deleting: C:\Users\Developer\Documents\NetBeansProjects\Robotics\image.suite.api
deploy:
[crio-configure] Configuration files not included in this version of the sdk
[crio-configure] Checking that crio is configured for Java
Host OS: Windows 7 6.1, 6.1
Host JVM: Java HotSpot™ Client VM 24.51-b03
Target IP: 10.46.23.2
Network interfaces on host:
Realtek PCIe FE Family Controller: address: 10.46.23.5 netmask: 255.255.255.0 <— on robot’s subnet
Realtek RTL8192CE Wireless LAN 802.11n PCI-E NIC: address: 10.110.6.101 netmask: 255.255.255.254
Connecting FTP @10.46.23.2
[crio-deploy] ./build/suite/image.suite -> 10.46.23.2
Sending local file image.suite
run:
[cRIO] [OTA Server] ********* REBOOTING cRIO *********
[cRIO]
Waiting for cRIO to reboot (1s)
Waiting for cRIO to reboot (2s)
Waiting for cRIO to reboot (3s)
Waiting for cRIO to reboot (4s)
Waiting for cRIO to reboot (5s)
Waiting for cRIO to reboot (6s)
Waiting for cRIO to reboot (7s)
Waiting for cRIO to reboot (8s)
Waiting for cRIO to reboot (9s)
Waiting for cRIO to reboot (10s)
Waiting for cRIO to reboot (11s)
Waiting for cRIO to reboot (12s)
[cRIO]
[cRIO] -> * Loading debug.o: debug
[cRIO] Debugging is up, target server mounted at /tsfs
[cRIO]
[cRIO]
[cRIO] VxWorks
[cRIO]
[cRIO] Copyright 1984-2006 Wind River Systems, Inc.
[cRIO]
[cRIO] CPU: cRIO-FRC II
[cRIO] Runtime Name: VxWorks
[cRIO] Runtime Version: 6.3
[cRIO] BSP version: 1.0/0
[cRIO] Created: May 23 2013, 16:00:09
[cRIO] ED&R Policy Mode: Deployed
[cRIO] WDB Comm Type: WDB_COMM_END
[cRIO] WDB: Ready.
[cRIO]
[cRIO] * Loading nisysrpc.out: nisysrpc
[cRIO] * Loading NiRioRpc.out: NiRioRpc
[cRIO] task 0x18ac0d0 (VISA Jungo Init Thread) deleted: errno=196709 (0x30065) status=-1073807360 (0xbfff0000)
[cRIO] * Loading nivissvc.out: nivissvc
[cRIO] * Loading nivision.out: nivision
[cRIO] task 0x190fb90 (Service Locator Thread 5) deleted: errno=0 (0) status=0 (0)
[cRIO] NI-RIO Server 13.0 started successfully.
[cRIO] task 0x1795380 (NiRioRpc) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x1a1ece0 (Service Locator Thread 6) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x1a1ece0 (Service Locator Thread 7) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x1a1ece0 (Service Locator Thread 8) deleted: errno=0 (0) status=0 (0)
[cRIO] task 0x1665450 (nisysapi-mDns) deleted: errno=0 (0) status=0 (0)
[cRIO] * Loading visa32.out: visa32
[cRIO] * Loading niserial.out: niserial
[cRIO] * Loading NiFpgaLv.out: NiFpgaLv
[cRIO] * Loading FRC_FPGA_ChipObject.out: FRC_FPGA_ChipObject
[cRIO] * Loading FRC_NetworkCommunication.out: FRC_NetworkCommunication
[cRIO] FRC_NetworkCommunication version: p4-1.4.0a18
[cRIO] FPGA Hardware GUID: 0x1394F6DC1FEB42EC6910E5767ED1D22C
[cRIO] FPGA Software GUID: 0x1394F6DC1FEB42EC6910E5767ED1D22C
[cRIO] FPGA Hardware Version: 2012
[cRIO] FPGA Software Version: 2012
[cRIO] FPGA Hardware Revision: 1.6.4
[cRIO] FPGA Software Revision: 1.6.4
[cRIO] * Loading FRC_JavaVM.out: FRC_JavaVM
[cRIO]
[cRIO]
[cRIO] [OTA Server] Version: 2012 FRC, Jan 5 2012, 17:20:48
[cRIO]
[cRIO]
[cRIO] Welcome to LabVIEW Real-Time 13.0
[cRIO] task 0x18844f8 (sysapi-rpc) deleted: errno=0 (0) status=0 (0)
[cRIO]
[cRIO] [Squawk VM] Version: 2011 FRC, Nov 5 2011, 14:34:13
[cRIO] FPGA Hardware GUID: 0x1394f6dc1feb42ec6910e5767ed1d22c
[cRIO] FPGA Software GUID: 0xa14c11bde4bb64aef6a86fc52a294cd9
[cRIO] Default IterativeRobot.disabledInit() method… Overload me!
[cRIO] task 0xca7f88 (worker.0) deleted: errno=0 (0) status=0 (0)

**There is stuff in the diagnostics tab.

It does not show anything for the joysticks or drive motors.

I think it is the driver station.

ALSO - the lights on both the Jaguar and VEX speed controllers are all weird. On both - nomatter what I do - one always shows that it is in FULL FORWARD and one always shows that it has been SUCCESSFULLY CALIBRATED. I have no idea if that means anything - thought I would just put it out there.

THANKS!**

Hi LFRobotics,
The key here is the java.lang.NullPointerException that the program prints out in your new code. What the NullPointerException means is that you’re using a variable that hasn’t been initialized yet or if you’re trying to get something that doesn’t exist. In this case, a button seems to be the issue. Looking back through the stack trace of the error, it seems to occur at edu.wpi.first.LFRobot2014.OI.<init>(OI.java:64). I would look through your OI file and check line 64. That is the line where it runs into an error. You’ll notice that the NullPointerException segment of the output doesn’t occur in your “Old code” as well so something that was changed on that line isn’t quite working properly.

I can’t speak directly to what the issue is since I’ve only used Joystick.getRawButton() rather than Button.whenPressed(), but I think it’s likely that your Button hasn’t been initialized properly.

Ian

I checked the code over and everything looks fine. What else could it be?

THANKS!

It’s not fine, since it’s clearly throwing exceptions. This is the relevant part of the stack trace:

[cRIO] java.lang.NullPointerException
[cRIO] at edu.wpi.first.wpilibj.buttons.JoystickButton.get(JoystickButton.java:36)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.grab(Trigger.java:45)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.access$000(Trigger.java:29)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger$1.<init>(Trigger.java:55)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.whenActive(Trigger.java:53)
[cRIO] at edu.wpi.first.wpilibj.buttons.Button.whenPressed(Button.java:32)
[cRIO] at edu.wpi.first.LFRobot2014.OI.<init>(OI.java:64)
[cRIO] at edu.wpi.first.LFRobot2014.commands.CommandBase.init(CommandBase.java:30)
[cRIO] at edu.wpi.first.LFRobot2014.LFRobot.robotInit(LFRobot.java:38)

So look in LFRobot.java at line 38. There will be a reference to some variable. A null pointer exception is most often thrown when you try to access an object that you haven’t instantiated yet (it’ll throw an error because you’re trying to act on null, or nothing). Make sure your variables are created properly.

Also, what does the stuff in the Diagnostics tab say? It often provides very useful debugging info

Line 38 is a comment put in the code as default - underneath the comment is

CommandBase.init();
SmartDashboard.putData(Scheduler.getInstance());

Both were put in as default. I will hopefully be able to get the stuff in the diagnostics tab tomorrow - we did not have school today due to cold weather.

THANKS!

Then keep going up the stack trace. See how the next item is in CommandBase.java line 30. Then after that, OI.java line 64 (I stand corrected, Ian above me got the right file first).

[cRIO] java.lang.NullPointerException
[cRIO] at edu.wpi.first.wpilibj.buttons.JoystickButton.get(JoystickButton.java:36)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.grab(Trigger.java:45)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.access$000(Trigger.java:29)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger$1.<init>(Trigger.java:55)
[cRIO] at edu.wpi.first.wpilibj.buttons.Trigger.whenActive(Trigger.java:53)
[cRIO] at edu.wpi.first.wpilibj.buttons.Button.whenPressed(Button.java:32)
[cRIO] at edu.wpi.first.LFRobot2014.OI.<init>(OI.java:64)
[cRIO] at edu.wpi.first.LFRobot2014.commands.CommandBase.init(CommandBase.java:30)
[cRIO] at edu.wpi.first.LFRobot2014.LFRobot.robotInit(LFRobot.java:38)

But anyway, the stack trace you see tells you where the exception occurred and the chain of current method calls. Read some more about them. So in your example, the exception was encountered in JoystickButton.java line 36 (the top element in the trace), which was being called from Trigger.java line 45, which was called from the same file, line 59, etc. You follow the trace down until you find the first one of your files (in this case, OI.java) and check the line given.

Okay - so I looked through all of my code and could not find anything wrong with it. But I know that something is wrong with it sooo…

Could you perhaps look over it for me and maybe you might be able to see the error?

Here is a link to it(I am currently using dropbox because I have not yet set Git up):

Here is a link to the most recent deploy output:

THANKS SOOOOOO MUCH!

From OI:

        ForksDown = new JoystickButton(rightStick, 5);
        ForksUp = new JoystickButton(rightStick, 4);
        Auto = new JoystickButton(leftStick, 4);
        rightStick = new Joystick(RobotMap.rightJoystickPort);
        leftStick = new Joystick(RobotMap.leftJoystickPort);

You are using rightStick and leftStick before you are creating the objects.

Okay - that fixed it - THANKS!