Merge branch develop into master

This commit is contained in:
Xiang Wang
2018-01-24 01:58:01 -05:00
136 changed files with 30404 additions and 380 deletions

2
.gitignore vendored
View File

@@ -30,6 +30,8 @@ bin
# sigs dir is handled externally
signatures
# but not the regression tests
!tools/hscollider/test_cases/signatures
# ignore pcre symlink if it exists
pcre

View File

@@ -2,6 +2,18 @@
This is a list of notable changes to Hyperscan, in reverse chronological order.
## [4.7.0] 2018-01-24
- Introduced hscollider pattern testing tool, for validating Hyperscan match
behaviour against PCRE.
- Introduced hscheck pattern compilation tool.
- Introduced hsdump development tool for producing information about Hyperscan
pattern compilation.
- New API feature: extended approximate matching support for Hamming distance.
- Bugfix for issue #69: Force C++ linkage in Xcode.
- Bugfix for issue #73: More documentation for `hs_close_stream()`.
- Bugfix for issue #78: Fix for fat runtime initialisation when used as a
shared library.
## [4.6.0] 2017-09-22
- New API feature: stream state compression. This allows the user to compress
and restore state for streams to reduce memory usage.

View File

@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 2.8.11)
project (hyperscan C CXX)
set (HS_MAJOR_VERSION 4)
set (HS_MINOR_VERSION 6)
set (HS_MINOR_VERSION 7)
set (HS_PATCH_VERSION 0)
set (HS_VERSION ${HS_MAJOR_VERSION}.${HS_MINOR_VERSION}.${HS_PATCH_VERSION})
@@ -30,7 +30,7 @@ else()
message(STATUS "Build type ${CMAKE_BUILD_TYPE}")
endif()
if(CMAKE_BUILD_TYPE MATCHES RELEASE|RELWITHDEBINFO)
if(CMAKE_BUILD_TYPE MATCHES RELEASE|RELWITHDEBINFO|MINSIZEREL)
set(RELEASE_BUILD TRUE)
else()
set(RELEASE_BUILD FALSE)
@@ -218,8 +218,13 @@ else()
endif()
if(OPTIMISE)
set(OPT_C_FLAG "-O3")
set(OPT_CXX_FLAG "-O2")
if (NOT CMAKE_BUILD_TYPE MATCHES MINSIZEREL)
set(OPT_C_FLAG "-O3")
set(OPT_CXX_FLAG "-O2")
else ()
set(OPT_C_FLAG "-Os")
set(OPT_CXX_FLAG "-Os")
endif ()
else()
set(OPT_C_FLAG "-O0")
set(OPT_CXX_FLAG "-O0")
@@ -423,10 +428,10 @@ endif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
if(NOT WIN32)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable=remark")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 279 -diag-disable=remark")
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 1170 -diag-disable 3373 -diag-disable=remark")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -diag-error 10006 -diag-disable 68 -diag-disable 177 -diag-disable 186 -diag-disable 2304 -diag-disable 2305 -diag-disable 2338 -diag-disable 1418 -diag-disable 1170 -diag-disable 3373 -diag-disable 279 -diag-disable=remark")
endif()
endif()
@@ -1271,25 +1276,42 @@ if (NOT BUILD_SHARED_LIBS)
endif()
if (BUILD_STATIC_AND_SHARED OR BUILD_SHARED_LIBS)
if (NOT FAT_RUNTIME)
add_library(hs_shared SHARED src/hs_version.c src/hs_valid_platform.c
$<TARGET_OBJECTS:hs_compile_shared> $<TARGET_OBJECTS:hs_exec_shared>)
else()
add_library(hs_shared SHARED src/hs_version.c src/hs_valid_platform.c
$<TARGET_OBJECTS:hs_compile_shared> $<TARGET_OBJECTS:hs_exec_common_shared>
${RUNTIME_SHLIBS})
set(hs_shared_SRCS
src/hs_version.c
src/hs_valid_platform.c
$<TARGET_OBJECTS:hs_compile_shared>)
if (XCODE)
# force this lib to use C++ linkage
add_custom_command(OUTPUT empty.cxx
COMMAND ${CMAKE_COMMAND} -E touch empty.cxx)
set (hs_shared_SRCS ${hs_shared_SRCS} empty.cxx)
endif (XCODE)
if (NOT FAT_RUNTIME)
set(hs_shared_SRCS
${hs_shared_SRCS}
$<TARGET_OBJECTS:hs_exec_shared>)
else ()
set(hs_shared_SRCS
${hs_shared_SRCS}
$<TARGET_OBJECTS:hs_exec_common_shared>
${RUNTIME_SHLIBS})
endif ()
add_library(hs_shared SHARED ${hs_shared_SRCS})
endif()
add_dependencies(hs_shared ragel_Parser)
set_target_properties(hs_shared PROPERTIES
OUTPUT_NAME hs
VERSION ${LIB_VERSION}
SOVERSION ${LIB_SOVERSION}
MACOSX_RPATH ON)
install(TARGETS hs_shared
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(TARGETS hs_shared
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
# used by tools and other targets

64
cmake/pcre.cmake Normal file
View File

@@ -0,0 +1,64 @@
# first look in pcre-$version or pcre subdirs
if (PCRE_SOURCE)
# either provided on cmdline or we've seen it already
set (PCRE_BUILD_SOURCE TRUE)
elseif (EXISTS ${PROJECT_SOURCE_DIR}/pcre-${PCRE_REQUIRED_VERSION})
set (PCRE_SOURCE ${PROJECT_SOURCE_DIR}/pcre-${PCRE_REQUIRED_VERSION})
set (PCRE_BUILD_SOURCE TRUE)
elseif (EXISTS ${PROJECT_SOURCE_DIR}/pcre)
set (PCRE_SOURCE ${PROJECT_SOURCE_DIR}/pcre)
set (PCRE_BUILD_SOURCE TRUE)
endif()
if (PCRE_BUILD_SOURCE)
if (NOT IS_ABSOLUTE ${PCRE_SOURCE})
set(PCRE_SOURCE "${CMAKE_BINARY_DIR}/${PCRE_SOURCE}")
endif ()
set (saved_INCLUDES "${CMAKE_REQUIRED_INCLUDES}")
set (CMAKE_REQUIRED_INCLUDES "${CMAKE_REQUIRED_INCLUDES} ${PCRE_SOURCE}")
if (PCRE_CHECKED)
set(PCRE_INCLUDE_DIRS ${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre)
set(PCRE_LDFLAGS -L"${LIBDIR}" -lpcre)
# already processed this file and set up pcre building
return()
endif ()
# first, check version number
CHECK_C_SOURCE_COMPILES("#include <pcre.h.generic>
#if PCRE_MAJOR != ${PCRE_REQUIRED_MAJOR_VERSION} || PCRE_MINOR != ${PCRE_REQUIRED_MINOR_VERSION}
#error Incorrect pcre version
#endif
main() {}" CORRECT_PCRE_VERSION)
set (CMAKE_REQUIRED_INCLUDES "${saved_INCLUDES}")
if (NOT CORRECT_PCRE_VERSION)
unset(CORRECT_PCRE_VERSION CACHE)
message(STATUS "Incorrect version of pcre - version ${PCRE_REQUIRED_VERSION} is required")
return ()
else()
message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION} - building from source.")
endif()
# PCRE compile options
option(PCRE_BUILD_PCRECPP OFF)
option(PCRE_BUILD_PCREGREP OFF)
option(PCRE_SHOW_REPORT OFF)
set(PCRE_SUPPORT_UNICODE_PROPERTIES ON CACHE BOOL "Build pcre with unicode")
add_subdirectory(${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre EXCLUDE_FROM_ALL)
set(PCRE_INCLUDE_DIRS ${PCRE_SOURCE} ${PROJECT_BINARY_DIR}/pcre)
set(PCRE_LDFLAGS -L"${LIBDIR}" -lpcre)
else ()
# pkgconf should save us
find_package(PkgConfig)
pkg_check_modules(PCRE libpcre=${PCRE_REQUIRED_VERSION})
if (PCRE_FOUND)
message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION}")
else ()
message(STATUS "PCRE version ${PCRE_REQUIRED_VERSION} not found")
return ()
endif ()
endif (PCRE_BUILD_SOURCE)
set (PCRE_CHECKED TRUE PARENT_SCOPE)

View File

@@ -44,7 +44,7 @@ else()
# build sqlite as a static lib to compile into our test programs
add_library(sqlite3_static STATIC "${PROJECT_SOURCE_DIR}/sqlite3/sqlite3.c")
if (NOT WIN32)
set_target_properties(sqlite3_static PROPERTIES COMPILE_FLAGS "-Wno-unused -Wno-cast-qual -DSQLITE_OMIT_LOAD_EXTENSION")
set_target_properties(sqlite3_static PROPERTIES COMPILE_FLAGS "-Wno-error -Wno-extra -Wno-unused -Wno-cast-qual -DSQLITE_OMIT_LOAD_EXTENSION")
endif()
endif()
endif()

View File

@@ -2,3 +2,9 @@
.regexp {
color: darkred !important;
}
/* Avoid (the alabaster theme default) Goudy Old Style, which renders in
* italics on some Mac/Safari systems. */
body {
font-family: 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif;
}

View File

@@ -287,6 +287,7 @@ which provides the following fields:
* ``min_length``: The minimum match length (from start to end) required to
successfully match this expression.
* ``edit_distance``: Match this expression within a given Levenshtein distance.
* ``hamming_distance``: Match this expression within a given Hamming distance.
These parameters either allow the set of matches produced by a pattern to be
constrained at compile time (rather than relying on the application to process
@@ -299,10 +300,15 @@ and a ``max_offset`` of 15 will not produce matches when scanned against
streams ``foo0123bar`` or ``foo0123456bar``.
Similarly, the pattern :regexp:`/foobar/` when given an ``edit_distance`` of 2
will produce matches when scanned against ``foobar``, ``fooba``, ``fobr``,
``fo_baz``, ``foooobar``, and anything else that lies within edit distance of 2
(as defined by Levenshtein distance). For more details, see the
:ref:`approximate_matching` section.
will produce matches when scanned against ``foobar``, ``f00bar``, ``fooba``,
``fobr``, ``fo_baz``, ``foooobar``, and anything else that lies within edit
distance of 2 (as defined by Levenshtein distance).
When the same pattern :regexp:`/foobar/` is given a ``hamming_distance`` of 2,
it will produce matches when scanned against ``foobar``, ``boofar``,
``f00bar``, and anything else with at most two characters substituted from the
original pattern. For more details, see the :ref:`approximate_matching`
section.
=================
Prefiltering Mode
@@ -377,7 +383,7 @@ The :c:type:`hs_platform_info_t` structure has two fields:
#. ``cpu_features``: This allows the application to specify a mask of CPU
features that may be used on the target platform. For example,
:c:member:`HS_CPU_FEATURES_AVX2` can be specified for Intel\ |reg| Advanced
Vector Extensions +2 (Intel\ |reg| AVX2) instruction set support. If a flag
Vector Extensions 2 (Intel\ |reg| AVX2) instruction set support. If a flag
for a particular CPU feature is specified, the database will not be usable on
a CPU without that feature.
@@ -398,13 +404,20 @@ follows:
#. **Edit distance** is defined as Levenshtein distance. That is, there are
three possible edit types considered: insertion, removal and substitution.
More formal description can be found on
`Wikipedia <https://en.wikipedia.org/wiki/Levenshtein_distance>`_.
A more formal description can be found on
`Wikipedia <https://en.wikipedia.org/wiki/Levenshtein_distance>`__.
#. **Approximate matching** will match all *corpora* within a given edit
distance. That is, given a pattern, approximate matching will match anything
that can be edited to arrive at a corpus that exactly matches the original
pattern.
#. **Hamming distance** is the number of positions by which two strings of
equal length differ. That is, it is the number of substitutions required to
convert one string to the other. There are no insertions or removals when
approximate matching using a Hamming distance. A more formal description can
be found on
`Wikipedia <https://en.wikipedia.org/wiki/Hamming_distance>`__.
#. **Approximate matching** will match all *corpora* within a given edit or
Hamming distance. That is, given a pattern, approximate matching will match
anything that can be edited to arrive at a corpus that exactly matches the
original pattern.
#. **Matching semantics** are exactly the same as described in :ref:`semantics`.
@@ -437,7 +450,9 @@ matching support. Here they are, in a nutshell:
reduce to so-called "vacuous" patterns (patterns that match everything). For
example, pattern :regexp:`/foo/` with edit distance 3, if implemented,
would reduce to matching zero-length buffers. Such patterns will result in a
"Pattern cannot be approximately matched" compile error.
"Pattern cannot be approximately matched" compile error. Approximate
matching within a Hamming distance does not remove symbols, so will not
reduce to a vacuous pattern.
* Finally, due to the inherent complexities of defining matching behavior,
approximate matching implements a reduced subset of regular expression
syntax. Approximate matching does not support UTF-8 (and other

View File

@@ -44,7 +44,7 @@ master_doc = 'index'
# General information about the project.
project = u'Hyperscan'
copyright = u'2015-2017, Intel Corporation'
copyright = u'2015-2018, Intel Corporation'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the

View File

@@ -30,4 +30,4 @@ and/or other countries.
\*Other names and brands may be claimed as the property of others.
Copyright |copy| 2015-2017, Intel Corporation. All rights reserved.
Copyright |copy| 2015-2018, Intel Corporation. All rights reserved.

View File

@@ -820,7 +820,7 @@ EXCLUDE_PATTERNS =
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
EXCLUDE_SYMBOLS =
EXCLUDE_SYMBOLS = "HS_CDECL"
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
@@ -1959,7 +1959,7 @@ ENABLE_PREPROCESSING = YES
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
MACRO_EXPANSION = NO
MACRO_EXPANSION = YES
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
@@ -1967,7 +1967,7 @@ MACRO_EXPANSION = NO
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
EXPAND_ONLY_PREDEF = NO
EXPAND_ONLY_PREDEF = YES
# If the SEARCH_INCLUDES tag is set to YES, the include files in the
# INCLUDE_PATH will be searched if a #include is found.
@@ -1999,7 +1999,7 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
PREDEFINED =
PREDEFINED = "HS_CDECL="
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The

View File

@@ -33,11 +33,21 @@ See :c:type:`match_event_handler` for more information.
Streaming Mode
**************
The streaming runtime API consists of functions to open, scan, and close
Hyperscan data streams -- these functions being :c:func:`hs_open_stream`,
:c:func:`hs_scan_stream`, and :c:func:`hs_close_stream`. Any matches detected
in the written data are returned to the calling application via a function
pointer callback.
The core of the Hyperscan streaming runtime API consists of functions to open,
scan, and close Hyperscan data streams:
* :c:func:`hs_open_stream`: allocates and initializes a new stream for scanning.
* :c:func:`hs_scan_stream`: scans a block of data in a given stream, raising
matches as they are detected.
* :c:func:`hs_close_stream`: completes scanning of a given stream (raising any
matches that occur at the end of the stream) and frees the stream state. After
a call to :c:func:`hs_close_stream`, the stream handle is invalid and should
not be used again for any purpose.
Any matches detected in the data as it is scanned are returned to the calling
application via a function pointer callback.
The match callback function has the capability to halt scanning of the current
data stream by returning a non-zero value. In streaming mode, the result of

View File

@@ -6,6 +6,30 @@ Tools
This section describes the set of utilities included with the Hyperscan library.
********************
Quick Check: hscheck
********************
The ``hscheck`` tool allows the user to quickly check whether Hyperscan supports
a group of patterns. If a pattern is rejected by Hyperscan's compiler, the
compile error is provided on standard output.
For example, given the following three patterns (the last of which contains a
syntax error) in a file called ``/tmp/test``::
1:/foo.*bar/
2:/abc|def|ghi/
3:/((foo|bar)/
... the ``hscheck`` tool will produce the following output::
$ bin/hscheck -e /tmp/test
OK: 1:/foo.*bar/
OK: 2:/abc|def|ghi/
FAIL (compile): 3:/((foo|bar)/: Missing close parenthesis for group started at index 0.
SUMMARY: 1 of 3 failed.
********************
Benchmarker: hsbench
********************
@@ -62,6 +86,129 @@ to complete all of them.
using a utility like ``taskset`` to lock the hsbench process to one core and
minimize jitter due to the operating system's scheduler.
*******************************
Correctness Testing: hscollider
*******************************
The ``hscollider`` tool, or Pattern Collider, provides a way to verify
Hyperscan's matching behaviour. It does this by compiling and scanning patterns
(either singly or in groups) against known corpora and comparing the results
against another engine (the "ground truth"). Two sources of ground truth for
comparison are available:
* The PCRE library (http://pcre.org/).
* An NFA simulation run on Hyperscan's compile-time graph representation. This
is used if PCRE cannot support the pattern or if PCRE execution fails due to
a resource limit.
Much of Hyperscan's testing infrastructure is built on ``hscollider``, and the
tool is designed to take advantage of multiple cores and provide considerable
flexibility in controlling the test. These options are described in the help
(``hscollider -h``) and include:
* Testing in streaming, block or vectored mode.
* Testing corpora at different alignments in memory.
* Testing patterns in groups of varying size.
* Manipulating stream state or scratch space between tests.
* Cross-compilation and serialization/deserialization of databases.
* Synthetic generation of corpora given a pattern set.
Using hscollider to debug a pattern
===================================
One common use-case for ``hscollider`` is to determine whether Hyperscan will
match a pattern in the expected location, and whether this accords with PCRE's
behaviour for the same case.
Here is an example. We put our pattern in a file in Hyperscan's pattern
format::
$ cat /tmp/pat
1:/hatstand.*badgerbrush/
We put the corpus to be scanned in another file, with the same numeric
identifier at the start to indicate that it should match pattern 1::
$ cat /tmp/corpus
1:__hatstand__hatstand__badgerbrush_badgerbrush
Then we can run ``hscollider`` with its verbosity turned up (``-vv``) so that
individual matches are displayed in the output::
$ bin/ue2collider -e /tmp/pat -c /tmp/corpus -Z 0 -T 1 -vv
ue2collider: The Pattern Collider Mark II
Number of threads: 1 (1 scanner, 1 generator)
Expression path: /tmp/pat
Signature files: none
Mode of operation: block mode
UE2 scan alignment: 0
Corpora read from file: /tmp/corpus
Running single-pattern/single-compile test for 1 expressions.
PCRE Match @ (2,45)
PCRE Match @ (2,33)
PCRE Match @ (12,45)
PCRE Match @ (12,33)
UE2 Match @ (0,33) for 1
UE2 Match @ (0,45) for 1
Scan call returned 0
PASSED: id 1, alignment 0, corpus 0 (matched pcre:2, ue2:2)
Thread 0 processed 1 units.
Summary:
Mode: Single/Block
=========
Expressions processed: 1
Corpora processed: 1
Expressions with failures: 0
Corpora generation failures: 0
Compilation failures: pcre:0, ng:0, ue2:0
Matching failures: pcre:0, ng:0, ue2:0
Match differences: 0
No ground truth: 0
Total match differences: 0
Total elapsed time: 0.00522815 secs.
We can see from this output that both PCRE and Hyperscan find matches ending at
offset 33 and 45, and so ``hscollider`` considers this test case to have
passed.
(In the example command line above, ``-Z 0`` instructs us to only test at
corpus alignment 0, and ``-T 1`` instructs us to only use one thread.)
.. note:: In default operation, PCRE produces only one match for a scan, unlike
Hyperscan's automata semantics. The ``hscollider`` tool uses libpcre's
"callout" functionality to match Hyperscan's semantics.
Running a larger scan test
==========================
A set of patterns for testing purposes are distributed with Hyperscan, and these
can be tested via ``hscollider`` on an in-tree build. Two CMake targets are
provided to do this easily:
================================= =====================================
Make Target Description
================================= =====================================
``make collide_quick_test`` Tests all patterns in streaming mode.
``make collide_quick_test_block`` Tests all patterns in block mode.
================================= =====================================
*****************
Debugging: hsdump
*****************
When built in debug mode (using the CMake directive ``CMAKE_BUILD_TYPE`` set to
``Debug``), Hyperscan includes support for dumping information about its
internals during pattern compilation with the ``hsdump`` tool.
This information is mostly of use to Hyperscan developers familiar with the
library's internal structure, but can be used to diagnose issues with patterns
and provide more information in bug reports.
.. _tools_pattern_format:
**************

View File

@@ -78,7 +78,8 @@ void validateExt(const hs_expr_ext &ext) {
static const unsigned long long ALL_EXT_FLAGS = HS_EXT_FLAG_MIN_OFFSET |
HS_EXT_FLAG_MAX_OFFSET |
HS_EXT_FLAG_MIN_LENGTH |
HS_EXT_FLAG_EDIT_DISTANCE;
HS_EXT_FLAG_EDIT_DISTANCE |
HS_EXT_FLAG_HAMMING_DISTANCE;
if (ext.flags & ~ALL_EXT_FLAGS) {
throw CompileError("Invalid hs_expr_ext flag set.");
}
@@ -96,6 +97,13 @@ void validateExt(const hs_expr_ext &ext) {
throw CompileError("In hs_expr_ext, min_length must be less than or "
"equal to max_offset.");
}
if ((ext.flags & HS_EXT_FLAG_EDIT_DISTANCE) &&
(ext.flags & HS_EXT_FLAG_HAMMING_DISTANCE)) {
throw CompileError("In hs_expr_ext, cannot have both edit distance and "
"Hamming distance.");
}
}
ParsedExpression::ParsedExpression(unsigned index_in, const char *expression,
@@ -103,7 +111,7 @@ ParsedExpression::ParsedExpression(unsigned index_in, const char *expression,
const hs_expr_ext *ext)
: expr(index_in, flags & HS_FLAG_ALLOWEMPTY, flags & HS_FLAG_SINGLEMATCH,
false, flags & HS_FLAG_PREFILTER, SOM_NONE, report, 0, MAX_OFFSET,
0, 0) {
0, 0, 0) {
ParseMode mode(flags);
component = parse(expression, mode);
@@ -158,6 +166,9 @@ ParsedExpression::ParsedExpression(unsigned index_in, const char *expression,
if (ext->flags & HS_EXT_FLAG_EDIT_DISTANCE) {
expr.edit_distance = ext->edit_distance;
}
if (ext->flags & HS_EXT_FLAG_HAMMING_DISTANCE) {
expr.hamm_distance = ext->hamming_distance;
}
}
// These are validated in validateExt, so an error will already have been

View File

@@ -45,11 +45,13 @@ public:
ExpressionInfo(unsigned int index_in, bool allow_vacuous_in,
bool highlander_in, bool utf8_in, bool prefilter_in,
som_type som_in, ReportID report_in, u64a min_offset_in,
u64a max_offset_in, u64a min_length_in, u32 edit_distance_in)
u64a max_offset_in, u64a min_length_in, u32 edit_distance_in,
u32 hamm_distance_in)
: index(index_in), report(report_in), allow_vacuous(allow_vacuous_in),
highlander(highlander_in), utf8(utf8_in), prefilter(prefilter_in),
som(som_in), min_offset(min_offset_in), max_offset(max_offset_in),
min_length(min_length_in), edit_distance(edit_distance_in) {}
min_length(min_length_in), edit_distance(edit_distance_in),
hamm_distance(hamm_distance_in) {}
/**
* \brief Index of the expression represented by this graph.
@@ -95,6 +97,7 @@ public:
* 0 if not used.
*/
u32 edit_distance;
u32 hamm_distance;
};
}

View File

@@ -30,7 +30,7 @@
#include "hs_common.h"
#include "hs_runtime.h"
#include "ue2common.h"
#include "util/cpuid_flags.h"
#include "util/cpuid_inline.h"
#include "util/join.h"
#if defined(DISABLE_AVX512_DISPATCH)

View File

@@ -45,6 +45,7 @@
#include "parser/unsupported.h"
#include "util/compile_error.h"
#include "util/cpuid_flags.h"
#include "util/cpuid_inline.h"
#include "util/depth.h"
#include "util/popcount.h"
#include "util/target_info.h"

View File

@@ -143,7 +143,7 @@ hs_error_t HS_CDECL hs_deserialize_database(const char *bytes,
* by @ref hs_serialize_database() at a given memory location.
*
* This function (unlike @ref hs_deserialize_database()) will write the
* reconstructed database to the memory location given in the @a db parameter.
* reconstructed database to the memory location given in the @p db parameter.
* The amount of space required at this location can be determined with the
* @ref hs_serialized_database_size() function.
*
@@ -479,6 +479,10 @@ hs_error_t HS_CDECL hs_valid_platform(void);
/**
* A parameter passed to this function was invalid.
*
* This error is only returned in cases where the function can detect an
* invalid parameter -- it cannot be relied upon to detect (for example)
* pointers to freed memory or other invalid data.
*/
#define HS_INVALID (-1)

View File

@@ -258,6 +258,13 @@ typedef struct hs_expr_ext {
* hs_expr_ext::flags field.
*/
unsigned edit_distance;
/**
* Allow patterns to approximately match within this Hamming distance. To
* use this parameter, set the @ref HS_EXT_FLAG_HAMMING_DISTANCE flag in the
* hs_expr_ext::flags field.
*/
unsigned hamming_distance;
} hs_expr_ext_t;
/**
@@ -281,6 +288,9 @@ typedef struct hs_expr_ext {
/** Flag indicating that the hs_expr_ext::edit_distance field is used. */
#define HS_EXT_FLAG_EDIT_DISTANCE 8ULL
/** Flag indicating that the hs_expr_ext::hamming_distance field is used. */
#define HS_EXT_FLAG_HAMMING_DISTANCE 16ULL
/** @} */
/**
@@ -293,9 +303,9 @@ typedef struct hs_expr_ext {
* @param expression
* The NULL-terminated expression to parse. Note that this string must
* represent ONLY the pattern to be matched, with no delimiters or flags;
* any global flags should be specified with the @a flags argument. For
* any global flags should be specified with the @p flags argument. For
* example, the expression `/abc?def/i` should be compiled by providing
* `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a
* `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a
* flags.
*
* @param flags
@@ -362,8 +372,8 @@ hs_error_t HS_CDECL hs_compile(const char *expression, unsigned int flags,
* hs_compile()) these strings must contain only the pattern to be
* matched, with no delimiters or flags. For example, the expression
* `/abc?def/i` should be compiled by providing `abc?def` as the first
* string in the @a expressions array, and @ref HS_FLAG_CASELESS as the
* first value in the @a flags array.
* string in the @p expressions array, and @ref HS_FLAG_CASELESS as the
* first value in the @p flags array.
*
* @param flags
* Array of flags which modify the behaviour of each expression. Multiple
@@ -418,7 +428,7 @@ hs_error_t HS_CDECL hs_compile(const char *expression, unsigned int flags,
*
* @return
* @ref HS_SUCCESS is returned on successful compilation; @ref
* HS_COMPILER_ERROR on failure, with details provided in the @a error
* HS_COMPILER_ERROR on failure, with details provided in the @p error
* parameter.
*
*/
@@ -442,8 +452,8 @@ hs_error_t HS_CDECL hs_compile_multi(const char *const *expressions,
* hs_compile()) these strings must contain only the pattern to be
* matched, with no delimiters or flags. For example, the expression
* `/abc?def/i` should be compiled by providing `abc?def` as the first
* string in the @a expressions array, and @ref HS_FLAG_CASELESS as the
* first value in the @a flags array.
* string in the @p expressions array, and @ref HS_FLAG_CASELESS as the
* first value in the @p flags array.
*
* @param flags
* Array of flags which modify the behaviour of each expression. Multiple
@@ -505,7 +515,7 @@ hs_error_t HS_CDECL hs_compile_multi(const char *const *expressions,
*
* @return
* @ref HS_SUCCESS is returned on successful compilation; @ref
* HS_COMPILER_ERROR on failure, with details provided in the @a error
* HS_COMPILER_ERROR on failure, with details provided in the @p error
* parameter.
*
*/
@@ -549,9 +559,9 @@ hs_error_t HS_CDECL hs_free_compile_error(hs_compile_error_t *error);
* @param expression
* The NULL-terminated expression to parse. Note that this string must
* represent ONLY the pattern to be matched, with no delimiters or flags;
* any global flags should be specified with the @a flags argument. For
* any global flags should be specified with the @p flags argument. For
* example, the expression `/abc?def/i` should be compiled by providing
* `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a
* `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a
* flags.
*
* @param flags
@@ -611,9 +621,9 @@ hs_error_t HS_CDECL hs_expression_info(const char *expression,
* @param expression
* The NULL-terminated expression to parse. Note that this string must
* represent ONLY the pattern to be matched, with no delimiters or flags;
* any global flags should be specified with the @a flags argument. For
* any global flags should be specified with the @p flags argument. For
* example, the expression `/abc?def/i` should be compiled by providing
* `abc?def` as the @a expression, and @ref HS_FLAG_CASELESS as the @a
* `abc?def` as the @p expression, and @ref HS_FLAG_CASELESS as the @a
* flags.
*
* @param flags

View File

@@ -101,7 +101,7 @@ typedef struct hs_scratch hs_scratch_t;
* - If the start of match value lies outside this horizon (possible only
* when the SOM_HORIZON value is not @ref HS_MODE_SOM_HORIZON_LARGE),
* the @a from value will be set to @ref HS_OFFSET_PAST_HORIZON.
* the @p from value will be set to @ref HS_OFFSET_PAST_HORIZON.
* - This argument will be set to zero if the Start of Match flag is not
* enabled for the given pattern.
@@ -193,6 +193,12 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data,
/**
* Close a stream.
*
* This function completes matching on the given stream and frees the memory
* associated with the stream state. After this call, the stream pointed to by
* @p id is invalid and can no longer be used. To reuse the stream state after
* completion, rather than closing it, the @ref hs_reset_stream function can be
* used.
*
* This function must be called for any stream created with @ref
* hs_open_stream(), even if scanning has been terminated by a non-zero return
* from the match callback function.
@@ -210,7 +216,7 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data,
*
* @param scratch
* A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is
* allowed to be NULL only if the @a onEvent callback is also NULL.
* allowed to be NULL only if the @p onEvent callback is also NULL.
*
* @param onEvent
* Pointer to a match event callback function. If a NULL pointer is given,
@@ -251,7 +257,7 @@ hs_error_t HS_CDECL hs_close_stream(hs_stream_t *id, hs_scratch_t *scratch,
*
* @param scratch
* A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is
* allowed to be NULL only if the @a onEvent callback is also NULL.
* allowed to be NULL only if the @p onEvent callback is also NULL.
*
* @param onEvent
* Pointer to a match event callback function. If a NULL pointer is given,
@@ -287,7 +293,7 @@ hs_error_t HS_CDECL hs_copy_stream(hs_stream_t **to_id,
/**
* Duplicate the given 'from' stream state onto the 'to' stream. The 'to' stream
* will first be reset (reporting any EOD matches if a non-NULL @a onEvent
* will first be reset (reporting any EOD matches if a non-NULL @p onEvent
* callback handler is provided).
*
* Note: the 'to' stream and the 'from' stream must be open against the same
@@ -302,7 +308,7 @@ hs_error_t HS_CDECL hs_copy_stream(hs_stream_t **to_id,
*
* @param scratch
* A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is
* allowed to be NULL only if the @a onEvent callback is also NULL.
* allowed to be NULL only if the @p onEvent callback is also NULL.
*
* @param onEvent
* Pointer to a match event callback function. If a NULL pointer is given,
@@ -325,10 +331,10 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id,
* Creates a compressed representation of the provided stream in the buffer
* provided. This compressed representation can be converted back into a stream
* state by using @ref hs_expand_stream() or @ref hs_reset_and_expand_stream().
* The size of the compressed representation will be placed into @a used_space.
* The size of the compressed representation will be placed into @p used_space.
*
* If there is not sufficient space in the buffer to hold the compressed
* represention, @ref HS_INSUFFICIENT_SPACE will be returned and @a used_space
* representation, @ref HS_INSUFFICIENT_SPACE will be returned and @p used_space
* will be populated with the amount of space required.
*
* Note: this function does not close the provided stream, you may continue to
@@ -340,15 +346,15 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id,
* @param buf
* Buffer to write the compressed representation into. Note: if the call is
* just being used to determine the amount of space required, it is allowed
* to pass NULL here and @a buf_space as 0.
* to pass NULL here and @p buf_space as 0.
*
* @param buf_space
* The number of bytes in @a buf. If buf_space is too small, the call will
* The number of bytes in @p buf. If buf_space is too small, the call will
* fail with @ref HS_INSUFFICIENT_SPACE.
*
* @param used_space
* Pointer to where the amount of used space will be written to. The used
* buffer space is always less than or equal to @a buf_space. If the call
* buffer space is always less than or equal to @p buf_space. If the call
* fails with @ref HS_INSUFFICIENT_SPACE, this pointer will be used to
* write out the amount of buffer space required.
*
@@ -363,8 +369,8 @@ hs_error_t HS_CDECL hs_compress_stream(const hs_stream_t *stream, char *buf,
* Decompresses a compressed representation created by @ref hs_compress_stream()
* into a new stream.
*
* Note: @a buf must correspond to a complete compressed representation created
* by @ref hs_compress_stream() of a stream that was opened against @a db. It is
* Note: @p buf must correspond to a complete compressed representation created
* by @ref hs_compress_stream() of a stream that was opened against @p db. It is
* not always possible to detect misuse of this API and behaviour is undefined
* if these properties are not satisfied.
*
@@ -393,19 +399,19 @@ hs_error_t HS_CDECL hs_expand_stream(const hs_database_t *db,
/**
* Decompresses a compressed representation created by @ref hs_compress_stream()
* on top of the 'to' stream. The 'to' stream will first be reset (reporting
* any EOD matches if a non-NULL @a onEvent callback handler is provided).
* any EOD matches if a non-NULL @p onEvent callback handler is provided).
*
* Note: the 'to' stream must be opened against the same database as the
* compressed stream.
*
* Note: @a buf must correspond to a complete compressed representation created
* by @ref hs_compress_stream() of a stream that was opened against @a db. It is
* Note: @p buf must correspond to a complete compressed representation created
* by @ref hs_compress_stream() of a stream that was opened against @p db. It is
* not always possible to detect misuse of this API and behaviour is undefined
* if these properties are not satisfied.
*
* @param to_stream
* A pointer to the generated @ref hs_stream_t will be
* returned; NULL on failure.
* A pointer to a valid stream state. A pointer to the expanded @ref
* hs_stream_t will be returned; NULL on failure.
*
* @param buf
* A compressed representation of a stream. These compressed forms are
@@ -416,7 +422,7 @@ hs_error_t HS_CDECL hs_expand_stream(const hs_database_t *db,
*
* @param scratch
* A per-thread scratch space allocated by @ref hs_alloc_scratch(). This is
* allowed to be NULL only if the @a onEvent callback is also NULL.
* allowed to be NULL only if the @p onEvent callback is also NULL.
*
* @param onEvent
* Pointer to a match event callback function. If a NULL pointer is given,
@@ -492,7 +498,7 @@ hs_error_t HS_CDECL hs_scan(const hs_database_t *db, const char *data,
*
* @param count
* Number of data blocks to scan. This should correspond to the size of
* of the @a data and @a length arrays.
* of the @p data and @p length arrays.
*
* @param flags
* Flags modifying the behaviour of this function. This parameter is

View File

@@ -28,6 +28,7 @@
#include "hs_common.h"
#include "util/cpuid_flags.h"
#include "util/cpuid_inline.h"
HS_PUBLIC_API
hs_error_t HS_CDECL hs_valid_platform(void) {

View File

@@ -347,14 +347,19 @@ bool NG::addGraph(ExpressionInfo &expr, unique_ptr<NGHolder> g_ptr) {
throw CompileError(expr.index, "Pattern can never match.");
}
bool hamming = expr.hamm_distance > 0;
u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance;
DEBUG_PRINTF("edit distance = %u hamming = %s\n", e_dist, hamming ? "true" : "false");
// validate graph's suitability for fuzzing before resolving asserts
validate_fuzzy_compile(g, expr.edit_distance, expr.utf8, cc.grey);
validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey);
resolveAsserts(rm, g, expr);
dumpDotWrapper(g, expr, "02_post_assert_resolve", cc.grey);
assert(allMatchStatesHaveReports(g));
make_fuzzy(g, expr.edit_distance, cc.grey);
make_fuzzy(g, e_dist, hamming, cc.grey);
dumpDotWrapper(g, expr, "02a_post_fuzz", cc.grey);
pruneUseless(g);

View File

@@ -161,14 +161,17 @@ void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
throw CompileError(expr.index, "Pattern can never match.");
}
bool hamming = expr.hamm_distance > 0;
u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance;
// validate graph's suitability for fuzzing
validate_fuzzy_compile(g, expr.edit_distance, expr.utf8, cc.grey);
validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey);
resolveAsserts(rm, g, expr);
assert(allMatchStatesHaveReports(g));
// fuzz graph - this must happen before any transformations are made
make_fuzzy(g, expr.edit_distance, cc.grey);
make_fuzzy(g, e_dist, hamming, cc.grey);
pruneUseless(g);
pruneEmptyVertices(g);

View File

@@ -629,15 +629,6 @@ bool hasExtParams(const ExpressionInfo &expr) {
return false;
}
template<class VertexDepth>
depth maxDistFromStart(const VertexDepth &d) {
if (!d.fromStartDotStar.max.is_unreachable()) {
// A path from startDs, any path, implies we can match at any offset.
return depth::infinity();
}
return d.fromStart.max;
}
static
const depth& maxDistToAccept(const NFAVertexBidiDepth &d) {
if (d.toAccept.max.is_unreachable()) {
@@ -689,7 +680,7 @@ bool isEdgePrunable(const NGHolder &g, const Report &report,
const NFAVertexBidiDepth &dv = depths.at(v_idx);
if (report.minOffset) {
depth max_offset = maxDistFromStart(du) + maxDistToAccept(dv);
depth max_offset = maxDistFromStartOfData(du) + maxDistToAccept(dv);
if (max_offset.is_finite() && max_offset < report.minOffset) {
DEBUG_PRINTF("max_offset=%s too small\n", max_offset.str().c_str());
return true;
@@ -709,7 +700,7 @@ bool isEdgePrunable(const NGHolder &g, const Report &report,
if (report.minLength && is_any_accept(v, g)) {
// Simple take on min_length. If we're an edge to accept and our max
// dist from start is too small, we can be pruned.
const depth &width = du.fromStart.max;
const depth &width = maxDistFromInit(du);
if (width.is_finite() && width < report.minLength) {
DEBUG_PRINTF("max width %s from start too small for min_length\n",
width.str().c_str());
@@ -961,7 +952,7 @@ void removeUnneededOffsetBounds(NGHolder &g, ReportManager &rm) {
replaceReports(g, [&](NFAVertex v, ReportID id) {
const auto &d = depths.at(g[v].index);
const depth &min_depth = min(d.fromStartDotStar.min, d.fromStart.min);
const depth &max_depth = maxDistFromStart(d);
const depth &max_depth = maxDistFromStartOfData(d);
DEBUG_PRINTF("vertex %zu has min_depth=%s, max_depth=%s\n", g[v].index,
min_depth.str().c_str(), max_depth.str().c_str());

View File

@@ -144,6 +144,7 @@ vector<flat_set<NFAVertex>> gatherPredecessorsByDepth(const NGHolder &g,
struct ShadowGraph {
NGHolder &g;
u32 edit_distance;
bool hamming;
map<pair<NFAVertex, u32>, NFAVertex> shadow_map;
map<pair<NFAVertex, u32>, NFAVertex> helper_map;
map<NFAVertex, NFAVertex> clones;
@@ -151,13 +152,17 @@ struct ShadowGraph {
vector<pair<NFAVertex, NFAVertex>> edges_to_be_added;
flat_set<NFAVertex> orig;
ShadowGraph(NGHolder &g_in, u32 ed_in) : g(g_in), edit_distance(ed_in) {}
ShadowGraph(NGHolder &g_in, u32 ed_in, bool hamm_in)
: g(g_in), edit_distance(ed_in), hamming(hamm_in) {}
void fuzz_graph() {
if (edit_distance == 0) {
return;
}
DEBUG_PRINTF("edit distance = %u hamming = %s\n", edit_distance,
hamming ? "true" : "false");
// step 1: prepare the vertices, helpers and shadows according to
// the original graph
prepare_graph();
@@ -167,7 +172,9 @@ struct ShadowGraph {
// step 3: set up reports for newly created vertices (and make clones
// if necessary)
create_reports();
if (!hamming) {
create_reports();
}
// step 4: wire up shadow graph and helpers for insert/replace/remove
connect_shadow_graph();
@@ -244,6 +251,16 @@ private:
// if there's nowhere to go from this vertex, no helper needed
if (proper_out_degree(v, g) < 1) {
DEBUG_PRINTF("No helper for node ID: %zu (level %u)\n",
g[shadow_v].index, dist);
helper_map[make_pair(v, dist)] = shadow_v;
continue;
}
// start and startDs only have helpers for insert, so not Hamming
if (hamming && is_any_start(v, g)) {
DEBUG_PRINTF("No helper for node ID: %zu (level %u)\n",
g[shadow_v].index, dist);
helper_map[make_pair(v, dist)] = shadow_v;
continue;
}
@@ -256,6 +273,8 @@ private:
g[helper_v].char_reach = CharReach::dot();
// do not copy virtual start's assert flags
if (is_virtual_start(v, g)) {
DEBUG_PRINTF("Helper node ID is virtual start: %zu (level %u)\n",
g[helper_v].index, dist);
g[helper_v].assert_flags = 0;
}
helper_map[make_pair(v, dist)] = helper_v;
@@ -272,7 +291,7 @@ private:
const auto &cur_shadow_helper = helper_map[make_pair(v, dist)];
// multiple insert
if (dist > 1) {
if (!hamming && dist > 1) {
const auto &prev_level_helper = helper_map[make_pair(v, dist - 1)];
connect_to_clones(prev_level_helper, cur_shadow_helper);
}
@@ -429,13 +448,15 @@ private:
connect_preds(v, dist);
// handle helpers
if (dist > 0) {
if (!hamming && dist > 0) {
connect_helpers(v, dist);
}
}
// handle removals
connect_removals(v);
if (!hamming) {
connect_removals(v);
}
}
}
@@ -636,8 +657,8 @@ bool will_turn_vacuous(const NGHolder &g, u32 edit_distance) {
return false;
}
void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8,
const Grey &grey) {
void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool hamming,
bool utf8, const Grey &grey) {
if (edit_distance == 0) {
return;
}
@@ -657,13 +678,14 @@ void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8,
"approximate matching.");
}
}
if (will_turn_vacuous(g, edit_distance)) {
if (!hamming && will_turn_vacuous(g, edit_distance)) {
throw CompileError("Approximate matching patterns that reduce to "
"vacuous patterns are disallowed.");
}
}
void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey) {
void make_fuzzy(NGHolder &g, u32 edit_distance, bool hamming,
const Grey &grey) {
if (edit_distance == 0) {
return;
}
@@ -671,7 +693,7 @@ void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey) {
assert(grey.allowApproximateMatching);
assert(grey.maxEditDistance >= edit_distance);
ShadowGraph sg(g, edit_distance);
ShadowGraph sg(g, edit_distance, hamming);
sg.fuzz_graph();
// For safety, enforce limit on actual vertex count.

View File

@@ -40,10 +40,10 @@ struct Grey;
class NGHolder;
class ReportManager;
void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool utf8,
const Grey &grey);
void validate_fuzzy_compile(const NGHolder &g, u32 edit_distance, bool hamming,
bool utf8, const Grey &grey);
void make_fuzzy(NGHolder &g, u32 edit_distance, const Grey &grey);
void make_fuzzy(NGHolder &g, u32 edit_distance, bool hamming, const Grey &grey);
}
#endif // NG_FUZZY_H

View File

@@ -32,7 +32,6 @@
#include "ng_util.h"
#include "grey.h"
#include "ng_depth.h" // for NFAVertexDepth
#include "ng_dump.h"
#include "ng_prune.h"
#include "ue2common.h"
@@ -61,25 +60,6 @@ using boost::make_assoc_property_map;
namespace ue2 {
depth maxDistFromInit(const NFAVertexDepth &vd) {
if (vd.fromStart.max.is_unreachable()) {
return vd.fromStartDotStar.max;
} else if (vd.fromStartDotStar.max.is_unreachable()) {
return vd.fromStart.max;
} else {
return max(vd.fromStartDotStar.max, vd.fromStart.max);
}
}
depth maxDistFromStartOfData(const NFAVertexDepth &vd) {
if (vd.fromStartDotStar.max.is_reachable()) {
/* the irrepressible nature of floating literals cannot be contained */
return depth::infinity();
} else {
return vd.fromStart.max;
}
}
NFAVertex getSoleDestVertex(const NGHolder &g, NFAVertex a) {
assert(a != NGHolder::null_vertex());

View File

@@ -32,6 +32,7 @@
#ifndef NG_UTIL_H
#define NG_UTIL_H
#include "ng_depth.h"
#include "ng_holder.h"
#include "ue2common.h"
#include "util/flat_containers.h"
@@ -40,6 +41,7 @@
#include <boost/graph/depth_first_search.hpp> // for default_dfs_visitor
#include <algorithm>
#include <map>
#include <unordered_map>
#include <vector>
@@ -47,13 +49,29 @@
namespace ue2 {
struct Grey;
struct NFAVertexDepth;
struct ue2_literal;
class depth;
class ReportManager;
depth maxDistFromInit(const NFAVertexDepth &d);
depth maxDistFromStartOfData(const NFAVertexDepth &d);
template<class VertexDepth>
depth maxDistFromInit(const VertexDepth &vd) {
if (vd.fromStart.max.is_unreachable()) {
return vd.fromStartDotStar.max;
} else if (vd.fromStartDotStar.max.is_unreachable()) {
return vd.fromStart.max;
} else {
return std::max(vd.fromStartDotStar.max, vd.fromStart.max);
}
}
template<class VertexDepth>
depth maxDistFromStartOfData(const VertexDepth &vd) {
if (vd.fromStartDotStar.max.is_reachable()) {
/* the irrepressible nature of floating literals cannot be contained */
return depth::infinity();
} else {
return vd.fromStart.max;
}
}
/** True if the given vertex is a dot (reachable on any character). */
template<class GraphT>

View File

@@ -170,7 +170,7 @@ bool shortcutLiteral(NG &ng, const ParsedExpression &pe) {
// XXX: don't shortcut literals with extended params (yet)
if (expr.min_offset || expr.max_offset != MAX_OFFSET || expr.min_length ||
expr.edit_distance) {
expr.edit_distance || expr.hamm_distance) {
DEBUG_PRINTF("extended params not allowed\n");
return false;
}

View File

@@ -27,154 +27,16 @@
*/
#include "cpuid_flags.h"
#include "cpuid_inline.h"
#include "ue2common.h"
#include "hs_compile.h" // for HS_MODE_ flags
#include "hs_internal.h"
#include "util/arch.h"
#ifndef _WIN32
#if !defined(_WIN32) && !defined(CPUID_H_)
#include <cpuid.h>
#endif
// ECX
#define SSE3 (1 << 0)
#define SSSE3 (1 << 9)
#define SSE4_1 (1 << 19)
#define SSE4_2 (1 << 20)
#define POPCNT (1 << 23)
#define XSAVE (1 << 27)
#define AVX (1 << 28)
// EDX
#define FXSAVE (1 << 24)
#define SSE (1 << 25)
#define SSE2 (1 << 26)
#define HTT (1 << 28)
// Structured Extended Feature Flags Enumeration Leaf ECX values
#define BMI (1 << 3)
#define AVX2 (1 << 5)
#define BMI2 (1 << 8)
// Structured Extended Feature Flags Enumeration Leaf EBX values
#define AVX512F (1 << 16)
#define AVX512BW (1 << 30)
// Extended Control Register 0 (XCR0) values
#define XCR0_SSE (1 << 1)
#define XCR0_AVX (1 << 2)
#define XCR0_OPMASK (1 << 5) // k-regs
#define XCR0_ZMM_Hi256 (1 << 6) // upper 256 bits of ZMM0-ZMM15
#define XCR0_Hi16_ZMM (1 << 7) // ZMM16-ZMM31
#define XCR0_AVX512 (XCR0_OPMASK | XCR0_ZMM_Hi256 | XCR0_Hi16_ZMM)
static __inline
void cpuid(unsigned int op, unsigned int leaf, unsigned int *eax,
unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
#ifndef _WIN32
__cpuid_count(op, leaf, *eax, *ebx, *ecx, *edx);
#else
unsigned int a[4];
__cpuidex(a, op, leaf);
*eax = a[0];
*ebx = a[1];
*ecx = a[2];
*edx = a[3];
#endif
}
static inline
u64a xgetbv(u32 op) {
#if defined(_WIN32) || defined(__INTEL_COMPILER)
return _xgetbv(op);
#else
u32 a, d;
__asm__ volatile (
"xgetbv\n"
: "=a"(a),
"=d"(d)
: "c"(op));
return ((u64a)d << 32) + a;
#endif
}
int check_avx2(void) {
#if defined(__INTEL_COMPILER)
return _may_i_use_cpu_feature(_FEATURE_AVX2);
#else
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
/* check AVX is supported and XGETBV is enabled by OS */
if ((ecx & (AVX | XSAVE)) != (AVX | XSAVE)) {
DEBUG_PRINTF("AVX and XSAVE not supported\n");
return 0;
}
/* check that SSE and AVX registers are enabled by OS */
u64a xcr0 = xgetbv(0);
if ((xcr0 & (XCR0_SSE | XCR0_AVX)) != (XCR0_SSE | XCR0_AVX)) {
DEBUG_PRINTF("SSE and AVX registers not enabled\n");
return 0;
}
/* ECX and EDX contain capability flags */
ecx = 0;
cpuid(7, 0, &eax, &ebx, &ecx, &edx);
if (ebx & AVX2) {
DEBUG_PRINTF("AVX2 enabled\n");
return 1;
}
return 0;
#endif
}
int check_avx512(void) {
/*
* For our purposes, having avx512 really means "can we use AVX512BW?"
*/
#if defined(__INTEL_COMPILER)
return _may_i_use_cpu_feature(_FEATURE_AVX512BW | _FEATURE_AVX512VL);
#else
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
/* check XSAVE is enabled by OS */
if (!(ecx & XSAVE)) {
DEBUG_PRINTF("AVX and XSAVE not supported\n");
return 0;
}
/* check that AVX 512 registers are enabled by OS */
u64a xcr0 = xgetbv(0);
if ((xcr0 & XCR0_AVX512) != XCR0_AVX512) {
DEBUG_PRINTF("AVX512 registers not enabled\n");
return 0;
}
/* ECX and EDX contain capability flags */
ecx = 0;
cpuid(7, 0, &eax, &ebx, &ecx, &edx);
if (!(ebx & AVX512F)) {
DEBUG_PRINTF("AVX512F (AVX512 Foundation) instructions not enabled\n");
return 0;
}
if (ebx & AVX512BW) {
DEBUG_PRINTF("AVX512BW instructions enabled\n");
return 1;
}
return 0;
#endif
}
u64a cpuid_flags(void) {
u64a cap = 0;
@@ -200,24 +62,6 @@ u64a cpuid_flags(void) {
return cap;
}
int check_ssse3(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & SSSE3);
}
int check_sse42(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & SSE4_2);
}
int check_popcnt(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & POPCNT);
}
struct family_id {
u32 full_family;
u32 full_model;

View File

@@ -31,6 +31,12 @@
#include "ue2common.h"
#if !defined(_WIN32) && !defined(CPUID_H_)
#include <cpuid.h>
/* system header doesn't have a header guard */
#define CPUID_H_
#endif
#ifdef __cplusplus
extern "C"
{
@@ -41,12 +47,6 @@ u64a cpuid_flags(void);
u32 cpuid_tune(void);
int check_avx512(void);
int check_avx2(void);
int check_ssse3(void);
int check_sse42(void);
int check_popcnt(void);
#ifdef __cplusplus
} /* extern "C" */
#endif

214
src/util/cpuid_inline.h Normal file
View File

@@ -0,0 +1,214 @@
/*
* Copyright (c) 2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CPUID_INLINE_H_
#define CPUID_INLINE_H_
#include "ue2common.h"
#include "cpuid_flags.h"
#if !defined(_WIN32) && !defined(CPUID_H_)
#include <cpuid.h>
/* system header doesn't have a header guard */
#define CPUID_H_
#endif
#ifdef __cplusplus
extern "C"
{
#endif
static inline
void cpuid(unsigned int op, unsigned int leaf, unsigned int *eax,
unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
#ifndef _WIN32
__cpuid_count(op, leaf, *eax, *ebx, *ecx, *edx);
#else
int a[4];
__cpuidex(a, op, leaf);
*eax = a[0];
*ebx = a[1];
*ecx = a[2];
*edx = a[3];
#endif
}
// ECX
#define CPUID_SSE3 (1 << 0)
#define CPUID_SSSE3 (1 << 9)
#define CPUID_SSE4_1 (1 << 19)
#define CPUID_SSE4_2 (1 << 20)
#define CPUID_POPCNT (1 << 23)
#define CPUID_XSAVE (1 << 27)
#define CPUID_AVX (1 << 28)
// EDX
#define CPUID_FXSAVE (1 << 24)
#define CPUID_SSE (1 << 25)
#define CPUID_SSE2 (1 << 26)
#define CPUID_HTT (1 << 28)
// Structured Extended Feature Flags Enumeration Leaf ECX values
#define CPUID_BMI (1 << 3)
#define CPUID_AVX2 (1 << 5)
#define CPUID_BMI2 (1 << 8)
// Structured Extended Feature Flags Enumeration Leaf EBX values
#define CPUID_AVX512F (1 << 16)
#define CPUID_AVX512BW (1 << 30)
// Extended Control Register 0 (XCR0) values
#define CPUID_XCR0_SSE (1 << 1)
#define CPUID_XCR0_AVX (1 << 2)
#define CPUID_XCR0_OPMASK (1 << 5) // k-regs
#define CPUID_XCR0_ZMM_Hi256 (1 << 6) // upper 256 bits of ZMM0-ZMM15
#define CPUID_XCR0_Hi16_ZMM (1 << 7) // ZMM16-ZMM31
#define CPUID_XCR0_AVX512 \
(CPUID_XCR0_OPMASK | CPUID_XCR0_ZMM_Hi256 | CPUID_XCR0_Hi16_ZMM)
static inline
u64a xgetbv(u32 op) {
#if defined(_WIN32) || defined(__INTEL_COMPILER)
return _xgetbv(op);
#else
u32 a, d;
__asm__ volatile (
"xgetbv\n"
: "=a"(a),
"=d"(d)
: "c"(op));
return ((u64a)d << 32) + a;
#endif
}
static inline
int check_avx2(void) {
#if defined(__INTEL_COMPILER)
return _may_i_use_cpu_feature(_FEATURE_AVX2);
#else
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
/* check AVX is supported and XGETBV is enabled by OS */
if ((ecx & (CPUID_AVX | CPUID_XSAVE)) != (CPUID_AVX | CPUID_XSAVE)) {
DEBUG_PRINTF("AVX and XSAVE not supported\n");
return 0;
}
/* check that SSE and AVX registers are enabled by OS */
u64a xcr0 = xgetbv(0);
if ((xcr0 & (CPUID_XCR0_SSE | CPUID_XCR0_AVX)) !=
(CPUID_XCR0_SSE | CPUID_XCR0_AVX)) {
DEBUG_PRINTF("SSE and AVX registers not enabled\n");
return 0;
}
/* ECX and EDX contain capability flags */
ecx = 0;
cpuid(7, 0, &eax, &ebx, &ecx, &edx);
if (ebx & CPUID_AVX2) {
DEBUG_PRINTF("AVX2 enabled\n");
return 1;
}
return 0;
#endif
}
static inline
int check_avx512(void) {
/*
* For our purposes, having avx512 really means "can we use AVX512BW?"
*/
#if defined(__INTEL_COMPILER)
return _may_i_use_cpu_feature(_FEATURE_AVX512BW | _FEATURE_AVX512VL);
#else
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
/* check XSAVE is enabled by OS */
if (!(ecx & CPUID_XSAVE)) {
DEBUG_PRINTF("AVX and XSAVE not supported\n");
return 0;
}
/* check that AVX 512 registers are enabled by OS */
u64a xcr0 = xgetbv(0);
if ((xcr0 & CPUID_XCR0_AVX512) != CPUID_XCR0_AVX512) {
DEBUG_PRINTF("AVX512 registers not enabled\n");
return 0;
}
/* ECX and EDX contain capability flags */
ecx = 0;
cpuid(7, 0, &eax, &ebx, &ecx, &edx);
if (!(ebx & CPUID_AVX512F)) {
DEBUG_PRINTF("AVX512F (AVX512 Foundation) instructions not enabled\n");
return 0;
}
if (ebx & CPUID_AVX512BW) {
DEBUG_PRINTF("AVX512BW instructions enabled\n");
return 1;
}
return 0;
#endif
}
static inline
int check_ssse3(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & CPUID_SSSE3);
}
static inline
int check_sse42(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & CPUID_SSE4_2);
}
static inline
int check_popcnt(void) {
unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & CPUID_POPCNT);
}
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* CPUID_INLINE_H_ */

View File

@@ -38,6 +38,9 @@ SET(hsbench_SOURCES
huge.cpp
huge.h
main.cpp
sqldb.cpp
sqldb.h
sqldb_bind.h
thread_barrier.h
timer.h
)

View File

@@ -42,4 +42,9 @@ extern bool forceEditDistance;
extern unsigned editDistance;
extern bool printCompressSize;
struct SqlFailure {
explicit SqlFailure(const std::string &s) : message(s) {}
std::string message;
};
#endif // COMMON_H

View File

@@ -34,6 +34,7 @@
#include "expressions.h"
#include "heapstats.h"
#include "huge.h"
#include "sqldb.h"
#include "timer.h"
#include "database.h"
@@ -113,7 +114,8 @@ int onMatchEcho(unsigned int id, unsigned long long, unsigned long long to,
return 0;
}
EngineHyperscan::EngineHyperscan(hs_database_t *db_in) : db(db_in) {
EngineHyperscan::EngineHyperscan(hs_database_t *db_in, CompileStats cs)
: db(db_in), compile_stats(std::move(cs)) {
assert(db);
}
@@ -234,6 +236,43 @@ void EngineHyperscan::streamCompressExpand(EngineStream &stream,
}
}
void EngineHyperscan::printStats() const {
// Output summary information.
if (!compile_stats.sigs_name.empty()) {
printf("Signature set: %s\n", compile_stats.sigs_name.c_str());
}
printf("Signatures: %s\n", compile_stats.signatures.c_str());
printf("Hyperscan info: %s\n", compile_stats.db_info.c_str());
printf("Expression count: %'zu\n", compile_stats.expressionCount);
printf("Bytecode size: %'zu bytes\n", compile_stats.compiledSize);
printf("Database CRC: 0x%x\n", compile_stats.crc32);
if (compile_stats.streaming) {
printf("Stream state size: %'zu bytes\n", compile_stats.streamSize);
}
printf("Scratch size: %'zu bytes\n", compile_stats.scratchSize);
printf("Compile time: %'0.3Lf seconds\n", compile_stats.compileSecs);
printf("Peak heap usage: %'u bytes\n", compile_stats.peakMemorySize);
}
void EngineHyperscan::sqlStats(SqlDB &sqldb) const {
ostringstream crc;
crc << "0x" << hex << compile_stats.crc32;
static const std::string Q =
"INSERT INTO Compile ("
"sigsName, signatures, dbInfo, exprCount, dbSize, crc, streaming,"
"streamSize, scratchSize, compileSecs, peakMemory) "
"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)";
sqldb.insert_all(Q, compile_stats.sigs_name, compile_stats.signatures,
compile_stats.db_info, compile_stats.expressionCount,
compile_stats.compiledSize, crc.str(),
compile_stats.streaming ? "TRUE" : "FALSE",
compile_stats.streamSize, compile_stats.scratchSize,
compile_stats.compileSecs, compile_stats.peakMemorySize);
}
static
unsigned makeModeFlags(ScanMode scan_mode) {
switch (scan_mode) {
@@ -281,7 +320,8 @@ string dbFilename(const std::string &name, unsigned mode) {
std::unique_ptr<EngineHyperscan>
buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode,
const std::string &name, UNUSED const ue2::Grey &grey) {
const std::string &name, const std::string &sigs_name,
UNUSED const ue2::Grey &grey) {
if (expressions.empty()) {
assert(0);
return nullptr;
@@ -292,7 +332,6 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode,
size_t streamSize = 0;
size_t scratchSize = 0;
unsigned int peakMemorySize = 0;
unsigned int crc = 0;
std::string db_info;
unsigned int mode = makeModeFlags(scan_mode);
@@ -393,8 +432,6 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode,
}
assert(compiledSize > 0);
crc = db->crc32;
if (saveDatabases) {
saveDatabase(db, dbFilename(name, mode).c_str());
}
@@ -431,18 +468,24 @@ buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode,
}
hs_free_scratch(scratch);
// Output summary information.
printf("Signatures: %s\n", name.c_str());
printf("Hyperscan info: %s\n", db_info.c_str());
printf("Expression count: %'zu\n", expressions.size());
printf("Bytecode size: %'zu bytes\n", compiledSize);
printf("Database CRC: 0x%x\n", crc);
if (mode & HS_MODE_STREAM) {
printf("Stream state size: %'zu bytes\n", streamSize);
// Collect summary information.
CompileStats cs;
cs.sigs_name = sigs_name;
if (!sigs_name.empty()) {
const auto pos = name.find_last_of('/');
cs.signatures = name.substr(pos + 1);
} else {
cs.signatures = name;
}
printf("Scratch size: %'zu bytes\n", scratchSize);
printf("Compile time: %'0.3Lf seconds\n", compileSecs);
printf("Peak heap usage: %'u bytes\n", peakMemorySize);
cs.db_info = db_info;
cs.expressionCount = expressions.size();
cs.compiledSize = compiledSize;
cs.crc32 = db->crc32;
cs.streaming = mode & HS_MODE_STREAM;
cs.streamSize = streamSize;
cs.scratchSize = scratchSize;
cs.compileSecs = compileSecs;
cs.peakMemorySize = peakMemorySize;
return ue2::make_unique<EngineHyperscan>(db);
return ue2::make_unique<EngineHyperscan>(db, std::move(cs));
}

View File

@@ -31,9 +31,11 @@
#include "expressions.h"
#include "common.h"
#include "sqldb.h"
#include "hs_runtime.h"
#include <memory>
#include <string>
#include <vector>
/** Structure for the result of a single complete scan. */
@@ -42,6 +44,21 @@ struct ResultEntry {
unsigned int matches = 0; //!< Count of matches found.
};
/** Infomation about the database compile */
struct CompileStats {
std::string sigs_name;
std::string signatures;
std::string db_info;
size_t expressionCount = 0;
size_t compiledSize = 0;
uint32_t crc32 = 0;
bool streaming;
size_t streamSize = 0;
size_t scratchSize = 0;
long double compileSecs = 0;
unsigned int peakMemorySize = 0;
};
/** Engine context which is allocated on a per-thread basis. */
class EngineContext {
public:
@@ -62,7 +79,7 @@ public:
/** Hyperscan Engine for scanning data. */
class EngineHyperscan {
public:
explicit EngineHyperscan(hs_database_t *db);
explicit EngineHyperscan(hs_database_t *db, CompileStats cs);
~EngineHyperscan();
std::unique_ptr<EngineContext> makeContext() const;
@@ -86,8 +103,13 @@ public:
void streamScan(EngineStream &stream, const char *data, unsigned int len,
unsigned int id, ResultEntry &result) const;
void printStats() const;
void sqlStats(SqlDB &db) const;
private:
hs_database_t *db;
CompileStats compile_stats;
};
namespace ue2 {
@@ -96,6 +118,7 @@ struct Grey;
std::unique_ptr<EngineHyperscan>
buildEngineHyperscan(const ExpressionMap &expressions, ScanMode scan_mode,
const std::string &name, const ue2::Grey &grey);
const std::string &name, const std::string &sigs_name,
const ue2::Grey &grey);
#endif // ENGINEHYPERSCAN_H

View File

@@ -32,6 +32,7 @@
#include "data_corpus.h"
#include "engine_hyperscan.h"
#include "expressions.h"
#include "sqldb.h"
#include "thread_barrier.h"
#include "timer.h"
#include "util/expression_path.h"
@@ -89,10 +90,14 @@ ScanMode scan_mode = ScanMode::STREAMING;
unsigned repeats = 20;
string exprPath("");
string corpusFile("");
string sqloutFile("");
string sigName(""); // info only
vector<unsigned int> threadCores;
Timer totalTimer;
double totalSecs = 0;
SqlDB out_db;
typedef void (*thread_func_t)(void *context);
class ThreadContext : boost::noncopyable {
@@ -188,6 +193,8 @@ void usage(const char *error) {
printf("\n");
printf(" --per-scan Display per-scan Mbit/sec results.\n");
printf(" --echo-matches Display all matches that occur during scan.\n");
printf(" --sql-out FILE Output sqlite db.\n");
printf(" -S NAME Signature set name (for sqlite db).\n");
printf("\n\n");
if (error) {
@@ -207,28 +214,30 @@ struct BenchmarkSigs {
static
void processArgs(int argc, char *argv[], vector<BenchmarkSigs> &sigSets,
UNUSED unique_ptr<Grey> &grey) {
const char options[] = "-b:c:Cd:e:E:G:hi:n:No:p:sVw:z:"
const char options[] = "-b:c:Cd:e:E:G:hi:n:No:p:sS:Vw:z:"
#ifdef HAVE_DECL_PTHREAD_SETAFFINITY_NP
"T:" // add the thread flag
#endif
;
int in_sigfile = 0;
int do_per_scan = 0;
int do_echo_matches = 0;
int do_compress = 0;
int do_compress_size = 0;
int do_echo_matches = 0;
int do_sql_output = 0;
int option_index = 0;
vector<string> sigFiles;
static struct option longopts[] = {
{"per-scan", 0, &do_per_scan, 1},
{"echo-matches", 0, &do_echo_matches, 1},
{"compress-stream", 0, &do_compress, 1},
{"print-compress-size", 0, &do_compress_size, 1},
{"per-scan", no_argument, &do_per_scan, 1},
{"echo-matches", no_argument, &do_echo_matches, 1},
{"compress-stream", no_argument, &do_compress, 1},
{"sql-out", required_argument, &do_sql_output, 1},
{nullptr, 0, nullptr, 0}
};
for (;;) {
int c = getopt_long(argc, argv, options, longopts, nullptr);
int c = getopt_long(argc, argv, options, longopts, &option_index);
if (c < 0) {
break;
}
@@ -294,6 +303,9 @@ void processArgs(int argc, char *argv[], vector<BenchmarkSigs> &sigSets,
case 'V':
scan_mode = ScanMode::VECTORED;
break;
case 'S':
sigName.assign(optarg);
break;
#ifdef HAVE_DECL_PTHREAD_SETAFFINITY_NP
case 'T':
if (!strToList(optarg, threadCores)) {
@@ -321,14 +333,19 @@ void processArgs(int argc, char *argv[], vector<BenchmarkSigs> &sigSets,
saveDatabases = true;
serializePath = optarg;
break;
case 0:
if (do_sql_output) {
sqloutFile.assign(optarg);
do_sql_output = 0;
}
break;
case 1:
if (in_sigfile) {
sigFiles.push_back(optarg);
in_sigfile = 2;
break;
}
case 0:
break;
/* fallthrough */
default:
usage("Unrecognised command line argument.");
exit(1);
@@ -726,6 +743,67 @@ void displayResults(const vector<unique_ptr<ThreadContext>> &threads,
}
}
/** Dump per-scan throughput data to sql. */
static
void sqlPerScanResults(const vector<unique_ptr<ThreadContext>> &threads,
u64a bytesPerRun, u64a scan_id) {
static const std::string Q =
"INSERT INTO ScanResults (scan_id, thread, scan, throughput) "
"VALUES (?1, ?2, ?3, ?4)";
for (const auto &t : threads) {
const auto &results = t->results;
for (size_t j = 0; j != results.size(); j++) {
const auto &r = results[j];
double mbps = calc_mbps(r.seconds, bytesPerRun);
out_db.insert_all(Q, scan_id, t->num, j, mbps);
}
}
}
/** Dump benchmark results to sql. */
static
void sqlResults(const vector<unique_ptr<ThreadContext>> &threads,
const vector<DataBlock> &corpus_blocks) {
u64a bytesPerRun = byte_size(corpus_blocks);
u64a matchesPerRun = threads[0]->results[0].matches;
u64a scan_id = out_db.lastRowId();
// Sanity check: all of our results should have the same match count.
for (const auto &t : threads) {
if (!all_of(begin(t->results), end(t->results),
[&matchesPerRun](const ResultEntry &e) {
return e.matches == matchesPerRun;
})) {
printf("\nWARNING: PER-SCAN MATCH COUNTS ARE INCONSISTENT!\n\n");
break;
}
}
u64a totalBytes = bytesPerRun * repeats * threads.size();
double matchRate = ((double)matchesPerRun * 1024) / bytesPerRun;
const auto pos = corpusFile.find_last_of('/');
const auto corpus = corpusFile.substr(pos + 1);
static const std::string Q =
"INSERT INTO Scan (scan_id, corpusFile, totalSecs, "
"bytesPerRun, blockSize, blockCount, totalBytes, "
"totalBlocks, matchesPerRun, matchRate, overallTput) "
"VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)";
out_db.insert_all(
Q, scan_id, corpus, totalSecs, bytesPerRun, corpus_blocks.size(),
scan_mode == ScanMode::BLOCK ? 1 : count_streams(corpus_blocks),
totalBytes, corpus_blocks.size() * repeats * threads.size(),
matchesPerRun, matchRate, calc_mbps(totalSecs, totalBytes));
if (display_per_scan) {
sqlPerScanResults(threads, bytesPerRun, scan_id);
}
}
/**
* Construct a thread context for this scanning mode.
*
@@ -798,10 +876,15 @@ void runBenchmark(const EngineHyperscan &db,
t->join();
}
// Display global results.
displayResults(threads, corpus_blocks);
if (sqloutFile.empty()) {
// Display global results.
displayResults(threads, corpus_blocks);
} else {
// write to sqlite file
sqlResults(threads, corpus_blocks);
out_db.exec("END");
}
}
} // namespace
/** Main driver. */
@@ -842,22 +925,39 @@ int main(int argc, char *argv[]) {
printf("Corpus data error: %s\n", e.msg.c_str());
return 1;
}
for (const auto &s : sigSets) {
auto exprMap = limitToSignatures(exprMapTemplate, s.sigs);
if (exprMap.empty()) {
continue;
try {
if (!sqloutFile.empty()) {
out_db.open(sqloutFile);
}
auto engine = buildEngineHyperscan(exprMap, scan_mode, s.name, *grey);
if (!engine) {
printf("Error: expressions failed to compile.\n");
exit(1);
for (const auto &s : sigSets) {
auto exprMap = limitToSignatures(exprMapTemplate, s.sigs);
if (exprMap.empty()) {
continue;
}
auto engine = buildEngineHyperscan(exprMap, scan_mode, s.name,
sigName, *grey);
if (!engine) {
printf("Error: expressions failed to compile.\n");
exit(1);
}
if (sqloutFile.empty()) {
// Display global results.
engine->printStats();
printf("\n");
} else {
out_db.exec("BEGIN");
engine->sqlStats(out_db);
}
runBenchmark(*engine, corpus_blocks);
}
printf("\n");
runBenchmark(*engine, corpus_blocks);
} catch (const SqlFailure &f) {
cerr << f.message << '\n';
return -1;
}
return 0;

167
tools/hsbench/sqldb.cpp Normal file
View File

@@ -0,0 +1,167 @@
/*
* Copyright (c) 2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "common.h"
#include "sqldb.h"
#include "ue2common.h"
#include <cassert>
#include <cstring>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <sqlite3.h>
using namespace std;
namespace {
static
sqlite3 *initDB(const string &filename) {
sqlite3 *db;
int status;
status = sqlite3_open_v2(filename.c_str(), &db,
SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, nullptr);
if (status != SQLITE_OK) {
ostringstream oss;
oss << "Unable to open database '" << filename
<< "': " << sqlite3_errmsg(db);
status = sqlite3_close(db);
assert(status == SQLITE_OK);
throw SqlFailure(oss.str());
}
// create tables
static const string c("CREATE TABLE Compile ("
"id INTEGER PRIMARY KEY,"
"sigsName TEXT, "
"signatures TEXT, "
"dbInfo TEXT, "
"exprCount INTEGER, "
"dbSize INTEGER,"
"crc TEXT, "
"streaming TEXT, "
"streamSize INTEGER, "
"scratchSize INTEGER, "
"compileSecs DOUBLE, "
"peakMemory INTEGER"
");");
static const string s("CREATE TABLE Scan (id INTEGER PRIMARY KEY,"
"corpusFile TEXT, scan_id INTEGER, "
"totalSecs DOUBLE, bytesPerRun INTEGER, "
"blockSize INTEGER, blockCount INTEGER, "
"totalBytes INTEGER, totalBlocks INTEGER, "
"matchesPerRun INTEGER, "
"matchRate DOUBLE, overallTput DOUBLE);");
static const string sr(
"CREATE TABLE ScanResults ( id INTEGER PRIMARY KEY, "
"scan_id INTEGER, thread INTEGER, scan INTEGER, throughput DOUBLE );");
static const string create_query = c + s + sr;
sqlite3_stmt *statement;
const char *pzTail = create_query.c_str();
while (strlen(pzTail)) {
status =
sqlite3_prepare(db, pzTail, strlen(pzTail), &statement, &pzTail);
if (status != SQLITE_OK) {
goto fail;
}
status = sqlite3_step(statement);
if (status != SQLITE_DONE && status != SQLITE_ROW) {
goto fail;
}
status = sqlite3_finalize(statement);
if (status != SQLITE_OK) {
goto fail;
}
}
return db;
fail:
ostringstream oss;
oss << "Unable to create tables: " << sqlite3_errmsg(db);
status = sqlite3_close(db);
assert(status == SQLITE_OK);
throw SqlFailure(oss.str());
}
} // namespace
SqlDB::~SqlDB() {
if (db) {
sqlite3_close(db);
}
db = nullptr;
}
void SqlDB::open(const string &filename) {
if (!ifstream(filename)) {
// file doesn't exist, go set up some tables
db = initDB(filename);
} else {
int status;
status = sqlite3_open_v2(filename.c_str(), &db, SQLITE_OPEN_READWRITE,
nullptr);
if (status != SQLITE_OK) {
ostringstream oss;
oss << "Unable to open database '" << filename
<< "': " << sqlite3_errmsg(db);
throw SqlFailure(oss.str());
}
}
exec("PRAGMA synchronous = off;");
exec("PRAGMA encoding = 'UTF-8';");
}
void SqlDB::exec(const string &query) {
assert(db);
int status;
status = sqlite3_exec(db, query.c_str(), nullptr, nullptr, nullptr);
if (status != SQLITE_OK) {
ostringstream oss;
oss << "Unable to run sqlite query: " << sqlite3_errmsg(db);
sqlite3_close(db);
throw SqlFailure(oss.str());
}
}
u64a SqlDB::lastRowId() {
assert(db);
return sqlite3_last_insert_rowid(db);
}

86
tools/hsbench/sqldb.h Normal file
View File

@@ -0,0 +1,86 @@
/*
* Copyright (c) 2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef SQLDB_H_
#define SQLDB_H_
#include "ue2common.h"
#include "common.h"
#include "sqldb_bind.h"
#include <iostream>
#include <string>
#include <sqlite3.h>
class SqlDB {
public:
SqlDB() : db(nullptr) {};
~SqlDB();
void open(const std::string &filename);
void exec(const std::string &query);
u64a lastRowId();
template <typename... Args>
void insert_all(const std::string &query, Args&&... args) {
sqlite3_stmt *stmt;
const char *tail;
int rc = sqlite3_prepare(db, query.c_str(), query.size(), &stmt, &tail);
if (rc != SQLITE_OK) {
std::ostringstream oss;
oss << "Unable to prepare query: " << sqlite3_errmsg(db);
throw SqlFailure(oss.str());
}
// only one statement per function call
assert(strlen(tail) == 0);
// perform templated binds to this statement
ue2_sqlite::bind_args(stmt, 1, args...);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE) {
std::ostringstream oss;
oss << "Unable to run insert: " << sqlite3_errmsg(db);
throw SqlFailure(oss.str());
}
rc = sqlite3_finalize(stmt);
if (rc != SQLITE_OK) {
std::ostringstream oss;
oss << "Unable to finalize statement: " << sqlite3_errmsg(db);
throw SqlFailure(oss.str());
}
}
private:
sqlite3 *db;
};
#endif /* SQLDB_H_ */

View File

@@ -0,0 +1,90 @@
/*
* Copyright (c) 2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef SQLDB_BIND_H_
#define SQLDB_BIND_H_
#include "ue2common.h"
#include <iostream>
#include <sstream>
#include <string>
#include <sqlite3.h>
namespace ue2_sqlite {
inline
int bind_impl(sqlite3_stmt *stmt, int param, const unsigned long &val) {
return sqlite3_bind_int64(stmt, param, val);
}
inline
int bind_impl(sqlite3_stmt *stmt, int param, const unsigned int &val) {
return sqlite3_bind_int(stmt, param, val);
}
inline
int bind_impl(sqlite3_stmt *stmt, int param, const u64a &val) {
return sqlite3_bind_int64(stmt, param, val);
}
inline
int bind_impl(sqlite3_stmt *stmt, int param, const double &val) {
return sqlite3_bind_double(stmt, param, val);
}
inline
int bind_impl(sqlite3_stmt *stmt, int param, const long double &val) {
return sqlite3_bind_double(stmt, param, val);
}
inline
int bind_impl(sqlite3_stmt *stmt, int param, const std::string &val) {
return sqlite3_bind_text(stmt, param, val.c_str(), val.size(),
SQLITE_TRANSIENT);
}
template<typename T>
void bind_args(sqlite3_stmt *stmt, int param, T obj) {
int rc = bind_impl(stmt, param, obj);
if (rc != SQLITE_OK) {
std::ostringstream oss;
oss << "SQL value bind failed for param #: " << param;
throw SqlFailure(oss.str());
}
}
template<typename T, typename... Args>
void bind_args(sqlite3_stmt *stmt, int param, T obj, Args&&... args) {
bind_args(stmt, param, obj);
bind_args(stmt, param + 1, args...);
}
} // namespace
#endif /* SQLDB_BIND_H_ */

View File

@@ -0,0 +1,10 @@
# only set these after all tests are done
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
SET(hscheck_SOURCES
main.cpp
)
add_executable(hscheck ${hscheck_SOURCES})
target_link_libraries(hscheck hs expressionutil pthread)

476
tools/hscheck/main.cpp Normal file
View File

@@ -0,0 +1,476 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* \file
* \brief hscheck: Tool to test regex compilation with Hyperscan.
*
* hscheck accepts a file of regular expressions in the form:
* "ID:/regex/flags" and tests whether they can be compiled with Hyperscan,
* reporting the error if compilation fails.
*
* For example, create the file "regex" containing:
*
* 1:/foo.*bar/s
* 2:/hatstand|teakettle|badgerbrush/
*
* This can be checked with the following hscheck invocation:
*
* $ bin/hscheck -e regex
*
* Use "hscheck -h" for complete usage information.
*/
#include "config.h"
#include "ExpressionParser.h"
#include "expressions.h"
#include "string_util.h"
#include "util/expression_path.h"
#include "util/make_unique.h"
#include "grey.h"
#include "hs_compile.h"
#include "hs_internal.h"
#include "ue2common.h"
#include <cassert>
#include <fstream>
#include <mutex>
#include <stdexcept>
#include <string>
#include <thread>
#include <getopt.h>
#include <boost/algorithm/string/trim.hpp>
using namespace std;
using namespace ue2;
namespace /* anonymous */ {
// are we in streaming mode? (default: yes)
bool g_streaming = true;
bool g_vectored = false;
string g_exprPath("");
string g_signatureFile("");
bool g_allSignatures = false;
bool g_forceEditDistance = false;
bool build_sigs = false;
unsigned int g_signature;
unsigned int g_editDistance;
unsigned int globalFlags = 0;
unsigned int num_of_threads = 1;
unsigned int countFailures = 0;
// Global greybox structure, used in non-release builds.
unique_ptr<Grey> g_grey;
// Global expression map.
ExpressionMap g_exprMap;
// Iterator pointing to next expression to process.
ExpressionMap::const_iterator read_it;
// Iterator pointing to next expression to print results.
ExpressionMap::const_iterator print_it;
// Mutex guarding access to read iterator.
std::mutex lk_read;
// Mutex serialising access to output map and stdout.
std::mutex lk_output;
// Possible values for pattern check results.
enum ExprStatus {NOT_PROCESSED, SUCCESS, FAILURE};
// Map for storing results.
map<unsigned int, pair<string, ExprStatus>> output;
} // namespace
static
bool getNextExpressionId(ExpressionMap::const_iterator &it) {
lock_guard<mutex> lock(lk_read);
if (read_it != g_exprMap.end()) {
it = read_it;
++read_it;
return true;
} else {
return false;
}
}
// This function prints the Pattern IDs order
// It creates the output for build sigs
// Caller is required to hold lk_output when calling this function
static
void printExpressionId(const ExpressionMap &exprMap) {
while (print_it != exprMap.end()) {
unsigned int id = print_it->first;
const string &regex = print_it->second;
const auto &result = output[id];
if (result.second == NOT_PROCESSED) {
break;
}
bool fail = result.second == FAILURE;
if (!build_sigs) {
if (fail) {
cout << "FAIL (compile): " << id << ":" << regex << ": "
<< result.first << endl;
} else {
cout << result.first << ' ' << id << ":" << regex << endl;
}
} else {
if (fail) {
cout << "# " << id << " # " << result.first << endl;
} else {
cout << id << endl;
}
}
++print_it;
}
}
static
void recordFailure(const ExpressionMap &exprMap, unsigned int id,
const string &err) {
lock_guard<mutex> lock(lk_output);
output[id].first = err;
output[id].second = FAILURE;
countFailures++;
printExpressionId(exprMap);
}
static
void recordSuccess(const ExpressionMap &exprMap, unsigned int id) {
lock_guard<mutex> lock(lk_output);
output[id].first = "OK:";
output[id].second = SUCCESS;
printExpressionId(exprMap);
}
static
void checkExpression(UNUSED void *threadarg) {
unsigned int mode = g_streaming ? HS_MODE_STREAM
: g_vectored ? HS_MODE_VECTORED
: HS_MODE_BLOCK;
if (g_streaming) {
// Use SOM mode, for permissiveness' sake.
mode |= HS_MODE_SOM_HORIZON_LARGE;
}
ExpressionMap::const_iterator it;
while (getNextExpressionId(it)) {
const string &line = it->second;
// Initial slash char is required, but unused.
if (line.empty() || line[0] != '/') {
recordFailure(g_exprMap, it->first,
"Format required is \"ID:/REGEX/FLAGS\".");
continue;
}
// Make a mutable copy and trim any whitespace on the right.
string expr = line;
boost::trim(expr);
size_t flagsStart = expr.find_last_of('/');
if (flagsStart == string::npos || flagsStart == 0) {
recordFailure(g_exprMap, it->first, "No trailing '/' char.");
continue;
}
string regex;
unsigned int flags = 0;
hs_expr_ext ext;
if (!readExpression(expr, regex, &flags, &ext)) {
recordFailure(g_exprMap, it->first, "Unsupported flag used.");
continue;
}
flags |= globalFlags;
if (g_forceEditDistance) {
ext.edit_distance = g_editDistance;
ext.flags |= HS_EXT_FLAG_EDIT_DISTANCE;
}
// Try and compile a database.
const char *regexp = regex.c_str();
const hs_expr_ext *extp = &ext;
hs_error_t err;
hs_compile_error_t *compile_err;
hs_database_t *db = nullptr;
#if !defined(RELEASE_BUILD)
// This variant is available in non-release builds and allows us to
// modify greybox settings.
err = hs_compile_multi_int(&regexp, &flags, nullptr, &extp, 1, mode,
nullptr, &db, &compile_err, *g_grey);
#else
err = hs_compile_ext_multi(&regexp, &flags, nullptr, &extp, 1, mode,
nullptr, &db, &compile_err);
#endif
if (err == HS_SUCCESS) {
assert(db);
recordSuccess(g_exprMap, it->first);
hs_free_database(db);
} else {
assert(!db);
assert(compile_err);
recordFailure(g_exprMap, it->first, compile_err->message);
hs_free_compile_error(compile_err);
}
}
}
static
void usage() {
cout << "Usage: hscheck [OPTIONS...]" << endl << endl
<< " -e PATH Path to expression directory." << endl
<< " -s FILE Signature file to use." << endl
<< " -z NUM Signature ID to use." << endl
<< " -E DISTANCE Force edit distance to DISTANCE for all patterns." << endl
#ifndef RELEASE_BUILD
<< " -G OVERRIDES Overrides for the grey." << endl
#endif
<< " -V Operate in vectored mode." << endl
<< " -N Operate in block mode (default: streaming)." << endl
<< " -L Pass HS_FLAG_SOM_LEFTMOST for all expressions (default: off)." << endl
<< " -8 Force UTF8 mode on all patterns." << endl
<< " -T NUM Run with NUM threads." << endl
<< " -h Display this help." << endl
<< " -B Build signature set." << endl
<< endl;
}
static
void processArgs(int argc, char *argv[], UNUSED unique_ptr<Grey> &grey) {
const char options[] = "e:E:s:z:hLNV8G:T:B";
bool signatureSet = false;
for (;;) {
int c = getopt_long(argc, argv, options, nullptr, nullptr);
if (c < 0) {
break;
}
switch (c) {
case 'e':
g_exprPath.assign(optarg);
break;
case 'h':
usage();
exit(0);
break;
case 's':
g_signatureFile.assign(optarg);
break;
case 'E':
if (!fromString(optarg, g_editDistance)) {
usage();
exit(1);
}
g_forceEditDistance = true;
break;
case 'z':
if (!fromString(optarg, g_signature)) {
usage();
exit(1);
}
signatureSet = true;
break;
case '8':
globalFlags |= HS_FLAG_UTF8;
break;
#ifndef RELEASE_BUILD
case 'G':
applyGreyOverrides(grey.get(), string(optarg));
break;
#endif
case 'L':
globalFlags |= HS_FLAG_SOM_LEFTMOST;
break;
case 'N':
g_streaming = false;
break;
case 'V':
g_streaming = false;
g_vectored = true;
break;
case 'T':
num_of_threads = atoi(optarg);
break;
case 'B':
build_sigs = true;
break;
default:
usage();
exit(1);
}
}
if (g_exprPath.empty() && !g_signatureFile.empty()) {
/* attempt to infer an expression directory */
g_exprPath = inferExpressionPath(g_signatureFile);
}
if (g_exprPath.empty()) {
usage();
exit(1);
}
if (!isDir(g_exprPath) && isFile(g_exprPath)
&& g_signatureFile.empty() && !signatureSet) {
g_allSignatures = true;
}
if (g_signatureFile.empty() && !signatureSet && !g_allSignatures) {
usage();
exit(1);
}
}
static
void failLine(unsigned lineNum, const string &file,
const string &line, const string &error) {
cerr << "Parse error in file " << file
<< " on line " << lineNum << ": " << error
<< endl << "Line is: '" << line << "'" << endl;
exit(1);
}
// load a list of signature IDs if Build_sigs is enabled
// If a line is commented out, this function still loads the corresponding ID.
// The commented out line should have the format #<space>id<space>#<comment>
// It then prints out a signature file with the IDs that compile successfully.
static
void loadSignatureBuildSigs(const string &inFile,
SignatureSet &signatures) {
ifstream f(inFile.c_str());
if (!f.good()) {
cerr << "Can't open file: '" << inFile << "'" << endl;
exit(1);
}
unsigned lineNum = 0;
string line;
while (getline(f, line)) {
lineNum++;
unsigned id;
// if line is empty, we can skip it
if (line.empty()) {
continue;
}
// if line is commented out, try to locate the ID
// Line is usually in the form #<space>id<space>#<comment>
if (line[0] == '#') {
string temp;
// skip the opening hash and see if there is a second
size_t comment = line.find_first_of('#', 1);
if (comment) {
temp = line.substr(1, comment - 1);
} else {
temp = line.substr(1, line.size());
}
// cull any whitespace
boost::trim(temp);
if (fromString(temp, id)) {
signatures.push_back(id);
} else {
// couldn't be turned into an ID, dump to stdout
cout << line << endl;
}
} else { // lines that don't begin with #
if (fromString(line, id)) {
signatures.push_back(id);
} else {
// Parse error occurred
failLine(lineNum, inFile, line, "Unable to parse ID.");
}
}
}
}
int main(int argc, char **argv) {
num_of_threads = max(1u, std::thread::hardware_concurrency());
#if !defined(RELEASE_BUILD)
g_grey = make_unique<Grey>();
#endif
processArgs(argc, argv, g_grey);
if (num_of_threads == 0) {
cout << "Error: Must have at least one thread." << endl;
exit(1);
}
loadExpressions(g_exprPath, g_exprMap);
if (!g_allSignatures) {
SignatureSet signatures;
if (!g_signatureFile.empty()) {
if (!build_sigs) {
loadSignatureList(g_signatureFile, signatures);
} else {
loadSignatureBuildSigs(g_signatureFile, signatures);
}
} else {
signatures.push_back(g_signature);
}
g_exprMap = limitToSignatures(g_exprMap, signatures);
}
if (g_exprMap.empty()) {
cout << "Warning: no signatures to scan. Exiting." << endl;
exit(0);
}
read_it = g_exprMap.begin();
print_it = g_exprMap.begin();
vector<thread> threads(num_of_threads);
for (unsigned int i = 0; i < num_of_threads; i++) {
threads[i] = thread(checkExpression, nullptr);
}
for (unsigned int i = 0; i < num_of_threads; i++) {
threads[i].join();
}
if (!g_exprMap.empty() && !build_sigs) {
cout << "SUMMARY: " << countFailures << " of "
<< g_exprMap.size() << " failed." << endl;
}
return 0;
}

View File

@@ -0,0 +1,291 @@
/*
* Copyright (c) 2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef BOUNDEDQUEUE_H
#define BOUNDEDQUEUE_H
#include <algorithm>
#include <cassert>
#include <condition_variable>
#include <memory>
#include <mutex>
#include <queue>
#include <type_traits>
#include <vector>
#include <boost/core/noncopyable.hpp>
//#define QUEUE_STATS 1
#ifdef QUEUE_STATS
#include <iostream>
class BoundedQueueStats {
public:
size_t pop = 0; //!< Number of pop operations.
size_t pop_block = 0; //!< Number of pop operations that had to block.
size_t push = 0; //!< Number of push operations.
size_t push_elements = 0; //!< Number of elements pushed.
size_t push_block = 0; //!< Number of push operations that had to block.
size_t refill = 0; //!< Number of refills done.
size_t stolen_from = 0; //!< Number of times we were stolen from.
void dump() const {
std::cout << "pop : " << pop << std::endl;
std::cout << "pop_block : " << pop_block << std::endl;
std::cout << "push : " << push << std::endl;
std::cout << "push_elements : " << push_elements << std::endl;
std::cout << "push_block : " << push_block << std::endl;
std::cout << "refill : " << refill << std::endl;
std::cout << "stolen_from : " << stolen_from << std::endl;
}
};
#endif
template<typename T>
class BoundedQueue : boost::noncopyable {
private:
// Encapsulates a queue and the mutex used to protect access to it.
class MutexQueue {
public:
// Forwarded queue operations.
void push(std::unique_ptr<T> elem) { q.push(std::move(elem)); }
void pop() { q.pop(); }
std::unique_ptr<T> &front() { return q.front(); }
bool empty() const { return q.empty(); }
size_t size() const { return q.size(); }
// Acquire the mutex lock.
std::unique_lock<std::mutex> lock() {
return std::unique_lock<std::mutex>(mutex);
}
#ifdef QUEUE_STATS
BoundedQueueStats stats;
#endif
private:
std::mutex mutex;
std::queue<std::unique_ptr<T>> q;
};
public:
BoundedQueue(size_t consumers, size_t size)
: max_elements(size), consumer_q(consumers) {
assert(consumers > 0);
assert(size > 0);
}
#ifdef QUEUE_STATS
~BoundedQueue() {
std::cout << "Global queue stats:" << std::endl;
global_q.stats.dump();
std::cout << std::endl;
for (size_t i = 0; i < consumer_q.size(); i++) {
std::cout << "Consumer queue " << i << ":" << std::endl;
consumer_q[i].stats.dump();
std::cout << std::endl;
}
}
#endif // QUEUE_STATS
void push(std::unique_ptr<T> elem) {
auto lock = global_q.lock();
#ifdef QUEUE_STATS
global_q.stats.push++;
global_q.stats.push_elements++;
if (global_q.size() >= max_elements) {
global_q.stats.push_block++;
}
#endif // QUEUE_STATS
// Block until queue is able to accept new elements.
cond_can_accept.wait(lock,
[&] { return global_q.size() < max_elements; });
assert(global_q.size() < max_elements);
global_q.push(std::move(elem));
cond_can_consume.notify_all();
}
template<class Iter>
void push(Iter begin, Iter end) {
using ElemType = typename std::remove_reference<decltype(*begin)>::type;
static_assert(std::is_same<ElemType, std::unique_ptr<T>>::value,
"Iterator must be over unique_ptr<T>");
if (begin == end) {
return;
}
auto lock = global_q.lock();
#ifdef QUEUE_STATS
global_q.stats.push++;
global_q.stats.push_elements += std::distance(begin, end);
if (global_q.size() >= max_elements) {
global_q.stats.push_block++;
}
#endif // QUEUE_STATS
// Block until queue is able to accept new elements.
cond_can_accept.wait(lock,
[&] { return global_q.size() < max_elements; });
assert(global_q.size() < max_elements);
for (auto it = begin; it != end; ++it) {
global_q.push(std::move(*it));
}
cond_can_consume.notify_all();
}
std::unique_ptr<T> pop(size_t consumer_id) {
assert(consumer_id < consumer_q.size());
auto &q = consumer_q[consumer_id];
// Try and satisfy the request from our per-consumer queue.
{
auto consumer_lock = q.lock();
if (!q.empty()) {
return pop_from_queue(q);
}
}
// Try and satisfy the request with a refill from the global queue.
{
auto lock = global_q.lock();
if (!global_q.empty()) {
auto consumer_lock = q.lock();
return refill_and_pop(q);
}
}
// Try and satisfy the request by stealing it from another queue.
for (size_t i = 1; i < consumer_q.size(); i++) {
size_t victim_id = (consumer_id + i) % consumer_q.size();
auto &victim_q = consumer_q[victim_id];
auto victim_lock = victim_q.lock();
// Note: we don't steal sentinel elements.
if (!victim_q.empty() && victim_q.front() != nullptr) {
#ifdef QUEUE_STATS
victim_q.stats.stolen_from++;
#endif
return pop_from_queue(victim_q);
}
}
// All avenues exhausted, we must block until we've received a new
// element.
auto lock = global_q.lock();
#ifdef QUEUE_STATS
global_q.stats.pop_block++;
#endif
cond_can_consume.wait(lock, [&]{ return !global_q.empty(); });
assert(!global_q.empty());
auto consumer_lock = q.lock();
return refill_and_pop(q);
}
private:
std::unique_ptr<T> pop_from_queue(MutexQueue &q) {
assert(!q.empty());
auto elem = std::move(q.front());
q.pop();
#ifdef QUEUE_STATS
q.stats.pop++;
#endif
return elem;
}
std::unique_ptr<T> refill_and_pop(MutexQueue &q) {
assert(!global_q.empty());
#ifdef QUEUE_STATS
q.stats.refill++;
#endif
auto elem = pop_from_queue(global_q);
if (elem == nullptr) {
return elem; // Sentinel.
}
// Grab all subsequent elements that share the same ID.
const auto &id = elem->id;
while (!global_q.empty()) {
auto &first = global_q.front();
if (first == nullptr) {
#ifdef QUEUE_STATS
q.stats.push++;
q.stats.push_elements++;
#endif
// Sentinel element. We can grab one, but no more.
q.push(pop_from_queue(global_q));
break;
}
if (first->id != id) {
break;
}
#ifdef QUEUE_STATS
q.stats.push++;
q.stats.push_elements++;
#endif
q.push(pop_from_queue(global_q));
}
if (global_q.size() < max_elements) {
cond_can_accept.notify_all();
}
return elem;
}
// Maximum number of elements in the global queue (subsequent push
// operations will block). Note that we may overshoot this value when
// handling bulk push operations.
const size_t max_elements;
// Global queue.
MutexQueue global_q;
// Per-consumer queues.
std::vector<MutexQueue> consumer_q;
// Condition variable for producers to wait on when the queue is full.
std::condition_variable cond_can_accept;
// Condition variable for consumers to wait on when the queue is empty.
std::condition_variable cond_can_consume;
};
#ifdef QUEUE_STATS
#undef QUEUE_STATS
#endif
#endif // BOUNDEDQUEUE_H

View File

@@ -0,0 +1,101 @@
# we have a fixed requirement for PCRE
set(PCRE_REQUIRED_MAJOR_VERSION 8)
set(PCRE_REQUIRED_MINOR_VERSION 41)
set(PCRE_REQUIRED_VERSION ${PCRE_REQUIRED_MAJOR_VERSION}.${PCRE_REQUIRED_MINOR_VERSION})
include (${CMAKE_MODULE_PATH}/pcre.cmake)
if (NOT CORRECT_PCRE_VERSION)
message(STATUS "PCRE ${PCRE_REQUIRED_VERSION} not found, not building hscollider")
return()
endif()
include_directories(${PCRE_INCLUDE_DIRS})
include(${CMAKE_MODULE_PATH}/backtrace.cmake)
# we need static libs - too much deep magic for shared libs
if (NOT BUILD_STATIC_LIBS)
return ()
endif ()
CHECK_FUNCTION_EXISTS(sigaltstack HAVE_SIGALTSTACK)
CHECK_FUNCTION_EXISTS(sigaction HAVE_SIGACTION)
CHECK_FUNCTION_EXISTS(setrlimit HAVE_SETRLIMIT)
set_source_files_properties(
${CMAKE_CURRENT_BINARY_DIR}/ColliderCorporaParser.cpp
PROPERTIES
COMPILE_FLAGS "${RAGEL_C_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")
ragelmaker(ColliderCorporaParser.rl)
# only set these after all tests are done
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
SET(hscollider_SOURCES
common.h
BoundedQueue.h
Corpora.cpp
FileCorpora.h
FileCorpora.cpp
ColliderCorporaParser.h
ColliderCorporaParser.cpp
NfaGeneratedCorpora.h
NfaGeneratedCorpora.cpp
GraphTruth.h
GraphTruth.cpp
GroundTruth.h
GroundTruth.cpp
UltimateTruth.h
UltimateTruth.cpp
ResultSet.h
args.cpp
args.h
limit.cpp
pcre_util.cpp
sig.cpp
sig.h
DatabaseProxy.h
Thread.h
Thread.cpp
main.cpp
)
set_source_files_properties(${hscollider_SOURCES} PROPERTIES
INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR})
add_executable(hscollider ${hscollider_SOURCES})
add_dependencies(hscollider ragel_ColliderCorporaParser)
add_dependencies(hscollider pcre)
if(NOT WIN32)
target_link_libraries(hscollider hs ${PCRE_LDFLAGS} databaseutil
expressionutil corpusomatic crosscompileutil pthread
"${BACKTRACE_LDFLAGS}")
if(HAVE_BACKTRACE)
set_source_files_properties(hscollider_SOURCES COMPILE_FLAGS
"${BACKTRACE_CFLAGS}")
endif()
else() # WIN32
target_link_libraries(hscollider hs ${PCRE_LDFLAGS} databaseutil
expressionutil corpusomatic crosscompileutil)
endif()
add_custom_target(
collide_quick_test
COMMAND ${CMAKE_BINARY_DIR}/bin/hscollider
-s ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/signatures/collider_tests.txt
-c ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/corpora/*
-Z0 -t3
DEPENDS hscollider
)
add_custom_target(
collide_quick_test_block
COMMAND ${CMAKE_BINARY_DIR}/bin/hscollider
-s ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/signatures/collider_tests.txt
-c ${CMAKE_SOURCE_DIR}/tools/hscollider/test_cases/corpora/*
-Z0
DEPENDS hscollider
)

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef FILECORPORAPARSER_H
#define FILECORPORAPARSER_H
#include <string>
struct Corpus;
// parse an escaped string into a real data buffer
bool parseCorpus(const std::string &line, Corpus &c, unsigned int &id);
#endif

View File

@@ -0,0 +1,150 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "ColliderCorporaParser.h"
#include "Corpora.h"
#include "ue2common.h"
#include <cassert>
#include <cstdlib>
#include <string>
#include <cstdio>
using namespace std;
namespace /* anonymous */ {
// Take a string like '\xFF' and convert it to the character it represents
char unhex(const char *start, UNUSED const char *end) {
assert(start + 4 == end);
assert(start[0] == '\\');
assert(start[1] == 'x');
assert(isxdigit(start[2]));
assert(isxdigit(start[2]));
char temp[3] = {start[2], start[3], 0};
return strtol(temp, nullptr, 16);
}
%%{
machine FileCorporaParser;
action accumulateNum {
num = (num * 10) + (fc - '0');
}
action handleHexEscaped {
sout.push_back(unhex(ts, te));
}
action handleSpecial {
switch (*(ts+1)) {
case '0': sout.push_back('\x00'); break;
case 'a': sout.push_back('\x07'); break;
case 'e': sout.push_back('\x1b'); break;
case 'f': sout.push_back('\x0c'); break;
case 'n': sout.push_back('\x0a'); break;
case 'v': sout.push_back('\x0b'); break;
case 'r': sout.push_back('\x0d'); break;
case 't': sout.push_back('\x09'); break;
default: fbreak;
}
}
action handleMatch {
c.matches.insert(num);
}
write data;
}%%
} // namespace
bool parseCorpus(const string &line, Corpus &c, unsigned int &id) {
const char *p = line.c_str();
const char *pe = p + line.size();
const char *eof = pe;
const char *ts;
const char *te;
int cs;
UNUSED int act;
// For storing integers as they're scanned
unsigned int num = 0;
string &sout = c.data;
%%{
id = ( digit @accumulateNum)+ >{num = 0;} @{id = num;};
backslashed = '\\' ^alnum;
specials = '\\' [0aefnvrt];
hexescaped = '\\x' xdigit{2};
corpus_old := |*
hexescaped => handleHexEscaped;
specials => handleSpecial;
backslashed => { sout.push_back(*(ts + 1)); };
any => { sout.push_back(*ts); };
*|;
corpus_new := |*
hexescaped => handleHexEscaped;
specials => handleSpecial;
backslashed => { sout.push_back(*(ts + 1)); };
any - '"' => { sout.push_back(*ts); };
'"' => { fgoto colon_sep; };
*|;
colon_sep := |*
':' => {fgoto match_list; };
*|;
match_list := |*
(' '* (digit @accumulateNum)+ ' '* ','?) >{num = 0;} => handleMatch;
*|;
# Old simple line format
line_old = id ':' @{ fgoto corpus_old; };
# New line format with matches
line_new = id "=\"" @{ c.hasMatches = true; fgoto corpus_new; };
main := ( line_new | line_old );
# Initialize and execute
write init;
write exec;
}%%
return (cs != FileCorporaParser_error) && (p == pe);
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "Corpora.h"
CorporaSource::~CorporaSource() { }

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CORPORA_H
#define CORPORA_H
#include <set>
#include <string>
#include <vector>
#include <boost/core/noncopyable.hpp>
struct Corpus {
Corpus() : hasMatches(false) {}
explicit Corpus(const std::string &s) : data(s), hasMatches(false) {}
std::string data; // Corpus itself
bool hasMatches; // Have the matches been pre-calculated?
std::set<unsigned int> matches; // end-offsets of matches
};
struct CorpusFailure {
explicit CorpusFailure(const std::string &s) : message(s) {}
std::string message;
};
// Abstract class for a corpora source: new ways to load or generate corpora
// can be written by subclassing this class and providing its generate
// method.
class CorporaSource : boost::noncopyable {
public:
// destructor
virtual ~CorporaSource();
// Make a copy of this corpora source.
virtual CorporaSource *clone() const = 0;
// Generate corpora for the given signature ID, adding them to the
// vector of strings provided.
virtual void generate(unsigned id, std::vector<Corpus> &data) = 0;
};
#endif // CORPORA_H

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c) 2015-2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef UE2COLLIDER_DATABASEPROXY_H
#define UE2COLLIDER_DATABASEPROXY_H
#include "UltimateTruth.h"
#include <memory>
#include <mutex>
#include <set>
#include <string>
#include <boost/core/noncopyable.hpp>
/**
* When a compile fails for the first time, we throw this exception so that a
* compilation error can be reported to the user. Subsequent failures will
* simply return nullptr rather than throwing this exception.
*/
struct CompileFailed {
public:
explicit CompileFailed(const std::string &err) : error(err) {}
std::string error;
};
class DatabaseProxy : boost::noncopyable {
public:
explicit DatabaseProxy(const std::set<unsigned> &expr_ids)
: ids(expr_ids) {}
explicit DatabaseProxy(std::shared_ptr<HyperscanDB> built_db)
: db(built_db) {}
std::shared_ptr<HyperscanDB> get(const UltimateTruth &ultimate) {
std::lock_guard<std::mutex> lock(mutex);
if (failed) {
// We have previously failed to compile this database.
return nullptr;
}
if (db) {
return db;
}
// Database hasn't been compiled yet.
std::string error;
db = ultimate.compile(ids, error);
if (!db) {
failed = true;
throw CompileFailed(error);
}
return db;
}
private:
std::mutex mutex;
std::shared_ptr<HyperscanDB> db;
std::set<unsigned> ids;
bool failed = false; // Database failed compilation.
};
#endif // UE2COLLIDER_DATABASEPROXY_H

View File

@@ -0,0 +1,99 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "ColliderCorporaParser.h"
#include "FileCorpora.h"
#include "common.h"
#include "util/expression_path.h"
#include <iostream>
#include <fstream>
#include <boost/algorithm/string/trim.hpp>
using namespace std;
// Returns true if this line is empty or a comment and should be skipped
static
bool emptyLine(const string& line) {
return line.empty() || line[0] == '#';
}
FileCorpora *FileCorpora::clone() const {
FileCorpora *copy = new FileCorpora();
copy->corpora_by_pat = corpora_by_pat;
return copy;
}
bool FileCorpora::readLine(const string &line) {
unsigned id = 0;
Corpus c;
bool rv = parseCorpus(line, c, id);
if (rv) {
corpora_by_pat[id].push_back(c);
return true;
} else {
return false;
}
}
bool FileCorpora::readFile(const string &filename) {
ifstream f(filename.c_str());
if (!f.good()) {
return false;
}
unsigned lineNum = 0;
string line;
while (getline(f, line)) {
lineNum++;
boost::trim(line);
if (emptyLine(line)) {
continue;
}
if (!readLine(line)) {
cerr << "Error in corpora file parsing line " << lineNum << endl;
return false;
}
}
return !corpora_by_pat.empty();
}
void FileCorpora::generate(unsigned id,
vector<Corpus> &data) {
auto i = corpora_by_pat.find(id);
if (i == corpora_by_pat.end() || i->second.empty()) {
throw CorpusFailure("no corpora found for pattern.");
}
data.insert(data.end(), i->second.begin(), i->second.end());
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef FILECORPORA_H
#define FILECORPORA_H
#include "Corpora.h"
#include <string>
#include <vector>
#include <list>
#include <map>
class FileCorpora : public CorporaSource {
public:
// copy
FileCorpora *clone() const override;
// read corpora in from a file
bool readFile(const std::string &filename);
// generator
void generate(unsigned id, std::vector<Corpus> &data) override;
private:
// read in a line from our file
bool readLine(const std::string &line);
std::map<unsigned, std::list<Corpus>> corpora_by_pat;
};
#endif

View File

@@ -0,0 +1,308 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "GraphTruth.h"
#include "common.h"
#include "expressions.h"
#include "ExpressionParser.h"
#include "ng_find_matches.h"
#include "pcre_util.h"
#include "grey.h"
#include "hs_compile.h"
#include "ue2common.h"
#include "compiler/compiler.h"
#include "nfagraph/ng.h"
#include "nfagraph/ng_depth.h"
#include "nfagraph/ng_dump.h"
#include "nfagraph/ng_fuzzy.h"
#include "nfagraph/ng_holder.h"
#include "nfagraph/ng_util.h"
#include "parser/Parser.h"
#include "parser/unsupported.h"
#include "util/compile_context.h"
#include "util/make_unique.h"
#include "util/report_manager.h"
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <ostream>
#include <string>
#include <vector>
using namespace std;
using namespace ue2;
// Struct to store the actual compiled NFA graph.
class CompiledNG : boost::noncopyable {
public:
CompiledNG(unique_ptr<NGHolder> g_in,
unique_ptr<ReportManager> rm_in)
: g(std::move(g_in)), rm(std::move(rm_in)) {}
unique_ptr<ue2::NGHolder> g;
unique_ptr<ue2::ReportManager> rm;
};
static
void populateMatchSet(ResultSet &rs, const set<pair<size_t, size_t>> &matches,
const CNGInfo &cngi) {
for (const auto &m : matches) {
u64a from = m.first;
u64a to = m.second;
if (g_streamOffset) {
// Subtract stream offset imposed by offset test.
u64a offset = min(100ull, g_streamOffset);
assert(to >= offset);
from -= min(offset, from);
to -= offset;
}
u64a len = to - from;
if (to < cngi.min_offset || to > cngi.max_offset ||
len < cngi.min_length) {
// this match does not satisfy extparams constraints
DEBUG_PRINTF("skipping NFA Match @ (%llu,%llu)\n", from, to);
continue;
}
if (!cngi.som) {
from = 0;
}
rs.addMatch(from, to);
}
}
CNGInfo::CNGInfo(unsigned id_in, const ExpressionMap &m_expr_in)
: id(id_in), m_expr(m_expr_in) {}
CNGInfo::~CNGInfo() = default;
void CNGInfo::compile() {
auto i = m_expr.find(id);
if (i == m_expr.end()) {
throw NGCompileFailure("ID not found in expression map.");
}
string re;
unsigned hs_flags;
hs_expr_ext ext;
// read the flags for NFA compiler
if (!readExpression(i->second, re, &hs_flags, &ext)) {
throw NGCompileFailure("Cannot parse expression flags.");
}
// make sure we respect collider's UTF-8 setting
if (force_utf8) {
hs_flags |= HS_FLAG_UTF8;
}
try {
bool isStreaming = colliderMode == MODE_STREAMING;
bool isVectored = colliderMode == MODE_VECTORED;
CompileContext cc(isStreaming, isVectored, get_current_target(),
Grey());
ParsedExpression pe(0, re.c_str(), hs_flags, 0, &ext);
// UE-2850: ParsedExpression may have updated the utf8 flag if the
// original expression starts with (*UTF8)
utf8 |= pe.expr.utf8;
auto rm = ue2::make_unique<ReportManager>(cc.grey);
// Expressions containing zero-width assertions and other extended pcre
// types aren't supported yet. This call will throw a ParseError
// exception if the component tree contains such a construct.
checkUnsupported(*pe.component);
pe.component->checkEmbeddedStartAnchor(true);
pe.component->checkEmbeddedEndAnchor(true);
// edit distance may be set globally
if (force_edit_distance) {
pe.expr.edit_distance = edit_distance;
}
// validate_fuzzy_compile checks this, but we don't need to build the
// graph to know it will fail
if (pe.expr.edit_distance && utf8) {
throw NGCompileFailure("UTF-8 patterns cannot be "
"approximately matched");
}
auto built_expr = buildGraph(*rm, cc, pe);
auto &expr = built_expr.expr;
auto &g = built_expr.g;
if (expr.edit_distance || expr.hamm_distance) {
// check if this pattern can be approximately matched, throws
// CompileError on failure
bool hamming = expr.hamm_distance > 0;
u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance;
validate_fuzzy_compile(*g, e_dist, hamming, utf8, cc.grey);
}
if (isVacuous(*g)) {
if (som) {
throw NGUnsupportedFailure("Vacuous patterns are not supported "
"in SOM mode");
}
if (expr.min_length > 0) {
throw NGUnsupportedFailure("Vacuous patterns are not supported "
"in combination with min_length");
}
}
cng = make_unique<CompiledNG>(move(g), move(rm));
} catch (CompileError &e) {
throw NGCompileFailure(e.reason);
} catch (NGUnsupportedFailure &e) {
throw NGCompileFailure(e.msg);
} catch (...) {
throw NGCompileFailure("NFA graph construction failed");
}
}
GraphTruth::GraphTruth(ostream &os, const ExpressionMap &expr)
: out(os), m_expr(expr) {}
unique_ptr<CNGInfo> GraphTruth::preprocess(unsigned id,
bool ignoreUnsupported) {
bool highlander = false;
bool prefilter = false;
bool som = false;
auto i = m_expr.find(id);
if (i == m_expr.end()) {
throw NGCompileFailure("ID not found in expression map.");
}
string re;
unsigned flags, hs_flags;
hs_expr_ext ext;
// read the flags for NFA compiler
if (!readExpression(i->second, re, &hs_flags, &ext)) {
throw NGCompileFailure("Cannot parse expression flags.");
}
// read PCRE flags
if (!getPcreFlags(hs_flags, &flags, &highlander, &prefilter, &som)) {
throw NGCompileFailure("Cannot get PCRE flags.");
}
if (force_utf8) {
hs_flags |= HS_FLAG_UTF8;
}
// edit distance might be set globally
if (force_edit_distance) {
ext.edit_distance = edit_distance;
}
// SOM flags might be set globally.
som |= !!somFlags;
if (force_prefilter) {
prefilter = true;
}
u64a supported_flags = HS_EXT_FLAG_HAMMING_DISTANCE |
HS_EXT_FLAG_EDIT_DISTANCE | HS_EXT_FLAG_MIN_OFFSET |
HS_EXT_FLAG_MAX_OFFSET | HS_EXT_FLAG_MIN_LENGTH;
if (ext.flags & ~supported_flags) {
if (!ignoreUnsupported) {
throw NGUnsupportedFailure("Unsupported extended flags specified.");
}
}
auto cngi = make_unique<CNGInfo>(id, m_expr);
cngi->utf8 = hs_flags & HS_FLAG_UTF8;
cngi->highlander = highlander;
cngi->prefilter = prefilter;
cngi->som = som;
cngi->min_offset = ext.min_offset;
cngi->max_offset = ext.max_offset;
cngi->min_length = ext.min_length;
cngi->max_edit_distance = ext.edit_distance;
cngi->max_hamm_distance = ext.hamming_distance;
return cngi;
}
bool GraphTruth::run(unsigned, const CompiledNG &cng, const CNGInfo &cngi,
const string &buffer, ResultSet &rs, string &) {
set<pair<size_t, size_t>> matches;
if (g_streamOffset) {
size_t offset = MIN(100, g_streamOffset);
assert(offset > 0);
const string preamble(string(offset, '\0'));
set<pair<size_t, size_t>> pre_matches;
// First, scan an empty buffer size of the preamble so that we can
// discard any matches therein after the real scan, later. We use
// notEod so that end-anchors in our expression don't match at the
// end of the buffer.
if (!findMatches(*cng.g, *cng.rm, preamble, pre_matches,
cngi.max_edit_distance, cngi.max_hamm_distance, true,
cngi.utf8)) {
return false;
}
// Real scan.
if (!findMatches(*cng.g, *cng.rm, preamble + buffer, matches,
cngi.max_edit_distance, cngi.max_hamm_distance, false,
cngi.utf8)) {
return false;
}
// Erase any matches due entirely to the preamble.
for (const auto &m : pre_matches) {
matches.erase(m);
}
} else {
if (!findMatches(*cng.g, *cng.rm, buffer, matches,
cngi.max_edit_distance, cngi.max_hamm_distance, false,
cngi.utf8)) {
return false;
}
}
populateMatchSet(rs, matches, cngi);
if (echo_matches) {
for (const auto &m : rs.matches) {
out << "NFA Match @ (" << m.from << "," << m.to << ")" << endl;
}
}
return true;
}

View File

@@ -0,0 +1,144 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef GRAPHTRUTH_H
#define GRAPHTRUTH_H
#include "expressions.h"
#include "ResultSet.h"
#include "hs_compile.h" // for hs_expr_ext
#include "ue2common.h"
#include <memory>
#include <mutex>
#include <string>
#include <boost/core/noncopyable.hpp>
namespace ue2 {
class ReportManager;
struct BoundaryReports;
} // namespace ue2
struct NGCompileFailure {
explicit NGCompileFailure(const std::string &msg_s) : msg(msg_s) {}
std::string msg;
};
struct NGUnsupportedFailure {
explicit NGUnsupportedFailure(const std::string &msg_s) : msg(msg_s) {}
std::string msg;
};
// Struct to store the actual compiled NFA graph.
class CompiledNG;
// Struct to store the precompile information about the graph.
class CNGInfo : boost::noncopyable {
public:
CNGInfo(unsigned id_in, const ExpressionMap &m_expr_in);
~CNGInfo();
bool is_bad() {
std::lock_guard<std::mutex> lock(bad_mutex);
bool val = bad;
return val;
}
void mark_bad() {
std::lock_guard<std::mutex> lock(bad_mutex);
bad = true;
}
const CompiledNG *get() {
std::lock_guard<std::mutex> lock(cng_mutex);
if (cng) {
return cng.get();
}
// NFA graph hasn't been compiled yet.
try {
compile();
} catch (NGCompileFailure &e) {
throw NGCompileFailure(e);
} catch (NGUnsupportedFailure &e) {
throw NGCompileFailure(e.msg);
}
return cng.get();
}
u64a min_offset = 0;
u64a max_offset = 0;
u64a min_length = 0;
u32 max_edit_distance = 0;
u32 max_hamm_distance = 0;
bool utf8 = false;
bool highlander = false;
bool prefilter = false;
bool som = false;
private:
void compile();
// If NFA graph scan failed for some reason, we mark it as bad and skip
// the remaining tests for it for performance reasons.
bool bad = false;
std::mutex bad_mutex; // serialised accesses to bad flag.
std::unique_ptr<CompiledNG> cng; // compiled NFA graph
std::mutex cng_mutex; // serialised accesses to NFA graph
unsigned id;
// Our expression map
const ExpressionMap &m_expr;
};
class GraphTruth : boost::noncopyable {
public:
GraphTruth(std::ostream &os, const ExpressionMap &expr);
bool run(unsigned id, const CompiledNG &cng, const CNGInfo &cngi,
const std::string &buffer, ResultSet &rs, std::string &error);
std::unique_ptr<CNGInfo> preprocess(unsigned id,
bool ignoreUnsupported = false);
private:
// Output stream.
std::ostream &out;
// Our expression map
const ExpressionMap &m_expr;
};
#endif

View File

@@ -0,0 +1,513 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "common.h"
#include "ExpressionParser.h"
#include "expressions.h"
#include "GroundTruth.h"
#include "pcre_util.h"
#include "hs_compile.h" // for hs_expr_ext
#include "ue2common.h"
#include "parser/control_verbs.h"
#include "parser/Parser.h"
#include "parser/parse_error.h"
#include "util/make_unique.h"
#include "util/unicode_def.h"
#include "util/unordered.h"
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ostream>
#include <sstream>
#include <string>
#include <vector>
#include <pcre.h>
/* -X, -Y support
* as PCRE performance is `non-linear' and these options add a large amount of
* scanning, the following short cuts are used:
* 1: the suffix is not scanned - we are more interested in the matches from
* the original corpora.
* 2: only the last 50 bytes of the prefix is scanned. This may lead to some
* minor correctness issues for a few patterns.
*/
using namespace std;
using namespace ue2;
// We store matches in a hash table as we're likely to see lots of them. These
// are moved into a ResultSet at the end.
using PcreMatchSet = ue2::ue2_unordered_set<pair<unsigned, unsigned>>;
namespace {
struct CalloutContext {
explicit CalloutContext(ostream &os) : out(os) {}
ostream &out;
PcreMatchSet matches;
};
}
static
int pcreCallOut(pcre_callout_block *block) {
assert(block);
assert(block->callout_data);
CalloutContext *ctx = static_cast<CalloutContext *>(block->callout_data);
if (echo_matches) {
ctx->out << "PCRE Match @ (" << block->start_match << ","
<< block->current_position << ")" << endl;
}
unsigned int from = block->start_match;
unsigned int to = block->current_position;
assert(from <= to);
ctx->matches.insert(make_pair(from, to));
return 1;
}
static
bool decodeExprPcre(string &expr, unsigned *flags, bool *highlander,
bool *prefilter, bool *som, hs_expr_ext *ext) {
string regex;
unsigned int hs_flags = 0;
if (!readExpression(expr, regex, &hs_flags, ext)) {
return false;
}
expr.swap(regex);
if (!getPcreFlags(hs_flags, flags, highlander, prefilter, som)) {
return false;
}
if (force_utf8) {
*flags |= PCRE_UTF8;
}
if (force_prefilter) {
*prefilter = true;
}
return true;
}
static
string pcreErrStr(int err) {
switch (err) {
case PCRE_ERROR_NOMATCH:
return "PCRE_ERROR_NOMATCH";
case PCRE_ERROR_NULL:
return "PCRE_ERROR_NULL";
case PCRE_ERROR_BADOPTION:
return "PCRE_ERROR_BADOPTION";
case PCRE_ERROR_BADMAGIC:
return "PCRE_ERROR_BADMAGIC";
#if defined(PCRE_ERROR_UNKNOWN_OPCODE)
case PCRE_ERROR_UNKNOWN_OPCODE:
return "PCRE_ERROR_UNKNOWN_OPCODE";
#else
case PCRE_ERROR_UNKNOWN_NODE:
return "PCRE_ERROR_UNKNOWN_NODE";
#endif
case PCRE_ERROR_NOMEMORY:
return "PCRE_ERROR_NOMEMORY";
case PCRE_ERROR_NOSUBSTRING:
return "PCRE_ERROR_NOSUBSTRING";
case PCRE_ERROR_MATCHLIMIT:
return "PCRE_ERROR_MATCHLIMIT";
case PCRE_ERROR_CALLOUT:
return "PCRE_ERROR_CALLOUT";
case PCRE_ERROR_BADUTF8:
return "PCRE_ERROR_BADUTF8";
case PCRE_ERROR_BADUTF8_OFFSET:
return "PCRE_ERROR_BADUTF8_OFFSET";
case PCRE_ERROR_PARTIAL:
return "PCRE_ERROR_PARTIAL";
case PCRE_ERROR_BADPARTIAL:
return "PCRE_ERROR_BADPARTIAL";
case PCRE_ERROR_INTERNAL:
return "PCRE_ERROR_INTERNAL";
case PCRE_ERROR_BADCOUNT:
return "PCRE_ERROR_BADCOUNT";
#if defined(PCRE_ERROR_RECURSIONLIMIT)
case PCRE_ERROR_RECURSIONLIMIT:
return "PCRE_ERROR_RECURSIONLIMIT";
#endif
case PCRE_ERROR_DFA_UITEM:
return "PCRE_ERROR_DFA_UITEM";
case PCRE_ERROR_DFA_UCOND:
return "PCRE_ERROR_DFA_UCOND";
case PCRE_ERROR_DFA_UMLIMIT:
return "PCRE_ERROR_DFA_UMLIMIT";
case PCRE_ERROR_DFA_WSSIZE:
return "PCRE_ERROR_DFA_WSSIZE";
case PCRE_ERROR_DFA_RECURSE:
return "PCRE_ERROR_DFA_RECURSE";
default:
{
ostringstream oss;
oss << "Unknown PCRE error (value: " << err << ")";
return oss.str();
}
}
}
GroundTruth::GroundTruth(ostream &os, const ExpressionMap &expr,
unsigned long int limit,
unsigned long int limit_recursion)
: out(os), m_expr(expr), matchLimit(limit),
matchLimitRecursion(limit_recursion) {}
void GroundTruth::global_prep() {
// We're using pcre callouts
pcre_callout = &pcreCallOut;
}
static
void addCallout(string &re) {
// If the string begins with "(*UTF8)" or "(*UTF8)(*UCP)", we want to keep
// it at the front. We reuse the control verbs mini-parser for this.
size_t startpos = 0;
try {
ue2::ParseMode mode;
const char *ptr = ue2::read_control_verbs(
re.c_str(), re.c_str() + re.size(), 0, mode);
startpos = ptr - re.c_str();
} catch (const ue2::ParseError &err) {
// fall through
}
assert(startpos <= re.length());
re.insert(startpos, "(?:");
// We include a \E to close any open \Q quoted block. If there isn't
// one, pcre will ignore the \E.
re.append("\\E)(?C)");
}
unique_ptr<CompiledPcre>
GroundTruth::compile(unsigned id, bool no_callouts) {
bool highlander = false;
bool prefilter = false;
bool som = false;
// we can still match approximate matching patterns with PCRE if edit
// distance 0 is requested
if (force_edit_distance && edit_distance) {
throw SoftPcreCompileFailure("Edit distance not supported by PCRE.");
}
ExpressionMap::const_iterator i = m_expr.find(id);
if (i == m_expr.end()) {
throw PcreCompileFailure("ID not found in expression map.");
}
string re(i->second);
unsigned flags;
hs_expr_ext ext;
// Decode the flags
if (!decodeExprPcre(re, &flags, &highlander, &prefilter, &som, &ext)) {
throw PcreCompileFailure("Unable to decode flags.");
}
// filter out flags not supported by PCRE
u64a supported = HS_EXT_FLAG_MIN_OFFSET | HS_EXT_FLAG_MAX_OFFSET |
HS_EXT_FLAG_MIN_LENGTH;
if (ext.flags & ~supported) {
// edit distance is a known unsupported flag, so just throw a soft error
if (ext.flags & HS_EXT_FLAG_EDIT_DISTANCE) {
throw SoftPcreCompileFailure("Edit distance not supported by PCRE.");
}
if (ext.flags & HS_EXT_FLAG_HAMMING_DISTANCE) {
throw SoftPcreCompileFailure(
"Hamming distance not supported by PCRE.");
}
throw PcreCompileFailure("Unsupported extended flags.");
}
// SOM flags might be set globally.
som |= !!somFlags;
// For traditional Hyperscan, add global callout to pattern.
if (!no_callouts) {
addCallout(re);
}
// Compile the pattern
const char *errptr = nullptr;
int errloc = 0;
int errcode = 0;
unique_ptr<CompiledPcre> compiled = make_unique<CompiledPcre>();
compiled->utf8 = flags & PCRE_UTF8;
compiled->highlander = highlander;
compiled->prefilter = prefilter;
compiled->som = som;
compiled->min_offset = ext.min_offset;
compiled->max_offset = ext.max_offset;
compiled->min_length = ext.min_length;
compiled->expression = i->second; // original PCRE
flags |= PCRE_NO_AUTO_POSSESS;
compiled->bytecode =
pcre_compile2(re.c_str(), flags, &errcode, &errptr, &errloc, nullptr);
if (!compiled->bytecode || errptr) {
assert(errcode);
ostringstream oss;
oss << "Failed to compile expression '" << re << '\'';
oss << " (" << errptr << " at " << errloc << ").";
if (errcode == 20) { // "regular expression is too large"
throw SoftPcreCompileFailure(oss.str());
} else if (errcode == 25) { // "lookbehind assertion is not fixed length"
throw SoftPcreCompileFailure(oss.str());
} else {
throw PcreCompileFailure(oss.str());
}
}
// Study the pattern
shared_ptr<pcre_extra> extra(pcre_study(compiled->bytecode, 0, &errptr),
free);
if (errptr) {
ostringstream oss;
oss << "Error studying pattern (" << errptr << ").";
throw PcreCompileFailure(oss.str());
}
int infoRes =
pcre_fullinfo(compiled->bytecode, extra.get(), PCRE_INFO_CAPTURECOUNT,
&compiled->captureCount);
if (infoRes < PCRE_ERROR_NOMATCH) {
ostringstream oss;
oss << "Error determining number of capturing subpatterns ("
<< pcreErrStr(infoRes) << ").";
throw PcreCompileFailure(oss.str());
}
return compiled;
}
static
void filterLeftmostSom(ResultSet &rs) {
if (rs.matches.size() <= 1) {
return;
}
set<u64a> seen; // End offsets.
set<MatchResult>::iterator it = rs.matches.begin();
while (it != rs.matches.end()) {
if (seen.insert(it->to).second) {
++it; // First time we've seen this end-offset.
} else {
rs.matches.erase(it++); // Dupe with a "righter" SOM.
}
}
}
static
void filterExtParams(ResultSet &rs, const CompiledPcre &compiled) {
set<MatchResult>::iterator it = rs.matches.begin();
while (it != rs.matches.end()) {
unsigned int from = it->from, to = it->to;
unsigned int len = to - from;
if (to < compiled.min_offset || to > compiled.max_offset ||
len < compiled.min_length) {
rs.matches.erase(it++);
} else {
++it;
}
}
}
static
int scanBasic(const CompiledPcre &compiled, const string &buffer,
const pcre_extra &extra, vector<int> &ovector,
CalloutContext &ctx) {
const size_t prefix_len = g_corpora_prefix.size();
const size_t suffix_len = g_corpora_suffix.size();
size_t begin_offset = prefix_len - MIN(50, prefix_len);
size_t real_len = buffer.size();
if (suffix_len > 2) {
real_len -= suffix_len - 2;
}
int flags = suffix_len ? PCRE_NOTEOL : 0;
int ret = pcre_exec(compiled.bytecode, &extra, buffer.c_str(), real_len,
begin_offset, flags, &ovector[0], ovector.size());
if (!g_corpora_prefix.empty()) {
PcreMatchSet tmp;
tmp.swap(ctx.matches);
for (const auto &m : tmp) {
unsigned from = m.first;
unsigned to = m.second;
if (to >= prefix_len && to <= buffer.size() - suffix_len) {
from = from < prefix_len ? 0 : from - prefix_len;
to -= prefix_len;
ctx.matches.insert(make_pair(from, to));
}
}
}
return ret;
}
static
int scanOffset(const CompiledPcre &compiled, const string &buffer,
const pcre_extra &extra, vector<int> &ovector,
CalloutContext &ctx) {
size_t offset = MIN(100, g_streamOffset);
assert(offset > 0);
const string buf(string(offset, '\0') + buffer);
// First, scan our preamble so that we can discard any matches therein
// after the real scan, later. We use PCRE_NOTEOL so that end-anchors in
// our expression don't match at the end of the preamble.
int ret = pcre_exec(compiled.bytecode, &extra, buf.c_str(), offset, 0,
PCRE_NOTEOL, &ovector[0], ovector.size());
if (ret < PCRE_ERROR_NOMATCH) {
return ret;
}
PcreMatchSet pre_matches;
pre_matches.swap(ctx.matches);
// Real scan.
ret = pcre_exec(compiled.bytecode, &extra, buf.c_str(), buf.size(), 0, 0,
&ovector[0], ovector.size());
if (ret < PCRE_ERROR_NOMATCH) {
return ret;
}
// Erase any matches due entirely to the preamble.
for (const auto &m : pre_matches) {
ctx.matches.erase(m);
}
return ret;
}
bool GroundTruth::run(unsigned, const CompiledPcre &compiled,
const string &buffer, ResultSet &rs, string &error) {
CalloutContext ctx(out);
pcre_extra extra;
extra.flags = 0;
// Switch on callouts.
extra.flags |= PCRE_EXTRA_CALLOUT_DATA;
extra.callout_data = &ctx;
// Set the match_limit (in order to bound execution time on very complex
// patterns)
extra.flags |= (PCRE_EXTRA_MATCH_LIMIT | PCRE_EXTRA_MATCH_LIMIT_RECURSION);
extra.match_limit = matchLimit;
extra.match_limit_recursion = matchLimitRecursion;
#ifdef PCRE_NO_START_OPTIMIZE
// Switch off optimizations that may result in callouts not occurring.
extra.flags |= PCRE_NO_START_OPTIMIZE;
#endif
// Ensure there's enough room in the ovector for the capture groups in this
// pattern.
int ovecsize = (compiled.captureCount + 1) * 3;
ovector.resize(ovecsize);
int ret;
switch (colliderMode) {
case MODE_BLOCK:
case MODE_STREAMING:
case MODE_VECTORED:
if (g_streamOffset) {
ret = scanOffset(compiled, buffer, extra, ovector, ctx);
} else {
ret = scanBasic(compiled, buffer, extra, ovector, ctx);
}
break;
default:
assert(0);
ret = PCRE_ERROR_NULL;
break;
}
if (ret < PCRE_ERROR_NOMATCH) {
error = pcreErrStr(ret);
return false;
}
// Move matches into a ResultSet.
for (const auto &m : ctx.matches) {
unsigned long long from = m.first;
unsigned long long to = m.second;
if (g_streamOffset) {
// Subtract stream offset imposed by offset test.
unsigned long long offset = min(100ull, g_streamOffset);
assert(to >= offset);
from -= min(offset, from);
to -= offset;
}
rs.addMatch(from, to);
}
// If we have no matches, there's no further work to do.
if (rs.matches.empty()) {
return true;
}
if (compiled.som) {
filterLeftmostSom(rs);
}
filterExtParams(rs, compiled);
// If we haven't been asked for SOM, strip the from offsets.
if (!compiled.som) {
set<MatchResult> endonly;
for (const auto &m : rs.matches) {
endonly.insert(MatchResult(0, m.to));
}
rs.matches.swap(endonly);
}
return true;
}

View File

@@ -0,0 +1,126 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef GROUNDTRUTH_H
#define GROUNDTRUTH_H
#include "expressions.h"
#include "ResultSet.h"
#include <memory>
#include <mutex>
#include <string>
#include <vector>
#include <pcre.h>
#include <boost/core/noncopyable.hpp>
// Thrown by GroundTruth::compile in the event of a PCRE compile failure.
struct PcreCompileFailure {
PcreCompileFailure(const std::string &msg_s) : msg(msg_s) {}
std::string msg;
};
// Thrown in the event of a "soft" PCRE compile failure, one that we don't want
// to consider a ue2collider failure (e.g. "regular expression too large").
struct SoftPcreCompileFailure : PcreCompileFailure {
SoftPcreCompileFailure(const std::string &msg_s)
: PcreCompileFailure(msg_s) {}
};
// Struct to store everything about a PCRE. Note that the code assumes that
// once populated, the data in this structure will remain constant while tests
// are running, except for the bad flag (which is protected by a mutex).
class CompiledPcre : boost::noncopyable {
public:
CompiledPcre() {}
~CompiledPcre() {
free(bytecode);
}
bool is_bad() {
std::lock_guard<std::mutex> lock(bad_mutex);
bool val = bad;
return val;
}
void mark_bad() {
std::lock_guard<std::mutex> lock(bad_mutex);
bad = true;
}
std::string expression;
pcre *bytecode = nullptr;
unsigned long long min_offset = 0;
unsigned long long max_offset = ~0ULL;
unsigned long long min_length = 0;
int captureCount = 0;
bool utf8 = false;
bool highlander = false;
bool prefilter = false;
bool som = false;
private:
// If a PCRE has hit its match recursion limit when scanning a corpus, we
// mark it as bad and skip the remaining tests for it for performance
// reasons.
bool bad = false;
std::mutex bad_mutex; // serialised accesses to bad flag.
};
// Wrapper around libpcre to generate results for an expression and corpus.
class GroundTruth : boost::noncopyable {
public:
GroundTruth(std::ostream &os, const ExpressionMap &expr,
unsigned long limit, unsigned long limit_recursion);
static void global_prep();
std::unique_ptr<CompiledPcre> compile(unsigned id,
bool no_callouts = false);
bool run(unsigned id, const CompiledPcre &compiled,
const std::string &buffer, ResultSet &rs, std::string &error);
private:
// Output stream.
std::ostream &out;
// Our expression map
const ExpressionMap &m_expr;
// PCRE match limit
const unsigned long int matchLimit;
const unsigned long int matchLimitRecursion;
// Persistent ovector used to run tests.
std::vector<int> ovector;
};
#endif

View File

@@ -0,0 +1,146 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "ng_corpus_properties.h"
#include "ng_corpus_generator.h"
#include "NfaGeneratedCorpora.h"
#include "ExpressionParser.h"
#include "grey.h"
#include "hs_compile.h"
#include "compiler/compiler.h"
#include "nfagraph/ng.h"
#include "parser/parse_error.h"
#include "parser/Parser.h"
#include "parser/prefilter.h"
#include "parser/unsupported.h"
#include "util/compile_context.h"
#include "util/compile_error.h"
#include "util/report_manager.h"
#include "util/target_info.h"
#include <string>
#include <sstream>
#include <vector>
using namespace std;
using namespace ue2;
NfaGeneratedCorpora::NfaGeneratedCorpora(const ExpressionMap &expr,
const CorpusProperties &props,
bool force_utf8_mode_in,
bool force_prefilter_mode_in)
: m_expr(expr), m_props(props), force_utf8_mode(force_utf8_mode_in),
force_prefilter_mode(force_prefilter_mode_in) {
// empty
}
NfaGeneratedCorpora *NfaGeneratedCorpora::clone() const {
return new NfaGeneratedCorpora(m_expr, m_props, force_utf8_mode,
force_prefilter_mode);
}
void NfaGeneratedCorpora::generate(unsigned id, vector<Corpus> &data) {
ExpressionMap::const_iterator i = m_expr.find(id);
if (i == m_expr.end()) {
throw CorpusFailure("Expression not found.");
}
string re;
u32 hs_flags;
hs_expr_ext ext;
if (!readExpression(i->second, re, &hs_flags, &ext)) {
throw CorpusFailure("Expression could not be read: " + i->second);
}
if (force_utf8_mode) {
hs_flags |= HS_FLAG_UTF8;
}
if (force_prefilter_mode) {
hs_flags |= HS_FLAG_PREFILTER;
}
// Wrap the UE2 parser and compiler functionality and use it to generate
// corpora for us.
vector<string> c;
try {
ParsedExpression pe(0, re.c_str(), hs_flags, 0, &ext);
// Apply prefiltering transformations if desired.
if (pe.expr.prefilter) {
prefilterTree(pe.component, ParseMode(hs_flags));
}
// Bail on patterns with unsupported constructs.
checkUnsupported(*pe.component);
pe.component->checkEmbeddedStartAnchor(true);
pe.component->checkEmbeddedEndAnchor(true);
CompileContext cc(false, false, get_current_target(), Grey());
ReportManager rm(cc.grey);
auto built_expr = buildGraph(rm, cc, pe);
if (!built_expr.g) {
// A more specific error should probably have been thrown by
// buildGraph.
throw CorpusFailure("could not build graph.");
}
const auto cg =
makeCorpusGenerator(*built_expr.g, built_expr.expr, m_props);
cg->generateCorpus(c);
}
catch (const ParseError &e) {
throw CorpusFailure("compilation failed, " + e.reason);
}
catch (const CompileError &e) {
throw CorpusFailure("compilation failed, " + e.reason);
}
catch (const std::bad_alloc &) {
throw CorpusFailure("out of memory.");
}
catch (const CorpusGenerationFailure &e) {
// if corpus generation failed, just pass up the error message
throw CorpusFailure("corpus generation failed: " + e.message);
}
catch (...) {
throw CorpusFailure("unknown error.");
}
if (c.empty()) {
throw CorpusFailure("no corpora generated.");
}
data.reserve(data.size() + c.size());
for (const auto &e : c) {
data.push_back(Corpus(e));
}
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef NFAGENERATEDCORPORA_H
#define NFAGENERATEDCORPORA_H
#include "Corpora.h"
#include "ng_corpus_properties.h"
#include "expressions.h"
#include <string>
#include <vector>
// Corpora associated with a pattern set
class NfaGeneratedCorpora : public CorporaSource {
public:
NfaGeneratedCorpora(const ExpressionMap &expr,
const CorpusProperties &props, bool force_utf8_mode_in,
bool force_prefilter_mode_in);
NfaGeneratedCorpora *clone() const override;
void generate(unsigned id, std::vector<Corpus> &data) override;
private:
// Expressions handled by this corpora object
const ExpressionMap &m_expr;
// CorpusProperties policy object
CorpusProperties m_props;
bool force_utf8_mode;
bool force_prefilter_mode;
};
#endif

View File

@@ -0,0 +1,139 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef RESULTSET_H
#define RESULTSET_H
#include <iostream>
#include <map>
#include <set>
#include <utility>
#include <vector>
// Class representing a single match, encapsulating to/from offsets.
class MatchResult {
public:
MatchResult(unsigned long long start, unsigned long long end)
: from(start), to(end) {}
bool operator<(const MatchResult &a) const {
if (from != a.from) {
return from < a.from;
}
return to < a.to;
}
bool operator==(const MatchResult &a) const {
return from == a.from && to == a.to;
}
unsigned long long from;
unsigned long long to;
};
enum ResultSource {
RESULT_FROM_UE2,
RESULT_FROM_PCRE,
RESULT_FROM_GRAPH,
};
inline
std::ostream &operator<<(std::ostream &out, ResultSource src) {
switch (src) {
case RESULT_FROM_UE2:
out << "UE2";
break;
case RESULT_FROM_GRAPH:
out << "Graph";
break;
case RESULT_FROM_PCRE:
out << "PCRE";
break;
}
return out;
}
class ResultSet {
public:
// Constructor.
explicit ResultSet(ResultSource s) : src(s) {}
// Can be constructed with a set of end-offsets.
ResultSet(const std::set<unsigned int> &m, ResultSource s) : src(s) {
for (const auto &offset : m) {
matches.emplace(0, offset);
}
}
// Equality.
bool operator==(const ResultSet &other) const {
return uoom == other.uoom &&
match_after_halt == other.match_after_halt &&
invalid_id == other.invalid_id &&
matches == other.matches;
}
// Inequality.
bool operator!=(const ResultSet &other) const { return !(*this == other); }
// Add a match.
void addMatch(unsigned long long from, unsigned long long to,
int block = 0) {
MatchResult m(from, to);
matches.insert(m);
if (matches_by_block[block].find(m) != matches_by_block[block].end()) {
dupe_matches.insert(m);
} else {
matches_by_block[block].insert(m);
}
}
// Unexpected out of order match seen.
bool uoom = false;
// A match was received after termination was requested.
bool match_after_halt = false;
// A match from an invalid ID was seen.
bool invalid_id = false;
// Ordered set of matches.
std::set<MatchResult> matches;
// Matches grouped by stream write/block that we see them in.
std::map<int, std::set<MatchResult>> matches_by_block;
// Dupe matches that we have seen.
std::set<MatchResult> dupe_matches;
/* Where these results came from (does not take part in comparisions) */
ResultSource src;
};
#endif

View File

@@ -0,0 +1,95 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "Thread.h"
#include "common.h"
#include "sig.h"
#include <cstdlib>
#include <iostream>
#include <pthread.h>
static const size_t COLLIDER_THREAD_STACK_SIZE = 8192 * 1024;
void Thread::start() {
// Some systems, notably Mac OS X, use a default stack size that is
// smaller than what we want (particularly given that we're planning on
// running PCRE, which recurses inside pcre_exec). We attempt to
// increase it to 8MB.
int ret;
pthread_attr_t attr;
ret = pthread_attr_init(&attr);
if (ret) {
std::cerr << "pthread_attr_init failed" << std::endl;
exit(1);
}
size_t stacksize = 0;
ret = pthread_attr_getstacksize(&attr, &stacksize);
if (ret) {
std::cerr << "Warning: can't query stack size with "
"pthread_attr_getstacksize" << std::endl;
goto create_thread;
}
if (stacksize < COLLIDER_THREAD_STACK_SIZE) {
ret = pthread_attr_setstacksize(&attr, COLLIDER_THREAD_STACK_SIZE);
if (ret) {
std::cerr << "Warning: pthread_attr_setstacksize failed, "
"unable to set stack size to "
<< COLLIDER_THREAD_STACK_SIZE << " bytes." << std::endl;
// Fall through: this isn't necessarily fatal (yet!)
}
}
create_thread:
ret = pthread_create(&thread, &attr, &runThread, this);
if (ret) {
std::cerr << "pthread_create failed for thread id " << thread_id
<< std::endl;
exit(1);
}
}
// Dispatch
void *Thread::runThread(void *thr) {
if (!no_signal_handler) {
setSignalStack();
}
((Thread *)thr)->run();
return nullptr;
}
void Thread::join() { pthread_join(thread, nullptr); }
Thread::Thread(size_t num) : thread_id(num) {}
Thread::~Thread() {}

60
tools/hscollider/Thread.h Normal file
View File

@@ -0,0 +1,60 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef UE2COLLIDER_THREAD_H
#define UE2COLLIDER_THREAD_H
#include <cstdlib>
#include <pthread.h>
#include <boost/core/noncopyable.hpp>
class Thread : boost::noncopyable {
public:
explicit Thread(size_t num);
virtual ~Thread();
virtual void start();
// Dispatch
static void *runThread(void *thr);
virtual void join();
// Implemented by subclasses.
virtual void run() = 0;
protected:
const size_t thread_id;
private:
pthread_t thread;
};
#endif // UE2COLLIDER_THREAD_H

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,142 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ULTIMATETRUTH_H
#define ULTIMATETRUTH_H
#include "expressions.h"
#include "hs.h"
#include <memory>
#include <ostream>
#include <set>
#include <string>
#include <vector>
#include <boost/core/noncopyable.hpp>
namespace ue2 {
struct Grey;
} // namespace ue2
class HyperscanDB;
class ResultSet;
// Wrapper around ue2 to generate results for an expression and corpus.
class UltimateTruth : boost::noncopyable {
public:
UltimateTruth(std::ostream &os, const ExpressionMap &expr,
const hs_platform_info *plat, const ue2::Grey &grey,
unsigned streamBlocks = 0);
~UltimateTruth();
std::shared_ptr<HyperscanDB> compile(const std::set<unsigned> &ids,
std::string &error) const;
bool saveDatabase(const HyperscanDB &db,
const std::string &filename) const;
std::shared_ptr<HyperscanDB>
loadDatabase(const std::string &filename,
const std::set<unsigned> &ids) const;
// Are we runnable? (i.e. not xcompiling)
bool runnable() const {
return !m_xcompile;
}
bool run(unsigned id, std::shared_ptr<const HyperscanDB> db,
const std::string &buffer, bool single_pattern, unsigned align,
ResultSet &rs);
// Returns a value completely representing this object's compile options.
unsigned int describe() const;
std::string dbFilename(const std::set<unsigned int> &ids) const;
private:
bool blockScan(const HyperscanDB &db, const std::string &buffer,
size_t align, match_event_handler callback, void *ctx,
ResultSet *rs);
bool streamingScan(const HyperscanDB &db, const std::string &buffer,
size_t align, match_event_handler callback, void *ctx,
ResultSet *rs);
bool vectoredScan(const HyperscanDB &db, const std::string &buffer,
size_t align, match_event_handler callback, void *ctx,
ResultSet *rs);
char *setupScanBuffer(const char *buf, size_t len, size_t align);
char *setupVecScanBuffer(const char *buf, size_t len, size_t align,
unsigned int block_id);
bool allocScratch(std::shared_ptr<const HyperscanDB> db);
bool cloneScratch(void);
std::string dbSettingsHash(const std::set<unsigned int> &ids) const;
const ue2::Grey &grey;
// Output stream.
std::ostream &out;
// Our expression map
const ExpressionMap &m_expr;
// Are we cross-compiling, and therefore unable to scan at all?
bool m_xcompile;
// Our mode flags to pass into the compiler: calculated from streaming,
// etc.
unsigned m_mode;
// In streaming mode, what is the number of blocks to chop data into?
unsigned m_streamBlocks;
// Scratch space for Hyperscan.
hs_scratch_t *scratch;
// Temporary scan buffer used for realigned scanning
std::vector<char> m_scanBuf;
std::vector<std::vector<char> > raw_blocks; /* temp scan buffers used by
* vectored mode */
// Last database we successfully allocated scratch for, so that we can
// avoid unnecessarily reallocating for it.
std::shared_ptr<const HyperscanDB> last_db;
const hs_platform_info *platform;
};
#endif

570
tools/hscollider/args.cpp Normal file
View File

@@ -0,0 +1,570 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "ng_corpus_properties.h"
#include "args.h"
#include "common.h"
#include "cross_compile.h"
#include "util/expression_path.h"
#include "util/string_util.h"
#include "grey.h"
#include "ue2common.h"
#include "hs_compile.h" // for HS_MODE_*
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <string>
#include <vector>
#include <getopt.h>
#define xstr(s) str(s)
#define str(s) #s
using namespace ue2;
using namespace std;
// display usage information, with an optional error
static
void usage(const char *name, const char *error) {
printf("Usage: %s [OPTIONS...]\n\n", name);
printf("General Options:\n\n");
printf(" -h Display help and exit.\n");
printf(" -G OVERRIDES Overrides for the grey box.\n");
printf(" -e PATH Path to expression directory or file.\n");
printf(" -s FILE Signature file to use.\n");
printf(" -z NUM Signature ID to use.\n");
printf(" -c FILE Load corpora from FILE rather than using "
"generator.\n");
printf(" -w FILE After running, save corpora (with matches) to "
"FILE.\n");
printf(" -a [BAND] Compile all expressions in UE2 (but still match "
"singly).\n");
printf(" If BAND, compile patterns in groups of size "
"BAND.\n");
printf(" -t NUM Use streaming mode, split data into ~NUM "
"blocks.\n");
printf(" -V NUM Use vectored mode, split data into ~NUM "
"blocks.\n");
printf(" -Z {R or 0-%d} Only test one alignment, either as given or "
"'R' for random.\n", MAX_MAX_UE2_ALIGN - 1);
printf(" -q Quiet; display only match differences, no other "
"failures.\n");
printf(" -v Verbose; display successes as well as "
"failures.\n");
printf("\n");
printf("Pattern flags:\n");
printf("\n");
printf(" -8 Force UTF8 mode on all patterns.\n");
printf(" -L Apply HS_FLAG_SOM_LEFTMOST to all patterns.\n");
printf(" -E DISTANCE Match all patterns within edit distance"
" DISTANCE.\n");
printf(" --prefilter Apply HS_FLAG_PREFILTER to all patterns.\n");
printf("\n");
printf("Testing mode options:\n");
printf("\n");
printf(" -d NUM Set SOM precision mode (default: 8 (large)).\n");
printf(" -O NUM In streaming mode, set initial offset to NUM.\n");
printf(" -k NUM Terminate callback after NUM matches per "
"pattern.\n");
printf(" --copy-scratch Copy scratch after each scan call.\n");
printf(" --copy-stream Copy stream state after each scan call.\n");
printf(" --compress-expand Compress and expand stream state after each "
"scan call.\n");
printf(" --compress-reset-expand Compress, reset and expand stream state "
"after each scan call.\n");
printf(" --mangle-scratch Mangle scratch space after each scan call.\n");
printf(" --no-nfa Disable NFA graph execution engine.\n");
printf(" --no-pcre Disable PCRE engine.\n");
printf(" --test-nfa Disable UE2 engine (test NFA against PCRE).\n");
printf(" --abort-on-fail Abort, rather than exit, on failure.\n");
printf(" --no-signal-handler Do not handle handle signals (to generate "
"backtraces).\n");
printf("\n");
printf("Memory and resource control options:\n");
printf("\n");
printf(" -T NUM Run with NUM threads.\n");
printf(" -M NUM Set maximum memory allocated to NUM megabytes per"
" thread.\n");
printf(" (0 means no limit, default is 1000 MB).\n");
printf(" -m NUM Set PCRE_MATCH_LIMIT (default: %lu).\n",
DEFAULT_PCRE_MATCH_LIMIT);
printf(" -r NUM Set PCRE_MATCH_LIMIT_RECURSION (default: %lu).\n",
DEFAULT_PCRE_MATCH_RECURSION_LIMIT);
printf("\n");
printf("Cross-compiling:\n");
printf("\n");
printf(" -x NAME Cross-compile for arch NAME.\n");
printf(" -i DIR Don't compile, load from files in DIR "
"instead.\n");
printf(" -o DIR After compiling, save to files in DIR.\n");
printf("\n");
printf("Corpus generation options:\n");
printf("\n");
printf(" -n NUM Max corpora to generate for a given signature "
"(default: %u).\n", DEFAULT_CORPUS_GENERATOR_LIMIT);
printf(" -R NUM Random seed to use (default: seeded from "
"time()).\n");
printf(" -p NUM,NUM,NUM Percentage probabilities of "
"(match,unmatch,random) char.\n");
printf(" -C NUM,NUM Follow cycles (min,max) times.\n");
printf(" -P NUM,NUM Add a random prefix of length between "
"(min,max).\n");
printf(" -S NUM,NUM Add a random suffix of length between "
"(min,max).\n");
printf(" -D NUM Apply an edit distance (default: 0) to each "
"corpus.\n");
printf(" -b NUM Limit alphabet to NUM characters, starting at "
"lower-case 'a'.\n");
printf("\n");
if (error) {
printf("Error: %s\n", error);
}
}
void processArgs(int argc, char *argv[], CorpusProperties &corpus_gen_prop,
vector<string> *corpora, UNUSED Grey *grey,
unique_ptr<hs_platform_info> *plat_out) {
static const char options[]
= "-ab:cC:d:D:e:E:G:hi:k:Lm:M:n:o:O:p:P:qr:R:S:s:t:T:vV:w:x:X:Y:z:Z:8";
s32 in_multi = 0;
s32 in_corpora = 0;
int pcreFlag = 1;
int nfaFlag = 1;
int ue2Flag = 1;
int copyScratch = 0;
int copyStream = 0;
int mangleScratch = 0;
int compressFlag = 0;
int compressResetFlag = 0;
static const struct option longopts[] = {
{"copy-scratch", 0, &copyScratch, 1},
{"copy-stream", 0, &copyStream, 1},
{"mangle-scratch", 0, &mangleScratch, 1},
{"prefilter", 0, &force_prefilter, 1},
{"no-pcre", 0, &pcreFlag, 0},
{"no-nfa", 0, &nfaFlag, 0},
{"test-nfa", 0, &ue2Flag, 0},
{"abort-on-fail", 0, &abort_on_failure, 1},
{"no-signal-handler", 0, &no_signal_handler, 1},
{"compress-expand", 0, &compressFlag, 1},
{"compress-reset-expand", 0, &compressResetFlag, 1},
{nullptr, 0, nullptr, 0}};
for (;;) {
int c = getopt_long(argc, argv, options, longopts, nullptr);
if (c < 0) {
break;
}
switch (c) {
case 'a':
g_ue2CompileAll = true;
in_multi = 2;
break;
case 'b': {
unsigned sz;
if (!fromString(optarg, sz) || sz > 256) {
usage(argv[0], "Must provide an integer argument <= 256"
"to '-b' flag");
exit(1);
}
corpus_gen_prop.alphabetSize = sz;
break;
}
case 'c':
in_corpora = 2;
break;
case 'C': {
vector<unsigned> nums;
if (!strToList(optarg, nums) || nums.size() != 2
|| nums[0] > nums[1]) {
usage(argv[0], "Cycle limit '-C' argument takes a list of "
" integers: MIN,MAX");
exit(1);
}
corpus_gen_prop.setCycleLimit(nums[0], nums[1]);
break;
}
case 'd': {
unsigned dist;
if (!fromString(optarg, dist)) {
usage(argv[0],
"Must provide an integer argument to '-d' flag");
exit(1);
}
switch (dist) {
case 2:
somPrecisionMode = HS_MODE_SOM_HORIZON_SMALL;
break;
case 4:
somPrecisionMode = HS_MODE_SOM_HORIZON_MEDIUM;
break;
case 8:
somPrecisionMode = HS_MODE_SOM_HORIZON_LARGE;
break;
default:
usage(argv[0], "SOM precision must be 2, 4 or 8");
exit(1);
}
break;
}
case 'D': {
unsigned dist;
if (!fromString(optarg, dist)) {
usage(argv[0],
"Must provide an integer argument to '-D' flag");
exit(1);
}
corpus_gen_prop.editDistance = dist;
break;
}
case 'e':
g_exprPath.assign(optarg);
break;
case 'E': {
u32 dist;
if (!fromString(optarg, dist)) {
usage(argv[0], "Argument to '-E' flag must be an integer");
exit(1);
}
force_edit_distance = true;
edit_distance = dist;
break;
}
#ifndef RELEASE_BUILD
case 'G':
applyGreyOverrides(grey, string(optarg));
break;
#endif
case 'h':
usage(argv[0], nullptr);
exit(0);
case 'i':
loadDatabases = true;
serializePath = optarg;
break;
case 'k':
if (!fromString(optarg, limit_matches) || limit_matches < 1) {
usage(argv[0],
"Must provide a positive integer argument to '-k' "
"flag");
exit(1);
}
break;
case 'L':
somFlags = HS_FLAG_SOM_LEFTMOST;
break;
case 'm':
if (!fromString(optarg, g_matchLimit) || g_matchLimit < 1) {
usage(argv[0],
"Must provide a positive integer argument to '-m' "
"flag");
exit(1);
}
break;
case 'M':
if (!fromString(optarg, g_memoryLimit)) {
usage(argv[0],
"Must provide a positive (or zero) integer argument "
"to '-M' flag");
exit(1);
}
break;
case 'n': {
unsigned int count;
if (!fromString(optarg, count)) {
usage(argv[0], "Argument to '-n' flag must be an integer");
exit(1);
}
corpus_gen_prop.corpusLimit = count;
break;
}
case 'o':
saveDatabases = true;
serializePath = optarg;
break;
case 'O':
if (!fromString(optarg, g_streamOffset)) {
usage(argv[0],
"Argument '-O' flag must be a positive integer");
exit(1);
}
break;
case 'p': {
vector<unsigned> prob;
if (!strToList(optarg, prob) || prob.size() != 3) {
usage(argv[0], "Probabilities '-p' argument takes a list "
"of three integers: MATCH,UNMATCH,RANDOM");
exit(1);
}
if (!corpus_gen_prop.setPercentages(prob[0], prob[1],
prob[2])) {
usage(argv[0],
"Unable to set corpus generator probabilities.");
exit(1);
}
break;
}
case 'P': {
vector<unsigned> nums;
if (!strToList(optarg, nums) || nums.size() != 2
|| nums[0] > nums[1]) {
usage(argv[0], "Prefix '-P' argument takes a list of two"
" integers: MIN,MAX");
exit(1);
}
corpus_gen_prop.prefixRange = min_max(nums[0], nums[1]);
break;
}
case 'q':
g_quiet++;
break;
case 'r':
if (!fromString(optarg, g_matchLimitRecursion)
|| g_matchLimitRecursion < 1) {
usage(argv[0], "Must provide a positive integer argument "
"to '-r' flag");
exit(1);
}
break;
case 'R': {
if (!fromString(optarg, randomSeed)) {
usage(argv[0], "Argument to '-R' flag must be an integer");
exit(1);
}
corpus_gen_prop.seed(randomSeed);
break;
}
case 's':
g_signatureFiles.push_back(optarg);
break;
case 'S': {
vector<unsigned> nums;
if (!strToList(optarg, nums) || nums.size() != 2 ||
nums[0] > nums[1]) {
usage(argv[0], "Suffix '-S' argument takes a list of two"
" integers: MIN,MAX");
exit(1);
}
corpus_gen_prop.suffixRange = min_max(nums[0], nums[1]);
break;
}
case 't':
if (colliderMode != MODE_BLOCK) {
usage(argv[0], "You can only use one mode at a time!");
exit(1);
}
colliderMode = MODE_STREAMING;
if (!fromString(optarg, g_streamBlocks) || g_streamBlocks < 1) {
usage(argv[0], "Must provide a positive integer argument "
"to '-t' flag");
exit(1);
}
break;
case 'T':
if (!fromString(optarg, numThreads) || numThreads < 1) {
usage(argv[0], "Must provide a positive integer argument "
"to '-T' flag");
exit(1);
}
break;
case 'v':
if (g_verbose) {
echo_matches = true;
}
g_verbose = true;
break;
case 'V':
if (colliderMode != MODE_BLOCK) {
usage(argv[0], "You can only use one mode at a time!");
exit(1);
}
colliderMode = MODE_VECTORED;
if (!fromString(optarg, g_streamBlocks) || g_streamBlocks < 1) {
usage(argv[0], "Must provide a positive integer argument "
"to '-t' flag");
exit(1);
}
break;
case 'w':
saveCorpora = true;
saveCorporaFile = optarg;
break;
case 'x':
*plat_out = xcompileReadMode(optarg);
if (!*plat_out) {
usage(argv[0], xcompileUsage().c_str());
exit(1);
}
break;
case 'X': {
u32 count;
if (!fromString(optarg, count)) {
usage(argv[0], "Argument to '-X' flag must be an integer");
exit(1);
}
g_corpora_prefix.insert(g_corpora_prefix.end(), count, '~');
break;
}
case 'Y':
{
u32 count;
if (!fromString(optarg, count)) {
usage(argv[0], "Argument to '-Y' flag must be an integer");
exit(1);
}
g_corpora_suffix.insert(g_corpora_suffix.end(), count, '~');
break;
}
case 'z':
if (!strToList(optarg, g_signatures)) {
usage(argv[0],
"Argument to '-z' flag must be a list of integers");
exit(1);
}
break;
case 'Z':
static constexpr unsigned ALIGN_LIMIT = MAX_MAX_UE2_ALIGN - 1;
if (optarg == string("R")) {
// Random min alignment selected.
use_random_alignment = true;
break;
} else if (!fromString(optarg, min_ue2_align)
|| min_ue2_align > ALIGN_LIMIT) {
usage(argv[0], "Argument must be 'R' or numeric < "
xstr(MAX_MAX_UE2_ALIGN) " to '-Z'");
exit(1);
}
max_ue2_align = min_ue2_align + 1;
break;
case '8':
force_utf8 = true;
break;
case 1:
if (in_multi) {
if (!fromString(optarg, multicompile_bands)) {
usage(argv[0],
"Argument to '-a' flag must be an integer");
exit(1);
}
break;
} else if (in_corpora) {
corpora->push_back(optarg);
in_corpora = 2;
break;
}
case 0:
break;
default:
usage(argv[0], "Unrecognised command line argument.");
exit(1);
}
in_multi = MAX(0, in_multi - 1);
in_corpora = MAX(0, in_corpora - 1);
}
if (g_streamOffset && !g_streamBlocks) {
usage(argv[0], "stream offset requires streams");
exit(1);
}
if (g_exprPath.empty() && !g_signatureFiles.empty()) {
/* attempt to infer an expression directory */
for (const auto &fname : g_signatureFiles) {
string exprPath = inferExpressionPath(fname);
if (!g_exprPath.empty() && exprPath != g_exprPath) {
usage(argv[0], "Only one expression path is allowed.");
}
g_exprPath.assign(exprPath);
}
}
// Must have a valid expression path
if (g_exprPath.empty()) {
usage(argv[0], "Must specify an expression path with the -e option.");
exit(1);
}
// If we've been handed an expr file and no restrictions, use 'em all!
if (!isDir(g_exprPath) && isFile(g_exprPath) && g_signatureFiles.empty()
&& g_signatures.empty()) {
g_allSignatures = true;
}
// Must have a valid signature file
if (g_signatureFiles.empty() && g_signatures.empty() && !g_allSignatures) {
usage(argv[0], "Must specify a signature file with the -s option.");
exit(1);
}
// Cannot ask for both loading and saving
if (loadDatabases && saveDatabases) {
usage(argv[0], "You cannot both load and save databases.");
exit(1);
}
// Cannot ask for cross-compile and loading
if (loadDatabases && *plat_out) {
usage(argv[0], "You cannot both load and xcompile of databases.");
exit(1);
}
// need at least two pattern engines active
if (nfaFlag + pcreFlag + ue2Flag < 2) {
usage(argv[0], "At least two pattern engines should be active.");
exit(1);
}
if (copyStream && !g_streamBlocks) {
usage(argv[0], "Copying streams only makes sense in streaming mode.");
exit(1);
}
if (compressFlag && compressResetFlag) {
usage(argv[0],
"Only use one of --compress-expand and --compress-reset-expand.");
exit(1);
}
// set booleans appropriately
use_NFA = (bool) nfaFlag;
use_PCRE = (bool) pcreFlag;
use_UE2 = (bool) ue2Flag;
use_copy_scratch = (bool) copyScratch;
use_copy_stream = (bool) copyStream;
use_mangle_scratch = (bool) mangleScratch;
use_compress_expand = (bool)compressFlag;
use_compress_reset_expand = (bool)compressResetFlag;
}

46
tools/hscollider/args.h Normal file
View File

@@ -0,0 +1,46 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ARGS_H
#define ARGS_H
#include <memory>
#include <string>
#include <vector>
namespace ue2 {
struct Grey;
}
struct hs_platform_info;
class CorpusProperties;
void processArgs(int argc, char *argv[], CorpusProperties &corpus_gen_prop,
std::vector<std::string> *corpora, ue2::Grey *grey,
std::unique_ptr<hs_platform_info> *plat_out);
#endif

92
tools/hscollider/common.h Normal file
View File

@@ -0,0 +1,92 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef COMMON_H
#define COMMON_H
#include <cstddef>
#include <string>
#include <vector>
enum ColliderMode {
MODE_BLOCK,
MODE_STREAMING,
MODE_VECTORED
};
extern unsigned numThreads;
extern enum ColliderMode colliderMode;
extern unsigned int somFlags;
extern bool loadDatabases;
extern bool saveDatabases;
extern bool saveCorpora;
extern std::string saveCorporaFile;
extern std::string serializePath;
extern bool echo_matches;
extern int g_quiet;
extern bool g_verbose;
extern std::string g_exprPath;
extern std::vector<std::string> g_signatureFiles;
extern bool g_allSignatures;
extern bool g_ue2CompileAll;
extern unsigned g_streamBlocks;
extern unsigned long long g_streamOffset;
extern std::string g_corpora_prefix;
extern std::string g_corpora_suffix;
extern unsigned multicompile_bands;
extern std::string g_corporaFile;
extern std::vector<unsigned> g_signatures;
extern unsigned long int g_matchLimit;
extern unsigned long int g_matchLimitRecursion;
extern unsigned min_ue2_align;
extern unsigned max_ue2_align;
extern size_t g_memoryLimit;
extern bool force_utf8;
extern int force_prefilter;
extern unsigned somPrecisionMode;
extern unsigned limit_matches;
extern unsigned randomSeed;
extern bool use_random_alignment;
extern bool use_PCRE;
extern bool use_NFA;
extern bool use_UE2;
extern bool use_copy_scratch;
extern bool use_copy_stream;
extern bool use_mangle_scratch;
extern bool use_compress_expand;
extern bool use_compress_reset_expand;
extern int abort_on_failure;
extern int no_signal_handler;
extern bool force_edit_distance;
extern unsigned edit_distance;
// Constants
static const unsigned long int DEFAULT_PCRE_MATCH_LIMIT = 10*1000*1000;
static const unsigned long int DEFAULT_PCRE_MATCH_RECURSION_LIMIT = 10000;
#define MAX_MAX_UE2_ALIGN 64
#endif

View File

@@ -0,0 +1,63 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "limit.h"
#include <cstdlib>
#if defined(HAVE_SETRLIMIT)
#include <cerrno>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <sys/resource.h>
void setMemoryLimit(size_t mbytes) {
size_t bytes = mbytes * 1024 * 1024;
struct rlimit r;
r.rlim_cur = bytes;
r.rlim_max = bytes;
int rv = setrlimit(RLIMIT_DATA, &r);
if (rv != 0) {
std::cerr << "setrlimit(RLIMIT_DATA, ...) failed: " <<
strerror(errno) << std::endl;
}
rv = setrlimit(RLIMIT_AS, &r);
if (rv != 0) {
std::cerr << "setrlimit(RLIMIT_AS, ...) failed: " <<
strerror(errno) << std::endl;
}
}
#else // no setrlimit
void setMemoryLimit(size_t) {}
#endif

36
tools/hscollider/limit.h Normal file
View File

@@ -0,0 +1,36 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef LIMIT_H
#define LIMIT_H
#include <cstddef>
void setMemoryLimit(size_t mbytes);
#endif // LIMIT_H

2002
tools/hscollider/main.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,90 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "pcre_util.h"
#include "hs.h"
#include <assert.h>
#include <pcre.h> /* for pcre flags */
bool getPcreFlags(unsigned int hs_flags, unsigned int *flags,
bool *highlander, bool *prefilter, bool *som) {
assert(flags);
assert(highlander);
assert(prefilter);
assert(som);
*flags = 0;
*highlander = false;
*prefilter = false;
*som = false;
if (hs_flags & HS_FLAG_CASELESS) {
*flags |= PCRE_CASELESS;
hs_flags &= ~HS_FLAG_CASELESS;
}
if (hs_flags & HS_FLAG_DOTALL) {
*flags |= PCRE_DOTALL;
hs_flags &= ~HS_FLAG_DOTALL;
}
if (hs_flags & HS_FLAG_MULTILINE) {
*flags |= PCRE_MULTILINE;
hs_flags &= ~HS_FLAG_MULTILINE;
}
if (hs_flags & HS_FLAG_UCP) {
*flags |= PCRE_UCP;
hs_flags &= ~HS_FLAG_UCP;
}
if (hs_flags & HS_FLAG_UTF8) {
*flags |= PCRE_UTF8;
hs_flags &= ~HS_FLAG_UTF8;
}
if (hs_flags & HS_FLAG_SINGLEMATCH) {
*highlander = true;
hs_flags &= ~HS_FLAG_SINGLEMATCH;
}
if (hs_flags & HS_FLAG_PREFILTER) {
*prefilter = true;
hs_flags &= ~HS_FLAG_PREFILTER;
}
if (hs_flags & HS_FLAG_SOM_LEFTMOST) {
*som = true;
hs_flags &= ~HS_FLAG_SOM_LEFTMOST;
}
// Flags that are irrelevant to PCRE.
hs_flags &= ~HS_FLAG_ALLOWEMPTY;
if (hs_flags) {
// You've added new flags, haven't you?
assert(0);
return false;
}
return true;
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PCRE_UTIL_H
#define PCRE_UTIL_H
/** Translates the given hyperscan flags into pcre flags (where appropriate)
* and other bools (for flags which are not directly translateable).
*
* Returns false if an unknown hyperscan flag is encountered.
*/
bool getPcreFlags(unsigned int hs_flags, unsigned int *pcre_flags,
bool *highlander, bool *prefilter, bool *som);
#endif /* PCRE_UTIL_H */

185
tools/hscollider/sig.cpp Normal file
View File

@@ -0,0 +1,185 @@
/*
* Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "sig.h"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include <string>
#ifdef HAVE_SIGACTION
#include <signal.h>
#endif
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
#include <unistd.h>
#endif
#define BACKTRACE_BUFFER_SIZE 200
TLS_VARIABLE volatile int debug_stage = STAGE_UNDEFINED;
TLS_VARIABLE volatile int debug_expr = 0;
TLS_VARIABLE const char * volatile debug_expr_ptr = nullptr;
TLS_VARIABLE volatile int debug_corpus = 0;
TLS_VARIABLE const char * volatile debug_corpus_ptr = nullptr;
TLS_VARIABLE volatile size_t debug_corpus_len = 0;
extern std::string g_cmdline;
#ifdef HAVE_SIGACTION
static void sighandler(int signum) {
/* NOTE: This signal handler is designed solely to provide more information
* when a crash occurs in ue2collider -- it makes calls to signal-unsafe
* functions like printf() and backtrace() by design, since we're already
* in deep trouble and are going to exit anyway. */
fflush(stdout);
printf("signal %d\n", signum);
printf("\nFailing cmdline was:\n%s\n\n", g_cmdline.c_str());
printf("expression %d ", debug_expr);
switch(debug_stage) {
case STAGE_UE2_COMPILE:
printf("ue2 compile\n");
break;
case STAGE_UE2_RUN:
printf("corpus %d ue2 scan\n", debug_corpus);
break;
case STAGE_PCRE_COMPILE:
printf("pcre compile\n");
break;
case STAGE_PCRE_RUN:
printf("corpus %d pcre scan\n", debug_corpus);
break;
case STAGE_GRAPH_PREPROCESS:
printf("graph preprocess\n");
break;
case STAGE_GRAPH_COMPILE:
printf("graph compile\n");
break;
case STAGE_GRAPH_RUN:
printf("corpus %d graph scan\n", debug_corpus);
break;
default:
case STAGE_UNDEFINED:
printf("unknown stage\n");
break;
}
printf("\n");
if (debug_expr_ptr) {
printf("expression %p\n", debug_expr_ptr);
printf("%d:%s\n\n", debug_expr, debug_expr_ptr);
}
if (debug_stage == STAGE_PCRE_RUN || debug_stage == STAGE_UE2_RUN) {
printf("corpus %p len %zu\n", debug_corpus_ptr, debug_corpus_len);
printf("%d:", debug_expr);
for (size_t i = 0; i < debug_corpus_len && debug_corpus_ptr; i++) {
unsigned char c = debug_corpus_ptr[i];
if (c == '\n') {
printf("\\n");
} else if (c == '\t') {
printf("\\t");
} else if (c == '\r') {
printf("\\r");
} else if (0x20 <= c && c <= 0x7e && c != '\\') {
printf("%c", c);
} else {
printf("\\x%02hhx", c);
}
}
printf("\n\n");
}
fflush(stdout);
#ifdef HAVE_BACKTRACE
static void *bt[BACKTRACE_BUFFER_SIZE];
int count = backtrace(bt, BACKTRACE_BUFFER_SIZE);
if (count) {
backtrace_symbols_fd(bt, count, STDOUT_FILENO);
} else {
printf("(Call to backtrace() returns zero count.)\n");
}
#else
printf("(Backtrace unavailable on this platform.)\n");
#endif
_exit(signum);
}
#endif // HAVE_SIGACTION
void installSignalHandler(void) {
#ifdef HAVE_SIGACTION
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = sighandler;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGSEGV);
sigaddset(&act.sa_mask, SIGBUS);
sigaddset(&act.sa_mask, SIGFPE);
sigaddset(&act.sa_mask, SIGILL);
sigaddset(&act.sa_mask, SIGABRT);
sigaction(SIGBUS, &act, nullptr);
sigaction(SIGFPE, &act, nullptr);
sigaction(SIGILL, &act, nullptr);
sigaction(SIGABRT, &act, nullptr);
sigaction(SIGSEGV, &act, nullptr);
setSignalStack();
#endif // HAVE_SIGACTION
}
#ifdef HAVE_SIGALTSTACK
static TLS_VARIABLE char alt_stack_loc[SIGSTKSZ];
#endif
void setSignalStack(void) {
#ifdef HAVE_SIGALTSTACK
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = sighandler;
act.sa_flags = 0;
stack_t alt_stack;
memset(&alt_stack, 0, sizeof(alt_stack));
alt_stack.ss_flags = 0;
alt_stack.ss_size = SIGSTKSZ;
alt_stack.ss_sp = alt_stack_loc;
if (!sigaltstack(&alt_stack, nullptr)) {
act.sa_flags |= SA_ONSTACK;
}
sigaction(SIGSEGV, &act, nullptr);
#endif
}

57
tools/hscollider/sig.h Normal file
View File

@@ -0,0 +1,57 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef SIG_H
#define SIG_H
#include <cstddef> // for size_t
#define STAGE_UNDEFINED 0
#define STAGE_UE2_COMPILE 1
#define STAGE_UE2_RUN 2
#define STAGE_PCRE_COMPILE 3
#define STAGE_PCRE_RUN 4
#define STAGE_GRAPH_PREPROCESS 5
#define STAGE_GRAPH_COMPILE 6
#define STAGE_GRAPH_RUN 7
#define TLS_VARIABLE __thread
extern TLS_VARIABLE volatile int debug_stage;
extern TLS_VARIABLE volatile int debug_expr;
extern TLS_VARIABLE const char * volatile debug_expr_ptr;
extern TLS_VARIABLE volatile int debug_corpus;
extern TLS_VARIABLE const char * volatile debug_corpus_ptr;
extern TLS_VARIABLE volatile size_t debug_corpus_len;
void installSignalHandler(void);
// Must be called by every thread.
void setSignalStack(void);
#endif

View File

@@ -0,0 +1,54 @@
/*
* Copyright (c) 2015, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef SIMPLE_TIMER_H
#define SIMPLE_TIMER_H
#include <chrono>
class SimpleTimer {
public:
SimpleTimer();
double elapsed() const;
private:
std::chrono::time_point<std::chrono::system_clock> start;
};
SimpleTimer::SimpleTimer() {
start = std::chrono::system_clock::now();
}
double SimpleTimer::elapsed() const {
std::chrono::time_point<std::chrono::system_clock> end;
end = std::chrono::system_clock::now();
std::chrono::duration<double> delta = end - start;
return delta.count();
}
#endif // SIMPLE_TIMER_H

View File

@@ -0,0 +1,3 @@
2000:abcdefxxxxxxxxxxxxxxxxxxxxxxxxxxAfoobarxxxxxxxxxxxxxx
2001:/w------Ue0-J-vNU-----C9---k--M---1S-x-----g-----A---\n
2002:mJpPthD\xf0\x95\x93\xa1hq\xf4\x8b\xb9\x9cbrp\xe2\x84\xaahB\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe8\x86\x95\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,263 @@
40000:test
40000:012test
40000:01test
40000:013test
40000:0123test
40000:012tests
40000:0123tests
40000:teest
40000:teeest
40000:012012test
40000:012013test
40000:013013test
40000:01201test
40000:01201202test
40001:kks
40001:sss
40001:ssss
40001:ss
40001:s
40001:sssss
40001:sksks
40001:kkk
40001:sskksk
40002:test
40002:tst
40002:teest
40002:teitk
40002:test\n
40002:test\na
40002:tost\na
40002:tst\n
40002:teest\n
40002:teitk\n
40002:test\ntest
40002:test\natest
40002:testa\ntest
40002:test\ntst
40002:tst\ntest
40002:tost\ntest
40002:tost\ntost
40003:test
40003:tst
40003:tt
40003:t
40003:teest
40003:teeest
40003:teeeest
40003:toast
40003:toasts
40003:attest
40003:attests
40003:atttest
40004:test
40004:tst
40004:tt
40004:t
40004:teest
40004:teeest
40004:teeeest
40004:toast
40004:toasts
40004:attest
40004:attests
40004:atttest
40004:footestbar
40004:footstbar
40004:foottbar
40004:footbar
40004:footeestbar
40004:footeeestbar
40004:footeeeestbar
40004:footoastbar
40004:footoastsbar
40004:fooattestbar
40004:fooattestsbar
40004:fooatttestbar
40005:littest
40005:litest
40005:ltest
40005:litttest
40005:littttest
40005:alittest
40005:alitetest
40005:alittetest
40006:ttaaaaatt
40006:ttaabaatt
40006:ttaaabacatt
40006:tttt
40007:abfooobc
40007:abbc
40007:abfoobc
40007:abfooocd
40007:cdfooobc
40007:fooobc
40007:foooobc
40008:a bce
40008:a bcc
40008:a be
40008:abec
40008:a bcd
40008:ade
40008:afe
40008:fade
40008:foade
40009:fooabc
40009:fooabd
40009:fooade
40009:fooabbc
40009:fooabbcd
40009:fooabbcdd
40009:foodee
40010:fooabc\n
40010:fooabc\na
40010:fooa\na
40010:fooabcde\na
40010:foo\na
40010:fooabcpqr\na
40010:foodefoo\n
40010:food\na
40050:test
40050:012test
40050:01test
40050:013test
40050:0123test
40050:012tests
40050:0123tests
40050:teest
40050:teeest
40050:012012test
40050:012013test
40050:013013test
40050:01201test
40050:01201202test
40051:kks
40051:sss
40051:ssss
40051:ss
40051:s
40051:sssss
40051:sksks
40051:kkk
40051:sskksk
40052:test
40052:tst
40052:teest
40052:teitk
40052:test\n
40052:test\na
40052:tost\na
40052:tst\n
40052:teest\n
40052:teitk\n
40052:test\ntest
40052:test\natest
40052:testa\ntest
40052:test\ntst
40052:tst\ntest
40052:tost\ntest
40052:tost\ntost
40053:test
40053:tst
40053:tt
40053:t
40053:teest
40053:teeest
40053:teeeest
40053:toast
40053:toasts
40053:attest
40053:attests
40053:atttest
40054:test
40054:tst
40054:tt
40054:t
40054:teest
40054:teeest
40054:teeeest
40054:toast
40054:toasts
40054:attest
40054:attests
40054:atttest
40054:footestbar
40054:footstbar
40054:foottbar
40054:footbar
40054:footeestbar
40054:footeeestbar
40054:footeeeestbar
40054:footoastbar
40054:footoastsbar
40054:fooattestbar
40054:fooattestsbar
40054:fooatttestbar
40055:littest
40055:litest
40055:ltest
40055:litttest
40055:littttest
40055:alittest
40055:alitetest
40055:alittetest
40056:ttaaaaatt
40056:ttaabaatt
40056:ttaaabacatt
40056:tttt
40057:abfooobc
40057:abbc
40057:abfoobc
40057:abfooocd
40057:cdfooobc
40057:fooobc
40057:foooobc
40058:a bce
40058:a bcc
40058:a be
40058:abec
40058:a bcd
40058:ade
40058:afe
40058:fade
40058:foade
40059:fooabc
40059:fooabd
40059:fooade
40059:fooabbc
40059:fooabbcd
40059:fooabbcdd
40059:foodee
40060:fooabc\n
40060:fooabc\na
40060:fooa\na
40060:fooabcde\na
40060:foo\na
40060:fooabcpqr\na
40060:foodefoo\n
40060:food\na
40061:
40061:a
40061:__

View File

@@ -0,0 +1,508 @@
23000="foobar":
23000="foo bar": 7
23000="foo\x00bar": 7
23000="fooAbar":
23000="foo~bar": 7
23000="foo~~~bar": 9
23000="foo~~~bar0bar": 9
23001="foobar":
23001="foo bar": 7
23001="foo\x00bar": 7
23001="fooAbar":
23001="foo~bar": 7
23001="foo~~~bar": 9
23001="foo~~~bar0bar": 9,13
23002="":
23002="foo": 3
23002="afoo":
23002="~foo": 4
23002="\x00foo": 4
23002="foo foo ~foo": 3,8,15
23003="":
23003="foo":
23003="afoo": 4
23003="~foo":
23003="\x00foo":
23003="foo foo ~foo":
23004="wordalpha":
23004="nonword~alpha": 13
23004="wordXalpha":
23004="word~alpha": 10
23004="nonword~~alpha": 14
23005="":
23005="~": 1
23005="~~": 1,2
23005="a~":
23006="foo": 3
23006="fooA":
23006="foofoo": 6
23006="foo~": 3
23006="foo~foo": 3,7
23006="foo~foo~": 3,7
23007="foo":
23007="fooA": 3
23007="foofoo": 3
23007="foo~":
23007="foo~foo":
23007="foo~foo~":
23008="foo": 3
23008="fooA":
23008="foo~":
23008="foo\n": 3
23008="foo\n\n":
23008="foofoo": 6
23009="foo": 3
23009="fooA":
23009="foo~":
23009="foo\n":
23009="foo\n\n":
23009="foofoo": 6
23010="foobar":
23010="foo bar": 7
23010="foo\x00bar": 7
23010="fooAbar":
23010="foo~bar": 7
23010="foo~~~bar": 9
23010="foo~~~bar0bar": 9
23011="foobar":
23011="foo bar": 7
23011="foo\x00bar": 7
23011="fooAbar":
23011="foo~bar": 7
23011="foo~~~bar": 9
23011="foo~~~bar0bar": 9
23012="foobar":
23012="fooXbar":
23012="foo~bar": 7
23012="foo~bar~bar": 7,11
23012="fooxbar~bar":
23012="foo~barxbar": 7
23012="foofoobar":
23013="foobar": 6
23013="fooXbar": 7
23013="foo~bar":
23013="foo~bar~bar":
23013="fooxbar~bar": 7
23013="foo~barxbar":
23013="foofoobar": 9
23014="foobar":
23014="fooXbar":
23014="foo~bar":
23014="foo~bar~bar":
23014="fooxbar~bar":
23014="foo~barxbar": 11
23014="foofoobar":
23015="":
23015="foo": 3
23015="afoo":
23015="~foo": 4
23015="\x00foo": 4
23015="foo foo ~foo": 3,8,15
23016="":
23016="foo":
23016="afoo": 4
23016="~foo":
23016="\x00foo":
23016="foo foo ~foo":
23017="":
23017="~": 1
23017="~~": 1,2
23017="a~":
23018="foo": 3
23018="fooA":
23018="foofoo": 6
23018="foo~": 3
23018="foo~foo": 3,7
23018="foo~foo~": 3,7
23019="foo":
23019="fooA": 3
23019="foofoo": 3
23019="foo~":
23019="foo~foo":
23019="foo~foo~":
23020="foo": 3
23020="fooA":
23020="foo~":
23020="foo\n": 3
23020="foo\n\n":
23020="foofoo": 6
23021="foo": 3
23021="fooA":
23021="foo~":
23021="foo\n":
23021="foo\n\n":
23021="foofoo": 6
23022="a":
23022="ab": 2
23022="a~":
23022="abb": 3
23022="ab~": 2
23022="a~b": 2,3
23022="a~~":
23022="abbb": 4
23022="ab~~": 2
23022="a~bb": 2,4
23022="a~~~":
23022="abb~": 3
23022="ab~b": 2,3,4
23022="a~b~": 2,3
23022="a~~b": 3,4
23023="a":
23023="ba": 2
23023="~a":
23023="bba": 3
23023="b~a": 3
23023="~ba": 3
23023="~~a":
23023="bbba": 4
23023="b~~a": 4
23023="~bba": 4
23023="~~~a":
23023="bb~a": 4
23023="b~ba": 4
23023="~b~a": 4
23023="~~ba": 4
23024="":
23024="a": 1
23024="aa": 1
23024="~a": 2
23024="a~a": 1,3
23024="aaa": 1
23025="":
23025="a": 0,1
23025="~":
23025="a~": 0,1
23025="~a": 1,2
23025="aa": 0,2
23025="~~":
23025="a~a": 0,1,2,3
23025="~a~": 1,2
23025="aaa": 0,3
23025="~~~":
23025="a~~": 0,1
23025="~aa": 1,3
23025="aa~": 0,2
23025="~~a": 2,3
23026="": 0
23026="a":
23026="~": 0,1
23026="a~": 2
23026="~a": 0
23026="aa": 1
23026="~~": 0,1,2
23026="a~a":
23026="~a~": 0,3
23026="aaa": 1,2
23026="~~~": 0,1,2,3
23026="a~~": 2,3
23026="~aa": 0,2
23026="aa~": 1,3
23026="~~a": 0,1
23027="":
23027="a": 1
23027="~":
23027="a~":
23027="~a": 2
23027="aa": 2
23027="~~":
23028="": 0
23028="a":
23028="~": 1
23028="a~": 2
23028="~a":
23028="aa":
23028="~~": 2
23029="":
23029="a": 0
23029="~":
23029="a~": 0
23029="~a":
23029="aa": 0
23029="~~":
23030="": 0
23030="a":
23030="~": 0
23030="a~":
23030="~a": 0
23030="aa":
23030="~~": 0
23031="":
23031="a": 0,1
23031="~":
23031="a~": 0,1
23031="~a": 2
23031="aa": 0,1,2
23031="~~":
23032="":
23032="a": 0,1
23032="~":
23032="a~": 0,1
23032="~a": 1,2
23032="aa": 0,1,2
23032="~~":
23033="foo": 3
23033="~foo":
23033="foofoo": 3
23035="foo": 3
23035="~foo":
23035="foofoo": 3
23037="foobar": 6
23037="fooXbar": 7
23037="foo~bar": 7
23037="foo~x~bar": 9
23037="foox~xbar": 9
23038="threeasserts":
23038="three~asserts": 13
23038="threeXasserts":
23039="threeasserts": 12
23039="three~asserts":
23039="threeXasserts": 13
23042="":
23042="a": 0,1
23042="~":
23042="word": 0,4
23042="~~~~":
23042="hatstand teakettle badgerbrush": 0,8,9,18,19,30
23043="foo bar baz bam": 3,7,11
23043="foobarbazbam":
23044="":
23044="a": 0,1
23044="~":
23044="aa": 0,2
23044="a~": 0,1
23044="~a": 1,2
23044="~~":
23044="aaa": 0,3
23044="a~a": 0,1,2,3
23044="~aa": 1,3
23044="~~a": 2,3
23044="aa~": 0,2
23044="a~~": 0,1
23044="~a~": 1,2
23044="~~~":
23045="":
23045="a": 0,1
23045="~":
23045="aa": 0,2
23045="a~": 0,1
23045="~a": 1,2
23045="~~":
23045="aaa": 0,3
23045="a~a": 0,1,2,3
23045="~aa": 1,3
23045="~~a": 2,3
23045="aa~": 0,2
23045="a~~": 0,1
23045="~a~": 1,2
23045="~~~":
23045="aaaaaaaaaaaaaaaaaaa": 0,19
23045="~~~~~~~~~~~~~~~~~~~":
23045="a~a~a~a~a~a~a~a~a~a": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
23046="":
23046="a": 0,1
23046="aa": 0,1,2
23046="aaa": 0,1,2,3
23046="aaaa": 0,1,2,3,4
23046="~aa~~aaa~~~aaaa~~~~aaaaa~~~~~~": 1,2,3,5,6,7,8,11,12,13,14,15,19,20,21,22,23,24
23047="":
23047="a": 1
23047="ab":
23047="a b": 1,3
23047="a b c": 1,3,5
23048="":
23048="a": 1
23048="aa bb ccc d eeee fffff abc ghi": 2,3,5,6,9,10,11,12,16,17,22,23,26,27
23049="": 0
23049="\n": 0
23049="a":
23049="~": 0
23049="\na": 0
23049="\n~": 0,1
23049="foo\n~": 4
23049="~\n~": 0,2
23049="foo\nfoo":
23050="":
23050="\n":
23050="a": 0
23050="~":
23050="\na": 1
23050="\n~":
23057="": 0
23057="a":
23057="~":
23057="\n": 0
23057="\na": 0
23057="\n~": 0
23057="a\n":
23057="~\n":
23057="\n\n": 0,1
23057="\na\n": 0
23057="\n~\n": 0
23057="\naa\n": 0
23057="\n~~\n": 0
23057="\n\n\n": 0,1,2
23058="": 0
23058="a":
23058="~":
23058="\n": 0
23058="\na":
23058="\n~":
23058="a\n":
23058="~\n":
23058="\n\n": 1
23058="\na\n":
23058="\n~\n":
23058="\naa\n":
23058="\n~~\n":
23058="\n\n\n": 2
23059="": 0
23059="a":
23059="~":
23059="\n":
23059="\na":
23059="\n~":
23059="a\n":
23059="~\n":
23059="\n\n":
23059="\na\n":
23059="\n~\n":
23059="\naa\n":
23059="\n~~\n":
23059="\n\n\n":
23060="": 0
23060="a":
23060="~":
23060="\n": 0
23060="\na": 0
23060="\n~": 0
23060="a\n":
23060="~\n":
23060="\n\n": 0
23060="\na\n": 0
23060="\n~\n": 0
23060="\naa\n": 0
23060="\n~~\n": 0
23060="\n\n\n": 0
23061="": 0
23061="a":
23061="~":
23061="\n": 0
23061="\na":
23061="\n~":
23061="a\n":
23061="~\n":
23061="\n\n":
23061="\na\n":
23061="\n~\n":
23061="\naa\n":
23061="\n~~\n":
23061="\n\n\n":
23062="": 0
23062="a":
23062="~":
23062="\n":
23062="\na":
23062="\n~":
23062="a\n":
23062="~\n":
23062="\n\n":
23062="\na\n":
23062="\n~\n":
23062="\naa\n":
23062="\n~~\n":
23062="\n\n\n":
23063="":
23063="a": 0,1
23063="foo": 0,3
23063="~foo": 1,4
23063="~foo~": 1,4
23063="~~~foo~~~bar~~~": 3,6,9,12
23064="": 0
23064="a":
23064="foo": 1,2
23064="~foo": 0,2,3
23064="~foo~": 0,2,3,5
23064="~~~foo~~~bar~~~": 0,1,2,4,5,7,8,10,11,13,14,15
23065="":
23065="a":
23065="foo": 1,2
23065="~foo": 2,3
23065="~foo~": 2,3,5
23065="~~~foo~~~bar~~~": 4,5,7,8,10,11,13,14,15
23066="":
23066="a":
23066="foo": 3
23066="~foo": 1,4
23066="~foo~": 1,4
23066="~~~foo~~~bar~~~": 3,6,9,12
23067="":
23067="a": 1
23067="foo": 3
23067="~foo": 4
23067="~foo~": 4
23067="~~~foo~~~bar~~~": 6,9,12
23068="":
23068="a":
23068="foo": 2
23068="~foo": 2,3
23068="~foo~": 2,3,5
23068="~~~foo~~~bar~~~": 1,2,4,5,7,8,10,11,13,14,15
23069="":
23069="a":
23069="foo": 1,2
23069="~foo": 2,3
23069="~foo~": 2,3,5
23069="~~~foo~~~bar~~~": 4,5,7,8,10,11,13,14,15
23070="":
23070="a":
23070="foo": 3
23070="~foo": 1,4
23070="~foo~": 1,4
23070="~~~foo~~~bar~~~": 3,6,9,12
23071="FKHL0BBBBiBBBG": 4,5,6,7,8,9,10,11,12,13,14
23072="\x01n[\xbbx\xd3z\xf8\x8fe\x86QG\xe6{0\xa7a[a0[00\x88bbabb":
23073="": 0
23073="1":
23073="a":
23073="\n1": 0
23073="\na": 0
23074="":
23074="1": 0
23074="a": 0
23074="\n1":
23074="\na":
23075="a": 1
23075="aa": 2
23075="abcdef": 6
23075="abc abcde abcdef abcdefg abcdef a1bc a234bcdef adf": 3,9,16,31,50
23075="a aa a3 aq aaab aaab4": 1,4,15
23076="godzilla mothra":
23076="godzillamothra":
23076="godzilla mothra": 15
23076="godzilla mothra": 24
23076="godzillax mothra":
23076="godzillax mothra":
23076="godzillaxmothra":
23076="godzilla xmothra": 16
23076="godzilla x mothra": 17
23076="godzilla xmothra": 24
23077="godzilla mothra":
23077="godzillamothra":
23077="godzilla mothra": 15
23077="godzilla mothra": 24
23077="godzilla xmothra":
23077="godzilla xmothra":
23077="godzillaxmothra":
23077="godzillax mothra": 16
23077="godzilla x mothra": 17
23077="godzillax mothra": 24
23078="godzilla mothra":
23078="godzillamothra":
23078="godzilla mothra": 15
23078="godzilla mothra": 24
23078="godzilla xmothra":
23078="godzilla xmothra":
23078="godzillax mothra":
23078="godzillax mothra":
23078="godzillaxmothra":
23078="godzilla x mothra": 17

View File

@@ -0,0 +1,66 @@
19501="a__b": 4
19501="aa_bb": 4,5
19501="aaabbb": 4,5,6
19501="ba_b_b":
19501="bba_b_b":
19501="bbba_b_b":
19501="bbbba_b_b":
19502="a__bc": 5
19502="a_abcbca__bcbc": 5,7,12
19503="ab__c": 5
19503="ababc_c": 5,7
19503="ababc_c_c": 5,7
19504="ab__c":
19504="ababc_c": 7
19504="ababc_c_c": 7,9
19504="ab__cxx": 7
19504="ababc_cxx": 7,9
19504="ababc_c_cxx": 7,9
19505="ab__c":
19505="abaBc_c": 7
19505="ababc_C_c": 7,9
19505="aB__cxx": 7
19505="Ababc_cxx": 7,9
19505="ababC_c_cxx": 7,9
19506="ab__c":
19506="abaBc_c":
19506="ababc_C_c": 9
19506="aB__cxx":
19506="Ababc_cxx": 9
19506="ababC_c_cxx": 9
19507="abcdefgh____abcd1234efgh": 24
19507="abcdefgh____abcdefghefghabcdefghefgh": 24,36
19508="foo__ba": 7
19508="foo__ba_": 7
19508="foo__ba\n": 7
19509="foo__ba": 7
19509="foo__ba_":
19509="foo__ba\n":
19510="aaa-aaa-aaaa": 12
19510="aaba-aac-deff": 13
19510="aba-aac-deff": 12
19510="aa--aaa-aaaa":
19510="aba-aacadeff":
19511="abcdefghi Abcdefghi aBcdefghi abCdefghi abcDefghi abcdEfghi abcdeFghi abcdefGhi abcdefgHi abcdefghI abCDEFghi abCdEFghi abCDEfghi ABcdefGHI abCdEfghi": 9,39,49,59,69,109,119,129,149
19512="AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDd":
19512="AAAAAAAAAAbbbbbbbbbbccccccccccdddddddddd":
19512="Aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd":
19512="_aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd": 41
19512="aaaaaaaaaabbbbbbbBbbccccCcccccDddddddddd":
19512="aaaaaaaaaabbbbbbbbbbCCCCCCCCCCdddddddddd": 40
19512="aaaaaaaaaabbbbbbbbbbccccCcccccDddddddddd":
19512="aaaaaaaaaabbbbbbbbbbccccCcccccdddddddddd": 40
19512="aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd": 40
19513="fYm_W fym_W fYP_W fyP_W fYi_W fyi_W fYU_W fyU_W": 5,11,17,23,29,35,41,47
19513="FYM_W FYI_W":
19513="FYm\nW":
19514="godzilla GODZILLA gODZILLA gOdZiLlA Godzilla GODzILLA godZilla odzilla godzillA GodzillA GODZILLa": 8,44,62,97
19515="godzilla GODZILLA gODZILLA gOdZiLlA Godzilla GODzILLA godZilla odzilla godzillA GodzillA GODZILLa": 8,26,35,62,79
19516="godzilla GODZILLA gODZILLA gOdZiLlA Godzilla GODzILLA godZilla odzilla godzillA GodzillA GODZILLa": 17,44,53,88,97
19517="godzilla GODZILLA gODZILLA gOdZiLlA Godzilla GODzILLA godZilla odzilla godzillA GodzillA GODZILLa": 8,44,53,79,88
19518="godzilla GODZILLA gODZILLA gOdZiLlA Godzilla GODzILLA godZilla odzilla godzillA GodzillA GODZILLa": 8,79
19519="NqTqkffffffffffffffbdrrk\xbeTrpqqQ":
19519="nqtqkffffffFFFFffffbdrrk_trcqqq":
19519="nqtqkffffffffffffffbdrrk_tRPQQQ": 31
19519="nqtqkffffffffffffffbdrrk_trcqqq": 31
19520="BCADabaaEbcd BCAcabaaEbcd bCACabaaEbcd": 12,25,38

View File

@@ -0,0 +1,78 @@
25000="bab'\xbbebcdddd": 10,11,12
25001="A\x14AA\x03AA9AAAAAAA":
25001="B >A\x10?\xb7AAAAAAA\x97":
25002="cbaaaccc\x98abbabaa": 4,5,6,11,14,16
25002="f\x14c\xbf2cc\x15aabVabb": 10,11,14
25002="zb(ga cc.accb\x06babb": 11,17
25002="\xd1b\xa5ccccagabab": 11,13
25002="'\x8d\xcda\xf7\xa9c\xe3baabaab\x7f": 11,12,14,15
25003="\xa0AAAAA\x83AlA\xd5\x0bAAAAAAA[AAAAAAA\xdc": 19,21,22,23,24,25,26,27
25004="\x9dAAE~A\xffA\xde\xcb{AAAAAAAAAA\xf9A\xdeA": 16,17,18,19,20,21
25005="a\xe6\xdfaaaa\xeea": 5,6,7
25005="av\xa9a\x18&o\xe5aaaa\x14": 10,11,12
25005="a\x1baa|\xba\x92X_aaaa": 4,11,12,13
25005="\x82aW.aaaa1\xc4": 6,7,8
25005="arI\xbe)aaa8aa": 7,8,11
25005="a~\xc5aaaaa": 5,6,7,8
25006=":b'aa\xd4aa": 5,8
25007="bb\xc8b\xb7b\x15bbbbb\x8fbbb\xd3": 10,11,12,16
25007="\x89b\xf1bbpbbbb\x10bbb\nbbbgb\xb6": 10,14,18
25008="a\xa5bddbdcccc\x0fR\xa9&NlI)\xc6\xbd\x83\x0c\xad": 9,10,11
25008="acbddbcccc<\xd7\x0f\xb3\x07jT\x9a\xbc": 8,9,10
25008="acbdd`dcccc`\xd3 \x94\xb5\xda\x13\xb5\x94\x86\x93\xd3&\x0122\x1a\xa1l%\x7f=\xc5\xbe)\xc6\x8a7;\xca\x01:<\xc0m\x909\x1f\xe4lD\x16\xdf\n\xb7": 9,10,11
25008="acbd\xfbdbdcccc\xa0Lb-o\xd6\xa0": 10,11,12
25009="aaq\x14\x87a]aaa\xe6:aaa\xd2a\x7f\x07J\xf9YKa\xdc\x02\xc3\x9c\xb5\x0ea2<\xdb\xd3\xa7O\x14": 10,15
25010="\x05\x01\xc6,h\xf493\xcc\x06\x96\x14@sH\xe1S\xc0\xf3l_\xe0\xf6:\x07\x85\x19R\xe2\xbc\xbd\x86]\"Qd\xb5)7aaaaaa": 42,43,44,45
25010="<;\x92p\xf7Xj0@\xdf5\xb5G\x8d\x12\x5c\xe33U\xc0\xed\xe0\x00$\xdeaaaaaa": 28,29,30,31
25010="\xe1\x98\xac\xd9\xf4@\x17\x1f\xf5\x5ciI\xcd\xab\x1fy\xa2aaaaaa": 20,21,22,23
25010="\xe2\x1b\x07\x8cq\x02\xe5.\xd9\x91i\x9d\x14\x04\x83\xb4\xa3\x7fo7\xad<#aaaaaa": 26,27,28,29
25010="\xf4\xfdt*\xd1\x98aaaaaa": 9,10,11,12
25011="I\xaeS\x7f\x7f\xb0\xc1\xd3\x94\xa6\xdf#r\xbf\x9b\x12\x15\xbd\x19\xa2\x02\x9d\x18\x8fw\xa9H\r\xaa\xb2\xde\x92\x00\xd1\xb0\x1e \x10\x90SU\x0f\x16gmP\x18\"\xac\xd0cM\r\x1a{#bb\xcf\xac\xb4M\xddS\xbd-\x10|\xdc?o\xd1\xed$\xd7\xfa\x13\x8e\xbb^\xfd\xbdK\xa9vekwgBBAAAA": 58,91,92,93,94,95
25012="\x8b9\xde\xd0\xc9\xd0fYS%U\xc1\t\x18\x0c\x7fc\x90\xb6%\xdd\xa5L\xbf\xa8B\xf3<\xa8t\x0c\xd2L\x89B\xb5\xf8G\xad\xea\x0b\xa1K\xb3X\xf6\xd2Z%'\x1e\xa1k\n\xff\xb2\xeb\x91\x8d3\xa49\xa4\x90a\x85\xe4\xf9k0\x82\x15plhg\x01\xd9`\xc5hgh": 76,82,83
25013="\x8b\xafo\xfa\x9dhb\xc1\x89\xc0\nf%^\x88\xac\xcfn@\xbe\xc5\x89F=G\x867\x81A\xa6\rk\xf4\x1b\xb4\x040#\x05\x90Ke9P)7wt\xa5\x84S\x02\xe9{\xe7\xc5b\r\x9b\x82\xed\xe0/\xf7t\xe9\x9aC\xab>s\x95BK\x84\n!KEEEE": 42,79,80,81,82
25013="\x97\xd2\xad\xda\xfc:\xf3\x91\xb9 \xde \xf162,\xd2\xf7\xf7\xc4\xe4KE4\xc4\xa0\xfda8\x80\x98\xaa\xcc\x11KE": 23,36
25013="qqqqqqqqqqqqKEqke": 14,17
25014="_aa_9_____^u___?_&-__-___D__m_._m_EEq_________:_$______k____\n___/__?___u_-pa+I__": 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80
25015="Ln\xdf\xe6\xa4)<\xfd\xf7\xaeB\xa4\x9d!\xa3\xe0\x89": 2,4,12,13
25016="P___!____mF_\n_+_@J__p____O_k7__3PZ___!___h___=h_____Fu_4": 2,3,4,5,6,7,8,9,10,11,12,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56
25017="aaa\xd9\xf8\xd0\xb0\nX{\x8a\xa3}\xf3\xf1\xa2\xeb+U\xfdp\xeban\xe9\xb0\xb4\xf5\xfd=\xa1\xabt\xf0B\xe3?\xdaZ\x1d\xec\x9c^vfR\x12u\xea\xdc\x13\xbft\x9b\xd2\xc7/o\xc8\x0b": 1,2,3,23
25018="aaaaa\n\x01\xca\xd2Y\xc6I\xb3O": 5,6
25019="\x10\xd9e\xc5\xff=Z92T\x8a\xef&\xb0_\xdd?&\xa72/:8x^\x85\xdc\xbe\xdeB4\x18\xce\xc8\x99\xd2,8\xaeE\x10\xf8\x80\x199\x0e\x88\x0c\x80\xd1\xc68\x9f\x9dP\x9c\xc1\xcb\xfa\xa2\x9e\xb1\x0f\x05\xea\x13\x80\xd1<\xc1\xcd\x96p\xecNI\x99\xebpD\nv\xb4oN\xf3\xd8": 2,3,6,7,9,10,11,13,14,15,18,19,20,23,25,27,28,29,30,32,34,35,36,37,38,43,44,45,48,49,50,51,52,55,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,77,79,86
25020="BAABA\x02G\xeb\xe5\xe1\xd2{\x9eZ|M\xb2\xb0\xf6D\x90\x1f\x04\x12\x1a\xb6\x113\x01x\x85\xfa^\x93W\xa3\xf8\x89V|\n\xc7\x97G\xc0\xb23\x12\x01\x7f\xf51h\x99\xea\xdcI\xbc\xc5|a\xe1\x16 \x13/\x0c\xa0~\xa4\xc8s\xbfq\xd9\xf5X9F*\xea\xe7\x92~\xb7\xb8\xb6@3H\x9f\x9cO\x9f\x1c\xfd\x04\x9c": 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98
25021="foobar": 6
25021="Foobar":
25021="FOOBAR":
25022="foobar": 6
25022="Foobar": 6
25022="FOOBAR": 6
25023="foo_bar": 7
25023="FOO_BAR":
25023="foO_bAr":
25024="foo_bar": 7
25024="FOO_BAR": 7
25024="foO_bAr": 7
25025="foobar": 6
25025="Foobar":
25025="FOOBAR":
25025="goobar": 6
25025="Goobar":
25025="GOObar":
25026="foobar": 6
25026="Foobar": 6
25026="FOOBAR": 6
25026="goobar": 6
25026="Goobar": 6
25026="GOObar": 6
25027="foobar": 6
25027="f0obar": 6
25027="F0obar": 6
25027="FOobar": 6
25027="FOOBAR": 6
25028="foobar": 6
25028="fooBar": 6
25028="fooBAR": 6
25028="FOOBAR":
25029="foobar": 6
25029="Foobar": 6
25029="FOobar":
25029="FOOBAR":

View File

@@ -0,0 +1,172 @@
11000="0t Q\nF\r\x00_%": 10
11001="\x00": 1
11001="\xff": 1
11001="7": 1
11002="\x00": 1
11002="\xff": 1
11002="7": 1
11003="\x00": 1
11003="\xff": 1
11003="7": 1
11004="\x00": 1
11004="\xff": 1
11004="7": 1
11005="\x00": 1
11005="\xff": 1
11005="7": 1
11006="0f7 \x1a7%": 7
11007="l@; Rwf": 7
11008="0": 1
11008="1": 1
11008="A": 1
11008="q": 1
11008="%": 1
11009="1": 1
11009="2": 1
11009="A": 1
11009="_": 1
11010="Aa0arg": 6
11010="Aa04t9":
11010="Ff97AZ": 6
11010="Dd76q@": 6
11011="~a": 2
11011="^a":
11011="^\n":
11012="\x00": 1
11012="\x05": 1
11012="\x1f": 1
11013="]": 1
11013="[": 1
11013="_": 1
11013="w": 1
11013="W": 1
11013="z": 1
11013="a": 1
11013="C": 1
11014="A": 1
11014="a": 1
11014="q": 1
11014="5": 1
11014="_":
11015="-": 1
11015="a": 1
11016="-": 1
11016="A": 1
11017="-": 1
11017="T": 1
11018="-": 1
11018="d": 1
11018="0": 1
11020="\x08": 1
11020="b":
11021=".$": 2
11021=".":
11022="]": 1
11022="a": 1
11023="f": 1
11023="]":
11023="a":
11024="]-_^ABC": 1,3,4
11100="]": 1
11100="[":
11101="]": 1
11101="[":
11102="[": 1
11102="]": 1
11103="^": 1
11103="X":
11104="+": 1
11104=",": 1
11104="-": 1
11104="a":
11105="A": 1
11105="7": 1
11105="-": 1
11105=",":
11106="ABCDEFGHIJKL-": 1,2,3,5,6,7,13
11107="ABCDEFGHIJKL-": 1,2,3,5,13
11108="\x00 01234567890\x5c": 1
11109="\x00 01234567890\x5c": 2
11110="\x00 01234567890\x5c": 2
11111="\x00 01234567890\x5c": 2,3,13
11112="\x00 01234567890\x5c": 2,4
11113="\x00 01234567890\x5c": 4,11
11114="\x00 01234567890\x5c": 1
11115="\x00 01234567890\x5c": 4
11116="\x00 01234567890\x5c": 4
11117="\x00 01234567890\x5c": 4
11121="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 19,27,35
11122="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14
11123="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14,36
11124="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 32,33
11125="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 36
11127="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,35,36
11128="\x00 01234567890abcdefhjiklmnopq{}\x5cQE[]": 14,22
11200=">":
11200="^":
11201="B":
11201="S":
11202="B":
11202="S":
11203="^":
11204="!":
11205="-": 1
11205="*":
11205="_": 1
11205="`":
11205=">": 1
11302="foofoofoofoobarfoobarbar": 15,21,24
11306="foobazfoofoobazfoobarfoobarbarbaz": 33
11307="abcdefABCDEF0123456789": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
11307="~!@#$%ghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYZa": 47
11308="_7\xff0qq\xff": 7
11309="A\x00aal*g": 7
11310="\x7f": 1
11312="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123
11313="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11314="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123
11315="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11316="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128
11317="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11318="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,33
11319="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11320="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,128
11321="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11322="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58
11323="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11324="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
11325="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11326="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123
11327="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11328="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
11329="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11330="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 10,11,12,13,14,33
11331="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11332="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91
11333="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11334="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,98,99,100,101,102,103
11335="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11336="\x0c": 1
11337="\x07": 1
11338="\x1b": 1
11339="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127
11340="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,49,50,51,52,53,54,55,56,57,58,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11341="abcdef-\x00\xff": 1,2,7
11342="abcdef-\x00\xff": 1,2,7
11343="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11344="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11345="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11346="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,92,93,94,95,96,97,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256
11347="abcdef-q0": 1,2,7
11348="abcdef-q0": 1,2,7
11349="a a q q": 7
11350="abc\x00\x01 \xff": 1,2,3,4,5,6,7
11351="a(c_ab_a\xbf": 2,6,9
11352="a\x00aba.a\xff": 1,2,3,5,7
11353="\xf3\x93\x8c\x8a":
11353="\xf3\x89\xb8\x91":
11353="\x14\xf3\xa8\xa5\x8d": 1
11354="a9gz": 1,2,3,4
11354="\xee\x80\x80\xc2\xb6": 3,5
11355="a . ; :": 3,5,7
11355="\xc2\xb4":

View File

@@ -0,0 +1,72 @@
15800="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 9,15,18,24,27,33,36,42,45,48
15800="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49
15800="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50
15800="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51
15800="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,19,22,28,31,37,40,46,49,52
15800="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,20,23,29,32,38,41,47,50,53
15800="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54
15800="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55
15800="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56
15800="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57
15800="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58
15801="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15801="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15802="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,24,33,42,48
15802="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49
15802="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50
15802="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51
15802="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,31,40,49
15802="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,32,41,50
15802="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,24,33,42,51
15802="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15802="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15802="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15802="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz":
15803="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,18,24,27,33,36,42,45,48
15803="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,16,19,25,28,34,37,43,46,49
15803="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,17,20,26,29,35,38,44,47,50
15803="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,18,21,27,30,36,39,45,48,51
15803="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,19,22,28,31,37,40,46,49,52
15803="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,20,23,29,32,38,41,47,50,53
15803="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54
15803="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55
15803="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56
15803="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57
15803="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58
15804="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,48
15804="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,19,25,28,34,37,43,46,49
15804="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,20,26,29,35,38,44,47,50
15804="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,21,27,30,36,39,45,48,51
15804="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,28,31,37,40,46,49,52
15804="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,29,32,38,41,47,50,53
15804="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54
15804="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55
15804="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56
15804="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57
15804="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58
15805="foobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,48
15805="Xfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 10,19,25,28,34,37,43,46,49
15805="XXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 11,20,26,29,35,38,44,47,50
15805="XXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 12,21,27,30,36,39,45,48,51
15805="XXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 13,22,28,31,37,40,46,49,52
15805="XXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 14,23,29,32,38,41,47,50,53
15805="XXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 15,21,24,30,33,39,42,48,51,54
15805="XXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 16,22,25,31,34,40,43,49,52,55
15805="XXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 17,23,26,32,35,41,44,50,53,56
15805="XXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 18,24,27,33,36,42,45,51,54,57
15805="XXXXXXXXXXfoobazbarfoobazbarfoobazbarfoobazbarfoobazbarbaz": 19,25,28,34,37,43,46,52,55,58
15806="anorak.*trainspotter": 20
15806="anorak.*trainspotterA": 20
15807="anorak.*trainspotter": 20
15807="anorak.*trainspotterA": 20
15808="anorak.*trainspotter": 20
15808="anorak.*trainspotterA": 20

View File

@@ -0,0 +1,80 @@
1000="foobar":
1000="foofoobar": 9
1000="foofoofoobar": 12
1000="foofoofoofoobar": 15
1000="xfoobar":
1000="xfoofoobar": 10
1000="xfoofoofoobar": 13
1000="xfoofoofoofoobar": 16
1001="foobar":
1001="foofoobar": 9
1001="foofoofoobar": 12
1001="foofoofoofoobar": 15
1001="xfoobar":
1001="xfoofoobar": 10
1001="xfoofoofoobar": 13
1001="xfoofoofoofoobar": 16
1002="foobar":
1002="foofoobar": 9
1002="foofoofoobar": 12
1002="foofoofoofoobar": 15
1002="xfoobar":
1002="xfoofoobar":
1002="xfoofoofoobar":
1002="xfoofoofoofoobar":
1003="foobar":
1003="foofoobar": 9
1003="foofoofoobar": 12
1003="foofoofoofoobar":
1003="xfoobar":
1003="xfoofoobar":
1003="xfoofoofoobar":
1003="xfoofoofoofoobar":
1004="foobar":
1004="foofoobar": 9
1004="foofoofoobar": 12
1004="foofoofoofoobar": 15
1004="xfoobar":
1004="xfoofoobar": 10
1004="xfoofoofoobar": 13
1004="xfoofoofoofoobar": 16
1005="foobar":
1005="foofoobar": 9
1005="foofoofoobar": 12
1005="foofoofoofoobar": 15
1005="xfoobar":
1005="xfoofoobar": 10
1005="xfoofoofoobar": 13
1005="xfoofoofoofoobar": 16
1006="foobar":
1006="foofoobar":
1006="foofoofoobar": 12
1006="foofoofoofoobar": 15
1006="xfoobar":
1006="xfoofoobar":
1006="xfoofoofoobar": 13
1006="xfoofoofoofoobar": 16
1007="foobar":
1007="foofoobar":
1007="foofoofoobar": 12
1007="foofoofoofoobar": 15
1007="xfoobar":
1007="xfoofoobar":
1007="xfoofoofoobar": 13
1007="xfoofoofoofoobar": 16
1008="foobar":
1008="foofoobar": 9
1008="foofoofoobar": 12
1008="foofoofoofoobar": 15
1008="xfoobar":
1008="xfoofoobar": 10
1008="xfoofoofoobar": 13
1008="xfoofoofoofoobar": 16
1009="foobar":
1009="foofoobar": 9
1009="foofoofoobar": 12
1009="foofoofoofoobar": 15
1009="xfoobar":
1009="xfoofoobar": 10
1009="xfoofoofoobar": 13
1009="xfoofoofoofoobar": 16

View File

@@ -0,0 +1,552 @@
16200="foobar": 6
16200="foo bar": 7
16201="foobar":
16201="foo bar":
16201="foo bar":
16201="foo bar":
16201="foo bar": 10
16201="foo bar": 11
16201="foo bar": 12
16202="foobar": 6
16202="foo bar": 7
16202="foo bar": 8
16202="foo bar": 9
16202="foo bar": 10
16202="foo bar":
16202="foo bar":
16203="foobar":
16203="foo bar":
16203="foo bar":
16203="foo bar":
16203="foo bar": 10
16203="foo bar":
16203="foo bar":
16204="foo bar":
16204="foo bar": 10
16204="foo bar": 11
16204="foo bar": 12
16204="foo bar": 13
16204="foo bar": 14
16204="foo bar": 15
16204="foo bar":
16204="foo bar":
16204="foo bar":
16205="ab":
16205="a b":
16205="a b":
16205="a b": 5
16205="a b": 6
16205="a b_": 5
16205="_a b": 6
16205="_a b_": 6
16206="ab":
16206="a b":
16206="a b":
16206="a b":
16206="a b":
16206="a b_":
16206="_a b":
16206="_a b_":
16206=" a b":
16206=" a b": 10
16206=" a b": 11
16206=" a b": 12
16206=" a b": 13
16207="preamble_q": 10
16207="preamble_____________________q": 30
16207="preamble______________________q":
16207="preamble_______________________q":
16207="preamble________________________q":
16208="preambleq":
16208="preamble_q":
16208="preamble__q":
16208="preamble___q": 12
16208="preamble____q": 13
16208="preamble_____q": 14
16209="aaaa":
16209="aaxaa": 5
16209="aaxxxxxaa": 9
16209="aaxxxxxxaa": 10
16209="aaxxxxxxxaa":
16209="_aaxxxxxaa": 10
16209="_aaxxxxxxaa":
16209="_aaxxxxxxxaa":
16210="01234567890123456789012345678901": 32
16210="012345678901234567890123456789012345678901234567890123456789": 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48
16211="\x04\xe8F\x0eI\xe1\xcb5\x0b{\x04\xea\x17%Jt\xf2\x11\x8e!\x11vOu9\x07\x12":
16212="aaaaaaaaaaaaaaaaaaaa": 10
16212="xaaaaaaaaaaaaaaaaaaa": 10
16212="aaaaaaaaaxaaaaaaaaaa":
16212="aaaaaaaaaaxaaaaaaaaa": 10
16213="aaaaaaaaaaaaaaaaaaax": 20
16213="aaaaaaaaaaaaaaaaaaaa":
16213="aaaaaaaaaaaaaaaaaaaax": 21
16213="aaaaaaaaaaaaaaaaaax":
16213="aaaaaaaaaaaaaaaaaaxa":
16214="foo":
16214="foo_":
16214="foo__":
16214="foo___":
16214="foo____":
16214="foo_____":
16214="foo______":
16214="foo_______": 10
16214="foo________": 10,11
16214="foo_________": 10,11,12
16214="foo__________": 10,11,12,13
16214="foofoo_______": 10,11,12,13
16214="foofoo________": 10,11,12,13,14
16214="foofoo_________": 10,11,12,13,14,15
16214="foofoo__________": 10,11,12,13,14,15,16
16214="foofoo___________": 10,11,12,13,14,15,16,17
16215="foo":
16215="foo_":
16215="foo__":
16215="foo___":
16215="foo____":
16215="foo_____":
16215="foo______":
16215="foo_______": 10
16215="foo________": 10,11
16215="foo_________": 10,11,12
16215="foo__________": 10,11,12,13
16215="foofoo_______": 10,11,12,13
16215="foofoo________": 10,11,12,13,14
16215="foofoo_________": 10,11,12,13,14,15
16215="foofoo__________": 10,11,12,13,14,15,16
16215="foofoo___________": 10,11,12,13,14,15,16,17
16216="hatstandteakettle":
16216="hatstand_teakettle":
16216="hatstand__teakettle":
16216="hatstand___teakettle":
16216="hatstand____teakettle":
16216="hatstand_____teakettle":
16216="hatstand______teakettle":
16216="hatstand_______teakettle":
16216="hatstand________teakettle": 25
16216="hatstand_________teakettle": 26
16217="hatstand":
16217="_hatstand":
16217="__hatstand": 10
16217="___hatstand": 11
16217="____hatstand": 12
16217="_____hatstand": 13
16217="______hatstand": 14
16217="_______hatstand": 15
16217="________hatstand":
16217="_________hatstand":
16218="abc":
16218="_abc":
16218="__abc": 5
16218="___abc": 6
16218="____abc": 7
16218="_____abc": 8
16218="______abc": 9
16218="_______abc": 10
16218="________abc":
16219="foobar":
16219="foo_bar":
16219="foo__bar":
16219="foo___bar":
16219="foo____bar": 10
16219="foofoo_bar": 10
16219="foofoo_____bar": 14
16220="foobar":
16220="foo_bar":
16220="foo__bar":
16220="foo___bar":
16220="foo____bar": 10
16220="foofoo_bar": 10
16220="foofoo_____bar": 14
16221="0":
16221="01":
16221="012":
16221="0123": 4
16221="01234": 4,5
16222="0":
16222="01":
16222="012":
16222="0123": 4
16222="01234": 4,5
16223="hatstand":
16223="hatstandhatstand":
16223="___hatstandhatstand":
16223="____hatstandhatstand": 20
16223="_____hatstandhatstand": 21
16223="hatstandhatstandhatstand": 24
16224="hatstand":
16224="hatstandhatstand":
16224="___hatstandhatstand":
16224="____hatstandhatstand": 20
16224="_____hatstandhatstand": 21
16224="hatstandhatstandhatstand": 24
16225="hatstand":
16225="hatstandhatstandhatstand": 20,21,22,23,24
16225="hatstand___________":
16225="hatstand____________": 20
16225="hatstand_____________": 20,21
16226="long cat is lng":
16226="long cat is long": 16
16226="long cat is loong": 17
16226="long cat is looong": 18
16226="long cat is loooooooooooooooooooong": 35
16227="":
16227="W":
16227="l": 1
16227="ll": 1
16227="l l l l l l l l l l l l": 1
16227=" l l l l l l l l l l l l":
16228="rascal": 6
16228="_rascal":
16228="__rascal":
16229="": 0
16229="\x0b\x80vdwn\xd5\x19vdwn\x8a\x1fvdwnp\x8evdwn": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
16230="abc_ef":
16230="abc_def":
16230="abc_ddef":
16230="abc_dddef":
16230="abc_ddddef": 10
16230="abc_dddddef": 11
16230="abc_ddddddef": 12
16230="abc_dddddddef": 13
16230="_abc_def":
16230="__abc_def":
16230="___abc_def":
16230="____abc_def":
16230="______abc_def":
16230="_______abc_def":
16230="________abc_def":
16230="_________abc_def":
16230="__________abc_def":
16230="___________abc_def":
16230="____________abc_def":
16230="_____________abc_def":
16230="______________abc_def":
16230="_______________abc_def":
16230="________________abc_def":
16230="_________________abc_def":
16230="__________________abc_def":
16230="___________________abc_def":
16230="____________________abc_def":
16230="_____________________abc_def":
16230="______________________abc_def":
16230="_______________________abc_def":
16230="________________________abc_def":
16230="_________________________abc_def":
16231="egs\n": 3
16231="g": 1
16231="g\n": 1
16231="t": 1
16232="h":
16232="_ab": 3
16232="_ab\n": 3
16233="abc":
16233="abcd":
16233="abcde": 5
16233="abcdef": 5,6
16233="__abc":
16233="__abcd":
16233="__abcde": 7
16233="__abcdef": 7,8
16234="kne":
16234="knee":
16234="kneee": 5
16234="kneeee": 5,6
16234="kneeeee": 5,6,7
16234="kneeeeee": 5,6,7,8
16234="kneeeeeee": 5,6,7,8,9
16234="kneeeeeeee": 5,6,7,8,9,10
16234="kneeeeeeeee": 5,6,7,8,9,10,11
16234="kneeeeeeeeee": 5,6,7,8,9,10,11,12
16234="kneeeeeeeeeee": 5,6,7,8,9,10,11,12
16234="knereeeereeee": 5,6,7,8,9,10,11,12
16235="s":
16235="c":
16235="zzzz": 4
16235="ycdliejrcnrjfh akjshdna y": 4,9,21
16236="__h__C]z________zJ]_____9___x": 8,17
16237="O\xa4\x12\x0b\xd6\xa8j\xfdtL!Ia\xaa\xd3\xfa\xf31!\xbej":
16238="kgh_\xc5\xc9\xde\xcb\xc2\xfe\x0b\xb3\x83M\xf8\xa5g\"\x82c4a-\xd8[\xf8\xed\x9b\xdd\xb9g\xe8\xbf": 2
16239="p":
16239="pp":
16239="ppp":
16239="pppp":
16239="ppppp": 5
16239="pppppp": 5,6
16239="ppppppp": 5,6,7
16239="pppppppp": 5,6,7,8
16239="ppppppppp": 5,6,7,8,9
16239="pppppppppp": 5,6,7,8,9,10
16239="ppppppppppp": 5,6,7,8,9,10,11
16239="pppppppppppp": 5,6,7,8,9,10,11,12
16239="ppppppppppppp": 5,6,7,8,9,10,11,12,13
16239="pppppppppppppp": 5,6,7,8,9,10,11,12,13,14
16239="ppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15
16239="pppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15
16239="ppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15
16239="pppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15
16239="ppppppppppppppppppp": 5,6,7,8,9,10,11,12,13,14,15
16239="\npppp":
16239="\nppppp": 6
16239="\npppppp": 6,7
16240="":
16240="a":
16240="c":
16240="cc":
16240="ccc":
16240="cccc": 4
16240="ccccc": 4,5
16240="acacacacacac": 4,6,8,10,12
16241="ykmy_g":
16241="ykmy_gg":
16241="ykmy_ggg": 8
16241="ykmy_gggg": 8,9
16241="ykmy_ggggg": 8,9,10
16241="_ykmy_ggggg": 9,10,11
16242="qrhhhhh":
16242="qrhhhhhh": 8
16242="qrhhhhhhh": 8,9
16242="qrhhhhhhhh": 8,9,10
16242="qrhhhhhhhhh": 8,9,10,11
16242="qrhhhhhhhhhh": 8,9,10,11,12
16242="qrhhhhhhhhhhh": 8,9,10,11,12,13
16242="qrhhhhhhhhhhhh": 8,9,10,11,12,13,14
16242="qrhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15
16242="qrhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16
16242="qrhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17
16242="qrhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18
16242="qrhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19
16242="qrhhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19,20
16242="qrhhhhhhhhhhhhhhhhhhh": 8,9,10,11,12,13,14,15,16,17,18,19,20
16242="z":
16242="qmhhhhhhhhhhz": 8,9,10,11,12
16243="cjmwjnnnn": 9
16244="\x08$\x82Zz\x8b\x0e\xe2a\x91\x8c\x9eQ\xc7\x84IQYEaYSC=\xbaB\x0b\xcd\xc8\xe5t\x8b\x06m\xa40\x1a%0KP":
16244="__qyeysa":
16244="__qye_ysa":
16244="__qye__ysa": 9
16244="__qye__ys:":
16245="foo": 3
16245="afoo":
16245="aafoo":
16245="aaafoo":
16245=" foo": 4
16245=" foo": 5
16245=" foo": 9
16245=" foo": 10
16245=" foo":
16245=" afoo":
16245=" afoo":
16245=" afoo":
16246="foo": 3
16246="foo ": 3
16246="fooa":
16246="_______foo": 10
16246="_______foo ": 10
16246="________foo ":
16246="______foo ": 9
16246="_____foo ": 8
16247="foo": 3
16247="foo ": 3
16247=" foo ": 4
16247="______ foo ": 10
16247="_____ foo ": 9
16247="_____ fooa":
16247="_______ foo ":
16247="________ foo ":
16248="foobar":
16248="foo bar": 7
16248=" foo bar": 8
16248=" foo bar": 9
16248=" foo bar": 10
16248=" foo bar": 11
16248=" foo bar": 12
16248=" foo bar": 13
16248=" foo bar": 14
16248=" foo bar": 15
16248=" foo bar ": 9
16248=" foo bar ": 10
16248=" foo bar ": 11
16248=" foo bar ": 12
16248=" foo bar ": 13
16248=" foo bar ": 14
16248=" foo bar ": 15
16249="foobar":
16249="foo bar":
16249=" foo bar":
16249=" foo bar":
16249=" foo bar":
16249=" foo bar":
16249=" foo bar": 12
16249=" foo bar": 13
16249=" foo bar": 14
16249=" foo bar": 15
16249=" foo bar ":
16249=" foo bar ":
16249=" foo bar ":
16249=" foo bar ": 12
16249=" foo bar ": 13
16249=" foo bar ": 14
16249=" foo bar ": 15
16250="foobar":
16250="foo bar": 7
16250=" foo bar": 8
16250=" foo bar": 9
16250=" foo bar": 10
16250=" foo bar": 11
16250=" foo bar": 12
16250=" foo bar": 13
16250=" foo bar": 14
16250=" foo bar": 15
16250=" foo bar ": 9
16250=" foo bar ": 10
16250=" foo bar ": 11
16250=" foo bar ": 12
16250=" foo bar ": 13
16250=" foo bar ": 14
16250=" foo bar ": 15
16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51
16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52
16251="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52,53
16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52
16252="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52,53
16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16253="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 53
16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51
16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52
16254="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 51,52,53
16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52
16255="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 52,53
16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
16256="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 53
16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54
16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55
16257="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55,56
16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55
16258="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55,56
16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16259="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56
16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54
16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55
16260="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 54,55,56
16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55
16261="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 55,56
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa":
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56,57
16262="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 56,57,58
16263="unambiguous": 11
16263="extremely unambiguous": 21
16264=" \n a":
16264=" \na": 13
16264=" a":
16264=" g": 12
16264=" \n a":
16264=" \na": 12
16264=" a":
16264=" g": 11
16264=" \na": 11
16264=" a":
16264=" g": 10
16264="\na":
16264="a":
16264="g":
16265="_apple2":
16265="apple2": 6
16265="foo": 3
16265=" foobar":
16265="foo__bar": 3
16265="foo_bar": 3
16265="foobar": 3,6
16265="jabberwocky":
16266="aaaaaaaa":
16266="bbbbbbbbb":
16266="cccccccccc": 10
16266="floating":
16266=" floating":
16266=" floating": 10
16266=" floating": 11
16266=" floating": 12
16266=" floating": 13
16267="abcdef_____":
16267="abcdefabcdefabcdefabcdef_____": 20,21,22,23,24,25,26,27,28,29
16267="_________abcdef_____": 20
16267="_________abcdef____":
16267="_________abcdef______": 20,21
16267="_________abcdefabcdef": 20,21
16267="_____________abcdefabcdef": 24,25
16268="abcdef_":
16268="012345678901abcdef_":
16268="0123456789012abcdef_": 20
16268="01234567890123abcdef_": 21
16268="012345678901234abcdef_": 22
16268="01234567890123abcdef":
16268="012345678901234abcdef":
16269="012345678901abcdef__": 20
16269="0123456789012abcdef__": 21
16269="01234567890123abcdef__": 22
16269="012345678901234abcdef__": 23
16269="01234567890123abcdef_":
16269="012345678901234abcdef_":
16270="abcdef":
16270="_abcdef":
16270="__abcdef":
16270="___abcdef":
16270="____abcdef": 10
16270="_____abcdef": 11
16270="______abcdef": 12
16270="_______abcdef": 13
16270="________abcdef": 14
16270="_________abcdef": 15
16270="__________abcdef": 16
16270="___________abcdef": 17
16270="____________abcdef": 18
16270="_____________abcdef": 19
16270="______________abcdef": 20
16270="_______________abcdef":
16270="________________abcdef":
16270="abcdefabcdefabcdefabcdefabcdefabcdef": 12,18
16270="defabcdefabcdefabcdefabcdefabcdef": 15
16271="abcdef":
16271="_abcdef":
16271="__abcdef":
16271="___abcdef":
16271="____abcdef": 10
16271="_____abcdef":
16271="______abcdef":
16271="_______abcdef":
16271="________abcdef":
16271="abcdefabcdefabcdefabcdefabcdefabcdef":
16271="cdefabcdefabcdefabcdefabcdefabcdef": 10
16272="abcdef__":
16272="__abcdef__": 10
16272="_abcdef__":
16272="___abcdef__":
16272="__abcdef_":
16272="_abcdef_":
16272="___abcdef_":
16273="\xe0\xb7\x81\xf1\x81\x90\xb9b\n":
16273="\xf3\xa3\x87\x9d\xf4\x8f\xb8\xa0b": 9
16273="___b":
16273="__b":
16273="__b\n":

View File

@@ -0,0 +1,368 @@
15300="fo":
15300="foo": 3
15300="ffoo": 4
15300="fofoo": 5
15300="foofoo": 3,6
15300="fooXXXfoo": 3,9
15300="XXXfooXXXfoo": 6,12
15300="foofoofoofoo": 3,6,9,12
15301="foo":
15301="foobar": 6
15301="foobarbar": 6,9
15301="foobar\nfoobarbar": 6,13,16
15302="foo":
15302="foobar": 6
15302="foobarbar": 6,9
15302="foobar\nfoobarbar": 6,13,16
15303="bar123456781X3456789":
15303="blahfoo12345678123456789": 22
15303="foo":
15303="foo12345678123456":
15303="foo123456781234567": 18
15303="foo1234567812345678": 18
15303="foo12345678123456789": 18
15303="foo1234567812345678X": 18
15303="foo123456781234567X": 18
15303="foo12345678123456X":
15303="foo1234567812345X":
15303="foo123456781X3456789":
15303="foofoo12345678123456789": 18,21
15303="foofoo12345678123456789": 18,21
15303="foofooX23456781foo23456789YYYYYYYY": 33
15303="fooX2345678123456789":
15303="fooXfoo12345678123456789": 22
15303="XXX12345678123456789":
15304="bar123456781X3456789":
15304="blahfoo12345678123456789": 23
15304="foo":
15304="foo12345678123456":
15304="foo123456781234567":
15304="foo1234567812345678": 19
15304="foo12345678123456789": 19
15304="foo1234567812345678X": 19
15304="foo123456781234567X":
15304="foo12345678123456X":
15304="foo1234567812345X":
15304="foo123456781X3456789":
15304="foofoo12345678123456789": 19,22
15304="foofoo12345678123456789": 19,22
15304="foofooX23456781foo23456789YYYYYYYY": 34
15304="fooX2345678123456789":
15304="fooXfoo12345678123456789": 23
15304="XXX12345678123456789":
15305="bar123456781X3456789":
15305="blahfoo12345678123456789": 24
15305="foo":
15305="foo12345678123456":
15305="foo123456781234567":
15305="foo1234567812345678":
15305="foo12345678123456789": 20
15305="foo1234567812345678X":
15305="foo123456781234567X":
15305="foo12345678123456X":
15305="foo1234567812345X":
15305="foo123456781X3456789":
15305="foofoo12345678123456789": 20,23
15305="foofoo12345678123456789": 20,23
15305="foofooX23456781foo23456789YYYYYYYY":
15305="fooX2345678123456789":
15305="fooXfoo12345678123456789": 24
15305="XXX12345678123456789":
15306="bar123456781X3456789":
15306="blahfoo12345678123456789": 24
15306="foo":
15306="foo12345678123456":
15306="foo123456781234567":
15306="foo1234567812345678":
15306="foo12345678123456789": 20
15306="foo1234567812345678X":
15306="foo123456781234567X":
15306="foo12345678123456X":
15306="foo1234567812345X":
15306="foo123456781X3456789":
15306="foofoo12345678123456789": 20,21,22,23
15306="foofoo12345678123456789": 20,21,22,23
15306="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34
15306="fooX2345678123456789":
15306="fooXfoo12345678123456789": 21,22,23,24
15306="XXX12345678123456789":
15307="bar123456781X3456789":
15307="blahfoo12345678123456789":
15307="foo":
15307="foo12345678123456":
15307="foo123456781234567":
15307="foo1234567812345678":
15307="foo12345678123456789":
15307="foo1234567812345678X":
15307="foo123456781234567X":
15307="foo12345678123456X":
15307="foo1234567812345X":
15307="foo123456781X3456789":
15307="foofoo12345678123456789":
15307="foofoo12345678123456789":
15307="foofooX23456781foo23456789YYYYYYYY":
15307="fooX2345678123456789":
15307="fooXfoo12345678123456789":
15307="XXX12345678123456789":
15308="bar123456781X3456789":
15308="blahfoo12345678123456789": 24
15308="foo":
15308="foo12345678123456":
15308="foo123456781234567":
15308="foo1234567812345678":
15308="foo12345678123456789": 20
15308="foo1234567812345678X":
15308="foo123456781234567X":
15308="foo12345678123456X":
15308="foo1234567812345X":
15308="foo123456781X3456789":
15308="foofoo12345678123456789": 20,23
15308="foofoo12345678123456789": 20,23
15308="foofooX23456781foo23456789YYYYYYYY":
15308="fooX2345678123456789":
15308="fooXfoo12345678123456789": 24
15308="XXX12345678123456789":
15309="bar123456781X3456789":
15309="blahfoo12345678123456789": 24
15309="foo":
15309="foo12345678123456":
15309="foo123456781234567":
15309="foo1234567812345678":
15309="foo12345678123456789": 20
15309="foo1234567812345678X":
15309="foo123456781234567X":
15309="foo12345678123456X":
15309="foo1234567812345X":
15309="foo123456781X3456789":
15309="foofoo12345678123456789": 23
15309="foofoo12345678123456789": 23
15309="foofooX23456781foo23456789YYYYYYYY":
15309="fooX2345678123456789":
15309="fooXfoo12345678123456789": 24
15309="XXX12345678123456789":
15310="bar123456781X3456789":
15310="blahfoo12345678123456789": 17,18,19,20,21,22,23,24
15310="foo":
15310="foo12345678123456": 17
15310="foo123456781234567": 17,18
15310="foo1234567812345678": 17,18,19
15310="foo12345678123456789": 17,18,19,20
15310="foo1234567812345678X": 17,18,19
15310="foo123456781234567X": 17,18
15310="foo12345678123456X": 17
15310="foo1234567812345X":
15310="foo123456781X3456789":
15310="foofoo12345678123456789": 17,18,19,20,21,22,23
15310="foofoo12345678123456789": 17,18,19,20,21,22,23
15310="foofooX23456781foo23456789YYYYYYYY": 24,25,26,27,28,29,30,31,32,33,34
15310="fooX2345678123456789":
15310="fooXfoo12345678123456789": 21,22,23,24
15310="XXX12345678123456789": 20
15311="bar123456781X3456789":
15311="blahfoo12345678123456789": 17
15311="foo":
15311="foo12345678123456": 17
15311="foo123456781234567": 17
15311="foo1234567812345678": 17
15311="foo12345678123456789": 17
15311="foo1234567812345678X": 17
15311="foo123456781234567X": 17
15311="foo12345678123456X": 17
15311="foo1234567812345X":
15311="foo123456781X3456789":
15311="foofoo12345678123456789": 17
15311="foofoo12345678123456789": 17
15311="foofooX23456781foo23456789YYYYYYYY":
15311="fooX2345678123456789":
15311="fooXfoo12345678123456789":
15311="XXX12345678123456789":
15312="bar123456781X3456789":
15312="blahfoo12345678123456789": 22
15312="foo":
15312="foo12345678123456":
15312="foo123456781234567": 18
15312="foo1234567812345678": 18
15312="foo12345678123456789": 18
15312="foo1234567812345678X": 18
15312="foo123456781234567X": 18
15312="foo12345678123456X":
15312="foo1234567812345X":
15312="foo123456781X3456789":
15312="foofoo12345678123456789": 18,20,21
15312="foofoo12345678123456789": 18,20,21
15312="foofooX23456781foo23456789YYYYYYYY": 32,33
15312="fooX2345678123456789":
15312="fooXfoo12345678123456789": 21,22
15312="XXX12345678123456789":
15313="bar123456781X3456789":
15313="blahfoo12345678123456789": 23
15313="foo":
15313="foo12345678123456":
15313="foo123456781234567":
15313="foo1234567812345678": 19
15313="foo12345678123456789": 19
15313="foo1234567812345678X": 19
15313="foo123456781234567X":
15313="foo12345678123456X":
15313="foo1234567812345X":
15313="foo123456781X3456789":
15313="foofoo12345678123456789": 19,21,22
15313="foofoo12345678123456789": 19,21,22
15313="foofooX23456781foo23456789YYYYYYYY": 33,34
15313="fooX2345678123456789":
15313="fooXfoo12345678123456789": 22,23
15313="XXX12345678123456789":
15314="bar123456781X3456789":
15314="blahfoo12345678123456789": 24
15314="foo":
15314="foo12345678123456":
15314="foo123456781234567":
15314="foo1234567812345678":
15314="foo12345678123456789": 20
15314="foo1234567812345678X":
15314="foo123456781234567X":
15314="foo12345678123456X":
15314="foo1234567812345X":
15314="foo123456781X3456789":
15314="foofoo12345678123456789": 20,22,23
15314="foofoo12345678123456789": 20,22,23
15314="foofooX23456781foo23456789YYYYYYYY": 34
15314="fooX2345678123456789":
15314="fooXfoo12345678123456789": 23,24
15314="XXX12345678123456789":
15315="bar123456781X3456789":
15315="blahfoo12345678123456789": 22
15315="foo":
15315="foo12345678123456":
15315="foo123456781234567": 18
15315="foo1234567812345678": 18
15315="foo12345678123456789": 18
15315="foo1234567812345678X": 18
15315="foo123456781234567X": 18
15315="foo12345678123456X":
15315="foo1234567812345X":
15315="foo123456781X3456789":
15315="foofoo12345678123456789": 18,21
15315="foofoo12345678123456789": 18,21
15315="foofooX23456781foo23456789YYYYYYYY": 33
15315="fooX2345678123456789":
15315="fooXfoo12345678123456789": 22
15315="XXX12345678123456789":
15316="bar123456781X3456789":
15316="blahfoo12345678123456789": 23
15316="foo":
15316="foo12345678123456":
15316="foo123456781234567":
15316="foo1234567812345678": 19
15316="foo12345678123456789": 19
15316="foo1234567812345678X": 19
15316="foo123456781234567X":
15316="foo12345678123456X":
15316="foo1234567812345X":
15316="foo123456781X3456789":
15316="foofoo12345678123456789": 19,22
15316="foofoo12345678123456789": 19,22
15316="foofooX23456781foo23456789YYYYYYYY": 34
15316="fooX2345678123456789":
15316="fooXfoo12345678123456789": 23
15316="XXX12345678123456789":
15317="bar123456781X3456789":
15317="blahfoo12345678123456789": 24
15317="foo":
15317="foo12345678123456":
15317="foo123456781234567":
15317="foo1234567812345678":
15317="foo12345678123456789": 20
15317="foo1234567812345678X":
15317="foo123456781234567X":
15317="foo12345678123456X":
15317="foo1234567812345X":
15317="foo123456781X3456789":
15317="foofoo12345678123456789": 20,23
15317="foofoo12345678123456789": 20,23
15317="foofooX23456781foo23456789YYYYYYYY":
15317="fooX2345678123456789":
15317="fooXfoo12345678123456789": 24
15317="XXX12345678123456789":
15318="foo": 3
15318="foofoo": 3,6
15318="bar": 3
15318="bar": 3
15318="foobar": 3,6
15318="barfoo": 3,6
15318="XXfoo": 5
15318="XXfoofoo": 5,8
15318="XXbar": 5
15318="XXbar": 5
15318="XXfoobar": 5,8
15318="XXbarfoo": 5,8
15319="foobarX": 4,7
15319="barfooX": 4,7
15320="___\na___aa_": 0,4,5,10
15321="foo bar baz": 7,11
15321="foobarbarbazbarbaz": 6,9,12,15,18
15321="foobarbaz": 6,9
15321="foobarbazfoobarbaz": 6,9,15,18
15322="foo bar baz": 7,11
15322="foobarbarbazbarbaz": 6,9,12,15,18
15322="foobarbaz": 6,9
15322="foobarbazfoobarbaz": 6,9,15,18
15323="foo barrr": 7,8,9
15323="foobar": 6
15323="foobarbarrr": 6,9,10,11
15323="foobarr": 6,7
15323="foobarrr": 6,7,8
15323="foofoobarrr": 9,10,11
15324=" foo eod bar eod baz eod": 12,20,24
15324="foobarbarbazbarbaz": 6,9,12,15,18
15324="foobarbaz": 6,9
15324="foobarbazeod": 6,9,12
15324="foobarbazfoobarbaz": 6,9,15,18
15324="foobareod": 6,9
15325="foo eod": 7
15325="foo eod_":
15325="foo eodd": 8
15325="fooeod": 6
15325="fooeodd": 7
15325="fooeoddd": 8
15326="foo eod": 7
15326="foo eod\n": 7
15326="foo eod_":
15326="foo eod_\n":
15326="foo eodd": 8
15326="foo eodd\n": 8
15326="fooeod": 6
15326="fooeod\n": 6
15326="fooeodd": 7
15326="fooeodd\n": 7
15326="fooeoddd": 8
15326="fooeoddd\n": 8
15327="":
15327="0":
15327="A": 1
15327="B": 1
15327="C": 1
15327="D": 1
15327="E": 1
15327="F": 1
15327="_ABCDEF": 2,3,4,5,6,7
15327="_abcdef": 2,3,4,5,6,7
15327="a": 1
15327="b": 1
15327="c": 1
15327="d": 1
15327="e": 1
15327="f": 1
15328="":
15328="A":
15328="B":
15328="C":
15328="_":
15328="____abc___ABC": 5,6,7
15328="a": 1
15328="b": 1
15328="c": 1
15328="d":
15329="____pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204
15329="____qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163
15329="____qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp": 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364

View File

@@ -0,0 +1,51 @@
50000:ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq
50000:ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr
50000:vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc
50000:oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm
50000:jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh
50000:ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy
50000:ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt
50000:fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap
50000:eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo
50000:gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb
50000:____________________________________________________________________________________________________ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq
50000:____________________________________________________________________________________________________ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr
50000:____________________________________________________________________________________________________vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc
50000:____________________________________________________________________________________________________oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm
50000:____________________________________________________________________________________________________jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh
50000:____________________________________________________________________________________________________ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy
50000:____________________________________________________________________________________________________ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt
50000:____________________________________________________________________________________________________fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap
50000:____________________________________________________________________________________________________eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo
50000:____________________________________________________________________________________________________gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb
50000: ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq ihcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr vtymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc oxqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm jtaanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh ntafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy ckalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt fbbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap eosktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo gvoiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb ukdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq
50000:kdnsybecoqlszhxiwfcpvmnoqobdfuoovmotdeefiwdoxukyxldjxthcmnxqebsiyvwwtadafmibpxnwuxqtpcndwzaiwurnvbkgzpfutisauyagfwacajrcmjlgmomzdakzjgpgnlepnjcynzhptporgjcrjkrnhvnucgvjjgfboisxjfaywypljihrstqvmwsqdvq
50000:hcntajbgquaruyfimiabusvmmqcpaxpowhhucnzlpfxzmmbcqahdmposiymqscqugtmictrnomnccfcdxzlksyuqkbjvgekaebwmcmzydebtltpcfbmckvwoqtinlplzopauzkcyiinbcjrfjkncggcowuifvwvoavxrkuaxuwjhnnyotkgbrkggwkafzvzmkgijnsr
50000:tymzjxeeyazemvcwsvcacdzihfbgiaqwjxmcncgdzafmhtvbvnmjrpfudnflcvfbkwcfsmdfaqtawqqcbigfrnjzwrdvndstesayfgjsiofshzvtabtgblrgbksqechctlngykpladacvwiffqwjktuosdjvdonjixekrlvvxeeqenylwjgqicdpgjhojsyyhuhtphc
50000:xqvlanpjsnxnoodzpjhsnmgkwjfyqxmqlbqmteabqdbnwtvnpeodvvkukcxqfczyrftogophbmkeuzcxmpyqfigkynftdstdudfynmfxhssbrpdhebywvnpltqxtvdthpppdllyofyktnrwzhbiklpfrclizidkkqbgimzmdrznwkmbledtmsazljcvmfzdlpzgwymm
50000:taanwnxkvwesndylwqcnsqlccnikybengkimrxauuvytagyasdomvupykaagpcthrrnkzjnysqywwyqpfbyqclabrcftwgvfcxdrhkgxlngnsxmkrvguvfugbgqruspkzojxrhqkrgjrybyoqktjrexxodbcdlfiyhclsvhsaysihhoycnpksoivyxxbglvyzhkbajh
50000:tafhsdlngeeeqphxqspxswcmubcwycbzusxunxrmqgmdktwblavcrdgjhecpfnqsyckxuxaboljmrvetofhgbeydypoeyydrxhordcgqafbnoylylqnvxynfcoygtiwiniwlctwmwornplgfpjbretneadneemlzzodtkkdmcyqrggrmjzlkzzjxoirfilosenpjexy
50000:kalndydcrodvvmyyuqbihprzzgnqympoeinwewgfqpzuhyygivfdhdxnnatccuaghjrddogabtgmcvpspptpicpftxdfdfsiilngteqvqjjsoevnqfiztgcvolmpqkemqeizzmlingcuyxyidvrlczmiifutjljifxiramtoxvtbkwzsrczyzdgbtkboudipjonydtt
50000:bbeioibbkbiiupjzcqrwjuvqjmbavnkvtogebhltedefahasbnvvvspugdtecfpstxsbtfluycxzfxgcvzhfyhgbgzyfcwltvyyoofolnolasemxqqywlrikjocwvhpqofufqyuhcisckvoveaeectwodmmcodisfwynzcctloqyheedjfpwcuwrixkdznnefgizrap
50000:osktuskzdokmshljlcazpmahliwzzmhmpzmsiymtvpctaqwdpmffcnkmkypkcrclmlcxmnysqhslegqetflncttxqiprjddowzkhyjlzytudxqnvcctpebufelzmxnzsfwqbahrgwbjrpbobfdwjfsbfjrhjsbqdlsurllezccluashcrywxhnbqqclikrnefkyutdo
50000:voiwjevplfxkeempnspkgljnqdckunshelsuogizffvbplhbyhxnjfabmjiigideullxtxbnjxczvaoveafcechrilvdkyzehhuhlohtjxiocfvjzdrjosuawxqmlbcwsnfnpxusoqldoumsedxbbwummwtbqrwkcjxkvyukcxekpjacjlezesaihhpqdatiosxgbbb
50001:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
50001: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
50001:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
50001:aaaaaaaaaaaaaaaaaaaaaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
50002:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50002: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50002:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50002:AAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50003:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50003: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50003:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50003:AAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
50003:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
50003:AAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAaaaaaa

View File

@@ -0,0 +1,29 @@
27000:AAAAAAAAAAAAABCDfoobaraaaaaabcdfoobarzzzzzzzzzzzzzzzzzzz
27000:aaaaaaaaaaaABCDfoobaraaaaaabcdfoobarzzzzzzzzzzzz
27000:aaaaaaaaaaLMNOfoobarzzzzzzzzzzzzzzzzzzz
27000:aaaaaaaaaaaaafoobarLLLLLLLLfoobarzzzzzzzzzzzz
27000:aaaaaaaaaaaAAfoobarzzzzzzzzzzzzzzzzzzzzzzzzzzzz
27000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNNfoobaraaaaaaNNNfoobarzzzzzzzzzzzzzzzzzzzzzzzzzz
27001:aaaaaaaaaaaaaarFOOBARfoobarFOOBARRRRfoobarfoobarzzzzzzzzzzzzzzzzzz
27001:foobarfoobarfoobarFfoobarFfoobarfoobarfoobarzzzzzzzzzzzzzzz
27002:aaaaaaaaaaaaFFaafoobaraaaaaaaaaafoobarzzzzzzzzzzzzzzzz
27002:aaaaaaaaaaaaa:afoobar aaaaaaafoobarzzzzzzzzzz
27002:bbbbbaaaaaAfoobar
27002:bbbbbaaaaafoobar
27002:bbbbbaaaaaaAAAAAAAAfoobarzzzzzzzzzz
27003:aaaaaaaaaaaaaaaaaaafoobarzzzzzzzzzzzzzzzzzzzz
27003:aaaaaabcdefghKKKKKKKKKKKKfoobarKKKKKKKKKKKKKKKKKK
27003:aaaaaabcdefghiKKKKKKKKKKKKfoobarKKKKKKKKKKKKKKKKK
27003:aaaaaabcdefghiiiiiiiiiiiifoobarKKKKKKKKKKKKKK
27004:abcdefghijklmnofoobarabcdefghijklmnopqfoobarfoobar
27004:abcdefghijklmnfoobarfoobarabcdefghijklfoobar
27004:aaabcdefghikl__fffffoobarABCDEFGHIKLM_____foobar
27004:aaaaaacdefghiklmnopfoobarzzzzzzzzzzfoobar
27005: %foobfoobar d foobar______EEEEfoobar BEEfoobar
27005:ddddddddddededefoobar foobar foobar
27005: _foobar1111115WWWfoobarzzzzzzzzzzzzz
27006:0123012301230123012301230123foobar012301230123
27006:00000000000000A0cdDEEEEE00foobar0000
27006:00000000AABaaEEEEEfoobarfoobar
27006:00000000ddddDEEEEEEEfoobar
27007:c\xa1CCCCC[cdCAKDDDd\xc7vbEaaCC

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,245 @@
15900="foobarbar": 9
15901="foobarbar": 6,9
15902="foobarteabartea": 9,15
15903="fo": 2
15903="foobarfo": 2,8
15903="foobarteafo": 2,9,11
15904="fo": 2
15904="foobarfo": 8
15904="foobarteafo": 9,11
15904="foo3baR\xee\xdbtea": 12
15905="foobarteacofeee": 6,15
15905="footeabarcofeee": 9,15
15906="foogaz": 6
15906="fofoogaz": 8
15906="fobargaz": 8
15906="bafoogaz": 8
15906="foobarfgazfobarfoobarbbarbabargbargabar": 10
15907="foobarfgazfobarfoobarbbarbabargbargabar": 6,10,15,21,25,30,34,39
15908="foobartea": 9
15908="foobgaztea": 10
15908="foobagaztea": 11
15908="fooabartea": 10
15908="fooabgaztea": 11
15908="fooabagaztea": 12
15908="fooabagabartea": 14
15909="fooabagabartea": 14
15909="fooabagabagazaeteaet": 18
15909="fooabagaba gazbagazaeteaet": 24
15910="fooabagabartea": 14
15910="fooabagabagazaeteaet": 16,18,20
15910="fooabagaba gazbagazaeteaet": 22,24,26
15911="foobafoobartea":
15912="foobafoobarteaet":
15913="p;;:": 4
15913="p;;:_:": 4,6
15913="p;;;;:_:": 6,8
15913="p;;ab:_:": 6,8
15913="p;;ab_:_:": 7,9
15913="p;;ab_x:": 8
15913="p;;ab_xj:": 9
15913="p;p;;ab_xj:":
15913="aap;;ab_xj:":
15914="p;;:": 4
15914="p;;:_:": 4,6
15914="p;;;;:_:": 6,8
15914="p;;ab:_:": 6,8
15914="p;;ab_:_:": 7,9
15914="p;;ab_x:": 8
15914="p;;ab_xj:": 9
15914="p;p;;ab_xj:": 11
15914="aap;;ab_xj:": 11
15915="p;;:": 4
15915="p;;:_:": 4,6
15915="p;;;;:_:": 6,8
15915="p;;ab:_:": 6,8
15915="p;;ab_:_:": 7,9
15915="p;;ab_x:": 8
15915="p;;ab_xj:": 9
15915="p;p;;ab_xj:": 11
15915="aap;;ab_xj:": 11
15916="AAaZ": 4
15916="AAbZ": 4
15916="AAcZ":
15916="AAaXX": 5
15916="AAbXX":
15916="AAcXX":
15916="AAaYY":
15916="AAbYY": 5
15916="AAcYY":
15916="AAzaZ": 5
15916="AAzbZ": 5
15916="AAzcZ":
15916="AAzazXX": 7
15916="AAzbzXX":
15916="AAzczXX":
15916="AAzazYY":
15916="AAzbzYY": 7
15916="AAzczYY":
15916="AAzazZ": 6
15916="AAzbzZ": 6
15916="AAzczZ":
15916="AAzazXX": 7
15916="AAzbzXX":
15916="AAzczXX":
15916="AAzazYY":
15916="AAzbzYY": 7
15916="AAzczYY":
15916="AAaZZXXX": 4,5,7,8
15916="AAbZZYYY": 4,5,7,8
15916="AAabZZXXXYYY": 5,6,8,9,11,12
15916="AAbaZZXXXYYY": 5,6,8,9,11,12
15916="AAa_bZZXXXYYY": 6,7,9,10,12,13
15916="AAb_aZZXXXYYY": 6,7,9,10,12,13
15916="AAa_b_ZZXX_XYYY": 7,8,10,14,15
15916="AAb_a_ZZXX_XYYY": 7,8,10,14,15
15917="AAaZ": 4
15917="AAbZ": 4
15917="AAcZ":
15917="AAaXX": 5
15917="AAbXX":
15917="AAcXX":
15917="AAaYY":
15917="AAbYY":
15917="AAcYY":
15917="AAzaZ": 5
15917="AAzbZ": 5
15917="AAzcZ":
15917="AAzazXX": 7
15917="AAzbzXX":
15917="AAzczXX":
15917="AAzazYY":
15917="AAzbzYY":
15917="AAzczYY":
15917="AAzazZ": 6
15917="AAzbzZ": 6
15917="AAzczZ":
15917="AAzazXX": 7
15917="AAzbzXX":
15917="AAzczXX":
15917="AAzazYY":
15917="AAzbzYY":
15917="AAzczYY":
15917="AAaZZXXX": 4,5,7,8
15917="AAbZZYYY": 4,5
15917="AAabZZXXXYYY": 5,6,8,9
15917="AAbaZZXXXYYY": 5,6,8,9
15917="AAa_bZZXXXYYY": 6,7,9,10
15917="AAb_aZZXXXYYY": 6,7,9,10
15917="AAa_b_ZZXX_XYYY": 7,8,10
15917="AAb_a_ZZXX_XYYY": 7,8,10
15918="ppp;;:":
15918="ppp;;:_:":
15918="ppp;;;;:_:":
15918="ppp;;ab:_:":
15918="ppp;;ab_:_:":
15918="ppp;;ab_x:":
15918="ppp;;ab_xj:":
15918="p;ppp;;ab_xj:":
15918="aappp;;ab_xj:":
15919="ppp;;:":
15919="ppp;;:_:":
15919="ppp;;;;:_:":
15919="ppp;;ab:_:":
15919="ppp;;ab_:_:":
15919="ppp;;ab_x:":
15919="ppp;;ab_xj:":
15919="p;ppp;;ab_xj:":
15919="aappp;;ab_xj:":
15920="ppp;;:":
15920="ppp;;:_:":
15920="ppp;;;;:_:":
15920="ppp;;ab:_:":
15920="ppp;;ab_:_:":
15920="ppp;;ab_x:":
15920="ppp;;ab_xj:":
15920="p;ppp;;ab_xj:":
15920="aappp;;ab_xj:":
15921="AAAAAaZ": 7
15921="AAAAAbZ": 7
15921="AAAAAcZ":
15921="AAAAAaXX": 8
15921="AAAAAbXX":
15921="AAAAAcXX":
15921="AAAAAaYY":
15921="AAAAAbYY": 8
15921="AAAAAcYY":
15921="AAAAAzaZ": 8
15921="AAAAAzbZ": 8
15921="AAAAAzcZ":
15921="AAAAAzazXX": 10
15921="AAAAAzbzXX":
15921="AAAAAzczXX":
15921="AAAAAzazYY":
15921="AAAAAzbzYY": 10
15921="AAAAAzczYY":
15921="AAAAAzazZ": 9
15921="AAAAAzbzZ": 9
15921="AAAAAzczZ":
15921="AAAAAzazXX": 10
15921="AAAAAzbzXX":
15921="AAAAAzczXX":
15921="AAAAAzazYY":
15921="AAAAAzbzYY": 10
15921="AAAAAzczYY":
15921="AAAAAaZZXXX": 7,8,10,11
15921="AAAAAbZZYYY": 7,8,10,11
15921="AAAAAabZZXXXYYY": 8,9,11,12,14,15
15921="AAAAAbaZZXXXYYY": 8,9,11,12,14,15
15921="AAAAAa_bZZXXXYYY": 9,10,12,13,15,16
15921="AAAAAb_aZZXXXYYY": 9,10,12,13,15,16
15921="AAAAAa_b_ZZXX_XYYY": 10,11,13,17,18
15921="AAAAAb_a_ZZXX_XYYY": 10,11,13,17,18
15922="AAAAAaZ":
15922="AAAAAbZ":
15922="AAAAAcZ":
15922="AAAAAaXX":
15922="AAAAAbXX":
15922="AAAAAcXX":
15922="AAAAAaYY":
15922="AAAAAbYY":
15922="AAAAAcYY":
15922="AAAAAzaZ":
15922="AAAAAzbZ":
15922="AAAAAzcZ":
15922="AAAAAzazXX":
15922="AAAAAzbzXX":
15922="AAAAAzczXX":
15922="AAAAAzazYY":
15922="AAAAAzbzYY":
15922="AAAAAzczYY":
15922="AAAAAzazZ":
15922="AAAAAzbzZ":
15922="AAAAAzczZ":
15922="AAAAAzazXX":
15922="AAAAAzbzXX":
15922="AAAAAzczXX":
15922="AAAAAzazYY":
15922="AAAAAzbzYY":
15922="AAAAAzczYY":
15922="AAAAAaZZXXX":
15922="AAAAAbZZYYY":
15922="AAAAAabZZXXXYYY":
15922="AAAAAbaZZXXXYYY":
15922="AAAAAa_bZZXXXYYY":
15922="AAAAAb_aZZXXXYYY":
15922="AAAAAa_b_ZZXX_XYYY":
15922="AAAAAb_a_ZZXX_XYYY":
15923="bbbbkbj_": 2,3,4,5,6,7
15924:literal123456789
15924:literaliteral1
15924:literal1literal123456789
15924:literaliteraliteral1
15925:literal123456789
15925:literaliteral1
15925:literal1literal123456789
15925:literaliteraliteral1
15926:literal123456789
15926:literaliteral1
15926:literal1literal123456789
15926:literaliteraliteral1
15927:literal123456789
15927:literaliteral1
15927:literal1literal123456789
15927:literaliteraliteral1
15928:\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe5\x9b\xbb\xee\x80\x80\xee\x80\x80\xee\x80\x80\xec\x88\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xe2\x8b\xba\xee\x80\x80\xe9\xa8\x8e\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80\xee\x80\x80b\xe0\xb9\x82a8a

View File

@@ -0,0 +1,51 @@
24000="":
24000="a": 1
24000="C": 1
24000="\x00": 1
24000="\xff": 1
24000="abcdef": 1,2,3,4,5,6
24001="\x07": 1
24002="\x1a": 1
24002="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 27
24003=";": 1
24003="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 60
24004="{": 1
24004="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 124
24005="\x01": 1
24005="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2
24006="p": 1
24006="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 113
24007="\x1b": 1
24008="\x0c": 1
24009="\n": 1
24010="\r": 1
24011="\t": 1
24012="\xdc\xdc\x00\xff": 4
24015="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2
24016="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 27
24017="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 60
24018="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 124
24019="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2
24020="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 113
24021="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff": 2
24022="\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\x5c]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff":
24022="\x1cn": 2
24023="8 literal 9": 11
24024="bignum 1111111111":
24024="bignum I1111111": 15
24025="bignum 2147483639":
24025="bignum \x8c7483639": 15
24026="bignum \x018888": 12
24027="bignum \n8888": 12
24028="bignum S8888": 12
24029="bignum \xff8888": 12
24030:0
24031:0
24032:\n
24033:\n
24034:\n0
24034:P
24035:\n0
24035:P
24036:\xff
24037:80

View File

@@ -0,0 +1,921 @@
15500="Anotbobnotbobnotboo": 7,13
15500="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15500="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15500="notbobnotbobnotboo": 6,12
15500="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15501="Anotbobnotbobnotboo":
15501="Anotbobnotbobnotnotbarnotbobnotbar":
15501="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6
15501="notbobnotbobnotboo": 6
15501="notbobnotbobnotnotbarnotbobnotbar": 6
15502="Anotbobnotbobnotboo":
15502="Anotbobnotbobnotnotbarnotbobnotbar":
15502="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6
15502="notbobnotbobnotboo": 6
15502="notbobnotbobnotnotbarnotbobnotbar": 6
15503="Anotbobnotbobnotboo": 7,13
15503="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15503="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15503="notbobnotbobnotboo": 12
15503="notbobnotbobnotnotbarnotbobnotbar": 12,27
15504="Anotbobnotbobnotboo": 7
15504="Anotbobnotbobnotnotbarnotbobnotbar": 7
15504="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15504="notbobnotbobnotboo":
15504="notbobnotbobnotnotbarnotbobnotbar":
15505="Anotbobnotbobnotboo": 7
15505="Anotbobnotbobnotnotbarnotbobnotbar": 7
15505="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15505="notbobnotbobnotboo":
15505="notbobnotbobnotnotbarnotbobnotbar":
15506="Anotbobnotbobnotboo": 13
15506="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15506="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15506="notbobnotbobnotboo": 12
15506="notbobnotbobnotnotbarnotbobnotbar": 12,27
15507="Anotbobnotbobnotboo":
15507="Anotbobnotbobnotnotbarnotbobnotbar":
15507="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15507="notbobnotbobnotboo": 12
15507="notbobnotbobnotnotbarnotbobnotbar": 12
15508="Anotbobnotbobnotboo":
15508="Anotbobnotbobnotnotbarnotbobnotbar":
15508="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15508="notbobnotbobnotboo": 12
15508="notbobnotbobnotnotbarnotbobnotbar": 12
15509="Anotbobnotbobnotboo": 7,13
15509="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15509="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15509="notbobnotbobnotboo": 6,12
15509="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15510="Anotbobnotbobnotboo": 7,13
15510="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15510="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15510="notbobnotbobnotboo": 6,12
15510="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15511="Anotbobnotbobnotboo": 7,13
15511="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15511="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15511="notbobnotbobnotboo": 6,12
15511="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15512="Anotbobnotbobnotboo": 7,13
15512="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15512="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15512="notbobnotbobnotboo": 12
15512="notbobnotbobnotnotbarnotbobnotbar": 12,27
15513="Anotbobnotbobnotboo": 7,13
15513="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15513="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15513="notbobnotbobnotboo": 12
15513="notbobnotbobnotnotbarnotbobnotbar": 12,27
15514="Anotbobnotbobnotboo": 7,13
15514="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15514="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15514="notbobnotbobnotboo": 12
15514="notbobnotbobnotnotbarnotbobnotbar": 12,27
15515="Anotbobnotbobnotboo": 13
15515="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15515="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15515="notbobnotbobnotboo": 12
15515="notbobnotbobnotnotbarnotbobnotbar": 12,27
15516="Anotbobnotbobnotboo": 13
15516="Anotbobnotbobnotnotbarnotbobnotbar": 13
15516="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15516="notbobnotbobnotboo": 12
15516="notbobnotbobnotnotbarnotbobnotbar": 12
15517="Anotbobnotbobnotboo": 13
15517="Anotbobnotbobnotnotbarnotbobnotbar": 13
15517="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15517="notbobnotbobnotboo": 12
15517="notbobnotbobnotnotbarnotbobnotbar": 12
15518="Anotbobnotbobnotboo": 7,13
15518="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15518="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15518="notbobnotbobnotboo": 6,12
15518="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15519="Anotbobnotbobnotboo": 7,13
15519="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15519="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15519="notbobnotbobnotboo": 6,12
15519="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15520="Anotbobnotbobnotboo": 7,13
15520="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15520="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15520="notbobnotbobnotboo": 6,12
15520="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15521="Anotbobnotbobnotboo":
15521="Anotbobnotbobnotnotbarnotbobnotbar":
15521="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15521="notbobnotbobnotboo": 6,12
15521="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15522="Anotbobnotbobnotboo":
15522="Anotbobnotbobnotnotbarnotbobnotbar":
15522="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15522="notbobnotbobnotboo": 6,12
15522="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15523="Anotbobnotbobnotboo": 7,13
15523="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15523="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15523="notbobnotbobnotboo": 12
15523="notbobnotbobnotnotbarnotbobnotbar": 12,27
15524="Anotbobnotbobnotboo": 7,13
15524="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15524="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15524="notbobnotbobnotboo":
15524="notbobnotbobnotnotbarnotbobnotbar":
15525="Anotbobnotbobnotboo": 7,13
15525="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15525="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15525="notbobnotbobnotboo":
15525="notbobnotbobnotnotbarnotbobnotbar":
15526="Anotbobnotbobnotboo": 13
15526="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15526="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15526="notbobnotbobnotboo": 12
15526="notbobnotbobnotnotbarnotbobnotbar": 12,27
15527="Anotbobnotbobnotboo":
15527="Anotbobnotbobnotnotbarnotbobnotbar":
15527="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15527="notbobnotbobnotboo": 12
15527="notbobnotbobnotnotbarnotbobnotbar": 12,27
15528="Anotbobnotbobnotboo":
15528="Anotbobnotbobnotnotbarnotbobnotbar":
15528="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15528="notbobnotbobnotboo": 12
15528="notbobnotbobnotnotbarnotbobnotbar": 12,27
15529="Anotbobnotbobnotboo": 7,13
15529="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15529="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15529="notbobnotbobnotboo": 6,12
15529="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15530="Anotbobnotbobnotboo": 7,13
15530="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15530="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15530="notbobnotbobnotboo": 6,12
15530="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15531="Anotbobnotbobnotboo": 7,13
15531="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15531="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15531="notbobnotbobnotboo": 6,12
15531="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15532="Anotbobnotbobnotboo": 7,13
15532="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15532="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15532="notbobnotbobnotboo": 12
15532="notbobnotbobnotnotbarnotbobnotbar": 12,27
15533="Anotbobnotbobnotboo": 7,13
15533="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15533="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15533="notbobnotbobnotboo": 12
15533="notbobnotbobnotnotbarnotbobnotbar": 12,27
15534="Anotbobnotbobnotboo": 7,13
15534="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15534="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15534="notbobnotbobnotboo": 12
15534="notbobnotbobnotnotbarnotbobnotbar": 12,27
15535="Anotbobnotbobnotboo": 13
15535="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15535="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15535="notbobnotbobnotboo": 12
15535="notbobnotbobnotnotbarnotbobnotbar": 12,27
15536="Anotbobnotbobnotboo": 13
15536="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15536="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15536="notbobnotbobnotboo": 12
15536="notbobnotbobnotnotbarnotbobnotbar": 12,27
15537="Anotbobnotbobnotboo": 13
15537="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15537="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15537="notbobnotbobnotboo": 12
15537="notbobnotbobnotnotbarnotbobnotbar": 12,27
15538="Anotbobnotbobnotboo": 7,13
15538="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15538="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15538="notbobnotbobnotboo": 6,12
15538="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15539="Anotbobnotbobnotboo": 7,13
15539="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15539="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15539="notbobnotbobnotboo": 6,12
15539="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15540="Anotbobnotbobnotboo":
15540="Anotbobnotbobnotnotbarnotbobnotbar":
15540="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15540="notbobnotbobnotboo":
15540="notbobnotbobnotnotbarnotbobnotbar":
15541="Anotbobnotbobnotboo":
15541="Anotbobnotbobnotnotbarnotbobnotbar":
15541="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15541="notbobnotbobnotboo":
15541="notbobnotbobnotnotbarnotbobnotbar":
15542="Anotbobnotbobnotboo":
15542="Anotbobnotbobnotnotbarnotbobnotbar":
15542="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15542="notbobnotbobnotboo":
15542="notbobnotbobnotnotbarnotbobnotbar":
15543="Anotbobnotbobnotboo":
15543="Anotbobnotbobnotnotbarnotbobnotbar":
15543="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15543="notbobnotbobnotboo":
15543="notbobnotbobnotnotbarnotbobnotbar":
15544="Anotbobnotbobnotboo":
15544="Anotbobnotbobnotnotbarnotbobnotbar":
15544="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15544="notbobnotbobnotboo":
15544="notbobnotbobnotnotbarnotbobnotbar":
15545="Anotbobnotbobnotboo":
15545="Anotbobnotbobnotnotbarnotbobnotbar":
15545="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15545="notbobnotbobnotboo":
15545="notbobnotbobnotnotbarnotbobnotbar":
15546="Anotbobnotbobnotboo":
15546="Anotbobnotbobnotnotbarnotbobnotbar":
15546="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15546="notbobnotbobnotboo":
15546="notbobnotbobnotnotbarnotbobnotbar":
15547="Anotbobnotbobnotboo":
15547="Anotbobnotbobnotnotbarnotbobnotbar":
15547="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15547="notbobnotbobnotboo":
15547="notbobnotbobnotnotbarnotbobnotbar":
15548="Anotbobnotbobnotboo":
15548="Anotbobnotbobnotnotbarnotbobnotbar":
15548="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15548="notbobnotbobnotboo":
15548="notbobnotbobnotnotbarnotbobnotbar":
15549="Anotbobnotbobnotboo":
15549="Anotbobnotbobnotnotbarnotbobnotbar":
15549="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15549="notbobnotbobnotboo":
15549="notbobnotbobnotnotbarnotbobnotbar":
15550="Anotbobnotbobnotboo":
15550="Anotbobnotbobnotnotbarnotbobnotbar":
15550="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15550="notbobnotbobnotboo":
15550="notbobnotbobnotnotbarnotbobnotbar":
15551="Anotbobnotbobnotboo":
15551="Anotbobnotbobnotnotbarnotbobnotbar":
15551="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15551="notbobnotbobnotboo":
15551="notbobnotbobnotnotbarnotbobnotbar":
15552="Anotbobnotbobnotboo":
15552="Anotbobnotbobnotnotbarnotbobnotbar":
15552="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15552="notbobnotbobnotboo":
15552="notbobnotbobnotnotbarnotbobnotbar":
15553="Anotbobnotbobnotboo":
15553="Anotbobnotbobnotnotbarnotbobnotbar":
15553="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15553="notbobnotbobnotboo":
15553="notbobnotbobnotnotbarnotbobnotbar":
15554="Anotbobnotbobnotboo":
15554="Anotbobnotbobnotnotbarnotbobnotbar":
15554="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15554="notbobnotbobnotboo":
15554="notbobnotbobnotnotbarnotbobnotbar":
15555="Anotbobnotbobnotboo":
15555="Anotbobnotbobnotnotbarnotbobnotbar":
15555="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15555="notbobnotbobnotboo":
15555="notbobnotbobnotnotbarnotbobnotbar":
15556="Anotbobnotbobnotboo":
15556="Anotbobnotbobnotnotbarnotbobnotbar":
15556="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15556="notbobnotbobnotboo":
15556="notbobnotbobnotnotbarnotbobnotbar":
15557="Anotbobnotbobnotboo":
15557="Anotbobnotbobnotnotbarnotbobnotbar":
15557="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15557="notbobnotbobnotboo":
15557="notbobnotbobnotnotbarnotbobnotbar":
15558="Anotbobnotbobnotboo":
15558="Anotbobnotbobnotnotbarnotbobnotbar":
15558="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15558="notbobnotbobnotboo":
15558="notbobnotbobnotnotbarnotbobnotbar":
15559="Anotbobnotbobnotboo":
15559="Anotbobnotbobnotnotbarnotbobnotbar":
15559="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15559="notbobnotbobnotboo":
15559="notbobnotbobnotnotbarnotbobnotbar":
15560="Anotbobnotbobnotboo":
15560="Anotbobnotbobnotnotbarnotbobnotbar":
15560="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15560="notbobnotbobnotboo":
15560="notbobnotbobnotnotbarnotbobnotbar":
15561="Anotbobnotbobnotboo":
15561="Anotbobnotbobnotnotbarnotbobnotbar":
15561="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15561="notbobnotbobnotboo":
15561="notbobnotbobnotnotbarnotbobnotbar":
15562="Anotbobnotbobnotboo":
15562="Anotbobnotbobnotnotbarnotbobnotbar":
15562="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15562="notbobnotbobnotboo":
15562="notbobnotbobnotnotbarnotbobnotbar":
15563="Anotbobnotbobnotboo":
15563="Anotbobnotbobnotnotbarnotbobnotbar":
15563="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15563="notbobnotbobnotboo":
15563="notbobnotbobnotnotbarnotbobnotbar":
15564="Anotbobnotbobnotboo":
15564="Anotbobnotbobnotnotbarnotbobnotbar":
15564="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15564="notbobnotbobnotboo":
15564="notbobnotbobnotnotbarnotbobnotbar":
15565="Anotbobnotbobnotboo":
15565="Anotbobnotbobnotnotbarnotbobnotbar":
15565="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15565="notbobnotbobnotboo":
15565="notbobnotbobnotnotbarnotbobnotbar":
15565="_notbobnoA___bbar": 17
15566="Anotbobnotbobnotboo":
15566="Anotbobnotbobnotnotbarnotbobnotbar":
15566="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15566="notbobnotbobnotboo":
15566="notbobnotbobnotnotbarnotbobnotbar":
15567="Anotbobnotbobnotboo":
15567="Anotbobnotbobnotnotbarnotbobnotbar":
15567="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15567="notbobnotbobnotboo":
15567="notbobnotbobnotnotbarnotbobnotbar":
15568="Anotbobnotbobnotboo":
15568="Anotbobnotbobnotnotbarnotbobnotbar":
15568="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15568="notbobnotbobnotboo":
15568="notbobnotbobnotnotbarnotbobnotbar":
15569="Anotbobnotbobnotboo":
15569="Anotbobnotbobnotnotbarnotbobnotbar":
15569="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15569="notbobnotbobnotboo":
15569="notbobnotbobnotnotbarnotbobnotbar":
15570="Anotbobnotbobnotboo":
15570="Anotbobnotbobnotnotbarnotbobnotbar":
15570="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15570="notbobnotbobnotboo":
15570="notbobnotbobnotnotbarnotbobnotbar":
15571="Anotbobnotbobnotboo":
15571="Anotbobnotbobnotnotbarnotbobnotbar":
15571="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15571="notbobnotbobnotboo":
15571="notbobnotbobnotnotbarnotbobnotbar":
15572="Anotbobnotbobnotboo":
15572="Anotbobnotbobnotnotbarnotbobnotbar":
15572="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15572="notbobnotbobnotboo":
15572="notbobnotbobnotnotbarnotbobnotbar":
15573="Anotbobnotbobnotboo":
15573="Anotbobnotbobnotnotbarnotbobnotbar":
15573="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15573="notbobnotbobnotboo":
15573="notbobnotbobnotnotbarnotbobnotbar":
15574="Anotbobnotbobnotboo":
15574="Anotbobnotbobnotnotbarnotbobnotbar":
15574="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15574="notbobnotbobnotboo":
15574="notbobnotbobnotnotbarnotbobnotbar":
15575="Anotbobnotbobnotboo":
15575="Anotbobnotbobnotnotbarnotbobnotbar":
15575="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15575="notbobnotbobnotboo":
15575="notbobnotbobnotnotbarnotbobnotbar":
15576="Anotbobnotbobnotboo":
15576="Anotbobnotbobnotnotbarnotbobnotbar":
15576="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15576="notbobnotbobnotboo":
15576="notbobnotbobnotnotbarnotbobnotbar":
15577="Anotbobnotbobnotboo":
15577="Anotbobnotbobnotnotbarnotbobnotbar":
15577="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15577="notbobnotbobnotboo":
15577="notbobnotbobnotnotbarnotbobnotbar":
15578="Anotbobnotbobnotboo":
15578="Anotbobnotbobnotnotbarnotbobnotbar":
15578="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15578="notbobnotbobnotboo":
15578="notbobnotbobnotnotbarnotbobnotbar":
15579="Anotbobnotbobnotboo":
15579="Anotbobnotbobnotnotbarnotbobnotbar":
15579="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15579="notbobnotbobnotboo":
15579="notbobnotbobnotnotbarnotbobnotbar":
15580="Anotbobnotbobnotboo":
15580="Anotbobnotbobnotnotbarnotbobnotbar":
15580="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40
15580="notbobnotbobnotboo":
15580="notbobnotbobnotnotbarnotbobnotbar":
15581="Anotbobnotbobnotboo":
15581="Anotbobnotbobnotnotbarnotbobnotbar":
15581="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40
15581="notbobnotbobnotboo":
15581="notbobnotbobnotnotbarnotbobnotbar":
15582="Anotbobnotbobnotboo":
15582="Anotbobnotbobnotnotbarnotbobnotbar":
15582="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40
15582="notbobnotbobnotboo":
15582="notbobnotbobnotnotbarnotbobnotbar":
15583="Anotbobnotbobnotboo":
15583="Anotbobnotbobnotnotbarnotbobnotbar":
15583="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68
15583="notbobnotbobnotboo":
15583="notbobnotbobnotnotbarnotbobnotbar":
15584="Anotbobnotbobnotboo":
15584="Anotbobnotbobnotnotbarnotbobnotbar":
15584="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15584="notbobnotbobnotboo":
15584="notbobnotbobnotnotbarnotbobnotbar":
15585="Anotbobnotbobnotboo":
15585="Anotbobnotbobnotnotbarnotbobnotbar":
15585="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15585="notbobnotbobnotboo":
15585="notbobnotbobnotnotbarnotbobnotbar":
15586="Anotbobnotbobnotboo":
15586="Anotbobnotbobnotnotbarnotbobnotbar":
15586="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15586="notbobnotbobnotboo":
15586="notbobnotbobnotnotbarnotbobnotbar":
15587="Anotbobnotbobnotboo":
15587="Anotbobnotbobnotnotbarnotbobnotbar":
15587="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15587="notbobnotbobnotboo":
15587="notbobnotbobnotnotbarnotbobnotbar":
15588="Anotbobnotbobnotboo":
15588="Anotbobnotbobnotnotbarnotbobnotbar":
15588="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15588="notbobnotbobnotboo":
15588="notbobnotbobnotnotbarnotbobnotbar":
15589="Anotbobnotbobnotboo":
15589="Anotbobnotbobnotnotbarnotbobnotbar":
15589="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15589="notbobnotbobnotboo":
15589="notbobnotbobnotnotbarnotbobnotbar":
15590="Anotbobnotbobnotboo": 7,13
15590="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,22,28,34
15590="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,22,28,35,41,47,56,62,68
15590="notbobnotbobnotboo": 6,12
15590="notbobnotbobnotnotbarnotbobnotbar": 6,12,21,27,33
15600="Anotbobnotbobnotboo": 7,13
15600="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15600="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15600="notbobnotbobnotboo": 6,12
15600="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15601="Anotbobnotbobnotboo":
15601="Anotbobnotbobnotnotbarnotbobnotbar":
15601="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6
15601="notbobnotbobnotboo": 6
15601="notbobnotbobnotnotbarnotbobnotbar": 6
15602="Anotbobnotbobnotboo":
15602="Anotbobnotbobnotnotbarnotbobnotbar":
15602="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6
15602="notbobnotbobnotboo": 6
15602="notbobnotbobnotnotbarnotbobnotbar": 6
15603="Anotbobnotbobnotboo": 7,13
15603="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15603="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15603="notbobnotbobnotboo": 12
15603="notbobnotbobnotnotbarnotbobnotbar": 12,27
15604="Anotbobnotbobnotboo": 7
15604="Anotbobnotbobnotnotbarnotbobnotbar": 7
15604="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15604="notbobnotbobnotboo":
15604="notbobnotbobnotnotbarnotbobnotbar":
15605="Anotbobnotbobnotboo": 7
15605="Anotbobnotbobnotnotbarnotbobnotbar": 7
15605="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15605="notbobnotbobnotboo":
15605="notbobnotbobnotnotbarnotbobnotbar":
15606="Anotbobnotbobnotboo": 13
15606="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15606="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15606="notbobnotbobnotboo": 12
15606="notbobnotbobnotnotbarnotbobnotbar": 12,27
15607="Anotbobnotbobnotboo":
15607="Anotbobnotbobnotnotbarnotbobnotbar":
15607="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41
15607="notbobnotbobnotboo": 12
15607="notbobnotbobnotnotbarnotbobnotbar": 12
15608="Anotbobnotbobnotboo":
15608="Anotbobnotbobnotnotbarnotbobnotbar":
15608="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15608="notbobnotbobnotboo": 12
15608="notbobnotbobnotnotbarnotbobnotbar": 12
15609="Anotbobnotbobnotboo": 7,13
15609="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15609="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15609="notbobnotbobnotboo": 6,12
15609="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15610="Anotbobnotbobnotboo": 7,13
15610="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15610="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15610="notbobnotbobnotboo": 6,12
15610="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15611="Anotbobnotbobnotboo": 7,13
15611="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15611="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15611="notbobnotbobnotboo": 6,12
15611="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15612="Anotbobnotbobnotboo": 7,13
15612="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15612="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15612="notbobnotbobnotboo": 12
15612="notbobnotbobnotnotbarnotbobnotbar": 12,27
15613="Anotbobnotbobnotboo": 7,13
15613="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15613="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15613="notbobnotbobnotboo": 12
15613="notbobnotbobnotnotbarnotbobnotbar": 12,27
15613="-----\nnotbob": 12
15613="\nnotbob": 7
15614="Anotbobnotbobnotboo": 7,13
15614="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15614="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15614="notbobnotbobnotboo": 12
15614="notbobnotbobnotnotbarnotbobnotbar": 12,27
15615="Anotbobnotbobnotboo": 13
15615="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15615="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15615="notbobnotbobnotboo": 12
15615="notbobnotbobnotnotbarnotbobnotbar": 12,27
15616="Anotbobnotbobnotboo": 13
15616="Anotbobnotbobnotnotbarnotbobnotbar": 13
15616="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41
15616="notbobnotbobnotboo": 12
15616="notbobnotbobnotnotbarnotbobnotbar": 12
15617="Anotbobnotbobnotboo": 13
15617="Anotbobnotbobnotnotbarnotbobnotbar": 13
15617="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12
15617="notbobnotbobnotboo": 12
15617="notbobnotbobnotnotbarnotbobnotbar": 12
15618="Anotbobnotbobnotboo": 7,13
15618="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15618="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15618="notbobnotbobnotboo": 6,12
15618="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15619="Anotbobnotbobnotboo": 7,13
15619="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15619="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15619="notbobnotbobnotboo": 6,12
15619="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15619="\nnotbob": 7
15620="Anotbobnotbobnotboo": 7,13
15620="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15620="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15620="notbobnotbobnotboo": 6,12
15620="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15621="Anotbobnotbobnotboo":
15621="Anotbobnotbobnotnotbarnotbobnotbar":
15621="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15621="notbobnotbobnotboo": 6,12
15621="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15622="Anotbobnotbobnotboo":
15622="Anotbobnotbobnotnotbarnotbobnotbar":
15622="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15622="notbobnotbobnotboo": 6,12
15622="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15623="Anotbobnotbobnotboo": 7,13
15623="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15623="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15623="notbobnotbobnotboo": 12
15623="notbobnotbobnotnotbarnotbobnotbar": 12,27
15624="Anotbobnotbobnotboo": 7,13
15624="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15624="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15624="notbobnotbobnotboo":
15624="notbobnotbobnotnotbarnotbobnotbar":
15625="Anotbobnotbobnotboo": 7,13
15625="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15625="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15625="notbobnotbobnotboo":
15625="notbobnotbobnotnotbarnotbobnotbar":
15626="Anotbobnotbobnotboo": 13
15626="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15626="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15626="notbobnotbobnotboo": 12
15626="notbobnotbobnotnotbarnotbobnotbar": 12,27
15627="Anotbobnotbobnotboo":
15627="Anotbobnotbobnotnotbarnotbobnotbar":
15627="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15627="notbobnotbobnotboo": 12
15627="notbobnotbobnotnotbarnotbobnotbar": 12,27
15628="Anotbobnotbobnotboo":
15628="Anotbobnotbobnotnotbarnotbobnotbar":
15628="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15628="notbobnotbobnotboo": 12
15628="notbobnotbobnotnotbarnotbobnotbar": 12,27
15629="Anotbobnotbobnotboo": 7,13
15629="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15629="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15629="notbobnotbobnotboo": 6,12
15629="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15630="Anotbobnotbobnotboo": 7,13
15630="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15630="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15630="notbobnotbobnotboo": 6,12
15630="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15631="Anotbobnotbobnotboo": 7,13
15631="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15631="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15631="notbobnotbobnotboo": 6,12
15631="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15632="Anotbobnotbobnotboo": 7,13
15632="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15632="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15632="notbobnotbobnotboo": 12
15632="notbobnotbobnotnotbarnotbobnotbar": 12,27
15633="Anotbobnotbobnotboo": 7,13
15633="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15633="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15633="notbobnotbobnotboo": 12
15633="notbobnotbobnotnotbarnotbobnotbar": 12,27
15634="Anotbobnotbobnotboo": 7,13
15634="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15634="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15634="notbobnotbobnotboo": 12
15634="notbobnotbobnotnotbarnotbobnotbar": 12,27
15635="Anotbobnotbobnotboo": 13
15635="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15635="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15635="notbobnotbobnotboo": 12
15635="notbobnotbobnotnotbarnotbobnotbar": 12,27
15636="Anotbobnotbobnotboo": 13
15636="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15636="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15636="notbobnotbobnotboo": 12
15636="notbobnotbobnotnotbarnotbobnotbar": 12,27
15637="Anotbobnotbobnotboo": 13
15637="Anotbobnotbobnotnotbarnotbobnotbar": 13,28
15637="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 12,28,41,47,62
15637="notbobnotbobnotboo": 12
15637="notbobnotbobnotnotbarnotbobnotbar": 12,27
15638="Anotbobnotbobnotboo": 7,13
15638="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15638="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15638="notbobnotbobnotboo": 6,12
15638="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15639="Anotbobnotbobnotboo": 7,13
15639="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,28
15639="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,28,41,47,62
15639="notbobnotbobnotboo": 6,12
15639="notbobnotbobnotnotbarnotbobnotbar": 6,12,27
15640="Anotbobnotbobnotboo":
15640="Anotbobnotbobnotnotbarnotbobnotbar":
15640="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15640="notbobnotbobnotboo":
15640="notbobnotbobnotnotbarnotbobnotbar":
15641="Anotbobnotbobnotboo":
15641="Anotbobnotbobnotnotbarnotbobnotbar":
15641="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15641="notbobnotbobnotboo":
15641="notbobnotbobnotnotbarnotbobnotbar":
15642="Anotbobnotbobnotboo":
15642="Anotbobnotbobnotnotbarnotbobnotbar":
15642="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15642="notbobnotbobnotboo":
15642="notbobnotbobnotnotbarnotbobnotbar":
15643="Anotbobnotbobnotboo":
15643="Anotbobnotbobnotnotbarnotbobnotbar":
15643="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15643="notbobnotbobnotboo":
15643="notbobnotbobnotnotbarnotbobnotbar":
15644="Anotbobnotbobnotboo":
15644="Anotbobnotbobnotnotbarnotbobnotbar":
15644="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15644="notbobnotbobnotboo":
15644="notbobnotbobnotnotbarnotbobnotbar":
15645="Anotbobnotbobnotboo":
15645="Anotbobnotbobnotnotbarnotbobnotbar":
15645="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15645="notbobnotbobnotboo":
15645="notbobnotbobnotnotbarnotbobnotbar":
15646="Anotbobnotbobnotboo":
15646="Anotbobnotbobnotnotbarnotbobnotbar":
15646="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15646="notbobnotbobnotboo":
15646="notbobnotbobnotnotbarnotbobnotbar":
15647="Anotbobnotbobnotboo":
15647="Anotbobnotbobnotnotbarnotbobnotbar":
15647="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15647="notbobnotbobnotboo":
15647="notbobnotbobnotnotbarnotbobnotbar":
15648="Anotbobnotbobnotboo":
15648="Anotbobnotbobnotnotbarnotbobnotbar":
15648="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15648="notbobnotbobnotboo":
15648="notbobnotbobnotnotbarnotbobnotbar":
15649="Anotbobnotbobnotboo":
15649="Anotbobnotbobnotnotbarnotbobnotbar":
15649="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15649="notbobnotbobnotboo":
15649="notbobnotbobnotnotbarnotbobnotbar":
15650="Anotbobnotbobnotboo":
15650="Anotbobnotbobnotnotbarnotbobnotbar":
15650="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15650="notbobnotbobnotboo":
15650="notbobnotbobnotnotbarnotbobnotbar":
15651="Anotbobnotbobnotboo":
15651="Anotbobnotbobnotnotbarnotbobnotbar":
15651="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15651="notbobnotbobnotboo":
15651="notbobnotbobnotnotbarnotbobnotbar":
15652="Anotbobnotbobnotboo":
15652="Anotbobnotbobnotnotbarnotbobnotbar":
15652="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15652="notbobnotbobnotboo":
15652="notbobnotbobnotnotbarnotbobnotbar":
15653="Anotbobnotbobnotboo":
15653="Anotbobnotbobnotnotbarnotbobnotbar":
15653="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15653="notbobnotbobnotboo":
15653="notbobnotbobnotnotbarnotbobnotbar":
15654="Anotbobnotbobnotboo":
15654="Anotbobnotbobnotnotbarnotbobnotbar":
15654="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15654="notbobnotbobnotboo":
15654="notbobnotbobnotnotbarnotbobnotbar":
15655="Anotbobnotbobnotboo":
15655="Anotbobnotbobnotnotbarnotbobnotbar":
15655="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15655="notbobnotbobnotboo":
15655="notbobnotbobnotnotbarnotbobnotbar":
15656="Anotbobnotbobnotboo":
15656="Anotbobnotbobnotnotbarnotbobnotbar":
15656="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15656="notbobnotbobnotboo":
15656="notbobnotbobnotnotbarnotbobnotbar":
15657="Anotbobnotbobnotboo":
15657="Anotbobnotbobnotnotbarnotbobnotbar":
15657="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15657="notbobnotbobnotboo":
15657="notbobnotbobnotnotbarnotbobnotbar":
15658="Anotbobnotbobnotboo":
15658="Anotbobnotbobnotnotbarnotbobnotbar":
15658="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15658="notbobnotbobnotboo":
15658="notbobnotbobnotnotbarnotbobnotbar":
15659="Anotbobnotbobnotboo":
15659="Anotbobnotbobnotnotbarnotbobnotbar":
15659="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15659="notbobnotbobnotboo":
15659="notbobnotbobnotnotbarnotbobnotbar":
15660="Anotbobnotbobnotboo":
15660="Anotbobnotbobnotnotbarnotbobnotbar":
15660="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15660="notbobnotbobnotboo":
15660="notbobnotbobnotnotbarnotbobnotbar":
15661="Anotbobnotbobnotboo":
15661="Anotbobnotbobnotnotbarnotbobnotbar":
15661="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15661="notbobnotbobnotboo":
15661="notbobnotbobnotnotbarnotbobnotbar":
15662="Anotbobnotbobnotboo":
15662="Anotbobnotbobnotnotbarnotbobnotbar":
15662="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15662="notbobnotbobnotboo":
15662="notbobnotbobnotnotbarnotbobnotbar":
15663="Anotbobnotbobnotboo":
15663="Anotbobnotbobnotnotbarnotbobnotbar":
15663="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15663="notbobnotbobnotboo":
15663="notbobnotbobnotnotbarnotbobnotbar":
15664="Anotbobnotbobnotboo":
15664="Anotbobnotbobnotnotbarnotbobnotbar":
15664="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15664="notbobnotbobnotboo":
15664="notbobnotbobnotnotbarnotbobnotbar":
15665="Anotbobnotbobnotboo":
15665="Anotbobnotbobnotnotbarnotbobnotbar":
15665="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15665="notbobnotbobnotboo":
15665="notbobnotbobnotnotbarnotbobnotbar":
15666="Anotbobnotbobnotboo":
15666="Anotbobnotbobnotnotbarnotbobnotbar":
15666="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15666="notbobnotbobnotboo":
15666="notbobnotbobnotnotbarnotbobnotbar":
15667="Anotbobnotbobnotboo":
15667="Anotbobnotbobnotnotbarnotbobnotbar":
15667="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15667="notbobnotbobnotboo":
15667="notbobnotbobnotnotbarnotbobnotbar":
15668="Anotbobnotbobnotboo":
15668="Anotbobnotbobnotnotbarnotbobnotbar":
15668="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15668="notbobnotbobnotboo":
15668="notbobnotbobnotnotbarnotbobnotbar":
15669="Anotbobnotbobnotboo":
15669="Anotbobnotbobnotnotbarnotbobnotbar":
15669="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15669="notbobnotbobnotboo":
15669="notbobnotbobnotnotbarnotbobnotbar":
15670="Anotbobnotbobnotboo":
15670="Anotbobnotbobnotnotbarnotbobnotbar":
15670="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15670="notbobnotbobnotboo":
15670="notbobnotbobnotnotbarnotbobnotbar":
15671="Anotbobnotbobnotboo":
15671="Anotbobnotbobnotnotbarnotbobnotbar":
15671="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15671="notbobnotbobnotboo":
15671="notbobnotbobnotnotbarnotbobnotbar":
15672="Anotbobnotbobnotboo":
15672="Anotbobnotbobnotnotbarnotbobnotbar":
15672="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15672="notbobnotbobnotboo":
15672="notbobnotbobnotnotbarnotbobnotbar":
15673="Anotbobnotbobnotboo":
15673="Anotbobnotbobnotnotbarnotbobnotbar":
15673="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15673="notbobnotbobnotboo":
15673="notbobnotbobnotnotbarnotbobnotbar":
15674="Anotbobnotbobnotboo":
15674="Anotbobnotbobnotnotbarnotbobnotbar":
15674="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15674="notbobnotbobnotboo":
15674="notbobnotbobnotnotbarnotbobnotbar":
15675="Anotbobnotbobnotboo":
15675="Anotbobnotbobnotnotbarnotbobnotbar":
15675="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15675="notbobnotbobnotboo":
15675="notbobnotbobnotnotbarnotbobnotbar":
15675:----notbobnoQ--bar
15675:-----notbobnoQ-bar
15675:---------notbobnoQbar
15675:---------notbobnotbobnoQbar
15676="Anotbobnotbobnotboo":
15676="Anotbobnotbobnotnotbarnotbobnotbar":
15676="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15676="notbobnotbobnotboo":
15676="notbobnotbobnotnotbarnotbobnotbar":
15677="Anotbobnotbobnotboo":
15677="Anotbobnotbobnotnotbarnotbobnotbar":
15677="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15677="notbobnotbobnotboo":
15677="notbobnotbobnotnotbarnotbobnotbar":
15678="Anotbobnotbobnotboo":
15678="Anotbobnotbobnotnotbarnotbobnotbar":
15678="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15678="notbobnotbobnotboo":
15678="notbobnotbobnotnotbarnotbobnotbar":
15679="Anotbobnotbobnotboo":
15679="Anotbobnotbobnotnotbarnotbobnotbar":
15679="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15679="notbobnotbobnotboo":
15679="notbobnotbobnotnotbarnotbobnotbar":
15680="Anotbobnotbobnotboo":
15680="Anotbobnotbobnotnotbarnotbobnotbar":
15680="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,56
15680="notbobnotbobnotboo":
15680="notbobnotbobnotnotbarnotbobnotbar":
15680="\n\r\xd5\xe7E<\xd6\xa6\xc4\xd4\x19fl\xe6\xae\xf1\x9f\x96\x9b\x18\x84\x99\x8ar4\x00\xcf*\xe9Fc\x87\xd2:p\x97v\xc6\xbd\xbb\x1b": 40,41
15680="\nV\xaf \x99.<\x918\xc0\xed\xa2\xcf\xf1aA\xaf6{\x8c?\n$\x9c@K\x8d\x9b\xaeHU/\x9e\x04O72\x8b\xc8kK": 40,41
15681="Anotbobnotbobnotboo":
15681="Anotbobnotbobnotnotbarnotbobnotbar":
15681="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,56
15681="notbobnotbobnotboo":
15681="notbobnotbobnotnotbarnotbobnotbar":
15681="\ny\xfe\x9c\x84\xef\xdar\x19\xc4\xb3\x96\x9c\xca7f\xed\xe1\x88~\xf2\"\x18MH\x85\xb8\xe7)xn\xfd\xf1\xec\x9a\xf6\xdd\xf4\xe8v\xb9": 40,41
15682="Anotbobnotbobnotboo":
15682="Anotbobnotbobnotnotbarnotbobnotbar":
15682="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40
15682="notbobnotbobnotboo":
15682="notbobnotbobnotnotbarnotbobnotbar":
15683="Anotbobnotbobnotboo":
15683="Anotbobnotbobnotnotbarnotbobnotbar":
15683="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68
15683="notbobnotbobnotboo":
15683="notbobnotbobnotnotbarnotbobnotbar":
15684="Anotbobnotbobnotboo":
15684="Anotbobnotbobnotnotbarnotbobnotbar":
15684="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15684="notbobnotbobnotboo":
15684="notbobnotbobnotnotbarnotbobnotbar":
15685="Anotbobnotbobnotboo":
15685="Anotbobnotbobnotnotbarnotbobnotbar":
15685="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15685="notbobnotbobnotboo":
15685="notbobnotbobnotnotbarnotbobnotbar":
15686="Anotbobnotbobnotboo":
15686="Anotbobnotbobnotnotbarnotbobnotbar":
15686="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15686="notbobnotbobnotboo":
15686="notbobnotbobnotnotbarnotbobnotbar":
15687="Anotbobnotbobnotboo":
15687="Anotbobnotbobnotnotbarnotbobnotbar":
15687="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15687="notbobnotbobnotboo":
15687="notbobnotbobnotnotbarnotbobnotbar":
15688="Anotbobnotbobnotboo":
15688="Anotbobnotbobnotnotbarnotbobnotbar":
15688="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15688="notbobnotbobnotboo":
15688="notbobnotbobnotnotbarnotbobnotbar":
15689="Anotbobnotbobnotboo":
15689="Anotbobnotbobnotnotbarnotbobnotbar":
15689="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar":
15689="notbobnotbobnotboo":
15689="notbobnotbobnotnotbarnotbobnotbar":
15690="Anotbobnotbobnotboo": 7,13
15690="Anotbobnotbobnotnotbarnotbobnotbar": 7,13,22,28,34
15690="notbobnotbobnot\nnotbarnotbob\nnotbarnotbobnotbobnotnotbarnotbobnotbar": 6,12,22,28,35,41,47,56,62,68
15690="notbobnotbobnotboo": 6,12
15690="notbobnotbobnotnotbarnotbobnotbar": 6,12,21,27,33

View File

@@ -0,0 +1,79 @@
24500="foo bar": 7
24500="foo\nbar": 7
24500="foobar": 6
24501="foo bar baz": 11
24501="foo bar\nbaz": 11
24501="foo\nbar baz":
24501="foobar\x01baz": 10
24502="foo bar": 7
24502="foo\nbar":
24502="foobar": 6
24503="foo bar": 7
24503="foo\nbar":
24503="foobar": 6
24504="foo bar baz": 11
24504="foo bar\nbaz": 11
24504="foo\nbar baz":
24504="foo\nbar\nbaz":
24504="foo__bar\x01c___xbaz": 17
24504="foobarbaz": 9
24600="FOOBAR": 6
24600="fOoBaR": 6
24600="fooBAR": 6
24600="foobar": 6
24601="FOOBAR": 6
24601="fOoBaR": 6
24601="fooBAR": 6
24601="foobar": 6
24602="FOOBAR":
24602="fOoBaR":
24602="fooBAR":
24602="foobar": 6
24603="FOOBAR":
24603="FOObar": 6
24603="foobar": 6
24604="FOOBAR":
24604="fooBAR": 6
24604="foobar": 6
24605="FOOBAR":
24605="FOObar": 6
24605="foobar": 6
24700="__foobar": 8
24700="firstline\nfoobar\nfoobar": 16,23
24700="foobar": 6
24701="__foobar": 8
24701="firstline\nfoobar\nfoobar": 23
24701="foobar": 6
24800="foo bar":
24800="foobar": 6
24801="foo bar baz":
24801="foobar baz": 10
24801="foobarbaz":
24900="firstline\nfoobarbaz": 19
24900="foo\nbar\nbaz": 11
24900="foobarbaz": 9
24901="ABBREVIATION": 6,12
24901="aBBr":
24901="abbrev": 6
24901="abbreviation": 6,12
24902="foo\nBAR": 7
24902="foo\nbaR": 7
24902="foo_bar": 7
24903="foo\nBAR":
24903="foo\nbaR":
24903="foo_bar": 7
24904="fooBaRbaz": 9
24904="foobarBAZ":
24905="nestedCASELESScaSEfulCASELESSliteral":
24905="nestedCASELESScasefulCASELESSliteral": 36
24905="nestedcaselesscasefulcaselessliteral": 36
24906="ab aB ac aC": 2,5,8,11
24907="hatstand teakettle HATSTAND TEAKETTLE Hatstand Teakettle": 8,18,27,37,46,56
24908="foo BAR baz bing": 16
24908="foo BAR\nbaz bing":
24908="foo bar baz bing": 16
24908="foo bar\nbaz bing":
24908="foo\nBAR baz\nbing": 16
24908="foo\nBAR\nbaz\nbing":
24908="foo\nbar baz\nbing": 16
24908="foo\nbar\nbaz\nbing":

View File

@@ -0,0 +1,66 @@
9000="abc":
9000="abcdef":
9000="abcxxx": 6
9000="abcyyyy": 7
9000="defxxx": 6
9000="defyyyy": 7
9000="abcdefxxxyyy": 9
9001="abc":
9001="abcdef":
9001="abcxxx": 6
9001="abcyyyy": 7
9001="defxxx": 6
9001="defyyyy": 7
9001="abcdefxxxyyy":
9001="qabc":
9001="qabcdef":
9001="qabcxxx":
9001="qabcyyyy":
9001="qdefxxx":
9001="qdefyyyy":
9001="qabcdefxxxyyy":
9001="abcabc":
9001="abcabcdef":
9001="abcabcxxx":
9001="abcabcyyyy":
9001="abcdefxxx":
9001="abcdefyyyy":
9001="abdabcdefxxxyyy":
9002="anchoredXXX": 11
9002="NOTyanchoredXXX":
9002="anchoredYYY": 11
9002="NOTanchoredYYY":
9002="floatingXXX": 11
9002="floatingYYY": 11
9002="XXXXXfloatingXXX": 16
9002="XXXXXfloatingYYY": 16
9005="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 40
9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 41
9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 42
9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 43
9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 44
9005=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 167
9005="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60
9006="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 48
9006=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49
9006="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 48,49,50,51,52,53,54,55,56,57,58,59,60
9007="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49
9007=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50
9007="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 49,50,51,52,53,54,55,56,57,58,59,60
9008="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50
9008=" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 51
9008="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 50,51,52,53,54,55,56,57,58,59,60
9009="qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1000
9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1034
9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq": 1034,1035,1036
9009=" qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq_qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq":
9010="coagulateshyperinnervationagitationreassuranceexchangeability": 61
9010="coagulateshyperinnervationagitationreassuranceexchangeabilitycoagulateshyperinnervationagitationreassuranceexchangeability": 61,122
9010=" coagulateshyperinnervationagitationreassuranceexchangeability": 84
9010="_oagulateshyperinnervationagitationreassuranceexchangeability":
9010="coagulateshyperinnervationagitationreassuranceexchangeabilit_":
9011="nonplasticerythematoussnakebitesjubilatedworklessnesses": 55
9011="nonplasticerythematoussnakebitesjubilatedworklessnessesnonplasticerythematoussnakebitesjubilatedworklessnesses": 55,110
9011=" nonplasticerythematoussnakebitesjubilatedworklessnesses": 62
9011="_onplasticerythematoussnakebitesjubilatedworklessnesses":
9011="nonplasticerythematoussnakebitesjubilatedworklessnesse_":

View File

@@ -0,0 +1,271 @@
90000="foo": 3
90000="foobar":
90000="foofoobar": 3
90000="foobarfoobar":
90000="foofoofoo": 3,6,9
90001="foo":
90001="foobaz": 6
90001="foo baz": 7
90001="foo baz": 9
90001="foobabaz": 8
90001="foobarbaz":
90001="foo barbaz": 10
90001="foobar baz":
90002="bar": 3
90002="foobar":
90002="foo bar": 7
90002="barbar": 3,6
90002="foobarbar": 9
90003="foo":
90003="foo_____":
90003="foobar": 3
90003="foo bar": 4
90003="foo foo bar": 8
90200="sense and sensibility": 21
90200="response and responsibility": 27
90200="sense and responsibility":
90200="response and sensibility":
90201="rah rah": 7
90201="RAH RAH": 7
90201="rah RAH":
90201="RAH rah":
90202="111":
90202="111 112":
90202="111 111": 12
90202="111111": 6
90202="111\n111":
90202="012 012": 7
90202="999 999": 33
90202="999 000 999": 58
90203="this is a quoted string":
90203="this is a \"quoted string\"": 25
90203="this is a 'quoted string'": 25
90203="this is a \"quoted string'":
90203="this is a 'quoted string\"":
90204="<span>blah</span>":
90204="<span>blah</div>":
90204="<b><i>bold italic</i></b>": 25
90205="foobar":
90205="foofoo": 6
90205="barbar": 6
90205="foofoofoobarfoofoobarbar": 6,9,15,18,21,24
90205="foo___________bar______foo__________bar": 26,39
90205="barfoo":
90205="foobarfoobar": 9,12
90206="barfoo":
90206="foofoofoobarfoofoobarbar": 6,9,18,21,24
90206="foofoo": 6
90206="barbar": 6
90206="foobarfoobar": 12
90206="foo___________bar______foo__________bar":
90206="foobar":
90300="abcc": 4
90300="abc":
90300="ac":
90320="possessive":
90320="possessive 0123": 15
90320="possessive 01234": 16
90320="possessive 0123456": 18
90320="possessive 0123456789": 21
90320="possessive 012": 14
90320="possessive 012345": 17
90320="possessive 0": 12
90320="possessive 01": 13
90321="possessive":
90321="possessive 0123": 15
90321="possessive 01234": 16
90321="possessive 012345": 17
90321="possessive 0123456": 18
90321="possessive 0123456789": 21
90321="possessive 012": 14
90321="possessive 01": 13
90321="possessive 0": 12
90322="possessive":
90322="possessive 0": 12
90322="possessive 01": 12
90323="possessive":
90323="possessive 0":
90323="possessive 01":
90323="possessive 012":
90323="possessive 01234": 15
90323="possessive 0123": 15
90323="possessive 012345": 15
90323="possessive 0123456": 15
90323="possessive 0123456789": 15
90324="possessive":
90324="possessive 0123456": 18
90324="possessive 012":
90324="possessive 0":
90324="possessive 01234567": 19
90324="possessive 0123":
90324="possessive 0123456789": 21
90324="possessive 012345678": 20
90324="possessive 01234":
90324="possessive 012345": 17
90324="possessive 01":
90325="possessive 012345678":
90325="possessive 01234567890": 22
90325="possessive 0123456789012345678": 30
90325="possessive 0123456789012": 24
90325="possessive 012345678901": 23
90325="possessive 01234567890123": 25
90325="possessive 012345678901234": 26
90325="possessive 0123456789": 21
90325="possessive 0123456789012345": 27
90325="possessive 0123456789012345678901": 31
90325="possessive 012345678901234567": 29
90325="possessive 01234567890123456789": 31
90325="possessive 01234567890123456": 28
90325="possessive 012345678901234567890": 31
90207="aateakettlea": 12
90207="aateakettleb":
90207="abteakettleb": 12
90207="acteakettlec": 12
90207="acteakettlecc": 12
90207="aateakettlecc":
90208="aateakettlea": 12
90208="aateakettleb":
90208="abteakettleb": 12
90208="acteakettlec": 12
90208="acteakettlecc": 12
90208="aateakettlecc":
90208="____abcabcabcabcteakettleabcabcabcabc_": 28, 31, 34, 37
90208="____abcabcabcabcteakettleabcabcabcab__": 28, 31, 34
90210="_0backref0": 10
90210="_0backref3":
90210="_3backref3": 10
90210="_9backref":
90210="_9backref9": 10
90210="_backref0":
90211="_0backref0": 10
90211="_0backref3":
90211="_3backref3": 10
90211="_9backref":
90211="_9backref9": 10
90211="_backref0":
90212="_0backref0": 10
90212="_0backref3":
90212="_3backref3": 10
90212="_9backref":
90212="_9backref9": 10
90212="_backref0":
90213="_0backref0": 10
90213="_0backref3":
90213="_3backref3": 10
90213="_9backref":
90213="_9backref9": 10
90213="_backref0":
90209="a_aaa": 5
90209="a_aba":
90209="f_ffff_f_ffff_ff_": 5, 12
90207="aateakettlea": 12
90207="aateakettleb":
90207="abteakettleb": 12
90207="acteakettlec": 12
90207="acteakettlecc": 12
90207="aateakettlecc":
90208="aateakettlea": 12
90208="aateakettleb":
90208="abteakettleb": 12
90208="acteakettlec": 12
90208="acteakettlecc": 12
90208="aateakettlecc":
90208="____abcabcabcabcteakettleabcabcabcabc_": 28, 31, 34, 37
90208="____abcabcabcabcteakettleabcabcabcab__": 28, 31, 34
90210="_0backref0": 10
90210="_0backref3":
90210="_3backref3": 10
90210="_9backref":
90210="_9backref9": 10
90210="_backref0":
90211="_0backref0": 10
90211="_0backref3":
90211="_3backref3": 10
90211="_9backref":
90211="_9backref9": 10
90211="_backref0":
90212="_0backref0": 10
90212="_0backref3":
90212="_3backref3": 10
90212="_9backref":
90212="_9backref9": 10
90212="_backref0":
90213="_0backref0": 10
90213="_0backref3":
90213="_3backref3": 10
90213="_9backref":
90213="_9backref9": 10
90213="_backref0":
90209="a_aaa": 5
90209="a_aba":
90209="f_ffff_f_ffff_ff_": 5, 12
90400="a apple": 2
90400="a pine": 2
90400="a pineapple": 2,11
90401="a melon":
90401="a orange": 8
90401="a watermelon": 12
90401="a waterorange":
90402="guinea pig":
90402="guinea pig party": 11
90402="hamster":
90402="hamster party": 13
90403="guinea pig":
90403="guinea pig nothing": 18
90403="guinea pig party":
90403="hamster":
90403="hamster nothing":
90403="hamster party": 13
90403=" nothing":
90403="nothing":
90404="guinea pig":
90404="guinea pig nothing": 18
90404="guinea pig party":
90404="hamster":
90404="hamster nothing":
90404="hamster party": 13
90404=" nothing":
90404="nothing":
90405="guinea pig":
90405="guinea pig nothing": 18
90405="guinea pig party":
90405="hamster":
90405="hamster nothing":
90405="hamster party": 13
90405=" nothing":
90405="nothing":
90406="water field": 11
90406="water-buffalo field": 19
90406="water-buffalo":
90407="jabber": 6
90407="jabberwocky": 6
90408="goodbye": 3
90408="hell": 3
90408="hello": 1,2,3,4,5
90409="goodbye and hello": 1,2,3,4,5,6,7
90409="hello": 3
90410="badgerbrush":
90410="foobar":
90410="hatstand":
90410="hatstandbadgerbrush":
90410="hatstandteakettle": 17
90410="notbadgerbrush": 14
90411="badgerbrush":
90411="foobar":
90411="hatstand":
90411="hatstandbadgerbrush": 19
90411="hatstandteakettle":
90411="notbadgerbrush":
90413="abdbbbCCdAeaaadCdbaddaaCCbaCCbEeaaabadbaabddEdeDadCCEdeDadadbddCCAeacCbbdbdaCCdddCCaCCdAeabcCbdbbddddCCCdbaCCbEeaacCaadddbdbdbaadCCCCbbddddbaCCEeabbdCdCCCCbddadddbadbddCCEeaaCCadCdCCadbCCbAeabbdbdddbdabdaadbbaEeaaabadbdbbdaCCabdbAeaabadadddddCCdaadAeacCcCdbddaddaAeaaabdabCCbbdadbddbdddbCCEeaaaaadbadCCdbbddddddaEeaaaabdbadbbddbadbdddCCbbdEea": 12,13,14,33,34,35,68,90,113,114,146,173,174,191,212,213,214,232,233,251,266,267,268,292,293,294,295,296,315,316,317,318,342
90413="CCdadabCCddddabddEdeDadbadbaCCabbadaaAeaa": 40,41
90413="CCdadaaCCddddabdabdbCCbadbaddCCCCdddAea": 39
90414="qq_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a": 602
90414="qqa_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a__a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a": 602
90414="qqa_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_a_": 602
90415="prefix00112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900": 606
90415="prefix_______________________________99_____________________________________________________________________________________________________________01________________________________________________________________________________________________________________________________________________________________": 308
90415="prefix____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________": 306
90416:afooafooAfooAfooaFOOa
90417:dDcB\xf3\xb9\xa5\x8eAcDDe

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,209 @@
5000="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5000="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 116
5000="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 118
5001="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5001="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 116
5001="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 118
5002="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5002="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118
5003="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5003="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118
5003="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120
5004="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5004="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 117
5004="ax:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 119
5005="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5005="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 117
5005="ax:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 119
5006="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5006="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 119
5006="aaaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 121
5007="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5007="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 119
5007="aaaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 121
5008="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5008="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118
5008="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120
5009="x:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5009="x:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 118
5009="ax:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 120
5010="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5010="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 120
5010="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 122
5011="aaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug":
5011="aaa:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccpug": 120
5011="aaaa:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccx:ccccccccccpug": 122
5012="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150
5012="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149
5012="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150
5013="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150
5013="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149
5013="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150
5014="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150
5014="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149
5014="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150
5015="aaaaaaaaaaaaaaaaa:adddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 150
5015="aaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 149
5015="daaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 150
5016="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149
5016="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148
5016="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153
5017="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149
5017="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148
5017="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153
5018="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149
5018="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148
5018="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153
5019="aaaaaaaaaaaaaa:addddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeedddddddddddddddddddddffdddddddddddddddddddddddddddddddddpug": 149
5019="aaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 148
5019="daaaaaaaaaaaaaaaaaaa:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedddedddddddddddddddddddddddddddddddddddddddddddddddddddddddpug": 153
5020="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151
5020="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150
5020="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156
5021="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151
5021="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150
5021="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156
5022="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151
5022="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150
5022="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156
5023="aaaaaaaaaaaaa:aadbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc eedbc dbc dggdbc dbc dbc ffdbc dbc dbc dbc dbc dbc dbc dbc dpug": 151
5023="aaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedbc ddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc ddpug": 150
5023="daaaaaaaaaaaaaaaaaaaaaa:dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dddedddeddggdbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dbc dpug": 156
5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpug": 155
5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpug": 153,156
5024="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpug": 154,157
5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpug": 153,154,155
5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpug": 153,154,155,156
5025="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpug": 154,155,156,157
5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 155
5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,156
5026="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 154,157
5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,154,155
5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 153,154,155,156
5027="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpug": 154,155,156,157
5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpug": 155,158
5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpug": 156,159
5028="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpug": 154,157,160
5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpug": 154,155,156,157,158
5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpug": 154,155,156,157,158,159
5029="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpug": 154,155,156,157,158,159,160
5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 155,158
5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 156,159
5030="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,157,160
5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158
5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158,159
5031="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpug": 154,155,156,157,158,159,160
5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpug": 158,161,164,167
5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpug": 162,165,168,171
5032="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpug": 157,160,163
5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpug":
5032="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpug":
5032="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpug":
5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpug": 158,159,160,161,162,163,164,165,166,167
5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpug": 162,163,164,165,166,167,168,169,170,171
5033="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpug": 155,156,157,158,159,160,161,162,163
5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpug":
5033="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpug":
5033="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpug":
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug":
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug":
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": 157,160,163
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpug":
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpug":
5034="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpug":
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug":
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug":
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpug": 155,156,157,158,159,160,161,162,163
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpug":
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpug":
5035="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpug":
5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpug": 173,176,179,182,185,188,191
5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": 177,180,183,186,189
5036="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181
5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpug":
5036="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug":
5036="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpug":
5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpug": 172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug": 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189
5037="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpug": 169,170,171,172,173,174,175,176,177,178,179,180,181
5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcda;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpug":
5037="aaa:abcdabcdabcdabcdabcdabcdabcdabcdaa;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpug":
5037="aaa:abcdabcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpug":
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpug":
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5038="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpug":
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug": 169,170,171,172,173,174,175,176,177,178,179,180,181
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5039="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpug":
5040="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 170,173,176,179,182,185,188,191
5040="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,178,181,184,187,190
5040="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181
5040="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug":
5040="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug":
5040="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug":
5041="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
5041="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190
5041="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 167,168,169,170,171,172,173,174,175,176,177,178,179,180,181
5041="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug":
5041="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug":
5041="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug":
5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug":
5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5042="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181
5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5042="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5042="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug":
5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5043="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 167,168,169,170,171,172,173,174,175,176,177,178,179,180,181
5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5043="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5043="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5044="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 173,176,179,182,185,188,191,194
5044="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,178,181,184,187,190,193
5044="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdaapugabcdabcdabcdabcdabcdabcdabcdaapugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181,184
5044="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug":
5044="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug":
5044="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug":
5045="aaa:abcdabcdabcdabcdabcdabcdabcdaa;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdpugpugpugpugpugpugpugpugpugpugpugpugpug": 171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194
5045="aaa:abcdabcdabcdabcdabcdabcdabcdabcd;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug": 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193
5045="aaa:abcdabcdabcdabcdabcdaaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdaapugabcdabcdabcdabcdabcdabcdabcdaapugpugabcdabcdabcdabcdabcdabcdabcdaapugpugpugpugpugpugpugpugpugpugpug": 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184
5045="aaa:abcdabcdabcdabcdabcdabcd;pug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcdabcd;abcdabcdabcdpugpugpugpugpugpugpugpugpugpugpug":
5045="aaa:abcdabcdabcdabcdabcdabcdabcda;ugpug:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdabcdabcdpugpugpugabcdabcdabcd;abcdabcdabcdabcdapugpugpugpugpugpugpugpugpugpugpug":
5045="aaa:abcdabcdabcdabcdabcdaa;abcdaaa:abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdpugabcdabcdabcdabcdabcdpugpugabcdabcdabcdabcdabcd;abcdabcdaapugpugpugpugpugpugpugpugpugpugpug":
5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug":
5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5046="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 169,172,175,178,181,184
5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5046="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5046="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpugpugpug":
5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5047="aaa:aaaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug": 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184
5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaa;pug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaaaaaa;aaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5047="aaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;ugpug:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaaaaaaaaaapugpugpugaaaaaaaaaaaa;aaaaaaaaaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5047="aaa:aaaaaaaaaaaaaaaaaaaaaa;aaaaaaa:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapugaaaaaaaaaaaaaaaaaaaapugpugaaaaaaaaaaaaaaaaaaaa;aaaaaaaaaapugpugpugpugpugpugpugpugpugpugpug":
5048="X:yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab pugpug": 126,127,128,129
5048="x:Yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab aapugpug": 125,126,127,128
5048="x:yab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab ab aapugpug": 125,126,127,128
5049="X:yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcpugpug": 126,127,128,129
5049="x:Yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcaapugpug":
5049="x:yabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcaapugpugb": 125,126,127,128
5900="xyd;add":
5900="xyd;ddayfadddddEA": 13,15,16,17
5901="a- x- x- xa- x- x- x- xbb- x- x- x--cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddg": 116
5901="cc- x- x-a- x- x- x- x- xbb- x- x-cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddg": 117
5901="cc- x- x-a- x- x- x- x- x--bb- xcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x--ddg": 117
5901="cc- x- x-a- x- x- x- x- x--BB- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x-ddgddgddgddgddgddgddg": 144,147,150
5901="cc- x- x-a- x- x- x- x- x--Ba- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x-ddgddgddgddgddgddgddg": 144,147,150
5901="cc- x- x-a- x- x- x- x- x--Bcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddgddgddgddgddgddgddg": 144,147,150
5901="cc- x- x-a- x- x- x- x- x--Bbb- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xddgddgddgddgddgddgddg": 144,147,150
5902="a- x- x- xa- x- x- x- xbb- x- x- x--cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xyddg": 117
5902="cc- x- x-a- x- x- x- x- xbb- x- x-cc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- xyddg": 118
5902="cc- x- x-a- x- x- x- x- x--bb- xcc- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x- x--yddg": 118

View File

@@ -0,0 +1,896 @@
15100="hatstandteakettle": 17
15100="hatstand teakettle": 18
15100="hatstand teakettle": 21
15100="hatstandateakettle": 18
15100="hatstandaaaaateakettle": 22
15100="hatstandeakettle":
15101="foobar":
15101="fooAbar": 7
15101="fooAAbar":
15102="foobar":
15102="foo1bar": 7
15102="foo2bar": 7
15102="foo3bar": 7
15102="foo4bar": 7
15102="foo5bar":
15103="abc": 3
15103="aabc": 4
15103="aaabc": 5
15103="aaaabc": 6
15103="aaaaaaaaaaaaaaaaaaaaaaaaaaabc": 29
15103="aaaaaaaaaaaaaaaaaaaaaaaaaa\nabc":
15103="aaaaaaaaaaaaaaaaaaaaaaaaaaa\nbc":
15104="fooaabar": 8
15104="fooAabar": 8
15104="fooAAbar":
15104="fooabar":
15104="fooAbar":
15104="fooabbar":
15104="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39
15105="fooaabar": 8
15105="fooAabar": 8
15105="fooAAbar":
15105="fooabar":
15105="fooAbar":
15105="fooabbar":
15105="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39
15105="fooaBbar": 8
15105="fooaBBbar": 9
15105="fooaBBBbar": 10
15106="fooaabar": 8
15106="fooBBbar": 8
15106="fooAabar": 8
15106="fooAAbar":
15106="fooabar":
15106="fooAbar":
15106="fooabbar":
15106="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39
15106="fooaBbar": 8
15106="fooaBBbar": 9
15106="fooaBBBbar": 10
15107="fooaabar": 8
15107="fooBBbar": 8
15107="fooAabar": 8
15107="fooAAbar":
15107="fooabar": 7
15107="fooAbar":
15107="fooabbar":
15107="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39
15107="fooaBbar": 8
15107="fooaBBbar": 9
15107="fooaBBBbar": 10
15107="fooabar": 7
15107="fooBbar": 7
15107="fooabar": 7
15107="fooAbar":
15107="foobar":
15107="foobar":
15107="foobbar":
15107="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38
15107="foobar":
15107="fooBBbar": 8
15107="fooBBBbar": 9
15108="fooaabar": 8
15108="fooBBbar": 8
15108="fooAabar": 8
15108="fooAAbar":
15108="fooabar": 7
15108="fooAbar":
15108="fooabbar":
15108="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 39
15108="fooaBbar": 8
15108="fooaBBbar": 9
15108="fooaBBBbar": 10
15108="fooabar": 7
15108="fooBbar": 7
15108="fooabar": 7
15108="fooAbar":
15108="foobar":
15108="foobar":
15108="foobbar":
15108="fooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabar": 38
15108="foobar":
15108="fooBBbar": 8
15108="fooBBBbar": 9
15109="abde": 4
15109="abdde": 5
15109="abXde":
15109="acde":
15109="acXde": 5
15109="acXXde": 6
15109="acXdde": 6
15110="abde": 4
15110="abdde": 5
15110="abXde":
15110="acde": 4
15110="acXde": 5
15110="acXXde": 6
15110="acXdde": 6
15120="foobar": 6
15120="fooXbar": 7
15120="fooXXbar": 8
15120="fooabar": 7
15120="fooXabar": 8
15120="fooaXbar": 8
15120="fooaaaabar": 10
15120="fooaaXaabar": 11
15121="foobar": 6
15121="fooXbar": 7
15121="fooXXbar": 8
15121="fooabar": 7
15121="fooXabar": 8
15121="fooaXbar": 8
15121="fooaaaabar": 10
15121="fooaaXaabar": 11
15122="foobar": 6
15122="fooXbar": 7
15122="fooXXbar": 8
15122="fooabar": 7
15122="fooXabar": 8
15122="fooaXbar": 8
15122="fooaaaabar": 10
15122="fooaaXaabar": 11
15123="foobar": 6
15123="fooXbar": 7
15123="fooXXbar": 8
15123="fooabar": 7
15123="fooXabar": 8
15123="fooaXbar": 8
15123="fooaaaabar": 10
15123="fooaaXaabar": 11
15124="foobar":
15124="fooXbar":
15124="fooXXbar":
15124="fooabar": 7
15124="fooXabar": 8
15124="fooaXbar":
15124="fooaaaabar": 10
15124="fooaaXaabar": 11
15125="foobar":
15125="fooXbar":
15125="fooXXbar":
15125="fooabar": 7
15125="fooXabar":
15125="fooaXbar": 8
15125="fooaaaabar": 10
15125="fooaaXaabar": 11
15126="foobar":
15126="fooXbar": 7
15126="fooXXbar": 8
15126="fooabar": 7
15126="fooXabar": 8
15126="fooaXbar": 8
15126="fooaaaabar": 10
15126="fooaaXaabar": 11
15127="foobar":
15127="fooXbar": 7
15127="fooXXbar": 8
15127="fooabar": 7
15127="fooXabar": 8
15127="fooaXbar": 8
15127="fooaaaabar": 10
15127="fooaaXaabar": 11
15128="foobar":
15128="fooXbar": 7
15128="fooXXbar": 8
15128="fooabar": 7
15128="fooXabar": 8
15128="fooaXbar": 8
15128="fooaaaabar": 10
15128="fooaaXaabar": 11
15129="foobar":
15129="fooXbar": 7
15129="fooXXbar": 8
15129="fooabar": 7
15129="fooXabar": 8
15129="fooaXbar": 8
15129="fooaaaabar": 10
15129="fooaaXaabar": 11
15130="foobar":
15130="fooXbar":
15130="fooXXbar":
15130="fooabar":
15130="fooXabar": 8
15130="fooaXbar":
15130="fooaaaabar": 10
15130="fooaaXaabar": 11
15131="foobar":
15131="fooXbar":
15131="fooXXbar":
15131="fooabar":
15131="fooXabar":
15131="fooaXbar": 8
15131="fooaaaabar": 10
15131="fooaaXaabar": 11
15132="abcdef": 6
15132="abcadef": 7
15132="abcaadef": 8
15132="abcaaaaadef": 11
15132="abcaaaaaadef": 12
15132="abcaaaaaaadef":
15133="AAAAZZZZ": 8
15133="AAAA_ZZZ": 8
15133="AAA_AZZZ":
15133="AAAAA_ZZZ": 9
15133="AAAAA__ZZZZ": 10,11
15133="AAAA_A__ZZZZ": 11,12
15133="AAAA_A__ZZZZ": 11,12
15134="/(Y.|X.+)a[^a]*foo/s": 18
15134="Yya_foo": 7
15134="Yyaafoo":
15134="Xya_foo": 7
15134="Xyaafoo": 7
15135="oof_ayY": 7
15135="oofaayY":
15135="oof_ayX": 7
15135="oofaayX": 7
15136="foo<<<bar": 9
15136="foo<<=bar": 9
15136="foo<<>bar": 9
15136="foo<=<bar": 9
15136="foo<==bar": 9
15136="foo<=>bar": 9
15136="foo<><bar": 9
15136="foo<>=bar": 9
15136="foo<>>bar": 9
15136="foo=<<bar": 9
15136="foo=<=bar": 9
15136="foo=<>bar": 9
15136="foo==<bar": 9
15136="foo===bar":
15136="foo==>bar":
15136="foo=><bar": 9
15136="foo=>=bar":
15136="foo=>>bar":
15136="foo><<bar": 9
15136="foo><=bar": 9
15136="foo><>bar": 9
15136="foo>=<bar": 9
15136="foo>==bar":
15136="foo>=>bar":
15136="foo>><bar": 9
15136="foo>>=bar":
15136="foo>>>bar":
15136="foo<<<<bar": 10
15136="foo<<<=bar": 10
15136="foo<<<>bar": 10
15136="foo<<=<bar": 10
15136="foo<<==bar": 10
15136="foo<<=>bar": 10
15136="foo<<><bar": 10
15136="foo<<>=bar": 10
15136="foo<<>>bar": 10
15136="foo<=<<bar": 10
15136="foo<=<=bar": 10
15136="foo<=<>bar": 10
15136="foo<==<bar": 10
15136="foo<===bar": 10
15136="foo<==>bar": 10
15136="foo<=><bar": 10
15136="foo<=>=bar": 10
15136="foo<=>>bar": 10
15136="foo<><<bar": 10
15136="foo<><=bar": 10
15136="foo<><>bar": 10
15136="foo<>=<bar": 10
15136="foo<>==bar": 10
15136="foo<>=>bar": 10
15136="foo<>><bar": 10
15136="foo<>>=bar": 10
15136="foo<>>>bar": 10
15136="foo=<<<bar": 10
15136="foo=<<=bar": 10
15136="foo=<<>bar": 10
15136="foo=<=<bar": 10
15136="foo=<==bar": 10
15136="foo=<=>bar": 10
15136="foo=<><bar": 10
15136="foo=<>=bar": 10
15136="foo=<>>bar": 10
15136="foo==<<bar": 10
15136="foo==<=bar": 10
15136="foo==<>bar": 10
15136="foo===<bar": 10
15136="foo====bar":
15136="foo===>bar":
15136="foo==><bar": 10
15136="foo==>=bar":
15136="foo==>>bar":
15136="foo=><<bar": 10
15136="foo=><=bar": 10
15136="foo=><>bar": 10
15136="foo=>=<bar": 10
15136="foo=>==bar":
15136="foo=>=>bar":
15136="foo=>><bar": 10
15136="foo=>>=bar":
15136="foo=>>>bar":
15136="foo><<<bar": 10
15136="foo><<=bar": 10
15136="foo><<>bar": 10
15136="foo><=<bar": 10
15136="foo><==bar": 10
15136="foo><=>bar": 10
15136="foo><><bar": 10
15136="foo><>=bar": 10
15136="foo><>>bar": 10
15136="foo>=<<bar": 10
15136="foo>=<=bar": 10
15136="foo>=<>bar": 10
15136="foo>==<bar": 10
15136="foo>===bar":
15136="foo>==>bar":
15136="foo>=><bar": 10
15136="foo>=>=bar":
15136="foo>=>>bar":
15136="foo>><<bar": 10
15136="foo>><=bar": 10
15136="foo>><>bar": 10
15136="foo>>=<bar": 10
15136="foo>>==bar":
15136="foo>>=>bar":
15136="foo>>><bar": 10
15136="foo>>>=bar":
15136="foo>>>>bar":
15137="foo<<<bar": 9
15137="foo<<=bar": 9
15137="foo<<>bar": 9
15137="foo<=<bar": 9
15137="foo<==bar": 9
15137="foo<=>bar": 9
15137="foo<><bar": 9
15137="foo<>=bar": 9
15137="foo<>>bar": 9
15137="foo=<<bar": 9
15137="foo=<=bar": 9
15137="foo=<>bar": 9
15137="foo==<bar": 9
15137="foo===bar":
15137="foo==>bar":
15137="foo=><bar": 9
15137="foo=>=bar":
15137="foo=>>bar":
15137="foo><<bar": 9
15137="foo><=bar": 9
15137="foo><>bar": 9
15137="foo>=<bar": 9
15137="foo>==bar":
15137="foo>=>bar":
15137="foo>><bar": 9
15137="foo>>=bar":
15137="foo>>>bar":
15137="foo<<<<bar": 10
15137="foo<<<=bar": 10
15137="foo<<<>bar": 10
15137="foo<<=<bar": 10
15137="foo<<==bar": 10
15137="foo<<=>bar": 10
15137="foo<<><bar": 10
15137="foo<<>=bar": 10
15137="foo<<>>bar": 10
15137="foo<=<<bar": 10
15137="foo<=<=bar": 10
15137="foo<=<>bar": 10
15137="foo<==<bar": 10
15137="foo<===bar": 10
15137="foo<==>bar": 10
15137="foo<=><bar": 10
15137="foo<=>=bar": 10
15137="foo<=>>bar": 10
15137="foo<><<bar": 10
15137="foo<><=bar": 10
15137="foo<><>bar": 10
15137="foo<>=<bar": 10
15137="foo<>==bar": 10
15137="foo<>=>bar": 10
15137="foo<>><bar": 10
15137="foo<>>=bar": 10
15137="foo<>>>bar": 10
15137="foo=<<<bar": 10
15137="foo=<<=bar": 10
15137="foo=<<>bar": 10
15137="foo=<=<bar": 10
15137="foo=<==bar": 10
15137="foo=<=>bar": 10
15137="foo=<><bar": 10
15137="foo=<>=bar": 10
15137="foo=<>>bar": 10
15137="foo==<<bar": 10
15137="foo==<=bar": 10
15137="foo==<>bar": 10
15137="foo===<bar": 10
15137="foo====bar":
15137="foo===>bar":
15137="foo==><bar": 10
15137="foo==>=bar":
15137="foo==>>bar":
15137="foo=><<bar": 10
15137="foo=><=bar": 10
15137="foo=><>bar": 10
15137="foo=>=<bar": 10
15137="foo=>==bar":
15137="foo=>=>bar":
15137="foo=>><bar": 10
15137="foo=>>=bar":
15137="foo=>>>bar":
15137="foo><<<bar": 10
15137="foo><<=bar": 10
15137="foo><<>bar": 10
15137="foo><=<bar": 10
15137="foo><==bar": 10
15137="foo><=>bar": 10
15137="foo><><bar": 10
15137="foo><>=bar": 10
15137="foo><>>bar": 10
15137="foo>=<<bar": 10
15137="foo>=<=bar": 10
15137="foo>=<>bar": 10
15137="foo>==<bar": 10
15137="foo>===bar":
15137="foo>==>bar":
15137="foo>=><bar": 10
15137="foo>=>=bar":
15137="foo>=>>bar":
15137="foo>><<bar": 10
15137="foo>><=bar": 10
15137="foo>><>bar": 10
15137="foo>>=<bar": 10
15137="foo>>==bar":
15137="foo>>=>bar":
15137="foo>>><bar": 10
15137="foo>>>=bar":
15137="foo>>>>bar":
15138="fooaaabar":
15138="fooaa bar":
15138="fooa abar":
15138="fooa bar":
15138="foo aabar": 9
15138="foo a bar": 9
15138="foo abar": 9
15138="foo bar": 9
15139="fooaaabar":
15139="fooaa bar": 9
15139="fooa abar":
15139="fooa bar": 9
15139="foo aabar":
15139="foo a bar": 9
15139="foo abar":
15139="foo bar": 9
15140="foo<<<bar": 9
15140="foo<<=bar": 9
15140="foo<<>bar":
15140="foo<=<bar": 9
15140="foo<==bar": 9
15140="foo<=>bar":
15140="foo<><bar":
15140="foo<>=bar":
15140="foo<>>bar":
15140="foo=<<bar": 9
15140="foo=<=bar": 9
15140="foo=<>bar":
15140="foo==<bar": 9
15140="foo===bar":
15140="foo==>bar":
15140="foo=><bar": 9
15140="foo=>=bar":
15140="foo=>>bar":
15140="foo><<bar": 9
15140="foo><=bar": 9
15140="foo><>bar":
15140="foo>=<bar": 9
15140="foo>==bar":
15140="foo>=>bar":
15140="foo>><bar": 9
15140="foo>>=bar":
15140="foo>>>bar":
15140="foo<<<<bar": 10
15140="foo<<<=bar": 10
15140="foo<<<>bar":
15140="foo<<=<bar": 10
15140="foo<<==bar": 10
15140="foo<<=>bar":
15140="foo<<><bar":
15140="foo<<>=bar":
15140="foo<<>>bar":
15140="foo<=<<bar": 10
15140="foo<=<=bar": 10
15140="foo<=<>bar":
15140="foo<==<bar": 10
15140="foo<===bar": 10
15140="foo<==>bar":
15140="foo<=><bar":
15140="foo<=>=bar":
15140="foo<=>>bar":
15140="foo<><<bar":
15140="foo<><=bar":
15140="foo<><>bar":
15140="foo<>=<bar":
15140="foo<>==bar":
15140="foo<>=>bar":
15140="foo<>><bar":
15140="foo<>>=bar":
15140="foo<>>>bar":
15140="foo=<<<bar": 10
15140="foo=<<=bar": 10
15140="foo=<<>bar":
15140="foo=<=<bar": 10
15140="foo=<==bar": 10
15140="foo=<=>bar":
15140="foo=<><bar":
15140="foo=<>=bar":
15140="foo=<>>bar":
15140="foo==<<bar": 10
15140="foo==<=bar": 10
15140="foo==<>bar":
15140="foo===<bar": 10
15140="foo====bar":
15140="foo===>bar":
15140="foo==><bar": 10
15140="foo==>=bar":
15140="foo==>>bar":
15140="foo=><<bar": 10
15140="foo=><=bar": 10
15140="foo=><>bar":
15140="foo=>=<bar": 10
15140="foo=>==bar":
15140="foo=>=>bar":
15140="foo=>><bar": 10
15140="foo=>>=bar":
15140="foo=>>>bar":
15140="foo><<<bar": 10
15140="foo><<=bar": 10
15140="foo><<>bar":
15140="foo><=<bar": 10
15140="foo><==bar": 10
15140="foo><=>bar":
15140="foo><><bar":
15140="foo><>=bar":
15140="foo><>>bar":
15140="foo>=<<bar": 10
15140="foo>=<=bar": 10
15140="foo>=<>bar":
15140="foo>==<bar": 10
15140="foo>===bar":
15140="foo>==>bar":
15140="foo>=><bar": 10
15140="foo>=>=bar":
15140="foo>=>>bar":
15140="foo>><<bar": 10
15140="foo>><=bar": 10
15140="foo>><>bar":
15140="foo>>=<bar": 10
15140="foo>>==bar":
15140="foo>>=>bar":
15140="foo>>><bar": 10
15140="foo>>>=bar":
15140="foo>>>>bar":
15141="foo<<<bar":
15141="foo<<=bar":
15141="foo<<>bar":
15141="foo<=<bar":
15141="foo<==bar":
15141="foo<=>bar":
15141="foo<><bar":
15141="foo<>=bar":
15141="foo<>>bar":
15141="foo=<<bar":
15141="foo=<=bar":
15141="foo=<>bar":
15141="foo==<bar":
15141="foo===bar":
15141="foo==>bar": 9
15141="foo=><bar": 9
15141="foo=>=bar": 9
15141="foo=>>bar": 9
15141="foo><<bar": 9
15141="foo><=bar": 9
15141="foo><>bar":
15141="foo>=<bar": 9
15141="foo>==bar": 9
15141="foo>=>bar": 9
15141="foo>><bar": 9
15141="foo>>=bar": 9
15141="foo>>>bar": 9
15141="foo<<<<bar":
15141="foo<<<=bar":
15141="foo<<<>bar":
15141="foo<<=<bar":
15141="foo<<==bar":
15141="foo<<=>bar":
15141="foo<<><bar":
15141="foo<<>=bar":
15141="foo<<>>bar":
15141="foo<=<<bar":
15141="foo<=<=bar":
15141="foo<=<>bar":
15141="foo<==<bar":
15141="foo<===bar":
15141="foo<==>bar":
15141="foo<=><bar":
15141="foo<=>=bar":
15141="foo<=>>bar":
15141="foo<><<bar":
15141="foo<><=bar":
15141="foo<><>bar":
15141="foo<>=<bar":
15141="foo<>==bar":
15141="foo<>=>bar":
15141="foo<>><bar":
15141="foo<>>=bar":
15141="foo<>>>bar":
15141="foo=<<<bar":
15141="foo=<<=bar":
15141="foo=<<>bar":
15141="foo=<=<bar":
15141="foo=<==bar":
15141="foo=<=>bar":
15141="foo=<><bar":
15141="foo=<>=bar":
15141="foo=<>>bar":
15141="foo==<<bar":
15141="foo==<=bar":
15141="foo==<>bar":
15141="foo===<bar":
15141="foo====bar":
15141="foo===>bar": 10
15141="foo==><bar": 10
15141="foo==>=bar": 10
15141="foo==>>bar": 10
15141="foo=><<bar": 10
15141="foo=><=bar": 10
15141="foo=><>bar":
15141="foo=>=<bar": 10
15141="foo=>==bar": 10
15141="foo=>=>bar": 10
15141="foo=>><bar": 10
15141="foo=>>=bar": 10
15141="foo=>>>bar": 10
15141="foo><<<bar": 10
15141="foo><<=bar": 10
15141="foo><<>bar":
15141="foo><=<bar": 10
15141="foo><==bar": 10
15141="foo><=>bar":
15141="foo><><bar":
15141="foo><>=bar":
15141="foo><>>bar":
15141="foo>=<<bar": 10
15141="foo>=<=bar": 10
15141="foo>=<>bar":
15141="foo>==<bar": 10
15141="foo>===bar": 10
15141="foo>==>bar": 10
15141="foo>=><bar": 10
15141="foo>=>=bar": 10
15141="foo>=>>bar": 10
15141="foo>><<bar": 10
15141="foo>><=bar": 10
15141="foo>><>bar":
15141="foo>>=<bar": 10
15141="foo>>==bar": 10
15141="foo>>=>bar": 10
15141="foo>>><bar": 10
15141="foo>>>=bar": 10
15141="foo>>>>bar": 10
15142="foo<<<bar": 9
15142="foo<<=bar":
15142="foo<<>bar":
15142="foo<=<bar":
15142="foo<==bar":
15142="foo<=>bar":
15142="foo<><bar":
15142="foo<>=bar":
15142="foo<>>bar":
15142="foo=<<bar": 9
15142="foo=<=bar":
15142="foo=<>bar":
15142="foo==<bar":
15142="foo===bar":
15142="foo==>bar":
15142="foo=><bar":
15142="foo=>=bar":
15142="foo=>>bar":
15142="foo><<bar": 9
15142="foo><=bar":
15142="foo><>bar":
15142="foo>=<bar": 9
15142="foo>==bar":
15142="foo>=>bar":
15142="foo>><bar": 9
15142="foo>>=bar": 9
15142="foo>>>bar":
15142="foo<<<<bar": 10
15142="foo<<<=bar":
15142="foo<<<>bar":
15142="foo<<=<bar":
15142="foo<<==bar":
15142="foo<<=>bar":
15142="foo<<><bar":
15142="foo<<>=bar":
15142="foo<<>>bar":
15142="foo<=<<bar":
15142="foo<=<=bar":
15142="foo<=<>bar":
15142="foo<==<bar":
15142="foo<===bar":
15142="foo<==>bar":
15142="foo<=><bar":
15142="foo<=>=bar":
15142="foo<=>>bar":
15142="foo<><<bar":
15142="foo<><=bar":
15142="foo<><>bar":
15142="foo<>=<bar":
15142="foo<>==bar":
15142="foo<>=>bar":
15142="foo<>><bar":
15142="foo<>>=bar":
15142="foo<>>>bar":
15142="foo=<<<bar": 10
15142="foo=<<=bar":
15142="foo=<<>bar":
15142="foo=<=<bar":
15142="foo=<==bar":
15142="foo=<=>bar":
15142="foo=<><bar":
15142="foo=<>=bar":
15142="foo=<>>bar":
15142="foo==<<bar":
15142="foo==<=bar":
15142="foo==<>bar":
15142="foo===<bar":
15142="foo====bar":
15142="foo===>bar":
15142="foo==><bar":
15142="foo==>=bar":
15142="foo==>>bar":
15142="foo=><<bar":
15142="foo=><=bar":
15142="foo=><>bar":
15142="foo=>=<bar":
15142="foo=>==bar":
15142="foo=>=>bar":
15142="foo=>><bar":
15142="foo=>>=bar":
15142="foo=>>>bar":
15142="foo><<<bar": 10
15142="foo><<=bar":
15142="foo><<>bar":
15142="foo><=<bar":
15142="foo><==bar":
15142="foo><=>bar":
15142="foo><><bar":
15142="foo><>=bar":
15142="foo><>>bar":
15142="foo>=<<bar": 10
15142="foo>=<=bar":
15142="foo>=<>bar":
15142="foo>==<bar":
15142="foo>===bar":
15142="foo>==>bar":
15142="foo>=><bar":
15142="foo>=>=bar":
15142="foo>=>>bar":
15142="foo>><<bar": 10
15142="foo>><=bar":
15142="foo>><>bar":
15142="foo>>=<bar": 10
15142="foo>>==bar":
15142="foo>>=>bar":
15142="foo>>><bar": 10
15142="foo>>>=bar": 10
15142="foo>>>>bar":
15143="foo<<<bar":
15143="foo<<=bar":
15143="foo<<>bar":
15143="foo<=<bar":
15143="foo<==bar":
15143="foo<=>bar":
15143="foo<><bar":
15143="foo<>=bar":
15143="foo<>>bar":
15143="foo=<<bar": 9
15143="foo=<=bar":
15143="foo=<>bar":
15143="foo==<bar":
15143="foo===bar":
15143="foo==>bar":
15143="foo=><bar":
15143="foo=>=bar":
15143="foo=>>bar":
15143="foo><<bar": 9
15143="foo><=bar":
15143="foo><>bar":
15143="foo>=<bar": 9
15143="foo>==bar":
15143="foo>=>bar":
15143="foo>><bar": 9
15143="foo>>=bar": 9
15143="foo>>>bar": 9
15143="foo<<<<bar":
15143="foo<<<=bar":
15143="foo<<<>bar":
15143="foo<<=<bar":
15143="foo<<==bar":
15143="foo<<=>bar":
15143="foo<<><bar":
15143="foo<<>=bar":
15143="foo<<>>bar":
15143="foo<=<<bar":
15143="foo<=<=bar":
15143="foo<=<>bar":
15143="foo<==<bar":
15143="foo<===bar":
15143="foo<==>bar":
15143="foo<=><bar":
15143="foo<=>=bar":
15143="foo<=>>bar":
15143="foo<><<bar":
15143="foo<><=bar":
15143="foo<><>bar":
15143="foo<>=<bar":
15143="foo<>==bar":
15143="foo<>=>bar":
15143="foo<>><bar":
15143="foo<>>=bar":
15143="foo<>>>bar":
15143="foo=<<<bar": 10
15143="foo=<<=bar":
15143="foo=<<>bar":
15143="foo=<=<bar":
15143="foo=<==bar":
15143="foo=<=>bar":
15143="foo=<><bar":
15143="foo=<>=bar":
15143="foo=<>>bar":
15143="foo==<<bar":
15143="foo==<=bar":
15143="foo==<>bar":
15143="foo===<bar":
15143="foo====bar":
15143="foo===>bar":
15143="foo==><bar":
15143="foo==>=bar":
15143="foo==>>bar":
15143="foo=><<bar":
15143="foo=><=bar":
15143="foo=><>bar":
15143="foo=>=<bar":
15143="foo=>==bar":
15143="foo=>=>bar":
15143="foo=>><bar":
15143="foo=>>=bar":
15143="foo=>>>bar":
15143="foo><<<bar": 10
15143="foo><<=bar":
15143="foo><<>bar":
15143="foo><=<bar":
15143="foo><==bar":
15143="foo><=>bar":
15143="foo><><bar":
15143="foo><>=bar":
15143="foo><>>bar":
15143="foo>=<<bar": 10
15143="foo>=<=bar":
15143="foo>=<>bar":
15143="foo>==<bar":
15143="foo>===bar":
15143="foo>==>bar":
15143="foo>=><bar":
15143="foo>=>=bar":
15143="foo>=>>bar":
15143="foo>><<bar": 10
15143="foo>><=bar":
15143="foo>><>bar":
15143="foo>>=<bar": 10
15143="foo>>==bar":
15143="foo>>=>bar":
15143="foo>>><bar": 10
15143="foo>>>=bar": 10
15143="foo>>>>bar": 10
15144="______________________________________________________________________________________________AA_AAAA_______________________________________________________________________________________AA_AAAA": 101,195
15144="______________________________________________________________________________________________AA_AAAA_______________________________________________________________________________________AA_AAAA_______________________________": 101,195
15145="abc___a__a_____": 15
15145="abc__a__a_____": 14
15145="abc_foo_a__a___a_": 17
15145="abcaaaaaaaaaaaaaaaaaaaaaaaaaaa": 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,153 @@
22000="": 0
22000="foo": 0,1,2,3
22001="": 0
22001="foo": 0,1,2,3
22002="": 0
22002="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
22003="": 0
22003="foo": 0,1,2,3
22004="": 0
22004="foo": 0,1,2,3
22005="": 0
22005="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
22006="": 0
22006="foo": 0,1,2,3
22006="foofoo": 0,1,2,3,4,5,6
22006="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
22007="": 0
22007="foo": 0,1,2,3
22007="foofoo": 0,1,2,3,4,5,6
22007="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
22008="": 0
22008="foo": 0,1,2,3
22008="foofoo": 0,1,2,3,4,5,6
22008="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
22009="": 0
22009="foo": 0,1,2,3
22009="foofoo": 0,1,2,3,4,5,6
22009="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
22010="": 0
22010="foo": 0,1,2,3
22011="": 0
22011="foo": 0,1
22012="": 0
22012="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
22013="": 0
22013="foo": 0,1,2,3
22014="": 0
22014="foo": 0,1
22015="": 0
22015="aaaaaaaaaaaaaaaaa": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
22016="": 0
22016="foo": 0,3
22016="foofoo": 0,3
22016="foofoofoofoofoofoo": 0,3
22017="": 0
22017="foo": 0,1,3
22017="foofoo": 0,1,3
22017="foofoofoofoofoofoo": 0,1,3
22018="": 0
22018="foo": 0,1,2,3
22018="foofoo": 0,1,2,3,4,5,6
22018="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
22019="": 0
22019="foo": 0,1,2,3
22019="foofoo": 0,1,2,3,4,5,6
22019="foofoofoofoofoofoo": 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
22020="": 0
22020="a":
22020="aaaa":
22021="": 0
22021="a":
22021="aaaa":
22022="": 0
22022="\n": 0,1
22022="foo\n": 3,4
22022="foo": 3
22023="": 0
22023="\n": 1
22023="foo\n": 3,4
22023="foo": 3
22024="": 0
22024="\n": 0,1
22024="a": 0,1
22024="a\n": 0,1,2
22025="": 0
22025="\n": 0,1
22025="a": 0,1
22025="a\n": 0,1,2
22026="": 0
22026="a": 0,1
22026="\n": 0,1
22026="a\n": 0,2
22027="": 0
22027="a": 0,1
22027="aa": 0,1
22027="a\na": 0,1,2,3
22027="foo\na": 0,4,5
22027="foo\nfooa": 0,4
22027="\n": 0
22027="\na": 0,1,2
22028="": 0
22028="\n": 0
22028="\na": 0
22028="\n\n": 0,1
22028="\na\n": 0
22028="\n\n\n": 0,1,2
22028="\n\n\n\n\n\n\n\n\n\n": 0,1,2,3,4,5,6,7,8,9
22029="":
22029="a": 1
22029="aa": 1,2
22029="aaa": 1,2,3
22029="aaaa": 1,2,3,4
22029="aaaaa": 1,2,3,4,5
22029="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122
22030="": 0
22030="\n": 0
22030="\n\n": 0,1
22030="foo": 0
22030="foo\n": 0
22031="": 0
22031="\n": 0,1
22031="\n\n": 0,1,2
22031="foo": 3
22031="foo\n": 3,4
22032="": 0
22032="\n": 1
22032="\n\n": 2
22032="foo": 3
22032="foo\n": 4
22033="": 0
22033="\n": 0,1
22033="\n\n": 1,2
22033="foo": 3
22033="foo\n": 3,4
22034="": 0
22034="\n":
22034="\n\n":
22034="foo":
22034="foo\n":
22035="":
22035="\n": 1
22035="a": 1
22035="\na": 1,2
22035="a\n": 1
22035="foo\n": 1
22035="foo\na": 1,5
22035="foo\n\n": 1,5
22036="": 0
22036="\n": 0,1
22036="a": 0,1
22036="a\n": 0,1
22036="\na": 0,1,2
22036="foo": 0,1
22036="foo\n": 0,1
22036="foo\na": 0,1,4,5
22036="foo\n\n": 0,1,4,5
22037="": 0
22037="foo": 3
22037="foo\n": 3,4
22037="a\nfoo\n": 1,5,6
22037="a\nfoo\nfoo": 1,5,9
22037="a\nfoo\nfooa": 1,5,9,10
22038:a

View File

@@ -0,0 +1,3 @@
2000:/abcdef[^X].*[^X](A|B(CDE)?F)Y?foobar/s
2001:/[^abab]+\Z/si
2002:/mj(?:[pajl]|o)[tplh]thd.hq.b[frt]pk(\b)hb/i8L

Some files were not shown because too many files have changed in this diff Show More