[1.3.b66] StackOverflowError using long macro

Thoughts, Help, Feature Requests, Bug Reports, Developing code for...

Moderators: dorpond, trevor, Azhrei

Forum rules
PLEASE don't post images of your entire desktop, attach entire campaign files when only a single file is needed, or generally act in some other anti-social behavior. :)
Joseph Moskie
Kobold
Posts: 4
Joined: Wed Mar 02, 2011 1:54 am

[1.3.b66] StackOverflowError using long macro

Post by Joseph Moskie »

Not sure if this is the right place for this, but I figure it's close enough.

I have written a bunch of macros and a form that is used as a character sheet. There is a Campaign Macro called "Show Sheet", and it generates a frame with a lot of HTML. Over 1,700 lines of maptool code and HTML markup to produce a decent looking character sheet.

I have tested this and it works fine locally, on my host machine. It's using a lot of memory (hovering around 240 MB), but that's tolerable.

I've connected just fine with another instance of Maptool running on the same machine, and the macros all work fine. The sheet loads properly and becomes visible.

The two other machines I've tried it with both had the same exception, a StackOverflowError. I tried running with 1GB memory, but that didn't fix it either. I'm not sure what could be causing it... Maybe the heap wants to grow too fast?

Pasting the macro directly in has the same effect.

The error I'm getting is noted below. I can't help but notice that it seems to be stuck in an infinite loop. Is it possible some sort of parsing is getting caught in a loop?

I've also attached the character sheet macro so you can take a look at it if you want. As I mentioned, it's fairly long.

All machines are running 1.3.b66.

Code: Select all

java.lang.StackOverflowError
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.matchInit(Unknown Source)
	at java.util.regex.Pattern$Prolog.match(Unknown Source)
	at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Curly.match0(Unknown Source)
	at java.util.regex.Pattern$Curly.match(Unknown Source)
	at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.Pattern$CharProperty.match(Unknown Source)
	at java.util.regex.Pattern$Branch.match(Unknown Source)
	at java.util.regex.Pattern$GroupHead.match(Unknown Source)
	at java.util.regex.Pattern$Loop.match(Unknown Source)
	at java.util.regex.Pattern$GroupTail.match(Unknown Source)
	at java.util.regex.Pattern$BranchConn.match(Unknown Source)
	at java.util.regex.
Attachments
characterSheetMacro.txt
(71.56 KiB) Downloaded 66 times

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

I've reported this problem several times but it isn't looked into unfortunately. Partially cause (all?) dev't don't have this problem. Point is 'some' configurations (and this seems to be either windows, apple, linux etct) will give a stack overflow when you port too much to either the chat or a frame. In my experience you can port more to a frame than to the chat, so thats a partial solution, however this also has it limits.

The stack overflow is ridiculous as I've tested it with clean text only (so not html tags, or {} or [] or () etc.) because the most answers I go were that a lot of stack is needed to process all the embedded html code, which might be true but is not the core of the problem.

The only two options you have are:
1. clean up you html as much as possible (e.g. remove all comment)
2. raise the stack. (start high and work your way down)

I have two posts floating around on this forum where I go into more detail, e.g. how many characters one level of stack can process, but you'll have to use the search for that.

I personally find this problem very frustrating but as the dev's can't reproduce, nor have a real clue of why its happening, nothing is done about it.

Let me end this ranting with the fact that I really LOVE MT, I think its a great tool, despite this one major flaw. I also think the dev's are doing a great job but in the end every tool will have its limits and you just have to accept that for MT this is one of them. Also all the dev's, who are doing this for free and in their free time which is also limited.
The good thing is is that the full code is being restructured in 1.4 so who know, will this problem be solved.

User avatar
jfrazierjr
Deity
Posts: 5176
Joined: Tue Sep 11, 2007 7:31 pm

Re: [1.3.b66] StackOverflowError using long macro

Post by jfrazierjr »

wolph42 wrote: I personally find this problem very frustrating but as the dev's can't reproduce, nor have a real clue of why its happening, nothing is done about it.
Not true. It is happening because of parsing and keeping track of matching quotes, single quotes, braces, brackets, etc. Have you tried breaking up the macro into multiple output macros called to dump the text? (I have no idea if that would help the length limit or not).

As for why it's different where one person gets it and another does not even with the same stack size setting, this is due to the way a java virtual machine optimizes itself based on the computer's hardware and OS. It's some super magical formula... Note that this may be technically incorrect, but the results are the same, its based on your computer and the java JIT compiler and how it deals with optimizations of code.


wolph42 wrote: Let me end this ranting with the fact that I really LOVE MT, I think its a great tool, despite this one major flaw. I also think the dev's are doing a great job but in the end every tool will have its limits and you just have to accept that for MT this is one of them. Also all the dev's, who are doing this for free and in their free time which is also limited.
Thanks.... :D
wolph42 wrote:The good thing is is that the full code is being restructured in 1.4 so who know, will this problem be solved.
Yes... switching to Javascript will help immensely as the regular expression can be paired down in the number of matches it has to try to keep up with. Also, since javascript has it's own internal lexer, it's not something WE have to implement and it is far more efficient than a regular expression trying to parse the same text...
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.

Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..

Joseph Moskie
Kobold
Posts: 4
Joined: Wed Mar 02, 2011 1:54 am

Re: [1.3.b66] StackOverflowError using long macro

Post by Joseph Moskie »

Will splitting up the long HTML-ridden macro get around this error? I'm thinking that it won't.

As far as I can tell, macro calls get executed and the placed in-line. The end result, no matter how many splits and macro calls within macro calls, will always be the same large string attempting to run.

The other option is to create several frames. That might work, but it could get annoying to manage the opening/closing of several of them instead of one.



Thanks for the ideas. Anything else I should know about?

Joseph Moskie
Kobold
Posts: 4
Joined: Wed Mar 02, 2011 1:54 am

Re: [1.3.b66] StackOverflowError using long macro

Post by Joseph Moskie »

I ended up splitting the large HTML into several frames (Character, Skills, Combat, Spells). This is small enough to work.

The memory settings aren't what was killing me, it was the stacksize. The default is 2, and with the macros I'm using, we've discovered we have to set it to at least 10. This won't be a huge issue, we just have to make sure all of our players to it.

User avatar
Azhrei
Site Admin
Posts: 12086
Joined: Mon Jun 12, 2006 1:20 pm
Location: Tampa, FL

Re: [1.3.b66] StackOverflowError using long macro

Post by Azhrei »

Joseph Moskie wrote:As far as I can tell, macro calls get executed and the placed in-line. The end result, no matter how many splits and macro calls within macro calls, will always be the same large string attempting to run.
But the problem isn't the end result. The problem is the input.

I've posted about this issue before so I won't go into it again here, but suffice to say that the regex parser starts by looking for the largest possible string that matches the regex, then backtracking to a shorter string (using recursion) if the first one ends up not working. This ends up requiring a huge amount of stack space in certain pathological strings when combined with the particular regexes being used. (A search on my forum name and the word "backtrack" or "backtracking" will probably find the other thread I referred to above.)
Thanks for the ideas. Anything else I should know about?
Yes. MapTool creates and destroys many threads on the fly and all the time. Set your stack as low as possible as it's part of the overall address space available to Java. And the larger you make the heap limit, the more of the address space that can be consumed by heap and thus be unavailable for stack space. This is normally only a problem for the 32-bit Java. You'll know you've hit this problem when you get an exception that says that a new Thread couldn't be created and the description will say "Native code". (In other words, it's the C language code that implements the JVM that is having the problem.)

As Joe says, we'll be moving to JS for 1.4. This should eliminate the regex stack overflow entirely as all macros will be JS. And that language uses a lexical parser and not a bastardized (but easier to implement) regex parser. The MTscript parser is great at doing what it was designed to do, but it has been pushed waaaaay beyond it's original vision! A reboot of the scripting language is overdue. :)

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

jfrazierjr wrote:
wolph42 wrote: I personally find this problem very frustrating but as the dev's can't reproduce, nor have a real clue of why its happening, nothing is done about it.
Not true. It is happening because of parsing and keeping track of matching quotes, single quotes, braces, brackets, etc. Have you tried breaking up the macro into multiple output macros called to dump the text? (I have no idea if that would help the length limit or not).
I think you have missed part of my post:
Wolph42 wrote:The stack overflow is ridiculous as I've tested it with clean text only (so not html tags, or {} or [] or () etc.) because the most answers I got were that a lot of stack is needed to process all the embedded html code, which might be true but is not the core of the problem.
granted I say 'might be true' and obviously it is true but its not the sole problem. I don't have the exact numbers but I ran a test once and crammed 100kb of alphanumeric text through the chat window (no macros, just copy paste straight into the chat) and I needed about 20Mb !!! of stack before I did NOT get a stack overflow...

Edit: ok checked the numbers again, for 100kb I need >20 mb of stack and my pc didn't agree with that. With a file of 48kb It overflowed at 12Mb and ran at 13Mb. I've attached the 48kb file.
Attachments
stack test.txt
(47.41 KiB) Downloaded 81 times

User avatar
Azhrei
Site Admin
Posts: 12086
Joined: Mon Jun 12, 2006 1:20 pm
Location: Tampa, FL

Re: [1.3.b66] StackOverflowError using long macro

Post by Azhrei »

Regular expression require stack space based on the amount of text entered and how that text might match the regex. That's the whole point of "backtracking" -- the regex might match up to a certain point, so it saves its state on the stack and then checks the next piece.

Read the link. They even talk about using backtracking when parsing, although they aren't referring specifically to a regex-based parser.

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

Azhrei wrote:Regular expression require stack space based on the amount of text entered and how that text might match the regex. That's the whole point of "backtracking" -- the regex might match up to a certain point, so it saves its state on the stack and then checks the next piece.

Read the link. They even talk about using backtracking when parsing, although they aren't referring specifically to a regex-based parser.
so.... your point is that this issue is an inherent effect of the use of regex parsing of the text, regardless (well not entirely regardless) of the content of that text. I.o.w.: as long as we use MT script, there is nothing to be done about it.

Thats actually the first straight answer I've got since I've raised the issue about 1,5 years ago. So thanks!!

Question remains though why some systems have more stack problems than others, that is same OS, but stack overflow at different settings for the same amount of text to parse.

User avatar
jfrazierjr
Deity
Posts: 5176
Joined: Tue Sep 11, 2007 7:31 pm

Re: [1.3.b66] StackOverflowError using long macro

Post by jfrazierjr »

wolph42 wrote:Question remains though why some systems have more stack problems than others, that is same OS, but stack overflow at different settings for the same amount of text to parse.
Gremlins in the Java JIT....
I save all my Campaign Files to DropBox. Not only can I access a campaign file from pretty much any OS that will run Maptool(Win,OSX, linux), but each file is versioned, so if something goes crazy wild, I can always roll back to a previous version of the same file.

Get your Dropbox 2GB via my referral link, and as a bonus, I get an extra 250 MB of space. Even if you don't don't use my link, I still enthusiastically recommend Dropbox..

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

jfrazierjr wrote:
wolph42 wrote:Question remains though why some systems have more stack problems than others, that is same OS, but stack overflow at different settings for the same amount of text to parse.
Gremlins in the Java JIT....
I should have known...

User avatar
Azhrei
Site Admin
Posts: 12086
Joined: Mon Jun 12, 2006 1:20 pm
Location: Tampa, FL

Re: [1.3.b66] StackOverflowError using long macro

Post by Azhrei »

wolph42 wrote:Question remains though why some systems have more stack problems than others, that is same OS, but stack overflow at different settings for the same amount of text to parse.
Why do some cars straight off the assembly have engines that sound terrible and the others sound great?

Obviously there was some variance in the construction of the vehicle that causes that. Similarly, some variance in the memory footprint of the JVM (which includes the memory allocated by the JIT, as Joe points out) is likely the issue.

Remember that stack space must be 100% contiguous within the JVM's virtual addressing space and memory fragmentation can cause stack allocation to fail initially as well. (This is different from your point, but related. I figured it's best to at least mention it.)

Craig
Great Wyrm
Posts: 2107
Joined: Sun Jun 22, 2008 7:53 pm
Location: Melbourne, Australia

Re: [1.3.b66] StackOverflowError using long macro

Post by Craig »

wolph42 wrote:
I personally find this problem very frustrating but as the dev's can't reproduce, nor have a real clue of why its happening, nothing is done about it.
I personally find it very frustrating that although I have explained this many times, and stated many times keeping your macros small by breaking them will help you avoid stack problems, some people just refuse to take notice and instead post sentences like the above. Sure its a pain and needs to be fixed and will be in 1.4 but there are several reasons it won't be in 1.3, but the macro script is somewhat limited and you need to do things a certain way some times. For some reason it seems when you tell people there are certain limits they believe the limits dont apply to them.

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

Craig come on! You're accusing me of exactly what you're doing right now. If told numerous times that I was NOT talking about macros brackets HTML or anything else that involves code. But just clear and plain alphanumeric text. In the numerous answers you gave including this response you have ignored that fact every time.

edit: ok a little subtlety is in order: yes most stack overflow messages on this board concern to heavy macros, which you and others have explained often enough that you need to break the macros down and keep them small. The first time I ran into this problem however was due to a relative small text that when ported to the chat gave a stack overflow. I too got the same responses to this as everyone else and I kept explaining that it concerned plain text. Up to now I've never got an explanation WHY MT needs 13Mb of stack to process 48kb of text and moreover why this differs from system to system. That has been quite frustrating to me.

User avatar
wolph42
Winter Wolph
Posts: 9999
Joined: Fri Mar 20, 2009 5:40 am
Location: Netherlands
Contact:

Re: [1.3.b66] StackOverflowError using long macro

Post by wolph42 »

ok as i felt rather unfoundedly criticized by Craigs remark I thought I test his theory as well. I've just ran yesterday in yet another stack overflow problem which i can now use handily for this test.

Stack is set to 5 !!

All macros are created in such a way that they run in a clean maptool setup.
I also added a test campaign with the 3 macros embedded.

I started with a complex macro with lots of brackets that barely does NOT throw a stack error (text1.txt).

To this macro I added just a couple of lines at the end:

Code: Select all

            [if(hasAssStrike),CODE:{
              <tr bgcolor = '[r:if(oddLine,oddRow,evenRow)]'> [h:oddLine = 1-oddLine]
                <td><input type='checkbox' value='1' [r:if(assStrike=="1","CHECKED",""))] name='assStrike'></td>
                <td>Assassin Strike</td>
                <td align='right'></td>
            };{}]
so it DOES throw a stack overflow. (text2.txt)

So far nothing new, its a very complex macro with lots and lots of brackets so a stack overflow is bound to happen.

However as a test I now took the 'dialog' part of test1.txt so thats the lot between:
[dialog('Choose Skills', 'input=1; width=520; height=600; temporary=1'):{
and
}]
And I search and replaced every non alphanumeric character for a alphanumeric character, e.g. [=A, ]=B etc.
Then I rand the macro with just this content, see text3 (note this is WITHOUT the extra lines).
Astoundingly enough this threw a stack overflow.

I leave the conclusions to you.
Attachments
test.cmpgn
(27.2 KiB) Downloaded 71 times
text1.txt
(22.57 KiB) Downloaded 88 times
text2.txt
(22.9 KiB) Downloaded 61 times
text3.txt
(19.88 KiB) Downloaded 64 times

Post Reply

Return to “MapTool”