Bug with AdMob prevents ALL ads from loading then crashes my game

I am using AdMob and Chartboost together in my game. I have noticed that sometimes there is a random bug where AdMob will fail to load an ad. When I fall back to Chartboost to try and load an ad, my game freezes and shows a popup saying that the app has become unresponsive.

This is the message I get in the AdMob listener

admob listener 02-06 17:06:04.970 31527 31567 I Corona  :     type = interstitial 02-06 17:06:04.970 31527 31567 I Corona  :     name = adsRequest 02-06 17:06:04.970 31527 31567 I Corona  :     provider = AdMobProvider 02-06 17:06:04.970 31527 31567 I Corona  :     phase = loaded 02-06 17:06:04.970 31527 31567 I Corona  :     isError = true 02-06 17:06:04.970 31527 31567 I Corona  :     response = Something happened internally in the AdmobSDK; for instance, an invalid response was received from the ad server.

When I fall back to Chartboost, I do a check first to see if it has anything cached with

chartboost.hasCachedInterstitial

And that’s where it hangs. This seems to happen randomly and I don’t know how to reproduce it. Once it happens the problem will persist even after restarting or reinstalling the app. The only remedy is to reboot my phone (which is not a good remedy).

Has anyone else experienced this?

Edit: This is happening on Android, haven’t tested on iOS.

Do you see any other messages in the log?  Run “adb logcat” to get all log messages (instead of just filtering for Corona messages).

  • Andrew

Hi Vince_,

How are you including the AdMob plugin in the build.settings?

@Andrew, I’m wading through the output right now to find the relevant messages. I can’t believe how much output the phone generates!!

@Brent, here is the relevant portion of my build.settings

plugins = { ["plugin.google.iap.v3"] = { publisherId = "com.coronalabs", supportedPlatforms = { android=true } }, ["CoronaProvider.analytics.flurry"] = { publisherId = "com.coronalabs" }, ["plugin.chartboost"] = { -- required publisherId = "com.swipeware", }, ["plugin.google.play.services"] = { publisherId = "com.coronalabs" }, },

Ok, there was a ton of stuff to go through but I think I got the relevant bits. As I said before, I haven’t figured out a cause yet, but I *think* it might have something to do with resuming the app for a while after it had been suspended (like for more than 10 minutes).

Here is where I first request a banner ad:

02-06 17:52:17.040 32422 32436 I Corona : admob about to show Bottom Banner 02-06 17:52:17.040 32422 32436 I Corona : admob showing Bottom Banner 02-06 17:52:17.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 02-06 17:52:17.410 32422 32498 I dalvikvm: Could not find method android.webkit.WebSettings.getDefaultUserAgent, referenced from method com.google.android.gms.ads.internal.util.g.a 02-06 17:52:17.410 32422 32498 W dalvikvm: VFY: unable to resolve static method 3091: Landroid/webkit/WebSettings;.getDefaultUserAgent (Landroid/content/Context;)Ljava/lang/String; 02-06 17:52:17.410 32422 32498 D dalvikvm: VFY: replacing opcode 0x71 at 0x0011 02-06 17:52:17.470 32422 32498 D dalvikvm: DexOpt: --- BEGIN 'ads1218129310.jar' (bootstrap=0) --- 02-06 17:52:17.540 32422 32422 I Ads : Starting ad request. 02-06 17:52:17.580 32422 32422 I Ads : Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad. 02-06 17:52:17.610 32422 32501 D Document: (0x5a2bdc90) new DOM. alive DOM obj: 1 02-06 17:52:17.750 32500 32500 D dalvikvm: DexOpt: load 7ms, verify+opt 23ms, 164116 bytes 02-06 17:52:17.810 32422 32498 D dalvikvm: DexOpt: --- END 'ads1218129310.jar' (success) --- 02-06 17:52:17.810 32422 32498 D dalvikvm: DEX prep '/data/data/com.bezelbot.vincegame/cache/ads1218129310.jar': unzip in 0ms, rewrite 344ms 02-06 17:52:17.890 388 5631 I ActivityManager: Process com.google.android.apps.magazines (pid 31509) has died. ----------------------------------------------------- -- -- Some time later the request for a banner ad fails -- ----------------------------------------------------- 02-06 17:52:29.820 32422 32507 W Ads : There was a problem getting an ad response. ErrorCode: 0 02-06 17:52:29.840 32422 32422 I dalvikvm: Could not find method android.webkit.WebSettings.setMediaPlaybackRequiresUserGesture, referenced from method com.google.android.gms.ads.internal.o.a.\<init\> 02-06 17:52:29.840 32422 32422 W dalvikvm: VFY: unable to resolve virtual method 3104: Landroid/webkit/WebSettings;.setMediaPlaybackRequiresUserGesture (Z)V 02-06 17:52:29.840 32422 32422 D dalvikvm: VFY: replacing opcode 0x6e at 0x004b 02-06 17:52:29.850 32422 32422 I dalvikvm: Could not find method android.webkit.WebView.evaluateJavascript, referenced from method com.google.android.gms.ads.internal.o.a.evaluateJavascript 02-06 17:52:29.850 32422 32422 W dalvikvm: VFY: unable to resolve virtual method 3114: Landroid/webkit/WebView;.evaluateJavascript (Ljava/lang/String;Landroid/webkit/ValueCallback;)V 02-06 17:52:29.850 32422 32422 D dalvikvm: VFY: replacing opcode 0x6f at 0x0016 02-06 17:52:29.950 32422 32422 W Ads : Failed to load ad: 0 02-06 17:52:29.980 32422 32436 I Corona : admob listener 02-06 17:52:29.980 32422 32436 I Corona : type = banner 02-06 17:52:29.980 32422 32436 I Corona : name = adsRequest 02-06 17:52:29.980 32422 32436 I Corona : provider = AdMobProvider 02-06 17:52:29.980 32422 32436 I Corona : phase = loaded 02-06 17:52:29.980 32422 32436 I Corona : isError = true 02-06 17:52:29.980 32422 32436 I Corona : response = Something happened internally in the AdmobSDK; for instance, an invalid response was received from the ad server.

Later, I start my level and try to load an interstitial for when the level is complete:

02-06 17:52:41.040 32422 32436 I Corona : admob load 02-06 17:52:41.050 32422 32436 I Corona : admob loading new Level Complete 02-06 17:52:41.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 02-06 17:52:41.090 32422 32422 I Ads : Starting ad request. 02-06 17:52:41.110 32422 32422 I Ads : Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad. 02-06 17:52:51.170 32422 32526 W Ads : There was a problem getting an ad response. ErrorCode: 0 02-06 17:52:51.180 32422 32501 D Document: (0x55a9e0d0) new DOM. alive DOM obj: 3 02-06 17:52:51.190 32422 32422 W Ads : Failed to load ad: 0 02-06 17:52:51.190 32422 32436 I Corona : admob listener 02-06 17:52:51.190 32422 32436 I Corona : type = interstitial 02-06 17:52:51.190 32422 32436 I Corona : name = adsRequest 02-06 17:52:51.190 32422 32436 I Corona : provider = AdMobProvider 02-06 17:52:51.190 32422 32436 I Corona : phase = loaded 02-06 17:52:51.190 32422 32436 I Corona : isError = true 02-06 17:52:51.190 32422 32436 I Corona : response = Something happened internally in the AdmobSDK; for instance, an invalid response was received from the ad server. 02-06 17:52:51.190 32422 32436 I Corona : ad load error 02-06 17:52:51.190 32422 32436 I Corona : admob hide Level Complete 02-06 17:52:51.190 32422 32436 I Corona : no ad found for admob defaulting to chartboost 02-06 17:52:51.190 32422 32436 I Corona : chartboost checking if loaded interstitial, Level Complete

Finally, Android kills my game because it has become unresponsive. I did not see any output that suggests what exactly it got hung up on:

02-06 17:53:10.680 388 437 I InputDispatcher: Application is not responding: Window{213b8fb8 com.bezelbot.vincegame/com.ansca.corona.CoronaActivity paused=false}. It has been 5002.3ms since event, 5001.9ms since wait started. Reason: Waiting because the touched window has not finished processing the input events that were previously delivered to it. 02-06 17:53:10.680 388 437 I WindowManager: Input event dispatching timed out sending to com.bezelbot.vincegame/com.ansca.corona.CoronaActivity 02-06 17:53:12.370 388 437 E ActivityManager: ANR in com.bezelbot.vincegame (com.bezelbot.vincegame/com.ansca.corona.CoronaActivity) 02-06 17:53:12.370 388 437 E ActivityManager: Reason: keyDispatchingTimedOut 02-06 17:53:12.370 388 437 E ActivityManager: Load: 0.99 / 0.75 / 0.63 02-06 17:53:12.370 388 437 E ActivityManager: CPU usage from 5800ms to 0ms ago: 02-06 17:53:12.370 388 437 E ActivityManager: 26% 32422/com.bezelbot.vincegame: 24% user + 1.2% kernel / faults: 1 minor 02-06 17:53:12.370 388 437 E ActivityManager: 5.3% 388/system\_server: 3.4% user + 1.8% kernel / faults: 20 minor 4 major 02-06 17:53:12.370 388 437 E ActivityManager: 1.2% 157/mediaserver: 0.5% user + 0.6% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.5% 518/com.android.systemui: 0.5% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.5% 32068/kworker/0:2: 0% user + 0.5% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.3% 713/com.motorola.motocare: 0.3% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0% 58/irq/318-atmxt-i: 0% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.1% 63/mmcqd/0: 0% user + 0.1% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0% 159/rild: 0% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.1% 31690/com.textra: 0.1% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 19% TOTAL: 14% user + 2% kernel + 1.2% iowait + 1.3% irq + 0% softirq 02-06 17:53:12.370 388 437 E ActivityManager: CPU usage from 941ms to 1461ms later: 02-06 17:53:12.370 388 437 E ActivityManager: 18% 32422/com.bezelbot.vincegame: 18% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 16% 32457/OpenAL/sl/m: 16% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.8% 32458/Thread-1677: 1.8% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 9.4% 388/system\_server: 7.5% user + 1.8% kernel / faults: 2 minor 1 major 02-06 17:53:12.370 388 437 E ActivityManager: 5.6% 437/InputDispatcher: 3.7% user + 1.8% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.8% 401/EventThread: 0% user + 1.8% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.2% 157/mediaserver: 0% user + 1.2% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.4% 25063/com.google.android.googlequicksearchbox:search: 1.4% user + 0% kernel / faults: 9 minor 02-06 17:53:12.370 388 437 E ActivityManager: 12% TOTAL: 9.6% user + 0.9% kernel + 1.9% irq

EDIT: I want to mention that this message gets displayed even when AdMob is working correctly:

02-06 17:52:41.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.

It would be interesting to see if this is truly related to ChartBoost, or if it’s just an AdMob issue and the fact that you fallback to ChartBoost is an unrelated red herring.

Out of curiosity, how do you know that it’s the line call to chartboost.hasCachedInterstitial that causes the hang?  Do you have debug output immediately before and after that line?  Is it possible that the real hang is actually caused by some code after that line?

Although you mentioned that you can’t reproduce the problem consistently, I’d suggest trying to create a new, minimal project that exhibits it, starting with just AdMob (no ChartBoost).

Separately, is there any chance that the hang is caused by something in your own code?  Perhaps an accidental infinite loop in your fallback logic?  (I doubt this is the reason, but I have to ask!)

  • Andrew

Do you see any other messages in the log?  Run “adb logcat” to get all log messages (instead of just filtering for Corona messages).

  • Andrew

Hi Vince_,

How are you including the AdMob plugin in the build.settings?

@Andrew, I’m wading through the output right now to find the relevant messages. I can’t believe how much output the phone generates!!

@Brent, here is the relevant portion of my build.settings

plugins = { ["plugin.google.iap.v3"] = { publisherId = "com.coronalabs", supportedPlatforms = { android=true } }, ["CoronaProvider.analytics.flurry"] = { publisherId = "com.coronalabs" }, ["plugin.chartboost"] = { -- required publisherId = "com.swipeware", }, ["plugin.google.play.services"] = { publisherId = "com.coronalabs" }, },

Ok, there was a ton of stuff to go through but I think I got the relevant bits. As I said before, I haven’t figured out a cause yet, but I *think* it might have something to do with resuming the app for a while after it had been suspended (like for more than 10 minutes).

Here is where I first request a banner ad:

02-06 17:52:17.040 32422 32436 I Corona : admob about to show Bottom Banner 02-06 17:52:17.040 32422 32436 I Corona : admob showing Bottom Banner 02-06 17:52:17.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 02-06 17:52:17.410 32422 32498 I dalvikvm: Could not find method android.webkit.WebSettings.getDefaultUserAgent, referenced from method com.google.android.gms.ads.internal.util.g.a 02-06 17:52:17.410 32422 32498 W dalvikvm: VFY: unable to resolve static method 3091: Landroid/webkit/WebSettings;.getDefaultUserAgent (Landroid/content/Context;)Ljava/lang/String; 02-06 17:52:17.410 32422 32498 D dalvikvm: VFY: replacing opcode 0x71 at 0x0011 02-06 17:52:17.470 32422 32498 D dalvikvm: DexOpt: --- BEGIN 'ads1218129310.jar' (bootstrap=0) --- 02-06 17:52:17.540 32422 32422 I Ads : Starting ad request. 02-06 17:52:17.580 32422 32422 I Ads : Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad. 02-06 17:52:17.610 32422 32501 D Document: (0x5a2bdc90) new DOM. alive DOM obj: 1 02-06 17:52:17.750 32500 32500 D dalvikvm: DexOpt: load 7ms, verify+opt 23ms, 164116 bytes 02-06 17:52:17.810 32422 32498 D dalvikvm: DexOpt: --- END 'ads1218129310.jar' (success) --- 02-06 17:52:17.810 32422 32498 D dalvikvm: DEX prep '/data/data/com.bezelbot.vincegame/cache/ads1218129310.jar': unzip in 0ms, rewrite 344ms 02-06 17:52:17.890 388 5631 I ActivityManager: Process com.google.android.apps.magazines (pid 31509) has died. ----------------------------------------------------- -- -- Some time later the request for a banner ad fails -- ----------------------------------------------------- 02-06 17:52:29.820 32422 32507 W Ads : There was a problem getting an ad response. ErrorCode: 0 02-06 17:52:29.840 32422 32422 I dalvikvm: Could not find method android.webkit.WebSettings.setMediaPlaybackRequiresUserGesture, referenced from method com.google.android.gms.ads.internal.o.a.\<init\> 02-06 17:52:29.840 32422 32422 W dalvikvm: VFY: unable to resolve virtual method 3104: Landroid/webkit/WebSettings;.setMediaPlaybackRequiresUserGesture (Z)V 02-06 17:52:29.840 32422 32422 D dalvikvm: VFY: replacing opcode 0x6e at 0x004b 02-06 17:52:29.850 32422 32422 I dalvikvm: Could not find method android.webkit.WebView.evaluateJavascript, referenced from method com.google.android.gms.ads.internal.o.a.evaluateJavascript 02-06 17:52:29.850 32422 32422 W dalvikvm: VFY: unable to resolve virtual method 3114: Landroid/webkit/WebView;.evaluateJavascript (Ljava/lang/String;Landroid/webkit/ValueCallback;)V 02-06 17:52:29.850 32422 32422 D dalvikvm: VFY: replacing opcode 0x6f at 0x0016 02-06 17:52:29.950 32422 32422 W Ads : Failed to load ad: 0 02-06 17:52:29.980 32422 32436 I Corona : admob listener 02-06 17:52:29.980 32422 32436 I Corona : type = banner 02-06 17:52:29.980 32422 32436 I Corona : name = adsRequest 02-06 17:52:29.980 32422 32436 I Corona : provider = AdMobProvider 02-06 17:52:29.980 32422 32436 I Corona : phase = loaded 02-06 17:52:29.980 32422 32436 I Corona : isError = true 02-06 17:52:29.980 32422 32436 I Corona : response = Something happened internally in the AdmobSDK; for instance, an invalid response was received from the ad server.

Later, I start my level and try to load an interstitial for when the level is complete:

02-06 17:52:41.040 32422 32436 I Corona : admob load 02-06 17:52:41.050 32422 32436 I Corona : admob loading new Level Complete 02-06 17:52:41.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 02-06 17:52:41.090 32422 32422 I Ads : Starting ad request. 02-06 17:52:41.110 32422 32422 I Ads : Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad. 02-06 17:52:51.170 32422 32526 W Ads : There was a problem getting an ad response. ErrorCode: 0 02-06 17:52:51.180 32422 32501 D Document: (0x55a9e0d0) new DOM. alive DOM obj: 3 02-06 17:52:51.190 32422 32422 W Ads : Failed to load ad: 0 02-06 17:52:51.190 32422 32436 I Corona : admob listener 02-06 17:52:51.190 32422 32436 I Corona : type = interstitial 02-06 17:52:51.190 32422 32436 I Corona : name = adsRequest 02-06 17:52:51.190 32422 32436 I Corona : provider = AdMobProvider 02-06 17:52:51.190 32422 32436 I Corona : phase = loaded 02-06 17:52:51.190 32422 32436 I Corona : isError = true 02-06 17:52:51.190 32422 32436 I Corona : response = Something happened internally in the AdmobSDK; for instance, an invalid response was received from the ad server. 02-06 17:52:51.190 32422 32436 I Corona : ad load error 02-06 17:52:51.190 32422 32436 I Corona : admob hide Level Complete 02-06 17:52:51.190 32422 32436 I Corona : no ad found for admob defaulting to chartboost 02-06 17:52:51.190 32422 32436 I Corona : chartboost checking if loaded interstitial, Level Complete

Finally, Android kills my game because it has become unresponsive. I did not see any output that suggests what exactly it got hung up on:

02-06 17:53:10.680 388 437 I InputDispatcher: Application is not responding: Window{213b8fb8 com.bezelbot.vincegame/com.ansca.corona.CoronaActivity paused=false}. It has been 5002.3ms since event, 5001.9ms since wait started. Reason: Waiting because the touched window has not finished processing the input events that were previously delivered to it. 02-06 17:53:10.680 388 437 I WindowManager: Input event dispatching timed out sending to com.bezelbot.vincegame/com.ansca.corona.CoronaActivity 02-06 17:53:12.370 388 437 E ActivityManager: ANR in com.bezelbot.vincegame (com.bezelbot.vincegame/com.ansca.corona.CoronaActivity) 02-06 17:53:12.370 388 437 E ActivityManager: Reason: keyDispatchingTimedOut 02-06 17:53:12.370 388 437 E ActivityManager: Load: 0.99 / 0.75 / 0.63 02-06 17:53:12.370 388 437 E ActivityManager: CPU usage from 5800ms to 0ms ago: 02-06 17:53:12.370 388 437 E ActivityManager: 26% 32422/com.bezelbot.vincegame: 24% user + 1.2% kernel / faults: 1 minor 02-06 17:53:12.370 388 437 E ActivityManager: 5.3% 388/system\_server: 3.4% user + 1.8% kernel / faults: 20 minor 4 major 02-06 17:53:12.370 388 437 E ActivityManager: 1.2% 157/mediaserver: 0.5% user + 0.6% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.5% 518/com.android.systemui: 0.5% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.5% 32068/kworker/0:2: 0% user + 0.5% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.3% 713/com.motorola.motocare: 0.3% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0% 58/irq/318-atmxt-i: 0% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.1% 63/mmcqd/0: 0% user + 0.1% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0% 159/rild: 0% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 0.1% 31690/com.textra: 0.1% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 19% TOTAL: 14% user + 2% kernel + 1.2% iowait + 1.3% irq + 0% softirq 02-06 17:53:12.370 388 437 E ActivityManager: CPU usage from 941ms to 1461ms later: 02-06 17:53:12.370 388 437 E ActivityManager: 18% 32422/com.bezelbot.vincegame: 18% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 16% 32457/OpenAL/sl/m: 16% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.8% 32458/Thread-1677: 1.8% user + 0% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 9.4% 388/system\_server: 7.5% user + 1.8% kernel / faults: 2 minor 1 major 02-06 17:53:12.370 388 437 E ActivityManager: 5.6% 437/InputDispatcher: 3.7% user + 1.8% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.8% 401/EventThread: 0% user + 1.8% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.2% 157/mediaserver: 0% user + 1.2% kernel 02-06 17:53:12.370 388 437 E ActivityManager: 1.4% 25063/com.google.android.googlequicksearchbox:search: 1.4% user + 0% kernel / faults: 9 minor 02-06 17:53:12.370 388 437 E ActivityManager: 12% TOTAL: 9.6% user + 0.9% kernel + 1.9% irq

EDIT: I want to mention that this message gets displayed even when AdMob is working correctly:

02-06 17:52:41.070 32422 32422 E GooglePlayServicesUtil: The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.

It would be interesting to see if this is truly related to ChartBoost, or if it’s just an AdMob issue and the fact that you fallback to ChartBoost is an unrelated red herring.

Out of curiosity, how do you know that it’s the line call to chartboost.hasCachedInterstitial that causes the hang?  Do you have debug output immediately before and after that line?  Is it possible that the real hang is actually caused by some code after that line?

Although you mentioned that you can’t reproduce the problem consistently, I’d suggest trying to create a new, minimal project that exhibits it, starting with just AdMob (no ChartBoost).

Separately, is there any chance that the hang is caused by something in your own code?  Perhaps an accidental infinite loop in your fallback logic?  (I doubt this is the reason, but I have to ask!)

  • Andrew

Got the same problems, using:

chartboost.hasCachedInterstitial

Just hangs the application and trying to load admob ad returns:

Something happened internally
in the AdmobSDK; for instance, an invalid response was received from the ad server.

How to fix it?

Got the same problems, using:

chartboost.hasCachedInterstitial

Just hangs the application and trying to load admob ad returns:

Something happened internally
in the AdmobSDK; for instance, an invalid response was received from the ad server.

How to fix it?