Jump to content

Insane Limits (0.9.17.0 - 30-MAR-2015) + BFHL


ImportBot

Recommended Posts

Originally Posted by PapaCharlie9*:

 

So how do I show ILLEGAL WEAPON USED in the chat window? That's what I would really like it was doing it before but not now..

From what I could tell from the iOS screenshot, you have a Kick action set, but no Say action. Using a PC client or direct layer access, add an Action for Say and fill out the say form items.

 

The Action setting is a list, so you fill it in like this:

 

Kick

Say

 

And then when you close the dropdown, it will look like this:

 

Kick | Say

 

And some limit_x_say_xxx items will appear that you can fill out. They should all be self-explanatory, except procon_chat, set that to True to see these messages in the Procon chat log.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

i installed and no work here, i need to do something more? i installed only the insanelimits.cs

i need the Battlelog Cache plugin too?

 

ScreenShot001.jpg ScreenShot002.jpg

 

Test kd 1.0

You should watch the video in post #1*, it shows how to set up Insane Limits. I can see that you need to make some changes that are shown in that video.

 

Are you sure you want to kick for KDR > 1? That's not hacking, there are a lot of legit players that have KDR > 1.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by Pvtjohntowle*:

 

From what I could tell from the iOS screenshot, you have a Kick action set, but no Say action. Using a PC client or direct layer access, add an Action for Say and fill out the say form items.

 

The Action setting is a list, so you fill it in like this:

 

Kick

Say

 

And then when you close the dropdown, it will look like this:

 

Kick | Say

 

And some limit_x_say_xxx items will appear that you can fill out. They should all be self-explanatory, except procon_chat, set that to True to see these messages in the Procon chat log.

Is this what you mean? Or do I put the text "Used Illegal Weapon" where the #%l_id% %l_n% string is ? bandicam 2013-12-31 08-05-57-963.jpg

 

But the violating player is killed first then kicked. So I need two messages to appear in chat, once for being Killed for using an Illegal Weapon and then another message subsequently for being Kicked for using an Illegal Weapon

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Is this what you mean? Or do I put the text "Used Illegal Weapon" where the #%l_id% %l_n% string is ? bandicam 2013-12-31 08-05-57-963.jpg

 

But the violating player is killed first then kicked. So I need two messages to appear in chat, once for being Killed for using an Illegal Weapon and then another message subsequently for being Kicked for using an Illegal Weapon

I don't see anything in your limit code about killing a player. All it does is kick if the an illegal weapon is used.

 

Do you maybe have the wrong limit code for what you want?

 

Here's what you posted before:

 

Code:

if (!Regex.Match(kill.Weapon, @"(U_870|U_M26Mass_Frag|U_DBV12|U_HAWK|U_M1014|U_QBS09|U_SAIGA_20K|U_SPAS12|U_USAS-12|U_UTAS|U_SerbuShorty|U_Defib|Melee|Suicide|SoldierCollision|DamageArea)", RegexOptions.IgnoreCase).Success) {
    plugin.ConsoleWrite("^b^1ILLEGAL WEAPON!^0^n " + killer.FullName + " used " + kill.Weapon + " against " + victim.FullName);
    return true;
} else {
    plugin.ConsoleWrite("^9ok: " + killer.FullName + " used " + kill.Weapon);
    return false;
}
There would have to be a plugin.KillPlayer line of code in there for a player to get killed.

 

EDIT: Oh wait, in the screenshot I can see a little bit of second_check code. You didn't mention you had a second_check as well. I need to see all of that code too.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Sorry but when the player first uses an illegal weapon they are killed and the word Death comes up in Procon Console. If they do it again they are kicked.

 

 

 

Sent from my iPad using Tapatalk

See my edit ... I just noticed you have second_check code that you haven't posted. I need to see all the code, first_check and second_check.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by robthemonstaa*:

 

I think I'm an idiot. I tried copy and paste for no explosives for insane limits. I keep getting the following message. Attached are the screenshots of my insane limits.

 

[13:12:20 59] [insane Limits] ERROR: (CS1002, line: 27, column: 149): ; expected

 

Every code that I copy and paste, i always get ; expected error.

 

111111.png

 

Help would be appreciated.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

I think I'm an idiot. I tried copy and paste for no explosives for insane limits. I keep getting the following message. Attached are the screenshots of my insane limits.

 

[13:12:20 59] [insane Limits] ERROR: (CS1002, line: 27, column: 149): ; expected

 

Every code that I copy and paste, i always get ; expected error.

 

111111.png

 

Help would be appreciated.

Well this is a first!

 

Where are you copying from, which post? The details are important. I think you missed a step.

 

From the screenshot, I see that you set first_check to Code. I'm betting the original post instructed you to use Expression.

 

Usually people get that the other way around, set Expression when they mean Code.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by robthemonstaa*:

 

Ok, I think your advice got me figured out!

 

First_Check

 

( Regex.Match(kill.Weapon, @"(_:M320|M67|V40|Grenade_RGO|XM25)", RegexOptions.IgnoreCase).Success

|| (

(server.MapFileName == "MP_Prison")

&& Regex.Match(kill.Weapon, @"(_:C4|NLAW|RPG7|SMAW|SRAW|M320|M67|V40|Grenade_R GO|XM25)", RegexOptions.IgnoreCase).Success

)

)

Second_Check

 

String kCounterM320 = "_TreatAsOne_Count_M320";

String kCounterC4 = "_TreatAsOne_Count_C4";

String kCounterRPG7 = "_TreatAsOne_Count_RPG7";

String kCounterSMAW = "_TreatAsOne_Count_SMAW";

String kCounterSRAW = "_TreatAsOne_Count_SRAW";

String kCounterNLAW = "_TreatAsOne_Count_NLAW";

String kCounterM67 = "_TreatAsOne_Count_M67";

String kCounterV40 = "_TreatAsOne_Count_V40";

String kCounterGrenade_RGO = "_TreatAsOne_Count_Grenade_RGO";

String kCounterXM25 = "_TreatAsOne_Count_XM25";

TimeSpan time = TimeSpan.FromSeconds(3);

 

int warnings = 0;

String kCounter = null;

switch (plugin.FriendlyWeaponName(kill.Weapon).Name) {

case "M320": kCounter = kCounterM320; break;

case "C4": kCounter = kCounterC4; break;

case "RPG7": kCounter = kCounterRPG7; break;

case "SMAW": kCounter = kCounterSMAW; break;

case "SRAW": kCounter = kCounterSRAW; break;

case "NLAW": kCounter = kCounterNLAW; break;

case "M67": kCounter = kCounterM67; break;

case "V40": kCounter = kCounterV40; break;

case "Grenade": kCounter = kCounterGrenade_RGO; break;

case "XM25": kCounter = kCounterXM25; break;

default: return false;

}

 

kCounter = player.Name + kCounter;

if (server.RoundData.issetInt(kCounter)) warnings = server.RoundData.getInt(kCounter);

 

if (limit.Activations(killer.Name, time) > 1) return false;

 

String msg = "none";

if (warnings

server.RoundData.setInt(kCounter, warnings+1);

return false;

}

 

if (warnings == 3) {

msg = plugin.R("We have a no explosive spamming rule here %k_n%! You have %w_p_x% kills with the %w_n%");

plugin.SendPlayerMessage(player.Name, msg);

plugin.PRoConChat("Warning 1 " + killer.Name + "> " + msg);

server.RoundData.setInt(kCounter, warnings+1);

return false;

}

 

if (warnings == 4) {

msg = plugin.R("We have a no explosive spamming rule here %k_n%! You have %w_p_x% kills with the %w_n%");

plugin.SendGlobalMessage(msg);

plugin.SendPlayerYell(killer.Name, msg, 15);

plugin.PRoConChat("Warning 2 " + killer.Name + "> " + msg);

server.RoundData.setInt(kCounter, warnings+1);

return false;

}

 

if (warnings == 5) {

msg = plugin.R("Killing %k_n% for ignoring warnings and spamming %w_n%!");

plugin.SendGlobalMessage(msg);

plugin.PRoConChat("Warning 3 > " + msg);

plugin.KillPlayer(killer.Name, 5);

server.RoundData.setInt(kCounter, warnings+1);

return false;

}

 

 

if (warnings == 6) {

msg = plugin.R("Killing %k_n% for ignoring warnings and spamming %w_n%!");

plugin.SendGlobalMessage(msg);

plugin.PRoConChat("Warning 4 > " + msg);

plugin.KillPlayer(killer.Name, 5);

server.RoundData.setInt(kCounter, warnings+1);

return false;

}else if (warnings > 6) {

msg = plugin.R("Kicking %k_n% for ignoring warnings and spamming %w_n%!");

plugin.SendGlobalMessage(msg);

plugin.PRoConChat("Insane Limits > " + msg);

plugin.KickPlayerWithMessage(killer.Name, msg);

}

server.RoundData.setInt(kCounter, warnings+1);

return false;

Are these codes correct for no explosive set up? I would like to test it but as far as code goes, i want to get them confirmed by PAPACHARRRRLIE~
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Are these codes correct for no explosive set up? I would like to test it but as far as code goes, i want to get them confirmed by PAPACHARRRRLIE~

The first_check isn't quite right. Do you want different explosives forbidden for Locker (MP_Prison) than for other maps? What exactly are you trying to make forbidden and when?
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Ah, I see. Okay, given that code, here is what you should do.

 

Change the limit name "Shotgun Only" to "Illegal Weapon limit".

 

Remove ALL the Actions. Just delete Kick and Say from the Action list and the rest will go away.

 

Change second_check to this (delete everything that is currently in second_check and replace with copy & paste of this)

 

Code:

double count = limit.Activations(player.Name);

String msg = null;

if (count == 1)
{
    plugin.KillPlayer(player.Name, 5);
    msg = plugin.R("%p_n% used ILLEGAL WEAPON %w_n%! Next time you will be kicked!");
    //plugin.SendPlayerMessage(player.Name, msg); // just the player
    plugin.SendGlobalMessage(msg); // all players
    plugin.PRoConChat(msg);
}
else
{
    msg = plugin.R("%p_n% for ILLEGAL WEAPON %w_n%!");
    plugin.KickPlayerWithMessage(player.Name, msg);
    msg = "Kicked " + msg;
    plugin.SendGlobalMessage(msg);
    plugin.PRoConChat(msg);
}
return false;
This version of the code sends a chat message to all players for both the kill and the kick. If you find the kill messages are too spammy, you can change the code by finding these two lines:

 

Code:

//plugin.SendPlayerMessage(player.Name, msg); // just the player
    plugin.SendGlobalMessage(msg); // all players
and changing them to this:

 

Code:

plugin.SendPlayerMessage(player.Name, msg); // just the player
    //plugin.SendGlobalMessage(msg); // all players
The two slashes // turn a line of code into a comment that does nothing, so all I did was uncomment the SendPlayerMessage (send chat only to the player) and comment the SendGlobalMessage (send chat to all) line.

 

Next time, lets do this in the Insane Limits Request thread, rather than the plugin thread. That's the right place for getting limit code straightened out.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Is it posible to build an aggressive join? So that I it only kicks people for admins?

Yes, but why not used the built-in feature of BF4 for that?

 

If you still want that, post a request in the Insane Limits Request thread in Plugin Enhancements.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by Talzac*:

 

Yes, but why not used the built-in feature of BF4 for that?

 

If you still want that, post a request in the Insane Limits Request thread in Plugin Enhancements.

I have added a request, I do not like the built-in feature of BF4 because:

 

- I can not set kick message so people are returning angry

- I am using other insane limits feature adding people to reserved slots and I only want kick for admins

- I want to kick newly added players or bad players not players with high score

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by shai*:

 

Hi,

 

I looked at the thread and maybe I missed it so that's why I'm asking now...

 

I want to set a limit to mail me when == 6 players have joined the server. That's easy enough and I've got that done and it works.

Problem is, when a server just starts to seed .. there maybe 6 players, and then the 6th joiner, will leave and another player will join again .. which in turn, activates my rule once again and I get another email.

 

This could go on for a while before the server really picks up and 6 is no longer an issue.

 

How can I make sure that either the limit doesn't get checked more then once in a round, or that it doesn't get checked more then once in 15 min?

 

Thanks in advance!

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Hi,

 

I looked at the thread and maybe I missed it so that's why I'm asking now...

 

I want to set a limit to mail me when == 6 players have joined the server. That's easy enough and I've got that done and it works.

Problem is, when a server just starts to seed .. there maybe 6 players, and then the 6th joiner, will leave and another player will join again .. which in turn, activates my rule once again and I get another email.

 

This could go on for a while before the server really picks up and 6 is no longer an issue.

 

How can I make sure that either the limit doesn't get checked more then once in a round, or that it doesn't get checked more then once in 15 min?

 

Thanks in advance!

If you are using an Action to send the email, you'll have to convert it into second_check Code -- everything done in Actions can be done in Code, but not vice versa.

 

This code checks frequently, but won't send email closer than 15 minutes apart.

 

Add this code inside your test for 6 players (presumably an if clause of some kind):

 

Code:

// if there are 6 players ...
DateTime last = DateTime.Now;
if (plugin.Data.issetObject("Last email timestamp")) {
    last = (DateTime)plugin.Data.getObject("Last email timestamp");
}
if (DateTime.Now.Subtract(last).TotalMinutes > 15)) {
    // ... Your code to send email
}
Add this line code when you send the email

 

Code:

plugin.Data.setObject("Last email timestamp", DateTime.Now);

 

That's one way to do it. You can also do it based strictly on the player count and not use a timer at all. All you have to do is use a bool flag that you reactivate only when there are more than 12 players, or whatever you want to use as the upper bound.

 

Code:

bool checkingActivated = true;
if (plugin.Data.issetBool("checkingActivated")) checkingActivated = plugin.Data.getBool("checkingActivated");

...

if (checkingActivated) {
  if (/* players == 6 */) {
    // Send your email ...
    // Deactivate checking
    plugin.Data.setBool("checkingActivated", false);
  } 
} else { // not activated
  if ( /* players >= 12 */) {
    // Reactivate checking
    plugin.Data.setBool("checkingActivated", true);
  }
}
As you can see, once checkingActivated is set to false, it can't be set to true again until there are at least 12 players (or whatever you want) in the server. That avoids the problem with bouncing between 5 and 6 players spamming email. This technique is called hysteresis.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by shai*:

 

If you are using an Action to send the email, you'll have to convert it into second_check Code -- everything done in Actions can be done in Code, but not vice versa.

 

This code checks frequently, but won't send email closer than 15 minutes apart.

 

Add this code inside your test for 6 players (presumably an if clause of some kind):

 

Code:

// if there are 6 players ...
DateTime last = DateTime.Now;
if (plugin.Data.issetObject("Last email timestamp")) {
    last = (DateTime)plugin.Data.getObject("Last email timestamp");
}
if (DateTime.Now.Subtract(last).TotalMinutes > 15)) {
    // ... Your code to send email
}
Add this line code when you send the email

 

Code:

plugin.Data.setObject("Last email timestamp", DateTime.Now);

 

That's one way to do it. You can also do it based strictly on the player count and not use a timer at all. All you have to do is use a bool flag that you reactivate only when there are more than 12 players, or whatever you want to use as the upper bound.

 

Code:

bool checkingActivated = true;
if (plugin.Data.issetBool("checkingActivated")) checkingActivated = plugin.Data.getBool("checkingActivated");

...

if (checkingActivated) {
  if (/* players == 6 */) {
    // Send your email ...
    // Deactivate checking
    plugin.Data.setBool("checkingActivated", false);
  } 
} else { // not activated
  if ( /* players >= 12 */) {
    // Reactivate checking
    plugin.Data.setBool("checkingActivated", true);
  }
}
As you can see, once checkingActivated is set to false, it can't be set to true again until there are at least 12 players (or whatever you want) in the server. That avoids the problem with bouncing between 5 and 6 players spamming email. This technique is called hysteresis.
Pretty impressive :smile: thanks!

I ran into an issue with emails though .. since I signed up on Gmail and after a few emails that got delivered, Gmail started rejecting my sending of new emails since they claim to be tough on Spam and those emails from the plugin seem like spam, and (IMHO) on top of that the SMTP authentication was arriving from the IP of the GSP (which might be considered a bad IP for a source) .. so now I have no way of sending emails at all. I need to find an SMTP host that would get those emails through ...

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by shai*:

 

... You can also do it based strictly on the player count and not use a timer at all. All you have to do is use a bool flag that you reactivate only when there are more than 12 players, or whatever you want to use as the upper bound.

 

Code:

bool checkingActivated = true;
if (plugin.Data.issetBool("checkingActivated")) checkingActivated = plugin.Data.getBool("checkingActivated");

...

if (checkingActivated) {
  if (/* players == 6 */) {
    // Send your email ...
    // Deactivate checking
    plugin.Data.setBool("checkingActivated", false);
  } 
} else { // not activated
  if ( /* players >= 12 */) {
    // Reactivate checking
    plugin.Data.setBool("checkingActivated", true);
  }
}
As you can see, once checkingActivated is set to false, it can't be set to true again until there are at least 12 players (or whatever you want) in the server. That avoids the problem with bouncing between 5 and 6 players spamming email. This technique is called hysteresis.
Can you explain the "Send your email ..." part? I thought I was using the Mail Action from the Limit I was setting up .. but from what I can tell, you want me to send the email during the Code part is being executed. How do I accomplish sending the email?

 

EDIT: like this?

 

Code:

bool checkingActivated = true;
if (plugin.Data.issetBool("checkingActivated")) checkingActivated = plugin.Data.getBool("checkingActivated");

if (checkingActivated) {
  if ( server.PlayerCount == 6 ) {
	plugin.SendMail("[email protected]", "Hey guys .. our server is getting started :)", "Go join! --- Shai")
	// Deactivate checking
	plugin.Data.setBool("checkingActivated", false);
  } 
} else { // not activated
  if ( server.PlayerCount >= 12 ) {
	// Reactivate checking
	plugin.Data.setBool("checkingActivated", true);
  }
}
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

EDIT: like this?

 

Code:

bool checkingActivated = true;
if (plugin.Data.issetBool("checkingActivated")) checkingActivated = plugin.Data.getBool("checkingActivated");

if (checkingActivated) {
  if ( server.PlayerCount == 6 ) {
	plugin.SendMail("[email protected]", "Hey guys .. our server is getting started :)", "Go join! --- Shai")
	// Deactivate checking
	plugin.Data.setBool("checkingActivated", false);
  } 
} else { // not activated
  if ( server.PlayerCount >= 12 ) {
	// Reactivate checking
	plugin.Data.setBool("checkingActivated", true);
  }
}
Looks right to me.

 

BTW, one drawback of this approach is that after the server fills up, if players leave down to 6 left, you'll get another email. If you want it to activate only once the server is down to less than 4, you'll need a second flag that controls the first, something like a serverWasEmpty flag. That will need it to be true before checkingActivated can be true.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

can you please give an example on how to use friendly weapon names in a message ?

Using just the weapon name inline in an OnKill limit:

 

Code:

plugin.ConsoleWrite("Raw code = " + kill.Weapon + ", friendly name = " + plugin.FriendlyWeaponName(kill.Weapon).Name);
Using the whole KillReasonInterface object in an OnKill limit:

 

Code:

KillReasonInterface killReason = plugin.FriendlyWeaponName(kill.Weapon);
plugin.ConsoleWrite("Raw code = " + kill.Weapon + ", Name = " + killReason.Name + ", Detail = " + killReason.Detail + ", AttachedTo = " + killReason.AttachedTo);
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

procon update 1.4.1.4 plugin insane-limits-0.9.14.0 wont show up in loaded plugins even after a delete of Cs files and clean upload

battlefield 3

 

bf3 procon.png

Enable plugin logging on your client. If there is a compile/load error, it will show in the plugin log window. Alternatively, if you can Remote Desktop Connection to your layer host, look at the plugin log on the layer directly (again, that has to be enabled in Procon Options). Post the compile/load error for the plugin.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by FLirtY-3D*:

 

Enable plugin logging on your client. If there is a compile/load error, it will show in the plugin log window. Alternatively, if you can Remote Desktop Connection to your layer host, look at the plugin log on the layer directly (again, that has to be enabled in Procon Options). Post the compile/load error for the plugin.

ok did what you said but i dont seem to get anysort of compile/load error.... but i do notice when i look at the plugin folder for bf3 that version 0.9.14.0 file InsaneLimits.cs and version ProconRulz_44j1 file ProconRulz.cs dont seem to be making a .dll file after i upload and restart the layer.....

 

bf3 procon 1.png

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

ok did what you said but i dont seem to get anysort of compile/load error.... but i do notice when i look at the plugin folder for bf3 that version 0.9.14.0 file InsaneLimits.cs and version ProconRulz_44j1 file ProconRulz.cs dont seem to be making a .dll file after i upload and restart the layer.....

 

bf3 procon 1.png

Still need the plugin.log, buddy. A correct log will look like this:

 

Code:

[08:46:07 26] Compiling InsaneLimits.cs... Done
[08:46:07 41] [Insane Limits] Game Version = BF3
[08:46:07 41] Loading InsaneLimits... Loaded
[08:46:07 45] [Insane Limits] plugin loaded
A problem might look something like this (just an example):

 

Code:

[08:49:16 61] Compiling InsaneLimits.cs... Errors or Warnings
[08:49:16 61] 	InsaneLimits.cs (Line: 54, C: 22) CS0246: The type or namespace name 'NetworkExtension' could not be found (are you missing a using directive or an assembly reference_)
... and no DLL will be created.

 

I need to see the specific error.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by jking54*:

 

I see this error that I've not seen before:

 

[14:17:52 78] [insane Limits] EXCEPTION: Limit #1: System.Reflection.TargetParameterCountException: Parameter count mismatch.

[14:17:52 79] [insane Limits] Extra information dumped in file InsaneLimits.dump

 

specifically it's dealing with the Ticket Booster enhancement

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

I see this error that I've not seen before:

 

[14:17:52 78] [insane Limits] EXCEPTION: Limit #1: System.Reflection.TargetParameterCountException: Parameter count mismatch.

[14:17:52 79] [insane Limits] Extra information dumped in file InsaneLimits.dump

 

specifically it's dealing with the Ticket Booster enhancement

I've never seen that before. What's in InsaneLimits.dump?
* Restored post. It could be that the author is no longer active.
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Please review our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.