import java.util.Random;
class Rawr {
static class Yawn {
StringBuilder b = new StringBuilder();
int groups;
boolean usedKeepYet;
Yawn() {}
void toss() {
}
}
static final String[] constructs
= {"\\s", "\\S", "\\d", "\\D", "\\w", "\\W", "^", "$", "]", "{", "}", "\\b",
"\\B", "\\t", "\\n", "\\r", "\\h", "\\K"};
static final String[] quantifiers
= {"*",
"+",
"?"}; static final String[] groups
= {"?:",
"?>",
"?|",
"?#",
"?!",
"?<!",
"?<="};
public static void main
(String[] args
) { Yawn yawn = new Yawn();
addWoolTo(yawn, rand);
yawn.toss();
}
static void addWoolTo
(Yawn yar,
Random wool
) { switch (wool.nextInt(9)) {
case 0:
String thing
= constructs
[wool.
nextInt(constructs.
length)]; if (yar.usedKeepYet && ("\\K" == thing)) {
yar.b.append("\\s");
return;
} else if ("\\K" == thing)
yar.usedKeepYet = true;
yar.b.append(thing);
break;
case 1:
case 2: // #FT#
case 3:
yar.b.append((char)
(wool.nextInt(26) + (wool.nextBoolean()? 'a' : 'A')));
break;
case 4:
yar.b.append("|");
yar.usedKeepYet = false;
break;
case 5:
if (wool.nextBoolean()) {
yar.b.append("{" + wool.nextInt(16));
if (wool.nextBoolean())
yar.b.append("," + wool.nextInt(16));
yar.b.append('}');
} else
yar.b.append(quantifiers[wool.nextInt(quantifiers.length)]);
if (wool.nextInt(4) == 0)
yar.b.append(wool.nextBoolean() ? '+' : '?');
break;
case 6:
case 7:
yar.b.append('(');
if ((yar.groups != 0) && wool.nextInt(8) == 0)
yar.b.append("?(" + (1 + wool.nextInt(yar.groups - 1)) +")");
else if (wool.nextInt(3) == 0) {
yar.b.append(groups[wool.nextInt(groups.length)]);
} else yar.groups++;
while (0 != wool.nextInt(4))
addWoolTo(yar, wool);
yar.b.append(')');
break;
case 8:
yar.b.append(wool.nextInt(10));
}
}
}
aW1wb3J0IGphdmEudXRpbC5SYW5kb207CgpjbGFzcyBSYXdyIHsKCXN0YXRpYyBjbGFzcyBZYXduIHsKCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJCWludCBncm91cHM7CgkJYm9vbGVhbiB1c2VkS2VlcFlldDsKCQlZYXduKCkge30KCQl2b2lkIHRvc3MoKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihiKTsKCQl9Cgl9CglzdGF0aWMgZmluYWwgU3RyaW5nW10gY29uc3RydWN0cyA9Cgl7IlxccyIsICJcXFMiLCAiXFxkIiwgIlxcRCIsICJcXHciLCAiXFxXIiwgIl4iLCAiJCIsICJdIiwgInsiLCAifSIsICJcXGIiLAoJICAgICJcXEIiLCAiXFx0IiwgIlxcbiIsICJcXHIiLCAiXFxoIiwgIlxcSyJ9OwoJc3RhdGljIGZpbmFsIFN0cmluZ1tdIHF1YW50aWZpZXJzID0geyIqIiwgIisiLCAiPyJ9OwoJc3RhdGljIGZpbmFsIFN0cmluZ1tdIGdyb3VwcyA9IHsiPzoiLCAiPz4iLCAiP3wiLCAiPyMiLCAiPyEiLCAiPzwhIiwgIj88PSJ9OwoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJWWF3biB5YXduID0gbmV3IFlhd24oKTsKCQlmb3IgKFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOyAwICE9IHJhbmQubmV4dEludCgyMCk7KQoJCSAgICBhZGRXb29sVG8oeWF3biwgcmFuZCk7CgkJeWF3bi50b3NzKCk7Cgl9CglzdGF0aWMgdm9pZCBhZGRXb29sVG8oWWF3biB5YXIsIFJhbmRvbSB3b29sKSB7CgkJc3dpdGNoICh3b29sLm5leHRJbnQoOSkpIHsKCQkJY2FzZSAwOgoJCQkJU3RyaW5nIHRoaW5nID0gY29uc3RydWN0c1t3b29sLm5leHRJbnQoY29uc3RydWN0cy5sZW5ndGgpXTsKCQkJCWlmICh5YXIudXNlZEtlZXBZZXQgJiYgKCJcXEsiID09IHRoaW5nKSkgewoJCQkJCXlhci5iLmFwcGVuZCgiXFxzIik7CgkJCQkJcmV0dXJuOwoJCQkJfSBlbHNlIGlmICgiXFxLIiA9PSB0aGluZykKCQkJCQl5YXIudXNlZEtlZXBZZXQgPSB0cnVlOwoJCQkJeWFyLmIuYXBwZW5kKHRoaW5nKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCWNhc2UgMjogLy8gI0ZUIwoJCQljYXNlIDM6CgkJCQl5YXIuYi5hcHBlbmQoKGNoYXIpCgkJCQkgICAgKHdvb2wubmV4dEludCgyNikgKyAod29vbC5uZXh0Qm9vbGVhbigpPyAnYScgOiAnQScpKSk7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJeWFyLmIuYXBwZW5kKCJ8Iik7CgkJCQl5YXIudXNlZEtlZXBZZXQgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQlpZiAod29vbC5uZXh0Qm9vbGVhbigpKSB7CgkJCQkJeWFyLmIuYXBwZW5kKCJ7IiArIHdvb2wubmV4dEludCgxNikpOwoJCQkJCWlmICh3b29sLm5leHRCb29sZWFuKCkpCgkJCQkJICAgIHlhci5iLmFwcGVuZCgiLCIgKyB3b29sLm5leHRJbnQoMTYpKTsKCQkJCQl5YXIuYi5hcHBlbmQoJ30nKTsKCQkJCX0gZWxzZQoJCQkJICAgIHlhci5iLmFwcGVuZChxdWFudGlmaWVyc1t3b29sLm5leHRJbnQocXVhbnRpZmllcnMubGVuZ3RoKV0pOwoJCQkJaWYgKHdvb2wubmV4dEludCg0KSA9PSAwKQoJCQkJICAgIHlhci5iLmFwcGVuZCh3b29sLm5leHRCb29sZWFuKCkgPyAnKycgOiAnPycpOwoJCQkJYnJlYWs7CgkJCWNhc2UgNjoKCQkJY2FzZSA3OgoJCQkJeWFyLmIuYXBwZW5kKCcoJyk7CgkJCQlpZiAoKHlhci5ncm91cHMgIT0gMCkgJiYgd29vbC5uZXh0SW50KDgpID09IDApCgkJCQkgICB5YXIuYi5hcHBlbmQoIj8oIiArICgxICsgd29vbC5uZXh0SW50KHlhci5ncm91cHMgLSAxKSkgKyIpIik7CgkJCQllbHNlIGlmICh3b29sLm5leHRJbnQoMykgPT0gMCkgewoJCQkJICAgeWFyLmIuYXBwZW5kKGdyb3Vwc1t3b29sLm5leHRJbnQoZ3JvdXBzLmxlbmd0aCldKTsKCQkJCX0gZWxzZSB5YXIuZ3JvdXBzKys7CgkJCQl3aGlsZSAoMCAhPSB3b29sLm5leHRJbnQoNCkpCgkJCQkJYWRkV29vbFRvKHlhciwgd29vbCk7CgkJCQl5YXIuYi5hcHBlbmQoJyknKTsKCQkJCWJyZWFrOwoJCQljYXNlIDg6CgkJCQl5YXIuYi5hcHBlbmQod29vbC5uZXh0SW50KDEwKSk7CgkJfQoJfQp9