diff --git a/core/src/main/java/com/questdb/cutlass/pgwire/DefaultWireParserConfiguration.java b/core/src/main/java/com/questdb/cutlass/pgwire/DefaultWireParserConfiguration.java index 39d96130a26ac6304445188fc0f028cf52cde794..498f7de199f6b2519b65236f2b83368fcc35cd4a 100644 --- a/core/src/main/java/com/questdb/cutlass/pgwire/DefaultWireParserConfiguration.java +++ b/core/src/main/java/com/questdb/cutlass/pgwire/DefaultWireParserConfiguration.java @@ -57,4 +57,24 @@ public class DefaultWireParserConfiguration implements WireParserConfiguration { // BLOBs must fit inside send buffer together with other column values return 512 * 1024; } + + @Override + public int getCharacterStoreCapacity() { + return 4096; + } + + @Override + public int getCharacterStorePoolCapacity() { + return 64; + } + + @Override + public int getFactoryCacheColumnCount() { + return 16; + } + + @Override + public int getFactoryCacheRowCount() { + return 16; + } } diff --git a/core/src/main/java/com/questdb/cutlass/pgwire/WireParser.java b/core/src/main/java/com/questdb/cutlass/pgwire/WireParser.java index a0f250f5ff2d1af69bb2e3b6ee5f0c409670e725..1608101e416b287b318d2a568c69713a2f811502 100644 --- a/core/src/main/java/com/questdb/cutlass/pgwire/WireParser.java +++ b/core/src/main/java/com/questdb/cutlass/pgwire/WireParser.java @@ -85,18 +85,22 @@ public class WireParser implements Closeable { private final long sendBufferLimit; private final int recvBufferSize; private final int sendBufferSize; + // todo: thread local private final SqlCompiler compiler; private final ResponseAsciiSink responseAsciiSink = new ResponseAsciiSink(); private final int idleSendCountBeforeGivingUp; private final int idleRecvCountBeforeGivingUp; - private final AssociativeCache factoryCache = new AssociativeCache<>(16, 16); + // todo: thread local + private final AssociativeCache factoryCache; + // todo: thread local private final DirectByteCharSequence dbcs = new DirectByteCharSequence(); + // todo: thread local private final BindVariableService bindVariableService = new BindVariableService(); private final int maxBlobSizeOnQuery; private final ArrayColumnTypes parameterTypes = new ArrayColumnTypes(); private final IntList parameterFormatCodes = new IntList(); - // todo: config man - private final CharacterStore characterStore = new CharacterStore(4096, 16); + // todo: this is thread local + private final CharacterStore characterStore; private RecordCursor currentCursor = null; private int sendCurrentCursorTail = TAIL_NONE; private long sendBufferPtr; @@ -121,6 +125,14 @@ public class WireParser implements Closeable { this.idleRecvCountBeforeGivingUp = configuration.getIdleRecvCountBeforeGivingUp(); this.dumpNetworkTraffic = configuration.getDumpNetworkTraffic(); this.maxBlobSizeOnQuery = configuration.getMaxBlobSizeOnQuery(); + this.characterStore = new CharacterStore( + configuration.getCharacterStoreCapacity(), + configuration.getCharacterStorePoolCapacity() + ); + this.factoryCache = new AssociativeCache<>( + configuration.getFactoryCacheColumnCount(), + configuration.getFactoryCacheRowCount() + ); LOG.info() .$("init [recvBufferSize=").$(recvBufferSize) .$(", sendBufferSize=").$(sendBufferSize) @@ -201,6 +213,178 @@ public class WireParser implements Closeable { } } + private void bindVariables(long lo, long msgLimit, short parameterCount) throws BadProtocolException, SqlException { + // do we have enough data for all codes? + if (lo + Short.BYTES * parameterCount > msgLimit) { + LOG.error().$("invalid format code count [value=").$(parameterCount).$(']').$(); + throw BadProtocolException.INSTANCE; + } + + parameterFormatCodes.clear(); + for (int j = 0; j < parameterCount; j++) { + final short code = NetworkByteOrderUtils.getShort(lo + j * Short.BYTES); + if (code != 1 && code != 0) { + LOG.error().$("unsupported code [index=").$(j).$(", code=").$(code).$(']').$(); + throw BadProtocolException.INSTANCE; + } + parameterFormatCodes.add(code); + LOG.debug().$("parameter format code ").$(code).$(); + } + + lo += parameterCount * Short.BYTES; + + if (lo + Short.BYTES > msgLimit) { + LOG.error().$("could not read parameter value count").$(); + throw BadProtocolException.INSTANCE; + } + parameterCount = NetworkByteOrderUtils.getShort(lo); + + if (parameterCount != parameterTypes.getColumnCount()) { + LOG.error() + .$("parameter count from parse message does not match parameter value count [valueCount=").$(parameterCount) + .$(", typeCount=").$(parameterTypes.getColumnCount()) + .$(']').$(); + throw BadProtocolException.INSTANCE; + } + + lo += Short.BYTES; + characterStore.clear(); + + for (int j = 0; j < parameterCount; j++) { + if (lo + Integer.BYTES > msgLimit) { + LOG.error().$("could not read parameter value length [index=").$(j).$(']').$(); + throw BadProtocolException.INSTANCE; + } + + int valueLen = NetworkByteOrderUtils.getInt(lo); + lo += Integer.BYTES; + if (valueLen == -1) { + // this is null we have already defaulted parameters to + continue; + } + + if (lo + valueLen > msgLimit) { + LOG.error() + .$("value length is outside of buffer [parameterIndex=").$(j) + .$(", valueLen=").$(valueLen) + .$(", messageRemaining=").$(msgLimit - lo) + .$(']').$(); + throw BadProtocolException.INSTANCE; + } + + switch (parameterTypes.getColumnType(j)) { + case PG_INT2: // byte + // postgres sends 'byte' as two-byte short + if (this.parameterFormatCodes.getQuick(j) == 1) { + ensureData(lo, Short.BYTES, msgLimit, j); + bindVariableService.setByte(j, (byte) NetworkByteOrderUtils.getShort(lo)); + } else { + ensureData(lo, valueLen, msgLimit, j); + try { + bindVariableService.setByte(j, (byte) Numbers.parseInt(dbcs.of(lo, lo + valueLen))); + } catch (NumericException e) { + e.printStackTrace(); + } + } + break; + case PG_FLOAT4: // float + if (this.parameterFormatCodes.getQuick(j) == 1) { + ensureData(lo, Float.BYTES, msgLimit, j); + bindVariableService.setFloat(j, Float.intBitsToFloat(NetworkByteOrderUtils.getInt(lo))); + } else { + ensureData(lo, valueLen, msgLimit, j); + try { + bindVariableService.setFloat(j, Numbers.parseFloat(dbcs.of(lo, lo + valueLen))); + } catch (NumericException e) { + e.printStackTrace(); + } + } + break; + case PG_FLOAT8: // double + if (this.parameterFormatCodes.getQuick(j) == 1) { + ensureData(lo, Double.BYTES, msgLimit, j); + bindVariableService.setDouble(j, Double.longBitsToDouble(NetworkByteOrderUtils.getLong(lo))); + } else { + ensureData(lo, valueLen, msgLimit, j); + try { + bindVariableService.setDouble(j, Numbers.parseDouble(dbcs.of(lo, lo + valueLen))); + } catch (NumericException e) { + e.printStackTrace(); + } + } + break; + case PG_INT8: // LONG + if (this.parameterFormatCodes.getQuick(j) == 1) { + ensureData(lo, Long.BYTES, msgLimit, j); + bindVariableService.setLong(j, NetworkByteOrderUtils.getLong(lo)); + } else { + ensureData(lo, valueLen, msgLimit, j); + try { + bindVariableService.setLong(j, Numbers.parseLong(dbcs.of(lo, lo + valueLen))); + } catch (NumericException e) { + e.printStackTrace(); + } + } + break; + case PG_INT4: // INT + if (this.parameterFormatCodes.getQuick(j) == 1) { + ensureData(lo, Integer.BYTES, msgLimit, j); + bindVariableService.setInt(j, NetworkByteOrderUtils.getInt(lo)); + } else { + ensureData(lo, valueLen, msgLimit, j); + try { + bindVariableService.setInt(j, Numbers.parseInt(dbcs.of(lo, lo + valueLen))); + } catch (NumericException e) { + e.printStackTrace(); + } + } + break; + case PG_BOOL: + if (valueLen != 4 && valueLen != 5) { + throw BadProtocolException.INSTANCE; + } + bindVariableService.setBoolean(j, valueLen == 4); + break; + case PG_VARCHAR: + CharacterStoreEntry e = characterStore.newEntry(); + if (Chars.utf8Decode(lo, lo + valueLen, e)) { + bindVariableService.setStr(j, characterStore.toImmutable()); + } else { + LOG.error().$("invalid UTF8 bytes [index=").$(j).$(']').$(); + throw BadProtocolException.INSTANCE; + } + break; + case PG_UNSPECIFIED: + case PG_TIMESTAMP: + case PG_TIMESTAMPZ: + // this could be either Date or Timestamp + dbcs.of(lo, lo + valueLen); + try { + bindVariableService.setDate(j, PG_DATE_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale())); + } catch (NumericException ex) { + try { + bindVariableService.setDate(j, PG_DATE_TIME_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale())); + } catch (NumericException exc) { + throw SqlException.$(0, "unknown date query parameter [value=").put(dbcs).put(", index=").put(j).put(']'); + } + } + break; + case PG_DATE: + // by default statement.setDate() will send type as UNSPECIFIED + // when one calls statement.setNull(Types.DATE) postgres sends PG_DATE, go figure + // todo: attempt for force postgress JDBC to send date as binary when value is not null + break; + default: + LOG.error() + .$("invalid BIND column type [parameterIndex=").$(j) + .$(", type=").$(parameterTypes.getColumnType(j)) + .$(']').$(); + throw BadProtocolException.INSTANCE; + } + lo += valueLen; + } + } + private void clearRecvBuffer() { recvBufferWriteOffset = 0; recvBufferReadOffset = 0; @@ -267,14 +451,18 @@ public class WireParser implements Closeable { } } - private void ensureLength(int index, int expectedLen, int actualLen, String type) throws BadProtocolException { - if (actualLen != expectedLen) { - LOG.error().$("bad ").$(type).$(" [index=").$(index).$(", len=").$(actualLen).$(']').$(); + private void ensureData(long lo, int required, long msgLimit, int j) throws BadProtocolException { + if (lo + required > msgLimit) { + LOG.info().$("not enough bytes for parameter [index=").$(j).$(']').$(); throw BadProtocolException.INSTANCE; } } private long getStringLength(long x, long limit) { + return Unsafe.getUnsafe().getByte(x) == 0 ? x : getStringLengthTedious(x, limit); + } + + private long getStringLengthTedious(long x, long limit) { // calculate length for (long i = x; i < limit; i++) { if (Unsafe.getUnsafe().getByte(i) == 0) { @@ -306,21 +494,24 @@ public class WireParser implements Closeable { return; } - // todo: validate protocol - final byte type = Unsafe.getUnsafe().getByte(address); - LOG.info().$("got msg '").$((char) type).$('\'').$(); + LOG.debug().$("received msg [type=").$((char) type).$(']').$(); final int msgLen = NetworkByteOrderUtils.getInt(address + 1); - assert msgLen > 0; + if (msgLen < 1) { + LOG.error().$("invalid message length [type=").$(type).$(", msgLen=").$(msgLen).$(']').$(); + throw BadProtocolException.INSTANCE; + } // msgLen does not take into account type byte if (msgLen > remaining - 1) { + // When this happens we need to shift our receive buffer left + // to fit this message. Outer function will do that if we + // just exit. return; } // we have enough to read entire message recvBufferReadOffset += msgLen + 1; - long msgLimit = address + msgLen + 1; long lo = address + PREFIXED_MESSAGE_HEADER_LEN; // 8 is offset where name value pairs begin @@ -348,72 +539,52 @@ public class WireParser implements Closeable { // possibly more, check QueryExecutionImpl.processResults() in PG driver for more info hi = getStringLength(lo, msgLimit); - assert hi >= lo; - - LOG.info().$("prepared statement name: ").$(dbcs.of(lo, hi)).$(); + if (hi == -1) { + // we did not find 0 within message limit + LOG.error().$("bad prepared statement name length [msgType='P']").$(); + throw BadProtocolException.INSTANCE; + } lo = hi + 1; hi = getStringLength(lo, msgLimit); - assert hi >= lo; + if (hi == -1) { + // we did not find 0 within message limit + LOG.error().$("bad query text length").$(); + throw BadProtocolException.INSTANCE; + } - dbcs.of(lo, hi); - LOG.info().$("parse [q=`").$(dbcs).$("`]").$(); + LOG.info().$("parse [q=`").$(dbcs.of(lo, hi)).$("`]").$(); lo = hi + 1; - short pc = NetworkByteOrderUtils.getShort(lo); - - if (pc < 0 || lo + Short.BYTES + pc * Integer.BYTES > msgLimit) { - LOG.error().$("invalid PARSE msg [parameterCount=").$(pc).$(']').$(); + if (lo + Short.BYTES > msgLimit) { + LOG.error().$("could not read parameter count").$(); throw BadProtocolException.INSTANCE; } - LOG.info().$("params [count=").$(pc).$(']').$(); - lo += Short.BYTES; - - bindVariableService.clear(); - parameterTypes.reset(); - - for (int j = 0; j < pc; j++) { - LOG.info().$("param [type=").$(NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES)).$(']').$(); - int pgType = NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES); - switch (pgType) { - case PG_FLOAT8: // FLOAT8 - double - bindVariableService.setDouble(j, Double.NaN); - break; - case PG_INT4: // INT - bindVariableService.setInt(j, Numbers.INT_NaN); - break; - case PG_INT8: - bindVariableService.setLong(j, Numbers.LONG_NaN); - break; - case PG_FLOAT4: - bindVariableService.setFloat(j, Float.NaN); - break; - case PG_INT2: - bindVariableService.setByte(j, (byte) 0); - break; - case PG_BOOL: - bindVariableService.setBoolean(j, false); - break; - case PG_VARCHAR: - bindVariableService.setStr(j, null); - break; - case PG_UNSPECIFIED: - case PG_DATE: - case PG_TIMESTAMP: - case PG_TIMESTAMPZ: - // postgres JDBC driver does not seem to send - // microseconds with its text timestamp - // on top of this parameters such as setDate, setTimestamp - // cause driver to send UNSPECIFIED type - // QuestDB has to know types to resolve function linkage - // at compile time rather than at runtime. - bindVariableService.setDate(j, Numbers.LONG_NaN); - break; - default: - throw SqlException.$(0, "unsupported parameter [type=").put(pgType).put(", index=").put(j).put(']'); + short parameterCount = NetworkByteOrderUtils.getShort(lo); + + if (parameterCount > 0) { + if (lo + Short.BYTES + parameterCount * Integer.BYTES > msgLimit) { + LOG.error() + .$("could not read parameters [parameterCount=").$(parameterCount) + .$(", offset=").$(lo - address) + .$(", remaining=").$(msgLimit - lo) + .$(']').$(); + throw BadProtocolException.INSTANCE; } - parameterTypes.add(pgType); + + LOG.debug().$("params [count=").$(parameterCount).$(']').$(); + lo += Short.BYTES; + + bindVariableService.clear(); + parameterTypes.reset(); + setupBindVariables(lo, parameterCount); + } else if (parameterCount < 0) { + LOG.error() + .$("invalid parameter count [parameterCount=").$(parameterCount) + .$(", offset=").$(lo - address) + .$(']').$(); + throw BadProtocolException.INSTANCE; } parseQuery(dbcs); @@ -437,119 +608,37 @@ public class WireParser implements Closeable { break; case 'B': // bind hi = getStringLength(lo, msgLimit); - assert hi >= lo; - - dbcs.of(lo, hi); - LOG.info().$("portal [name=").$(dbcs).$(']').$(); + if (hi == -1) { + // we did not find 0 within message limit + LOG.error().$("bad portal name length [msgType='B']").$(); + throw BadProtocolException.INSTANCE; + } lo = hi + 1; hi = getStringLength(lo, msgLimit); - assert hi >= lo; - - dbcs.of(lo, hi); - - LOG.info().$("statement [name=").$(dbcs).$(']').$(); + if (hi == -1) { + // we did not find 0 within message limit + LOG.error().$("bad prepared statement name length [msgType='B']").$(); + throw BadProtocolException.INSTANCE; + } lo = hi + 1; - short c = NetworkByteOrderUtils.getShort(lo); - LOG.info().$("c = ").$(c).$(); - lo += Short.BYTES; - - parameterFormatCodes.clear(); - for (int j = 0; j < c; j++) { - short code = NetworkByteOrderUtils.getShort(lo + j * Short.BYTES); - if (code != 0 && code != 1) { - throw BadProtocolException.INSTANCE; - } - parameterFormatCodes.add(code); - LOG.debug().$("parameter format code ").$(code).$(); + if (lo + Short.BYTES > msgLimit) { + LOG.error().$("could not read parameter format code count").$(); + throw BadProtocolException.INSTANCE; } - lo += c * Short.BYTES; - - short pv = NetworkByteOrderUtils.getShort(lo); - lo += Short.BYTES; - - LOG.info().$("param value count = ").$(pv).$(); - assert pv == c; - assert pv == parameterTypes.getColumnCount(); - - characterStore.clear(); - - for (int j = 0; j < pv; j++) { - int valueLen = NetworkByteOrderUtils.getInt(lo); - if (valueLen == -1) { - // this is null we have already defaulted parameters to - lo += Integer.BYTES; - continue; - } - if (lo + Integer.BYTES + valueLen > msgLimit) { - LOG.error().$("value length is outside of buffer [parameterIndex=").$(j).$(", valueLen=").$(valueLen).$(", messageRemaining=").$(msgLimit - lo).$(']').$(); - throw BadProtocolException.INSTANCE; - } - - switch (parameterTypes.getColumnType(j)) { - case PG_INT2: // byte - // postgres sends 'byte' as two-byte short - bindVariableService.setByte(j, (byte) NetworkByteOrderUtils.getShort(lo + Integer.BYTES)); - break; - case PG_FLOAT4: // float - bindVariableService.setFloat(j, Float.intBitsToFloat(NetworkByteOrderUtils.getInt(lo + Integer.BYTES))); - break; - case PG_FLOAT8: // double - bindVariableService.setDouble(j, Double.longBitsToDouble(NetworkByteOrderUtils.getLong(lo + Integer.BYTES))); - break; - case PG_INT8: // LONG - bindVariableService.setLong(j, NetworkByteOrderUtils.getLong(lo + Integer.BYTES)); - break; - case PG_INT4: // INT - bindVariableService.setInt(j, NetworkByteOrderUtils.getInt(lo + Integer.BYTES)); - break; - case PG_BOOL: - if (valueLen != 4 && valueLen != 5) { - throw BadProtocolException.INSTANCE; - } - bindVariableService.setBoolean(j, valueLen == 4); - break; - case PG_VARCHAR: - CharacterStoreEntry e = characterStore.newEntry(); - if (Chars.utf8Decode(lo + Integer.BYTES, lo + Integer.BYTES + valueLen, e)) { - bindVariableService.setStr(j, characterStore.toImmutable()); - } else { - LOG.error().$("invalid UTF8 bytes [index=").$(j).$(']').$(); - throw BadProtocolException.INSTANCE; - } - break; - case PG_UNSPECIFIED: - case PG_TIMESTAMP: - case PG_TIMESTAMPZ: - // this could be either Date or Timestamp - assert hi != -1; - dbcs.of(lo + Integer.BYTES, lo + Integer.BYTES + valueLen); - try { - bindVariableService.setDate(j, PG_DATE_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale())); - } catch (NumericException ex) { - try { - bindVariableService.setDate(j, PG_DATE_TIME_Z_FORMAT.parse(dbcs, DateLocaleFactory.INSTANCE.getDefaultDateLocale())); - } catch (NumericException exc) { - throw SqlException.$(0, "unknown date query parameter [value=").put(dbcs).put(", index=").put(j).put(']'); - } - } - LOG.error().$("timestamp: ").$(dbcs).$(); - break; - case PG_DATE: - // by default statement.setDate() will send type as UNSPECIFIED - // when one calls statement.setNull(Types.DATE) postgres sends PG_DATE, go figure - // todo: attempt for force postgress JDBC to send date as binary when value is not null - break; - default: - LOG.error() - .$("invalid BIND column type [parameterIndex=").$(j) - .$(", type=").$(parameterTypes.getColumnType(j)) - .$(']').$(); - throw BadProtocolException.INSTANCE; - } - lo += Integer.BYTES + valueLen; + parameterCount = NetworkByteOrderUtils.getShort(lo); + if (parameterCount != parameterTypes.getColumnCount()) { + LOG.error() + .$("parameter count from parse message does not match format code count [fmtCodeCount=").$(parameterCount) + .$(", typeCount=").$(parameterTypes.getColumnCount()) + .$(']').$(); + throw BadProtocolException.INSTANCE; + } + if (parameterCount > 0) { + lo += Short.BYTES; + bindVariables(lo, msgLimit, parameterCount); } break; case 'E': // execute @@ -570,8 +659,8 @@ public class WireParser implements Closeable { } break; default: - LOG.error().$("unknown message").$(); - assert false; + LOG.error().$("unknown message [type=").$(type).$(']').$(); + throw BadProtocolException.INSTANCE; } } @@ -618,7 +707,7 @@ public class WireParser implements Closeable { private void prepareLoginOk() { responseAsciiSink.put(MESSAGE_TYPE_LOGIN_RESPONSE); - responseAsciiSink.putNetworkInt(8); // length of this message + responseAsciiSink.putNetworkInt(Integer.BYTES * 2); // length of this message responseAsciiSink.putNetworkInt(0); // response code } @@ -637,7 +726,7 @@ public class WireParser implements Closeable { private void prepareReadyForQuery() { responseAsciiSink.put(MESSAGE_TYPE_READY_FOR_QUERY); - responseAsciiSink.putNetworkInt(5); + responseAsciiSink.putNetworkInt(Integer.BYTES + Byte.BYTES); responseAsciiSink.put('I'); } @@ -768,7 +857,7 @@ public class WireParser implements Closeable { private void sendClearTextPasswordChallenge(long fd) throws PeerDisconnectedException, PeerIsSlowToReadException { responseAsciiSink.reset(); responseAsciiSink.put(MESSAGE_TYPE_LOGIN_RESPONSE); - responseAsciiSink.putNetworkInt(8); + responseAsciiSink.putNetworkInt(Integer.BYTES * 2); responseAsciiSink.putNetworkInt(3); send(fd); } @@ -969,6 +1058,50 @@ public class WireParser implements Closeable { responseAsciiSink.putLen(b); } + private void setupBindVariables(long lo, short pc) throws SqlException { + for (int j = 0; j < pc; j++) { + int pgType = NetworkByteOrderUtils.getInt(lo + j * Integer.BYTES); + switch (pgType) { + case PG_FLOAT8: // FLOAT8 - double + bindVariableService.setDouble(j, Double.NaN); + break; + case PG_INT4: // INT + bindVariableService.setInt(j, Numbers.INT_NaN); + break; + case PG_INT8: + bindVariableService.setLong(j, Numbers.LONG_NaN); + break; + case PG_FLOAT4: + bindVariableService.setFloat(j, Float.NaN); + break; + case PG_INT2: + bindVariableService.setByte(j, (byte) 0); + break; + case PG_BOOL: + bindVariableService.setBoolean(j, false); + break; + case PG_VARCHAR: + bindVariableService.setStr(j, null); + break; + case PG_UNSPECIFIED: + case PG_DATE: + case PG_TIMESTAMP: + case PG_TIMESTAMPZ: + // postgres JDBC driver does not seem to send + // microseconds with its text timestamp + // on top of this parameters such as setDate, setTimestamp + // cause driver to send UNSPECIFIED type + // QuestDB has to know types to resolve function linkage + // at compile time rather than at runtime. + bindVariableService.setDate(j, Numbers.LONG_NaN); + break; + default: + throw SqlException.$(0, "unsupported parameter [type=").put(pgType).put(", index=").put(j).put(']'); + } + parameterTypes.add(pgType); + } + } + private class ResponseAsciiSink extends AbstractCharSink { private long bookmarkPtr = -1; diff --git a/core/src/main/java/com/questdb/cutlass/pgwire/WireParserConfiguration.java b/core/src/main/java/com/questdb/cutlass/pgwire/WireParserConfiguration.java index 9e04d45050e431d3974a8a38061705890e587bd4..55d5cef94d63ed3a0c271b45d94f5160591a3e1e 100644 --- a/core/src/main/java/com/questdb/cutlass/pgwire/WireParserConfiguration.java +++ b/core/src/main/java/com/questdb/cutlass/pgwire/WireParserConfiguration.java @@ -26,10 +26,18 @@ package com.questdb.cutlass.pgwire; import com.questdb.network.NetworkFacade; public interface WireParserConfiguration { + int getCharacterStoreCapacity(); + + int getCharacterStorePoolCapacity(); + default boolean getDumpNetworkTraffic() { return false; } + int getFactoryCacheColumnCount(); + + int getFactoryCacheRowCount(); + int getIdleRecvCountBeforeGivingUp(); NetworkFacade getNetworkFacade(); diff --git a/core/src/test/java/com/questdb/cutlass/pgwire/WireParserTest.java b/core/src/test/java/com/questdb/cutlass/pgwire/WireParserTest.java index a8c1e7e79cb8c4c1a83e4093cca05cd3509e4507..b6f6e558955cf3d0094d6f46104ae2fc81a7fd78 100644 --- a/core/src/test/java/com/questdb/cutlass/pgwire/WireParserTest.java +++ b/core/src/test/java/com/questdb/cutlass/pgwire/WireParserTest.java @@ -28,13 +28,11 @@ import com.questdb.griffin.engine.functions.rnd.SharedRandom; import com.questdb.log.Log; import com.questdb.log.LogFactory; import com.questdb.network.*; -import com.questdb.std.Chars; -import com.questdb.std.Numbers; -import com.questdb.std.Rnd; -import com.questdb.std.Unsafe; +import com.questdb.std.*; import com.questdb.std.str.CharSink; import com.questdb.std.str.StringSink; import com.questdb.test.tools.TestUtils; +import org.jetbrains.annotations.NotNull; import org.junit.Assert; import org.junit.Test; import org.postgresql.util.PGTimestamp; @@ -57,6 +55,206 @@ public class WireParserTest extends AbstractGriffinTest { private static final Log LOG = LogFactory.getLog(WireParserTest.class); + @Test + public void testAllParamsHex() throws Exception { + final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">50000000d0535f310073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3100420000012f00535f3100001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">430000000953535f310050000000d0535f320073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3200420000012f00535f3200001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<3300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">430000000953535f320050000000d0535f330073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3300420000012f00535f3300001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<3300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">430000000953535f330050000000d0535f340073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3400420000012f00535f3400001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<3300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">430000000953535f340050000000d0535f350073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3500420000012f00535f3500001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<3300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">430000000953535f350050000000d0535f360073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0440000000953535f3600420000012f00535f3600001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b30300000450000000900000000005300000004\n" + + "<3300000004\n" + + "<54000001f500177800000000000000000000140000000000000000243100000000000000000000170000000000000000243200000000000000000000140000000000000000243300000000000000000002bc0000000000000000243400000000000000000002bd00000000000000002435000000000000000000001500000000000000002436000000000000000000001000000000000000002437000000000000000000041300000000000000002438000000000000000000041300000000000000002439000000000000000000045a0000000000000000243130000000000000000000045a0000000000000000243131000000000000000000001700000000000000002431320000000000000000000014000000000000000024313300000000000000000002bc000000000000000024313400000000000000000002bd000000000000000024313500000000000000000000150000000000000000243136000000000000000000001000000000000000002431370000000000000000000413000000000000000024313800000000000000000004130000000000000000243139000000000000000000045a0000000000000000243230000000000000000000045a0000000000000000243231000000000000000000045a0000000000000000243232000000000000000000045a0000000000000000\n" + + "<44000000f40017000000013100000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013200000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013300000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013400000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e30323344000000f40017000000013500000001340000000331323300000005352e34333000000005302e35363800000002393100000001740000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b200000017313937302d30312d30312030303a30303a30302e30303000000017313937302d30382d32302031313a33333a32302e303333ffffffffffffffffffffffffffffffff00000001300000000166ffffffffffffffffffffffffffffffff00000017313937302d30312d30312030303a30353a30302e30313100000017313937302d30312d30312030303a30383a32302e303233\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">5800000004\n"; + assertHexScript( + getFragmentedSendFacade(), + NetworkFacadeImpl.INSTANCE, + script, + new DefaultWireParserConfiguration() { + @Override + public boolean getDumpNetworkTraffic() { + return true; + } + } + ); + } + + @Test + public void testBadMessageLength() throws Exception { + final String script = + ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000006f6800\n" + + "0000007300030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e65004575726f70652f4c6f6e646f6e0065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" + + "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd000000000000000074000000000000000000045a00000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c00000000000000000000140000000000000000747332000000000000000000045a00000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000045a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + + "<4400000099000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e00000017323031352d30332d31372030343a32353a35322e3736350000000e19c49594365349b4597e3b08a11e44000000bb000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e00000017323031352d30362d32302030313a31303a35382e35393900000011795f8b812b934d1a8e78b5b91153d0fb6444000000b4000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff00000017323031352d30352d32302030313a34383a33372e3431380000000f2b4d5ff64690c3b3598ee5612f640e44000000a4000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff00000017323031352d30312d30332031333a35333a30332e313635ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a44000000a2000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e00000017323031352d30312d30392030363a35373a31372e353132ffffffff44000000a0000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e00000017323031352d30382d32312031353a34363a33322e363234ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff44000000a9000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e00000017323031352d31312d31342031373a33373a33362e303433ffffffff44000000b6000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e00000017323031352d30312d32302030343a35303a33342e30393800000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000009a000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e00000017323031352d30372d31322031323a35393a34372e3636350000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000bb000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e00000017323031352d30342d33302030383a31383a31302e3435330000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b8356744000000a9000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e3737343238310000000234320000000174000000044350535700000017323031352d30322d32342031323a31303a34332e313939ffffffff44000000a5000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e00000017323031352d31322d30392030393a35373a31372e303738ffffffff440000008b000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff00000017323031352d30312d32302030363a31383a31382e353833ffffffff44000000ae000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a5700000017323031352d30362d32352031303a34353a30312e3031340000000d007cfb0119caf2bf845a6f383544000000af000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e3237303538330000000239340000000166000000044350535700000017323031352d31302d32372030323a35323a31392e3933350000000e2d16f389a38364ded6fdc45bc4e944000000b0000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e3231333638360000000234330000000174000000044859525800000017323031352d31322d31382032313a32383a32352e3332350000000ab34c0e8ff10cc560b7d144000000b0000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff00000017323031352d30372d32332032303a31373a30342e3233360000000dd4abbe30fa8dac3d98a0ad9a5d44000000b9000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a5700000017323031352d30342d30342031353a32333a33342e31333000000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000b8000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff00000017323031352d30382d32372031373a32353a33352e3330380000001287fc9283fc88f3322770c801b0dcc93a5b7e44000000a4000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e3934393637340000000232380000000174000000044350535700000017323031352d30382d32392032303a31353a35312e383335ffffffff44000000b1000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e00000017323031352d30312d32362030303a35353a35302e3230320000000f28ed9799d877333fb267da984747bf44000000a3000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff00000017323031352d30352d31392030303a34373a31382e3639380000000d6ade4604d381e7a21622353b1c4400000091000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff00000017323031352d30362d31392031303a33383a35342e343833000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000b4000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a5700000017323031352d31322d31372031353a31323a35342e3935380000001012613a9aad982e7552ad62878845b99d44000000b6000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e353238323234000000033130360000000174000000044350535700000017323031352d30372d30312030303a32333a34392e3738390000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000008b000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff00000017323031352d30322d30322030353a34383a31372e333733ffffffff44000000a9000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e00000017323031352d30332d32392031323a35353a31312e363832ffffffff4400000098000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff000000033132330000000166000000044350535700000017323031352d30352d31382030343a33353a32372e3232380000000e05e5c04eccd6e37b34cd1535bba444000000b4000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e3534343730310000000239310000000174000000044859525800000017323031352d30352d32312030393a33333a31382e3135380000000a571d91723004b702cb0344000000a4000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e3233333731310000000235330000000166000000044350535700000017323031352d30312d31332030343a33373a31302e303336ffffffff44000000a3000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e00000017323031352d30342d30312031343a33333a34322e303035ffffffff44000000b1000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a5700000017323031352d30362d31322032303a31323a32382e3838310000000f6c3e51d7ebb10771321faf404e8c47440000009e000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e323034373138000000033131330000000174000000044859525800000017323031352d31322d31392031333a35383a34312e383139ffffffff44000000b5000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff00000017323031352d30332d30352031373a31343a34382e323735000000124f566b65a45338e9cdc1a7ee8675ada52d4944000000a9000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e00000017323031352d30352d31372031373a33333a32302e393232ffffffff44000000ad000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff00000017323031352d31322d30372031393a32343a33362e3833380000000cec69cd73bb9bc595db6191ce4400000096000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff00000017323031352d30332d30322030383a31393a34342e3536360000000e0148153e0c7f3f8fe4b5ab34212944000000a6000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff00000017323031352d30312d32342030373a31353a30322e373732ffffffff44000000b7000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e00000017323031352d31302d32392031343a33353a31302e3136370000000e079201f56aa131cdcbc2a2b48e9944000000b6000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e32343831383800000001380000000174000000044350535700000017323031352d30382d31362031313a30393a32342e3331310000000dfa1f9224b1b8676508b7f8410044000000b1000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff00000017323031352d30372d30312030343a33323a32332e30383300000014843625632b6361431c477db646babb98ca08bea444000000a4000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff00000017323031352d30332d32392030363a33393a31312e363432ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" + + "<430000000f53454c45435420302030005a0000000549\n" + + ">5800000004\n"; + assertHexScript( + getFragmentedSendFacade(), + NetworkFacadeImpl.INSTANCE, + script, + new DefaultWireParserConfiguration() + ); + } + + @Test + public void testParseMessageBadQueryTerminator() throws Exception { + final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022005345542065787472615f666c6f61745f646967697473203d203308899889988998\n" + + "0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022555345542065787472615f666c6f61745f646967697473203d2033555555425555550c5555555555555555455555550955555555015355555504\n" + + "0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e636528352900fefe0000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + "0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + + "<520000000800000003\n" + + ">70000000076f6800\n" + + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + "<31000000045a0000000549\n" + + ">50000000cd0073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000260000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + " { @@ -142,44 +340,29 @@ public class WireParserTest extends AbstractGriffinTest { } @Test - public void testHexFragmentedSend() throws Exception { - final NetworkFacade nf = new NetworkFacadeImpl() { - @Override - public int send(long fd, long buffer, int bufferLen) { - int total = 0; - for (int i = 0; i < bufferLen; i++) { - int n = super.send(fd, buffer + i, 1); - if (n < 0) { - return n; - } - total += n; - } - return total; - } - }; - - // this is a HEX encoded bytes of the same script as 'testSimple' sends using postgres jdbc driver - String script = ">0000007300030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e65004575726f70652f4c6f6e646f6e0065787472615f666c6f61745f64696769747300320000\n" + + public void testParseMessageTruncatedAtParameterCount() throws Exception { + final String script = ">0000006900030000757365720078797a006461746162617365006e6162755f61707000636c69656e745f656e636f64696e67005554463800446174655374796c650049534f0054696d655a6f6e6500474d540065787472615f666c6f61745f64696769747300320000\n" + "<520000000800000003\n" + ">70000000076f6800\n" + "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + "<31000000045a0000000549\n" + - ">420000000c00000000000000004500000009000000000153000000044500000009000000000153000000045300000004500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + "<31000000045a0000000549\n" + - ">420000000c0000000000000000450000000900000000015300000004\n" + - ">450000000900000000015300000004\n" + - ">5300000004\n" + - ">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + - "<440000008c000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e0000000a323031352d30332d31370000000e19c49594365349b4597e3b08a11e44000000ae000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e0000000a323031352d30362d323000000011795f8b812b934d1a8e78b5b91153d0fb6444000000a7000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff0000000a323031352d30352d32300000000f2b4d5ff64690c3b3598ee5612f640e4400000097000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff0000000a323031352d30312d3033ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a4400000095000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e0000000a323031352d30312d3039ffffffff4400000093000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e0000000a323031352d30382d3231ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff440000009c000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e0000000a323031352d31312d3134ffffffff44000000a9000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e0000000a323031352d30312d323000000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000008d000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e0000000a323031352d30372d31320000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000ae000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e0000000a323031352d30342d33300000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b83567440000009c000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e373734323831000000023432000000017400000004435053570000000a323031352d30322d3234ffffffff4400000098000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e0000000a323031352d31322d3039ffffffff440000007e000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff0000000a323031352d30312d3230ffffffff44000000a1000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a570000000a323031352d30362d32350000000d007cfb0119caf2bf845a6f383544000000a2000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e323730353833000000023934000000016600000004435053570000000a323031352d31302d32370000000e2d16f389a38364ded6fdc45bc4e944000000a3000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e323133363836000000023433000000017400000004485952580000000a323031352d31322d31380000000ab34c0e8ff10cc560b7d144000000a3000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff0000000a323031352d30372d32330000000dd4abbe30fa8dac3d98a0ad9a5d44000000ac000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a570000000a323031352d30342d303400000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000ab000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff0000000a323031352d30382d32370000001287fc9283fc88f3322770c801b0dcc93a5b7e4400000097000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e393439363734000000023238000000017400000004435053570000000a323031352d30382d3239ffffffff44000000a4000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e0000000a323031352d30312d32360000000f28ed9799d877333fb267da984747bf4400000096000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff0000000a323031352d30352d31390000000d6ade4604d381e7a21622353b1c4400000084000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff0000000a323031352d30362d3139000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000a7000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a570000000a323031352d31322d31370000001012613a9aad982e7552ad62878845b99d44000000a9000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e35323832323400000003313036000000017400000004435053570000000a323031352d30372d30310000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000007e000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff0000000a323031352d30322d3032ffffffff440000009c000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e0000000a323031352d30332d3239ffffffff440000008b000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff00000003313233000000016600000004435053570000000a323031352d30352d31380000000e05e5c04eccd6e37b34cd1535bba444000000a7000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e353434373031000000023931000000017400000004485952580000000a323031352d30352d32310000000a571d91723004b702cb034400000097000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e323333373131000000023533000000016600000004435053570000000a323031352d30312d3133ffffffff4400000096000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e0000000a323031352d30342d3031ffffffff44000000a4000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a570000000a323031352d30362d31320000000f6c3e51d7ebb10771321faf404e8c474400000091000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e32303437313800000003313133000000017400000004485952580000000a323031352d31322d3139ffffffff44000000a8000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff0000000a323031352d30332d3035000000124f566b65a45338e9cdc1a7ee8675ada52d49440000009c000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e0000000a323031352d30352d3137ffffffff44000000a0000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff0000000a323031352d31322d30370000000cec69cd73bb9bc595db6191ce4400000089000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff0000000a323031352d30332d30320000000e0148153e0c7f3f8fe4b5ab3421294400000099000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff0000000a323031352d30312d3234ffffffff44000000aa000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e0000000a323031352d31302d32390000000e079201f56aa131cdcbc2a2b48e9944000000a9000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e3234383138380000000138000000017400000004435053570000000a323031352d30382d31360000000dfa1f9224b1b8676508b7f8410044000000a4000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff0000000a323031352d30372d303100000014843625632b6361431c477db646babb98ca08bea44400000097000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff0000000a323031352d30332d3239ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" + - "<430000000f53454c45435420302030005a0000000549\n" + - ">420000000c000000000000000044000000065000450000000900000000005300000004440000000650004500000009000000000053000000044500000009000000000053000000045300000004\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + - "<44000000a8000d0000000450574c5a00000002393100000005302e3530340000001a313937302d30312d30312030303a30303a30302e303030303030ffffffff000000052d3739383500000007343233343632310000001a323031352d30312d32362031323a31373a31302e363535353938000000033130360000000166000000045045484e0000000a323031352d31322d3036000000112a4e91c5e439b2dd0da7bbd57172ba9cac440000008f000d00000004594c58470000000331313400000005302e3739320000001a313937302d30312d30312030303a30303a30302e303130303030ffffffff0000000531383230300000000737363830303832ffffffff000000023530000000017400000004435053570000000a323031352d30352d31330000001252bb50c9024d40ef1fb817f741ffc1a75cc34400000092000d00000004424b5850ffffffff00000005302e3735360000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e393030000000062d3136393636ffffffff0000001a323031352d30372d30382030343a30393a30372e3132373837340000000135000000017400000004485952580000000a323031352d31302d3132ffffffff4400000096000d00000004485844420000000332333900000005302e3433340000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e323335000000053235363238ffffffff0000001a323031352d30392d32302031383a30313a35362e37313437363800000003313134000000017400000004485952580000000a323031352d31312d3039ffffffff440000009d000d0000000454534c4f0000000331353800000005302e3035380000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e333933000000062d313736363900000007373435393639300000001a323031352d31302d30372030303a32393a35372e353439393139000000023333000000016600000004485952580000000a323031352d30342d3038ffffffff4400000090000d00000004484a5558000000013800000005302e3137360000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e31353500000005323530353700000007383334313835310000001a323031352d30322d30382030333a33333a34342e35353434373300000002383300000001660000000456544a57ffffffffffffffff44000000ab000d00000004535444540000000331303600000005302e3231390000001a313937302d30312d30312030303a30303a30302e30363030303000000005302e37373700000005323238383300000007353136383237310000001a323031352d31322d32392030353a30303a33392e3139373135310000000331323500000001740000000456544a570000000a323031352d30392d32350000000e66ca8556e244dbb8e993fcd9cb994400000090000d000000044d43495900000002323600000005302e3138390000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e373535000000062d3231363334ffffffff0000001a323031352d31312d31342031373a34313a31382e38393931363900000001320000000174ffffffff0000000a323031352d30372d3134ffffffff440000009b000d000000044b53514400000002353100000005302e3238360000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e323837000000053139313433ffffffff0000001a323031352d30372d31362030383a33363a35372e373737393837000000033132300000000174ffffffff0000000a323031352d30342d30360000000a84d512fb719934038208440000009d000d000000044a4a46470000000332313100000005302e3832320000001a313937302d30312d30312030303a30303a30302e30393030303000000005302e323735000000062d313831353700000007393639323732300000001a323031352d30352d32332030383a34303a33332e3431393237370000000231320000000174000000045045484e0000000a323031352d30372d3036ffffffff44000000a7000d0000000449584d490000000331313200000005302e3334370000001a313937302d30312d30312030303a30303a30302e31303030303000000005302e363537000000062d313930313700000007393630313134370000001a323031352d31302d30342030363a32323a31322e383039353930000000023737000000017400000004435053570000000a323031352d30342d32300000000a1a275b4d0f33f470bb5744000000a4000d0000000445464a420000000331393900000005302e3537360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e343330000000043530353900000007353031303134340000001a323031352d30332d30392031373a33343a34372e3631393630320000000233320000000174ffffffff0000000a323031352d30342d31350000000d003aea50240bc51a5a8d8550394400000097000d000000044a46424b0000000331333900000005302e3236350000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e313832000000043332353500000007333732343636300000001a323031352d31322d31302031353a35363a32352e3535383733350000000239350000000174ffffffff0000000a323031352d30362d3131ffffffff440000009f000d000000044d44524e0000000331303600000005302e3136340000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e343734000000062d3138383439000000063638343236390000001a323031352d31322d32382032303a35383a32362e30333732343400000002313900000001660000000448595258ffffffff0000000d39dc8c6c6bac60aabcf427617844000000a3000d000000045650474800000002343200000005302e3530330000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e323033000000062d313537323000000007353837303336380000001a323031352d30352d32392030373a30363a33302e3337373730360000000234340000000174ffffffff0000000a323031352d30372d30310000000bd989264fe4513785e1e46e440000008d000d000000044f54485300000002373400000005302e3232340000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000004393832310000000733393533393634ffffffff000000023132000000017400000004435053570000000a323031352d30322d30320000000d593e98c98e5fbd124072694ec244000000a3000d000000044e4746440000000134ffffffff0000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e32363600000005313731353400000007323532343534320000001a323031352d30322d32322030393a33353a30362e36363236333500000001380000000174ffffffff0000000a323031352d31312d303200000013983fb81e53a335588dca1dd0b2eb543f32825b4400000091000d000000045151444f00000002313000000005302e3635330000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e323533000000052d3132313200000007333437363834330000001a323031352d30312d32352032333a31393a34352e32343533373200000002343300000001660000000448595258ffffffffffffffff44000000aa000d00000004534f42520000000331333200000005302e3932350000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e343334000000042d38343600000007333632383332300000001a323031352d30372d32372031373a32393a32342e303037373235000000023335000000016600000004435053570000000a323031352d30322d30370000000f66a1f432e1d00dbf2e91a04aa8bc1c44000000ab000d00000004554452450000000331303700000005302e3939370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e38353700000005313633383200000007343932313737350000001a323031352d30332d30382031303a35313a32322e303139353234000000023830000000016600000004485952580000000a323031352d31302d33300000000f671cfdeba385e53d2184bbb19b5da544000000aa000d0000000457424e450000000331323700000005302e3534350000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e34303300000005313232353100000007383033333232330000001a323031352d30362d31362032313a30363a33312e3735303434310000000236300000000174ffffffff0000000a323031352d31322d303500000012c555ef19d90f612db25ad879a0b0ac6093f1440000007a000dffffffff0000000331393400000005302e3435330000001a313937302d30312d30312030303a30303a30302e323130303030ffffffff000000062d32363936380000000738373030363431ffffffff0000000234300000000174000000045045484e0000000a323031352d31322d3037ffffffff440000009e000d0000000447445450ffffffff00000005302e3232370000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e343436000000062d333030393000000007323736323737390000001a323031352d31322d31322030333a35383a35302e38373830313500000002313100000001660000000456544a57ffffffff0000000e6b531e18079d752a1131d2fbde75440000008f000d00000004575a434a0000000332343400000005302e3937350000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e3232320000000532353836360000000731343830363238ffffffff000000023330000000016600000004485952580000000a323031352d30312d32310000000d4b9d2a9fc1f84f032a59d613dd44000000ae000d000000044f5854500000000331393200000005302e3935370000001a313937302d30312d30312030303a30303a30302e32343030303000000005302e30393400000005323330363000000007333431303232300000001a323031352d30322d32352031373a32313a34342e393532383735000000023137000000017400000004485952580000000a323031352d31312d323300000012fcbb7bd33f08bfbfc083960994535679ebcd44000000a2000d000000044b5859440000000331353100000005302e3430300000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e373534000000062d313833373000000007383236323230360000001a323031352d30342d31392031323a33373a30392e3538383935370000000231390000000166ffffffffffffffff0000001329b39aab7e35973ea15a97c402793839c148ef44000000ad000d00000004574d53520000000331393800000005302e3236350000001a313937302d30312d30312030303a30303a30302e32363030303000000005302e33333100000005313935303100000007373630303133310000001a323031352d31322d30382031363a34383a32352e333633353233000000033132330000000174ffffffff0000000a323031352d30382d303300000014d1df4c3da99136abd2ce1b77497791c2b8f4e7c94400000097000dffffffff0000000331333400000005302e3136320000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e35323300000005323037373100000007323738343235380000001a323031352d31312d31372031353a31343a32312e31323236343700000001310000000174000000045045484e0000000a323031352d31322d3038ffffffff44000000a7000d00000004434c47450000000332343000000005302e3639330000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e35353400000005313839393700000007313239353535300000001a323031352d30332d31322031353a34343a33372e3139353039370000000234310000000166000000045045484e0000000a323031352d30352d30390000000bf6eeea3fc2953f27ede8c044000000b0000d000000045843464f0000000332333100000005302e3335330000001a313937302d30312d30312030303a30303a30302e32393030303000000005302e39353400000005333133333100000007383239343437380000001a323031352d31302d32382032323a35313a31392e36383232313700000003313134000000016600000004485952580000000a323031352d30342d3031000000131e60f2343a5e725d5a66734923034956bd02aa44000000a1000d0000000459515953000000013600000005302e3034350000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e37333200000005333139313700000007343636313037350000001a323031352d30362d31372030333a34333a33322e333937323233000000033131350000000166ffffffff0000000a323031352d31322d31320000000a60a87e6ca44f9dab2b61440000009d000d000000044b4a4b4e0000000332323100000005302e3639330000001a313937302d30312d30312030303a30303a30302e33313030303000000005302e393832000000062d333234373900000007313538373835320000001a323031352d30392d30342031303a33393a35332e36313236343200000002323300000001740000000456544a570000000a323031352d31322d3236ffffffff4400000095000d00000004485a4d440000000332333600000005302e3233310000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e323835000000053237393932ffffffff0000001a323031352d30382d31382031343a32323a30352e383334313532000000023231000000017400000004485952580000000a323031352d30342d3036ffffffff4400000093000dffffffff00000003323139ffffffff0000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e373138000000052d3236393700000007383132303236360000001a323031352d31312d30382031383a31373a33322e3336323935330000000235390000000166000000045045484effffffff0000000a40f24f2981d070ecd5f344000000a4000d00000004585a4d4d0000000332343600000005302e3436300000001a313937302d30312d30312030303a30303a30302e33343030303000000005302e3937320000000438323635000000063936333230390000001a323031352d30312d32322031343a35363a34352e343936303139000000033132360000000174ffffffff0000000a323031352d30322d31390000000d2738e2f83774df3ad8e1e6ba4a44000000a8000d000000044355465700000002363700000005302e3837310000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e3233350000000331323500000007383037343433360000001a323031352d30392d32392030353a31303a35332e343037303834000000023937000000017400000004485952580000000a323031352d30312d30340000000f568acf3f12ab0f4ddf7eb106d30b1a44000000a8000d000000045642575a0000000332333800000005302e3832310000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e30393200000005323634383700000007323535393938320000001a323031352d30372d33302030323a35343a33302e3836353137340000000235320000000166000000045045484e0000000a323031352d30312d30350000000cfb04dc12a5f0054cebaf228c4400000089000dffffffff0000000331393000000005302e3834320000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e363537000000062d313831333100000006333034323135ffffffff0000000236380000000174000000045045484e0000000a323031352d30362d30380000000b40808e49636de05a311bea4400000098000d00000004454d50500000000332333600000005302e3537350000001a313937302d30312d30312030303a30303a30302e333830303030ffffffff000000062d323939353600000007363033333235390000001a323031352d30372d31362031353a35303a35372e36333133313700000002353300000001740000000456544a570000000a323031352d30352d3137ffffffff4400000094000d000000045a4b585000000002343000000005302e3235320000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e303133000000053332363530ffffffff0000001a323031352d30372d31362031333a31333a34392e353038343632000000023933000000017400000004485952580000000a323031352d30392d3232ffffffff44000000a5000d00000004464d4453000000013500000005302e3631370000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e31313200000005313039303900000007323734363639360000001a323031352d30382d32322032313a32333a31352e3436383933300000000237380000000174000000045045484e0000000a323031352d30352d30330000000b48f5da38103592256a3b964400000092000d00000004495456580000000331393700000005302e3939370000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e393438000000052d3638353100000007353334343533330000001a323031352d30362d32382032323a32373a32322e39303431353700000002353900000001740000000456544a57ffffffffffffffff44000000a4000dffffffff00000002383100000005302e3331380000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e34373600000005313333313400000007383232353535320000001a323031352d30312d31332030333a34333a32352e33313539303800000001370000000166000000045045484e0000000a323031352d30372d31330000000e68d74fc2ca1ad35d9f47589c57204400000098000d00000004544c594d00000002363100000005302e3735380000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e303139000000062d323531363000000007383832303338360000001a323031352d30342d31362031373a35343a32332e3631343634360000000235380000000174ffffffff0000000a323031352d31302d3138ffffffff4400000087000d00000004514d494f000000023634ffffffff0000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e343131000000062d31393730340000000738323130383932ffffffff0000000233340000000166ffffffff0000000a323031352d30372d31330000000efb08dddaaad2d5bab2d190e1692b4400000092000d000000044246435500000002313400000005302e3332390000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e323631000000062d31363631390000000738373733323737ffffffff0000000231370000000174000000045045484e0000000a323031352d30322d323700000010489e307c3fb023e5f9a90b86ebce31ff440000009c000d00000004524a495900000002313400000005302e3539320000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e363936000000062d323932373900000007363430393031330000001a323031352d31302d33302031333a34393a33362e323031353135000000023836000000016600000004435053570000000a323031352d30312d3035ffffffff440000009e000d000000044a4e4c560000000332303600000005302e3736360000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e343830000000062d313630373700000007313937313433320000001a323031352d30392d31342031353a32343a32342e35393635303700000003313235000000016600000004485952580000000a323031352d30382d3039ffffffff44000000a8000d000000044858584e0000000331373300000005302e3737320000001a313937302d30312d30312030303a30303a30302e343830303030ffffffff00000005313535303400000007313434303033340000001a323031352d30372d30352032323a31323a35352e363633313439000000033131380000000174000000045045484e0000000a323031352d30362d313500000010870211f5bb0cc5754c7697120eed2c174400000082000d000000045358514500000002383600000005302e3335360000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e343238000000062d31303232310000000732353634363235ffffffff0000000238390000000166000000045045484e0000000a323031352d31302d3038ffffffff\n" + - "<430000000f53454c45435420302030005a0000000549\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n"; - assertHexScript(nf, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration()); + // II + ">50000000740073656c65637420782c24312c24322c24332c24342c24352c24362c24372c24382c24392c2431302c2431312c2431322c2431332c2431342c2431352c2431362c2431372c2431382c2431392c2432302c2432312c2432322066726f6d206c6f6e675f73657175656e63652835290000160000001700000014000002bc000002bd0000001500000010000004130000041300000000000000000000001700000014000002bc000002bd000000150000001000000413000004130000043a000000000000045a000004a0420000012c0000001600010001000100010001000000000000000000000001000100010001000100000000000000010000000000000016000000040000000400000008000000000000007b0000000440adc28f000000083fe22c27a63736ce00000002005b00000004545255450000000568656c6c6f0000001dd0b3d180d183d0bfd0bfd0b020d182d183d180d0b8d181d182d0bed0b20000000e313937302d30312d3031202b30300000001a313937302d30382d32302031313a33333a32302e3033332b3030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001a313937302d30312d30312030303a30353a30302e3031312b30300000001a313937302d30312d30312030303a30383a32302e3032332b3030000044000000065000450000000900000000005300000004\n" + + " { + final CountDownLatch haltLatch = new CountDownLatch(1); + final AtomicBoolean running = new AtomicBoolean(true); + try { + startBasicServer( + NetworkFacadeImpl.INSTANCE, + new DefaultWireParserConfiguration() { + @Override + public boolean getDumpNetworkTraffic() { + return true; + } + }, + haltLatch, + running + ); + + Properties properties = new Properties(); + properties.setProperty("user", "xyz"); + properties.setProperty("password", "oh"); + properties.setProperty("sslmode", "disable"); + properties.setProperty("binaryTransfer", "false"); + TimeZone.setDefault(TimeZone.getTimeZone("EDT")); + final Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:9120/nabu_app", properties); + PreparedStatement statement = connection.prepareStatement("select x,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? from long_sequence(5)"); + statement.setInt(1, 4); + statement.setLong(2, 123L); + statement.setFloat(3, 5.43f); + statement.setDouble(4, 0.56789); + statement.setByte(5, (byte) 91); + statement.setBoolean(6, true); + statement.setString(7, "hello"); + // this is to test UTF8 behaviour + statement.setString(8, "группа туристов"); + statement.setDate(9, new Date(100L)); + statement.setTimestamp(10, new Timestamp(20000000033L)); + + // nulls + statement.setNull(11, Types.INTEGER); + statement.setNull(12, Types.BIGINT); + statement.setNull(13, Types.REAL); + statement.setNull(14, Types.DOUBLE); + statement.setNull(15, Types.SMALLINT); + statement.setNull(16, Types.BOOLEAN); + statement.setNull(17, Types.VARCHAR); + statement.setString(18, null); + statement.setNull(19, Types.DATE); + statement.setNull(20, Types.TIMESTAMP); + + // when someone uses postgress type extensions, which alter driver behaviour + // we should handle this gracefully + + statement.setTimestamp(21, new PGTimestamp(300011)); + statement.setTimestamp(22, new PGTimestamp(500023, new GregorianCalendar())); + + final String expected = "x[BIGINT],$1[INTEGER],$2[BIGINT],$3[DOUBLE],$4[DOUBLE],$5[SMALLINT],$6[BIT],$7[VARCHAR],$8[VARCHAR],$9[TIMESTAMP],$10[TIMESTAMP],$11[INTEGER],$12[BIGINT],$13[REAL],$14[DOUBLE],$15[SMALLINT],$16[BIT],$17[VARCHAR],$18[VARCHAR],$19[TIMESTAMP],$20[TIMESTAMP],$21[TIMESTAMP],$22[TIMESTAMP]\n" + + "1,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" + + "2,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" + + "3,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" + + "4,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n" + + "5,4,123,5.43000000,0.56800000,91,true,hello,группа туристов,1970-01-01 00:00:00.0,1970-08-20 11:33:20.033,null,null,null,null,0,false,null,null,null,null,1970-01-01 00:05:00.011,1970-01-01 00:08:20.023\n"; + + StringSink sink = new StringSink(); + for (int i = 0; i < 10; i++) { + sink.clear(); + ResultSet rs = statement.executeQuery(); + assertResultSet(expected, sink, rs); + rs.close(); + } + connection.close(); + } finally { + running.set(false); + haltLatch.await(); + } + }); + } + @Test public void testSimple() throws Exception { TestUtils.assertMemoryLeak(() -> { @@ -679,7 +925,12 @@ public class WireParserTest extends AbstractGriffinTest { final AtomicBoolean running = new AtomicBoolean(true); try { startBasicServer(NetworkFacadeImpl.INSTANCE, - new DefaultWireParserConfiguration(), + new DefaultWireParserConfiguration() { + @Override + public boolean getDumpNetworkTraffic() { + return true; + } + }, haltLatch, running ); @@ -791,20 +1042,13 @@ public class WireParserTest extends AbstractGriffinTest { "<520000000800000000530000001154696d655a6f6e6500474d5400530000001d6170706c69636174696f6e5f6e616d65005175657374444200530000001e7365727665725f76657273696f6e5f6e756d00313030303030005300000019696e74656765725f6461746574696d6573006f6e005a0000000549\n" + ">5000000022005345542065787472615f666c6f61745f646967697473203d2033000000420000000c0000000000000000450000000900000000015300000004\n" + "<31000000045a0000000549\n" + - ">420000000c00000000000000004500000009000000000153000000044500000009000000000153000000045300000004500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + + ">500000003700534554206170706c69636174696f6e5f6e616d65203d2027506f737467726553514c204a4442432044726976657227000000420000000c0000000000000000450000000900000000015300000004\n" + "<31000000045a0000000549\n" + - ">420000000c0000000000000000450000000900000000015300000004\n" + - ">450000000900000000015300000004\n" + - ">5300000004\n" + ">50000001a20073656c65637420726e645f73747228342c342c342920732c20726e645f696e7428302c203235362c20342920692c20726e645f646f75626c6528342920642c2074696d657374616d705f73657175656e636528746f5f74696d657374616d702830292c31303030302920742c20726e645f666c6f617428342920662c20726e645f73686f72742829205f73686f72742c20726e645f6c6f6e6728302c2031303030303030302c203529206c2c20726e645f74696d657374616d7028746f5f74696d657374616d70282732303135272c277979797927292c746f5f74696d657374616d70282732303136272c277979797927292c3229207473322c20726e645f6279746528302c313237292062622c20726e645f626f6f6c65616e282920622c20726e645f73796d626f6c28342c342c342c32292c20726e645f6461746528746f5f64617465282732303135272c20277979797927292c20746f5f64617465282732303136272c20277979797927292c2032292c726e645f62696e2831302c32302c32292066726f6d206c6f6e675f73657175656e636528353029000000420000000c000000000000000044000000065000450000000900000000005300000004\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + - "<440000008c000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e0000000a323031352d30332d31370000000e19c49594365349b4597e3b08a11e44000000ae000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e0000000a323031352d30362d323000000011795f8b812b934d1a8e78b5b91153d0fb6444000000a7000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff0000000a323031352d30352d32300000000f2b4d5ff64690c3b3598ee5612f640e4400000097000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff0000000a323031352d30312d3033ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a4400000095000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e0000000a323031352d30312d3039ffffffff4400000093000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e0000000a323031352d30382d3231ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff440000009c000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e0000000a323031352d31312d3134ffffffff44000000a9000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e0000000a323031352d30312d323000000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000008d000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e0000000a323031352d30372d31320000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000ae000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e0000000a323031352d30342d33300000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b83567440000009c000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e373734323831000000023432000000017400000004435053570000000a323031352d30322d3234ffffffff4400000098000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e0000000a323031352d31322d3039ffffffff440000007e000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff0000000a323031352d30312d3230ffffffff44000000a1000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a570000000a323031352d30362d32350000000d007cfb0119caf2bf845a6f383544000000a2000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e323730353833000000023934000000016600000004435053570000000a323031352d31302d32370000000e2d16f389a38364ded6fdc45bc4e944000000a3000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e323133363836000000023433000000017400000004485952580000000a323031352d31322d31380000000ab34c0e8ff10cc560b7d144000000a3000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff0000000a323031352d30372d32330000000dd4abbe30fa8dac3d98a0ad9a5d44000000ac000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a570000000a323031352d30342d303400000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000ab000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff0000000a323031352d30382d32370000001287fc9283fc88f3322770c801b0dcc93a5b7e4400000097000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e393439363734000000023238000000017400000004435053570000000a323031352d30382d3239ffffffff44000000a4000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e0000000a323031352d30312d32360000000f28ed9799d877333fb267da984747bf4400000096000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff0000000a323031352d30352d31390000000d6ade4604d381e7a21622353b1c4400000084000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff0000000a323031352d30362d3139000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000a7000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a570000000a323031352d31322d31370000001012613a9aad982e7552ad62878845b99d44000000a9000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e35323832323400000003313036000000017400000004435053570000000a323031352d30372d30310000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000007e000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff0000000a323031352d30322d3032ffffffff440000009c000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e0000000a323031352d30332d3239ffffffff440000008b000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff00000003313233000000016600000004435053570000000a323031352d30352d31380000000e05e5c04eccd6e37b34cd1535bba444000000a7000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e353434373031000000023931000000017400000004485952580000000a323031352d30352d32310000000a571d91723004b702cb034400000097000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e323333373131000000023533000000016600000004435053570000000a323031352d30312d3133ffffffff4400000096000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e0000000a323031352d30342d3031ffffffff44000000a4000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a570000000a323031352d30362d31320000000f6c3e51d7ebb10771321faf404e8c474400000091000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e32303437313800000003313133000000017400000004485952580000000a323031352d31322d3139ffffffff44000000a8000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff0000000a323031352d30332d3035000000124f566b65a45338e9cdc1a7ee8675ada52d49440000009c000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e0000000a323031352d30352d3137ffffffff44000000a0000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff0000000a323031352d31322d30370000000cec69cd73bb9bc595db6191ce4400000089000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff0000000a323031352d30332d30320000000e0148153e0c7f3f8fe4b5ab3421294400000099000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff0000000a323031352d30312d3234ffffffff44000000aa000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e0000000a323031352d31302d32390000000e079201f56aa131cdcbc2a2b48e9944000000a9000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e3234383138380000000138000000017400000004435053570000000a323031352d30382d31360000000dfa1f9224b1b8676508b7f8410044000000a4000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff0000000a323031352d30372d303100000014843625632b6361431c477db646babb98ca08bea44400000097000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff0000000a323031352d30332d3239ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" + + "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd000000000000000074000000000000000000045a00000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c00000000000000000000140000000000000000747332000000000000000000045a00000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000045a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + + "<4400000099000dffffffff00000002353700000005302e3632350000001a313937302d30312d30312030303a30303a30302e30303030303000000005302e343632000000052d313539330000000733343235323332ffffffff000000033132310000000166000000045045484e00000017323031352d30332d31372030343a32353a35322e3736350000000e19c49594365349b4597e3b08a11e44000000bb000d00000004585953420000000331343200000005302e3537390000001a313937302d30312d30312030303a30303a30302e30313030303000000005302e39363900000005323030383800000007313531373439300000001a323031352d30312d31372032303a34313a31392e343830363835000000033130300000000174000000045045484e00000017323031352d30362d32302030313a31303a35382e35393900000011795f8b812b934d1a8e78b5b91153d0fb6444000000b4000d000000044f5a5a560000000332313900000005302e3136340000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e363539000000062d313233303300000007393438393530380000001a323031352d30382d31332031373a31303a31392e37353235323100000001360000000166ffffffff00000017323031352d30352d32302030313a34383a33372e3431380000000f2b4d5ff64690c3b3598ee5612f640e44000000a4000d000000044f4c595800000002333000000005302e3731330000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e363535000000043636313000000007363530343432380000001a323031352d30382d30382030303a34323a32342e353435363339000000033132330000000166ffffffff00000017323031352d30312d30332031333a35333a30332e313635ffffffff440000009f000d000000045449514200000002343200000005302e3638310000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e363236000000052d3136303500000007383831343038360000001a323031352d30372d32382031353a30383a35332e34363234393500000002323800000001740000000443505357ffffffff0000000e3ba6dc3b7d2be392fe6938e1779a44000000a2000d000000044c544f560000000331333700000005302e3736330000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e3838320000000439303534ffffffff0000001a323031352d30342d32302030353a30393a30332e353830353734000000033130360000000166000000045045484e00000017323031352d30312d30392030363a35373a31372e353132ffffffff44000000a0000d000000045a494d4e00000003313235ffffffff0000001a313937302d30312d30312030303a30303a30302e303630303030ffffffff00000005313135323400000007383333353236310000001a323031352d31302d32362030323a31303a35302e363838333934000000033131310000000174000000045045484e00000017323031352d30382d32312031353a34363a33322e363234ffffffff4400000093000d000000044f504a4f0000000331363800000005302e3130350000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e353335000000052d3539323000000007373038303730340000001a323031352d30372d31312030393a31353a33382e3334323731370000000331303300000001660000000456544a57ffffffffffffffff44000000a9000d00000004474c554f0000000331343500000005302e3533390000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e37363700000005313432343200000007323439393932320000001a323031352d31312d30322030393a30313a33312e3331323830340000000238340000000166000000045045484e00000017323031352d31312d31342031373a33373a33362e303433ffffffff44000000b6000d000000045a5651450000000331303300000005302e3637330000001a313937302d30312d30312030303a30303a30302e303930303030ffffffff00000005313337323700000007373837353834360000001a323031352d31322d31322031333a31363a32362e3133343536320000000232320000000174000000045045484e00000017323031352d30312d32302030343a35303a33342e30393800000012143380c9eba3677a1a79e435e43adc5c65ff440000009a000d000000044c4947590000000331393900000005302e3238340000001a313937302d30312d30312030303a30303a30302e313030303030ffffffff00000005333034323600000007333231353536320000001a323031352d30382d32312031343a35353a30372e30353537323200000002313100000001660000000456544a57ffffffff0000000dff703ac78ab314cd470b0c3912440000009a000d000000044d514e5400000002343300000005302e3538360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e333335000000053237303139ffffffffffffffff0000000232370000000174000000045045484e00000017323031352d30372d31322031323a35393a34372e3636350000001326fb2e42faf56e8f80e354b807b13257ff9aef44000000bb000d00000004575743430000000332313300000005302e3736370000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e35383000000005313336343000000007343132313932330000001a323031352d30382d30362030323a32373a33302e3436393736320000000237330000000166000000045045484e00000017323031352d30342d33302030383a31383a31302e3435330000001271a7d5af11963708dd98ef54882aa2ade7d444000000a2000d00000004564647500000000331323000000005302e3834300000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e373733000000043732323300000007373234313432330000001a323031352d31322d31382030373a33323a31382e34353630323500000002343300000001660000000456544a57ffffffff00000011244e44a80dfe27ec53135db215e7b8356744000000a9000d00000004524d44470000000331333400000005302e3131300000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e30343300000005323132323700000007373135353730380000001a323031352d30372d30332030343a31323a34352e3737343238310000000234320000000174000000044350535700000017323031352d30322d32342031323a31303a34332e313939ffffffff44000000a5000d0000000457464f5100000003323535ffffffff0000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000005333135363900000007363638383237370000001a323031352d30352d31392030333a33303a34352e373739393939000000033132360000000174000000045045484e00000017323031352d31322d30392030393a35373a31372e303738ffffffff440000008b000d000000044d58444b00000002353600000005312e3030300000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e353233000000062d33323337320000000736383834313332ffffffff0000000235380000000166ffffffff00000017323031352d30312d32302030363a31383a31382e353833ffffffff44000000ae000d00000004584d4b4a0000000331333900000005302e3834310000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e333036000000053235383536ffffffff0000001a323031352d30352d31382030333a35303a32322e373331343337000000013200000001740000000456544a5700000017323031352d30362d32352031303a34353a30312e3031340000000d007cfb0119caf2bf845a6f383544000000af000d0000000456494844ffffffffffffffff0000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e35353000000005323232383000000007393130393834320000001a323031352d30312d32352031333a35313a33382e3237303538330000000239340000000166000000044350535700000017323031352d31302d32372030323a35323a31392e3933350000000e2d16f389a38364ded6fdc45bc4e944000000b0000d0000000457504e58ffffffff00000005302e3934370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e343135000000062d3137393333000000063637343236310000001a323031352d30332d30342031353a34333a31352e3231333638360000000234330000000174000000044859525800000017323031352d31322d31382032313a32383a32352e3332350000000ab34c0e8ff10cc560b7d144000000b0000d0000000459504f5600000002333600000005302e3637340000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e303331000000052d3538383800000007313337353432330000001a323031352d31322d31302032303a35303a33352e38363636313400000001330000000174ffffffff00000017323031352d30372d32332032303a31373a30342e3233360000000dd4abbe30fa8dac3d98a0ad9a5d44000000b9000d000000044e55484effffffff00000005302e3639340000001a313937302d30312d30312030303a30303a30302e32313030303000000005302e333339000000062d323532323600000007333532343734380000001a323031352d30352d30372030343a30373a31382e31353239363800000002333900000001740000000456544a5700000017323031352d30342d30342031353a32333a33342e31333000000012b8bef8a146872892a39be3cbc2648ab035d8440000008e000d00000004424f53450000000332343000000005302e3036300000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e33373900000005323339303400000007393036393333390000001a323031352d30332d32312030333a34323a34322e3634333138360000000238340000000174ffffffffffffffffffffffff44000000b8000d00000004494e4b470000000331323400000005302e3836320000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e343034000000062d333033383300000007373233333534320000001a323031352d30372d32312031363a34323a34372e3031323134380000000239390000000166ffffffff00000017323031352d30382d32372031373a32353a33352e3330380000001287fc9283fc88f3322770c801b0dcc93a5b7e44000000a4000d000000044655584300000002353200000005302e3734330000001a313937302d30312d30312030303a30303a30302e323430303030ffffffff000000062d313437323900000007313034323036340000001a323031352d30382d32312030323a31303a35382e3934393637340000000232380000000174000000044350535700000017323031352d30382d32392032303a31353a35312e383335ffffffff44000000b1000d00000004554e595100000002373100000005302e3434320000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e353339000000062d3232363131ffffffff0000001a323031352d31322d32332031383a34313a34322e3331393835390000000239380000000174000000045045484e00000017323031352d30312d32362030303a35353a35302e3230320000000f28ed9799d877333fb267da984747bf44000000a3000d000000044b424d51ffffffff00000005302e3238300000001a313937302d30312d30312030303a30303a30302e323630303030ffffffff000000053132323430ffffffff0000001a323031352d30382d31362030313a30323a35352e3736363632320000000232310000000166ffffffff00000017323031352d30352d31392030303a34373a31382e3639380000000d6ade4604d381e7a21622353b1c4400000091000d000000044a534f4c00000003323433ffffffff0000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e303638000000062d3137343638ffffffffffffffff0000000232300000000174ffffffff00000017323031352d30362d31392031303a33383a35342e343833000000113de02d0486e7ca29980769ca5bd6cf0969440000007f000d00000004484e535300000003313530ffffffff0000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e3134380000000531343834310000000735393932343433ffffffff0000000232350000000166000000045045484effffffff0000000c14d6fcee032281b806c406af44000000b4000d00000004505a50420000000331303100000005302e3036320000001a313937302d30312d30312030303a30303a30302e323930303030ffffffff00000005313232333700000007393837383137390000001a323031352d30392d30332032323a31333a31382e38353234363500000002373900000001660000000456544a5700000017323031352d31322d31372031353a31323a35342e3935380000001012613a9aad982e7552ad62878845b99d44000000b6000d000000044f594e4e00000002323500000005302e3333390000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e36323800000005323234313200000007343733363337380000001a323031352d31302d31302031323a31393a34322e353238323234000000033130360000000174000000044350535700000017323031352d30372d30312030303a32333a34392e3738390000000d54133fffb67ecd0427669489db4400000076000dffffffff0000000331313700000005302e3536340000001a313937302d30312d30312030303a30303a30302e333130303030ffffffff000000052d353630340000000736333533303138ffffffff0000000238340000000166ffffffffffffffff0000000b2bad2507db6244336e008e440000008b000d00000004485652490000000332333300000005302e3232340000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e3432350000000531303436390000000731373135323133ffffffff0000000238360000000166ffffffff00000017323031352d30322d30322030353a34383a31372e333733ffffffff44000000a9000d000000044f59544f00000002393600000005302e3734310000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e353238000000062d313232333900000007333439393632300000001a323031352d30322d30372032323a33353a30332e3231323236380000000231370000000166000000045045484e00000017323031352d30332d32392031323a35353a31312e363832ffffffff4400000098000d000000044c46435900000002363300000005302e3732320000001a313937302d30312d30312030303a30303a30302e333430303030ffffffff0000000532333334340000000739353233393832ffffffff000000033132330000000166000000044350535700000017323031352d30352d31382030343a33353a32372e3232380000000e05e5c04eccd6e37b34cd1535bba444000000b4000d0000000447484c580000000331343800000005302e3330360000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e363336000000062d333134353700000007323332323333370000001a323031352d31302d32322031323a30363a30352e3534343730310000000239310000000174000000044859525800000017323031352d30352d32312030393a33333a31382e3135380000000a571d91723004b702cb0344000000a4000d000000045954535a00000003313233ffffffff0000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e35313900000005323235333400000007343434363233360000001a323031352d30372d32372030373a32333a33372e3233333731310000000235330000000166000000044350535700000017323031352d30312d31332030343a33373a31302e303336ffffffff44000000a3000d0000000453574c5500000003323531ffffffff0000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e313739000000043737333400000007343038323437350000001a323031352d31302d32312031383a32343a33342e3430303334350000000236390000000166000000045045484e00000017323031352d30342d30312031343a33333a34322e303035ffffffff44000000b1000d0000000454514a4c00000003323435ffffffff0000001a313937302d30312d30312030303a30303a30302e33383030303000000005302e3836350000000439353136000000063932393334300000001a323031352d30352d32382030343a31383a31382e36343035363700000002363900000001660000000456544a5700000017323031352d30362d31322032303a31323a32382e3838310000000f6c3e51d7ebb10771321faf404e8c47440000009e000d000000045245494a000000023934ffffffff0000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e313330000000062d3239393234ffffffff0000001a323031352d30332d32302032323a31343a34362e323034373138000000033131330000000174000000044859525800000017323031352d31322d31392031333a35383a34312e383139ffffffff44000000b5000d000000044844485100000002393400000005302e3732330000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e373330000000053139393730000000063635343133310000001a323031352d30312d31302032323a35363a30382e3438303435300000000238340000000174ffffffff00000017323031352d30332d30352031373a31343a34382e323735000000124f566b65a45338e9cdc1a7ee8675ada52d4944000000a9000d00000004554d455500000002343000000005302e3030380000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e383035000000062d313136323300000007343539393836320000001a323031352d31312d32302030343a30323a34342e3333353934370000000237360000000166000000045045484e00000017323031352d30352d31372031373a33333a32302e393232ffffffff44000000ad000d00000004594a494800000003313834ffffffff0000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e33383300000005313736313400000007333130313637310000001a323031352d30312d32382031323a30353a34362e363833303031000000033130350000000174ffffffff00000017323031352d31322d30372031393a32343a33362e3833380000000cec69cd73bb9bc595db6191ce4400000096000d000000044359584700000002323700000005302e3239320000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e393533000000043339343400000006323439313635ffffffff0000000236370000000174ffffffff00000017323031352d30332d30322030383a31393a34342e3536360000000e0148153e0c7f3f8fe4b5ab34212944000000a6000d000000044d5254470000000331343300000005302e3032360000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e393433000000062d323733323000000007313636373834320000001a323031352d30312d32342031393a35363a31352e3937333130390000000231310000000166ffffffff00000017323031352d30312d32342030373a31353a30322e373732ffffffff44000000b7000d00000004444f4e500000000332343600000005302e3635340000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e35353600000005323734373700000007343136303031380000001a323031352d31322d31342030333a34303a30352e3931313833390000000232300000000174000000045045484e00000017323031352d31302d32392031343a33353a31302e3136370000000e079201f56aa131cdcbc2a2b48e9944000000b6000d00000004495158530000000332333200000005302e3233310000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e303439000000062d313831313300000007343030353232380000001a323031352d30362d31312031333a30303a30372e32343831383800000001380000000174000000044350535700000017323031352d30382d31362031313a30393a32342e3331310000000dfa1f9224b1b8676508b7f8410044000000b1000dffffffff00000003313738ffffffff0000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e393033000000062d313436323600000007323933343537300000001a323031352d30342d30342030383a35313a35342e3036383135340000000238380000000174ffffffff00000017323031352d30372d30312030343a33323a32332e30383300000014843625632b6361431c477db646babb98ca08bea444000000a4000d000000044855575a00000002393400000005302e3131300000001a313937302d30312d30312030303a30303a30302e34383030303000000005302e343230000000052d3337333600000007353638373531340000001a323031352d30312d30322031373a31383a30352e3632373633330000000237340000000166ffffffff00000017323031352d30332d32392030363a33393a31312e363432ffffffff440000009d000d000000045352454400000002363600000005302e3131330000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e303630000000062d313035343300000007333636393337370000001a323031352d31302d32322030323a35333a30322e3338313335310000000237370000000174000000045045484effffffff0000000b7c3fd6883a93ef24a5e2bc\n" + "<430000000f53454c45435420302030005a0000000549\n" + - ">420000000c000000000000000044000000065000450000000900000000005300000004440000000650004500000009000000000053000000044500000009000000000053000000045300000004\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n" + - "<44000000a8000d0000000450574c5a00000002393100000005302e3530340000001a313937302d30312d30312030303a30303a30302e303030303030ffffffff000000052d3739383500000007343233343632310000001a323031352d30312d32362031323a31373a31302e363535353938000000033130360000000166000000045045484e0000000a323031352d31322d3036000000112a4e91c5e439b2dd0da7bbd57172ba9cac440000008f000d00000004594c58470000000331313400000005302e3739320000001a313937302d30312d30312030303a30303a30302e303130303030ffffffff0000000531383230300000000737363830303832ffffffff000000023530000000017400000004435053570000000a323031352d30352d31330000001252bb50c9024d40ef1fb817f741ffc1a75cc34400000092000d00000004424b5850ffffffff00000005302e3735360000001a313937302d30312d30312030303a30303a30302e30323030303000000005302e393030000000062d3136393636ffffffff0000001a323031352d30372d30382030343a30393a30372e3132373837340000000135000000017400000004485952580000000a323031352d31302d3132ffffffff4400000096000d00000004485844420000000332333900000005302e3433340000001a313937302d30312d30312030303a30303a30302e30333030303000000005302e323335000000053235363238ffffffff0000001a323031352d30392d32302031383a30313a35362e37313437363800000003313134000000017400000004485952580000000a323031352d31312d3039ffffffff440000009d000d0000000454534c4f0000000331353800000005302e3035380000001a313937302d30312d30312030303a30303a30302e30343030303000000005302e333933000000062d313736363900000007373435393639300000001a323031352d31302d30372030303a32393a35372e353439393139000000023333000000016600000004485952580000000a323031352d30342d3038ffffffff4400000090000d00000004484a5558000000013800000005302e3137360000001a313937302d30312d30312030303a30303a30302e30353030303000000005302e31353500000005323530353700000007383334313835310000001a323031352d30322d30382030333a33333a34342e35353434373300000002383300000001660000000456544a57ffffffffffffffff44000000ab000d00000004535444540000000331303600000005302e3231390000001a313937302d30312d30312030303a30303a30302e30363030303000000005302e37373700000005323238383300000007353136383237310000001a323031352d31322d32392030353a30303a33392e3139373135310000000331323500000001740000000456544a570000000a323031352d30392d32350000000e66ca8556e244dbb8e993fcd9cb994400000090000d000000044d43495900000002323600000005302e3138390000001a313937302d30312d30312030303a30303a30302e30373030303000000005302e373535000000062d3231363334ffffffff0000001a323031352d31312d31342031373a34313a31382e38393931363900000001320000000174ffffffff0000000a323031352d30372d3134ffffffff440000009b000d000000044b53514400000002353100000005302e3238360000001a313937302d30312d30312030303a30303a30302e30383030303000000005302e323837000000053139313433ffffffff0000001a323031352d30372d31362030383a33363a35372e373737393837000000033132300000000174ffffffff0000000a323031352d30342d30360000000a84d512fb719934038208440000009d000d000000044a4a46470000000332313100000005302e3832320000001a313937302d30312d30312030303a30303a30302e30393030303000000005302e323735000000062d313831353700000007393639323732300000001a323031352d30352d32332030383a34303a33332e3431393237370000000231320000000174000000045045484e0000000a323031352d30372d3036ffffffff44000000a7000d0000000449584d490000000331313200000005302e3334370000001a313937302d30312d30312030303a30303a30302e31303030303000000005302e363537000000062d313930313700000007393630313134370000001a323031352d31302d30342030363a32323a31322e383039353930000000023737000000017400000004435053570000000a323031352d30342d32300000000a1a275b4d0f33f470bb5744000000a4000d0000000445464a420000000331393900000005302e3537360000001a313937302d30312d30312030303a30303a30302e31313030303000000005302e343330000000043530353900000007353031303134340000001a323031352d30332d30392031373a33343a34372e3631393630320000000233320000000174ffffffff0000000a323031352d30342d31350000000d003aea50240bc51a5a8d8550394400000097000d000000044a46424b0000000331333900000005302e3236350000001a313937302d30312d30312030303a30303a30302e31323030303000000005302e313832000000043332353500000007333732343636300000001a323031352d31322d31302031353a35363a32352e3535383733350000000239350000000174ffffffff0000000a323031352d30362d3131ffffffff440000009f000d000000044d44524e0000000331303600000005302e3136340000001a313937302d30312d30312030303a30303a30302e31333030303000000005302e343734000000062d3138383439000000063638343236390000001a323031352d31322d32382032303a35383a32362e30333732343400000002313900000001660000000448595258ffffffff0000000d39dc8c6c6bac60aabcf427617844000000a3000d000000045650474800000002343200000005302e3530330000001a313937302d30312d30312030303a30303a30302e31343030303000000005302e323033000000062d313537323000000007353837303336380000001a323031352d30352d32392030373a30363a33302e3337373730360000000234340000000174ffffffff0000000a323031352d30372d30310000000bd989264fe4513785e1e46e440000008d000d000000044f54485300000002373400000005302e3232340000001a313937302d30312d30312030303a30303a30302e31353030303000000005302e31313600000004393832310000000733393533393634ffffffff000000023132000000017400000004435053570000000a323031352d30322d30320000000d593e98c98e5fbd124072694ec244000000a3000d000000044e4746440000000134ffffffff0000001a313937302d30312d30312030303a30303a30302e31363030303000000005302e32363600000005313731353400000007323532343534320000001a323031352d30322d32322030393a33353a30362e36363236333500000001380000000174ffffffff0000000a323031352d31312d303200000013983fb81e53a335588dca1dd0b2eb543f32825b4400000091000d000000045151444f00000002313000000005302e3635330000001a313937302d30312d30312030303a30303a30302e31373030303000000005302e323533000000052d3132313200000007333437363834330000001a323031352d30312d32352032333a31393a34352e32343533373200000002343300000001660000000448595258ffffffffffffffff44000000aa000d00000004534f42520000000331333200000005302e3932350000001a313937302d30312d30312030303a30303a30302e31383030303000000005302e343334000000042d38343600000007333632383332300000001a323031352d30372d32372031373a32393a32342e303037373235000000023335000000016600000004435053570000000a323031352d30322d30370000000f66a1f432e1d00dbf2e91a04aa8bc1c44000000ab000d00000004554452450000000331303700000005302e3939370000001a313937302d30312d30312030303a30303a30302e31393030303000000005302e38353700000005313633383200000007343932313737350000001a323031352d30332d30382031303a35313a32322e303139353234000000023830000000016600000004485952580000000a323031352d31302d33300000000f671cfdeba385e53d2184bbb19b5da544000000aa000d0000000457424e450000000331323700000005302e3534350000001a313937302d30312d30312030303a30303a30302e32303030303000000005302e34303300000005313232353100000007383033333232330000001a323031352d30362d31362032313a30363a33312e3735303434310000000236300000000174ffffffff0000000a323031352d31322d303500000012c555ef19d90f612db25ad879a0b0ac6093f1440000007a000dffffffff0000000331393400000005302e3435330000001a313937302d30312d30312030303a30303a30302e323130303030ffffffff000000062d32363936380000000738373030363431ffffffff0000000234300000000174000000045045484e0000000a323031352d31322d3037ffffffff440000009e000d0000000447445450ffffffff00000005302e3232370000001a313937302d30312d30312030303a30303a30302e32323030303000000005302e343436000000062d333030393000000007323736323737390000001a323031352d31322d31322030333a35383a35302e38373830313500000002313100000001660000000456544a57ffffffff0000000e6b531e18079d752a1131d2fbde75440000008f000d00000004575a434a0000000332343400000005302e3937350000001a313937302d30312d30312030303a30303a30302e32333030303000000005302e3232320000000532353836360000000731343830363238ffffffff000000023330000000016600000004485952580000000a323031352d30312d32310000000d4b9d2a9fc1f84f032a59d613dd44000000ae000d000000044f5854500000000331393200000005302e3935370000001a313937302d30312d30312030303a30303a30302e32343030303000000005302e30393400000005323330363000000007333431303232300000001a323031352d30322d32352031373a32313a34342e393532383735000000023137000000017400000004485952580000000a323031352d31312d323300000012fcbb7bd33f08bfbfc083960994535679ebcd44000000a2000d000000044b5859440000000331353100000005302e3430300000001a313937302d30312d30312030303a30303a30302e32353030303000000005302e373534000000062d313833373000000007383236323230360000001a323031352d30342d31392031323a33373a30392e3538383935370000000231390000000166ffffffffffffffff0000001329b39aab7e35973ea15a97c402793839c148ef44000000ad000d00000004574d53520000000331393800000005302e3236350000001a313937302d30312d30312030303a30303a30302e32363030303000000005302e33333100000005313935303100000007373630303133310000001a323031352d31322d30382031363a34383a32352e333633353233000000033132330000000174ffffffff0000000a323031352d30382d303300000014d1df4c3da99136abd2ce1b77497791c2b8f4e7c94400000097000dffffffff0000000331333400000005302e3136320000001a313937302d30312d30312030303a30303a30302e32373030303000000005302e35323300000005323037373100000007323738343235380000001a323031352d31312d31372031353a31343a32312e31323236343700000001310000000174000000045045484e0000000a323031352d31322d3038ffffffff44000000a7000d00000004434c47450000000332343000000005302e3639330000001a313937302d30312d30312030303a30303a30302e32383030303000000005302e35353400000005313839393700000007313239353535300000001a323031352d30332d31322031353a34343a33372e3139353039370000000234310000000166000000045045484e0000000a323031352d30352d30390000000bf6eeea3fc2953f27ede8c044000000b0000d000000045843464f0000000332333100000005302e3335330000001a313937302d30312d30312030303a30303a30302e32393030303000000005302e39353400000005333133333100000007383239343437380000001a323031352d31302d32382032323a35313a31392e36383232313700000003313134000000016600000004485952580000000a323031352d30342d3031000000131e60f2343a5e725d5a66734923034956bd02aa44000000a1000d0000000459515953000000013600000005302e3034350000001a313937302d30312d30312030303a30303a30302e33303030303000000005302e37333200000005333139313700000007343636313037350000001a323031352d30362d31372030333a34333a33322e333937323233000000033131350000000166ffffffff0000000a323031352d31322d31320000000a60a87e6ca44f9dab2b61440000009d000d000000044b4a4b4e0000000332323100000005302e3639330000001a313937302d30312d30312030303a30303a30302e33313030303000000005302e393832000000062d333234373900000007313538373835320000001a323031352d30392d30342031303a33393a35332e36313236343200000002323300000001740000000456544a570000000a323031352d31322d3236ffffffff4400000095000d00000004485a4d440000000332333600000005302e3233310000001a313937302d30312d30312030303a30303a30302e33323030303000000005302e323835000000053237393932ffffffff0000001a323031352d30382d31382031343a32323a30352e383334313532000000023231000000017400000004485952580000000a323031352d30342d3036ffffffff4400000093000dffffffff00000003323139ffffffff0000001a313937302d30312d30312030303a30303a30302e33333030303000000005302e373138000000052d3236393700000007383132303236360000001a323031352d31312d30382031383a31373a33322e3336323935330000000235390000000166000000045045484effffffff0000000a40f24f2981d070ecd5f344000000a4000d00000004585a4d4d0000000332343600000005302e3436300000001a313937302d30312d30312030303a30303a30302e33343030303000000005302e3937320000000438323635000000063936333230390000001a323031352d30312d32322031343a35363a34352e343936303139000000033132360000000174ffffffff0000000a323031352d30322d31390000000d2738e2f83774df3ad8e1e6ba4a44000000a8000d000000044355465700000002363700000005302e3837310000001a313937302d30312d30312030303a30303a30302e33353030303000000005302e3233350000000331323500000007383037343433360000001a323031352d30392d32392030353a31303a35332e343037303834000000023937000000017400000004485952580000000a323031352d30312d30340000000f568acf3f12ab0f4ddf7eb106d30b1a44000000a8000d000000045642575a0000000332333800000005302e3832310000001a313937302d30312d30312030303a30303a30302e33363030303000000005302e30393200000005323634383700000007323535393938320000001a323031352d30372d33302030323a35343a33302e3836353137340000000235320000000166000000045045484e0000000a323031352d30312d30350000000cfb04dc12a5f0054cebaf228c4400000089000dffffffff0000000331393000000005302e3834320000001a313937302d30312d30312030303a30303a30302e33373030303000000005302e363537000000062d313831333100000006333034323135ffffffff0000000236380000000174000000045045484e0000000a323031352d30362d30380000000b40808e49636de05a311bea4400000098000d00000004454d50500000000332333600000005302e3537350000001a313937302d30312d30312030303a30303a30302e333830303030ffffffff000000062d323939353600000007363033333235390000001a323031352d30372d31362031353a35303a35372e36333133313700000002353300000001740000000456544a570000000a323031352d30352d3137ffffffff4400000094000d000000045a4b585000000002343000000005302e3235320000001a313937302d30312d30312030303a30303a30302e33393030303000000005302e303133000000053332363530ffffffff0000001a323031352d30372d31362031333a31333a34392e353038343632000000023933000000017400000004485952580000000a323031352d30392d3232ffffffff44000000a5000d00000004464d4453000000013500000005302e3631370000001a313937302d30312d30312030303a30303a30302e34303030303000000005302e31313200000005313039303900000007323734363639360000001a323031352d30382d32322032313a32333a31352e3436383933300000000237380000000174000000045045484e0000000a323031352d30352d30330000000b48f5da38103592256a3b964400000092000d00000004495456580000000331393700000005302e3939370000001a313937302d30312d30312030303a30303a30302e34313030303000000005302e393438000000052d3638353100000007353334343533330000001a323031352d30362d32382032323a32373a32322e39303431353700000002353900000001740000000456544a57ffffffffffffffff44000000a4000dffffffff00000002383100000005302e3331380000001a313937302d30312d30312030303a30303a30302e34323030303000000005302e34373600000005313333313400000007383232353535320000001a323031352d30312d31332030333a34333a32352e33313539303800000001370000000166000000045045484e0000000a323031352d30372d31330000000e68d74fc2ca1ad35d9f47589c57204400000098000d00000004544c594d00000002363100000005302e3735380000001a313937302d30312d30312030303a30303a30302e34333030303000000005302e303139000000062d323531363000000007383832303338360000001a323031352d30342d31362031373a35343a32332e3631343634360000000235380000000174ffffffff0000000a323031352d31302d3138ffffffff4400000087000d00000004514d494f000000023634ffffffff0000001a313937302d30312d30312030303a30303a30302e34343030303000000005302e343131000000062d31393730340000000738323130383932ffffffff0000000233340000000166ffffffff0000000a323031352d30372d31330000000efb08dddaaad2d5bab2d190e1692b4400000092000d000000044246435500000002313400000005302e3332390000001a313937302d30312d30312030303a30303a30302e34353030303000000005302e323631000000062d31363631390000000738373733323737ffffffff0000000231370000000174000000045045484e0000000a323031352d30322d323700000010489e307c3fb023e5f9a90b86ebce31ff440000009c000d00000004524a495900000002313400000005302e3539320000001a313937302d30312d30312030303a30303a30302e34363030303000000005302e363936000000062d323932373900000007363430393031330000001a323031352d31302d33302031333a34393a33362e323031353135000000023836000000016600000004435053570000000a323031352d30312d3035ffffffff440000009e000d000000044a4e4c560000000332303600000005302e3736360000001a313937302d30312d30312030303a30303a30302e34373030303000000005302e343830000000062d313630373700000007313937313433320000001a323031352d30392d31342031353a32343a32342e35393635303700000003313235000000016600000004485952580000000a323031352d30382d3039ffffffff44000000a8000d000000044858584e0000000331373300000005302e3737320000001a313937302d30312d30312030303a30303a30302e343830303030ffffffff00000005313535303400000007313434303033340000001a323031352d30372d30352032323a31323a35352e363633313439000000033131380000000174000000045045484e0000000a323031352d30362d313500000010870211f5bb0cc5754c7697120eed2c174400000082000d000000045358514500000002383600000005302e3335360000001a313937302d30312d30312030303a30303a30302e34393030303000000005302e343238000000062d31303232310000000732353634363235ffffffff0000000238390000000166000000045045484e0000000a323031352d31302d3038ffffffff\n" + - "<430000000f53454c45435420302030005a0000000549\n" + - "<5400000128000d730000000000000000000413000000000000000069000000000000000000001700000000000000006400000000000000000002bd00000000000000007400000000000000000004a000000000000000006600000000000000000002bc00000000000000005f73686f7274000000000000000000001500000000000000006c0000000000000000000014000000000000000074733200000000000000000004a000000000000000006262000000000000000000001500000000000000006200000000000000000000100000000000000000726e645f73796d626f6c00000000000000000004130000000000000000726e645f64617465000000000000000000043a0000000000000000726e645f62696e00000000000000000000110000000000000001\n"; + ">5800000004\n"; assertHexScript(script); } @@ -923,7 +1167,12 @@ public class WireParserTest extends AbstractGriffinTest { } private void assertHexScript(String script) throws Exception { - assertHexScript(NetworkFacadeImpl.INSTANCE, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration()); + assertHexScript(NetworkFacadeImpl.INSTANCE, NetworkFacadeImpl.INSTANCE, script, new DefaultWireParserConfiguration() { + @Override + public boolean getDumpNetworkTraffic() { + return true; + } + }); } private void assertHexScript( @@ -953,6 +1202,7 @@ public class WireParserTest extends AbstractGriffinTest { try { long sendPtr = sendBuf; + boolean expectDisconnect = false; int mode = 0; int n = script.length(); @@ -967,7 +1217,7 @@ public class WireParserTest extends AbstractGriffinTest { // we were sending - lets wrap up and send if (len > 0) { int m = clientNf.send(clientFd, sendBuf, len); - Assert.assertEquals(len, m); + Assert.assertEquals("disc:" + expectDisconnect, len, m); sendPtr = sendBuf; } } else { @@ -975,15 +1225,21 @@ public class WireParserTest extends AbstractGriffinTest { // and this buffer will also drive the length of the message if (len > 0) { int m = clientNf.recv(clientFd, recvBuf, len); - Assert.assertEquals(len, m); - for (int j = 0; j < len; j++) { - Assert.assertEquals( - Unsafe.getUnsafe().getByte(sendBuf + j), - Unsafe.getUnsafe().getByte(recvBuf + j) - ); + if (expectDisconnect) { + Assert.assertTrue(m < 0); + // force exit + i = n; + } else { + Assert.assertEquals(len, m); + for (int j = 0; j < len; j++) { + Assert.assertEquals( + Unsafe.getUnsafe().getByte(sendBuf + j), + Unsafe.getUnsafe().getByte(recvBuf + j) + ); + } + // clear sendBuf + sendPtr = sendBuf; } - // clear sendBuf - sendPtr = sendBuf; } } @@ -999,20 +1255,54 @@ public class WireParserTest extends AbstractGriffinTest { continue; default: char c2 = script.charAt(i + 1); - byte b = (byte) ((Numbers.hexToDecimal(c1) << 4) | Numbers.hexToDecimal(c2)); - Unsafe.getUnsafe().putByte(sendPtr++, b); + if (c1 == '!' && c2 == '!') { + expectDisconnect = true; + } else { + try { + byte b = (byte) ((Numbers.hexToDecimal(c1) << 4) | Numbers.hexToDecimal(c2)); + Unsafe.getUnsafe().putByte(sendPtr++, b); + } catch (NumericException e) { + e.printStackTrace(); + } + } i += 2; break; } } + + // this we do final receive (or send) when we don't have + // any more script left to process + int len = (int) (sendPtr - sendBuf); + if (mode == 0) { + // we were sending - lets wrap up and send + if (len > 0) { + int m = clientNf.send(clientFd, sendBuf, len); + Assert.assertEquals(len, m); + } + } else { + // we meant to receive; sendBuf will contain expected bytes we have to receive + // and this buffer will also drive the length of the message + if (len > 0 || expectDisconnect) { + int m = clientNf.recv(clientFd, recvBuf, len); + if (expectDisconnect) { + Assert.assertTrue(m < 0); + } else { + Assert.assertEquals(len, m); + for (int j = 0; j < len; j++) { + Assert.assertEquals( + Unsafe.getUnsafe().getByte(sendBuf + j), + Unsafe.getUnsafe().getByte(recvBuf + j) + ); + } + } + } + } } finally { Unsafe.free(sendBuf, N); Unsafe.free(recvBuf, N); clientNf.freeSockAddr(sockAddress); clientNf.close(clientFd); } - } catch (Throwable e) { - e.printStackTrace(); } finally { running.set(false); haltLatch.await(); @@ -1216,6 +1506,24 @@ public class WireParserTest extends AbstractGriffinTest { TestUtils.assertEquals(expected, sink); } + @NotNull + private NetworkFacade getFragmentedSendFacade() { + return new NetworkFacadeImpl() { + @Override + public int send(long fd, long buffer, int bufferLen) { + int total = 0; + for (int i = 0; i < bufferLen; i++) { + int n = super.send(fd, buffer + i, 1); + if (n < 0) { + return n; + } + total += n; + } + return total; + } + }; + } + private void startBasicServer( NetworkFacade nf, WireParserConfiguration configuration,