240731.1 · b8b0e37d1da2f7a29dda00678af3b02c6af424a6
released 3.6
fix #410 fix #411 fix #412
reading declarations
@@ -13,17 +13,17 @@ CONFIGH = $(shell pwd)/$(top_builddir)/config.h if ENABLE_BASH_COMPLETION bashcompletiondir = $(BASH_COMPLETION_DIR)-dist_bashcompletion_DATA = $(top_builddir)/completions/bash/ug+dist_bashcompletion_DATA = $(top_builddir)/completions/bash/ug $(top_builddir)/completions/bash/ugrep-indexer endif if ENABLE_FISH_COMPLETION fishcompletiondir = $(FISH_COMPLETION_DIR)-dist_fishcompletion_DATA = $(top_builddir)/completions/fish/ug.fish+dist_fishcompletion_DATA = $(top_builddir)/completions/fish/ug.fish $(top_builddir)/completions/fish/ugrep-indexer.fish endif if ENABLE_ZSH_COMPLETION zshcompletiondir = $(ZSH_COMPLETION_DIR)-dist_zshcompletion_DATA = $(top_builddir)/completions/zsh/_ug+dist_zshcompletion_DATA = $(top_builddir)/completions/zsh/_ug $(top_builddir)/completions/zsh/_ugrep-indexer endif all-local: cp2bin
@@ -176,11 +176,14 @@ am__installdirs = "$(DESTDIR)$(man1dir)" \ NROFF = nroff MANS = $(man1_MANS) am__dist_bashcompletion_DATA_DIST = \- $(top_builddir)/completions/bash/ug+ $(top_builddir)/completions/bash/ug \+ $(top_builddir)/completions/bash/ugrep-indexer am__dist_fishcompletion_DATA_DIST = \- $(top_builddir)/completions/fish/ug.fish+ $(top_builddir)/completions/fish/ug.fish \+ $(top_builddir)/completions/fish/ugrep-indexer.fish am__dist_zshcompletion_DATA_DIST = \- $(top_builddir)/completions/zsh/_ug+ $(top_builddir)/completions/zsh/_ug \+ $(top_builddir)/completions/zsh/_ugrep-indexer DATA = $(dist_bashcompletion_DATA) $(dist_fishcompletion_DATA) \ $(dist_zshcompletion_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \@@ -391,11 +394,11 @@ EXTRA_DIST = README.md LICENSE.txt CONTRIBUTING.md CODE_OF_CONDUCT.md UGREP = $(shell pwd)/$(top_builddir)/bin/ugrep$(EXEEXT) CONFIGH = $(shell pwd)/$(top_builddir)/config.h @ENABLE_BASH_COMPLETION_TRUE@bashcompletiondir = $(BASH_COMPLETION_DIR)-@ENABLE_BASH_COMPLETION_TRUE@dist_bashcompletion_DATA = $(top_builddir)/completions/bash/ug+@ENABLE_BASH_COMPLETION_TRUE@dist_bashcompletion_DATA = $(top_builddir)/completions/bash/ug $(top_builddir)/completions/bash/ugrep-indexer @ENABLE_FISH_COMPLETION_TRUE@fishcompletiondir = $(FISH_COMPLETION_DIR)-@ENABLE_FISH_COMPLETION_TRUE@dist_fishcompletion_DATA = $(top_builddir)/completions/fish/ug.fish+@ENABLE_FISH_COMPLETION_TRUE@dist_fishcompletion_DATA = $(top_builddir)/completions/fish/ug.fish $(top_builddir)/completions/fish/ugrep-indexer.fish @ENABLE_ZSH_COMPLETION_TRUE@zshcompletiondir = $(ZSH_COMPLETION_DIR)-@ENABLE_ZSH_COMPLETION_TRUE@dist_zshcompletion_DATA = $(top_builddir)/completions/zsh/_ug+@ENABLE_ZSH_COMPLETION_TRUE@dist_zshcompletion_DATA = $(top_builddir)/completions/zsh/_ug $(top_builddir)/completions/zsh/_ugrep-indexer all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive
@@ -3133,6 +3133,8 @@ To display the line and column numbers of matches in XML with `--xml`: (invert), `u' (underline). Parameter `hl' enables file name hyperlinks. Parameter `rv' reverses the `sl=' and `cx=' parameters when option -v is specified. Selectively overrides GREP_COLORS.+ Legacy grep single parameter codes may be specified, for example+ --colors='7;32' or --colors=ig to set ms (match selected). --tag[=TAG[,END]] Disables colors to mark up matches with TAG. END marks the end of a match if specified, otherwise TAG. The default is `___'.@@ -4130,7 +4132,9 @@ in markdown: `i' (invert), `u' (underline). Parameter `hl' enables file name hyperlinks. Parameter `rv' reverses the `sl=' and `cx=' parameters when option -v is specified. Selectively overrides- GREP_COLORS.+ GREP_COLORS. Legacy grep single parameter codes may be specified,+ for example --colors='7;32' or --colors=ig to set ms (match+ selected). --config[=FILE], ---[FILE] Use configuration FILE. The default FILE is `.ugrep'. The@@ -4435,17 +4439,17 @@ in markdown: priority over --include-fs=MOUNTS. This option may be repeated. --index- Perform index-based recursive search. This option assumes, but- does not require, that files are indexed with ugrep-indexer. This- option accelerates recursive searching by skipping non-matching- files, archives and compressed files when indexed. Significant+ Perform fast index-based recursive search. This option assumes,+ but does not require, that files are indexed with ugrep-indexer.+ This option also enables option -r or --recursive. Skips indexed+ non-matching files, archives and compressed files. Significant acceleration may be achieved on cold (not file-cached) and large file systems, or any file system that is slow to search. Note- that the start-up time to search is increased, which may be- significant when complex search patterns are specified that- contain large Unicode character classes combined with `*' or `+'- repeats, which should be avoided. Option -U (--ascii) improves- performance. Option --stats displays an index search report.+ that the start-up time to search may be increased when complex+ search patterns are specified that contain large Unicode character+ classes combined with `*' or `+' repeats, which should be avoided.+ Option -U (--ascii) improves performance. Option --stats displays+ an index search report. -J NUM, --jobs=NUM Specifies the number of threads spawned to search files. By@@ -5392,7 +5396,7 @@ in markdown: - ugrep 6.2.0 July 9, 2024 UGREP(1)+ ugrep 6.3.0 July 31, 2024 UGREP(1) � [Back to table of contents](#toc)
@@ -267,7 +267,7 @@ cat <<'END' --include-dir=GLOB Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/. --include-from=FILE Read the globs from FILE and search only files and directories whose name matches one or more globs. --include-fs=MOUNTS Only file systems specified by MOUNTS are included in recursive searches.---index Perform index-based recursive search.+--index Perform fast index-based recursive search. -J NUM, --jobs=NUM Specifies the number of threads spawned to search files. -j, --smart-case Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter. --json Output file matches in JSON.
completions/bash/ugrep-indexer
@@ -0,0 +1,93 @@+# bash completion for ugrep-indexer+# recommended: add the following lines to ~/.inputrc+# set colored-stats on+# set colored-completion-prefix on++if ! declare -F _init_completion >/dev/null 2>&1; then+ return+fi++_comp_cmd_ugrep_indexer()+{+ local IFS=$' \t\n'+ local cur prev words cword+ _init_completion -s || return++ if [[ $cword -eq 1 && "${words[1]}" == "" ]]; then+ _comp_cmd_ugrep_indexer_usage+ return+ fi++ local i+ for i in "${!words[@]}"; do+ if [ "${words[$i]}" = "--" ]; then+ if [ $cword -gt $i ]; then+ _filedir+ return+ fi+ words=( "${words[@]:0:$i}" )+ break+ fi+ done++ case $cur in+ --*)+ # complete long options by generating them+ COMPREPLY=( $(compgen -W "$(_parse_help _comp_cmd_ugrep_indexer_help)" -- $cur) )+ if [[ ! "${COMPREPLY[@]}" =~ "=" ]]; then+ # add space after long options that do not end with a =+ compopt +o nospace+ fi+ return+ ;;+ -?*)+ # add space after short option(s)+ COMPREPLY=( $cur )+ compopt +o nospace+ return+ ;;+ -)+ _comp_cmd_ugrep_indexer_usage+ return+ ;;+ esac++ _filedir+} &&+ complete -o nospace -F _comp_cmd_ugrep_indexer ugrep-indexer++_comp_cmd_ugrep_indexer_usage()+{+ local -a usage+ local line i=1+ usage[0]="Usage:"+ # generate list of options, concat the first sentence to them+ while read -r line; do+ # truncate to screen width+ usage[$i]=${line:0:$COLUMNS}+ (( ++i ))+ done < <(_comp_cmd_ugrep_indexer_help)+ COMPREPLY=( "${usage[@]}" )+ compopt -o nosort+}++_comp_cmd_ugrep_indexer_help()+{+cat <<'END'+--accuracy=DIGIT, -0, -1, -2, -3, -4, -5, -6, -7, -8, -9 Specifies indexing accuracy.+-., --hidden Index hidden files and directories.+-?, --help Display a help message and exit.+-c, --check Recursively check and report indexes without reindexing files.+-d, --delete Recursively remove index files.+-f, --force Force reindexing of files.+-I, --ignore-binary Do not index binary files.+-q, --quiet, --silent Quiet mode: do not display indexing statistics.+-S, --dereference-files Follow symbolic links to files.+-s, --no-messages Silent mode: nonexistent and unreadable files are ignored, i.e. their error messages and warnings are suppressed.+-V, --version Display version and exit.+-v, --verbose Produce verbose output.+-X, --ignore-files, --ignore-files=FILE Do not index files and directories matching the globs in FILE encountered during indexing.+-z, --decompress Index the contents of compressed files and archives.+--zmax=NUM When used with option -z (--decompress), indexes the contents of compressed files and archives stored within archives by up to NUM expansion levels deep.+END+}
@@ -57,7 +57,7 @@ complete -c ug+ -l include -d 'Only search files whose name matches GLOB, same a complete -c ug+ -l include-dir -d 'Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/' complete -c ug+ -l include-from -d 'Read the globs from FILE and search only files and directories whose name matches one or more globs' complete -c ug+ -l include-fs -d 'Only file systems specified by MOUNTS are included in recursive searches'-complete -c ug+ -l index -d 'Perform index-based recursive search'+complete -c ug+ -l index -d 'Perform fast index-based recursive search' complete -c ug+ -s J -r -l jobs -d 'Specifies the number of threads spawned to search files' complete -c ug+ -s j -l smart-case -d 'Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter' complete -c ug+ -l json -d 'Output file matches in JSON'
@@ -57,7 +57,7 @@ complete -c ug -l include -d 'Only search files whose name matches GLOB, same as complete -c ug -l include-dir -d 'Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/' complete -c ug -l include-from -d 'Read the globs from FILE and search only files and directories whose name matches one or more globs' complete -c ug -l include-fs -d 'Only file systems specified by MOUNTS are included in recursive searches'-complete -c ug -l index -d 'Perform index-based recursive search'+complete -c ug -l index -d 'Perform fast index-based recursive search' complete -c ug -s J -r -l jobs -d 'Specifies the number of threads spawned to search files' complete -c ug -s j -l smart-case -d 'Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter' complete -c ug -l json -d 'Output file matches in JSON'
@@ -57,7 +57,7 @@ complete -c ugrep+ -l include -d 'Only search files whose name matches GLOB, sam complete -c ugrep+ -l include-dir -d 'Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/' complete -c ugrep+ -l include-from -d 'Read the globs from FILE and search only files and directories whose name matches one or more globs' complete -c ugrep+ -l include-fs -d 'Only file systems specified by MOUNTS are included in recursive searches'-complete -c ugrep+ -l index -d 'Perform index-based recursive search'+complete -c ugrep+ -l index -d 'Perform fast index-based recursive search' complete -c ugrep+ -s J -r -l jobs -d 'Specifies the number of threads spawned to search files' complete -c ugrep+ -s j -l smart-case -d 'Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter' complete -c ugrep+ -l json -d 'Output file matches in JSON'
completions/fish/ugrep-indexer.fish
@@ -0,0 +1,16 @@+# Copy this file to ~/.config/fish/completions+complete -c ugrep-indexer -l accuracy -s 0 -s 1 -s 2 -s 3 -s 4 -s 5 -s 6 -s 7 -s 8 -s 9 -d 'Specifies indexing accuracy'+complete -c ugrep-indexer -l hidden -s '.' -d 'Index hidden files and directories'+complete -c ugrep-indexer -l help -s '?' -d 'Display a help message and exit'+complete -c ugrep-indexer -s c -l check -d 'Recursively check and report indexes without reindexing files'+complete -c ugrep-indexer -s d -l delete -d 'Recursively remove index files'+complete -c ugrep-indexer -s f -l force -d 'Force reindexing of files, even those that are already indexed'+complete -c ugrep-indexer -s I -l ignore-binary -d 'Do not index binary files'+complete -c ugrep-indexer -s q -l quiet -l silent -d 'Quiet mode: do not display indexing statistics'+complete -c ugrep-indexer -s S -l dereference-files -d 'Follow symbolic links to files'+complete -c ugrep-indexer -s s -l no-messages -d 'Silent mode: nonexistent and unreadable files are ignored, i.e. their error messages and warnings are suppressed'+complete -c ugrep-indexer -s V -l version -d 'Display version and exit'+complete -c ugrep-indexer -s v -l verbose -d 'Produce verbose output'+complete -c ugrep-indexer -s X -l ignore-files -d 'Do not index files and directories matching the globs in FILE encountered during indexing'+complete -c ugrep-indexer -s z -l decompress -d 'Index the contents of compressed files and archives'+complete -c ugrep-indexer -l zmax -d 'When used with option -z (--decompress), indexes the contents of compressed files and archives stored within archives by up to NUM expansion levels deep'
@@ -57,7 +57,7 @@ complete -c ugrep -l include -d 'Only search files whose name matches GLOB, same complete -c ugrep -l include-dir -d 'Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/' complete -c ugrep -l include-from -d 'Read the globs from FILE and search only files and directories whose name matches one or more globs' complete -c ugrep -l include-fs -d 'Only file systems specified by MOUNTS are included in recursive searches'-complete -c ugrep -l index -d 'Perform index-based recursive search'+complete -c ugrep -l index -d 'Perform fast index-based recursive search' complete -c ugrep -s J -r -l jobs -d 'Specifies the number of threads spawned to search files' complete -c ugrep -s j -l smart-case -d 'Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter' complete -c ugrep -l json -d 'Output file matches in JSON'
@@ -64,7 +64,7 @@ $matchers{-G,--basic-regexp}'[Interpret patterns as basic regular expressions (B '(1)*'--include-dir=-'[Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/]' '(1)*'--include-from=-'[Read the globs from FILE and search only files and directories whose name matches one or more globs]' '(1)*'--include-fs=-'[Only file systems specified by MOUNTS are included in recursive searches]'---index'[Perform index-based recursive search]'+--index'[Perform fast index-based recursive search]' {-J,--jobs=-}'[Specifies the number of threads spawned to search files]:NUM:( )' {-j,--smart-case}'[Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter]' --json'[Output file matches in JSON]'
@@ -64,7 +64,7 @@ $matchers{-G,--basic-regexp}'[Interpret patterns as basic regular expressions (B '(1)*'--include-dir=-'[Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/]' '(1)*'--include-from=-'[Read the globs from FILE and search only files and directories whose name matches one or more globs]' '(1)*'--include-fs=-'[Only file systems specified by MOUNTS are included in recursive searches]'---index'[Perform index-based recursive search]'+--index'[Perform fast index-based recursive search]' {-J,--jobs=-}'[Specifies the number of threads spawned to search files]:NUM:( )' {-j,--smart-case}'[Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter]' --json'[Output file matches in JSON]'
@@ -64,7 +64,7 @@ $matchers{-G,--basic-regexp}'[Interpret patterns as basic regular expressions (B '(1)*'--include-dir=-'[Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/]' '(1)*'--include-from=-'[Read the globs from FILE and search only files and directories whose name matches one or more globs]' '(1)*'--include-fs=-'[Only file systems specified by MOUNTS are included in recursive searches]'---index'[Perform index-based recursive search]'+--index'[Perform fast index-based recursive search]' {-J,--jobs=-}'[Specifies the number of threads spawned to search files]:NUM:( )' {-j,--smart-case}'[Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter]' --json'[Output file matches in JSON]'
@@ -64,7 +64,7 @@ $matchers{-G,--basic-regexp}'[Interpret patterns as basic regular expressions (B '(1)*'--include-dir=-'[Only directories whose name matches GLOB are included in recursive searches, same as -g GLOB/]' '(1)*'--include-from=-'[Read the globs from FILE and search only files and directories whose name matches one or more globs]' '(1)*'--include-fs=-'[Only file systems specified by MOUNTS are included in recursive searches]'---index'[Perform index-based recursive search]'+--index'[Perform fast index-based recursive search]' {-J,--jobs=-}'[Specifies the number of threads spawned to search files]:NUM:( )' {-j,--smart-case}'[Perform case insensitive matching, unless a pattern is specified with a literal upper case ASCII letter]' --json'[Output file matches in JSON]'
completions/zsh/_ugrep-indexer
@@ -0,0 +1,22 @@+#compdef ugrep-indexer++# zsh completions for 'ugrep-indexer'++local arguments=(+{--accuracy=-,-0,-1,-2,-3,-4,-5,-6,-7,-8,-9}'[Specifies indexing accuracy, the default is 4]'+{--hidden,-.}'[Index hidden files and directories]'+'(-)'{--help,-?}'[Display a help message and exit]'+{-c,--check}'[Recursively check and report indexes without reindexing files]'+{-d,--delete}'[Recursively remove index files]'+{-f,--force}'[Force reindexing of files]'+{-I,--ignore-binary}'[Do not index binary files]'+{-q,--quiet,--silent}'[Quiet mode: do not display indexing statistics]'+{-S,--dereference-files}'[Follow symbolic links to files]'+{-s,--no-messages}'[Silent mode: nonexistent and unreadable files are ignored, i.e. their error messages and warnings are suppressed]'+{-V,--version}'[Display version with linked libraries and exit]'+{-v,--verbose}'[Produce verbose output]'+'(1)*'{-X,--ignore-files}'[Do not index files and directories matching the globs in FILE encountered during indexing]'+{-z,--decompress}'[Index the contents of compressed files and archives]'+--zmax=-'[When used with option -z (--decompress), indexes the contents of compressed files and archives stored within archives by up to NUM expansion levels deep]'+)+_arguments -s -S $arguments
@@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.72 for ugrep 6.2.0.+# Generated by GNU Autoconf 2.72 for ugrep 6.3.0. # # Report bugs to <https://github.com/Genivia/ugrep/issues>. #@@ -606,8 +606,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ugrep' PACKAGE_TARNAME='ugrep'-PACKAGE_VERSION='6.2.0'-PACKAGE_STRING='ugrep 6.2.0'+PACKAGE_VERSION='6.3.0'+PACKAGE_STRING='ugrep 6.3.0' PACKAGE_BUGREPORT='https://github.com/Genivia/ugrep/issues' PACKAGE_URL='https://ugrep.com' @@ -1382,7 +1382,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF-'configure' configures ugrep 6.2.0 to adapt to many kinds of systems.+'configure' configures ugrep 6.3.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1453,7 +1453,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in- short | recursive ) echo "Configuration of ugrep 6.2.0:";;+ short | recursive ) echo "Configuration of ugrep 6.3.0:";; esac cat <<\_ACEOF @@ -1630,7 +1630,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF-ugrep configure 6.2.0+ugrep configure 6.3.0 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc.@@ -2184,7 +2184,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by ugrep $as_me 6.2.0, which was+It was created by ugrep $as_me 6.3.0, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw@@ -3694,7 +3694,7 @@ fi # Define the identity of the package. PACKAGE='ugrep'- VERSION='6.2.0'+ VERSION='6.3.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h@@ -11790,7 +11790,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log="-This file was extended by ugrep $as_me 6.2.0, which was+This file was extended by ugrep $as_me 6.3.0, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES@@ -11863,7 +11863,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\-ugrep config.status 6.2.0+ugrep config.status 6.3.0 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\"
@@ -1,4 +1,4 @@-AC_INIT([ugrep],[6.2.0],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com])+AC_INIT([ugrep],[6.3.0],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com]) AM_INIT_AUTOMAKE([foreign subdir-objects dist-xz no-dist-gzip]) AC_CONFIG_HEADERS([config.h]) AC_COPYRIGHT([Copyright (C) 2019-2024 Robert van Engelen, Genivia Inc.])
@@ -1489,7 +1489,7 @@ class Matcher : public PatternMatcher<reflex::Pattern> { std::vector<int> lap_; ///< lookahead position in input that heads a lookahead match (indexed by lookahead number) std::stack<Stops> stk_; ///< stack to push/pop stops FSM fsm_; ///< local state for FSM code- bool (Matcher::* adv_)(size_t loc); ///< advance FIND+ bool (Matcher::* adv_)(size_t loc); ///< advance FIND function pointer bool mrk_; ///< indent \i or dedent \j in pattern found: should check and update indent stops bool anc_; ///< match is anchored, advance slowly to retry when searching };
@@ -71,7 +71,7 @@ class Pattern { friend class FuzzyMatcher; ///< permit access by the reflex::FuzzyMatcher engine public: typedef uint8_t Pred; ///< predict match bits- typedef uint16_t Hash; ///< hash value type, max value is Const::HASH+ typedef uint32_t Hash; ///< hash value type, max value is Const::HASH typedef uint32_t Index; ///< index into opcodes array Pattern::opc_ and subpattern indexing typedef uint32_t Accept; ///< group capture index typedef uint32_t Opcode; ///< 32 bit opcode word@@ -358,7 +358,7 @@ class Pattern { inline bool predict_match(const char *s, size_t n) const { Hash h = static_cast<uint8_t>(*s);- Pred f = pmh_[h] & 1;+ Hash f = pmh_[h] & 1; h = hash(h, static_cast<uint8_t>(*++s)); f |= pmh_[h] & 2; h = hash(h, static_cast<uint8_t>(*++s));@@ -366,7 +366,7 @@ class Pattern { h = hash(h, static_cast<uint8_t>(*++s)); f |= pmh_[h] & 8; const char *e = s + n - 3;- Pred m = 16;+ Hash m = 16; while (f == 0 && ++s < e) { h = hash(h, static_cast<uint8_t>(*s));@@ -946,11 +946,14 @@ class Pattern { void graph_dfa(const DFA::State *start) const; void export_code() const; void analyze_dfa(DFA::State *start);- void gen_predict_match(std::set<DFA::State*> states);- void gen_predict_match_start(std::set<DFA::State*> states, std::map<DFA::State*,ORanges<Hash> >& hashes);+ void gen_min(std::set<DFA::State*>& states);+ void gen_min_start(std::set<DFA::State*>& states, std::set<DFA::State*>& next);+ void gen_min_transitions(size_t level, std::set<DFA::State*>& next);+ void gen_predict_match(std::set<DFA::State*>& states);+ void gen_predict_match_start(std::set<DFA::State*>& states, std::map<DFA::State*,ORanges<Hash> >& hashes); void gen_predict_match_transitions(size_t level, DFA::State *state, const ORanges<Hash>& labels, std::map<DFA::State*,ORanges<Hash> >& hashes);- void gen_match_hfa(DFA::State* start);- void gen_match_hfa_start(DFA::State* start, HFA::State& index, HFA::StateHashes& hashes);+ void gen_match_hfa(DFA::State *start);+ void gen_match_hfa_start(DFA::State *start, HFA::State& index, HFA::StateHashes& hashes); bool gen_match_hfa_transitions(size_t level, size_t& max_level, DFA::State *state, const HFA::HashRanges& previous, HFA::State& index, HFA::StateHashes& hashes); public: bool has_hfa() const@@ -961,8 +964,8 @@ class Pattern { private: bool match_hfa_transitions(size_t level, const HFA::Hashes& hashes, const uint8_t *indexed, size_t size, HFA::VisitSet& visit, HFA::VisitSet& next_visit, bool& accept) const; void write_predictor(FILE *fd) const;- void write_namespace_open(FILE* fd) const;- void write_namespace_close(FILE* fd) const;+ void write_namespace_open(FILE *fd) const;+ void write_namespace_close(FILE *fd) const; size_t find_at( Location loc, char c) const@@ -1145,7 +1148,7 @@ class Pattern { /// file indexing hash 0 <= indexhash() < 65536, must be additive: indexhash(x,b+1) = indexhash(x,b)+1 modulo 2^16. static inline Hash indexhash(Hash h, uint8_t b) {- return (h << 6) - h - h - h + b;+ return static_cast<uint16_t>((h << 6) - h - h - h + b); } Option opt_; ///< pattern compiler options HFA hfa_; ///< indexing hash finite state automaton
@@ -319,7 +319,7 @@ void Pattern::init(const char *options, const uint8_t *pred) } // needle count and frequency thresholds to enable needle-based search uint16_t pinmax = 8;- uint8_t freqmax = 251;+ uint16_t freqmax = 251; #if defined(HAVE_AVX512BW) || defined(HAVE_AVX2) || defined(HAVE_SSE2) if (have_HW_AVX512BW() || have_HW_AVX2()) pinmax = 16;@@ -338,16 +338,19 @@ void Pattern::init(const char *options, const uint8_t *pred) lcs_ = 0; uint16_t nlcp = 65535; // max and undefined uint16_t nlcs = 65535; // max and undefined- uint8_t freqlcp = 255; // max- uint8_t freqlcs = 255; // max+ uint8_t freqlcp = 255; // max and undefined+ uint8_t freqlcs = 255; // max and undefined size_t min = (min_ == 0 ? 1 : min_);- for (uint16_t k = 0; k < min; ++k)+ uint8_t score[8][3]; // avg freq, unique position k < min, number of pins n <= pinmax+ size_t scores = 0;+ for (uint8_t k = 0; k < min; ++k) { Pred mask = 1 << k;- uint16_t n = 0;- uint8_t max = 0;- // at position k count the matching characters and find the max character frequency- for (uint16_t i = 0; i < 256; ++i)+ uint8_t n = 0;+ uint16_t max = 0;+ uint16_t sum = 0;+ // at position k count the matching characters and find the max and sum character frequency+ for (uint16_t i = 0; i < 256 && n <= pinmax; ++i) { if ((bit_[i] & mask) == 0) {@@ -355,40 +358,63 @@ void Pattern::init(const char *options, const uint8_t *pred) uint8_t freq = frequency(static_cast<uint8_t>(i)); if (freq > max) max = freq;+ sum += freq; } }- if (n <= pinmax)+ if (n > 0 && n <= pinmax && max <= freqmax) {- // pick the fewest and rarest (less frequently occurring) needles to search- if (max < freqlcp || (n < nlcp && max == freqlcp))- {- lcs_ = lcp_;- nlcs = nlcp;- freqlcs = freqlcp;- lcp_ = static_cast<uint8_t>(k);- nlcp = n;- freqlcp = max;- }- else if (n < nlcs ||- (n == nlcs &&- (max < freqlcs ||- abs(static_cast<int>(lcp_) - static_cast<int>(lcs_)) < abs(static_cast<int>(lcp_) - static_cast<int>(k)))))+ // score average frequency, twice penalize pins > 8+ uint8_t m = static_cast<uint8_t>(std::min((sum + n - 1) / n * ((n > 8) + 1), 255));+ size_t i;+ for (i = 0; i < scores; ++i) {- lcs_ = static_cast<uint8_t>(k);- nlcs = n;- freqlcs = max;+ // keep scores sorted by average (mean) frequency+ if (score[i][0] > m || (score[i][0] == m && score[i][2] > n))+ {+ memmove(score[i+1], score[i], static_cast<uint8_t*>(score[scores]) - static_cast<uint8_t*>(score[i]));+ break;+ } }+ score[i][0] = m;+ score[i][1] = k;+ score[i][2] = n;+ ++scores; } }- // one position to pin: make lcp and lcs equal to 0 (only one position at 0)- if (min == 1 || nlcs == 65535)+ if (scores == 1) {- nlcs = nlcp;- lcs_ = lcp_;+ freqlcp = freqlcs = score[0][0];+ lcp_ = lcs_ = score[0][1];+ nlcp = nlcs = score[0][2];+ }+ else if (scores >= 2)+ {+ freqlcp = score[0][0];+ lcp_ = score[0][1];+ nlcp = score[0][2];+ freqlcs = score[1][0];+ lcs_ = score[1][1];+ nlcs = score[1][2];+ if (scores > 2)+ {+ if (lcp_ + 1 == lcs_ || lcs_ + 1 == lcp_ || nlcs > 8)+ {+ for (size_t i = 2; i < scores; ++i)+ {+ if (score[i][2] <= 8 && abs(lcp_ - lcs_) < abs(lcp_ - score[i][1]))+ {+ freqlcs = score[i][0];+ lcs_ = score[i][1];+ nlcs = score[i][2];+ break;+ }+ }+ }+ } } // number of needles required- uint16_t n = nlcp > nlcs ? nlcp : nlcs;- DBGLOG("min=%zu lcp=%hu(%hu) pin=%hu nlcp=%hu(%hu) freq=%hu(%hu) npy=%zu", min, lcp_, lcs_, n, nlcp, nlcs, freqlcp, freqlcs, npy_);+ uint16_t n = std::max(nlcp, nlcs);+ DBGLOG("min=%zu lcp=%hu(%hu) pin=%hu nlcp=%hu(%hu) freq=%hu(%hu) npy=%zu cut=%u", min, lcp_, lcs_, n, nlcp, nlcs, freqlcp, freqlcs, npy_, cut_); // determine if a needle-based search is worthwhile, below or meeting the thresholds if (n <= pinmax && freqlcp <= freqmax) {@@ -405,7 +431,7 @@ void Pattern::init(const char *options, const uint8_t *pred) if ((bit_[i] & masklcs) == 0) chr_[k++] = static_cast<uint8_t>(i); }- // fill up the rest of the character tables with duplicates if necessary+ // fill up the rest of the character tables with duplicates as necessary for (; j < n; ++j) chr_[j] = chr_[j - 1]; for (; k < 2*n; ++k)@@ -3820,16 +3846,9 @@ void Pattern::analyze_dfa(DFA::State *start) // make a cut? bool make_cut = false; if (has_backedge)- { make_cut = (max_count > 4 || max_freq > 251);- }- else if (cut_span >= 3 && prev_min_count < 0xffff)- {- make_cut = (prev_min_count > 2 * min_count ||- (prev_min_count > 16 && min_count <= 16) ||- (prev_min_count > 8 && min_count <= 8) ||- (prev_min_count > 1 && min_count <= 1));- }+ else+ make_cut = (cut_span >= 3 && prev_min_count < 0xffff && prev_min_count > 8 && prev_min_count >= 2 * min_count); if (make_cut) { // determine if this is a better cut than the last@@ -3915,8 +3934,7 @@ void Pattern::analyze_dfa(DFA::State *start) if (cut_span > best_cut_span) better = true; else if (cut_span >= 2 || cut_span == best_cut_span)- better = ((best_min_count > 16 && min_count <= 16) ||- (best_min_count > 8 && min_count <= 8));+ better = (best_min_count > min_count); } if (better) {@@ -4201,23 +4219,23 @@ void Pattern::analyze_dfa(DFA::State *start) DBGLOG("END Pattern::analyze_dfa()"); } -void Pattern::gen_predict_match(std::set<DFA::State*> states)+void Pattern::gen_min(std::set<DFA::State*>& states) {+ // find min between 0 and 8 min_ = 8;- std::map<DFA::State*,ORanges<Hash> > hashes[8];- gen_predict_match_start(states, hashes[0]);- for (int level = 1; level < 8; ++level)- for (std::map<DFA::State*,ORanges<Hash> >::iterator from = hashes[level - 1].begin(); from != hashes[level - 1].end(); ++from)- gen_predict_match_transitions(level, from->first, from->second, hashes[level]);+ std::set<DFA::State*> next;+ gen_min_start(states, next);+ for (size_t level = 1; level < min_; ++level)+ gen_min_transitions(level, next); } -void Pattern::gen_predict_match_start(std::set<DFA::State*> states, std::map<DFA::State*,ORanges<Hash> >& hashes)+void Pattern::gen_min_start(std::set<DFA::State*>& states, std::set<DFA::State*>& next) { bool empty = true; for (std::set<DFA::State*>::iterator it = states.begin(); it != states.end(); ++it) { DFA::State *state = *it;- if (!state->edges.empty())+ if (empty && !state->edges.empty()) empty = false; for (DFA::State::Edges::iterator edge = state->edges.begin(); edge != state->edges.end(); ++edge) {@@ -4225,25 +4243,91 @@ void Pattern::gen_predict_match_start(std::set<DFA::State*> states, std::map<DFA if (is_meta(lo)) { min_ = 0;- break;+ return; } DFA::State *next_state = edge->second.second; // ignore edges from a state to a state with breadth-first depth <= cut if (next_state != NULL && lbk_ > 0) if (next_state->first > 0 && next_state->first <= cut_) continue;- if (next_state != NULL && (next_state->edges.empty() || is_meta(next_state->edges.begin()->first)))+ // don't visit next state if it is accepting or when any edges from it are meta+ if (next_state != NULL && (next_state->accept > 0 || next_state->edges.empty() || is_meta(next_state->edges.rbegin()->first))) next_state = NULL;+ if (next_state != NULL)+ next.insert(next_state);+ else+ min_ = 1;+ }+ }+ if (empty)+ min_ = 0;+}++void Pattern::gen_min_transitions(size_t level, std::set<DFA::State*>& next)+{+ std::set<DFA::State*> prev;+ prev.swap(next);+ for (std::set<DFA::State*>::iterator from = prev.begin(); from != prev.end(); ++from)+ {+ DFA::State *state = *from;+ for (DFA::State::Edges::iterator edge = state->edges.begin(); edge != state->edges.end(); ++edge)+ {+ Char lo = edge->first;+ if (is_meta(lo))+ {+ min_ = level;+ return;+ }+ DFA::State *next_state = level < 7 ? edge->second.second : NULL;+ // ignore edges from a state to a state with breadth-first depth <= cut+ if (next_state != NULL && lbk_ > 0)+ if (next_state->first > 0 && next_state->first <= cut_)+ continue;+ // don't visit next state if it is accepting or when any edges from it are meta+ if (next_state != NULL && (next_state->accept > 0 || next_state->edges.empty() || is_meta(next_state->edges.rbegin()->first)))+ next_state = NULL;+ if (next_state != NULL)+ next.insert(next_state);+ else if (min_ > level)+ min_ = level + 1;+ }+ }+}++void Pattern::gen_predict_match(std::set<DFA::State*>& states)+{+ // find min between 0 and 8 then populate bitap and PM hashes (bounded by min)+ gen_min(states);+ std::map<DFA::State*,ORanges<Hash> > hashes[8];+ gen_predict_match_start(states, hashes[0]);+ for (size_t level = 1; level < std::max<size_t>(min_, 4); ++level)+ for (std::map<DFA::State*,ORanges<Hash> >::iterator from = hashes[level - 1].begin(); from != hashes[level - 1].end(); ++from)+ gen_predict_match_transitions(level, from->first, from->second, hashes[level]);+}++void Pattern::gen_predict_match_start(std::set<DFA::State*>& states, std::map<DFA::State*,ORanges<Hash> >& hashes)+{+ for (std::set<DFA::State*>::iterator it = states.begin(); it != states.end(); ++it)+ {+ DFA::State *state = *it; // state at level 0+ for (DFA::State::Edges::iterator edge = state->edges.begin(); edge != state->edges.end(); ++edge)+ {+ Char lo = edge->first;+ if (is_meta(lo))+ break;+ // next level state to visit+ DFA::State *next_state = edge->second.second;+ // ignore states before the cut, since we don't use them for bitap and PM hashing+ if (next_state != NULL && lbk_ > 0)+ if (next_state->first > 0 && next_state->first <= cut_)+ continue; bool accept = next_state == NULL || next_state->accept > 0 || is_meta(next_state->edges.rbegin()->first); Char hi = edge->second.first; if (next_state != NULL) hashes[next_state].insert(lo, hi); uint8_t mask = ~(1 << 6); if (accept)- { mask &= ~(1 << 7);- min_ = 1;- } for (Char ch = lo; ch <= hi; ++ch) { bit_[ch] &= ~1;@@ -4253,43 +4337,39 @@ void Pattern::gen_predict_match_start(std::set<DFA::State*> states, std::map<DFA DBGLOG("0 bitap %u..%u -> %p", lo, hi, next_state); } }- if (empty)- min_ = 0; } -void Pattern::gen_predict_match_transitions(size_t level, DFA::State *state, const ORanges<Hash>& previous, std::map<DFA::State*,ORanges<Hash> >& hashes)+void Pattern::gen_predict_match_transitions(size_t level, DFA::State *state, const ORanges<Hash>& previous, std::map<DFA::State*,ORanges<Hash> >& level_hashes) { for (DFA::State::Edges::iterator edge = state->edges.begin(); edge != state->edges.end(); ++edge) { Char lo = edge->first; if (is_meta(lo))- {- if (min_ > level)- min_ = level; break;- }- DFA::State *next_state = level < 7 ? edge->second.second : NULL;- // ignore edges from a state to a state with breadth-first depth <= cut+ // next level state to visit+ DFA::State *next_state = edge->second.second;+ // ignore states before the cut, since we don't use them for bitap and PM hashing if (next_state != NULL && lbk_ > 0) if (next_state->first > 0 && next_state->first <= cut_) continue;- if (next_state != NULL && (next_state->edges.empty() || is_meta(next_state->edges.begin()->first)))- next_state = NULL; bool accept = next_state == NULL || next_state->accept > 0 || is_meta(next_state->edges.rbegin()->first);- ORanges<Hash> *next_hashes = next_state != NULL ? &hashes[next_state] : NULL;- if (accept && min_ > level)- min_ = level + 1;+ ORanges<Hash> *next_hashes = next_state != NULL && level + 1 < std::max<size_t>(min_, 4) ? &level_hashes[next_state] : NULL;+ Char hi = edge->second.first;+ if (level < min_)+ {+ // populate bitap+ uint8_t mask = ~(1 << level);+ for (Char ch = lo; ch <= hi; ++ch)+ bit_[ch] &= mask;+ DBGLOG("%zu bitap %p: %u..%u -> %p", level, state, lo, hi, next_state);+ } if (level < 4) {+ // populate PM4 uint8_t pmh_mask = ~(1 << level); uint8_t pma_mask = ~(1 << (6 - 2 * level)); if (level == 3 || accept) pma_mask &= ~(1 << (7 - 2 * level));- Char hi = edge->second.first;- if (level <= min_)- for (Char ch = lo; ch <= hi; ++ch)- bit_[ch] &= pmh_mask;- DBGLOG("%zu bitap %p: %u..%u -> %p", level, state, lo, hi, next_state); if (next_hashes != NULL) { for (ORanges<Hash>::iterator prev_range = previous.begin(); prev_range != previous.end(); ++prev_range)@@ -4326,13 +4406,9 @@ void Pattern::gen_predict_match_transitions(size_t level, DFA::State *state, con } } }- else if (level <= min_)+ else if (level < min_) { uint8_t pmh_mask = ~(1 << level);- Char hi = edge->second.first;- for (Char ch = lo; ch <= hi; ++ch)- bit_[ch] &= pmh_mask;- DBGLOG("%zu bitap %p: %u..%u -> %p", level, state, lo, hi, next_state); if (next_hashes != NULL) { for (ORanges<Hash>::iterator prev_range = previous.begin(); prev_range != previous.end(); ++prev_range)@@ -4370,7 +4446,7 @@ void Pattern::gen_predict_match_transitions(size_t level, DFA::State *state, con } } -void Pattern::gen_match_hfa(DFA::State* start)+void Pattern::gen_match_hfa(DFA::State *start) { size_t max_level = HFA::MAX_DEPTH - 1; // max level from start state(s) is reduced when hashes exponentially increase HFA::State index = 1; // DFA states are enumarated for breadth-first matching with the state visit set in match_hfa()@@ -4515,7 +4591,7 @@ bool Pattern::match_hfa_transitions(size_t level, const HFA::Hashes& hashes, con if (level == 0 || visit.test(next->first)) { bool all = true;- for (size_t offset = std::max(static_cast<size_t>(7), level) - 7; offset <= level; ++offset)+ for (size_t offset = std::max<size_t>(7, level) - 7; offset <= level; ++offset) { uint8_t mask = 1 << (level - offset); bool flag = false;
@@ -1,4 +1,4 @@-.TH UGREP "1" "July 09, 2024" "ugrep 6.2.0" "User Commands"+.TH UGREP "1" "July 31, 2024" "ugrep 6.3.0" "User Commands" .SH NAME \fBugrep\fR, \fBug\fR -- file pattern searcher .SH SYNOPSIS@@ -249,6 +249,8 @@ font properties `n' (normal), `f' (faint), `h' (highlight), `i' (invert), `u' (underline). Parameter `hl' enables file name hyperlinks. Parameter `rv' reverses the `sl=' and `cx=' parameters when option \fB\-v\fR is specified. Selectively overrides GREP_COLORS.+Legacy grep single parameter codes may be specified, for example+\fB\-\-colors\fR='7;32' or \fB\-\-colors\fR=ig to set ms (match selected). .TP \fB\-\-config\fR[=\fIFILE\fR], \fB\-\-\-\fR[\fIFILE\fR] Use configuration FILE. The default FILE is `.ugrep'. The working@@ -546,17 +548,17 @@ same as \fB\-\-include\-fs\fR=. (dot). Note that \fB\-\-exclude\-fs\fR=\fIMOUNTS priority over \fB\-\-include\-fs\fR=\fIMOUNTS\fR. This option may be repeated. .TP \fB\-\-index\fR-Perform index\-based recursive search. This option assumes, but-does not require, that files are indexed with ugrep\-indexer. This-option accelerates recursive searching by skipping non\-matching-files, archives and compressed files when indexed. Significant+Perform fast index\-based recursive search. This option assumes,+but does not require, that files are indexed with ugrep\-indexer.+This option also enables option \fB\-r\fR or \fB\-\-recursive\fR. Skips indexed+non\-matching files, archives and compressed files. Significant acceleration may be achieved on cold (not file\-cached) and large file systems, or any file system that is slow to search. Note that-the start\-up time to search is increased, which may be significant-when complex search patterns are specified that contain large-Unicode character classes combined with `*' or `+' repeats, which-should be avoided. Option \fB\-U\fR (\fB\-\-ascii\fR) improves performance.-Option \fB\-\-stats\fR displays an index search report.+the start\-up time to search may be increased when complex search+patterns are specified that contain large Unicode character classes+combined with `*' or `+' repeats, which should be avoided. Option+\fB\-U\fR (\fB\-\-ascii\fR) improves performance. Option \fB\-\-stats\fR displays an+index search report. .TP \fB\-J\fR \fINUM\fR, \fB\-\-jobs\fR=\fINUM\fR Specifies the number of threads spawned to search files. By
@@ -1,4 +1,4 @@-.TH UGREP-INDEXER "1" "July 09, 2024" "ugrep-indexer 6.2.0" "User Commands"+.TH UGREP-INDEXER "1" "July 31, 2024" "ugrep-indexer 6.3.0" "User Commands" .SH NAME \fBugrep-indexer\fR -- file indexer to accelerate recursive searching .SH SYNOPSIS
@@ -1,4 +1,4 @@-.TH UGREP "1" "July 09, 2024" "ugrep 6.2.0" "User Commands"+.TH UGREP "1" "July 31, 2024" "ugrep 6.3.0" "User Commands" .SH NAME \fBugrep\fR, \fBug\fR -- file pattern searcher .SH SYNOPSIS@@ -249,6 +249,8 @@ font properties `n' (normal), `f' (faint), `h' (highlight), `i' (invert), `u' (underline). Parameter `hl' enables file name hyperlinks. Parameter `rv' reverses the `sl=' and `cx=' parameters when option \fB\-v\fR is specified. Selectively overrides GREP_COLORS.+Legacy grep single parameter codes may be specified, for example+\fB\-\-colors\fR='7;32' or \fB\-\-colors\fR=ig to set ms (match selected). .TP \fB\-\-config\fR[=\fIFILE\fR], \fB\-\-\-\fR[\fIFILE\fR] Use configuration FILE. The default FILE is `.ugrep'. The working@@ -546,17 +548,17 @@ same as \fB\-\-include\-fs\fR=. (dot). Note that \fB\-\-exclude\-fs\fR=\fIMOUNTS priority over \fB\-\-include\-fs\fR=\fIMOUNTS\fR. This option may be repeated. .TP \fB\-\-index\fR-Perform index\-based recursive search. This option assumes, but-does not require, that files are indexed with ugrep\-indexer. This-option accelerates recursive searching by skipping non\-matching-files, archives and compressed files when indexed. Significant+Perform fast index\-based recursive search. This option assumes,+but does not require, that files are indexed with ugrep\-indexer.+This option also enables option \fB\-r\fR or \fB\-\-recursive\fR. Skips indexed+non\-matching files, archives and compressed files. Significant acceleration may be achieved on cold (not file\-cached) and large file systems, or any file system that is slow to search. Note that-the start\-up time to search is increased, which may be significant-when complex search patterns are specified that contain large-Unicode character classes combined with `*' or `+' repeats, which-should be avoided. Option \fB\-U\fR (\fB\-\-ascii\fR) improves performance.-Option \fB\-\-stats\fR displays an index search report.+the start\-up time to search may be increased when complex search+patterns are specified that contain large Unicode character classes+combined with `*' or `+' repeats, which should be avoided. Option+\fB\-U\fR (\fB\-\-ascii\fR) improves performance. Option \fB\-\-stats\fR displays an+index search report. .TP \fB\-J\fR \fINUM\fR, \fB\-\-jobs\fR=\fINUM\fR Specifies the number of threads spawned to search files. By
@@ -30,7 +30,7 @@ @file cnf.cpp @brief CNF class for normalization of Boolean search queries @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file cnf.hpp @brief CNF class for normalization of Boolean search queries @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file flag.hpp @brief Tri-state Flag class and global flags set by options @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -198,6 +198,7 @@ extern const char *flag_tag; extern const char *flag_view; extern std::string flag_filter; extern std::string flag_hyperlink_prefix; // internal flag+extern std::string flag_hyperlink_host; // internal flag extern std::string flag_hyperlink_path; // internal flag extern std::string flag_regexp; // internal flag extern std::set<std::string> flag_config_files; // internal flag
@@ -30,7 +30,7 @@ @file mmap.hpp @brief class to manage memory-mapped files @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file output.cpp @brief Output management @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -236,25 +236,7 @@ void Output::header(const char *pathname, const std::string& partname, bool& hea bool hyp = pathname != Static::LABEL_STANDARD_INPUT && color_hl != NULL; // include hyperlinks if (hyp)- {- str(color_hl);- str(flag_hyperlink_prefix);- str("://", 3);- uri(flag_hyperlink_path);- chr('/');- uri(pathname);- if (!(heading && flag_heading) && flag_hyperlink_line)- {- chr(':');- num(lineno);- if (flag_column_number)- {- chr(':');- num(columno);- }- }- str(color_st);- }+ open_hyperlink(pathname, !(heading && flag_heading) && flag_hyperlink_line, lineno, columno); // when a separator is needed bool sep = false;@@ -281,10 +263,7 @@ void Output::header(const char *pathname, const std::string& partname, bool& hea { // --hyperlink: close link if (hyp)- {- str(color_hl);- str(color_st);- }+ close_hyperlink(); str(color_fn); str(color_del);@@ -293,25 +272,7 @@ void Output::header(const char *pathname, const std::string& partname, bool& hea // --hyperlink: open link if (hyp)- {- str(color_hl);- str(flag_hyperlink_prefix);- str("://", 3);- uri(flag_hyperlink_path);- chr('/');- uri(pathname);- if (flag_hyperlink_line)- {- chr(':');- num(lineno);- if (flag_column_number)- {- chr(':');- num(columno);- }- }- str(color_st);- }+ open_hyperlink(pathname, flag_hyperlink_line, lineno, columno); // the next headers should not include this pathname heading = false;@@ -380,10 +341,7 @@ void Output::header(const char *pathname, const std::string& partname, bool& hea // --hyperlink: close link if (hyp)- {- str(color_hl);- str(color_st);- }+ close_hyperlink(); if (flag_byte_offset) {@@ -500,15 +458,7 @@ void Output::header(const char *pathname, const std::string& partname) str(color_fn); if (hyp)- {- str(color_hl);- str(flag_hyperlink_prefix);- str("://", 3);- uri(flag_hyperlink_path);- chr('/');- uri(pathname);- str(color_st);- }+ open_hyperlink(pathname); if (nul) chr('\0');@@ -527,15 +477,7 @@ void Output::header(const char *pathname, const std::string& partname) str(color_fn); if (hyp)- {- str(color_hl);- str(flag_hyperlink_prefix);- str("://", 3);- uri(flag_hyperlink_path);- chr('/');- uri(pathname);- str(color_st);- }+ open_hyperlink(pathname); if (nul) chr('\0');@@ -546,10 +488,7 @@ void Output::header(const char *pathname, const std::string& partname) chr('\0'); if (hyp)- {- str(color_hl);- str(color_st);- }+ close_hyperlink(); } if (!partname.empty())@@ -573,23 +512,12 @@ void Output::binary_file_matches(const char *pathname, const std::string& partna str(color_fn); if (pathname != Static::LABEL_STANDARD_INPUT && color_hl != NULL)- {- str(color_hl);- str(flag_hyperlink_prefix);- str("://", 3);- uri(flag_hyperlink_path);- chr('/');- uri(pathname);- str(color_st);- }+ open_hyperlink(pathname); str(pathname); if (pathname != Static::LABEL_STANDARD_INPUT && color_hl != NULL)- {- str(color_hl);- str(color_st);- }+ close_hyperlink(); if (!partname.empty()) {
@@ -30,7 +30,7 @@ @file output.hpp @brief Output management @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -554,6 +554,40 @@ class Output { chr('0' + (b & 7)); } + // open a hyperlink+ inline void open_hyperlink(const char *pathname, bool linkpos = false, size_t lineno = 0, size_t columno = 0)+ {+ str(color_hl);+ str(flag_hyperlink_prefix);+ str("://", 3);+ uri(flag_hyperlink_host);+ if (*pathname != '/')+ {+ chr('/');+ uri(flag_hyperlink_path);+ chr('/');+ }+ uri(pathname);+ if (linkpos)+ {+ chr(':');+ num(lineno);+ if (flag_column_number)+ {+ chr(':');+ num(columno);+ }+ }+ str(color_st);+ }++ // close the hyperlink+ inline void close_hyperlink()+ {+ str(color_hl);+ str(color_st);+ }+ // output a newline (platform-specific conditional "\r\n" or "\n"); flush if --line-buffered inline void nl(bool lf_only = false) {
@@ -30,7 +30,7 @@ @file query.cpp @brief Query engine TUI @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file query.hpp @brief Query engine and UI @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file screen.cpp @brief ANSI SGR code controlled screen API - static, not thread safe @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file screen.hpp @brief ANSI SGR code controlled screen API - static, not thread safe @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file stats.cpp @brief collect global statistics - static, partially thread-safe @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file stats.hpp @brief collect global statistics - static, partially thread-safe (see below) @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt Thread-safe functions:
@@ -35,7 +35,7 @@ */ // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically here for MSVC++ build from source-#define UGREP_VERSION "6.2.0"+#define UGREP_VERSION "6.3.0" // use a task-parallel thread to decompress the stream into a pipe to search, also handles nested archives #define WITH_DECOMPRESSION_THREAD@@ -806,10 +806,10 @@ bool is_binary(const char *s, size_t n) return false; } -// prime 61 file indexing hash function-inline uint16_t indexhash(uint16_t h, uint8_t b)+// prime 61 mod 2^16 file indexing hash function+inline uint32_t indexhash(uint32_t h, uint8_t b) {- return (h << 6) - h - h - h + b;+ return static_cast<uint16_t>((h << 6) - h - h - h + b); } // index a file to produce hashes[0..hashes_size-1] table, noise, and archive/binary file detection flags@@ -924,7 +924,7 @@ bool index(Stream& stream, const char *pathname, uint8_t *hashes, size_t& hashes while (true) { // compute 8 staggered Bloom filters, hashing 1-grams to 8-grams for N^2 = 64 Bloom hash functions- uint16_t h = window[0];+ uint32_t h = window[0]; hashes[h] &= ~0x01; h = indexhash(h, window[1]); hashes[h] &= ~0x02;@@ -961,7 +961,7 @@ bool index(Stream& stream, const char *pathname, uint8_t *hashes, size_t& hashes for (size_t i = 0; i < winlen; ++i) {- uint16_t h = window[i];+ uint32_t h = window[i]; hashes[h] &= ~0x01; for (size_t j = i + 1, k = 0x02; j < winlen; ++j, k <<= 1) {
@@ -30,7 +30,7 @@ @file ugrep.cpp @brief a pattern search utility @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt User manual:@@ -431,6 +431,7 @@ const char *flag_tag = NULL; const char *flag_view = ""; std::string flag_filter; std::string flag_hyperlink_prefix;+std::string flag_hyperlink_host; std::string flag_hyperlink_path; std::string flag_regexp; std::set<std::string> flag_config_files;@@ -818,7 +819,7 @@ inline void read_line(reflex::AbstractMatcher *matcher, const std::string& line) // copy color buffers inline void copy_color(char to[COLORLEN], const char from[COLORLEN]) {- size_t len = std::min(strlen(from), static_cast<size_t>(COLORLEN - 1));+ size_t len = std::min<size_t>(strlen(from), COLORLEN - 1); memcpy(to, from, len); to[len] = '\0';@@ -1407,7 +1408,7 @@ struct Zthread { memmove(buf, buf + BLOCKSIZE, static_cast<size_t>(len)); // check if archived file meets selection criteria- size_t minlen = static_cast<size_t>(std::min(static_cast<uint64_t>(len), size)); // size_t is OK: len is streamsize but non-negative+ size_t minlen = static_cast<size_t>(std::min<uint64_t>(len, size)); // size_t is OK: len is streamsize but non-negative is_selected = select_matching(archive.c_str(), path.c_str(), buf, minlen, is_regular); // if extended headers are present@@ -1470,7 +1471,7 @@ struct Zthread { while (len > 0 && !stop) {- size_t len_out = static_cast<size_t>(std::min(static_cast<uint64_t>(len), size)); // size_t is OK: len is streamsize but non-negative+ size_t len_out = static_cast<size_t>(std::min<uint64_t>(len, size)); // size_t is OK: len is streamsize but non-negative if (ok) {@@ -1690,7 +1691,7 @@ struct Zthread { while (len > 0 && !stop) {- size_t n = std::min(static_cast<size_t>(len), size);+ size_t n = std::min<size_t>(len, size); char *b = reinterpret_cast<char*>(buf); path.append(b, n);@@ -1742,7 +1743,7 @@ struct Zthread { } // check if archived file meets selection criteria- size_t minlen = std::min(static_cast<size_t>(len), filesize);+ size_t minlen = std::min<size_t>(len, filesize); is_selected = select_matching(archive.c_str(), path.c_str(), buf, minlen, is_regular); // if the pipe is closed, then get a new pipe to search the next part in the archive@@ -1785,7 +1786,7 @@ struct Zthread { while (len > 0 && !stop) {- size_t len_out = std::min(static_cast<size_t>(len), size); // size_t is OK: len is streamsize but non-negative+ size_t len_out = std::min<size_t>(len, size); // size_t is OK: len is streamsize but non-negative if (ok) {@@ -5596,6 +5597,8 @@ void options(std::list<std::pair<CNF::PATTERN,const char*>>& pattern_args, int a flag_ignore_case = false; else if (strcmp(arg, "no-ignore-files") == 0) flag_ignore_files.clear();+ else if (strcmp(arg, "no-index") == 0)+ flag_index = NULL; else if (strcmp(arg, "no-initial-tab") == 0) flag_initial_tab = false; else if (strcmp(arg, "no-invert-match") == 0)@@ -5635,7 +5638,7 @@ void options(std::list<std::pair<CNF::PATTERN,const char*>>& pattern_args, int a else if (strcmp(arg, "neg-regexp") == 0) usage("missing argument for --", arg); else- usage("invalid option --", arg, "--neg-regexp=, --not, --no-any-line, --no-ascii, --no-binary, --no-bool, --no-break, --no-byte-offset, --no-color, --no-config, --no-confirm, --no-decompress, --no-dereference, --no-dereference-files, --no-dotall, --no-empty, --no-filename, --no-filter, --no-glob-ignore-case, --no-group-separator, --no-heading, --no-hidden, --no-hyperlink, --no-ignore-binary, --no-ignore-case, --no-ignore-files --no-initial-tab, --no-invert-match, --no-line-number, --no-only-line-number, --no-only-matching, --no-messages, --no-mmap, --no-pager, --no-pretty, --no-smart-case, --no-sort, --no-split, --no-stats, --no-tree, --no-ungroup, --no-view or --null");+ usage("invalid option --", arg, "--neg-regexp=, --not, --no-any-line, --no-ascii, --no-binary, --no-bool, --no-break, --no-byte-offset, --no-color, --no-config, --no-confirm, --no-decompress, --no-dereference, --no-dereference-files, --no-dotall, --no-empty, --no-filename, --no-filter, --no-glob-ignore-case, --no-group-separator, --no-heading, --no-hidden, --no-hyperlink, --no-ignore-binary, --no-ignore-case, --no-ignore-files, --no-index, --no-initial-tab, --no-invert-match, --no-line-number, --no-only-line-number, --no-only-matching, --no-messages, --no-mmap, --no-pager, --no-pretty, --no-smart-case, --no-sort, --no-split, --no-stats, --no-tree, --no-ungroup, --no-view or --null"); break; case 'o':@@ -7649,7 +7652,8 @@ void set_terminal_hyperlink() gethostname(host, sizeof(host)); #endif - flag_hyperlink_path.assign(host).append("/").append(path);+ flag_hyperlink_host.assign(host);+ flag_hyperlink_path.append(path); free(cwd); @@ -8268,9 +8272,17 @@ void ugrep() flag_after_context = flag_before_context = 0; // --depth: if -R or -r is not specified then enable -r- if ((flag_min_depth > 0 || flag_max_depth > 0) && flag_directories_action == Action::UNSP)+ if (flag_min_depth > 0 || flag_max_depth > 0) flag_directories_action = Action::RECURSE; + // --index: enable -r if -r or -R is not enabled, reject -dskip+ if (flag_index != NULL)+ {+ if (flag_directories_action == Action::SKIP)+ usage("option --index searches recursively, but option -dskip is specified");+ flag_directories_action = Action::RECURSE;+ }+ // -p (--no-dereference) and -S (--dereference): -p takes priority over -S and -R if (flag_no_dereference) flag_dereference = flag_dereference_files = false;@@ -8411,10 +8423,6 @@ void ugrep() if (flag_format_begin != NULL) Output(Static::output).format(flag_format_begin, 0); - // --index: index search is not applicable to non-recursive searching- if (flag_directories_action != Action::RECURSE)- flag_index = NULL;- // --index: search is only possible with compatible options if (flag_index != NULL) {@@ -10995,7 +11003,7 @@ void Grep::search(const char *pathname, uint16_t cost) lineno += matcher->lines() - 1; }- else if (flag_before_context + flag_after_context > 0)+ else { if (restline_size > 0) {@@ -11024,76 +11032,100 @@ void Grep::search(const char *pathname, uint16_t cost) } else {- // do not include additional lines in the match output- const char *to = static_cast<const char*>(memchr(begin, '\n', size));- if (to != NULL)- size = to - begin;-- // length of the match is the number of UTF-8-encoded Unicode characters- size_t length = utf8nlen(begin, size);- size_t fit_length = length;-- if (fit_length > width)- {- if (fit_length > width + 4)- fit_length = width;- width = 0;- }- else- {- width -= fit_length;- }-- if (!nl)+ while (true) {- const char *bol = matcher->bol();- size_t border = matcher->border();- size_t margin = utf8nlen(bol, border);- size_t before = flag_before_context * fit_length / (flag_before_context + flag_after_context);+ // check for additional lines in the match output+ size_t rest = 0;+ const char *to = static_cast<const char*>(memchr(begin, '\n', size));+ if (to != NULL)+ {+ rest = size;+ size = to - begin;+ rest -= size;+ } - if (before < flag_before_context)- before = flag_before_context - before;- else- before = 0;+ // length of the match is the number of UTF-8-encoded Unicode characters+ size_t length = utf8nlen(begin, size);+ size_t fit_length = length; - if (margin > before)+ if (fit_length > width) {- out.str(color_se);- out.str("...", 3);- out.str(color_off);- out.str(color_cx);- out.utf8strn(utf8skipn(bol, border, margin - before), border, before);- out.str(color_off);- width -= before;+ if (fit_length > width + 4)+ fit_length = width;+ width = 0; } else {- if (border > 0)+ width -= fit_length;+ }++ if (!nl)+ {+ const char *bol = matcher->bol();+ size_t border = matcher->border();+ size_t margin = utf8nlen(bol, border);+ size_t before = flag_before_context * fit_length / (flag_before_context + flag_after_context);++ if (before < flag_before_context)+ before = flag_before_context - before;+ else+ before = 0;++ if (margin > before) {+ out.str(color_se);+ out.str("...", 3);+ out.str(color_off); out.str(color_cx);- out.str(bol, border);+ out.utf8strn(utf8skipn(bol, border, margin - before), border, before); out.str(color_off);+ width -= before; }- if (margin >= 3)- width -= margin - 3; else- width += 3 - margin;+ {+ if (border > 0)+ {+ out.str(color_cx);+ out.str(bol, border);+ out.str(color_off);+ }+ if (margin >= 3)+ width -= margin - 3;+ else+ width += 3 - margin;+ } }- } - out.str(match_ms);- if (fit_length == length)- {- out.str(begin, size);- }- else- {- out.utf8strn(begin, size, fit_length);- out.str("[+", 2);- out.num(length - fit_length);- out.chr(']');+ out.str(match_ms);+ if (fit_length == length)+ {+ out.str(begin, size);+ }+ else+ {+ out.utf8strn(begin, size, fit_length);+ out.str("[+", 2);+ out.num(length - fit_length);+ out.chr(']');+ }+ out.str(match_off);++ // no more additional lines to output?+ if (to == NULL)+ break;++ out.nl();++ // output header and repeat to output a multiline match after previous newline+ if (!flag_no_header)+ out.header(pathname, partname, heading, ++lineno, matcher, matcher->first() + (to - begin), flag_separator_bar, false);++ begin = to + 1;+ size = rest - 1;+ width = flag_before_context + flag_after_context;++ nl = true; }- out.str(match_off); const char *eol = matcher->eol(); // warning: call eol() before bol() and end() const char *end = matcher->end();@@ -11105,47 +11137,6 @@ void Grep::search(const char *pathname, uint16_t cost) nl = true; }- else- {- if (flag_multiline)- {- // echo multi-line matches line-by-line- const char *from = begin;- const char *to;-- while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)- {- out.str(match_ms);- out.str(from, to - from);- out.str(match_off);- out.chr('\n');-- out.header(pathname, partname, heading, ++lineno, NULL, matcher->first() + (to - begin) + 1, flag_separator_bar, false);-- from = to + 1;- }-- size -= from - begin;- begin = from;- }-- if (size > 0)- {- bool lf_only = begin[size - 1] == '\n';- size -= lf_only;- if (size > 0)- {- out.str(match_ms);- out.str(begin, size);- out.str(match_off);- }- out.nl(lf_only);- }- else- {- nl = true;- }- } } // --min-count: require at least min-count matches@@ -13878,6 +13869,8 @@ void help(std::ostream& out) (invert), `u' (underline). Parameter `hl' enables file name\n\ hyperlinks. Parameter `rv' reverses the `sl=' and `cx=' parameters\n\ when option -v is specified. Selectively overrides GREP_COLORS.\n\+ Legacy grep single parameter codes may be specified, for example\n\+ --colors='7;32' or --colors=ig to set ms (match selected).\n\ --config[=FILE], ---[FILE]\n\ Use configuration FILE. The default FILE is `.ugrep'. The working\n\ directory is checked first for FILE, then the home directory. The\n\@@ -14159,17 +14152,17 @@ void help(std::ostream& out) #endif "\ --index\n\- Perform index-based recursive search. This option assumes, but\n\- does not require, that files are indexed with ugrep-indexer. This\n\- option accelerates recursive searching by skipping non-matching\n\- files, archives and compressed files when indexed. Significant\n\+ Perform fast index-based recursive search. This option assumes,\n\+ but does not require, that files are indexed with ugrep-indexer.\n\+ This option also enables option -r or --recursive. Skips indexed\n\+ non-matching files, archives and compressed files. Significant\n\ acceleration may be achieved on cold (not file-cached) and large\n\ file systems, or any file system that is slow to search. Note that\n\- the start-up time to search is increased, which may be significant\n\- when complex search patterns are specified that contain large\n\- Unicode character classes combined with `*' or `+' repeats, which\n\- should be avoided. Option -U (--ascii) improves performance.\n\- Option --stats displays an index search report.\n\+ the start-up time to search may be increased when complex search\n\+ patterns are specified that contain large Unicode character classes\n\+ combined with `*' or `+' repeats, which should be avoided. Option\n\+ -U (--ascii) improves performance. Option --stats displays an\n\+ index search report.\n\ -J NUM, --jobs=NUM\n\ Specifies the number of threads spawned to search files. By\n\ default an optimum number of threads is spawned to search files\n\
@@ -30,7 +30,7 @@ @file ugrep.hpp @brief a pattern search utility @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */ @@ -38,7 +38,7 @@ #define UGREP_HPP // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically here for MSVC++ build from source-#define UGREP_VERSION "6.2.0"+#define UGREP_VERSION "6.3.0" // disable mmap because mmap is almost always slower than the file reading speed improvements since 3.0.0 #define WITH_NO_MMAP
@@ -30,7 +30,7 @@ @file vkey.cpp @brief Virtual terminal keyboard input API - static, not thread safe @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file vkey.hpp @brief Virtual terminal keyboard input API - static, not thread safe @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2022, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt Supports Unix/Linux, MacOS, DOS, and Windows.
@@ -30,7 +30,7 @@ @file zstream.hpp @brief file decompression streams - zstreambuf extends std::streambuf @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
@@ -30,7 +30,7 @@ @file zthread.hpp @brief file decompression threads @author Robert van Engelen - engelen@genivia.com-@copyright (c) 2019-2023, Robert van Engelen, Genivia Inc. All rights reserved.+@copyright (c) 2019,2024, Robert van Engelen, Genivia Inc. All rights reserved. @copyright (c) BSD-3 License - see LICENSE.txt */
tests/out/Hello_SnS-I-onC10.out
@@ -1,4 +1,8 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m[1;34m public s[m[1;36m...[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m6[m[1;36m:[m[1;34m [m[1;4;32m}[m-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m+[1;35mHello.java[m[1;36m|[m[32;1m7[m[1;36m|[m[1;4;32m}[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m
tests/out/Hello_SnS-W-onC10.out
@@ -1,4 +1,5 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m [1;35mHello.class[m[1;36m:[m[32;1m1[m[1;36m:[m [1;32m00000000[m [m[1;34m -- -- -- -- -- -- -- -- --[m[1;4;32m 1d 0a 00[m[1;34m -- -- -- -- [m[1;36m |[m[1;34m---------[m[1;4;32m[7m][7mJ[7m@[m[1;34m----[m[1;36m|[m [1;35mHello.class[m[1;36m:[m[32;1m2[m[1;36m:[m@@ -13,37 +14,60 @@ [1;32m00000180[m [m[1;34m -- -- -- -- -- --[m[1;4;32m 00 0a 00[m[1;34m -- -- -- -- -- -- -- [m[1;36m |[m[1;34m------[m[1;4;32m[7m@[7mJ[7m@[m[1;34m-------[m[1;36m|[m [1;35mHello.class[m[1;36m:[m[32;1m7[m[1;36m:[m [1;32m00000180[m [m[1;34m -- -- -- -- -- -- -- -- -- --[m[1;4;32m 00 0a 00[m[1;34m -- -- -- [m[1;36m |[m[1;34m----------[m[1;4;32m[7m@[7mJ[7m@[m[1;34m---[m[1;36m|[m-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m[1;34m public s[m[1;36m...[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m6[m[1;36m:[m[1;34m [m[1;4;32m}[m+[1;35mHello.java[m[1;36m|[m[32;1m7[m[1;36m|[m[1;4;32m}[m [1;35mHello.pdf[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m%PDF-1.[m[1;4;32m3[m+[1;35mHello.pdf[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32m%[m [1;35mHello.pdf[m[1;36m:[m[32;1m2[m[1;36m:[m [1;32m00000010[m [m[1;34m -- -- -- --[m[1;4;32m c6 0a 34[m[1;34m -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;34m----[m[1;4;32m[7m.[7mJ[m[1;4;32m4[m[1;34m---------[m[1;36m|[m-[1;35mHello.pdf[m[1;36m:[m[32;1m3[m[1;36m:[m[1;34mÄåòåë§ó ÐÄÆ[m[1;34m4 0 ob[m[1;4;32mj[m[1;34m< [m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m[1;34mtream[m+[1;35mHello.pdf[m[1;36m:[m[32;1m3[m[1;36m:[m[1;34mÄåòåë§ó ÐÄÆ[m[1;34m4 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m<[m[1;34m< /Length 5 0 R /Fi[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m5[m[1;36m|[m[1;4;32ms[m[1;34mtream[m [1;35mHello.pdf[m[1;36m:[m[32;1m5[m[1;36m:[m[1;34mstrea[m[1;4;32mm[m+[1;35mHello.pdf[m[1;36m|[m[32;1m6[m[1;36m|[m[1;4;32mx[m [1;35mHello.pdf[m[1;36m:[m[32;1m6[m[1;36m:[m [1;32m00000050[m [m[1;34m -- --[m[1;4;32m bb 0a 02[m[1;34m -- -- -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;34m--[m[1;4;32m[7m.[7mJ[7mB[m[1;34m-----------[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m7[m[1;36m:[m [1;32m00000080[m [m[1;34m -- -- -- -- -- -- -- -- [m[1;4;32m 59 0a 9f[m[1;34m -- -- -- -- -- [m[1;36m |[m[1;34m--------[m[1;4;32mY[7mJ[7m.[m[1;34m-----[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m8[m[1;36m:[m [1;32m000000c0[m [m[1;34m -- -- -- -- -- -- -- -- [m[1;4;32m a5 0a 65[m[1;34m -- -- -- -- -- [m[1;36m |[m[1;34m--------[m[1;4;32m[7m.[7mJ[m[1;4;32me[m[1;34m-----[m[1;36m|[m-[1;35mHello.pdf[m[1;36m:[m[32;1m9[m[1;36m:[m[1;34mEŽ»[m[1;34mendstrea[m[1;4;32mm[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m10[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m11[m[1;36m:[m[1;34m5 0 ob[m[1;4;32mj[m[1;34m23[m-[1;35mHello.pdf[m[1;36m:[m[32;1m12[m[1;36m:[m[1;34m12[m[1;4;32m3[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m13[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m14[m[1;36m:[m[1;34m2 0 ob[m[1;4;32mj[m[1;34m< /Type /Page /P[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34m 0 612 792[m[1;4;32m][m[1;34m>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m16[m[1;36m:[m[1;34m>[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m17[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m18[m[1;36m:[m[1;34m6 0 ob[m[1;4;32mj[m[1;34m< /ProcSet [ /PD[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34m /TT1 8 0 [m[1;4;32mR[m[1;34m> >>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m20[m[1;36m:[m[1;34m>> >[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m21[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m22[m[1;36m:[m[1;34m9 0 ob[m[1;4;32mj[m[1;34m< /Length 10 0 R[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m23[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m[1;34mtream[m-[1;35mHello.pdf[m[1;36m:[m[32;1m24[m[1;36m:[m[1;34mstrea[m[1;4;32mm[m[1;34m…U]hU>»sg´ -´ƒ?[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m9[m[1;36m:[m[1;34mEŽ»[m[1;34mendstrea[m[1;4;32mm[m+[1;35mHello.pdf[m[1;36m|[m[32;1m10[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m10[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m11[m[1;36m|[m[1;4;32m5[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m11[m[1;36m:[m[1;34m5 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m12[m[1;36m|[m[1;4;32m1[m[1;34m23[m+[1;35mHello.pdf[m[1;36m:[m[32;1m12[m[1;36m:[m[1;34m12[m[1;4;32m3[m+[1;35mHello.pdf[m[1;36m|[m[32;1m13[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m13[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m14[m[1;36m|[m[1;4;32m2[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m14[m[1;36m:[m[1;34m2 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m15[m[1;36m|[m[1;4;32m<[m[1;34m< /Type /Page /Pare[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34m 0 612 792[m[1;4;32m][m+[1;35mHello.pdf[m[1;36m|[m[32;1m16[m[1;36m|[m[1;4;32m>[m[1;34m>[m+[1;35mHello.pdf[m[1;36m:[m[32;1m16[m[1;36m:[m[1;34m>[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m17[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m17[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m18[m[1;36m|[m[1;4;32m6[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m18[m[1;36m:[m[1;34m6 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m19[m[1;36m|[m[1;4;32m<[m[1;34m< /ProcSet [ /PDF /[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34m /TT1 8 0 [m[1;4;32mR[m+[1;35mHello.pdf[m[1;36m|[m[32;1m20[m[1;36m|[m[1;4;32m>[m[1;34m> >>[m+[1;35mHello.pdf[m[1;36m:[m[32;1m20[m[1;36m:[m[1;34m>> >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m21[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m21[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m22[m[1;36m|[m[1;4;32m9[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m22[m[1;36m:[m[1;34m9 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m23[m[1;36m|[m[1;4;32m<[m[1;34m< /Length 10 0 R /N[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m23[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m24[m[1;36m|[m[1;4;32ms[m[1;34mtream[m+[1;35mHello.pdf[m[1;36m:[m[32;1m24[m[1;36m:[m[1;34mstrea[m[1;4;32mm[m+[1;35mHello.pdf[m[1;36m|[m[32;1m25[m[1;36m|[m[1;4;32mx[m[1;34m…U]hU>»sg´ -´ƒ?m [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m25[m[1;36m:[m[1;36m...[m[1;34m>Æ‚¶*6/ö¥¥Å’J5[m[1;4;32m[m+[1;35mHello.pdf[m[1;36m|[m[32;1m26[m[1;36m|[m[1;4;32m[m [1;35mHello.pdf[m[1;36m:[m[32;1m26[m[1;36m:[m [1;32m000003f0[m [m[1;34m -- -- -- -- -- -- -- -- --[m[1;4;32m 9b 0a d0[m[1;34m -- -- -- -- [m[1;36m |[m[1;34m---------[m[1;4;32m[7m.[7mJ[7m.[m[1;34m----[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m27[m[1;36m:[m@@ -51,40 +75,70 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m28[m[1;36m:[m [1;32m00000550[m [m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- -- -- --[m[1;4;32m cc [m[1;36m |[m[1;34m---------------[m[1;4;32m[7m.[m[1;36m|[m [1;32m00000560[m [m[1;4;32m 0a 4b[m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;4;32m[7mJ[m[1;4;32mK[m[1;34m--------------[m[1;36m|[m-[1;35mHello.pdf[m[1;36m:[m[32;1m29[m[1;36m:[m[1;34mZŒ (}Rð;3Û[m[1;36m...[m[1;32m[+1 more][m-[1;35mHello.pdf[m[1;36m:[m[32;1m30[m[1;36m:[m[1;36m...[m[1;34ma4üf,£Tê&Ñ·�“[m[1;4;32m4[m[1;34mndstream[m-[1;35mHello.pdf[m[1;36m:[m[32;1m31[m[1;36m:[m[1;34mendstrea[m[1;4;32mm[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m32[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m0 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m33[m[1;36m:[m[1;34m10 0 ob[m[1;4;32mj[m[1;34m116[m-[1;35mHello.pdf[m[1;36m:[m[32;1m34[m[1;36m:[m[1;34m111[m[1;4;32m6[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m35[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m36[m[1;36m:[m[1;34m7 0 ob[m[1;4;32mj[m[1;34m /ICCBased 9 0 R ][m-[1;35mHello.pdf[m[1;36m:[m[32;1m37[m[1;36m:[m[1;36m...[m[1;34msed 9 0 R [m[1;4;32m][m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m38[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m39[m[1;36m:[m[1;34m3 0 ob[m[1;4;32mj[m[1;34m< /Type /Pages /[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34m 2 0 R ] >[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m41[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m1 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m42[m[1;36m:[m[1;34m11 0 ob[m[1;4;32mj[m[1;34m< /Type /Catalo[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m43[m[1;36m:[m[1;36m...[m[1;34mes 3 0 R >[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m44[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m45[m[1;36m:[m[1;34m8 0 ob[m[1;4;32mj[m[1;34m< /Type /Font /S[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34mtDescripto[m[1;4;32mr[m[1;34m2 0 R /En[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34midths [ 60[m[1;4;32m2[m[1;34m 0 0 0 0 [m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m0 0 0 0 60[m[1;4;32m2[m[1;34m 0 602 ] >>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m49[m[1;36m:[m[1;36m...[m[1;34m 0 602 ] >[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m50[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m2 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m51[m[1;36m:[m[1;34m12 0 ob[m[1;4;32mj[m[1;34m< /Type /FontDe[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34m3 /FontBBo[m[1;4;32mx[m[1;34m-558 -375[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m53[m[1;36m:[m[1;36m...[m[1;34mpHeight 72[m[1;4;32m9[m[1;34mStemV 99 [m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m54[m[1;36m:[m[1;36m...[m[1;34mile2 13 0 [m[1;4;32mR[m[1;34m>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m55[m[1;36m:[m[1;34m>[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m56[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m3 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m57[m[1;36m:[m[1;34m13 0 ob[m[1;4;32mj[m[1;34m< /Length 14 0 [m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m58[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m[1;34mtream[m+[1;35mHello.pdf[m[1;36m:[m[32;1m29[m[1;36m:[m[1;34mZŒ (}Rð;3ÛdvA2Ã�ùî¹çž{Î[m[1;36m...[m[1;32m[+1 more][m+[1;35mHello.pdf[m[1;36m:[m[32;1m30[m[1;36m:[m[1;36m...[m[1;34ma4üf,£Tê&Ñ·�“[m[1;4;32m4[m+[1;35mHello.pdf[m[1;36m|[m[32;1m31[m[1;36m|[m[1;4;32me[m[1;34mndstream[m+[1;35mHello.pdf[m[1;36m:[m[32;1m31[m[1;36m:[m[1;34mendstrea[m[1;4;32mm[m+[1;35mHello.pdf[m[1;36m|[m[32;1m32[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m32[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m33[m[1;36m|[m[1;4;32m1[m[1;34m0 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m33[m[1;36m:[m[1;34m10 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m34[m[1;36m|[m[1;4;32m1[m[1;34m116[m+[1;35mHello.pdf[m[1;36m:[m[32;1m34[m[1;36m:[m[1;34m111[m[1;4;32m6[m+[1;35mHello.pdf[m[1;36m|[m[32;1m35[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m35[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m36[m[1;36m|[m[1;4;32m7[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m36[m[1;36m:[m[1;34m7 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m37[m[1;36m|[m[1;4;32m[[m[1;34m /ICCBased 9 0 R ][m+[1;35mHello.pdf[m[1;36m:[m[32;1m37[m[1;36m:[m[1;36m...[m[1;34msed 9 0 R [m[1;4;32m][m+[1;35mHello.pdf[m[1;36m|[m[32;1m38[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m38[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m39[m[1;36m|[m[1;4;32m3[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m39[m[1;36m:[m[1;34m3 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m40[m[1;36m|[m[1;4;32m<[m[1;34m< /Type /Pages /Med[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34m 2 0 R ] >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m41[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m41[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m42[m[1;36m|[m[1;4;32m1[m[1;34m1 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m42[m[1;36m:[m[1;34m11 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m43[m[1;36m|[m[1;4;32m<[m[1;34m< /Type /Catalog /P[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m43[m[1;36m:[m[1;36m...[m[1;34mes 3 0 R >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m44[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m44[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m45[m[1;36m|[m[1;4;32m8[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m45[m[1;36m:[m[1;34m8 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m46[m[1;36m|[m[1;4;32m<[m[1;34m< /Type /Font /Subt[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34mtDescripto[m[1;4;32mr[m+[1;35mHello.pdf[m[1;36m|[m[32;1m47[m[1;36m|[m[1;4;32m1[m[1;34m2 0 R /Encoding /Ma[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34midths [ 60[m[1;4;32m2[m+[1;35mHello.pdf[m[1;36m|[m[32;1m48[m[1;36m|[m[1;4;32m0[m[1;34m 0 0 0 0 0 0 0 0 0 [m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m0 0 0 0 60[m[1;4;32m2[m+[1;35mHello.pdf[m[1;36m|[m[32;1m49[m[1;36m|[m[1;4;32m0[m[1;34m 0 602 ] >>[m+[1;35mHello.pdf[m[1;36m:[m[32;1m49[m[1;36m:[m[1;36m...[m[1;34m 0 602 ] >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m50[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m50[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m51[m[1;36m|[m[1;4;32m1[m[1;34m2 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m51[m[1;36m:[m[1;34m12 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m52[m[1;36m|[m[1;4;32m<[m[1;34m< /Type /FontDescri[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34m3 /FontBBo[m[1;4;32mx[m+[1;35mHello.pdf[m[1;36m|[m[32;1m53[m[1;36m|[m[1;4;32m[[m[1;34m-558 -375 718 1041][m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m53[m[1;36m:[m[1;36m...[m[1;34mpHeight 72[m[1;4;32m9[m+[1;35mHello.pdf[m[1;36m|[m[32;1m54[m[1;36m|[m[1;4;32m/[m[1;34mStemV 99 /XHeight 5[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m54[m[1;36m:[m[1;36m...[m[1;34mile2 13 0 [m[1;4;32mR[m+[1;35mHello.pdf[m[1;36m|[m[32;1m55[m[1;36m|[m[1;4;32m>[m[1;34m>[m+[1;35mHello.pdf[m[1;36m:[m[32;1m55[m[1;36m:[m[1;34m>[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m56[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m56[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m57[m[1;36m|[m[1;4;32m1[m[1;34m3 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m57[m[1;36m:[m[1;34m13 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m58[m[1;36m|[m[1;4;32m<[m[1;34m< /Length 14 0 R /L[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m58[m[1;36m:[m[1;36m...[m[1;34mteDecode >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m59[m[1;36m|[m[1;4;32ms[m[1;34mtream[m [1;35mHello.pdf[m[1;36m:[m[32;1m59[m[1;36m:[m[1;34mstrea[m[1;4;32mm[m+[1;35mHello.pdf[m[1;36m|[m[32;1m60[m[1;36m|[m[1;4;32mx[m [1;35mHello.pdf[m[1;36m:[m[32;1m60[m[1;36m:[m [1;32m000009c0[m [m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- --[m[1;4;32m 02 0a f8 [m[1;36m |[m[1;34m-------------[m[1;4;32m[7mB[7mJ[7m.[m[1;36m|[m-[1;35mHello.pdf[m[1;36m:[m[32;1m61[m[1;36m:[m[1;34mÝW{xTÅ?sw6¯Í>’MH[m+[1;35mHello.pdf[m[1;36m:[m[32;1m61[m[1;36m:[m[1;34mÝW{xTÅ?sw6¯Í>’MHH€][m [1;35mHello.pdf[m[1;36m:[m[32;1m62[m[1;36m:[m [1;32m00000be0[m [m[1;34m -- -- --[m[1;4;32m 2f 0a ef[m[1;34m -- -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;34m---[m[1;4;32m/[7mJ[7m.[m[1;34m----------[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m63[m[1;36m:[m@@ -119,37 +173,71 @@ [1;32m00001420[m [m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- -- -- --[m[1;4;32m e4 [m[1;36m |[m[1;34m---------------[m[1;4;32m[7m.[m[1;36m|[m [1;32m00001430[m [m[1;4;32m 0a 65[m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;4;32m[7mJ[m[1;4;32me[m[1;34m--------------[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m79[m[1;36m:[m[1;36m...[m[1;32m[+4 more][m-[1;35mHello.pdf[m[1;36m:[m[32;1m80[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m4 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m81[m[1;36m:[m[1;34m14 0 ob[m[1;4;32mj[m[1;34m734[m-[1;35mHello.pdf[m[1;36m:[m[32;1m82[m[1;36m:[m[1;34m273[m[1;4;32m4[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m83[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m5 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m84[m[1;36m:[m[1;34m15 0 ob[m[1;4;32mj[m[1;34mHello)[m-[1;35mHello.pdf[m[1;36m:[m[32;1m85[m[1;36m:[m[1;34m(Hello[m[1;4;32m)[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m86[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m6 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m87[m[1;36m:[m[1;34m16 0 ob[m[1;4;32mj[m[1;34mMac OS X 10.12.[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m88[m[1;36m:[m[1;36m...[m[1;34mPDFContext[m[1;4;32m)[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m89[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m7 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m90[m[1;36m:[m[1;34m17 0 ob[m[1;4;32mj[m[1;34mTextEdit)[m-[1;35mHello.pdf[m[1;36m:[m[32;1m91[m[1;36m:[m[1;34m(TextEdit[m[1;4;32m)[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m92[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m8 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m93[m[1;36m:[m[1;34m18 0 ob[m[1;4;32mj[m[1;34mD:2020012401071[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m94[m[1;36m:[m[1;36m...[m[1;34m711Z00'00'[m[1;4;32m)[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m95[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m9 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m96[m[1;36m:[m[1;34m19 0 ob[m[1;4;32mj[m[1;34m)[m-[1;35mHello.pdf[m[1;36m:[m[32;1m97[m[1;36m:[m[1;34m([m[1;4;32m)[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m98[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m0 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m99[m[1;36m:[m[1;34m20 0 ob[m[1;4;32mj[m[1;34m ][m-[1;35mHello.pdf[m[1;36m:[m[32;1m100[m[1;36m:[m[1;34m[ [m[1;4;32m][m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m101[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34m 0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m102[m[1;36m:[m[1;34m1 0 ob[m[1;4;32mj[m[1;34m< /Title 15 0 R [m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34m R /ModDat[m[1;4;32me[m[1;34m8 0 R /Ke[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34ms 20 0 R >[m[1;4;32m>[m[1;34mndobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m105[m[1;36m:[m[1;34mendob[m[1;4;32mj[m[1;34mref[m-[1;35mHello.pdf[m[1;36m:[m[32;1m106[m[1;36m:[m[1;34mxre[m[1;4;32mf[m[1;34m 21[m-[1;35mHello.pdf[m[1;36m:[m[32;1m107[m[1;36m:[m[1;34m0 2[m[1;4;32m1[m[1;34m000000000 65535 f [m-[1;35mHello.pdf[m[1;36m:[m[32;1m129[m[1;36m:[m[1;34mtraile[m[1;4;32mr[m[1;34m< /Size 21 /Root[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34m583cf769a3[m[1;4;32m>[m[1;34m8db88d333[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m131[m[1;36m:[m[1;36m...[m[1;34m769a3> ] >[m[1;4;32m>[m[1;34mtartxref[m-[1;35mHello.pdf[m[1;36m:[m[32;1m132[m[1;36m:[m[1;34mstartxre[m[1;4;32mf[m[1;34m536[m-[1;35mHello.pdf[m[1;36m:[m[32;1m133[m[1;36m:[m[1;34m553[m[1;4;32m6[m[1;34m%EOF[m-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m80[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m81[m[1;36m|[m[1;4;32m1[m[1;34m4 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m81[m[1;36m:[m[1;34m14 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m82[m[1;36m|[m[1;4;32m2[m[1;34m734[m+[1;35mHello.pdf[m[1;36m:[m[32;1m82[m[1;36m:[m[1;34m273[m[1;4;32m4[m+[1;35mHello.pdf[m[1;36m|[m[32;1m83[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m83[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m84[m[1;36m|[m[1;4;32m1[m[1;34m5 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m84[m[1;36m:[m[1;34m15 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m85[m[1;36m|[m[1;4;32m([m[1;34mHello)[m+[1;35mHello.pdf[m[1;36m:[m[32;1m85[m[1;36m:[m[1;34m(Hello[m[1;4;32m)[m+[1;35mHello.pdf[m[1;36m|[m[32;1m86[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m86[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m87[m[1;36m|[m[1;4;32m1[m[1;34m6 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m87[m[1;36m:[m[1;34m16 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m88[m[1;36m|[m[1;4;32m([m[1;34mMac OS X 10.12.6 Qu[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m88[m[1;36m:[m[1;36m...[m[1;34mPDFContext[m[1;4;32m)[m+[1;35mHello.pdf[m[1;36m|[m[32;1m89[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m89[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m90[m[1;36m|[m[1;4;32m1[m[1;34m7 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m90[m[1;36m:[m[1;34m17 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m91[m[1;36m|[m[1;4;32m([m[1;34mTextEdit)[m+[1;35mHello.pdf[m[1;36m:[m[32;1m91[m[1;36m:[m[1;34m(TextEdit[m[1;4;32m)[m+[1;35mHello.pdf[m[1;36m|[m[32;1m92[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m92[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m93[m[1;36m|[m[1;4;32m1[m[1;34m8 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m93[m[1;36m:[m[1;34m18 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m94[m[1;36m|[m[1;4;32m([m[1;34mD:20200124010711Z00[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m94[m[1;36m:[m[1;36m...[m[1;34m711Z00'00'[m[1;4;32m)[m+[1;35mHello.pdf[m[1;36m|[m[32;1m95[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m95[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m96[m[1;36m|[m[1;4;32m1[m[1;34m9 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m96[m[1;36m:[m[1;34m19 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m97[m[1;36m|[m[1;4;32m([m[1;34m)[m+[1;35mHello.pdf[m[1;36m:[m[32;1m97[m[1;36m:[m[1;34m([m[1;4;32m)[m+[1;35mHello.pdf[m[1;36m|[m[32;1m98[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m98[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m99[m[1;36m|[m[1;4;32m2[m[1;34m0 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m99[m[1;36m:[m[1;34m20 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m100[m[1;36m|[m[1;4;32m[[m[1;34m ][m+[1;35mHello.pdf[m[1;36m:[m[32;1m100[m[1;36m:[m[1;34m[ [m[1;4;32m][m+[1;35mHello.pdf[m[1;36m|[m[32;1m101[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m101[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m102[m[1;36m|[m[1;4;32m1[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m102[m[1;36m:[m[1;34m1 0 ob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m103[m[1;36m|[m[1;4;32m<[m[1;34m< /Title 15 0 R /Pr[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34m R /ModDat[m[1;4;32me[m+[1;35mHello.pdf[m[1;36m|[m[32;1m104[m[1;36m|[m[1;4;32m1[m[1;34m8 0 R /Keywords 19 [m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34ms 20 0 R >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m105[m[1;36m|[m[1;4;32me[m[1;34mndobj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m105[m[1;36m:[m[1;34mendob[m[1;4;32mj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m106[m[1;36m|[m[1;4;32mx[m[1;34mref[m+[1;35mHello.pdf[m[1;36m:[m[32;1m106[m[1;36m:[m[1;34mxre[m[1;4;32mf[m+[1;35mHello.pdf[m[1;36m|[m[32;1m107[m[1;36m|[m[1;4;32m0[m[1;34m 21[m+[1;35mHello.pdf[m[1;36m:[m[32;1m107[m[1;36m:[m[1;34m0 2[m[1;4;32m1[m+[1;35mHello.pdf[m[1;36m|[m[32;1m108[m[1;36m|[m[1;4;32m0[m[1;34m000000000 65535 f [m+[1;35mHello.pdf[m[1;36m:[m[32;1m129[m[1;36m:[m[1;34mtraile[m[1;4;32mr[m+[1;35mHello.pdf[m[1;36m|[m[32;1m130[m[1;36m|[m[1;4;32m<[m[1;34m< /Size 21 /Root 11[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34m583cf769a3[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m131[m[1;36m|[m[1;4;32m<[m[1;34m8db88d3335070bd9583[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m131[m[1;36m:[m[1;36m...[m[1;34m769a3> ] >[m[1;4;32m>[m+[1;35mHello.pdf[m[1;36m|[m[32;1m132[m[1;36m|[m[1;4;32ms[m[1;34mtartxref[m+[1;35mHello.pdf[m[1;36m:[m[32;1m132[m[1;36m:[m[1;34mstartxre[m[1;4;32mf[m+[1;35mHello.pdf[m[1;36m|[m[32;1m133[m[1;36m|[m[1;4;32m5[m[1;34m536[m+[1;35mHello.pdf[m[1;36m:[m[32;1m133[m[1;36m:[m[1;34m553[m[1;4;32m6[m+[1;35mHello.pdf[m[1;36m|[m[32;1m134[m[1;36m|[m[1;4;32m%[m[1;34m%EOF[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m
@@ -1,6 +1,10 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m [mBinary file [1;35mHello.class[m matches-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m[1;34m public s[m[1;36m...[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34md! greetin[m[1;4;32mg[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m6[m[1;36m:[m[1;34m [m[1;4;32m}[m+[1;35mHello.java[m[1;36m|[m[32;1m7[m[1;36m|[m[1;4;32m}[m [mBinary file [1;35mHello.pdf[m matches-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m[1;34mcho "Hello Wor[m[1;36m...[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/s[m[1;4;32mh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32me[m[1;34mcho "Hello World!"[m
tests/out/Hello_wnhS-I-onC10.out
@@ -1,13 +1,16 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.bat[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m [1;35mHello.java[m[1;36m:[m[32;1m1[m[1;36m:[m[1;4;32mimport java.lang.*;[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;4;32mpublic class[m[1;34m Hello // p[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mclass [m[1;4;32mHello //[m[1;34m print[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mlo // [m[1;4;32mprints a[m[1;34m Hello[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34ms a [m[1;4;32mHello World![m[1;34m gre[m[1;36m...[m-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m[1;34m publi[m[1;36m...[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;34m{ [m[1;4;32mpublic static[m[1;34m void ma[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34m [m[1;4;32mvoid main(String[][m[1;34m [m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m5[m[1;36m:[m[1;36m...[m[1;34mn("[m[1;4;32mHello World!");[m-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.sh[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m
tests/out/Hello_wnhS-W-onC10.out
@@ -1,4 +1,5 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.bat[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m [1;35mHello.class[m[1;36m:[m[32;1m5[m[1;36m:[m [1;32m00000090[m [m[1;34m -- -- -- --[m[1;4;32m 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 [m[1;36m |[m[1;34m----[m[1;4;32mHello World![m[1;36m|[m@@ -8,7 +9,8 @@ [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mclass [m[1;4;32mHello //[m[1;34m print[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mlo // [m[1;4;32mprints a[m[1;34m Hello[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34ms a [m[1;4;32mHello World![m[1;34m gre[m[1;36m...[m-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m[1;34m publi[m[1;36m...[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;34m{ [m[1;4;32mpublic static[m[1;34m void ma[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34m [m[1;4;32mvoid main(String[][m[1;34m [m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m5[m[1;36m:[m[1;36m...[m[1;34mn("[m[1;4;32mHello World!");[m@@ -16,7 +18,8 @@ [1;32m00000000[m [m[1;34m -- -- -- -- -- -- --[m[1;4;32m 33 0a 25 c4 e5 f2 e5 eb a7 [m[1;36m |[m[1;34m-------[m[1;4;32m3[7mJ[m[1;4;32m%[7m.[7m.[7m.[7m.[7m.[7m.[m[1;36m|[m [1;32m00000010[m [m[1;4;32m f3 a0 d0 c4 c6[m[1;34m -- -- -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;4;32m[7m.[7m.[7m.[7m.[7m.[m[1;34m-----------[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m3[m[1;36m:[m[1;4;32m4 0[m[1;34m obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m3[m[1;36m:[m[1;34m4 0 [m[1;4;32mobj[m[1;34m /Length 5 0 R /[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m3[m[1;36m:[m[1;34m4 0 [m[1;4;32mobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m<<[m[1;34m /Length 5 0 R /Fi[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m4[m[1;36m:[m[1;34m<< /[m[1;4;32mLength 5[m[1;34m 0 R /Filte[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34mLength 5 [m[1;4;32m0 R[m[1;34m /Filter[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34m/[m[1;4;32mFilter /FlateDecode[m@@ -30,7 +33,9 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m9[m[1;36m:[m[1;36m...[m[1;32m[+1 more][m [1;35mHello.pdf[m[1;36m:[m[32;1m11[m[1;36m:[m[1;4;32m5 0[m[1;34m obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m11[m[1;36m:[m[1;34m5 0 [m[1;4;32mobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m13[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m12[m[1;36m|[m[1;4;32m123[m+[1;35mHello.pdf[m[1;36m:[m[32;1m13[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m14[m[1;36m|[m[1;4;32m2[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m14[m[1;36m:[m[1;34m2 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;34m<< /[m[1;4;32mType /Page[m[1;34m /Parent [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34mPage /[m[1;4;32mParent 3[m[1;34m 0 R /[m[1;36m...[m@@ -41,7 +46,8 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34mntents 4 [m[1;4;32m0 R[m[1;34m /MediaB[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34m0 R /[m[1;4;32mMediaBox [0[m[1;34m 0 6[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m15[m[1;36m:[m[1;36m...[m[1;34maBox [0 [m[1;4;32m0 612[m[1;34m 792][m-[1;35mHello.pdf[m[1;36m:[m[32;1m17[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m17[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m18[m[1;36m|[m[1;4;32m6[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m18[m[1;36m:[m[1;34m6 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;34m<< /[m[1;4;32mProcSet [[m[1;34m /PDF /Tex[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34met [ /[m[1;4;32mPDF /Text[m[1;34m ] /C[m[1;36m...[m@@ -51,7 +57,8 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34m R >> /[m[1;4;32mFont <<[m[1;34m /TT1 [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34mont << /[m[1;4;32mTT1 8[m[1;34m 0 R[m [1;35mHello.pdf[m[1;36m:[m[32;1m19[m[1;36m:[m[1;36m...[m[1;34m< /TT1 8 [m[1;4;32m0 R[m-[1;35mHello.pdf[m[1;36m:[m[32;1m21[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m21[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m22[m[1;36m|[m[1;4;32m9[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m22[m[1;36m:[m[1;34m9 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m23[m[1;36m:[m[1;34m<< /[m[1;4;32mLength 10[m[1;34m 0 R /N 1 [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m23[m[1;36m:[m[1;36m...[m[1;34mength 10 [m[1;4;32m0 R[m[1;34m /N 1 /A[m[1;36m...[m@@ -70,14 +77,18 @@ [1;32m000003e0[m [m[1;34m -- -- -- -- -- -- -- -- -- -- -- -- -- --[m[1;4;32m 37 20 [m[1;36m |[m[1;34m--------------[m[1;4;32m7 [m[1;36m|[m [1;32m000003f0[m [m[1;4;32m 8b 9a 11 f2 c8 c7 58[m[1;34m -- -- -- -- -- -- -- -- -- [m[1;36m |[m[1;4;32m[7m.[7m.[7mQ[7m.[7m.[7m.[m[1;4;32mX[m[1;34m---------[m[1;36m|[m [1;35mHello.pdf[m[1;36m:[m[32;1m30[m[1;36m:[m[1;36m...[m[1;32m[+1 more][m-[1;35mHello.pdf[m[1;36m:[m[32;1m32[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m32[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m33[m[1;36m|[m[1;4;32m10[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m33[m[1;36m:[m[1;34m10 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m34[m[1;36m:[m[1;4;32m1116[m+[1;35mHello.pdf[m[1;36m|[m[32;1m35[m[1;36m|[m[1;4;32mendobj[m [1;35mHello.pdf[m[1;36m:[m[32;1m36[m[1;36m:[m[1;4;32m7 0[m[1;34m obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m36[m[1;36m:[m[1;34m7 0 [m[1;4;32mobj[m[1;34m /ICCBased 9 0 R ][m+[1;35mHello.pdf[m[1;36m:[m[32;1m36[m[1;36m:[m[1;34m7 0 [m[1;4;32mobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m37[m[1;36m|[m[1;4;32m[[m[1;34m /ICCBased 9 0 R ][m [1;35mHello.pdf[m[1;36m:[m[32;1m37[m[1;36m:[m[1;34m[ /[m[1;4;32mICCBased 9[m[1;34m 0 R ][m [1;35mHello.pdf[m[1;36m:[m[32;1m37[m[1;36m:[m[1;36m...[m[1;34mCBased 9 [m[1;4;32m0 R[m[1;34m ][m-[1;35mHello.pdf[m[1;36m:[m[32;1m38[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m38[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m39[m[1;36m|[m[1;4;32m3[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m39[m[1;36m:[m[1;34m3 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;34m<< /[m[1;4;32mType /Pages[m[1;34m /MediaB[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34mges /[m[1;4;32mMediaBox [0[m[1;34m 0 6[m[1;36m...[m@@ -86,23 +97,27 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34munt 1 /[m[1;4;32mKids [[m[1;34m 2 0 R [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34m /Kids [ [m[1;4;32m2 0[m[1;34m R ] >>[m [1;35mHello.pdf[m[1;36m:[m[32;1m40[m[1;36m:[m[1;36m...[m[1;34mds [ 2 0 [m[1;4;32mR ][m[1;34m >>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m41[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m41[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m42[m[1;36m|[m[1;4;32m11[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m42[m[1;36m:[m[1;34m11 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m43[m[1;36m:[m[1;34m<< /[m[1;4;32mType /Catalog[m[1;34m /Page[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m43[m[1;36m:[m[1;36m...[m[1;34mtalog /[m[1;4;32mPages 3[m[1;34m 0 R >>[m [1;35mHello.pdf[m[1;36m:[m[32;1m43[m[1;36m:[m[1;36m...[m[1;34m/Pages 3 [m[1;4;32m0 R[m[1;34m >>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m44[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m44[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m45[m[1;36m|[m[1;4;32m8[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m45[m[1;36m:[m[1;34m8 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;34m<< /[m[1;4;32mType /Font[m[1;34m /Subtype[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34m /[m[1;4;32mSubtype /TrueType[m[1;34m [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34m[m[1;4;32mBaseFont /GQTMZF+Men[+10][m[1;34m[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34mr /[m[1;4;32mFontDescriptor[m[1;34m 0 [m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m46[m[1;36m:[m[1;36m...[m[1;34mr /[m[1;4;32mFontDescriptor[m+[1;35mHello.pdf[m[1;36m|[m[32;1m47[m[1;36m|[m[1;4;32m12[m[1;34m 0 R /Encoding /Ma[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;34m12 [m[1;4;32m0 R[m[1;34m /Encoding /MacRo[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34m[m[1;4;32mEncoding /MacRomanEn[+6][m[1;34m[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34mng /[m[1;4;32mFirstChar 72[m[1;34m /La[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34m72 /[m[1;4;32mLastChar 111[m[1;34m /Wi[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34m 111 /[m[1;4;32mWidths [[m[1;34m 602[m-[1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34mWidths [ [m[1;4;32m602[m[1;34m 0 0 0 0[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m47[m[1;36m:[m[1;36m...[m[1;34mWidths [ [m[1;4;32m602[m+[1;35mHello.pdf[m[1;36m|[m[32;1m48[m[1;36m|[m[1;4;32m0[m[1;34m 0 0 0 0 0 0 0 0 0 [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;34m0 [m[1;4;32m0 0[m[1;34m 0 0 0 0 0 0 0 0 0[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;34m0 0 0 [m[1;4;32m0 0[m[1;34m 0 0 0 0 0 0 0[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 0 0 0 0 [m[1;4;32m0 0[m[1;34m 0 0 0 0[m[1;36m...[m@@ -120,14 +135,17 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 0 0 602 [m[1;4;32m0 0[m[1;34m 0 0 0 0[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 602 0 0 [m[1;4;32m0 0[m[1;34m 0 0 602[m [1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 0 0 0 0 [m[1;4;32m0 0[m[1;34m 602[m-[1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 0 0 0 0 [m[1;4;32m602[m[1;34m 0 602 ] >>[m+[1;35mHello.pdf[m[1;36m:[m[32;1m48[m[1;36m:[m[1;36m...[m[1;34m 0 0 0 0 [m[1;4;32m602[m+[1;35mHello.pdf[m[1;36m|[m[32;1m49[m[1;36m|[m[1;4;32m0[m[1;34m 0 602 ] >>[m [1;35mHello.pdf[m[1;36m:[m[32;1m49[m[1;36m:[m[1;34m0 [m[1;4;32m0 602[m[1;34m ] >>[m-[1;35mHello.pdf[m[1;36m:[m[32;1m50[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m50[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m51[m[1;36m|[m[1;4;32m12[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m51[m[1;36m:[m[1;34m12 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34m[m[1;4;32mType /FontDescriptor[m[1;34m[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34m[m[1;4;32mFontName /GQTMZF+Men[+10][m[1;34m[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34mular /[m[1;4;32mFlags 33[m[1;34m /Font[m[1;36m...[m-[1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34ms 33 /[m[1;4;32mFontBBox[m[1;34m -375 [m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m52[m[1;36m:[m[1;36m...[m[1;34ms 33 /[m[1;4;32mFontBBox[m+[1;35mHello.pdf[m[1;36m|[m[32;1m53[m[1;36m|[m[1;4;32m[-558[m[1;34m -375 718 1041][m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m53[m[1;36m:[m[1;34m[-558 -[m[1;4;32m375 718[m[1;34m 1041] /I[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m53[m[1;36m:[m[1;36m...[m[1;34m1] /[m[1;4;32mItalicAngle 0[m[1;34m /A[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m53[m[1;36m:[m[1;36m...[m[1;34me 0 /[m[1;4;32mAscent 928[m[1;34m /Des[m[1;36m...[m@@ -140,7 +158,8 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m54[m[1;36m:[m[1;36m...[m[1;34m02 /[m[1;4;32mMaxWidth 602[m[1;34m /Fo[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m54[m[1;36m:[m[1;36m...[m[1;34m02 /[m[1;4;32mFontFile2 13[m[1;34m 0 R[m [1;35mHello.pdf[m[1;36m:[m[32;1m54[m[1;36m:[m[1;36m...[m[1;34mFile2 13 [m[1;4;32m0 R[m-[1;35mHello.pdf[m[1;36m:[m[32;1m56[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m56[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m57[m[1;36m|[m[1;4;32m13[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m57[m[1;36m:[m[1;34m13 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m58[m[1;36m:[m[1;34m<< /[m[1;4;32mLength 14[m[1;34m 0 R /Leng[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m58[m[1;36m:[m[1;36m...[m[1;34mength 14 [m[1;4;32m0 R[m[1;34m /Length[m[1;36m...[m@@ -193,22 +212,30 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m79[m[1;36m:[m[1;36m...[m[1;32m[+1 more][m [1;35mHello.pdf[m[1;36m:[m[32;1m81[m[1;36m:[m[1;4;32m14 0[m[1;34m obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m81[m[1;36m:[m[1;34m14 0 [m[1;4;32mobj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m83[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m82[m[1;36m|[m[1;4;32m2734[m+[1;35mHello.pdf[m[1;36m:[m[32;1m83[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m84[m[1;36m|[m[1;4;32m15[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m84[m[1;36m:[m[1;34m15 [m[1;4;32m0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m86[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m86[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m87[m[1;36m|[m[1;4;32m16[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m87[m[1;36m:[m[1;34m16 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m88[m[1;36m:[m[1;34m([m[1;4;32mMac OS[m[1;34m X 10.12.6 Quart[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m88[m[1;36m:[m[1;36m...[m[1;34mac OS [m[1;4;32mX 10.12.6[m[1;34m Quar[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m88[m[1;36m:[m[1;36m...[m[1;34m [m[1;4;32mQuartz PDFContext)[m-[1;35mHello.pdf[m[1;36m:[m[32;1m89[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m89[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m90[m[1;36m|[m[1;4;32m17[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m90[m[1;36m:[m[1;34m17 [m[1;4;32m0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m92[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m92[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m93[m[1;36m|[m[1;4;32m18[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m93[m[1;36m:[m[1;34m18 [m[1;4;32m0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m95[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m95[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m96[m[1;36m|[m[1;4;32m19[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m96[m[1;36m:[m[1;34m19 [m[1;4;32m0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m98[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m98[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m99[m[1;36m|[m[1;4;32m20[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m99[m[1;36m:[m[1;34m20 [m[1;4;32m0 obj[m-[1;35mHello.pdf[m[1;36m:[m[32;1m101[m[1;36m:[m[1;4;32mendobj[m[1;34m 0 obj[m+[1;35mHello.pdf[m[1;36m:[m[32;1m101[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m102[m[1;36m|[m[1;4;32m1[m[1;34m 0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m102[m[1;36m:[m[1;34m1 [m[1;4;32m0 obj[m [1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;34m<< /[m[1;4;32mTitle 15[m[1;34m 0 R /Produ[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34mTitle 15 [m[1;4;32m0 R[m[1;34m /Produc[m[1;36m...[m@@ -218,46 +245,59 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34meator 17 [m[1;4;32m0 R[m[1;34m /Creati[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34mR /[m[1;4;32mCreationDate 18[m[1;34m 0[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34mnDate 18 [m[1;4;32m0 R[m[1;34m /ModDate[m-[1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34m8 0 R /[m[1;4;32mModDate[m[1;34m 0 R /[m[1;36m...[m+[1;35mHello.pdf[m[1;36m:[m[32;1m103[m[1;36m:[m[1;36m...[m[1;34m8 0 R /[m[1;4;32mModDate[m+[1;35mHello.pdf[m[1;36m|[m[32;1m104[m[1;36m|[m[1;4;32m18[m[1;34m 0 R /Keywords 19 [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;34m18 [m[1;4;32m0 R[m[1;34m /Keywords 19 0 R[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34m0 R /[m[1;4;32mKeywords 19[m[1;34m 0 R[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34mwords 19 [m[1;4;32m0 R[m[1;34m /AAPL:K[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34mAAPL:[m[1;4;32mKeywords 20[m[1;34m 0 R >>[m [1;35mHello.pdf[m[1;36m:[m[32;1m104[m[1;36m:[m[1;36m...[m[1;34mwords 20 [m[1;4;32m0 R[m[1;34m >>[m [1;35mHello.pdf[m[1;36m:[m[32;1m105[m[1;36m:[m[1;4;32mendobj[m+[1;35mHello.pdf[m[1;36m|[m[32;1m106[m[1;36m|[m[1;4;32mxref[m [1;35mHello.pdf[m[1;36m:[m[32;1m107[m[1;36m:[m[1;4;32m0 21[m [1;35mHello.pdf[m[1;36m:[m[32;1m108[m[1;36m:[m[1;4;32m0000000000 65535[m[1;34m f [m-[1;35mHello.pdf[m[1;36m:[m[32;1m108[m[1;36m:[m[1;36m...[m[1;34m00 65535 [m[1;4;32mf [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m108[m[1;36m:[m[1;36m...[m[1;34m00 65535 [m[1;4;32mf [m+[1;35mHello.pdf[m[1;36m|[m[32;1m109[m[1;36m|[m[1;4;32m0000005392[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m109[m[1;36m:[m[1;36m...[m[1;34m005392 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m110[m[1;36m:[m[1;4;32m0000000238 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m110[m[1;36m:[m[1;36m...[m[1;34m38 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m110[m[1;36m:[m[1;36m...[m[1;34m38 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m111[m[1;36m|[m[1;4;32m0000001714[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m111[m[1;36m:[m[1;36m...[m[1;34m001714 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m112[m[1;36m:[m[1;4;32m0000000022 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m112[m[1;36m:[m[1;36m...[m[1;34m22 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m112[m[1;36m:[m[1;36m...[m[1;34m22 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m113[m[1;36m|[m[1;4;32m0000000219[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m113[m[1;36m:[m[1;36m...[m[1;34m000219 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m114[m[1;36m:[m[1;4;32m0000000342 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m114[m[1;36m:[m[1;36m...[m[1;34m42 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m114[m[1;36m:[m[1;36m...[m[1;34m42 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m115[m[1;36m|[m[1;4;32m0000001679[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m115[m[1;36m:[m[1;36m...[m[1;34m001679 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m116[m[1;36m:[m[1;4;32m0000001847 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m116[m[1;36m:[m[1;36m...[m[1;34m47 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m116[m[1;36m:[m[1;36m...[m[1;34m47 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m117[m[1;36m|[m[1;4;32m0000000439[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m117[m[1;36m:[m[1;36m...[m[1;34m000439 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m118[m[1;36m:[m[1;4;32m0000001658 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m118[m[1;36m:[m[1;36m...[m[1;34m58 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m118[m[1;36m:[m[1;36m...[m[1;34m58 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m119[m[1;36m|[m[1;4;32m0000001797[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m119[m[1;36m:[m[1;36m...[m[1;34m001797 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m120[m[1;36m:[m[1;4;32m0000002110 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m120[m[1;36m:[m[1;36m...[m[1;34m10 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m120[m[1;36m:[m[1;36m...[m[1;34m10 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m121[m[1;36m|[m[1;4;32m0000002362[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m121[m[1;36m:[m[1;36m...[m[1;34m002362 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m122[m[1;36m:[m[1;4;32m0000005186 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m122[m[1;36m:[m[1;36m...[m[1;34m86 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m122[m[1;36m:[m[1;36m...[m[1;34m86 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m123[m[1;36m|[m[1;4;32m0000005207[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m123[m[1;36m:[m[1;36m...[m[1;34m005207 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m124[m[1;36m:[m[1;4;32m0000005231 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m124[m[1;36m:[m[1;36m...[m[1;34m31 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m124[m[1;36m:[m[1;36m...[m[1;34m31 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m125[m[1;36m|[m[1;4;32m0000005284[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m125[m[1;36m:[m[1;36m...[m[1;34m005284 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m126[m[1;36m:[m[1;4;32m0000005311 00000[m[1;34m n [m-[1;35mHello.pdf[m[1;36m:[m[32;1m126[m[1;36m:[m[1;36m...[m[1;34m11 00000 [m[1;4;32mn [m[1;34m 00000 n [m+[1;35mHello.pdf[m[1;36m:[m[32;1m126[m[1;36m:[m[1;36m...[m[1;34m11 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m127[m[1;36m|[m[1;4;32m0000005353[m[1;34m 00000 n [m [1;35mHello.pdf[m[1;36m:[m[32;1m127[m[1;36m:[m[1;36m...[m[1;34m005353 [m[1;4;32m00000 n[m[1;34m [m [1;35mHello.pdf[m[1;36m:[m[32;1m128[m[1;36m:[m[1;4;32m0000005372 00000[m[1;34m n [m [1;35mHello.pdf[m[1;36m:[m[32;1m128[m[1;36m:[m[1;36m...[m[1;34m72 00000 [m[1;4;32mn [m+[1;35mHello.pdf[m[1;36m|[m[32;1m129[m[1;36m|[m[1;4;32mtrailer[m [1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;34m<< /[m[1;4;32mSize 21[m[1;34m /Root 11 0 [m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34mze 21 /[m[1;4;32mRoot 11[m[1;34m 0 R /[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34m/Root 11 [m[1;4;32m0 R[m[1;34m /Info 1[m[1;36m...[m@@ -265,5 +305,7 @@ [1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34m /Info 1 [m[1;4;32m0 R[m[1;34m /ID [ <[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m130[m[1;36m:[m[1;36m...[m[1;34m 1 0 R /[m[1;4;32mID [[m[1;34m <8db88d[m[1;36m...[m [1;35mHello.pdf[m[1;36m:[m[32;1m132[m[1;36m:[m[1;4;32mstartxref[m-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.pdf[m[1;36m|[m[32;1m133[m[1;36m|[m[1;4;32m5536[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.sh[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m
tests/out/Hello_wnhS-onC10.out
@@ -1,4 +1,5 @@-[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.bat[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.bat[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.bat[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m [mBinary file [1;35mHello.class[m matches [1;35mHello.java[m[1;36m:[m[32;1m1[m[1;36m:[m[1;4;32mimport java.lang.*;[m@@ -6,10 +7,12 @@ [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mclass [m[1;4;32mHello //[m[1;34m print[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34mlo // [m[1;4;32mprints a[m[1;34m Hello[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34ms a [m[1;4;32mHello World![m[1;34m gre[m[1;36m...[m-[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m[1;34m publi[m[1;36m...[m+[1;35mHello.java[m[1;36m:[m[32;1m3[m[1;36m:[m[1;36m...[m[1;34morld! [m[1;4;32mgreeting[m+[1;35mHello.java[m[1;36m|[m[32;1m4[m[1;36m|[m[1;4;32m{[m[1;34m public static void[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;34m{ [m[1;4;32mpublic static[m[1;34m void ma[m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m4[m[1;36m:[m[1;36m...[m[1;34m [m[1;4;32mvoid main(String[][m[1;34m [m[1;36m...[m [1;35mHello.java[m[1;36m:[m[32;1m5[m[1;36m:[m[1;36m...[m[1;34mn("[m[1;4;32mHello World!");[m [mBinary file [1;35mHello.pdf[m matches-[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m[1;34m "Hello World!"[m+[1;35mHello.sh[m[1;36m:[m[32;1m1[m[1;36m:[m[1;34m#!/bin/[m[1;4;32msh[m+[1;35mHello.sh[m[1;36m|[m[32;1m2[m[1;36m|[m[1;4;32mecho[m[1;34m "Hello World!"[m [1;35mHello.sh[m[1;36m:[m[32;1m2[m[1;36m:[m[1;36m...[m[1;34mho "[m[1;4;32mHello World!"[m
tests/out/lorem.utf16-F-iwco.out
@@ -1 +1 @@-19+18
tests/out/lorem.utf16-G-iwco.out
@@ -1 +1 @@-19+18
tests/out/lorem.utf16-iwco.out
@@ -1 +1 @@-19+18
tests/out/lorem.utf32-F-iwco.out
@@ -1 +1 @@-19+18
tests/out/lorem.utf32-G-iwco.out
@@ -1 +1 @@-19+18
tests/out/lorem.utf32-iwco.out
@@ -1 +1 @@-19+18