Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Aug 2004 20:16:29 +0200 (CEST)
From:      Martin Blapp <mb@imp.ch>
To:        freebsd-ports@freebsd.org
Cc:        kuriyama@freebsd.org
Subject:   MIME-Tools 5.411a fixes (will be part of MIME-Tools 5.412)
Message-ID:  <20040831200251.C6407@cvs.imp.ch>

next in thread | raw e-mail | index | archive | help
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--0-923124273-1093976058=:6407
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <20040831201426.R6407@cvs.imp.ch>


Hi all,

If it is ok I plan to commit the following changes to MIME-Tools. These are
all needed fixes to get p5-MIME-Tools working properly together with
MIMEDefang/Mailscanner/Amavis.

They have been reviewed and discussed by Julian Field (the mailscanner
lead developer) and David F. Skoll <dfs@roaringpenguin.com> (the MIMEDefang
lead developer). Gisle Aas (developer of p5-Base64) has also helped us
a lot.

This port is unmaintained in CPAN since almost 2 years now and we need
to do something. Hopefully there will be soon MIME-Tools 5.412 (but that
will be after the ports freeze.

I'm running these fixes here on a heavily used server and they fix
all known problems (binary corruption, memleaks etc) with MIME-Tools 5411.
Unfortunatly MIME-Tools 6.002 contains some regressions and nobody uses
it currently.

Martin

patch-7or8bit.diff
------------------

Correct "7_bit", "7-bit", and "7 bit" to
"7bit"; likewise for "8bit".

Taken from MIME-Tools 6.002


patch-Benchmark
---------------

Parser memory leak fixed. The closure-based task/benchmark mechanisms created
for 5.5 were leaking references like crazy.  That's been stopped.

Taken from MIME-Tools 6.002


patch-Parser-BinHex
-------------------

Add BinHex support.

Submitted by:   Julian Field <mailscanner@ecs.soton.ac.uk>


patch-Decoder-qpdecode
----------------------

Fix the problem with corrupted PDF-files with a modified patch which treats
encoded PDF-Files differently and decodes these file adding a carriage return.


patch-Decoder-qpencode
----------------------

Fix encoding corruption. rt.cpan.org: Bug #7457

encode_qp() since version 3.02 takes up 3 args. Third arg is a flag indicating
binarymode. Since the flag meaning is inverted comparing to the MIME::Base64 patch
suggested originally, the corresponding MIME-tools patch needs to be modified
also.

Submitted by:   ak2@smr.ru

patch-Filer.pm-whitespace
-------------------------

Remove whitspaces from exorcise_filename() and make evil_filename()
recognize path or special characters.

Submitted by:   Julian Field <mailscanner@ecs.soton.ac.uk>
                Martin Blapp <mbr@freebsd.org>


patch-Parser-MaxParts
---------------------

Limits the number of MIME parts we will parse.

Normally, instances of this class parse a message to the bitter end.
Messages with many MIME parts can cause excessive memory consumption.
If you invoke this method, parsing will abort with a die() if a message
contains more than NUM parts.

Submitted by:   David F. Skoll <dfs@roaringpenguin.com>


patch-ParserUndef
-----------------

Return undef or the parsed MIME::Entity in parse_data().

Submitted by:   David F. Skoll <dfs@roaringpenguin.com>


Index: Makefile
===================================================================
RCS file: /home/pcvs/ports/mail/p5-MIME-Tools/Makefile,v
retrieving revision 1.27
diff -u -r1.27 Makefile
--- Makefile	19 Nov 2003 10:00:45 -0000	1.27
+++ Makefile	31 Aug 2004 18:06:53 -0000
@@ -7,8 +7,8 @@

 PORTNAME=	p5-MIME-Tools
 PORTVERSION=	5.411a
-PORTREVISION=	3
-PORTEPOCH=	1
+PORTREVISION=	4
+PORTEPOCH=	2
 CATEGORIES=	mail perl5
 MASTER_SITES=	${MASTER_SITE_PERL_CPAN}
 MASTER_SITE_SUBDIR=	MIME
@@ -18,7 +18,9 @@
 COMMENT=	A set of perl5 modules for MIME

 BUILD_DEPENDS=	${SITE_PERL}/Mail/Header.pm:${PORTSDIR}/mail/p5-Mail-Tools \
-		${SITE_PERL}/IO/Wrap.pm:${PORTSDIR}/devel/p5-IO-stringy
+		${SITE_PERL}/IO/Wrap.pm:${PORTSDIR}/devel/p5-IO-stringy \
+		${SITE_PERL}/Convert/BinHex.pm:${PORTSDIR}/converters/p5-Convert-BinHex \
+		${SITE_PERL}/${PERL_ARCH}/MIME/Base64.pm:${PORTSDIR}/converters/p5-MIME-Base64
 RUN_DEPENDS=	${BUILD_DEPENDS}

 PERL_CONFIGURE=	YES
@@ -48,9 +50,6 @@

 .include <bsd.port.pre.mk>

-.if ${PERL_LEVEL} < 500800
-BUILD_DEPENDS+=	${SITE_PERL}/${PERL_ARCH}/MIME/Base64.pm:${PORTSDIR}/converters/p5-MIME-Base64
-.endif

 post-patch:
 	@${RM} -f ${WRKSRC}/lib/MIME/Field/ParamVal.pm.orig \
Index: files/patch-7or8bit.diff
===================================================================
RCS file: files/patch-7or8bit.diff
diff -N files/patch-7or8bit.diff
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-7or8bit.diff	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,20 @@
+--- lib/MIME/Head.pm.orig	Sat Nov  4 20:54:46 2000
++++ lib/MIME/Head.pm	Wed Aug 25 11:12:25 2004
+@@ -685,11 +685,16 @@
+     This is the default value -- that is, "Content-Transfer-Encoding: 7BIT"
+     is assumed if the Content-Transfer-Encoding header field is not present.
+
++I do one other form of fixup: "7_bit", "7-bit", and "7 bit" are
++corrected to "7bit"; likewise for "8bit".
++
+ =cut
+
+ sub mime_encoding {
+     my $self = shift;
+-    lc($self->mime_attr('content-transfer-encoding') || '7bit');
++    my $enc = lc($self->mime_attr('content-transfer-encoding') || '7bit');
++    $enc =~ s{^([78])[ _-]bit\Z}{$1bit};
++    $enc;
+ }
+
+ #------------------------------
Index: files/patch-Benchmark
===================================================================
RCS file: files/patch-Benchmark
diff -N files/patch-Benchmark
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Benchmark	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,88 @@
+--- lib/MIME/Parser.pm.orig	Wed Aug 25 11:19:44 2004
++++ lib/MIME/Parser.pm	Wed Aug 25 11:23:39 2004
+@@ -582,10 +582,7 @@
+     my ($self, $in, $rdr, $out) = @_;
+
+     ### Parse:
+-    my $bm = benchmark {
+-	$rdr->read_chunk($in, $out);
+-    };
+-    $self->debug("t bound: $bm");
++    $rdr->read_chunk($in, $out);
+     1;
+ }
+
+@@ -828,11 +825,8 @@
+
+     ### Decode and save the body (using the decoder):
+     my $DECODED = $body->open("w") || die "$ME: body not opened: $!\n";
+-    my $bm = benchmark {
+-	eval { $decoder->decode($ENCODED, $DECODED); };
+-	$@ and $self->error($@);
+-    };
+-    $self->debug("t decode: $bm");
++    eval { $decoder->decode($ENCODED, $DECODED); };
++    $@ and $self->error($@);
+     $DECODED->close;
+
+     ### Success!  Remember where we put stuff:
+@@ -1134,11 +1128,8 @@
+     my $entity;
+     local $/ = "\n";    ### just to be safe
+
+-    my $bm = benchmark {
+-	$self->init_parse;
+-	($entity) = $self->process_part($in, undef);  ### parse!
+-    };
+-    $self->debug("t parse: $bm");
++    $self->init_parse;
++    ($entity) = $self->process_part($in, undef);  ### parse!
+
+     $entity;
+ }
+--- lib/MIME/Tools.pm.orig	Wed Aug 25 10:47:32 2004
++++ lib/MIME/Tools.pm	Wed Aug 25 10:50:41 2004
+@@ -24,7 +24,7 @@
+     'config'  => [qw(%CONFIG)],
+     'msgs'    => [qw(usage debug whine error)],
+     'msgtypes'=> [qw($M_DEBUG $M_WARNING $M_ERROR)],
+-    'utils'   => [qw(benchmark catfile shellquote textual_type tmpopen )],
++    'utils'   => [qw(catfile shellquote textual_type tmpopen )],
+     );
+ Exporter::export_ok_tags('config', 'msgs', 'msgtypes', 'utils');
+
+@@ -153,26 +153,6 @@
+
+ #------------------------------
+ #
+-# benchmark CODE
+-#
+-# Private benchmarking utility.
+-#
+-sub benchmark(&) {
+-    my ($code) = @_;
+-    if (1) {
+-	my $t0 = new Benchmark;
+-	&$code;
+-	my $t1 = new Benchmark;
+-	return timestr(timediff($t1, $t0));
+-    }
+-    else {
+-	&$code;
+-	return "";
+-    }
+-}
+-
+-#------------------------------
+-#
+ # catfile DIR, FILE
+ #
+ # Directory/file concatenation.
+@@ -1394,7 +1374,6 @@
+        Newlines in the void
+
+ Started using Benchmark for benchmarking.
+-
+
+ =item Version 5.205   (2000/06/06)
+
Index: files/patch-Decoder-qpdecode
===================================================================
RCS file: files/patch-Decoder-qpdecode
diff -N files/patch-Decoder-qpdecode
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Decoder-qpdecode	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,30 @@
+--- lib/MIME/Decoder/QuotedPrint.pm.orig	Tue Aug 31 17:02:43 2004
++++ lib/MIME/Decoder/QuotedPrint.pm	Tue Aug 31 17:02:38 2004
+@@ -85,9 +85,26 @@
+ #
+ sub decode_it {
+     my ($self, $in, $out) = @_;
++    my $init = 0;
++    my $havepdf = 0;
+
+     while (defined($_ = $in->getline)) {
+-	$out->print(decode_qp($_));
++	if (!$init) {
++		if ($_ =~ /^%PDF/) {
++			$init = 1;
++			$havepdf = 1;
++		}
++	}
++	if ($havepdf) {
++		my $output = $_;
++		$output =~ s/[ \t]+?(\r?\n)/$1/g;  # rule #3 (trailing space must be deleted)
++		$output =~ s/=\r?\n//g;            # rule #5 (soft line breaks)
++		$output =~ s/(^|[^\r])\n\Z/$1\r\n/;  # JKF rule to replace trailing \n with \r\n
++		$output =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
++		$out->print($output);
++	} else {
++		$out->print(decode_qp($_));
++	}
+     }
+     1;
+ }
Index: files/patch-Decoder-qpencode
===================================================================
RCS file: files/patch-Decoder-qpencode
diff -N files/patch-Decoder-qpencode
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Decoder-qpencode	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,128 @@
+--- lib/MIME/Decoder/QuotedPrint.pm.orig	Wed Aug 25 11:46:45 2004
++++ lib/MIME/Decoder/QuotedPrint.pm	Wed Aug 25 11:48:27 2004
+@@ -54,7 +54,7 @@
+
+ use vars qw(@ISA $VERSION);
+ use MIME::Decoder;
+-use MIME::QuotedPrint 2.03;
++use MIME::QuotedPrint 3.03;
+
+ @ISA = qw(MIME::Decoder);
+
+@@ -63,7 +63,7 @@
+
+ #------------------------------
+ #
+-# encode_qp_really STRING
++# encode_qp_really STRING TEXTUAL_TYPE_FLAG
+ #
+ # Encode QP, and then follow guideline 8 from RFC 2049 (thanks to Denis
+ # N. Antonioli) whereby we make things a little safer for the transport
+@@ -71,7 +71,7 @@
+ # grow beyond 76 characters!
+ #
+ sub encode_qp_really {
+-    my $enc = encode_qp($_[0]);
++    my $enc = encode_qp(shift, undef, not shift);
+     if (length($enc) < 74) {
+ 	$enc =~ s/^\.$/=2E/g;         # force encoding of /^\.$/
+ 	$enc =~ s/^From /=46rom /g;   # force encoding of /^From /
+@@ -97,10 +97,10 @@
+ # encode_it IN, OUT
+ #
+ sub encode_it {
+-    my ($self, $in, $out) = @_;
++    my ($self, $in, $out, $textual_type) = @_;
+
+     while (defined($_ = $in->getline)) {
+-	$out->print(encode_qp_really($_));
++	$out->print(encode_qp_really($_, $textual_type));
+     }
+     1;
+ }
+--- lib/MIME/Decoder.pm.orig	Wed Aug 25 11:49:42 2004
++++ lib/MIME/Decoder.pm	Wed Aug 25 11:50:26 2004
+@@ -248,14 +248,14 @@
+ =cut
+
+ sub encode {
+-    my ($self, $in, $out) = @_;
++    my ($self, $in, $out, $textual_type) = @_;
+
+     ### Coerce old-style filehandles to legit objects, and do it!
+     $in  = wraphandle($in);
+     $out = wraphandle($out);
+
+     ### Invoke back-end method to do the work:
+-    $self->encode_it($in, $out) ||
++    $self->encode_it($in, $out, $self->encoding eq 'quoted-printable' ? ($textual_type) : ()) ||
+ 	die "$ME: ".$self->encoding." encoding failed\n";
+ }
+
+--- lib/MIME/Entity.pm.orig	Wed Aug 25 11:50:54 2004
++++ lib/MIME/Entity.pm	Wed Aug 25 11:51:25 2004
+@@ -1853,7 +1853,7 @@
+
+     ### Output the body:
+     my $IO = $self->open("r")     || die "open body: $!";
+-    $decoder->encode($IO, $out)   || return error "encoding failed";
++    $decoder->encode($IO, $out, textual_type($self->head->mime_type) ? 1 : 0)   || die "encoding failed\n";
+     $IO->close;
+     1;
+ }
+--- lib/MIME/Decoder/QuotedPrint.pm.orig	Thu Aug 26 12:28:37 2004
++++ lib/MIME/Decoder/QuotedPrint.pm	Thu Aug 26 12:28:26 2004
+@@ -73,7 +73,7 @@
+ sub encode_qp_really {
+     my $enc = encode_qp(shift, undef, not shift);
+     if (length($enc) < 74) {
+-	$enc =~ s/^\.$/=2E/g;         # force encoding of /^\.$/
++	$enc =~ s/^\.\n/=2E\n/g;      # force encoding of /^\.$/
+ 	$enc =~ s/^From /=46rom /g;   # force encoding of /^From /
+     }
+     $enc;
+--- t/Misc.t.orig	Sun May 21 07:15:26 2000
++++ t/Misc.t	Thu Aug 26 12:34:27 2004
+@@ -6,7 +6,7 @@
+
+ # Create checker:
+ my $T = typical ExtUtils::TBone;
+-$T->begin(7);
++$T->begin(12);
+
+ #------------------------------
+ # Bug 971008 from Michael W. Normandin <michael.normandin@csfb.com>:
+@@ -67,13 +67,29 @@
+ #    $res =~ s/\./=2E/go;
+ #    $res =~ s/From /=46rom /go;
+ # at the start of encode_qp_really in MIME::Decoder::QuotedPrint?
++#
++# Textual mode.
++{
++    use MIME::Decoder::QuotedPrint;
++    my $pair;
++    foreach $pair (["From me",   "=46rom me=\n"],
++		   [".",         ".=\n"],  # soft line-break
++		   [".\n",       "=2E\n"], # line-break
++		   [" From you", " From you=\n"]) {
++	my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 1);
++	$T->ok_eq($out, $pair->[1],
++		  "bug 970725-DNA: QP use of RFC2049 guideline 8");
++    }
++}
++# Binary mode
+ {
+     use MIME::Decoder::QuotedPrint;
+     my $pair;
+-    foreach $pair (["From me",   "=46rom me"],
+-		   [".",         "=2E"],
+-		   [" From you", " From you"]) {
+-	my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0]);
++    foreach $pair (["From me",   "=46rom me=\n"],
++		   [".",         ".=\n"],     # soft line-break
++		   [".\n",       ".=0A=\n"],  # line-break
++		   [" From you", " From you=\n"]) {
++	my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 0);
+ 	$T->ok_eq($out, $pair->[1],
+ 		  "bug 970725-DNA: QP use of RFC2049 guideline 8");
+     }
Index: files/patch-Filer.pm-whitespace
===================================================================
RCS file: files/patch-Filer.pm-whitespace
diff -N files/patch-Filer.pm-whitespace
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Filer.pm-whitespace	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,23 @@
+--- lib/MIME/Parser/Filer.pm	Thu Nov 23 06:04:03 2000
++++ lib/MIME/Parser/Filer.pm	Thu Aug 26 00:42:18 2004
+@@ -357,8 +357,9 @@
+     $self->debug("is this evil? '$name'");
+
+     return 1 if (!defined($name) or ($name eq ''));   ### empty
++    return 1 if ($name =~ m{(^\s)|(\s+\Z)});  ### leading/trailing whitespace
+     return 1 if ($name =~ m{^\.+\Z});         ### dots
+-    return 1 if ($name =~ tr{\\/:[]}{});      ### path characters
++    return 1 if ($name =~ /((?:[\[\]\\\/\<\>\|\?\*\:\"]|\p{IsCntrl}))/); ### path or special characters
+     return 1 if ($self->{MPF_MaxName} and
+ 		 (length($name) > $self->{MPF_MaxName}));
+
+@@ -402,6 +403,9 @@
+     my ($root, $ext) = (($last =~ /^(.*)\.([^\.]+)\Z/)
+ 			? ($1, $2)
+ 			: ($last, ''));
++    ### Delete leading and trailing whitespace
++    $root =~ s/^\s+//;
++    $ext  =~ s/\s+$//;
+     $root = substr($root, 0, ($self->{MPF_TrimRoot} || 14));
+     $ext  = substr($ext,  0, ($self->{MPF_TrimExt}  ||  3));
+     $ext =~ /^\w+$/ or $ext = "dat";
Index: files/patch-Parser-BinHex
===================================================================
RCS file: files/patch-Parser-BinHex
diff -N files/patch-Parser-BinHex
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Parser-BinHex	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,260 @@
+--- /dev/null	Sun Aug  1 22:44:02 2004
++++ lib/MIME/Decoder/BinHex.pm	Sun Aug  1 22:43:12 2004
+@@ -0,0 +1,182 @@
++package MIME::Decoder::BinHex;
++
++
++=head1 NAME
++
++MIME::Decoder::BinHex - decode a "binhex" stream
++
++
++=head1 SYNOPSIS
++
++A generic decoder object; see L<MIME::Decoder> for usage.
++
++Also supports a preamble() method to recover text before
++the binhexed portion of the stream.
++
++
++=head1 DESCRIPTION
++
++A MIME::Decoder subclass for a nonstandard encoding whereby
++data are binhex-encoded.  Common non-standard MIME encodings for this:
++
++    x-uu
++    x-uuencode
++
++
++=head1 AUTHOR
++
++Julian Field (F<mailscanner@ecs.soton.ac.uk>).
++
++All rights reserved.  This program is free software; you can redistribute
++it and/or modify it under the same terms as Perl itself.
++
++=head1 VERSION
++
++$Revision: 1.1 $ $Date: 2004/08/01 20:46:17 $
++
++=cut
++
++
++require 5.002;
++use vars qw(@ISA $VERSION);
++use MIME::Decoder;
++use MIME::Tools qw(whine);
++use Convert::BinHex;
++
++@ISA = qw(MIME::Decoder);
++
++# The package version, both in 1.23 style *and* usable by MakeMaker:
++$VERSION = substr q$Revision: 1.1 $, 10;
++
++
++#------------------------------
++#
++# decode_it IN, OUT
++#
++sub decode_it {
++    my ($self, $in, $out) = @_;
++    my ($mode, $file);
++    my (@preamble, @data);
++    local $_;
++    my $H2B = Convert::BinHex->hex2bin;
++    #my $H2B = Convert::BinHex->open($in);
++    my $line;
++
++    $self->{MDU_Preamble} = \@preamble;
++    $self->{MDU_Mode} = '600';
++    $self->{MDU_File} = undef;
++
++    ### Find beginning...
++    $MailScanner::BinHex::Inline = 1;
++    if ($MailScanner::BinHex::Inline) {
++      while (defined($_ = $in->getline)) {
++        #print STDERR "Line is \"$_\"\n";
++        if (/^\(This file must be converted/) {
++          $_ = $in->getline;
++          last if /^:/;
++        }
++        push @preamble, $_;
++      }
++      die("binhex decoding: fell off end of file\n") if !defined($_);
++    } else {
++      while (defined($_ = $in->getline)) {
++        # Found the header? So start decoding it
++        last if /^:/;
++        push @preamble, $_;
++      }
++      ## hit eof!
++      die("binhex decoding: no This file must be... found\n") if !defined($_);
++    }
++
++    ### Decode:
++    # Don't rely on the comment always being there
++    #$self->whine(":H2B is $H2B\n");
++    #$self->whine("Header is " . $H2B->read_header . "\n");
++    #@data = $H2B->read_data;
++    #$out->print(@data);
++    #print STDERR "End of binhex stream\n";
++    #return 1;
++    #if (/^:/) {
++    my $data;
++    $data = $H2B->next($_); # or whine("Next error is $@ $!\n");
++    #print STDERR "Data line 1 is length \"" . length($data) . "\" \"$data\"\n";
++    my $len = unpack("C", $data);
++    while ($len > length($data)+21 && defined($line = $in->getline)) {
++      $data .= $H2B->next($line);
++    }
++    $data = substr($data, 22+$len);
++    $out->print($data);
++    #}
++    while (defined($_ = $in->getline)) {
++        $line = $_;
++        $data = $H2B->next($line);
++        #print STDERR "Data is length " . length($data) . " \"$data\"\n";
++        $out->print($data);
++        #chomp $line;
++        #print STDERR "Line is length " . length($line) . " \"$line\"\n";
++        #print STDERR "Line matches end\n" if $line =~ /:$/;
++        last if $line =~ /:$/;
++    }
++    #print STDERR "Broken out of loop\n";
++    #print STDERR "file incomplete, no end found\n" if !defined($_); # eof
++    1;
++}
++
++#------------------------------
++#
++# encode_it IN, OUT
++#
++sub encode_it {
++    my ($self, $in, $out) = @_;
++    my $line;
++    my $buf = '';
++
++    my $fname = (($self->head &&
++		  $self->head->mime_attr('content-disposition.filename')) ||
++		 '');
++    my $B2H = Convert::BinHex->bin2hex;
++    $out->print("(This file must be converted with BinHex 4.0)\n");
++    #while (defined($line = <$in>)) {
++    while ($in->read($buf, 1000)) {
++      $out->print($B2H->next($buf));
++    }
++    $out->print($B2H->done);
++    1;
++}
++
++#------------------------------
++#
++# last_preamble
++#
++# Return the last preamble as ref to array of lines.
++# Gets reset by decode_it().
++#
++sub last_preamble {
++    my $self = shift;
++    return $self->{MDU_Preamble} || [];
++}
++
++#------------------------------
++#
++# last_mode
++#
++# Return the last mode.
++# Gets reset to undef by decode_it().
++#
++sub last_mode {
++    shift->{MDU_Mode};
++}
++
++#------------------------------
++#
++# last_filename
++#
++# Return the last filename.
++# Gets reset by decode_it().
++#
++sub last_filename {
++    shift->{MDU_File} || undef; #[];
++}
++
++#------------------------------
++1;
+--- lib/MIME/Decoder.pm.orig	Sun Aug  1 22:44:50 2004
++++ lib/MIME/Decoder.pm	Sun Aug  1 22:45:10 2004
+@@ -111,6 +111,7 @@
+     'quoted-printable' => 'MIME::Decoder::QuotedPrint',
+
+   ### Non-standard...
++    'binhex'     => 'MIME::Decoder::BinHex',
+     'x-uu'       => 'MIME::Decoder::UU',
+     'x-uuencode' => 'MIME::Decoder::UU',
+
+--- lib/MIME/Parser.pm	Tue Aug 31 18:54:05 2004
++++ lib/MIME/Parser.pm	Tue Aug 31 18:53:33 2004
+@@ -799,10 +802,11 @@
+     $self->debug("extract uuencode? ", $self->extract_uuencode);
+     $self->debug("encoding?         ", $encoding);
+     $self->debug("effective type?   ", $ent->effective_type);
++
+     if ($self->extract_uuencode and
+ 	($encoding =~ /^(7bit|8bit|binary)\Z/) and
+-	($ent->effective_type =~ m{^text/plain\Z})) {
+-
++	($ent->effective_type =~
++		m{^(?:text/plain|application/mac-binhex40|application/mac-binhex)\Z})) {
+ 	### Hunt for it:
+ 	my $uu_ent = eval { $self->hunt_for_uuencode($ENCODED, $ent) };
+ 	if ($uu_ent) {   ### snark
+@@ -842,14 +844,21 @@
+ #
+ sub hunt_for_uuencode {
+     my ($self, $ENCODED, $ent) = @_;
+-    my $good;
++    my ($good, $jkfis);
+     local $_;
+     $self->debug("sniffing around for UUENCODE");
+
+     ### Heuristic:
+     $ENCODED->seek(0,0);
+     while (defined($_ = $ENCODED->getline)) {
+-	last if ($good = /^begin [0-7]{3}/);
++        if ($good = /^begin [0-7]{3}/) {
++          $jkfis = 'uu';
++          last;
++        }
++        if ($good = /^\(This file must be converted with/i) {
++          $jkfis = 'binhex';
++          last;
++        }
+     }
+     $good or do { $self->debug("no one made the cut"); return 0 };
+
+@@ -860,7 +869,9 @@
+
+     ### Made the first cut; on to the real stuff:
+     $ENCODED->seek(0,0);
+-    my $decoder = MIME::Decoder->new('x-uuencode');
++    my $decoder = MIME::Decoder->new(($jkfis eq 'uu')?'x-uuencode'
++                                                     :'binhex');
++    $self->whine("Found a $jkfis attachment");
+     my $pre;
+     while (1) {
+ 	my @bin_data;
+@@ -910,12 +921,11 @@
+
+     ### Did we get anything?
+     @parts or return undef;
+-
+     ### Set the parts and a nice preamble:
+     $top_ent->parts(\@parts);
+     $top_ent->preamble
+ 	(["The following is a multipart MIME message which was extracted\n",
+-	  "from a uuencoded message.\n"]);
++          "from a $jkfis-encoded message.\n"]);
+     $top_ent;
+ }
+
Index: files/patch-Parser-MaxParts
===================================================================
RCS file: files/patch-Parser-MaxParts
diff -N files/patch-Parser-MaxParts
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-Parser-MaxParts	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,81 @@
+--- lib/MIME/Parser.pm.orig	Tue Aug 31 18:54:05 2004
++++ lib/MIME/Parser.pm	Tue Aug 31 18:53:33 2004
+@@ -250,6 +250,7 @@
+     $self->{MP5_IgnoreErrors}    = 1;
+     $self->{MP5_UseInnerFiles}   = 0;
+     $self->{MP5_UUDecode}        = 0;
++    $self->{MP5_MaxParts}	 = -1;
+
+     $self->interface(ENTITY_CLASS => 'MIME::Entity');
+     $self->interface(HEAD_CLASS   => 'MIME::Head');
+@@ -277,6 +278,7 @@
+     $self->{MP5_Filer}->results($self->{MP5_Results});
+     $self->{MP5_Filer}->init_parse();
+     $self->{MP5_Filer}->purgeable([]);   ### just to be safe
++    $self->{MP5_NumParts} = 0;
+     1;
+ }
+
+@@ -969,11 +980,19 @@
+ #    Retype => retype this part to the given content-type
+ #
+ # Return the entity.
+-# Fatal exception on failure.
++# Fatal exception on failure. Returns undef if message to complex
+ #
+ sub process_part {
+     my ($self, $in, $rdr, %p) = @_;
+
++    if ($self->{MP5_MaxParts} > 0) {
++	$self->{MP5_NumParts}++;
++	if ($self->{MP5_NumParts} > $self->{MP5_MaxParts}) {
++		# Return UNDEF if msg too complex
++		return undef;
++	}
++    }
++
+     $rdr ||= MIME::Parser::Reader->new;
+     #debug "process_part";
+     $self->results->level(+1);
+@@ -1094,6 +1112,8 @@
+
+ Returns the parsed MIME::Entity on success.
+ Throws exception on failure.
++If the message contained too many
++parts (as set by I<max_parts>), returns undef.
+
+ =cut
+
+@@ -1351,6 +1371,32 @@
+     my $self = shift;
+     &MIME::Tools::whine("evil_filename deprecated in MIME::Parser");
+     $self->filer->evil_filename(@_);
++}
++
++#------------------------------
++
++=item max_parts NUM
++
++I<Instance method.>
++Limits the number of MIME parts we will parse.
++
++Normally, instances of this class parse a message to the bitter end.
++Messages with many MIME parts can cause excessive memory consumption.
++If you invoke this method, parsing will abort with a die() if a message
++contains more than NUM parts.
++
++If NUM is set to -1 (the default), then no maximum limit is enforced.
++
++With no argument, returns the current setting as an integer
++
++=cut
++
++sub max_parts {
++    my($self, $num) = @_;
++    if (@_ > 1) {
++       $self->{MP5_MaxParts} = $num;
++    }
++    return $self->{MP5_MaxParts};
+ }
+
+ #------------------------------
Index: files/patch-ParserUndef
===================================================================
RCS file: files/patch-ParserUndef
diff -N files/patch-ParserUndef
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ files/patch-ParserUndef	31 Aug 2004 18:06:53 -0000
@@ -0,0 +1,43 @@
+--- lib/MIME/Parser.pm	Tue Aug 31 18:54:05 2004
++++ lib/MIME/Parser.pm	Tue Aug 31 18:53:33 2004
+@@ -708,6 +710,7 @@
+
+ 	### Parse the next part, and add it to the entity...
+ 	my $part = $self->process_part($in, $part_rdr, Retype=>$retype);
++        return undef unless defined($part);
+ 	$ent->add_part($part);
+
+ 	### ...and look at how we finished up:
+@@ -944,6 +954,7 @@
+
+     ### Parse the message:
+     my $msg = $self->process_part($in, $rdr);
++    return undef unless defined($msg);
+
+     ### How to handle nested messages?
+     if ($self->extract_nested_messages eq 'REPLACE') {
+@@ -1005,14 +1024,14 @@
+
+     ### Handle, according to the MIME type:
+     if ($type eq 'multipart') {
+-	$self->process_multipart($in, $rdr, $ent);
++        return undef unless defined($self->process_multipart($in, $rdr, $ent));
+     }
+     elsif (("$type/$subtype" eq "message/rfc822" ||
+             "$type/$subtype" eq "message/external-body" ||
+ 	    ("$type/$subtype" eq "message/partial" && $head->mime_attr("content-type.number") == 1)) &&
+ 	    $self->extract_nested_messages) {
+ 	$self->debug("attempting to process a nested message");
+-	$self->process_message($in, $rdr, $ent);
++	return undef unless defined($self->process_message($in, $rdr, $ent));
+     }
+     else {
+ 	$self->process_singlepart($in, $rdr, $ent);
+@@ -1080,7 +1080,6 @@
+ =back
+
+ Returns the parsed MIME::Entity on success.
+-Throws exception on failure.
+
+ =cut
+
--0-923124273-1093976058=:6407
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="MIMETools.diff"
Content-Transfer-Encoding: BASE64
Content-ID: <20040831201418.O6407@cvs.imp.ch>
Content-Description: 
Content-Disposition: ATTACHMENT; FILENAME="MIMETools.diff"

SW5kZXg6IE1ha2VmaWxlDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1Mg
ZmlsZTogL2hvbWUvcGN2cy9wb3J0cy9tYWlsL3A1LU1JTUUtVG9vbHMvTWFr
ZWZpbGUsdg0KcmV0cmlldmluZyByZXZpc2lvbiAxLjI3DQpkaWZmIC11IC1y
MS4yNyBNYWtlZmlsZQ0KLS0tIE1ha2VmaWxlCTE5IE5vdiAyMDAzIDEwOjAw
OjQ1IC0wMDAwCTEuMjcNCisrKyBNYWtlZmlsZQkzMSBBdWcgMjAwNCAxODow
Njo1MyAtMDAwMA0KQEAgLTcsOCArNyw4IEBADQogDQogUE9SVE5BTUU9CXA1
LU1JTUUtVG9vbHMNCiBQT1JUVkVSU0lPTj0JNS40MTFhDQotUE9SVFJFVklT
SU9OPQkzDQotUE9SVEVQT0NIPQkxDQorUE9SVFJFVklTSU9OPQk0DQorUE9S
VEVQT0NIPQkyDQogQ0FURUdPUklFUz0JbWFpbCBwZXJsNQ0KIE1BU1RFUl9T
SVRFUz0JJHtNQVNURVJfU0lURV9QRVJMX0NQQU59DQogTUFTVEVSX1NJVEVf
U1VCRElSPQlNSU1FDQpAQCAtMTgsNyArMTgsOSBAQA0KIENPTU1FTlQ9CUEg
c2V0IG9mIHBlcmw1IG1vZHVsZXMgZm9yIE1JTUUNCiANCiBCVUlMRF9ERVBF
TkRTPQkke1NJVEVfUEVSTH0vTWFpbC9IZWFkZXIucG06JHtQT1JUU0RJUn0v
bWFpbC9wNS1NYWlsLVRvb2xzIFwNCi0JCSR7U0lURV9QRVJMfS9JTy9XcmFw
LnBtOiR7UE9SVFNESVJ9L2RldmVsL3A1LUlPLXN0cmluZ3kNCisJCSR7U0lU
RV9QRVJMfS9JTy9XcmFwLnBtOiR7UE9SVFNESVJ9L2RldmVsL3A1LUlPLXN0
cmluZ3kgXA0KKwkJJHtTSVRFX1BFUkx9L0NvbnZlcnQvQmluSGV4LnBtOiR7
UE9SVFNESVJ9L2NvbnZlcnRlcnMvcDUtQ29udmVydC1CaW5IZXggXA0KKwkJ
JHtTSVRFX1BFUkx9LyR7UEVSTF9BUkNIfS9NSU1FL0Jhc2U2NC5wbToke1BP
UlRTRElSfS9jb252ZXJ0ZXJzL3A1LU1JTUUtQmFzZTY0DQogUlVOX0RFUEVO
RFM9CSR7QlVJTERfREVQRU5EU30NCiANCiBQRVJMX0NPTkZJR1VSRT0JWUVT
DQpAQCAtNDgsOSArNTAsNiBAQA0KIA0KIC5pbmNsdWRlIDxic2QucG9ydC5w
cmUubWs+DQogDQotLmlmICR7UEVSTF9MRVZFTH0gPCA1MDA4MDANCi1CVUlM
RF9ERVBFTkRTKz0JJHtTSVRFX1BFUkx9LyR7UEVSTF9BUkNIfS9NSU1FL0Jh
c2U2NC5wbToke1BPUlRTRElSfS9jb252ZXJ0ZXJzL3A1LU1JTUUtQmFzZTY0
DQotLmVuZGlmDQogDQogcG9zdC1wYXRjaDoNCiAJQCR7Uk19IC1mICR7V1JL
U1JDfS9saWIvTUlNRS9GaWVsZC9QYXJhbVZhbC5wbS5vcmlnIFwNCkluZGV4
OiBmaWxlcy9wYXRjaC03b3I4Yml0LmRpZmYNCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0NClJDUyBmaWxlOiBmaWxlcy9wYXRjaC03b3I4Yml0LmRpZmYNCmRp
ZmYgLU4gZmlsZXMvcGF0Y2gtN29yOGJpdC5kaWZmDQotLS0gL2Rldi9udWxs
CTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDANCisrKyBmaWxlcy9wYXRjaC03
b3I4Yml0LmRpZmYJMzEgQXVnIDIwMDQgMTg6MDY6NTMgLTAwMDANCkBAIC0w
LDAgKzEsMjAgQEANCistLS0gbGliL01JTUUvSGVhZC5wbS5vcmlnCVNhdCBO
b3YgIDQgMjA6NTQ6NDYgMjAwMA0KKysrKyBsaWIvTUlNRS9IZWFkLnBtCVdl
ZCBBdWcgMjUgMTE6MTI6MjUgMjAwNA0KK0BAIC02ODUsMTEgKzY4NSwxNiBA
QA0KKyAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSAtLSB0aGF0IGlz
LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN0JJVCIgDQorICAgICBp
cyBhc3N1bWVkIGlmIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhl
YWRlciBmaWVsZCBpcyBub3QgcHJlc2VudC4NCisgDQorK0kgZG8gb25lIG90
aGVyIGZvcm0gb2YgZml4dXA6ICI3X2JpdCIsICI3LWJpdCIsIGFuZCAiNyBi
aXQiIGFyZQ0KKytjb3JyZWN0ZWQgdG8gIjdiaXQiOyBsaWtld2lzZSBmb3Ig
IjhiaXQiLg0KKysNCisgPWN1dA0KKyANCisgc3ViIG1pbWVfZW5jb2Rpbmcg
ew0KKyAgICAgbXkgJHNlbGYgPSBzaGlmdDsNCistICAgIGxjKCRzZWxmLT5t
aW1lX2F0dHIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSB8fCAnN2Jp
dCcpOw0KKysgICAgbXkgJGVuYyA9IGxjKCRzZWxmLT5taW1lX2F0dHIoJ2Nv
bnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKSB8fCAnN2JpdCcpOw0KKysgICAg
JGVuYyA9fiBze14oWzc4XSlbIF8tXWJpdFxafXskMWJpdH07DQorKyAgICAk
ZW5jOw0KKyB9DQorIA0KKyAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tDQpJbmRleDogZmlsZXMvcGF0Y2gtQmVuY2htYXJrDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMvcGF0Y2gtQmVuY2htYXJr
DQpkaWZmIC1OIGZpbGVzL3BhdGNoLUJlbmNobWFyaw0KLS0tIC9kZXYvbnVs
bAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gt
QmVuY2htYXJrCTMxIEF1ZyAyMDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCww
ICsxLDg4IEBADQorLS0tIGxpYi9NSU1FL1BhcnNlci5wbS5vcmlnCVdlZCBB
dWcgMjUgMTE6MTk6NDQgMjAwNA0KKysrKyBsaWIvTUlNRS9QYXJzZXIucG0J
V2VkIEF1ZyAyNSAxMToyMzozOSAyMDA0DQorQEAgLTU4MiwxMCArNTgyLDcg
QEANCisgICAgIG15ICgkc2VsZiwgJGluLCAkcmRyLCAkb3V0KSA9IEBfOyAg
ICAgICAgDQorIA0KKyAgICAgIyMjIFBhcnNlOg0KKy0gICAgbXkgJGJtID0g
YmVuY2htYXJrIHsNCistCSRyZHItPnJlYWRfY2h1bmsoJGluLCAkb3V0KTsN
CistICAgIH07DQorLSAgICAkc2VsZi0+ZGVidWcoInQgYm91bmQ6ICRibSIp
Ow0KKysgICAgJHJkci0+cmVhZF9jaHVuaygkaW4sICRvdXQpOw0KKyAgICAg
MTsNCisgfQ0KKyANCitAQCAtODI4LDExICs4MjUsOCBAQA0KKyANCisgICAg
ICMjIyBEZWNvZGUgYW5kIHNhdmUgdGhlIGJvZHkgKHVzaW5nIHRoZSBkZWNv
ZGVyKToNCisgICAgIG15ICRERUNPREVEID0gJGJvZHktPm9wZW4oInciKSB8
fCBkaWUgIiRNRTogYm9keSBub3Qgb3BlbmVkOiAkIVxuIjsgDQorLSAgICBt
eSAkYm0gPSBiZW5jaG1hcmsgew0KKy0JZXZhbCB7ICRkZWNvZGVyLT5kZWNv
ZGUoJEVOQ09ERUQsICRERUNPREVEKTsgfTsgDQorLQkkQCBhbmQgJHNlbGYt
PmVycm9yKCRAKTsNCistICAgIH07DQorLSAgICAkc2VsZi0+ZGVidWcoInQg
ZGVjb2RlOiAkYm0iKTsNCisrICAgIGV2YWwgeyAkZGVjb2Rlci0+ZGVjb2Rl
KCRFTkNPREVELCAkREVDT0RFRCk7IH07IA0KKysgICAgJEAgYW5kICRzZWxm
LT5lcnJvcigkQCk7DQorICAgICAkREVDT0RFRC0+Y2xvc2U7DQorICAgICAN
CisgICAgICMjIyBTdWNjZXNzISAgUmVtZW1iZXIgd2hlcmUgd2UgcHV0IHN0
dWZmOg0KK0BAIC0xMTM0LDExICsxMTI4LDggQEANCisgICAgIG15ICRlbnRp
dHk7DQorICAgICBsb2NhbCAkLyA9ICJcbiI7ICAgICMjIyBqdXN0IHRvIGJl
IHNhZmUNCisgDQorLSAgICBteSAkYm0gPSBiZW5jaG1hcmsgew0KKy0JJHNl
bGYtPmluaXRfcGFyc2U7DQorLQkoJGVudGl0eSkgPSAkc2VsZi0+cHJvY2Vz
c19wYXJ0KCRpbiwgdW5kZWYpOyAgIyMjIHBhcnNlIQ0KKy0gICAgfTsNCist
ICAgICRzZWxmLT5kZWJ1ZygidCBwYXJzZTogJGJtIik7DQorKyAgICAkc2Vs
Zi0+aW5pdF9wYXJzZTsNCisrICAgICgkZW50aXR5KSA9ICRzZWxmLT5wcm9j
ZXNzX3BhcnQoJGluLCB1bmRlZik7ICAjIyMgcGFyc2UhDQorIA0KKyAgICAg
JGVudGl0eTsNCisgfQ0KKy0tLSBsaWIvTUlNRS9Ub29scy5wbS5vcmlnCVdl
ZCBBdWcgMjUgMTA6NDc6MzIgMjAwNA0KKysrKyBsaWIvTUlNRS9Ub29scy5w
bQlXZWQgQXVnIDI1IDEwOjUwOjQxIDIwMDQNCitAQCAtMjQsNyArMjQsNyBA
QA0KKyAgICAgJ2NvbmZpZycgID0+IFtxdyglQ09ORklHKV0sDQorICAgICAn
bXNncycgICAgPT4gW3F3KHVzYWdlIGRlYnVnIHdoaW5lIGVycm9yKV0sDQor
ICAgICAnbXNndHlwZXMnPT4gW3F3KCRNX0RFQlVHICRNX1dBUk5JTkcgJE1f
RVJST1IpXSwJCQ0KKy0gICAgJ3V0aWxzJyAgID0+IFtxdyhiZW5jaG1hcmsg
Y2F0ZmlsZSBzaGVsbHF1b3RlIHRleHR1YWxfdHlwZSB0bXBvcGVuICldLA0K
KysgICAgJ3V0aWxzJyAgID0+IFtxdyhjYXRmaWxlIHNoZWxscXVvdGUgdGV4
dHVhbF90eXBlIHRtcG9wZW4gKV0sDQorICAgICApOw0KKyBFeHBvcnRlcjo6
ZXhwb3J0X29rX3RhZ3MoJ2NvbmZpZycsICdtc2dzJywgJ21zZ3R5cGVzJywg
J3V0aWxzJyk7DQorIA0KK0BAIC0xNTMsMjYgKzE1Myw2IEBADQorIA0KKyAj
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICMNCistIyBiZW5j
aG1hcmsgQ09ERQ0KKy0jDQorLSMgUHJpdmF0ZSBiZW5jaG1hcmtpbmcgdXRp
bGl0eS4NCistIw0KKy1zdWIgYmVuY2htYXJrKCYpIHsNCistICAgIG15ICgk
Y29kZSkgPSBAXzsNCistICAgIGlmICgxKSB7DQorLQlteSAkdDAgPSBuZXcg
QmVuY2htYXJrOw0KKy0JJiRjb2RlOw0KKy0JbXkgJHQxID0gbmV3IEJlbmNo
bWFyazsNCistCXJldHVybiB0aW1lc3RyKHRpbWVkaWZmKCR0MSwgJHQwKSk7
DQorLSAgICB9DQorLSAgICBlbHNlIHsNCistCSYkY29kZTsNCistCXJldHVy
biAiIjsNCistICAgIH0NCistfQ0KKy0NCistIy0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQ0KKy0jDQorICMgY2F0ZmlsZSBESVIsIEZJTEUNCisg
Iw0KKyAjIERpcmVjdG9yeS9maWxlIGNvbmNhdGVuYXRpb24uDQorQEAgLTEz
OTQsNyArMTM3NCw2IEBADQorICAgICAgICBOZXdsaW5lcyBpbiB0aGUgdm9p
ZA0KKyANCisgU3RhcnRlZCB1c2luZyBCZW5jaG1hcmsgZm9yIGJlbmNobWFy
a2luZy4NCistDQorIA0KKyA9aXRlbSBWZXJzaW9uIDUuMjA1ICAgKDIwMDAv
MDYvMDYpDQorIA0KSW5kZXg6IGZpbGVzL3BhdGNoLURlY29kZXItcXBkZWNv
ZGUNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiBmaWxlcy9w
YXRjaC1EZWNvZGVyLXFwZGVjb2RlDQpkaWZmIC1OIGZpbGVzL3BhdGNoLURl
Y29kZXItcXBkZWNvZGUNCi0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDow
MDowMCAtMDAwMA0KKysrIGZpbGVzL3BhdGNoLURlY29kZXItcXBkZWNvZGUJ
MzEgQXVnIDIwMDQgMTg6MDY6NTMgLTAwMDANCkBAIC0wLDAgKzEsMzAgQEAN
CistLS0gbGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5vcmlnCVR1
ZSBBdWcgMzEgMTc6MDI6NDMgMjAwNA0KKysrKyBsaWIvTUlNRS9EZWNvZGVy
L1F1b3RlZFByaW50LnBtCVR1ZSBBdWcgMzEgMTc6MDI6MzggMjAwNA0KK0BA
IC04NSw5ICs4NSwyNiBAQA0KKyAjDQorIHN1YiBkZWNvZGVfaXQgew0KKyAg
ICAgbXkgKCRzZWxmLCAkaW4sICRvdXQpID0gQF87DQorKyAgICBteSAkaW5p
dCA9IDA7DQorKyAgICBteSAkaGF2ZXBkZiA9IDA7DQorIA0KKyAgICAgd2hp
bGUgKGRlZmluZWQoJF8gPSAkaW4tPmdldGxpbmUpKSB7DQorLQkkb3V0LT5w
cmludChkZWNvZGVfcXAoJF8pKTsNCisrCWlmICghJGluaXQpIHsNCisrCQlp
ZiAoJF8gPX4gL14lUERGLykgew0KKysJCQkkaW5pdCA9IDE7DQorKwkJCSRo
YXZlcGRmID0gMTsNCisrCQl9DQorKwl9DQorKwlpZiAoJGhhdmVwZGYpIHsN
CisrCQlteSAkb3V0cHV0ID0gJF87DQorKwkJJG91dHB1dCA9fiBzL1sgXHRd
Kz8oXHI/XG4pLyQxL2c7ICAjIHJ1bGUgIzMgKHRyYWlsaW5nIHNwYWNlIG11
c3QgYmUgZGVsZXRlZCkNCisrCQkkb3V0cHV0ID1+IHMvPVxyP1xuLy9nOyAg
ICAgICAgICAgICMgcnVsZSAjNSAoc29mdCBsaW5lIGJyZWFrcykNCisrCQkk
b3V0cHV0ID1+IHMvKF58W15ccl0pXG5cWi8kMVxyXG4vOyAgIyBKS0YgcnVs
ZSB0byByZXBsYWNlIHRyYWlsaW5nIFxuIHdpdGggXHJcbg0KKysJCSRvdXRw
dXQgPX4gcy89KFtcZGEtZkEtRl17Mn0pL3BhY2soIkMiLCBoZXgoJDEpKS9n
ZTsNCisrCQkkb3V0LT5wcmludCgkb3V0cHV0KTsNCisrCX0gZWxzZSB7DQor
KwkJJG91dC0+cHJpbnQoZGVjb2RlX3FwKCRfKSk7DQorKwl9DQorICAgICB9
DQorICAgICAxOw0KKyB9DQpJbmRleDogZmlsZXMvcGF0Y2gtRGVjb2Rlci1x
cGVuY29kZQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IGZp
bGVzL3BhdGNoLURlY29kZXItcXBlbmNvZGUNCmRpZmYgLU4gZmlsZXMvcGF0
Y2gtRGVjb2Rlci1xcGVuY29kZQ0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcw
IDAwOjAwOjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gtRGVjb2Rlci1xcGVu
Y29kZQkzMSBBdWcgMjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSwx
MjggQEANCistLS0gbGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5v
cmlnCVdlZCBBdWcgMjUgMTE6NDY6NDUgMjAwNA0KKysrKyBsaWIvTUlNRS9E
ZWNvZGVyL1F1b3RlZFByaW50LnBtCVdlZCBBdWcgMjUgMTE6NDg6MjcgMjAw
NA0KK0BAIC01NCw3ICs1NCw3IEBADQorIA0KKyB1c2UgdmFycyBxdyhASVNB
ICRWRVJTSU9OKTsNCisgdXNlIE1JTUU6OkRlY29kZXI7DQorLXVzZSBNSU1F
OjpRdW90ZWRQcmludCAyLjAzOw0KKyt1c2UgTUlNRTo6UXVvdGVkUHJpbnQg
My4wMzsNCisgDQorIEBJU0EgPSBxdyhNSU1FOjpEZWNvZGVyKTsNCisgDQor
QEAgLTYzLDcgKzYzLDcgQEANCisgDQorICMtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0NCisgIw0KKy0jIGVuY29kZV9xcF9yZWFsbHkgU1RSSU5H
DQorKyMgZW5jb2RlX3FwX3JlYWxseSBTVFJJTkcgVEVYVFVBTF9UWVBFX0ZM
QUcNCisgIw0KKyAjIEVuY29kZSBRUCwgYW5kIHRoZW4gZm9sbG93IGd1aWRl
bGluZSA4IGZyb20gUkZDIDIwNDkgKHRoYW5rcyB0byBEZW5pcyANCisgIyBO
LiBBbnRvbmlvbGkpIHdoZXJlYnkgd2UgbWFrZSB0aGluZ3MgYSBsaXR0bGUg
c2FmZXIgZm9yIHRoZSB0cmFuc3BvcnQNCitAQCAtNzEsNyArNzEsNyBAQA0K
KyAjIGdyb3cgYmV5b25kIDc2IGNoYXJhY3RlcnMhDQorICMNCisgc3ViIGVu
Y29kZV9xcF9yZWFsbHkgew0KKy0gICAgbXkgJGVuYyA9IGVuY29kZV9xcCgk
X1swXSk7DQorKyAgICBteSAkZW5jID0gZW5jb2RlX3FwKHNoaWZ0LCB1bmRl
Ziwgbm90IHNoaWZ0KTsNCisgICAgIGlmIChsZW5ndGgoJGVuYykgPCA3NCkg
ew0KKyAJJGVuYyA9fiBzL15cLiQvPTJFL2c7ICAgICAgICAgIyBmb3JjZSBl
bmNvZGluZyBvZiAvXlwuJC8NCisgCSRlbmMgPX4gcy9eRnJvbSAvPTQ2cm9t
IC9nOyAgICMgZm9yY2UgZW5jb2Rpbmcgb2YgL15Gcm9tIC8NCitAQCAtOTcs
MTAgKzk3LDEwIEBADQorICMgZW5jb2RlX2l0IElOLCBPVVQNCisgIw0KKyBz
dWIgZW5jb2RlX2l0IHsNCistICAgIG15ICgkc2VsZiwgJGluLCAkb3V0KSA9
IEBfOw0KKysgICAgbXkgKCRzZWxmLCAkaW4sICRvdXQsICR0ZXh0dWFsX3R5
cGUpID0gQF87DQorIA0KKyAgICAgd2hpbGUgKGRlZmluZWQoJF8gPSAkaW4t
PmdldGxpbmUpKSB7DQorLQkkb3V0LT5wcmludChlbmNvZGVfcXBfcmVhbGx5
KCRfKSk7DQorKwkkb3V0LT5wcmludChlbmNvZGVfcXBfcmVhbGx5KCRfLCAk
dGV4dHVhbF90eXBlKSk7DQorICAgICB9DQorICAgICAxOw0KKyB9DQorLS0t
IGxpYi9NSU1FL0RlY29kZXIucG0ub3JpZwlXZWQgQXVnIDI1IDExOjQ5OjQy
IDIwMDQNCisrKysgbGliL01JTUUvRGVjb2Rlci5wbQlXZWQgQXVnIDI1IDEx
OjUwOjI2IDIwMDQNCitAQCAtMjQ4LDE0ICsyNDgsMTQgQEANCisgPWN1dA0K
KyANCisgc3ViIGVuY29kZSB7DQorLSAgICBteSAoJHNlbGYsICRpbiwgJG91
dCkgPSBAXzsNCisrICAgIG15ICgkc2VsZiwgJGluLCAkb3V0LCAkdGV4dHVh
bF90eXBlKSA9IEBfOw0KKyAgICAgDQorICAgICAjIyMgQ29lcmNlIG9sZC1z
dHlsZSBmaWxlaGFuZGxlcyB0byBsZWdpdCBvYmplY3RzLCBhbmQgZG8gaXQh
DQorICAgICAkaW4gID0gd3JhcGhhbmRsZSgkaW4pOw0KKyAgICAgJG91dCA9
IHdyYXBoYW5kbGUoJG91dCk7DQorIA0KKyAgICAgIyMjIEludm9rZSBiYWNr
LWVuZCBtZXRob2QgdG8gZG8gdGhlIHdvcms6DQorLSAgICAkc2VsZi0+ZW5j
b2RlX2l0KCRpbiwgJG91dCkgfHwgDQorKyAgICAkc2VsZi0+ZW5jb2RlX2l0
KCRpbiwgJG91dCwgJHNlbGYtPmVuY29kaW5nIGVxICdxdW90ZWQtcHJpbnRh
YmxlJyA/ICgkdGV4dHVhbF90eXBlKSA6ICgpKSB8fA0KKyAJZGllICIkTUU6
ICIuJHNlbGYtPmVuY29kaW5nLiIgZW5jb2RpbmcgZmFpbGVkXG4iOw0KKyB9
DQorIA0KKy0tLSBsaWIvTUlNRS9FbnRpdHkucG0ub3JpZwlXZWQgQXVnIDI1
IDExOjUwOjU0IDIwMDQNCisrKysgbGliL01JTUUvRW50aXR5LnBtCVdlZCBB
dWcgMjUgMTE6NTE6MjUgMjAwNA0KK0BAIC0xODUzLDcgKzE4NTMsNyBAQA0K
KyANCisgICAgICMjIyBPdXRwdXQgdGhlIGJvZHk6DQorICAgICBteSAkSU8g
PSAkc2VsZi0+b3BlbigiciIpICAgICB8fCBkaWUgIm9wZW4gYm9keTogJCEi
Ow0KKy0gICAgJGRlY29kZXItPmVuY29kZSgkSU8sICRvdXQpICAgfHwgcmV0
dXJuIGVycm9yICJlbmNvZGluZyBmYWlsZWQiOw0KKysgICAgJGRlY29kZXIt
PmVuY29kZSgkSU8sICRvdXQsIHRleHR1YWxfdHlwZSgkc2VsZi0+aGVhZC0+
bWltZV90eXBlKSA/IDEgOiAwKSAgIHx8IGRpZSAiZW5jb2RpbmcgZmFpbGVk
XG4iOw0KKyAgICAgJElPLT5jbG9zZTsNCisgICAgIDE7DQorIH0NCistLS0g
bGliL01JTUUvRGVjb2Rlci9RdW90ZWRQcmludC5wbS5vcmlnCVRodSBBdWcg
MjYgMTI6Mjg6MzcgMjAwNA0KKysrKyBsaWIvTUlNRS9EZWNvZGVyL1F1b3Rl
ZFByaW50LnBtCVRodSBBdWcgMjYgMTI6Mjg6MjYgMjAwNA0KK0BAIC03Myw3
ICs3Myw3IEBADQorIHN1YiBlbmNvZGVfcXBfcmVhbGx5IHsNCisgICAgIG15
ICRlbmMgPSBlbmNvZGVfcXAoc2hpZnQsIHVuZGVmLCBub3Qgc2hpZnQpOw0K
KyAgICAgaWYgKGxlbmd0aCgkZW5jKSA8IDc0KSB7DQorLQkkZW5jID1+IHMv
XlwuJC89MkUvZzsgICAgICAgICAjIGZvcmNlIGVuY29kaW5nIG9mIC9eXC4k
Lw0KKysJJGVuYyA9fiBzL15cLlxuLz0yRVxuL2c7ICAgICAgIyBmb3JjZSBl
bmNvZGluZyBvZiAvXlwuJC8NCisgCSRlbmMgPX4gcy9eRnJvbSAvPTQ2cm9t
IC9nOyAgICMgZm9yY2UgZW5jb2Rpbmcgb2YgL15Gcm9tIC8NCisgICAgIH0N
CisgICAgICRlbmM7DQorLS0tIHQvTWlzYy50Lm9yaWcJU3VuIE1heSAyMSAw
NzoxNToyNiAyMDAwDQorKysrIHQvTWlzYy50CVRodSBBdWcgMjYgMTI6MzQ6
MjcgMjAwNA0KK0BAIC02LDcgKzYsNyBAQA0KKyANCisgIyBDcmVhdGUgY2hl
Y2tlcjoNCisgbXkgJFQgPSB0eXBpY2FsIEV4dFV0aWxzOjpUQm9uZTsNCist
JFQtPmJlZ2luKDcpOw0KKyskVC0+YmVnaW4oMTIpOw0KKyANCisgIy0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAjIEJ1ZyA5NzEwMDggZnJv
bSBNaWNoYWVsIFcuIE5vcm1hbmRpbiA8bWljaGFlbC5ub3JtYW5kaW5AY3Nm
Yi5jb20+Og0KK0BAIC02NywxMyArNjcsMjkgQEANCisgIyAgICAkcmVzID1+
IHMvXC4vPTJFL2dvOw0KKyAjICAgICRyZXMgPX4gcy9Gcm9tIC89NDZyb20g
L2dvOw0KKyAjIGF0IHRoZSBzdGFydCBvZiBlbmNvZGVfcXBfcmVhbGx5IGlu
IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50Pw0KKysjDQorKyMgVGV4dHVh
bCBtb2RlLg0KKyt7DQorKyAgICB1c2UgTUlNRTo6RGVjb2Rlcjo6UXVvdGVk
UHJpbnQ7DQorKyAgICBteSAkcGFpcjsNCisrICAgIGZvcmVhY2ggJHBhaXIg
KFsiRnJvbSBtZSIsICAgIj00NnJvbSBtZT1cbiJdLA0KKysJCSAgIFsiLiIs
ICAgICAgICAgIi49XG4iXSwgICMgc29mdCBsaW5lLWJyZWFrDQorKwkJICAg
WyIuXG4iLCAgICAgICAiPTJFXG4iXSwgIyBsaW5lLWJyZWFrDQorKwkJICAg
WyIgRnJvbSB5b3UiLCAiIEZyb20geW91PVxuIl0pIHsNCisrCW15ICRvdXQg
PSBNSU1FOjpEZWNvZGVyOjpRdW90ZWRQcmludDo6ZW5jb2RlX3FwX3JlYWxs
eSgkcGFpci0+WzBdLCAxKTsNCisrCSRULT5va19lcSgkb3V0LCAkcGFpci0+
WzFdLA0KKysJCSAgImJ1ZyA5NzA3MjUtRE5BOiBRUCB1c2Ugb2YgUkZDMjA0
OSBndWlkZWxpbmUgOCIpOw0KKysgICAgfQ0KKyt9DQorKyMgQmluYXJ5IG1v
ZGUNCisgew0KKyAgICAgdXNlIE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50
Ow0KKyAgICAgbXkgJHBhaXI7DQorLSAgICBmb3JlYWNoICRwYWlyIChbIkZy
b20gbWUiLCAgICI9NDZyb20gbWUiXSwNCistCQkgICBbIi4iLCAgICAgICAg
ICI9MkUiXSwNCistCQkgICBbIiBGcm9tIHlvdSIsICIgRnJvbSB5b3UiXSkg
ew0KKy0JbXkgJG91dCA9IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50Ojpl
bmNvZGVfcXBfcmVhbGx5KCRwYWlyLT5bMF0pOw0KKysgICAgZm9yZWFjaCAk
cGFpciAoWyJGcm9tIG1lIiwgICAiPTQ2cm9tIG1lPVxuIl0sDQorKwkJICAg
WyIuIiwgICAgICAgICAiLj1cbiJdLCAgICAgIyBzb2Z0IGxpbmUtYnJlYWsN
CisrCQkgICBbIi5cbiIsICAgICAgICIuPTBBPVxuIl0sICAjIGxpbmUtYnJl
YWsNCisrCQkgICBbIiBGcm9tIHlvdSIsICIgRnJvbSB5b3U9XG4iXSkgew0K
KysJbXkgJG91dCA9IE1JTUU6OkRlY29kZXI6OlF1b3RlZFByaW50OjplbmNv
ZGVfcXBfcmVhbGx5KCRwYWlyLT5bMF0sIDApOw0KKyAJJFQtPm9rX2VxKCRv
dXQsICRwYWlyLT5bMV0sDQorIAkJICAiYnVnIDk3MDcyNS1ETkE6IFFQIHVz
ZSBvZiBSRkMyMDQ5IGd1aWRlbGluZSA4Iik7DQorICAgICB9DQpJbmRleDog
ZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVzcGFjZQ0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQ0KUkNTIGZpbGU6IGZpbGVzL3BhdGNoLUZpbGVyLnBtLXdo
aXRlc3BhY2UNCmRpZmYgLU4gZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVz
cGFjZQ0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAw
DQorKysgZmlsZXMvcGF0Y2gtRmlsZXIucG0td2hpdGVzcGFjZQkzMSBBdWcg
MjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSwyMyBAQA0KKy0tLSBs
aWIvTUlNRS9QYXJzZXIvRmlsZXIucG0JVGh1IE5vdiAyMyAwNjowNDowMyAy
MDAwDQorKysrIGxpYi9NSU1FL1BhcnNlci9GaWxlci5wbQlUaHUgQXVnIDI2
IDAwOjQyOjE4IDIwMDQNCitAQCAtMzU3LDggKzM1Nyw5IEBADQorICAgICAk
c2VsZi0+ZGVidWcoImlzIHRoaXMgZXZpbD8gJyRuYW1lJyIpOw0KKyANCisg
ICAgIHJldHVybiAxIGlmICghZGVmaW5lZCgkbmFtZSkgb3IgKCRuYW1lIGVx
ICcnKSk7ICAgIyMjIGVtcHR5DQorKyAgICByZXR1cm4gMSBpZiAoJG5hbWUg
PX4gbXsoXlxzKXwoXHMrXFopfSk7ICAjIyMgbGVhZGluZy90cmFpbGluZyB3
aGl0ZXNwYWNlDQorICAgICByZXR1cm4gMSBpZiAoJG5hbWUgPX4gbXteXC4r
XFp9KTsgICAgICAgICAjIyMgZG90cw0KKy0gICAgcmV0dXJuIDEgaWYgKCRu
YW1lID1+IHRye1xcLzpbXX17fSk7ICAgICAgIyMjIHBhdGggY2hhcmFjdGVy
cw0KKysgICAgcmV0dXJuIDEgaWYgKCRuYW1lID1+IC8oKD86W1xbXF1cXFwv
XDxcPlx8XD9cKlw6XCJdfFxwe0lzQ250cmx9KSkvKTsgIyMjIHBhdGggb3Ig
c3BlY2lhbCBjaGFyYWN0ZXJzDQorICAgICByZXR1cm4gMSBpZiAoJHNlbGYt
PntNUEZfTWF4TmFtZX0gYW5kIA0KKyAJCSAobGVuZ3RoKCRuYW1lKSA+ICRz
ZWxmLT57TVBGX01heE5hbWV9KSk7DQorICAgICANCitAQCAtNDAyLDYgKzQw
Myw5IEBADQorICAgICBteSAoJHJvb3QsICRleHQpID0gKCgkbGFzdCA9fiAv
XiguKilcLihbXlwuXSspXFovKSANCisgCQkJPyAoJDEsICQyKQ0KKyAJCQk6
ICgkbGFzdCwgJycpKTsNCisrICAgICMjIyBEZWxldGUgbGVhZGluZyBhbmQg
dHJhaWxpbmcgd2hpdGVzcGFjZQ0KKysgICAgJHJvb3QgPX4gcy9eXHMrLy87
DQorKyAgICAkZXh0ICA9fiBzL1xzKyQvLzsNCisgICAgICRyb290ID0gc3Vi
c3RyKCRyb290LCAwLCAoJHNlbGYtPntNUEZfVHJpbVJvb3R9IHx8IDE0KSk7
DQorICAgICAkZXh0ICA9IHN1YnN0cigkZXh0LCAgMCwgKCRzZWxmLT57TVBG
X1RyaW1FeHR9ICB8fCAgMykpOw0KKyAgICAgJGV4dCA9fiAvXlx3KyQvIG9y
ICRleHQgPSAiZGF0IjsNCkluZGV4OiBmaWxlcy9wYXRjaC1QYXJzZXItQmlu
SGV4DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMv
cGF0Y2gtUGFyc2VyLUJpbkhleA0KZGlmZiAtTiBmaWxlcy9wYXRjaC1QYXJz
ZXItQmluSGV4DQotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAgMDA6MDA6MDAg
LTAwMDANCisrKyBmaWxlcy9wYXRjaC1QYXJzZXItQmluSGV4CTMxIEF1ZyAy
MDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCwwICsxLDI2MCBAQA0KKy0tLSAv
ZGV2L251bGwJU3VuIEF1ZyAgMSAyMjo0NDowMiAyMDA0DQorKysrIGxpYi9N
SU1FL0RlY29kZXIvQmluSGV4LnBtCVN1biBBdWcgIDEgMjI6NDM6MTIgMjAw
NA0KK0BAIC0wLDAgKzEsMTgyIEBADQorK3BhY2thZ2UgTUlNRTo6RGVjb2Rl
cjo6QmluSGV4Ow0KKysNCisrDQorKz1oZWFkMSBOQU1FDQorKw0KKytNSU1F
OjpEZWNvZGVyOjpCaW5IZXggLSBkZWNvZGUgYSAiYmluaGV4IiBzdHJlYW0N
CisrDQorKw0KKys9aGVhZDEgU1lOT1BTSVMNCisrDQorK0EgZ2VuZXJpYyBk
ZWNvZGVyIG9iamVjdDsgc2VlIEw8TUlNRTo6RGVjb2Rlcj4gZm9yIHVzYWdl
Lg0KKysNCisrQWxzbyBzdXBwb3J0cyBhIHByZWFtYmxlKCkgbWV0aG9kIHRv
IHJlY292ZXIgdGV4dCBiZWZvcmUNCisrdGhlIGJpbmhleGVkIHBvcnRpb24g
b2YgdGhlIHN0cmVhbS4NCisrDQorKw0KKys9aGVhZDEgREVTQ1JJUFRJT04N
CisrDQorK0EgTUlNRTo6RGVjb2RlciBzdWJjbGFzcyBmb3IgYSBub25zdGFu
ZGFyZCBlbmNvZGluZyB3aGVyZWJ5DQorK2RhdGEgYXJlIGJpbmhleC1lbmNv
ZGVkLiAgQ29tbW9uIG5vbi1zdGFuZGFyZCBNSU1FIGVuY29kaW5ncyBmb3Ig
dGhpczoNCisrDQorKyAgICB4LXV1DQorKyAgICB4LXV1ZW5jb2RlDQorKw0K
KysNCisrPWhlYWQxIEFVVEhPUg0KKysNCisrSnVsaWFuIEZpZWxkIChGPG1h
aWxzY2FubmVyQGVjcy5zb3Rvbi5hYy51az4pLg0KKysNCisrQWxsIHJpZ2h0
cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSANCisraXQgYW5kL29yIG1vZGlmeSBpdCB1
bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4NCisrDQorKz1o
ZWFkMSBWRVJTSU9ODQorKw0KKyskUmV2aXNpb246IDEuMSAkICREYXRlOiAy
MDA0LzA4LzAxIDIwOjQ2OjE3ICQNCisrDQorKz1jdXQNCisrDQorKw0KKyty
ZXF1aXJlIDUuMDAyOw0KKyt1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsN
CisrdXNlIE1JTUU6OkRlY29kZXI7DQorK3VzZSBNSU1FOjpUb29scyBxdyh3
aGluZSk7DQorK3VzZSBDb252ZXJ0OjpCaW5IZXg7DQorKw0KKytASVNBID0g
cXcoTUlNRTo6RGVjb2Rlcik7DQorKw0KKysjIFRoZSBwYWNrYWdlIHZlcnNp
b24sIGJvdGggaW4gMS4yMyBzdHlsZSAqYW5kKiB1c2FibGUgYnkgTWFrZU1h
a2VyOg0KKyskVkVSU0lPTiA9IHN1YnN0ciBxJFJldmlzaW9uOiAxLjEgJCwg
MTA7DQorKw0KKysNCisrIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQ0KKysjDQorKyMgZGVjb2RlX2l0IElOLCBPVVQNCisrIw0KKytzdWIgZGVj
b2RlX2l0IHsNCisrICAgIG15ICgkc2VsZiwgJGluLCAkb3V0KSA9IEBfOw0K
KysgICAgbXkgKCRtb2RlLCAkZmlsZSk7DQorKyAgICBteSAoQHByZWFtYmxl
LCBAZGF0YSk7DQorKyAgICBsb2NhbCAkXzsNCisrICAgIG15ICRIMkIgPSBD
b252ZXJ0OjpCaW5IZXgtPmhleDJiaW47DQorKyAgICAjbXkgJEgyQiA9IENv
bnZlcnQ6OkJpbkhleC0+b3BlbigkaW4pOw0KKysgICAgbXkgJGxpbmU7DQor
Kw0KKysgICAgJHNlbGYtPntNRFVfUHJlYW1ibGV9ID0gXEBwcmVhbWJsZTsN
CisrICAgICRzZWxmLT57TURVX01vZGV9ID0gJzYwMCc7DQorKyAgICAkc2Vs
Zi0+e01EVV9GaWxlfSA9IHVuZGVmOw0KKysNCisrICAgICMjIyBGaW5kIGJl
Z2lubmluZy4uLg0KKysgICAgJE1haWxTY2FubmVyOjpCaW5IZXg6OklubGlu
ZSA9IDE7DQorKyAgICBpZiAoJE1haWxTY2FubmVyOjpCaW5IZXg6OklubGlu
ZSkgew0KKysgICAgICB3aGlsZSAoZGVmaW5lZCgkXyA9ICRpbi0+Z2V0bGlu
ZSkpIHsNCisrICAgICAgICAjcHJpbnQgU1RERVJSICJMaW5lIGlzIFwiJF9c
IlxuIjsNCisrICAgICAgICBpZiAoL15cKFRoaXMgZmlsZSBtdXN0IGJlIGNv
bnZlcnRlZC8pIHsNCisrICAgICAgICAgICRfID0gJGluLT5nZXRsaW5lOw0K
KysgICAgICAgICAgbGFzdCBpZiAvXjovOw0KKysgICAgICAgIH0NCisrICAg
ICAgICBwdXNoIEBwcmVhbWJsZSwgJF87DQorKyAgICAgIH0NCisrICAgICAg
ZGllKCJiaW5oZXggZGVjb2Rpbmc6IGZlbGwgb2ZmIGVuZCBvZiBmaWxlXG4i
KSBpZiAhZGVmaW5lZCgkXyk7DQorKyAgICB9IGVsc2Ugew0KKysgICAgICB3
aGlsZSAoZGVmaW5lZCgkXyA9ICRpbi0+Z2V0bGluZSkpIHsNCisrICAgICAg
ICAjIEZvdW5kIHRoZSBoZWFkZXI/IFNvIHN0YXJ0IGRlY29kaW5nIGl0DQor
KyAgICAgICAgbGFzdCBpZiAvXjovOw0KKysgICAgICAgIHB1c2ggQHByZWFt
YmxlLCAkXzsNCisrICAgICAgfQ0KKysgICAgICAjIyBoaXQgZW9mIQ0KKysg
ICAgICBkaWUoImJpbmhleCBkZWNvZGluZzogbm8gVGhpcyBmaWxlIG11c3Qg
YmUuLi4gZm91bmRcbiIpIGlmICFkZWZpbmVkKCRfKTsNCisrICAgIH0NCisr
DQorKyAgICAjIyMgRGVjb2RlOg0KKysgICAgIyBEb24ndCByZWx5IG9uIHRo
ZSBjb21tZW50IGFsd2F5cyBiZWluZyB0aGVyZQ0KKysgICAgIyRzZWxmLT53
aGluZSgiOkgyQiBpcyAkSDJCXG4iKTsNCisrICAgICMkc2VsZi0+d2hpbmUo
IkhlYWRlciBpcyAiIC4gJEgyQi0+cmVhZF9oZWFkZXIgLiAiXG4iKTsNCisr
ICAgICNAZGF0YSA9ICRIMkItPnJlYWRfZGF0YTsNCisrICAgICMkb3V0LT5w
cmludChAZGF0YSk7DQorKyAgICAjcHJpbnQgU1RERVJSICJFbmQgb2YgYmlu
aGV4IHN0cmVhbVxuIjsNCisrICAgICNyZXR1cm4gMTsNCisrICAgICNpZiAo
L146Lykgew0KKysgICAgbXkgJGRhdGE7DQorKyAgICAkZGF0YSA9ICRIMkIt
Pm5leHQoJF8pOyAjIG9yIHdoaW5lKCJOZXh0IGVycm9yIGlzICRAICQhXG4i
KTsNCisrICAgICNwcmludCBTVERFUlIgIkRhdGEgbGluZSAxIGlzIGxlbmd0
aCBcIiIgLiBsZW5ndGgoJGRhdGEpIC4gIlwiIFwiJGRhdGFcIlxuIjsNCisr
ICAgIG15ICRsZW4gPSB1bnBhY2soIkMiLCAkZGF0YSk7DQorKyAgICB3aGls
ZSAoJGxlbiA+IGxlbmd0aCgkZGF0YSkrMjEgJiYgZGVmaW5lZCgkbGluZSA9
ICRpbi0+Z2V0bGluZSkpIHsNCisrICAgICAgJGRhdGEgLj0gJEgyQi0+bmV4
dCgkbGluZSk7DQorKyAgICB9DQorKyAgICAkZGF0YSA9IHN1YnN0cigkZGF0
YSwgMjIrJGxlbik7DQorKyAgICAkb3V0LT5wcmludCgkZGF0YSk7DQorKyAg
ICAjfQ0KKysgICAgd2hpbGUgKGRlZmluZWQoJF8gPSAkaW4tPmdldGxpbmUp
KSB7DQorKyAgICAgICAgJGxpbmUgPSAkXzsNCisrICAgICAgICAkZGF0YSA9
ICRIMkItPm5leHQoJGxpbmUpOw0KKysgICAgICAgICNwcmludCBTVERFUlIg
IkRhdGEgaXMgbGVuZ3RoICIgLiBsZW5ndGgoJGRhdGEpIC4gIiBcIiRkYXRh
XCJcbiI7DQorKyAgICAgICAgJG91dC0+cHJpbnQoJGRhdGEpOw0KKysgICAg
ICAgICNjaG9tcCAkbGluZTsNCisrICAgICAgICAjcHJpbnQgU1RERVJSICJM
aW5lIGlzIGxlbmd0aCAiIC4gbGVuZ3RoKCRsaW5lKSAuICIgXCIkbGluZVwi
XG4iOw0KKysgICAgICAgICNwcmludCBTVERFUlIgIkxpbmUgbWF0Y2hlcyBl
bmRcbiIgaWYgJGxpbmUgPX4gLzokLzsNCisrICAgICAgICBsYXN0IGlmICRs
aW5lID1+IC86JC87DQorKyAgICB9DQorKyAgICAjcHJpbnQgU1RERVJSICJC
cm9rZW4gb3V0IG9mIGxvb3BcbiI7DQorKyAgICAjcHJpbnQgU1RERVJSICJm
aWxlIGluY29tcGxldGUsIG5vIGVuZCBmb3VuZFxuIiBpZiAhZGVmaW5lZCgk
Xyk7ICMgZW9mDQorKyAgICAxOw0KKyt9DQorKw0KKysjLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDQorKyMNCisrIyBlbmNvZGVfaXQgSU4sIE9V
VA0KKysjDQorK3N1YiBlbmNvZGVfaXQgew0KKysgICAgbXkgKCRzZWxmLCAk
aW4sICRvdXQpID0gQF87DQorKyAgICBteSAkbGluZTsNCisrICAgIG15ICRi
dWYgPSAnJzsNCisrDQorKyAgICBteSAkZm5hbWUgPSAoKCRzZWxmLT5oZWFk
ICYmIA0KKysJCSAgJHNlbGYtPmhlYWQtPm1pbWVfYXR0cignY29udGVudC1k
aXNwb3NpdGlvbi5maWxlbmFtZScpKSB8fA0KKysJCSAnJyk7DQorKyAgICBt
eSAkQjJIID0gQ29udmVydDo6QmluSGV4LT5iaW4yaGV4Ow0KKysgICAgJG91
dC0+cHJpbnQoIihUaGlzIGZpbGUgbXVzdCBiZSBjb252ZXJ0ZWQgd2l0aCBC
aW5IZXggNC4wKVxuIik7DQorKyAgICAjd2hpbGUgKGRlZmluZWQoJGxpbmUg
PSA8JGluPikpIHsNCisrICAgIHdoaWxlICgkaW4tPnJlYWQoJGJ1ZiwgMTAw
MCkpIHsNCisrICAgICAgJG91dC0+cHJpbnQoJEIySC0+bmV4dCgkYnVmKSk7
DQorKyAgICB9DQorKyAgICAkb3V0LT5wcmludCgkQjJILT5kb25lKTsNCisr
ICAgIDE7DQorK30NCisrDQorKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0NCisrIw0KKysjIGxhc3RfcHJlYW1ibGUNCisrIw0KKysjIFJldHVy
biB0aGUgbGFzdCBwcmVhbWJsZSBhcyByZWYgdG8gYXJyYXkgb2YgbGluZXMu
DQorKyMgR2V0cyByZXNldCBieSBkZWNvZGVfaXQoKS4NCisrIw0KKytzdWIg
bGFzdF9wcmVhbWJsZSB7DQorKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKysg
ICAgcmV0dXJuICRzZWxmLT57TURVX1ByZWFtYmxlfSB8fCBbXTsNCisrfQ0K
KysNCisrIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKysjDQor
KyMgbGFzdF9tb2RlDQorKyMNCisrIyBSZXR1cm4gdGhlIGxhc3QgbW9kZS4N
CisrIyBHZXRzIHJlc2V0IHRvIHVuZGVmIGJ5IGRlY29kZV9pdCgpLg0KKysj
DQorK3N1YiBsYXN0X21vZGUgew0KKysgICAgc2hpZnQtPntNRFVfTW9kZX07
DQorK30NCisrDQorKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N
CisrIw0KKysjIGxhc3RfZmlsZW5hbWUNCisrIw0KKysjIFJldHVybiB0aGUg
bGFzdCBmaWxlbmFtZS4NCisrIyBHZXRzIHJlc2V0IGJ5IGRlY29kZV9pdCgp
Lg0KKysjDQorK3N1YiBsYXN0X2ZpbGVuYW1lIHsNCisrICAgIHNoaWZ0LT57
TURVX0ZpbGV9IHx8IHVuZGVmOyAjW107DQorK30NCisrDQorKyMtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrMTsNCistLS0gbGliL01JTUUv
RGVjb2Rlci5wbS5vcmlnCVN1biBBdWcgIDEgMjI6NDQ6NTAgMjAwNA0KKysr
KyBsaWIvTUlNRS9EZWNvZGVyLnBtCVN1biBBdWcgIDEgMjI6NDU6MTAgMjAw
NA0KK0BAIC0xMTEsNiArMTExLDcgQEANCisgICAgICdxdW90ZWQtcHJpbnRh
YmxlJyA9PiAnTUlNRTo6RGVjb2Rlcjo6UXVvdGVkUHJpbnQnLA0KKyANCisg
ICAjIyMgTm9uLXN0YW5kYXJkLi4uDQorKyAgICAnYmluaGV4JyAgICAgPT4g
J01JTUU6OkRlY29kZXI6OkJpbkhleCcsDQorICAgICAneC11dScgICAgICAg
PT4gJ01JTUU6OkRlY29kZXI6OlVVJywNCisgICAgICd4LXV1ZW5jb2RlJyA9
PiAnTUlNRTo6RGVjb2Rlcjo6VVUnLA0KKyANCistLS0gbGliL01JTUUvUGFy
c2VyLnBtCVR1ZSBBdWcgMzEgMTg6NTQ6MDUgMjAwNA0KKysrKyBsaWIvTUlN
RS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAxODo1MzozMyAyMDA0DQorQEAgLTc5
OSwxMCArODAyLDExIEBADQorICAgICAkc2VsZi0+ZGVidWcoImV4dHJhY3Qg
dXVlbmNvZGU/ICIsICRzZWxmLT5leHRyYWN0X3V1ZW5jb2RlKTsNCisgICAg
ICRzZWxmLT5kZWJ1ZygiZW5jb2Rpbmc/ICAgICAgICAgIiwgJGVuY29kaW5n
KTsNCisgICAgICRzZWxmLT5kZWJ1ZygiZWZmZWN0aXZlIHR5cGU/ICAgIiwg
JGVudC0+ZWZmZWN0aXZlX3R5cGUpOw0KKysNCisgICAgIGlmICgkc2VsZi0+
ZXh0cmFjdF91dWVuY29kZSBhbmQNCisgCSgkZW5jb2RpbmcgPX4gL14oN2Jp
dHw4Yml0fGJpbmFyeSlcWi8pIGFuZA0KKy0JKCRlbnQtPmVmZmVjdGl2ZV90
eXBlID1+IG17XnRleHQvcGxhaW5cWn0pKSB7DQorLQkNCisrCSgkZW50LT5l
ZmZlY3RpdmVfdHlwZSA9fiANCisrCQlte14oPzp0ZXh0L3BsYWlufGFwcGxp
Y2F0aW9uL21hYy1iaW5oZXg0MHxhcHBsaWNhdGlvbi9tYWMtYmluaGV4KVxa
fSkpIHsNCisgCSMjIyBIdW50IGZvciBpdDoNCisgCW15ICR1dV9lbnQgPSBl
dmFsIHsgJHNlbGYtPmh1bnRfZm9yX3V1ZW5jb2RlKCRFTkNPREVELCAkZW50
KSB9Ow0KKyAJaWYgKCR1dV9lbnQpIHsgICAjIyMgc25hcmsNCitAQCAtODQy
LDE0ICs4NDQsMjEgQEANCisgIw0KKyBzdWIgaHVudF9mb3JfdXVlbmNvZGUg
ew0KKyAgICAgbXkgKCRzZWxmLCAkRU5DT0RFRCwgJGVudCkgPSBAXzsNCist
ICAgIG15ICRnb29kOw0KKysgICAgbXkgKCRnb29kLCAkamtmaXMpOw0KKyAg
ICAgbG9jYWwgJF87DQorICAgICAkc2VsZi0+ZGVidWcoInNuaWZmaW5nIGFy
b3VuZCBmb3IgVVVFTkNPREUiKTsNCisgDQorICAgICAjIyMgSGV1cmlzdGlj
Og0KKyAgICAgJEVOQ09ERUQtPnNlZWsoMCwwKTsNCisgICAgIHdoaWxlIChk
ZWZpbmVkKCRfID0gJEVOQ09ERUQtPmdldGxpbmUpKSB7DQorLQlsYXN0IGlm
ICgkZ29vZCA9IC9eYmVnaW4gWzAtN117M30vKTsNCisrICAgICAgICBpZiAo
JGdvb2QgPSAvXmJlZ2luIFswLTddezN9Lykgew0KKysgICAgICAgICAgJGpr
ZmlzID0gJ3V1JzsNCisrICAgICAgICAgIGxhc3Q7DQorKyAgICAgICAgfQ0K
KysgICAgICAgIGlmICgkZ29vZCA9IC9eXChUaGlzIGZpbGUgbXVzdCBiZSBj
b252ZXJ0ZWQgd2l0aC9pKSB7DQorKyAgICAgICAgICAkamtmaXMgPSAnYmlu
aGV4JzsNCisrICAgICAgICAgIGxhc3Q7DQorKyAgICAgICAgfQ0KKyAgICAg
fQ0KKyAgICAgJGdvb2Qgb3IgZG8geyAkc2VsZi0+ZGVidWcoIm5vIG9uZSBt
YWRlIHRoZSBjdXQiKTsgcmV0dXJuIDAgfTsNCisgDQorQEAgLTg2MCw3ICs4
NjksOSBAQA0KKyANCisgICAgICMjIyBNYWRlIHRoZSBmaXJzdCBjdXQ7IG9u
IHRvIHRoZSByZWFsIHN0dWZmOg0KKyAgICAgJEVOQ09ERUQtPnNlZWsoMCww
KTsNCistICAgIG15ICRkZWNvZGVyID0gTUlNRTo6RGVjb2Rlci0+bmV3KCd4
LXV1ZW5jb2RlJyk7DQorKyAgICBteSAkZGVjb2RlciA9IE1JTUU6OkRlY29k
ZXItPm5ldygoJGprZmlzIGVxICd1dScpPyd4LXV1ZW5jb2RlJw0KKysgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDonYmluaGV4Jyk7DQorKyAgICAkc2VsZi0+d2hpbmUoIkZvdW5kIGEg
JGprZmlzIGF0dGFjaG1lbnQiKTsNCisgICAgIG15ICRwcmU7DQorICAgICB3
aGlsZSAoMSkgew0KKyAJbXkgQGJpbl9kYXRhOw0KK0BAIC05MTAsMTIgKzky
MSwxMSBAQA0KKyANCisgICAgICMjIyBEaWQgd2UgZ2V0IGFueXRoaW5nPw0K
KyAgICAgQHBhcnRzIG9yIHJldHVybiB1bmRlZjsNCistDQorICAgICAjIyMg
U2V0IHRoZSBwYXJ0cyBhbmQgYSBuaWNlIHByZWFtYmxlOg0KKyAgICAgJHRv
cF9lbnQtPnBhcnRzKFxAcGFydHMpOw0KKyAgICAgJHRvcF9lbnQtPnByZWFt
YmxlDQorIAkoWyJUaGUgZm9sbG93aW5nIGlzIGEgbXVsdGlwYXJ0IE1JTUUg
bWVzc2FnZSB3aGljaCB3YXMgZXh0cmFjdGVkXG4iLA0KKy0JICAiZnJvbSBh
IHV1ZW5jb2RlZCBtZXNzYWdlLlxuIl0pOw0KKysgICAgICAgICAgImZyb20g
YSAkamtmaXMtZW5jb2RlZCBtZXNzYWdlLlxuIl0pOw0KKyAgICAgJHRvcF9l
bnQ7DQorIH0NCisgDQpJbmRleDogZmlsZXMvcGF0Y2gtUGFyc2VyLU1heFBh
cnRzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogZmlsZXMv
cGF0Y2gtUGFyc2VyLU1heFBhcnRzDQpkaWZmIC1OIGZpbGVzL3BhdGNoLVBh
cnNlci1NYXhQYXJ0cw0KLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAw
OjAwIC0wMDAwDQorKysgZmlsZXMvcGF0Y2gtUGFyc2VyLU1heFBhcnRzCTMx
IEF1ZyAyMDA0IDE4OjA2OjUzIC0wMDAwDQpAQCAtMCwwICsxLDgxIEBADQor
LS0tIGxpYi9NSU1FL1BhcnNlci5wbS5vcmlnCVR1ZSBBdWcgMzEgMTg6NTQ6
MDUgMjAwNA0KKysrKyBsaWIvTUlNRS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAx
ODo1MzozMyAyMDA0DQorQEAgLTI1MCw2ICsyNTAsNyBAQA0KKyAgICAgJHNl
bGYtPntNUDVfSWdub3JlRXJyb3JzfSAgICA9IDE7DQorICAgICAkc2VsZi0+
e01QNV9Vc2VJbm5lckZpbGVzfSAgID0gMDsNCisgICAgICRzZWxmLT57TVA1
X1VVRGVjb2RlfSAgICAgICAgPSAwOw0KKysgICAgJHNlbGYtPntNUDVfTWF4
UGFydHN9CSA9IC0xOw0KKyANCisgICAgICRzZWxmLT5pbnRlcmZhY2UoRU5U
SVRZX0NMQVNTID0+ICdNSU1FOjpFbnRpdHknKTsNCisgICAgICRzZWxmLT5p
bnRlcmZhY2UoSEVBRF9DTEFTUyAgID0+ICdNSU1FOjpIZWFkJyk7DQorQEAg
LTI3Nyw2ICsyNzgsNyBAQA0KKyAgICAgJHNlbGYtPntNUDVfRmlsZXJ9LT5y
ZXN1bHRzKCRzZWxmLT57TVA1X1Jlc3VsdHN9KTsNCisgICAgICRzZWxmLT57
TVA1X0ZpbGVyfS0+aW5pdF9wYXJzZSgpOw0KKyAgICAgJHNlbGYtPntNUDVf
RmlsZXJ9LT5wdXJnZWFibGUoW10pOyAgICMjIyBqdXN0IHRvIGJlIHNhZmUN
CisrICAgICRzZWxmLT57TVA1X051bVBhcnRzfSA9IDA7DQorICAgICAxOw0K
KyB9DQorIA0KK0BAIC05NjksMTEgKzk4MCwxOSBAQA0KKyAjICAgIFJldHlw
ZSA9PiByZXR5cGUgdGhpcyBwYXJ0IHRvIHRoZSBnaXZlbiBjb250ZW50LXR5
cGUNCisgIw0KKyAjIFJldHVybiB0aGUgZW50aXR5Lg0KKy0jIEZhdGFsIGV4
Y2VwdGlvbiBvbiBmYWlsdXJlLg0KKysjIEZhdGFsIGV4Y2VwdGlvbiBvbiBm
YWlsdXJlLiBSZXR1cm5zIHVuZGVmIGlmIG1lc3NhZ2UgdG8gY29tcGxleA0K
KyAjDQorIHN1YiBwcm9jZXNzX3BhcnQgew0KKyAgICAgbXkgKCRzZWxmLCAk
aW4sICRyZHIsICVwKSA9IEBfOw0KKyANCisrICAgIGlmICgkc2VsZi0+e01Q
NV9NYXhQYXJ0c30gPiAwKSB7DQorKwkkc2VsZi0+e01QNV9OdW1QYXJ0c30r
KzsNCisrCWlmICgkc2VsZi0+e01QNV9OdW1QYXJ0c30gPiAkc2VsZi0+e01Q
NV9NYXhQYXJ0c30pIHsNCisrCQkjIFJldHVybiBVTkRFRiBpZiBtc2cgdG9v
IGNvbXBsZXgNCisrCQlyZXR1cm4gdW5kZWY7DQorKwl9DQorKyAgICB9DQor
Kw0KKyAgICAgJHJkciB8fD0gTUlNRTo6UGFyc2VyOjpSZWFkZXItPm5ldzsN
CisgICAgICNkZWJ1ZyAicHJvY2Vzc19wYXJ0IjsNCisgICAgICRzZWxmLT5y
ZXN1bHRzLT5sZXZlbCgrMSk7DQorQEAgLTEwOTQsNiArMTExMiw4IEBADQor
IA0KKyBSZXR1cm5zIHRoZSBwYXJzZWQgTUlNRTo6RW50aXR5IG9uIHN1Y2Nl
c3MuDQorIFRocm93cyBleGNlcHRpb24gb24gZmFpbHVyZS4NCisrSWYgdGhl
IG1lc3NhZ2UgY29udGFpbmVkIHRvbyBtYW55DQorK3BhcnRzIChhcyBzZXQg
YnkgSTxtYXhfcGFydHM+KSwgcmV0dXJucyB1bmRlZi4NCisgDQorID1jdXQN
CisgDQorQEAgLTEzNTEsNiArMTM3MSwzMiBAQA0KKyAgICAgbXkgJHNlbGYg
PSBzaGlmdDsNCisgICAgICZNSU1FOjpUb29sczo6d2hpbmUoImV2aWxfZmls
ZW5hbWUgZGVwcmVjYXRlZCBpbiBNSU1FOjpQYXJzZXIiKTsNCisgICAgICRz
ZWxmLT5maWxlci0+ZXZpbF9maWxlbmFtZShAXyk7DQorK30NCisrDQorKyMt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisrDQorKz1pdGVtIG1h
eF9wYXJ0cyBOVU0NCisrDQorK0k8SW5zdGFuY2UgbWV0aG9kLj4NCisrTGlt
aXRzIHRoZSBudW1iZXIgb2YgTUlNRSBwYXJ0cyB3ZSB3aWxsIHBhcnNlLg0K
KysNCisrTm9ybWFsbHksIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHBhcnNl
IGEgbWVzc2FnZSB0byB0aGUgYml0dGVyIGVuZC4NCisrTWVzc2FnZXMgd2l0
aCBtYW55IE1JTUUgcGFydHMgY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBtZW1vcnkg
Y29uc3VtcHRpb24uDQorK0lmIHlvdSBpbnZva2UgdGhpcyBtZXRob2QsIHBh
cnNpbmcgd2lsbCBhYm9ydCB3aXRoIGEgZGllKCkgaWYgYSBtZXNzYWdlDQor
K2NvbnRhaW5zIG1vcmUgdGhhbiBOVU0gcGFydHMuDQorKw0KKytJZiBOVU0g
aXMgc2V0IHRvIC0xICh0aGUgZGVmYXVsdCksIHRoZW4gbm8gbWF4aW11bSBs
aW1pdCBpcyBlbmZvcmNlZC4NCisrDQorK1dpdGggbm8gYXJndW1lbnQsIHJl
dHVybnMgdGhlIGN1cnJlbnQgc2V0dGluZyBhcyBhbiBpbnRlZ2VyDQorKw0K
Kys9Y3V0DQorKw0KKytzdWIgbWF4X3BhcnRzIHsNCisrICAgIG15KCRzZWxm
LCAkbnVtKSA9IEBfOw0KKysgICAgaWYgKEBfID4gMSkgew0KKysgICAgICAg
JHNlbGYtPntNUDVfTWF4UGFydHN9ID0gJG51bTsNCisrICAgIH0NCisrICAg
IHJldHVybiAkc2VsZi0+e01QNV9NYXhQYXJ0c307DQorIH0NCisgDQorICMt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkluZGV4OiBmaWxlcy9w
YXRjaC1QYXJzZXJVbmRlZg0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNT
IGZpbGU6IGZpbGVzL3BhdGNoLVBhcnNlclVuZGVmDQpkaWZmIC1OIGZpbGVz
L3BhdGNoLVBhcnNlclVuZGVmDQotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAg
MDA6MDA6MDAgLTAwMDANCisrKyBmaWxlcy9wYXRjaC1QYXJzZXJVbmRlZgkz
MSBBdWcgMjAwNCAxODowNjo1MyAtMDAwMA0KQEAgLTAsMCArMSw0MyBAQA0K
Ky0tLSBsaWIvTUlNRS9QYXJzZXIucG0JVHVlIEF1ZyAzMSAxODo1NDowNSAy
MDA0DQorKysrIGxpYi9NSU1FL1BhcnNlci5wbQlUdWUgQXVnIDMxIDE4OjUz
OjMzIDIwMDQNCitAQCAtNzA4LDYgKzcxMCw3IEBADQorIAkNCisgCSMjIyBQ
YXJzZSB0aGUgbmV4dCBwYXJ0LCBhbmQgYWRkIGl0IHRvIHRoZSBlbnRpdHku
Li4NCisgCW15ICRwYXJ0ID0gJHNlbGYtPnByb2Nlc3NfcGFydCgkaW4sICRw
YXJ0X3JkciwgUmV0eXBlPT4kcmV0eXBlKTsNCisrICAgICAgICByZXR1cm4g
dW5kZWYgdW5sZXNzIGRlZmluZWQoJHBhcnQpOw0KKyAJJGVudC0+YWRkX3Bh
cnQoJHBhcnQpOw0KKyANCisgCSMjIyAuLi5hbmQgbG9vayBhdCBob3cgd2Ug
ZmluaXNoZWQgdXA6DQorQEAgLTk0NCw2ICs5NTQsNyBAQA0KKyANCisgICAg
ICMjIyBQYXJzZSB0aGUgbWVzc2FnZToNCisgICAgIG15ICRtc2cgPSAkc2Vs
Zi0+cHJvY2Vzc19wYXJ0KCRpbiwgJHJkcik7DQorKyAgICByZXR1cm4gdW5k
ZWYgdW5sZXNzIGRlZmluZWQoJG1zZyk7DQorIA0KKyAgICAgIyMjIEhvdyB0
byBoYW5kbGUgbmVzdGVkIG1lc3NhZ2VzPw0KKyAgICAgaWYgKCRzZWxmLT5l
eHRyYWN0X25lc3RlZF9tZXNzYWdlcyBlcSAnUkVQTEFDRScpIHsNCitAQCAt
MTAwNSwxNCArMTAyNCwxNCBAQA0KKyANCisgICAgICMjIyBIYW5kbGUsIGFj
Y29yZGluZyB0byB0aGUgTUlNRSB0eXBlOg0KKyAgICAgaWYgKCR0eXBlIGVx
ICdtdWx0aXBhcnQnKSB7DQorLQkkc2VsZi0+cHJvY2Vzc19tdWx0aXBhcnQo
JGluLCAkcmRyLCAkZW50KTsNCisrICAgICAgICByZXR1cm4gdW5kZWYgdW5s
ZXNzIGRlZmluZWQoJHNlbGYtPnByb2Nlc3NfbXVsdGlwYXJ0KCRpbiwgJHJk
ciwgJGVudCkpOw0KKyAgICAgfQ0KKyAgICAgZWxzaWYgKCgiJHR5cGUvJHN1
YnR5cGUiIGVxICJtZXNzYWdlL3JmYzgyMiIgfHwNCisgICAgICAgICAgICAg
IiR0eXBlLyRzdWJ0eXBlIiBlcSAibWVzc2FnZS9leHRlcm5hbC1ib2R5IiB8
fA0KKyAJICAgICgiJHR5cGUvJHN1YnR5cGUiIGVxICJtZXNzYWdlL3BhcnRp
YWwiICYmICRoZWFkLT5taW1lX2F0dHIoImNvbnRlbnQtdHlwZS5udW1iZXIi
KSA9PSAxKSkgJiYgDQorIAkgICAgJHNlbGYtPmV4dHJhY3RfbmVzdGVkX21l
c3NhZ2VzKSB7DQorIAkkc2VsZi0+ZGVidWcoImF0dGVtcHRpbmcgdG8gcHJv
Y2VzcyBhIG5lc3RlZCBtZXNzYWdlIik7DQorLQkkc2VsZi0+cHJvY2Vzc19t
ZXNzYWdlKCRpbiwgJHJkciwgJGVudCk7DQorKwlyZXR1cm4gdW5kZWYgdW5s
ZXNzIGRlZmluZWQoJHNlbGYtPnByb2Nlc3NfbWVzc2FnZSgkaW4sICRyZHIs
ICRlbnQpKTsNCisgICAgIH0NCisgICAgIGVsc2UgeyAgICAgICAgICAgICAg
ICAgICAgIA0KKyAJJHNlbGYtPnByb2Nlc3Nfc2luZ2xlcGFydCgkaW4sICRy
ZHIsICRlbnQpOw0KK0BAIC0xMDgwLDcgKzEwODAsNiBAQA0KKyA9YmFjaw0K
KyANCisgUmV0dXJucyB0aGUgcGFyc2VkIE1JTUU6OkVudGl0eSBvbiBzdWNj
ZXNzLiAgDQorLVRocm93cyBleGNlcHRpb24gb24gZmFpbHVyZS4NCisgDQor
ID1jdXQNCisgDQo=

--0-923124273-1093976058=:6407--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040831200251.C6407>