diff options
-rw-r--r-- | Makefile.am | 15 | ||||
-rw-r--r-- | Makefile.in | 14 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rwxr-xr-x | configure | 24 | ||||
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | doc/asn1Coding.1 | 4 | ||||
-rw-r--r-- | doc/asn1Decoding.1 | 4 | ||||
-rw-r--r-- | doc/asn1Parser.1 | 4 | ||||
-rw-r--r-- | doc/libtasn1.html | 28 | ||||
-rw-r--r-- | doc/libtasn1.info | 79 | ||||
-rw-r--r-- | doc/libtasn1.pdf | bin | 259720 -> 260049 bytes | |||
-rw-r--r-- | doc/libtasn1.ps | 1300 | ||||
-rw-r--r-- | doc/man/asn1_get_octet_der.3 | 10 | ||||
-rw-r--r-- | doc/stamp-vti | 4 | ||||
-rw-r--r-- | doc/texi/asn1_get_octet_der.texi | 10 | ||||
-rw-r--r-- | doc/texi/decoding.c.texi | 10 | ||||
-rw-r--r-- | doc/version.texi | 4 | ||||
-rw-r--r-- | lib/coding.c | 8 | ||||
-rw-r--r-- | lib/decoding.c | 18 | ||||
-rw-r--r-- | lib/element.c | 3 | ||||
-rw-r--r-- | lib/int.h | 6 | ||||
-rw-r--r-- | lib/libtasn1.h | 2 | ||||
-rw-r--r-- | lib/parser_aux.c | 4 | ||||
-rw-r--r-- | lib/parser_aux.h | 2 | ||||
-rw-r--r-- | src/asn1Decoding.c | 18 | ||||
-rw-r--r-- | tests/Makefile.am | 4 | ||||
-rw-r--r-- | tests/Makefile.in | 48 | ||||
-rw-r--r-- | tests/coding-long-oid.c | 205 | ||||
-rw-r--r-- | tests/object-id-decoding.c | 89 |
29 files changed, 1157 insertions, 771 deletions
diff --git a/Makefile.am b/Makefile.am index 5041eb9..a31301c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,5 +39,18 @@ EXTRA_DIST += cfg.mk maint.mk .clcopying gnulib-update: gnulib-tool --add-import --dir=. --lib=libgnu --source-base=lib/gllib --m4-base=lib/glm4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=2 --no-conditional-dependencies --libtool --macro-prefix=lgl --no-vc-files -dist-hook: +TMPFILE="abi-temp.xml" + +abi-check: + @rm -f $(TMPFILE) + @echo "Checking libtasn1 ABI" + @echo "<version>$(VERSION)</version>" >$(TMPFILE) + @echo "<headers>$(srcdir)/lib/libtasn1.h" >>$(TMPFILE) + @echo "$(builddir)/lib/libtasn1.h</headers>" >>$(TMPFILE) + @echo "<libs>$(builddir)/lib/.libs</libs>" >>$(TMPFILE) + test ! -f "$(srcdir)/devel/ABI-$$(uname -m).dump" || \ + abi-compliance-checker -abi -lib libtasn1 -old "$(srcdir)/devel/ABI-$$(uname -m).dump" -new $(TMPFILE) + @rm -f $(TMPFILE) + +dist-hook: abi-check make -C doc/ compare-makefile diff --git a/Makefile.in b/Makefile.in index 448016b..175253a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -936,6 +936,7 @@ EXTRA_DIST = windows/asn1-parser/asn1-parser.vcproj \ cfg.mk maint.mk .clcopying SUBDIRS = gl lib src examples tests $(am__append_1) ACLOCAL_AMFLAGS = -I m4 -I gl/m4 -I lib/glm4 +TMPFILE = "abi-temp.xml" all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -1425,7 +1426,18 @@ uninstall-am: gnulib-update: gnulib-tool --add-import --dir=. --lib=libgnu --source-base=lib/gllib --m4-base=lib/glm4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=2 --no-conditional-dependencies --libtool --macro-prefix=lgl --no-vc-files -dist-hook: +abi-check: + @rm -f $(TMPFILE) + @echo "Checking libtasn1 ABI" + @echo "<version>$(VERSION)</version>" >$(TMPFILE) + @echo "<headers>$(srcdir)/lib/libtasn1.h" >>$(TMPFILE) + @echo "$(builddir)/lib/libtasn1.h</headers>" >>$(TMPFILE) + @echo "<libs>$(builddir)/lib/.libs</libs>" >>$(TMPFILE) + test ! -f "$(srcdir)/devel/ABI-$$(uname -m).dump" || \ + abi-compliance-checker -abi -lib libtasn1 -old "$(srcdir)/devel/ABI-$$(uname -m).dump" -new $(TMPFILE) + @rm -f $(TMPFILE) + +dist-hook: abi-check make -C doc/ compare-makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. @@ -1,5 +1,8 @@ GNU Libtasn1 NEWS -*- outline -*- +* Noteworthy changes in release 4.9 (released 2016-07-25) [stable] +- Fixes to OID encoding of OIDs which have elements which exceed 2^32 + * Noteworthy changes in release 4.8 (released 2016-04-11) [stable] - Fixes to avoid reliance on C undefined behavior. - Fixes to avoid an infinite recursion when decoding without @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for GNU Libtasn1 4.8. +# Generated by GNU Autoconf 2.69 for GNU Libtasn1 4.9. # # Report bugs to <help-libtasn1@gnu.org>. # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU Libtasn1' PACKAGE_TARNAME='libtasn1' -PACKAGE_VERSION='4.8' -PACKAGE_STRING='GNU Libtasn1 4.8' +PACKAGE_VERSION='4.9' +PACKAGE_STRING='GNU Libtasn1 4.9' PACKAGE_BUGREPORT='help-libtasn1@gnu.org' PACKAGE_URL='http://www.gnu.org/software/libtasn1/' @@ -1896,7 +1896,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 GNU Libtasn1 4.8 to adapt to many kinds of systems. +\`configure' configures GNU Libtasn1 4.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1967,7 +1967,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of GNU Libtasn1 4.8:";; + short | recursive ) echo "Configuration of GNU Libtasn1 4.9:";; esac cat <<\_ACEOF @@ -1995,7 +1995,7 @@ Optional Features: --enable-ld-version-script enable linker version script (default is enabled when possible) - --enable-gcc-warnings turn on lots of GCC warnings (for developers) + --disable-gcc-warnings disable GCC warnings (for developers) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -2096,7 +2096,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -GNU Libtasn1 configure 4.8 +GNU Libtasn1 configure 4.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2748,7 +2748,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 GNU Libtasn1 $as_me 4.8, which was +It was created by GNU Libtasn1 $as_me 4.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3625,7 +3625,7 @@ fi # Define the identity of the package. PACKAGE='libtasn1' - VERSION='4.8' + VERSION='4.9' cat >>confdefs.h <<_ACEOF @@ -20758,7 +20758,7 @@ if test "${enable_gcc_warnings+set}" = set; then : esac gl_gcc_warnings=$enableval else - gl_gcc_warnings=no + gl_gcc_warnings=yes fi @@ -21993,7 +21993,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 GNU Libtasn1 $as_me 4.8, which was +This file was extended by GNU Libtasn1 $as_me 4.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22065,7 +22065,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -GNU Libtasn1 config.status 4.8 +GNU Libtasn1 config.status 4.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index cb6cb6e..7a14e04 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Process this file with autoconf to produce a configure script. # along with this program. If not, see <http://www.gnu.org/licenses/>. AC_PREREQ([2.61]) -AC_INIT([GNU Libtasn1],[4.8],[help-libtasn1@gnu.org]) +AC_INIT([GNU Libtasn1],[4.9],[help-libtasn1@gnu.org]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS(config.h) @@ -59,14 +59,14 @@ gl_INIT lgl_INIT AC_ARG_ENABLE([gcc-warnings], - [AS_HELP_STRING([--enable-gcc-warnings], - [turn on lots of GCC warnings (for developers)])], + [AS_HELP_STRING([--disable-gcc-warnings], + [disable GCC warnings (for developers)])], [case $enableval in yes|no) ;; *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;; esac gl_gcc_warnings=$enableval], - [gl_gcc_warnings=no] + [gl_gcc_warnings=yes] ) if test "$gl_gcc_warnings" = yes; then diff --git a/doc/asn1Coding.1 b/doc/asn1Coding.1 index a3c4f26..65f1b5f 100644 --- a/doc/asn1Coding.1 +++ b/doc/asn1Coding.1 @@ -1,5 +1,5 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.1. -.TH ASN1CODING "1" "April 2016" "asn1Coding (libtasn1) 4.8" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ASN1CODING "1" "July 2016" "asn1Coding (libtasn1) 4.9" "User Commands" .SH NAME asn1Coding \- ASN.1 DER encoder .SH SYNOPSIS diff --git a/doc/asn1Decoding.1 b/doc/asn1Decoding.1 index e3d262f..334672e 100644 --- a/doc/asn1Decoding.1 +++ b/doc/asn1Decoding.1 @@ -1,5 +1,5 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.1. -.TH ASN1DECODING "1" "April 2016" "asn1Decoding (libtasn1) 4.8" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ASN1DECODING "1" "July 2016" "asn1Decoding (libtasn1) 4.9" "User Commands" .SH NAME asn1Decoding \- ASN.1 DER decoder .SH SYNOPSIS diff --git a/doc/asn1Parser.1 b/doc/asn1Parser.1 index 0b69f6a..43eb383 100644 --- a/doc/asn1Parser.1 +++ b/doc/asn1Parser.1 @@ -1,5 +1,5 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.1. -.TH ASN1PARSER "1" "April 2016" "asn1Parser (libtasn1) 4.8" "User Commands" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ASN1PARSER "1" "July 2016" "asn1Parser (libtasn1) 4.9" "User Commands" .SH NAME asn1Parser \- ASN.1 syntax tree generator for libtasn1 .SH SYNOPSIS diff --git a/doc/libtasn1.html b/doc/libtasn1.html index 59d3da9..43522e5 100644 --- a/doc/libtasn1.html +++ b/doc/libtasn1.html @@ -1,7 +1,7 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <!-- This manual is for GNU Libtasn1 -(version 4.8, 4 April 2016), +(version 4.9, 4 April 2016), which is a library for Abstract Syntax Notation One (ASN.1) and Distinguished Encoding Rules (DER) manipulation. @@ -13,12 +13,12 @@ any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". --> -<!-- Created by GNU Texinfo 6.0, http://www.gnu.org/software/texinfo/ --> +<!-- Created by GNU Texinfo 6.1, http://www.gnu.org/software/texinfo/ --> <head> -<title>GNU Libtasn1 4.8</title> +<title>GNU Libtasn1 4.9</title> -<meta name="description" content="GNU Libtasn1 4.8"> -<meta name="keywords" content="GNU Libtasn1 4.8"> +<meta name="description" content="GNU Libtasn1 4.9"> +<meta name="keywords" content="GNU Libtasn1 4.9"> <meta name="resource-type" content="document"> <meta name="distribution" content="global"> <meta name="Generator" content="makeinfo"> @@ -48,9 +48,8 @@ pre.smalldisplay {font-family: inherit; font-size: smaller} pre.smallexample {font-size: smaller} pre.smallformat {font-family: inherit; font-size: smaller} pre.smalllisp {font-size: smaller} -span.nocodebreak {white-space: nowrap} span.nolinebreak {white-space: nowrap} -span.roman {font-family: serif; font-weight: normal} +span.roman {font-family: initial; font-weight: normal} span.sansserif {font-family: sans-serif; font-weight: normal} ul.no-bullet {list-style: none} body { @@ -105,7 +104,7 @@ dd, li { </head> <body lang="en"> -<h1 class="settitle" align="center">GNU Libtasn1 4.8</h1> +<h1 class="settitle" align="center">GNU Libtasn1 4.9</h1> @@ -159,7 +158,7 @@ Next: <a href="#Introduction" accesskey="n" rel="next">Introduction</a>, Up: <a <h1 class="top">Libtasn1</h1> <p>This manual is for GNU Libtasn1 -(version 4.8, 4 April 2016), +(version 4.9, 4 April 2016), which is a library for Abstract Syntax Notation One (ASN.1) and Distinguished Encoding Rules (DER) manipulation. </p> @@ -187,6 +186,7 @@ Documentation License”. <tr><td align="left" valign="top">• <a href="#Copying-Information" accesskey="5">Copying Information</a>:</td><td> </td><td align="left" valign="top"> </td></tr> <tr><th colspan="3" align="left" valign="top"><pre class="menu-comment"> + Indices </pre></th></tr><tr><td align="left" valign="top">• <a href="#Concept-Index" accesskey="6">Concept Index</a>:</td><td> </td><td align="left" valign="top">Index of concepts and programs. @@ -1363,17 +1363,19 @@ the value was too big. <dt><a name="index-asn1_005fget_005foctet_005fder"></a>Function: <em>int</em> <strong>asn1_get_octet_der</strong> <em>(const unsigned char * <var>der</var>, int <var>der_len</var>, int * <var>ret_len</var>, unsigned char * <var>str</var>, int <var>str_size</var>, int * <var>str_len</var>)</em></dt> <dd><p><var>der</var>: DER data to decode containing the OCTET SEQUENCE. </p> -<p><var>der_len</var>: Length of DER data to decode. +<p><var>der_len</var>: The length of the <code>der</code> data to decode. </p> -<p><var>ret_len</var>: Output variable containing the length of the DER data. +<p><var>ret_len</var>: Output variable containing the encoded length of the DER data. </p> <p><var>str</var>: Pre-allocated output buffer to put decoded OCTET SEQUENCE in. </p> <p><var>str_size</var>: Length of pre-allocated output buffer. </p> -<p><var>str_len</var>: Output variable containing the length of the OCTET SEQUENCE. +<p><var>str_len</var>: Output variable containing the length of the contents of the OCTET SEQUENCE. </p> -<p>Extract an OCTET SEQUENCE from DER data. +<p>Extract an OCTET SEQUENCE from DER data. Note that this function +expects the DER data past the tag field, i.e., the length and +content octets. </p> <p><strong>Returns:</strong> Returns <code>ASN1_SUCCESS</code> on success, or an error. </p></dd></dl> diff --git a/doc/libtasn1.info b/doc/libtasn1.info index f004f50..2198910 100644 --- a/doc/libtasn1.info +++ b/doc/libtasn1.info @@ -1,7 +1,7 @@ -This is libtasn1.info, produced by makeinfo version 6.0 from +This is libtasn1.info, produced by makeinfo version 6.1 from libtasn1.texi. -This manual is for GNU Libtasn1 (version 4.8, 4 April 2016), which is a +This manual is for GNU Libtasn1 (version 4.9, 4 April 2016), which is a library for Abstract Syntax Notation One (ASN.1) and Distinguished Encoding Rules (DER) manipulation. @@ -24,7 +24,7 @@ File: libtasn1.info, Node: Top, Next: Introduction, Up: (dir) Libtasn1 ******** -This manual is for GNU Libtasn1 (version 4.8, 4 April 2016), which is a +This manual is for GNU Libtasn1 (version 4.9, 4 April 2016), which is a library for Abstract Syntax Notation One (ASN.1) and Distinguished Encoding Rules (DER) manipulation. @@ -1126,18 +1126,21 @@ asn1_get_octet_der * STR_LEN) DER: DER data to decode containing the OCTET SEQUENCE. - DER_LEN: Length of DER data to decode. + DER_LEN: The length of the 'der' data to decode. - RET_LEN: Output variable containing the length of the DER data. + RET_LEN: Output variable containing the encoded length of the DER + data. STR: Pre-allocated output buffer to put decoded OCTET SEQUENCE in. STR_SIZE: Length of pre-allocated output buffer. - STR_LEN: Output variable containing the length of the OCTET - SEQUENCE. + STR_LEN: Output variable containing the length of the contents of + the OCTET SEQUENCE. - Extract an OCTET SEQUENCE from DER data. + Extract an OCTET SEQUENCE from DER data. Note that this function + expects the DER data past the tag field, i.e., the length and + content octets. *Returns:* Returns 'ASN1_SUCCESS' on success, or an error. @@ -2014,8 +2017,8 @@ Function and Data Index (line 144) * asn1_create_element: ASN.1 field functions. (line 72) -* asn1_decode_simple_ber: DER functions. (line 453) -* asn1_decode_simple_der: DER functions. (line 432) +* asn1_decode_simple_ber: DER functions. (line 456) +* asn1_decode_simple_der: DER functions. (line 435) * asn1_delete_element: ASN.1 field functions. (line 57) * asn1_delete_structure: ASN.1 field functions. @@ -2023,23 +2026,23 @@ Function and Data Index * asn1_delete_structure2: ASN.1 field functions. (line 42) * asn1_der_coding: DER functions. (line 102) -* asn1_der_decoding: DER functions. (line 286) -* asn1_der_decoding2: DER functions. (line 250) -* asn1_der_decoding_element: DER functions. (line 313) -* asn1_der_decoding_startEnd: DER functions. (line 346) +* asn1_der_decoding: DER functions. (line 289) +* asn1_der_decoding2: DER functions. (line 253) +* asn1_der_decoding_element: DER functions. (line 316) +* asn1_der_decoding_startEnd: DER functions. (line 349) * asn1_dup_node: ASN.1 field functions. (line 162) * asn1_encode_simple_der: DER functions. (line 51) -* asn1_expand_any_defined_by: DER functions. (line 386) -* asn1_expand_octet_string: DER functions. (line 406) +* asn1_expand_any_defined_by: DER functions. (line 389) +* asn1_expand_octet_string: DER functions. (line 409) * asn1_find_node: Auxilliary functions. (line 9) * asn1_find_structure_from_oid: ASN.1 field functions. (line 129) -* asn1_get_bit_der: DER functions. (line 228) +* asn1_get_bit_der: DER functions. (line 231) * asn1_get_length_ber: DER functions. (line 166) * asn1_get_length_der: DER functions. (line 130) -* asn1_get_object_id_der: DER functions. (line 209) +* asn1_get_object_id_der: DER functions. (line 212) * asn1_get_octet_der: DER functions. (line 186) * asn1_get_tag_der: DER functions. (line 147) * asn1_length_der: DER functions. (line 9) @@ -2112,25 +2115,25 @@ Ref: asn1_get_length_der34037 Ref: asn1_get_tag_der34577 Ref: asn1_get_length_ber35122 Ref: asn1_get_octet_der35715 -Ref: asn1_get_object_id_der36422 -Ref: asn1_get_bit_der37020 -Ref: asn1_der_decoding237693 -Ref: asn1_der_decoding39091 -Ref: asn1_der_decoding_element40030 -Ref: asn1_der_decoding_startEnd41337 -Ref: asn1_expand_any_defined_by42789 -Ref: asn1_expand_octet_string43594 -Ref: asn1_decode_simple_der44595 -Ref: asn1_decode_simple_ber45237 -Node: Error handling functions45938 -Ref: asn1_perror46154 -Ref: asn1_strerror46495 -Node: Auxilliary functions46906 -Ref: asn1_find_node47098 -Ref: asn1_check_version47694 -Node: Copying Information48293 -Node: GNU Free Documentation License48546 -Node: Concept Index73661 -Node: Function and Data Index74767 +Ref: asn1_get_object_id_der36574 +Ref: asn1_get_bit_der37172 +Ref: asn1_der_decoding237845 +Ref: asn1_der_decoding39243 +Ref: asn1_der_decoding_element40182 +Ref: asn1_der_decoding_startEnd41489 +Ref: asn1_expand_any_defined_by42941 +Ref: asn1_expand_octet_string43746 +Ref: asn1_decode_simple_der44747 +Ref: asn1_decode_simple_ber45389 +Node: Error handling functions46090 +Ref: asn1_perror46306 +Ref: asn1_strerror46647 +Node: Auxilliary functions47058 +Ref: asn1_find_node47250 +Ref: asn1_check_version47846 +Node: Copying Information48445 +Node: GNU Free Documentation License48698 +Node: Concept Index73813 +Node: Function and Data Index74919 End Tag Table diff --git a/doc/libtasn1.pdf b/doc/libtasn1.pdf Binary files differindex e988718..207c7c1 100644 --- a/doc/libtasn1.pdf +++ b/doc/libtasn1.pdf diff --git a/doc/libtasn1.ps b/doc/libtasn1.ps index 3c10f98..47e9fc3 100644 --- a/doc/libtasn1.ps +++ b/doc/libtasn1.ps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.995 Copyright 2015 Radical Eye Software %%Title: libtasn1.dvi -%%CreationDate: Mon Apr 11 08:33:50 2016 +%%CreationDate: Mon Jul 25 22:29:01 2016 %%Pages: 36 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 @@ -12,7 +12,7 @@ %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -q -o libtasn1.ps libtasn1.dvi %DVIPSParameters: dpi=600 -%DVIPSSource: TeX output 2016.04.11:0833 +%DVIPSSource: TeX output 2016.07.25:2229 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -1360,7 +1360,6 @@ dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put -dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put @@ -1565,227 +1564,223 @@ C3C67E71D8BE2B8D5784E8A6F19A9A8929DF9833440E160945274682F435DFAC 575048CC768BB8F13AA21C6B125E6073611BE138AE06D13E62E7EDE3D0239474 E040B3E446165FFE60E20B75D2A5F9EE021B22256621C290A8F3342F0347B8EC CFA6AD68D47C05268EE3AC8683F4840D736EAB585C6284018DC94FC103B4A882 -ADAEFB625EA966F3877B3FFEA518B809A4BD1977BF1902EB9F06FBAE30E8932A -D1761807C92594B57F86E1E36BE9027B7D1E0C22A83A2140A91406D0289D3833 -C3361F8882CF720E445B144B633F199BD875EF97202DF88AB3EBA034E510A6A2 -D2F464F6D5AEDC833F8BB9BA74A6679F71D843D6BC4D40FCC68B411224212236 -3B94C160C14C57E0BF68104DF3C99880C25245EC98AE48F71BE243D4278C2B17 -1CAFBE0C365E96559B77E607BFFC6634D03B8E25BDEF3FD2E3D8B66473C7B425 -45A646CF3B68A56D1C64C5456A61E5ACDE212CDF6DCDF6D589049EF6C91C30AA -8556424F309355355EA52E8F7342A91D122FAB2DFFDEAA78506228B49385C05B -08793E912D338712173DD0DB44C7C3281FA3D8B14CBA99A3938B147564342923 -D53A2BF18D334DE5E31659A3434EAC96A8D7B363AAEF5CA4DAE67A27890C07AC -F31A6BA7E4A3C2AF654C025F17FCEBEC864C0A9B7B68571CA56BFA4A249896FD -96BB19B8F250672878B67BA411BBAFE3CBBD940F005DBF32F1D682F487A1D1B0 -854922FF69C8D6600E67142D651192A911ABE2602E5126FFDC351E1845A22D02 -AFC17BAF941906E5F7A3C35D2DAC2A2F1C958E637A0EB5401B195FF1E1908B3C -EE13700E365119C68B8A0C3471D3E7911A6734A678F43E86FC55570385E5E107 -4CD618E7430A92C695F6ABA13A68FC71C573D62F6FEAE12D6C1EEE1F1C424C6B -CFF56BDE7FC34F88A144A62CFCE0D377F8BA416827181FBC7FF8538FA19B1ADA -1A12DAA904DE6087D90A750CF8B76F97E3AE0BE6F65145F7E99F566C8D18F817 -532DDE4EC38F5127D404053F3B6CB4694D9973209533D99DC44948178F9F976B -697A04799D7FCEFB13B347143472353503A3DAC56A753E96F46E1AA1D736D7CC -55E6E80EFF0FDBA4A7728E5B5BE6A98BDB93DF5E27253D9C646B595B0507DE97 -CEE5379120D39CA5F22E3952261C0205AFC2A7AFE07F0D8352072E6455A62FFD -3FBAFB256E0B4288E8F6B724CCB0913026D7B19435183FEB0E7FDB7DA521A9DD -EC933881FABA422199AF4F4FBE7BBF8F89F4733A31CF7814673A4BB142CBF3B1 -987E1BA9A6E3372A3ECC943A373940E4411F69F23477CDB2638C060A96023009 -555378908A27BBB6DA89D5D556A536E38DC41FC66F35EAEC9C948AFB2A826A6A -5E8DE93976448E0DA8C81AC71B78F76FB1B265E446C05DDA5E049298BFE6A4B2 -DE4053742E11EC7FAEB122D6E3E30D91F075B38C7A4D0BBA4BD4EDB637BCAF9C -D2A3E27AFD24071B4CB37722D8027E8604CB80E3EAAF45F7098F730B11016E29 -29E6E8460703BFC901B4314A825C3D1783A46F5947A46CAF30BF4A66C7EA7ACB -A63A3FD2FFD9B7DD4D72EFBD5C0314885AC7EDEC9C04244B07CAFD993B9EF84A -E12A23548EE99CF89A77C5990687BEE34FCEC3EA658448015BC90B0786E5402F -9F432FF356324779145310A982E269789AE091E430A0F4C9F3EF03B93C2220E7 -CB0627B8C4193154081CE3A57E64F659ACE95511BF4FC4D4D4D78A503B68613B -4E6DE03A7EAA69B0C6EF0C08A117D3F1416D077BE519E668A3D7826C924446CE -08FB7DAE6E73301DCEB2312BC57401DB7CB38F2ED4567735C4792DF450C91F28 -35AD53A70F762499AD712984A65BC7561CB0B0E9FFDB1F961284DDF22C42DE23 -9A734C6EF90E453F1721890BA4056EE43FEF8743407CFDC3A4BCBD0D74CFC14B -019585A4E0055F8A79C1ECA2EB40EC0639BEB7F11F82E006C772173319ED3765 -ED20E579EAFED984C0F83C694968E8BE5000C9F9BAF72F24462164578FBE03AF -8779FDB09149BBB336335C58575B0476E8D97D06CFE4F8842348AAE075872F22 -6CE687C9C127C17720B7AB19B734670E7F241D493F71F7F670E3348E205E1243 -18D645C5B19C1F5359CCD9D3E9B5167BDC1FDA655AF47B45A7D15552583AA514 -FFC9A9E84D5D3EAAD53C17F42F650BD3E160635F8A4502F31A8781A72D893AE4 -7E65B5C524F5292E2D6DEC4DEB56BF52D612335401568F3B260DD73FE1E92219 -0F3FCDC127A654E3E258DF662815A673845C91131CBFEB5750A3BA225892FAB5 -2BC7341D758CFFFDD768983EF8CA9082CE935FACA20ADE200C148E4C97A81E45 -BC7C49D180E7640AB9CDEE1D03851AAA9A5DCF5EE98BA5AE501AEB4DD6C188E7 -8917B66C41523220E0722168D50264F000046A23102A0302F68E3A17BB370456 -FECA547897AC46F4E91D7A82401AB537041F144284F8A7AF17B723669E9AC554 -9A0F0874E4C471E01F2D53930493C52FD6C61175A67A4E16EC362B6CC4B242A0 -8AA814B7ECB7FF829F121E9016CD0F9E4DF347D00AA7A30C148BBD5D857E8685 -00B284B3CA2F0DF0E7C5871A1F2107A2AD69517B3DD43591058DD5C628E27073 -BE2A18DF6E768E8E25003F6A06FC0173673209F1DB7794C144466AE8B5E1271D -37E874DCA477D70AAA8100F75425DB765BF94EA131CFE379632CFC31D907DBB7 -9F1C967FF459F490EDA15522E7C6E0399E7B76642DD67B2310987936074617F4 -4750B22CC1BD7AAB80B2C764118F317852B90580C369324CCD3AEC4B62D43004 -1B51981E02DD34A98B01A8508B189DE0C4E83813721D3B34417F63D4A25F640E -D09CAF6958C35F1E1F17F2C846A623002A91B9FC2689D944F1BC4F265F71E3DA -8CE72ADC538ED824DFE439634392FAE73FD525F563158CFC77E0E4F73C6E2297 -D9D1559BCD92805B4C92EEC03B61F313725A14BDB45D923733EE78E33EF3F43F -36DF9D01307833C59F0F385921086E0888A660BA2F78AD31252AF074602AA100 -E149F7EA08A1F6BDC3895AE0090CC1C43545DD9C639FB9B39D52F3AE78BBDFC2 -A25C3AE98BEA9DCA8A4ABE31096CE36CEBE9BE231D7567115FD2FCA246ED3916 -A041B7B38140B3A85C1AAD83A5E7D540F3F5EA71B7D5A60E6B278C981962297A -CE19E330B29652E763300876007240244775D1E3D78A3CA90A2516F68BD02677 -54899B8CDA19653E67C5B7CD73E173E4234F116E85B9FE48C50544A644523FC4 -E7472344E92271838CA7C85A11B028AE10A02771D3ABDEB514123D947859EB2C -AC95A65233B92E29C00FED999E4ABE5470C7F5661A371B7E1D65C57E7951CA42 -89B2D52283208ECB114D13C0049ED6D128750D55D3230DB53DBB5D26DB7D2A6A -1F70AF774E25ACB2037FE312A5EEDC40694A38BAAE1821CE515197F8D950857B -7AB5552C30B3114899951A421299894A07249015D943D128043D14AF40837B48 -14650157A807E412AF4E9009C281AA161FA8EDA7A1B59B6DC8C92056941127DB -8697F91BEA0847DD52FE27EF171DE0B4C6A03AD86C61C8A7D60ABF434FA8C7E1 -BFF12B8B21765D09795176CBCB70BADA370A6D5A6C55DA23C09A23663AD3D4B1 -3BC46E8DD66F74B8A9AC681A443F0341CBBB9920264EA6A1591A69882A46EE26 -0557E482A086AC5AB23B027D10E4B939A109DC2DC98B6A5F9E4CC9EC8D98FD54 -FA9540F5905F03093983FF900088332721E33B06CE903E133CB8FAE79C72284E -05005AD63DF217244278AA0CF5E02E0686857D8DE1F74EFC620F0E2A0CDCEF00 -11D89F33A7CE21672FC42089A81A427AE0806C6E5E5C954D1B5DD54E00FA4CF3 -B628A88CDEA0D61147962F5812837FFE6E7EB6043001B7DD871F4A5FE994CAB2 -3F5088B577B1A80546DCED65F01893D51D2F5BEB330E1A1F7537D07B3E1124A9 -6E8F443034498841EB49E467791ECA165990D265D6B7DCAF0518A659DF3EE073 -01EE946984292152FBF2FD33363E2EC01BD6D0C64FEDF18AF375695080B9A152 -29609B360C1E08E04D685E9FA0238FEFCB44A533B46E69F293CEDB3497A252B1 -B94952182838E0BC28D7BDD56D5285179C325E91B3483F678A6037B67229E55C -C6DB7175994B3B968FBAE1AAD369A61DB153FBD4E85F656E5BA6F47FC3EB9ABD -E877461DA4327359FAEF13F31648A9E2611BA9F8F92C046DB0C790C9BF7190C8 -6664A22A8DCADC378C434E63807051EA2CD0C8A068052DA3532B74BEB7523FCC -3E46B53C228AD100C962BC17C1A6120B22BC9BA7FABCC73C8D853CEAEE0CE4BE -61361522BFB29DAD47D8C63161DD149DB3B4A56F69CE6F06E0B8A0F5C130795C -CC75DE509A39AB65E6E948C57ECAFEFF85E48A33A344BCAC6D2B3A9E147CF412 -44B42D1E1999749013B86A54ADE9F21BB47ED0B9B0FBE6E04862CDF0A6EC36C8 -E278993B652E248FA402C96821FE3B4AA0A36E48897A176E3D7BFB8CAE2FB727 -67F1C9F310EA97B784EE5314972D59E0FB1DFCF1CD627228CBBBB78EA9295DED -3AAA3E0237DE3F86A76AD6814D05355B0296FA57F55855AB17CA33082FC055FF -FD15B98195A545958A1F7695ECE82216010A3B9B9E9F7CC95DB7649D011749B3 -6B21242D5C58C7F627DA1DE432DE5DCB6701AD43BE64ED5E129D654ABE811E2E -A8148D1C87135BCFEB584C62839A13D1C3B9E3AD1B07E8F39852E90DAF725A61 -575F6D0D884A6A362BBDA1C04CBF86CC9B38F248011F18BDF2AD86F59FB9A748 -752D1AD5D0BB7868ED11C7C5A97895502D9955AEEE1273BC97B3585BC8E0F64F -89A91959FE49CFB9E5090AAD27F3C9D9BD15E4CA2DF2F237897CA6945BCB862C -E353B8BE6F2B1D4E1BCF7226494A2F1FB86008FFC8F5F461176B53A7BA4E03C8 -4FA72ECCF1F8919AFD9A7A886AEA9005B14A928D52997A7FA77730B4D1E7D366 -50E80C99E8F04D78099D320F7CC45791FE45F069B794A37F2C4C8E24002D7487 -494C7A1122751CF6ED23C2F991B65861D809E0EBDB71E36408FE840959AEF3E3 -427B1C3FB3F213BCF32528BC101C0BAE5FD1B874189FC51B86E821426F37CD4F -98726B1553178576E8CB2CB6ED773EDD4FF7821A3AA19B5F170E7E0064E2D2ED -F6237CBE00C3B7851102D8287D23926F21977FF11935EE0C1AEACF76159FC031 -1D522D600DEAF60A76C49FAC7EA9FBB25CEAB8EC0E06B55F5502DA23DE3E429E -EE8677FAFA080E9644BF2401599E876B7D6B534A228DD92C137DDA792F24221E -C16A7C5CCD2AB7B9F01C77FC23EB879D0F6023BBF59822DB6AEFFA993CB02BD2 -52214DABC729DA7939DDB909EED4B834E328459CA45AF906012BF058AF847AE0 -18EDF77AA15D12BB3F01449C225613EB5D11D93882F7F05E627E42F2B799BE7D -9249C8F9226E929AE04ED6A51A66D789319721162E127379EE9514AB7A8308E8 -B3EEBA20F0C558EA68068BA71C9CEA158F49C295D5CCB312A6952B49F93BF4BA -0643969797744812290640085654BDAE5E5CE8A78B252ABD6E2E8ADE87DF953A -0EDF7411E58383B6A269D928DD4D3ABB621BB4FEECDD9E84B29452859B60222F -170639491FC6F77F39A256341FD992156CBC45213AEFB43316F2C3E446D7806D -6F56245B738E0F7CD2E1BDF80ACB163D425D05583AE7E7373D687F079F4A28DA -8B6EDBAF5C3C741C2BBB3D33FA4FFD71AE242E52F68B6496AFC50097EF031824 -E7E43BBB6020F93BFD437F06CECF02194A8CB87B2652E97063FECC204E4F0398 -23743A81A2EA02BD016791E99403E67EADA4ECA4490279652933F42857351217 -62118964338C51F534C68B9B9BE719C166AD3AD9ED522514A99C97E8014D5852 -380A81B5890E0A277102130BE0969E6DBC015F676BC0B3B0DE30D07901B10BF9 -45B89F18EE13A0D617FE3ECA8E6EA04652AF6CDC7F009A52B531EA70522CC31E -A0E91B6E9D60EEC4DD7F92B9083C7B019CE01AC885F6B5857AFD4123B1B87E58 -F0A889C898732E0D079184450F12BBCADBB249FB593D81738B8F69DBB5016F60 -3048F5C1D5CA2266259DD2CE37CDE4A7E1633C4D3577E390521F8A8D8BB7F6FA -6063AB1089F18C8E30F87727C4CF78D5C54B0464E17E55C4347AB0EFB810C049 -C2307E4F520110A137DEC343CABC1F642EDDDF233B96AB7F8416676BB32D2479 -65C48F746E7019C839414CEE81A03DC435F10717A85286BBCFEACF24C9A671BD -4820BCBBC896A30DA3450C4F4947CE3A07E717BC789DC4EEF25CE4AD2BEC0411 -FE152A289C1D26C9508D206386B65AA1B2AAC060163819C8496F3609E291FA71 -B29E5A529994FE4956C4EC6FA95AFFDADC2DE58ECF6C6E160D3306B8FD42E398 -4F9C0900EF120203684823BF309F03E23195F2848F51E321DFFD9BC24B6E3BB2 -474C7CA890DE8C0EFDD1085D37FC800173ECC63FAFEAD51B681F964EFDB5C0B2 -7DD7E8EF6F333497B3FEB72FE035324FBBB06E7488441083CBD10F2E6024BD4C -72A0AED77847FBBADCA8B2880D3CC8E04BD1503C70DB1D8DA1C2BE303F0C7CE1 -7673488237350657DE4B7FC9775C13B6231DB84845755755F67D4ABCE6F45658 -E17CE8FAE0CAC26733FDD493E15CF5D1AD5BEFE23D6E1EB335A3706E3A71EB22 -40BAC5D469EEAB3686691127037D50A7B2AFDB496D2B1E9FAC69DC1E83A0D833 -AB839AAEACE34AAA0F4272774E7DDDA88586A381C6133F12A41EE11FDE813E59 -B6E5C3914AFB7F786C39CFA9C5A8E73D49B3511EEE9AEBAEED94B8D559DE5CE9 -CBE6BD710215DB65F041A230740F28BDDB46A89B38AC8767F252ACD1B297EA4C -EE114AAB6EFF10D398CA1B788AE63B672C867474220F6F20FE9F0B1AC1650B2C -EBB80EB68D62024EC5C2124F3607DF8776928BC25867C4730808308FBC326156 -5A99B88CD042F581A389B459A6F8FC484EE8C17DE640C7928A78CFBB9C6104FE -004009DF77FAFE4E1C092F6E5FA048D771D7F25AAC0013D0402A1AFD1E8D0515 -BFDC767DB9BE89407322857519236AEAC3A076CEEEEE7FEECB30B6751EE09E9C -472DBDA84A3D45A6CD9B9E7A29FB31852315389E7038F57923EC9225803A6A68 -7EA2F3EF394AA6CCB8336F34F75E2B5E577A4724663A0A35338A8E95C989B9C7 -CE48B675933214EE6FA7EE94B3249ABCEB5EC75A714C30CB88E27B9752DFD3DD -0CC44FC1E3230D92274E1F35429B377DBE57867A40F37B8B88260C3A72ACDCD2 -C8AEF714124B838C638468A9405C46CB2BE67A118A117FBE0A0CAFD9A36D2882 -516B94676566B98BFA1EF6DB6D7258F9420EF010ACB3DAA97409CB272A60AE22 -0E03F9C40889C514E3A4D1BB3A10A6DCC439EBE37D8C28472060DB405F74E855 -27BAD6D66BFC8CCCA038F5BB9EE0F5F1EECB64311A731EA3A22B52AC2AA9933B -7909A46DC299C3D701527E734C339955325265C0D5A3E30B1506239F803847ED -0ED27F81C1B982FC881769BB5DB178405501DDD2507EE8B038FC9F440E849736 -2CA4A7CA8F25BC2DDB645DC96DA317DE9BA8A2207329D3A722D2D15663E47E19 -13058EAFA7BE4635666070C17BFA087FEE6244495F5E5AA6CA1FF1054215E9CF -AD6160126243C941031D3675B73AB83602B8FD765A81D49A8D7AB9A3D107BAE8 -234D9FDFD2D720C1894FE036D249B7A19165A744F8A5D1C226258F8A6ABE0B3A -65DBB2E761542D20EB327375A1B6738F0814C9273D30863144AF710492D90C61 -6861198193A64E9A6BC1093CFBA2890C4132D1B9F0D133AE52F0B8A39197534B -22BBCF08BCA93A492FA327E92008F42BAC0AD14AF049D2C23CD92D84C9749282 -FD4A491333DCFCE526AA22C2C68C1A85D18199782807725C5D1363A72CEF75BD -1ACFBF1B64590C6A24F09B6D4E0C433C49DC99ABE220361E98D25C594253DD5E -903F487B4C2553F78B70C03B8E3658405FD8427065ACE263AAE8AEF2D92ECFDE -71DF9CB7DD61A9EC5B0AAED868F91423A410527C057D8F543B93DA02F40CE88A -E4F29A755430068AC26CF97EF481B5650AEDE5E6BE6E03AAA2F1BB0D04507028 -26C0166B4F91FADD73BD4C557C2B3BB477B3A73921821A704F18103489109533 -3B7F59422F9FF147EED3FEF9BD2EC6EE9C4305593C5563CB6C400353EF3DF249 -0E9CAB7918B61706BC300A39AEB4650ECCF7A3E9342297E4E6AB177F6CB63BF2 -C33DC31FCA946D8B4D33788CB6C91AACCE90DDF5F1B92DC2E7B2D0E244F3C893 -F37B7E2FFE10EF0D1AD762243840BBC99232B1CAC7A321AF88D2BA62B55E305E -ABF6323CB529D0766E0E8F4230D9EE5BB6863B605A0DF56695C01AE054CCB502 -1905489F1A486FE00B284356D1AB83D27BEEDAAEC8DB318114590D0324755C61 -18521C015B5855F0992792E644D194BB3F52E4679659FC4B8AE383F7EF29ECB9 -6EBEA201A8875DEA6410CCBF09BF050D08182DEB13264F55E0F5FFAC218370E6 -5E9C8AF9E349856AB11D393B583F4FEED6EB4EFF9727084D69977D67EB7B61FB -A79DB726E75FD817270B6CF8C8D0A57A6F83ED03B1D3DE572324E7F4BD4D1B99 -97140FF18BF45B6198202AB9A30DEF4ED9695D5FEC15942FC363E9CDEF782F04 -486F71CE6BFA5E8D53C969065D990700E3485967EC03EFEAF0F479CFFBED405A -2D29B98307EA5D4E2CF536DA21F66A961F9A860EBA38B51EF6A106E009DCF099 -B0A2DB3D768850526B90ACE82FB6589D3459351DF1CD37F9CFA174D2F9597A50 -C1033304D971EC0C2314B2AF3E665DF1B53F751E913CB5D4808501B507059879 -769E3ADCC2D8E3875C7D6EF7E7CB48DD07E2F0B415E869D196B6D0B8B80023C5 -7501F75710AF487BD35DBC56BEA988EFB72A60D37DDB34A3E16E4C3302041FED -F67725B1E85AA62C438D812902CD301CD6B0711356956B3EE81244634ACFE99B -695465D6249EA7D73F0530B7A5C6C321E52608C33699498800E0B496288D2C91 -F85FE65F17A7127E7B24B965CA8901ACBADEEAC73A7DE07B53966F0A5D857486 -674B6BD44831C3DA3914E72DB66AC7F1F7553DD8F8125779348ACB28B313A5EC -BFD42000EC537ECF0A191364CEE8F7557697852610AF5C00EC2E23DF58BDC5B4 -D7238CF054E0019259CFF06D29A7045757429F71ED61743C71A6CD09D0CC9DA9 -289B1C880D8E07C79E66FFB61682EB3162821C9DD3161EEB998269A42D64A160 -9E07F3D060E6D9055636B786218A103F8ECEE20933D1233FBFF0ECF9F01BAF09 -560441BB6A0B6931192496CF3485BEC03F10581B3C8936A6C3BB0C3D4AF346BB -0FF8AC37DDAE5D82561F31DEA6107119F89EC25056E7FD5984EA349407EBE597 -BD71E2EE4E8034690BF158D2EECE68EA603FAD5E0258CE2084F898D7C7CE7625 -3D8990CAAAF8A87C730FCF7D9DA3E5991545CF680CE9CFF96FF99F2660E2164E -44AF04EF697F3F3FC8940BCA00A526D8AB419FF20FE6A0A007301F9AEA8324FB -5B069EDB2AAC535F5489F723BA457401417A63CC98BBC70C26FCE973F4AFF4DD -B3F3CF7AAD27AACB8C23D7E421D512A82259212FBA5D6DE572A40D04BB05D470 -EDB61AE5E4358F11D3FE840D24AC2D9CE4F91B3B9A357CBC8DFAFC8A0776DF14 -32A016B0D5F8226A7F3FE390001BC336024657D1F7151DF5098030553D71F87B -6A5C46D286D0AA3E946538ECD82EDAAF2C6B608041945232E52E27DE9928875F -D2406BA32126FCC92FCA719DCFFA13CDF0367E294AE6A4DAE01CC1D70E59AFBF -EAC961C6B3F63F3696FE3105F7980D24AD4F14BF7F35F84674AD400A94BE2A02 -9F243BE2AEDB5AA8BDC1A3FD5371E265149C110754A70412B068828C611EA981 -2907E87A12DEE88636F904F865C6CA994C0D139AAEEC147A2ED1955F527A7230 -51D5266D8C7CD0A1C1A9EA24CF1E65BCE6EBE21E04D7C94B0FF6DCE002F05BCE -1FDFF4F6BB1C72A49CE1A78A2916382D3DFD5A8A9E6D27C170D1626B702231BB -9921646CD185E87A367BDDB9DDC2F2239F3CBFAA9B73DDBFB2E5A6EBDCB0902E -CD432D6171B96245102B362BB07BC33B677CD115B309E98C35E02A515BF3B651 -99789B6B3C8E81C983D1AC9B9E53F4B3BB0AF40D3861C206272B07433C091734 -8123BF670D0BD74E04131F26C7BE882288C3700D0C3E804C23843BBB689CEE18 -40BF8DE4C4A90327099E286377892C3BF307240D0012C3BF05551B1D66F57F6E -D5409CF3C82F5AFFD40FD83C998626CBB46EB5B53317DB98C7D4C08F230DC51B -393211EB6B +ADAEFB625EA966F3877B3FFEA518B809A4BD1976F150D90CA8D3F4CD9BDE66D3 +C4EDAAD03F38F51BCDE46EDE3886162BD9BB261372533ABD34FED03C561B0130 +BBF8365B2289D193B45CA39A7A738A7D573E2345E7C90BBECA11CEDAEE221757 +21D744792446A018BF566063ED4B286F03DC5B7F675B6095FCB023CF330B9941 +F4CA0142BE88BB675436D0811B54A389DAF3C6742FE17ED4B6760401356C5F45 +2BA5CDE430A38B9DBBA11B96B48FD6B91492F12108A2BD5DCFEC68DCAC37B01F +34829D2B458E78C57342FA33F4B6C22F4B14CDF101BC10E7705E095C1D41FF88 +847F3CA10F0CE5B61C99AA12085390CDB04303DAE42C682E8D51D67BFC9EBDDE +E875AFE2C97AA54CB9CF4CDFA10D20C35A742BD05BF2610E3AB68D03444E830B +140637754252B2735488BD1E0ED5C20050984E08E6072690862EEA0EECC2F630 +D6CA6E30A1C8C7E69C4DAEC4C75BC4FC4FCC6FEF365C73A4B3810591CC6D443D +E7642EA8B6141FAE0D255B164DD0487C92E379BBF2C611A0CE138D81512A748A +2F8839DA6FCE17A54327BE9D62897840729E1D46929C96685080240A13FF3217 +C9641EC494FC47B30938935CDA0B2C44BD08847F22D693485AA6A0F05AA5B483 +70BAA7AA0C3A14A5B5343666327A003001D221D9DA18EA194DC23E1301D171B6 +7C5EC1EB8370AB77BB0356CE8F299013E1C7F5BD9C6F2CB4E6145581F78591FC +D029F91A54F29EB0FE77BFB5C8FE378E166955B2DCE364A71C3AD33DE1E745AD +417E727BE5D2B02EA3932545F95EA4399C4CDCCFB49709B491FD6A1EA2733568 +4FBB320505889D4C5F32D4B4F10C28D0A661471869ADE7B824DCB6753D03C393 +E76B6DE5DAD6D5834739E426F3A0C660D784E5CD386E6A5441FF6B41F9448A7D +56B14E40F0174365321667F84977BC33B2050D532A40397BDA697361BDC535F0 +53ED23C5EFBE4F7C6794304A0FF6B67A7C8E8001D47D7733A13FC672D9AEE1B7 +FEB0DBC7355F635C86461F1AB2F7E0B9C80F61E830599F2CAE67E85468336481 +E9E6433EC7EFFC359B70B98035F5D2CCCA4743B9EF41F19EBF3B550418D0D913 +C48E9D62580733D4E210AFEAA5B764A521F387CDE8411E3EA996347642BCC3B8 +05A60E6056EF0FF34F028ECAC78C19826F1EED90B01A47DCFDD769D78458647E +505492642104B550D057D73C986E2CBE896B52CBD67FC056D968AECB5869C712 +4D52E0A774F3681832AEE1EEACE1DAE31B779ABE6E760072522C4EAEC7D5538D +701B0C048713FC390B5E7D9729A5078AB46EE62B1B76857F65A3959DCBE8A409 +D8297851791989780C35328D8CF730881326E2C796A9A3161CEF031A068C42DD +7E58F4B3B788CFD4F05195B4D58CB5FDBF7E06C44280723F27C20BCD234D5E85 +3B3AF6D9A49324CCD96C1B82B4DF94E182EC62C9822AD4EE33BAF810482F3EC1 +FEC1B87CE6039C60EDB6A8D189D1715A7CF542CEE4197488CDC0433518271D4C +53EB8238C67DD01F7DD2DF798054EA8CD5922CB9A8E3D5522F71400DBCFAC866 +A8B37C0ACAEE6E8F18241BEE610415B7D7CD0F02302404862137AE9C9F9155ED +DA5454C584E89277F40048DB5662A9A5C6106D16A51D3A5FFB7EA197DAD29ECB +219353620641D310BF811DCF8701967FC99B937BA3D369D0A18A98EDBB2B1EAB +C0534B458266976D1D872DF0E2EA702AE79A273054C28425B245154BEEFF874F +5929DC8179D2DEF24B84CD7F8FA385B17ECD04E71DFFB618611C967040EBBF31 +867A1AF98AA82ACB6FA1E65115D06A5D10701D8077C7F93343D5CB255A565738 +A3AC97905293D0B83DF381AC9C3E9FEABDB49504BA5D04043A4473665488BABC +F9FCB4A97167DC394327F0CA3510F8439843B6812ACAE6774C523EBE7434AA5B +0134719857865320EB40001E310370BBB0AC48E4950B2C817A48E2EC92D04524 +EAEA30188E333AB95902DEF3088B9CEA52D14078A3FB8ED012F36118F8BA671B +6215E1CB5A619A4EF1B390CE97E99FD0453A4493EB45C3793BE85CE13AE0C199 +C388BAD3D4ACADE0086056F62708B4E3CAB3864F3E0333E615894916B7334E43 +4DDE99CB3C92155F1A07464C5D3592E89CBD25D67CEEF0C29CF2501D0F9BD6D6 +9644EBFE95F2550A15A4E8CB6AE38F6CA4B006FCB5EAC6FB4A789EB88F891A87 +1747B5A5700CA2D8E531BC372A101783207E7FA42A019992A5AE22BF55B8538D +538ABD912CEC58C5A9C5F78687A3A777391FBC5CB37B47CB70B7F965264E78E7 +57F9C81CBAD6693CB97300FBAEA8BA041E5E9ED3CEC9FC796F71F50823F2D2B4 +7CEDD0C6562D1B0F63AC218689002D09276EFA203860CE660E5B36A02ADCE68F +5643412C907A028843F6FE8D05B734CC8F525C9D4F2D007E12F49256AD5A6C26 +414C48438AF65FD0A116091AA59679EF655804DE72D4A032C88E70E965289014 +4AF3B45395F2762F9ADE1CBB3570E9689694F3D77E1DCB65BE20460D077CF2A0 +344D1C07DAF4616BD52353032F50D5C640805D78448DF7E49ABBD2B2025ECBB8 +57536EB7EDE67E8647434B74C4D232E9628D2175D49DDEFA99236310B466268C +E318689AF662B44D804E96D1CE5265678629E079D749554EEBD69278A4EE8795 +ABE7495DCEA3E85E3C97C91887EFE33C90D83C267379A67F7C86D812C63B56F3 +D605D45C36A0825B1CB352FF1D016744ACCA4D55A5A58D8651D023499D14F911 +6CD4C962EE7CD9110067F99C5CA5697E539FB78027C7FCD05060A22E220BCF85 +F4E3DD7F176B4615F53025F126E9BCF5647954FEEAA6382BA7D715867638EEFF +A393E427329612E791A950FC84CA9EBF084D4A67A24CFD7536591229E67E4410 +1FE5D2E74468416E9720ACBD535E13641F39B38376C676B01629C6C39CA1158B +0021A3C98C921B0C5BE8EAEFB0F489FA59834981F3D70E70E2C5CC9DD905BA8E +03A6AE3DA98F9438064838B0FABCBD83071C7D49E37DE9D6C5289AB2825A62B0 +2A761A7E1BDD75D64EA0C2800699EBBEBFC97CB7212DD3DFF3284A966415E0A6 +668C25020BBAB3D885303AA85239B69C9C083D9D6251F35A20F63AB04ED2D7E1 +AE49EFD44BD620CD0B95929C815D8D17F909E2102027910DD813F5E4F20D0FF1 +D4E4541547AC5A6143439EAC27E0F1A11A430373FFA4401F7844FCBCC0D4D0E6 +C5E52E03157831BD6CBA03C00D2BB80C6CD64D69E885AE62D4ED452D2F4A864F +0BF0CBD86C2780AAC052423F590DE3DE4D6E39EE05A15199DFC75F1FC1EA1D1E +04514C061C4FB7FC872E099B526FF927F6AD8BDAB25CDDACF03E15E475979B53 +1AA25A8C9F77DC958A95A5F9A3B2D4B1CD759E0257510F850F148351846AB8E3 +34AA5CCA4CDDD6520C36789CBB281BA7DA20F5976A4E731681E47765896F4108 +2859376056F823A6E40587935455C22B1AB003F4C8053D57B521F1520009744F +091644AD51BC329FD432CEFA48C7CAE415BBD7362DAFB92D997836EFBF9DC5D8 +3AB26A0DEC90F175F0222334BB7B4E97A84AE6A01E6CF113262443AF464B24AB +1174DD4AA1760800CEF690AE6888E7A1E82D69DCD65CFD57CEEC83A52E28F299 +1FDD8D6BACD3F9F38F92F3E98D086437F44F55B49483C9F49A776191E7F26D7D +9FF8642E1D69C6E97640A64BC981760CD1E423269EC8DE0166FC053D1DDE7AB0 +163DBF3EDBB6F91FF217BF62CF640E673056D030303550B3BA9B9EFE3886E79C +015F68BEA5EEA461083D72F57DE6D38BB0F91829FE9B550B0A0E8BD802591A92 +494F50C8A2E29B2D13B7F930444C5CBAE371E3A32F56CE10DF8582B697E6E7D3 +80ACDB11EC9E080B0826D6CD8E378F5A98BD4CFFF1CA77CE5825EECE282A4C9D +60458E57C15617D16CAE6114A65FD03CD57411C143EC678290410AFB7092B483 +C9A4F08AFDF5AC048ED7C0B5F04A86DFA1760C01E1A7B5629E9DB276BF04283C +CBE698E90E635DCF162A543EA956500D2B499B17D1581B729DEEA5C5E141C164 +E290CF3A782497CA309959CD6E79E7E0F0989EF12631C7EFB79DDC27878BA445 +828C7EF4F4647683BAA41003E67515C4FD367D6DDFF53D987D82C123CCF4E1D6 +F6C0BD859F271BCCA27373CEAAA0DFB041B5A76C333B24F69CB46EAC0C58B3DE +F7B9F95B2A6219BFD48AFDC471789AB6563D582B1DC2B55E657ED1F2DC33C718 +ACCB45AD417E725FCCA5E848AA997A5E2ADCD2FE85EF65B51BBA20A80D9CAF2E +CDE7A216380C44B617C3965E82784856348A9FC8F8078DC34BD883A048C3DE73 +584E75F2F924990802906A334C45D82264E3806C1618F8645D15513E014AECBA +CB8D02A925393174E3A0744D635A630DD984B7DAE5ED8D7B48A71C8580995E24 +E743E83AC57E445DB3B914A0C7743BD608CAED5F31AFA9ABFAC4EAC3B5F7C266 +13A496E1A546227BFB3A19ACE042D13954446409E09F4631C6EC967CA2B59E69 +185301A999A28106145843A60B963FD7CB0EA0AFF4D2F850B55C88A41B9AC5A5 +4A1D67A0622146A75224331421E38ED23A3FC11351B0FA8B2512D1A93C7B909D +A1993FFC80B3F114A1468207592BFC34F49A15D77572EB129AB1393F557092ED +59BD1E645940FCEFB4B3E39771E4983EAA2CFA33573B7FBA761067E54E6CAB15 +678536A2FE638A0A4C508A71001BAED69F3D4C2700C9ADDDB666B1754957A8B9 +E98DF835AED0544CF272ABA25FCAE349E0A24449E36A2719F2301426FB61069D +3F8D24DBE1A3CF15EFBE64012D5A05FE5E81A7EB841909FB8C94C8CCA1357708 +C5E8BB923F791D721920C067A0A8065691CF400414C9E90D7AA794F2C7E845FC +08FF4F8133F9C82BCFA699368ECBF6AC497EAB207E6F60419D91E5A0D7141E1C +AF70DF40D7723923D15F4A33742D1C0439FAE7ABF110CDB6256FFADBF296F4B2 +651182F3FDDABDF8E6CE2EE98FEDECF192A750FCCE8D91A3D7C47B6FC3DDD73B +925386537D7A9671B9887AF57AEA9A19610AF44C14EDC4CB00505A6D51492117 +BA96923DBB4F1C078764E81780E384FCE44944D68E843C0324A93511E394F3A0 +27DEB767145F4B28B353D6559D1731E07781F21B794C346779D59AC2A269FB10 +706ADBE2DFCF7FCA0D285906DB46B0CE4F54CC0C5C9BD85A1C1E1207AB6E0E2A +C13B4C5D3B04D50C4686051BFB8C7C583104C5C06C98ED9793D2F90CD74F3B1F +B4844E92D260D197D6F82C9161B78B509F86D0706DDB488119034CF8CE3F8AAC +24A0D3145ACA773AFEE463E1ED290ACD704501400832572ADA4BC8CF3B45EE50 +5D6B0BEFE762E3E46681E856F031B50206F0EEC6FC48263FEBAC451E4CD5A577 +D0E85CFCC49645790DD11C5A939D589AE552BA5D1933ECB14BD54CBC6D8F036D +76949367532CC57FF4DE38AAEC7F324691D5BD96C1A76D976EE267F4B6414CF6 +3F5F299C162BB63B5E64D284A97878ED05B770AE864607C538E0CEDD6541CF01 +5C22B9F702C119CDADE25AD23C31E78F46D215A6D65F37652C4D74C636CBA212 +8D4C6FA5667BE5D25F59F58C4D35319896060116ADD5B27F94205AEF4DDEB648 +C3DB1A06BCA363FA4538137B051D4BBC94B34BD94D9C8E728A99A067933649E9 +F57F1A08498E24783960D546B4F53AFBDD15F401C78A8982DC42DD2FCDAC4E47 +5DADE22DFE7E013275A619AA38B3889F8D81493BBBE04FF6E4815A7B51D6C162 +58B953BECD461972DA9952AA2F44D16465F0743C602CA583F436305FFFDB6F7E +AA4398524C2D804BA3B3DD14850CAD0FD15E2793E3903D9809802F9FF33947DC +56D1E63A6DDF36FA836D2A70DA1914954CFEC82E645FF3B17A6C18E9D1DAF11E +EFD529C47B5FB67EB6925BEFDCB2965CD8D43375915B2141319293CF55912FC7 +9B7D7372DCFC480C344C0755B802DD31E82F7808DC99ADD39A6F37FE8417AFDE +F6324B415C36FF87DF66543E5E411CB83985EC6972F350236B7DCE0E24B0E59E +8F365F01803F62EA64DF9BF8A20755E1447BAF2FE8BE7662DEDF67BF37CFD088 +1BE20797FF44B62DC3A4AFA09FD64937C95E7085489099F185F66E3CEF6F6C8D +A1362FA13C853D172096C0FA44F257F6270D22EFA230C261791EA6062D3BAACE +F5A1EA0DB44BCDB834D28D02AC851440D145C1885A5B1E5DBF1F8EBD076550BE +064452220616FDC46A7B92250F07C3D0440B8ACDB87E92DE5C567AF0CAD733EF +66C90876469C5FBCE277EA1C85E76E00BAC14B824BF743D90AB86288A3D740D9 +6E402AAF6D223C11D7F4D03C47E39FC45F5CAA282EA30C0351D580A8734346EE +735D909A2F6D23F1E1F55C2163AFDB42E528A1FB6D22FD3ACCC12CB771FE1E7C +F5C946D682443A26BD0396FD44DC9484C75469B7CD0207EAFCFD6BBDD0A8989A +A9B8FAFD59F3FC57F1C35ECF26EEA7B09A6505EA01CD8ADF8FE0664BE19D1E05 +56135EC7C89F64B7426E0DDE5CD424A834E576781A6179F63B7ABF41FA9A1EBB +45C8D93D4C172353952D961C9D3BF0FC42F7EB4D4AC32750B0BC9596A4D9F610 +428239422891286815D66116A02DB58531B25CEDE819F7B5F044A9207C264DC1 +FD02DEB67B622DD3655D2FECD7C106F0104FA05C22D5221DAA6E134D3149608F +03FC97DF783DEEB8F0757E2116B36BAB0384D18184177D97D947983550285B17 +1DAA6BE705219CB6ED34D02CFEB76D708014181B299F69F8B4CA7D0FCBDB43DE +8AA73403A531D81A9290AE447184735B7C2FA4F81E59C07FC8454D690EFD9F36 +0D7DB4F0FD87DDA518387F342F9CCBA1B36985D8A2EF780793B79D4521AB828B +5F0006E8A4F41976945501F3BCD6D8064311E6471E856D89903810B298D82560 +A04B927F04D6B8E062893466A2B98EAD6FAEA3866F0C43ACEA9695FC602F712C +1A563759D399F56A38DFDF00A69BEBF7B52ECE48E1F40001C6A94825BA48A318 +399A5C879C7C70C913DFC8F0D26070AD1FADA158039ED6140B04D4ADEB2B3605 +B5EA9F670E2DD40180886053399EBF39FBED864034C95E378789FEFA0055BFB2 +148FEC39E0B80C4793BEE6D5109FDE9B405E5C32D8480A854838E22A7723AF08 +786FBE9A4D20207BF7A2B6AC3A8B38FBAC4EFFF1E961C0BF3750B99929A891E6 +7E3F4734230D98212410DDA8665ED6EC2CB22A4210AF6E7E0511214B6B714708 +644ABFC6D303CDEA42375BB856547B0CBDF73FD732B5FE2402C3BE286E391BDD +70594242F300906C09747A66EAC5AC8D86E3F6D9123E5DEF6520C2104DAFBF29 +3575D497CC5C01DB31D97D5CD3A07C7A5D3C0ED470CF49BD885D7E2B5D336602 +09BB1BF76513175E98977D5AB84A0534FF60C8BA59ACF3E82011603B0ED4B691 +8435CAE6D4D937B84C14E8D58F5D0DFA6193491BA4DA4BE76D8FE65F3538D019 +A615B9624780817B43BC9980C5DACE3B92927622459284E0F337C53694E745CA +9578F28788330B93D257C911558D443764E07C81B910B7752F53A2FB665DEBF3 +454D88067569006D1D55BC6C31A7E02632FC1AD74FA56CB95B0C7679CE4E917F +4C364FC8FA6DFF3ABFBAA8193B559760C0ECA8FEB1EF4B1A7B09A412E9825215 +A5ED693F182EF3C51337A272CB2328875C437ECD0D387C93E25E69B82144804A +AAF142E2C3054F59459D51F0AA663C50D317553B901712880C4B3FFD95F32C14 +424AE2A1CD3913497702E2BE6049CB6334A44CE727DEC48F259F8C5A514FD25F +62EEDFD4CF170DD2CA4CAAF4B22C9FE090B4D52C96578B30646361D5EB942CB4 +B8A8251F02A22518E94ED659C193DCF48423DBFE0F909D10A84CB8AFF593D3F0 +E6EE31800E36249E0B7992E620CFBDA4B37B3A8C9EED8F13D9FCF96D517E6F79 +95C02E77A9615730264264B9524C7F5F63DC1827D7C6EED9F602D0D94B78BC6A +1952BC2038E3D48FDCAB72DF8CE7B034AD9557AE9A3FDFE9D904D97DA83CBFD5 +4C90B52624876E17AF64D0E24FFCDD2BCCB66D98DEA7680537C79417A4F18BCD +DD98CB487B447A317EE2F00E28716282A514B19EFA35CABAE5314ED349A50BDA +82A0FF68C318D5212DA2FD9D3E7E440F2E592BF08F0DB0C901F9C3F8868CF2CC +F50832676814B2A6832C1BFE1AF637A3AA129E160FD29898244A2D0145AC8332 +7269BC07364E7367CEBDCDF7DAC0E3745BB58EDBAF00618A7619F31E5A942286 +CBC91C0B565B57F9BB8C8BEB3FF3FD10E4063B85E8874C1DFA13031310FC2826 +3E67D0EC92DDF46F23F0AA4851DC75F92CED85821B3AFDB02D416B7D463947A6 +CA8F9409621B95631862A86002FFAD9FD0098A20961AD38B234DB08E5DF61D51 +6F85988ED8B0ADCCABE7F1ECDFAAB1DD9BD40629B1E65BD089396FDFE0A17C40 +99951F668BD116E812A245936D70E294285F89170447520CB556944F8DCBE076 +C4FC87625AE3D679A0ACE7DBC73FE4A28A22937E48C950802CC71D47DC551A9A +3B8227D72952C46FF592DAF1746D996CF17996C146CED52610176221E9CF510F +EAAA612D1265E4E1E4AE2FFE7094A99C139A44E7255D3A6105A21435ADA34ACE +E82F071DE99F3A6289C0C04362EFE40997E9E15CDAA5DAAA4C16411F26C01C66 +A2A6EDEB969E9440CF7A8980103DB8D94538D149FDAE75FCDEFF3F90424DF294 +0EAFF17284A5DAA1D23F4BD74B0F5B50B78E1D8697C1A3CB203B59F50837E0CA +D8ED77940E586EC519D0AA059F4A497D49635DB8D96DED66BF8F3CFBF7C12C13 +4693C3CC69C420B19810551ACC78E060C001610E0EACFA822BC9716D3671A62D +2AF9B525B9043C67081A9C2B8D3B703AE5C407EA1C89610E4EC92A953711D45B +C7801F58A316500BBE4794193AA9B21AE017416D1CCC2E4C6315EA0E6E1E825B +972DA5B331175BDE7111FBA4F41C13CB40427A97D8B9A5F1702E9A9EB0BBFC9F +0E00B4759F346D38E8A47F2F0C63C7D284EC8DB8FFC18AF0120F081126347A60 +2883E5EE4BC0858AE21F48CC271C90B37B191CC377126A41EA064D81C6200B7D +340924B6F50564EA4D2A92327AFCB1D5B07D6B801125E41732D4F373CDA0B495 +98106652E949972B86BD3882AF0993C5A0B9368C20DC3CE87C00B53267188A7C +2FE7EC5E443654DF30463A83069D90E7BBF0C787B8EA11C7D7CEB456B28B1ADC +605A8956DF1B63938C2946B06629FD12BA5AD9D627ABC73DD7C18D919AE05198 +CB7274D81862195556F92EC63E1DE68C09D2C2A6AC9E049FE7A28410201A4D93 +D569C862EAC182B1FFC5715B68E40D666F59B8AED6526D0047AFE6891183925E +3A2EA27C741B8C4FD031537A461737709443F63EA922D2DBB2C5519A72A78832 +619F190C31767FD4DA0521343C246C874F6B7F53F444A5155984062FD7FF2E4C +FD12638DDF777F9AEC8EFA25643B2FF85180A73292F288A13EF1593D0245A90D +A8E50B6870075310F9D0258F9626D577D64894561FAFAA31A7627B38F81BECD9 +B322EA2901D61545B7489D3AEA31BF314D236F7994517EFB8663F38D0DDBFD7A +A992C19863C9B3F32D21AD970A8869592BB97508F7DE9544C360D87FA95FE33B +796D41808589C67D6B0374AE0B7F55DDA11CB34F9C287119636A642AD3A40B2A +7F6961CAA3FACA92D3815B68184595A93A903F73840DA1A3699A420CFFF61F8E +E38B82E30C1E0F5F3E5518A9E87C2B4C0177AE246AB345A65388104584EF11E3 +88254BB0CCBFFD36A924EEF2D21C4030AD5F3CCEE563998ED48CFFFAA24DBBCD +8C7F885585B3A8B3FB5B8A03D307D752D5174A5C450C4C64369A371BACA1C7BB +4A7058108DBE6065DB0C64DFD4584C7362CF17F2442ADA0FA4D89E82E10E27CC +133162A1DB6F2AF58AE0EF27904C89297E9BCADA2017140A52E267FBD44D5704 +E61C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -3756,12 +3751,13 @@ dup 12 /fi put dup 40 /parenleft put dup 41 /parenright put dup 46 /period put +dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put -dup 56 /eight put +dup 55 /seven put dup 58 /colon put dup 65 /A put dup 67 /C put @@ -3997,291 +3993,295 @@ BBCFFB1ED92299DB0291CAB10A84529B7FE279C62628A24A2FC36B01976E13A9 C528A198B8EC8654AD69CCB5C209964A2B25D6DA9BA0FFB366D19D8C69701D7E 8ECBEA88569601C80E19A4165AC73F32D0ED08C8FD0D0407325DFF60D69BC8FB 95D27536CFD07285E9FA0E957BD98B45C2E7A24AA33635C6683B801BC89AF92B -57BDBD4C4FA2979D6344AC3198440DB1709FAF1D9DBD7EF56D6161464803216E -9866C68434A3533C4372DB3C1CFA11ED5321C3F4CE7CF78E392506AAF7257AFC -7C9AD27EB8EB637A93384B54EAC3BD084571DDF97EB5E82C643FAC667BC3DD3F -D981A9E0DDB7320B07F23CCFFC4D74C034EC6C36DD66D907A4D34CB94409D362 -04EC03D1FB2A58E607C6ED3FDE67E97D9446876F6C685938EAC48CFE4A228E83 -FF5AEB1A4FE7EC29B33D17293570D43B501DA206F7CB0C5AF321C58E21F739B3 -49C19AEA6529CC550471E98E84DADA143F571A340759AC0809A695A56EBE8BF7 -6074197773630952FC57B9A3EE95B0E63CC4474A6ADB4D9E7FDD3B2B35294CC9 -D9F6B1C2786D00FD841BA8007988D6B4DA71736F63B1BA028230C46B0AD6A6AC -8126FAA43863ADCE0DF29E8B4C9EF15CF7D80AF346C45A9C347273FBE528E1D5 -389D396B339BD8129B462513B063D931CCDF8F346959483BAB970A4428B9EFBB -0773F9B2DFA2D6566AA2963DA654DC21F8F11EE928A083406353DEF3829EA553 -EB6EB0DAD22A4245AC88B5C509DF6C290D93AAE1E5BE9ED6BDA7D04AB0B0998C -A1264CE0025B1B2E2463A5CDC5CF0F60AA49AAD32391A5F97E27115223C6D1B8 -CA9346C5E650DB86749EE83275610023D41A47D0E5425E74D16A6EB98EC38C6E -00DFCE06B41D2FEAA761F5102718086A15E02717309F7D3B6140293E4B1A46D8 -6E8FEBBBAD104DFD4DE26B87E61A3C0043AC2C2DA283E1167D0E07DD24C80C94 -CBDDC86A09F86E651BAF3E059217118A0408612BAE85E4253C83E3AA5066CC08 -7E6528CCBDBDB5A63297B0BA85E9753B1C968783835EC4006D89F51C3E7D5DD3 -31C9CBC83D175E7832A643AA617DC3B38D8BDC98B7E806BA0F224E8AB73100C8 -A7ACE961DF33A8D97D6F86D5321B57EB2055525ABC17B676585E0DF57FD4E591 -1E6E9C8FB7991EFD37827EF2620B4BC0FDE501354F8ABD9997B508EA7731FFB3 -305944D9A5D4241F0A617F28587E7AE09F73C60B4D1FA1C37CB23B10A8E3FBAD -A2E067B24AE9AC5715F62BD011EF14B6DEA21DA0F2E8BD27C918683CD1484950 -2C5DF9BEEE20A2F79E60B803E8E3D47DCB19F8F24AA44524361B5A8DE4017ED1 -0A04EE08C9E9724268FDF318A6D037F8344FB9DD23441CF3ADBE7EE059E00D4F -B093E7216014B26A490F3779DC5E0D60635537BC8B0B681A20BC3106D4904947 -B6E8F68EC6B10B0B8D1304273BAE5D764FCB8A1C33CB55CA860258773A3C4A67 -794668D72813A662BA507A1EDB1316165E5148822ADAF61F31C8B4788D720A8B -6437E764CCCDDFB1206E7B84AF01BFCA1A695B75D96C47DE7C62670DF0FF4C29 -D0340782B68BFB6CE59C43F54C83C645138BD08492A5D8DA321703B4FDBE8313 -A4C6A13B04618755B5DA2C506CA059B87DF17085F1181FE5A23359C2EC1B27CA -E60567F112BAF14E9DAE8B749D28BF8263866E9019A963884A2DBF7F1F0B4A4E -B7C7A0E084F4A8F76EF5B001E3052DF0CF80C56DD85057073E7A1C1FE182A81C -B72098679C11A375F715270D5D834E94EA4F222F7D3DBAB1AB1AF1EAB16E7675 -42C5985A38613C54FF89DAD80417B054A826D5B6F47CC25FE6C5E831447674F6 -E7D0637D9E729D1F288075BAD89588DF7AEC9EFAB07A2B73D8245A4990A7DD94 -11A1D63F6E1F9934A807BE37EC1A897EFBA4DF6998C910DD75658BF6F133196F -438C818B549AC11198008DEF1548AA8DB6CBBC8980C96513E790F19CC3A3C151 -1B12A9B524F6026F3551632A3BA2C9FF376AEFA6BAE9D99A990D6B5714C06D3D -8F68CA21B985E93B0FCDCFB8A39F8DF7B996310B2C1C32FAE1189D6826363B69 -AE6B1B7231D8545A0863B20340CDD552B304B98236927CCBA7BABDE112C25380 -2D08885E8AD17C915908BBC9786D595A0C33A4E7EC1EB66825AE036892DFCB32 -F0576B232F99D99AF3E45D1F26FA0DAB711852AAE2523C6795478BA47E4883FC -92A1223B740DF537FFCAEA617CE3E01DB8518D1B4F60633820F0583187D99EA5 -72E4CECAC883823E5F7EFB04E211AB3D3362FE18F9EBC87470E3C62AB782B5AD -518B69458817EC3A7B8B026E624AE303D18E9E18768F3D3CC978DA4DA6926738 -678E2F96F751AC5F55FA5069B815AF3E06071937F0D013EB7791E718899D92E0 -F13260F6A4F8D6B0BA5405523919E543AE935DD6E1121D4F2DB2C46224CB23BC -39D8537A61DE02008507809DC8906549846FE92F4A835E2217E45CB52E41C696 -98171C24A8F4EF4539F8FBD56355DC995E6E2033E6CC70686CBFA59C19E29A08 -3FB507DB7262FF4520CC3B9194EF5BEAD93EDD5CBBF775A894EEC324676DCF96 -24AEB7824D5B0A506A5838F4E8651795D1611577E86A55393644B2A13E5B075A -FDB70F8619D12A0554476531F69011ACBEE38895BB29439BFB469759E13B9595 -AD5712F767893E2DA66E73C9A88BF9C131C2E1494B2BD04697CD7655966A2D7F -4591E4FE21C817D5337856B6A17F4C2AB207CE750692DB20A25A13EDE487B3BC -0AB2A5C821DB76C4E9100B0D7C4AAF737495DF622216064C01698126F8F237B6 -6016C1FCA6322E7733F0CA0EB83459B143C970CC26EFB1FBA673DE3043FE2489 -2B06DF11D30E1984F7B57DE00892890F36C445E0004DD0492D0BFC40D8DFA970 -4C18FE162CDA7DD31D69714E55E455399C3DEDE5A9A23151ACE7F23D34E70F98 -0F1AF32C7984263F920CDAED21D94CF9DDD72E8EA7AAA7EDDE944F167E318A43 -FAEAC3F77026C771C81017AB544FC6F81009D861402817ACA88FA41C36798168 -29E7204C78F0A89166C1F27B1151988825CB4330693F33B30E0B006352966677 -7FB5E5D522018FA4C7AEB791E84315D67D114481E4427F0D219BDDE0E10AC009 -677247624ACA604F41D4074B24DE54B57E9FBCFD202A40EDB497690935AFDE21 -0FAC4108BCEB82440D51DD0A0D0D61E3F21204E61AC15BD51061DD72EC27A4F4 -7EB24BB58BD6B081C68645E555F9EE3F5B71615BC98F03CE9F059BDE71F3C3B8 -C0283919A815DEFC70CD1C8C450C6E9CF1001371EEB6651EAE42C1848C0F271D -0466DFB548B0DBAE1A0F79CC7F9CF5D113CAFA86A04048E0F6A0F6A0E0D42E29 -866D8AF62A565F302609905808DD338460BF75A75DDDDE4B38A569149B2EB856 -8AC05433CE5DF29CB9F653BAC71270C8BBFDDC4794FBBBD407134C1A2F4D22F3 -3D18EC493CAC8BC6EF887B78762B179B038D83C1C96A8F6D2C507AC5DF3E3003 -22E63A4F67DC02E2D59A44E5DFE529ACCE3A4CEE2567FBB6FD1CA178DBD1399D -2CE138F853D68514F186EAAD924D9952D551504D7C95449248C979181BA3DF5A -8925BCB229E63DA811716D82B56365629960DE392076FE533516CCE02E341137 -EC32EECBC9ECACF92B03BAA83859FBA0584EEA52B3904B69C1ACD8B56CD320B2 -3DEC1D1DA1B66741F1C32CB8F4DA6FC6C8C64C5C3D0A0BCED43C5CB88E5E2B84 -6C5E062278DF5F323E2BB59CBD5B1F41F43BB3C7AD92A69B048758C90E0D3A52 -6FB41FA9EB8BFC592793F45FDD2157DC92B4A910312DC2067C6C5179BC170DC2 -1E445045E7E5720410DB949BF761C9EA5830D2C474FAA17431B0B69D504C8F49 -52911906240AA7A6E649577251FBA1B694F34F6D382E8FDA76708690341646BB -E4C8FC130D1EB7214C56A203983C0AAE490726E24D6CC83F06E29E117DDED606 -5ECDBDED5D5DF2F48F642A19F9E59B3A0C39D11050DC4895956B4ED5F71CB7CD -806D50CD68C66C797BBC187FD3313474361A2EC0C30B98A7EAC314BE1049D354 -72F2C754771C49A3B8DE3BDD7D332D5FF160D2C128C7B4524B3C2191372AAA1A -0A6BA0D4B8D440B4CB17098A59622AA62423C4F7CDCB2DCD45F7553E61FBD272 -EB86A952B821C8A360C531B77C49CE62BD37550DC26DBC8F1060D6710AED5646 -FB43A9845023ECE6444B084AC06E83393370C505874C1260117CFAECC1AEB626 -B9076582EB7F4BF3F5938AA89A3903E8FC147D4E3B89B06D7B51672391BB7F98 -003B1AF7980E84302BB8ED67B4456B6F45BD1F2155ECD5B60C9D8633D2BBA367 -2F503192AD0C9F3A204AA41B8AE03DD9D8A8E7FEAAA29F0AE5F18892E64A050F -A44185D62296B9CADDBDAF78E769051D212D294B14265D37FD248C2F8370BACA -D33E7785D00C79714D6F4C11D512033798826B3B711B7BF306133C9F536E18B0 -AC2169060D5B42FE9D70FE52C3CF104F2E28B872AADCB33422A5106EEDC941DC -29FEE0EC5020582C0784556A74E3697EC5BBBFE08B7E878C06A13660F164C740 -2B6E26475AB9E4944EDBA4169A9D36B43D2D88948B53B1B9C8ACB8CE7880000B -4226719FB522758866ED95E18B0965FA0BB633FBB79D67F12DC20AF71FEF1A5C -7C895EA14CD857C5C79B5CD31B7A831905E7178E26657AA3026FB65E2FC0E201 -5489E6B9B60F361CE78514DA8A89FC3CC7C434EF6AA0E60C215DA385A8910697 -4C1B9562FC0016794C2A124E27FCA078404500FB9B3475B7A599F87CE00DD4D2 -745292C279F8907DD01EE660B88B41AC46524297065681BD24AA1979E00978D2 -7C33725AD1953F5BA713C8ABE20D350B00929A29FC28C5081D9745773108F37B -D7064CF53AC0788B5F3445808E1A7FFA9064D1614EEC7D193F137D8BC89D4E4D -7224D2C322B0C35A641ECF98048CF8A750C6CFB4E1EED164C354EF8DEFD02829 -0F91E7C1B1F3E98F9EF0C84FFE10197F116278A5EE0330DD552329B1177CC4F7 -C6A79F8D96C4392F22815A222BE811B4B81FF99E729F2D74BB86E59144C42092 -B2EC7CD29E91788DFFFEB6FC9E777B7638C3CFD777DCCDDF2EE14388482D89EA -9413310C2834290131D8154DA17FD72260D811DE1C82B9761BD0FE86C799A163 -99AE61D5A271B610410346F4B9894AD72E9E6F6C63678C1FD1706B118BA4C60E -69236F15FF65459E08D6942250D0A568DA1CCA3F85A0924C4CAEA475467D5D54 -B674EABB35604C4337382F8FB16194681FA11EC85677E57DCFCE6B7CF780FBE6 -1E8C9FACA71FAF605C03FA5880514AAA760C91C85F2B2190BEC2EAEA4E46EA02 -5172F34E607A0846126675E96859B1C657DCCDBB3A64CD8315BA8C88E833D217 -D352BF66F5FA87940EE2A1777C9E1E867D8D2DCB33B242C491763629311B1E84 -38EF9B80554E5F8DA022BE06F57838FB5327592B97853E6DA510BB5FD2142DF8 -E602A1635AA59CAEE7FAE408B381CC505ED188354A7D56707B3B5B7F2A83DE3D -9D3C34B160DE3BBB0602C0102F8BF5D17D739F2FAD17C5E403A0C6E9D3EBB864 -39A015CBE7ADADE67C60414A78DC6856AD0EA0998F51352485E48B1539F42531 -2E10B6E3FB27E60D445C9755DEF5BFF503573B06FE971C769B0026A866389FD6 -6FB25812D7C06D5799BC6A271F1F9B0FB41C0E3F466EB109C8D0DCE23D3D2B6B -3566329ECE6951E6C5AF424C7C7ED0C1F3B1BB7B212BF4A5FC7859465FFB90BB -57BA658CD542A24049F2E6897A812AADE9B1642AA573B6AB80277DEC2A869787 -070B4F72EF11D1DE9C79A34858997DB1A7789D7590FEEAC1E6150E01BACE5334 -7CFB81CCC5D42E3A395807AC19177AC8667B9C71AC0CA9D048989DE54E6BE675 -BAF3F13BC331E3AF75F6AB2B14E234CFC3EC303A22AA64A2A3B21DD02996460A -0BBB2431B58D0667D8EAA51D3E03C27C1CD779FB914D02BEE1E544EC44A0A4AD -936713AB7729B634FE216181F4D5508B680893A2F28EA451EF35701091195A25 -2D5C727A723D589EAB2DB1AA45B271FC9AE17C0B387C627510EE80DB03FE64AD -A453C9CAEBAB4BDF449FE9A0E00911C10ECDD8A9CE2FF49BB9FD2F92660B31C5 -9811ACC24162DBE7992660A880B5493D03F4B7B0FC512B22A33A1E3AB3BABC0F -4B3648E710959103A0D5F6E6E9A86BF3F4EAC6BEF1AFAD3038AA48D0A38B4C90 -B0B7005D8D3725C8563FD71DAD5F59E7F14C2E2327BADD45EE4854E4790F8D3E -8F2CF554208DA4789A198489AA1D0FA3B358FB2E8245D6A6E2B449B9F91F2241 -E79504B052E33581DC98F440ABB4B48AFDDFF1939DC3F52EB07DB9FA636F5F7C -6A0076210981C77D0126260CE1D224519469AD53E5ECB0FF473F960463A8C353 -18033ADC1CECF34BE3D751F59EF711AF0B00188ADC2D215C2BEFD52B63E0478B -553B3BAFF351AF373F3C94B2C279A9E0964FA918719657D270B4DF14CEDF43C0 -230F467F10B3B814C7472E7B0301298E67F518DCAE3DD02F34661896828145AD -9CDF4D547747DCC70E1A43ED757B6FBA6BD2D2229F2EE00D5D6DCDDE1A5765C9 -532A98A6BA32238AD2767BFDCFD271F009B778D152DFFC5F7B3E93FB30B479D0 -95CB3DA664F7037FE20B286C7C21BD14D1C11537097674E4774AE403915DCD42 -4BF85C7A06F5C721CD92EFEE90DC0ECDF37F8C4723CAC2ECE44271954B67C721 -89634E05E351C4B3F360356B2C02727A46F2A0721CDC42D5FBAD1968DA46B729 -E72BE77930740652E4E56CE02DF5A881B61968166F07E36088B5451EB870C14A -D9A07E34EF0D7C92156DCEA851F625F933E61F36DA3320F7A4535289FAEC6883 -42955C50434FDB86A1830D48FFC598774D502584D6CC867FC50238EC24D2B58A -6CF0AF823822CEFC74F874B84658F4CD54370AFBCAEEBBE60AA457AA5DA1A06C -C8F92A48460E94E7CC3E28791F2885E28544FA5ACB0F4125DE6F8D532DDF420B -7283A6591659F5B56E61504B5322B4B1CC80A0463DCD00B6821F56446E43F029 -E56E69F8C28B3112EDA3AA5E69046FBA5E57ECF686979BE5B243819BC34CA308 -FE1258B6A1127E701593AE44C88715CF4D3547DC6C66E85F8C14494AF4F07F9F -22723D40A8D483B725246DF4757706783AF56C1A953DD68BC97285C5315CCD5A -4350D8742CF7FA13D1A46042ABFA25CC6120EDA9948D262FBB66055C464C14A0 -B8977B5BB2DAD142F46CFEB4A36B7EC51D55E728883F50672F3E1D4FFE41E5CF -30571C3EE09101C213AECAF90EE8698B740FA5717FF2198C005568E9DB201600 -833437B707AF68F52E9B68EFC36D73E9D4582AB0F135EA890D939FB1BE866144 -67CC07007B66C9CE3F7B204E75369E22D09B4F88E6DF4F7918A79AF5819C7A77 -3DDA23B3F1242BC2A61545E112255DFD97B86E859EA508CC77577BD9404AC9C6 -7A998CC511760C3CBFCD9F6F53A7B1F7B5EB6ECCC074A05E533A67FCA3CA63B0 -552D00C4D31149B29173A8667D9713756D64911540A9D4F3D071C90A76E8B9B4 -B0066037E9359AB21FF5855ED9E71BD1E9848D6A663694BE34FCC171305B2826 -BE177DDDC9B1B97BBC79E45EFC7E70FB11AF79699F373E700CE4D171086461DE -D8E061B240997646FFBD6D273FA9604861DBBF3A50DA307E28AE218C3D0818C1 -4331CF7C0F448650AD20A77AB23CC5F40C48CCD602D0B32D4C7CD7B4B607E262 -D07B5214069C6856D31F40B0D50A63B079D065F79C3ACFA853C2C8A3DC2572D0 -B5DD285BB0ADD7596FDED62DF7C68EFF979DB5E0182FD061DF55362EDE0B03CB -70A15526CBE98186701557FFD27556E64DF68EB38234AA13770C733477CE8A39 -0B65A272D1DB66EBA12234F1AD36E0F2B0289820CEDCBDD4CC852F53207BED97 -CB93E853456D631D7DC397ED5A6ADF59E8D04756921A319E8A85DEE2FD175D86 -A5094BFFE6FF5BA43715E2E2941741E63570CF3489C7DDF94AE79A0021F76384 -6E76CA3C1AC552EE4B66DFD560EBDA38EF5E93DDA803BD06E2EE8003E2276790 -896D51B88E4FA90061EE472BECF58A133B35920E47BBA565727DFBEF612ED98E -895C8936833C52C5703B5F79F58F4C3171F2071040881EEABBD9D4313F246856 -AFCCF15AA4A087A9483BD95C260BF5B59485B74E1E3E98F92505B0D27F46F832 -CD562D0649886F2CAD709585334B034F3C4B93692C0082EACFFBFF259ADAA6D1 -9F863393DC0C772B2A9230FDB5FF02E8F0B5C059DBAC8D8F75BE0B3650AFA3E4 -4292F1CF0A4AF45D9BD8856FF82D93AD77ECD217024A8F619A5B8667D286FA94 -587224B5CF48327FBA64FDEB58FEE11560EA78252F6F3E3520319090EDF0B565 -EECA2CB5FEAD5B42A95B19D4CF41BAC211CEE425FE833DC7F67146FA46AEEAFA -2AC315DD3D7017B652AB372D6941E9AE38D8BF6F48F5032CC938C7F8AAC3ADA8 -ABAEDC939E982B4C92C666CB24A5242D5504A788338BC5663222F502094EBEC4 -007B13BB67213B30783987029BF3458DD1714F59421AAAD0C298519EA2A4F4E5 -38703C5CFFD13C621EB988C6EDEE218B5D5315164FBF0C41F32B5A48E50FF7F4 -B60B005B69ACA39396DA5969BFD468B28BEA77413E80A3F7027A31A81FCAC929 -108189FD78D3D3B6B22529ACDC418F7D8050A4DA3275FD84E7F2822325CD1E5B -B0CD6685FA050D53B892CDD028FBE94BA9E2F1C61BD56DEFD7789C2BAAF164B4 -F8FBBF983001B91D0A667F94EE096CC9695C0F84B3BA9BCA6B50787EF1DDC483 -C5DEC8B12C00B19F9D1C680BBC3751E3F9C964F3302B4B9CECB9F6DBA34BEAA3 -CA2F39CC530488640FC1A7CC894E4AED03A08176F3AC15C3FA26FE85C9D9BAFB -9F4CC02255074CCB951B7E878D7AB997737417BC010499D7F91610D5E2A67AC6 -F8D95510738B83B43DFF22C451A3096F758616FF223882017663DA7AB0AA0D87 -4CE2C31640489CB32EA91176D5C39531746330ADC7925AAEB086075BBFD5E9E2 -4D8967A73090B20310432A8D7FB3D0A756F6D73B36020F040E710792561FA99E -3307619D6B65F1AE55F0B053FA8DE24D54619AA5ED9F0C1A7157AD8B9D97A142 -386DB15AC36D6CCF453C2EFA6A4615935D388250A11B296307A45B90D7E76BDA -609198C8FA31C6E5CE1A1AEDD544CBE2D7C6FCEF1CA63BA2D57D2744578956FE -D463214CEE5C154966E10F0A64E25DF25BE8538F9CDF5D480BD8004082070F38 -C88473561C641E815A6D94820D0CDE56829F0AAE4BE1315D360DEB4CB25B4FBF -791999D4FA7206256B177D8450D50A32A7F806D89471EE96CC7E85356D2C1E35 -288B7FBC0036792A4E7DE77DEB347F2168B3BD9AFD31177AB5E4990957869944 -243087BC9F048C218368BD6C738832CEC99D7F31159A33026442ED4D27771E12 -BF02554203415B1877941037C72CB762B51471C79365C018D506AAD55464A248 -7EB6E55D9B0527CAC8A915BA84F4DAE556B427F48E3120142AED5705789C2708 -AE94395B1F7B875EFF7F19B9AB8AF28737FC304E32C8633625DAE96D1D732E29 -59879BACFBB15ABFE8A6EE1150AEB29713B428FFAFB619206D71FC382B1215EE -759318C5CFEA9C0E5E8E3B7F47DE607B6F93C19AF28467568A3F373AEDC78AC0 -CE99A407D97154FD68220CA66F7D3EA77B323A7015FA9D9E8AC5927D0E7F4A4F -1FC871BFA999EC749E09FE2AEB8220705B0AC8CB4DBBC409CEA6B47F98B67CED -DED64869A1F9B3BCA0A85D66B1C27301DE7542FDEEAB005F2FB76CA066664B94 -968C3E637E055EFB165093574FB6EA732B959FE708C52FFEF012CC1117C85EF6 -56B97BA4B30322F7B3F1F95233A3C897E5316BB86E8C331FF1A858429E0D98FC -DA67AA525C035606A8ABDBE35B742B53183CE047EA2CDE1C08EDF08E5355F694 -1C34925DB0D5314CC0B205F40775A500B76491789B90D4604D3545E2D7DAC1EA -400B2CF72EADCE9C7409900ADD1C6057DBBD97D332F6435C0B91B14D081EBE01 -EC9230E6D12B6455E401CB100C7B3590D23CE094C79BE8266F1F24937448FEA7 -C74CE914AE8DFE853F3E068433A6DA96F156A0014C457040587BAE7DB4CAE2C0 -EC1FF60747BAFB376D5F87DB5CE2A8512453088742214C38F5B6E0D7644A0C1A -F67087FA502BB43C27B32931D8315CB8A425341ABC3E7656588AB563E9CC456C -E46CC1E57DD4B2A83CEE5FD154001568DB6AFBCEBE8FAA4458AFA35BF37E4C71 -1D112063753E5B66C8B4E801A5E46F6053C8B55A95086615D6601924A6633C4A -C4D8EB0B7A5C8AA7E49FCFDC8182EEA53DB300AADBCA3836FC88A140A155C726 -54CA5DDD926DDD0C1555C26E30AAE25D1CA4A2478D0FDE0EC996A1399D5C0F69 -C349AAA9206B2554D7D6C68DA845053641E22B965314B6F28D69628FE8D5C243 -E978E6B81B3F916E722DBAF355B18812021267A9E3C324B3D9F6BCF7B5B50CC2 -D5B72D9DE9D485E103F25E1F42FF7BF040B3B6B5DFBB36BCD8E8B6379CA3198A -7AEC551899A044FEE3CAAD9A2C3D839DD370C97C194D5A4F2815785E413A0597 -C61887CC4842988FBB321DCF73FB977402DA1E3D9EFAA176230295ABFD079DD9 -9B2D187B82BD7FCAFF1EA271FF74ED0210D616BCBB443800C9FCA4F467A19717 -DD0D36AD7CD6CBA51AEB15755E68789368851FAE22F39F3CBA9CA1DEFC304E17 -33BF87828DE7758DADAF45CB27CB0A64DEB8F4CCE7FF05CEB0E4E016B9675CA4 -E7E001E16FB153610F077EDE525873CE46E0A3997EF7F73D8DF38B916A8AF808 -93C2463BF8B9C5875B76FD983F00311BE872F5CDB5B1647508F422FBF2A56986 -6358FA3C232E7E6063C82F74823036BB7AF8F8D545D12D82B2195DCEC5969DF2 -0EE8CE3123CB3010FBEF3FCCD7F1920ACC42FFB593697B786E6A6F52E10C1A15 -208783D4280FC31CC679F9E4A00E684B74EF11900CCBF5554CFCE34B65A9A999 -68AB22E0A438B4DC1CBFC32755F7DC8FE58A7956C1BBBD29983200DDDAA59C5B -4CE550F5E0AB048E98DA80BDEBA63ADD9DB6C7DC3A3F6E25C1FB6B638120925D -C897B2C05C4179A0E48740439BEA3FFCD35C71B21ADFD7C8412706D3868C4BDE -30F6B8CAE82D86AF842CFEDCAB3CF67BDF0AF7FCE6A0E7AD2D247446C38B2CF3 -26CD3D7E09F5CE2535283C43D04C9391C7A1CDFA6F2571F786A1F0189B9BAFCB -AB1CDDF8190D7CE364F8FF8EBCBBD5F646C095CF27A34B7235566BFE8B012E01 -CC721A7B3FFD795A0EBAF81A8A0A7820B99E98166C1AF177B87446927CC0C239 -54BBAE855E9FBD704DE67917FABE3034A953930949AFCF79A59AD8A387CA1FA4 -58131723EB2935C02EBBE6F9554BDDBEA5EA55E3FD6BCF25DA52765D65054BB8 -4A5C2AD1312892297E1C45570F0622D145BE35C8758391F28C04B3AC4282D1AE -084E080892C76C1B9C9F738760879908EC5B3A90DAB7A6538080A484E54B9FF0 -1C2885E93F1F16E52E0A3C9F6802E6345BBC5DBC5E7C57C85104427CA3182C7A -54E95B22D149BFBA403CC8A960EC62EDABA1881F31B92C54DD21C96298A7703E -E9D2DBA4B91A23C4E5F3D225A38C07818DA8C2F261D950FC8AB6042023248E37 -6BA0AE50B9A85F04EB48523143AE40695F127E34E070331620415B95A5ECB24F -C46696AC6F75020F6322DFD03B42788C535DB541FEA6F846380E8F5800B7E060 -51A387FC9AAF598C88CEF209FA38E008D8707A34245EFB722BB373D7E6B1E6CF -BDF2DBCE22FD2C85F78C4C4FC31F3C2F6B553C4295A1E26665BD166FFB7DF6BE -A6E9D18FB735F2DA53138A4A4352B36A08B662528FE0237FF37FFF218D88F2EC -50741BC5E98E856B17D8015869044657657BDB90D69A0FD5D5D0CF4A6A091E56 -938D444D0618D7B45C22F65E18B034282849355ACE83A188D164FA36367AE6C3 -35C775F72A89A4017A4071EAE1118B88C58CB1DE4E20EE1955BE0BFE8646CCF7 -05322E5566D14B5318A2328648CE7C1AC36B077D1A8AF17AC827E500B09FF496 -69CF7446403EF7B00C4F1832F1F6692B5FBACFA7FF9A719E5DDC8F25A798CEE9 -F4F114E522F00B7A415AFBCE48D09958DE98CAAF427FFDFD635A7ED5DCFD5F7B -6D7AF2B5E78F4446753C8CE59F923D4728ACE448F35BF3FBBC8B2ABCF49432D3 -AA49924191FC8AFDAD01863EE8716B6D76A6512B40BDE9C18C7D321646539DB5 -A09047ACE1815F462E82DC593548CF68B78D52049AED0E44627779613BC02BCD -2B5BDC8D2091271D44BA1362DE0E44E46CAA9D966D429848FA422A73061A12F2 -B1BE7A81533D810479F91C9656D3AB7F00B9332AB851743C0F25E32F37E943FA -370B4EB25781068D8DFAAEC50CF86028610CDB59CEEC4AB547EB3908897AF9ED -CA74EA35D2CA70A70BC83B0AC2E4A5E558098AE2B12EB42397CFCA0F9C9E15BC -9431FB2F10224F22F0E191291110FC5E1313A99EA12B3E3318263AAD516BCF66 -C71C825091984E21010B29025E3FBDC518E8960AABEAE236F03611CAB6F87D03 -EF0DA8DAC4D2C58A9ABD40E592B2756FB21E4D7D2F2D3259F51CEB6BCBB1B4E2 -33BC3B474D779565D69F0FF19113A20553F85DFDB4FF9E175606240A7562B12D -4B8B8F938AFDCFDAD721A64972573F6251D363FA971FDC41F2E02F7DF28C0AED -EAD3A9CBBED541FA7E6AD7BEA83945118B83564782FBCEC5B466B96DA7809BFD -A86907AA67FCC568533218DDB3D201301379A1B9EA8A32DE36B1F7F93F99F0BB -FA3F4D002793063ADB685A8935EA4A5E549767853A6488C6DFC2E70B3A455D0A -29E8F6FD949E810C0EC0F6F835DDD975EF68B4DA83F23A14945195248F667B32 -EF2F958253C7F5FD49AD7E545911E963D76006C57322D2CE2FF3F1DD1256152B -3226C0CA03B72F409C91151FF59EC80C2B7431C656E94E19904AB842D63BC797 -1C6552AB4B265ABC2AA8B66096AEC22E778232043288EE0F60D6ABB319B9D2BD -0FBF6F0BFFF5DEDC3A39AECD6821EDE1B213F7A2E6A7BA475389D647F663642D -E4C5C3F0DE1C0030EE381006CB01B5E5947AE6E837DD2ADBFC967557A0182EDD -16B10FE9BDD490CA0A3C351B025FC63A08D1415163EBD31ECEFC3F50586142BB -205E41E1ECEC46CD2209D760D75E743AD13AF1E761A8B7F996ABCAEA43645546 -F42C87F6909258CC74419B96A39D6DA3233834894CC60B03F867B6ADAA2C18F6 -0040A9D8E70BAB12221217095DFC57117CDEB536FDA09E11787D4F7B448F88 +57BDBD4C4FA2979D6344AC3198440DB1709FAF1D9DBD7EF56D61664EC7BC0921 +2A51FE14DE1E2F1297F9DFD716BC08D5EED44C02A449C5F2F57D79D8806114F7 +A29CF906ABE31DD46AAB5562977194ECD03E78CBB9B405F3E2C4288D963F1B0A +CF60D94F28A813767BC40D2BF2B7808804D86B70DBF94654C66BA1C9ACE1D8C0 +DDC96E86F83000882EB43B827B54D499205F00CD9ABA1488A5ACF8A1C67DA1A7 +319BC9466FAAD8DC6178411A7665B719C8A2C9C08752199137D18C07F050F920 +D99A80697D9906F17C34D9F7002E243231D0605A10BA62A5BE24BA9370D67895 +2974D9AC107A45FC80B6CE4737F49921FB1F14CCEA0968E7ADE73F081A24938D +E19CC21EB81FE8100D478C6584A25876B1E2F4DC29C866CA5E854FE495F46B38 +311FE43A7E8FE3F9646507D23259F2D4970ADF7AF7E4ADBA8A1A5A8A7C621F0E +F2A1A4E4D5FE16E7B0E897D1896F4ED012A454FCE7AB1ADEF996780956884795 +90DBD63C5828FB8BB6702048EE10A62CDE24D71D6B901128F9C6CDB76BC5C7FC +E39362BBCDDB4318EF08C9B3CF7A0DC30E5D92AE4F93E4C3F6C8684395BF4DEA +AD736D39569007E8D020D26FECDE65B054B2A8B33442200B6E61DD0CFCAA50F6 +BD827C0BBDCD78C5867AB1E712C372FDDD5DD3ADA48BF40A5442876A53E5E34D +9EEA9A4DDEA7B00004FE8B5A2F74A65266BD4E6D81FC5B2DE06AD5405A353CE7 +999ECC2189BBF0E02581E4FD6B08F3709D92053B91F58AAAEF526449B3994159 +9C32F9D5C58EF1C8643359280E2712A42083D51AA7E2C7E3AFFBECA3ABF7E65B +40D29A06619AA6CCBC3DD8C650EAF46E7A4205D0AC073D975AE628F88935027B +36CCA945C0CB9CEF075D30897740E4696E90C5AEEB567EF45D8BEAAE811D5394 +5C56EF1060A048B764AEF895642899A64D1B43DDCC7F000B38C6F9E8F8E18B33 +E52241A7028A30C0E7A3E923C145B66ADD817E1142B09ACC1794F733CD09C893 +E7CAF8B9EAAA17FE2D99FE9414B0044735ED4697F40919329E03BDCD4B7D2126 +D51080F01C44F0C6B20E7A82AA5DF30B585AEC9F950BB82101C19895ADCD7668 +F8FFDBD6D559C40F27872C9DB1640EC248F8C1E2B852F244DA57F46F8F36E34F +672F649DF741D281A5D92B77D14A35BD71E1BD18E1009BD5852D099AB6C6DFD9 +81363038ECC5CD2F6C9EFBBE0556CF468290624E7A9FA0A119596C2CC05901AD +0FB432FCF9B79098D2501C46875F44CA438EE63670527EAB66AB620EE152ADFF +F63309400BC9BB2C93DA80BAEFF91CA0059965B743C7658ED2999CCAD0B6CB30 +7E549BE6CC5A3320A9321924DAB511B9D1F871218787070B7706F5DA180E567C +30B036869F297BE6F67C4519947BA83D9C24FED8DE0D02B7B9CAE1A03F82AB51 +75F707A65DBBA797653C1CBB3E5A0DF49D94CFCFC68BCB9ECAFBAAF03673ABA3 +B8321A0458EB3C91CC6DD69EE0941D9429C9C5092693B607A67E0AEAE55053F4 +D74CC02F87B891CC50BD8634543845BB44585404ECF2E512AD455D80EA2820A5 +0A853919C11791C0BB81303C5532623A1CE3AE964361AA2F2E241AC8C731056A +89727610875875A1D03A09E6F54E5606C808973770064E6C9CACA9F195512163 +BF99DEE1A715907E2772BC68D16508BC1DB50D7BC9198D23527C9581FDA43BF1 +D40A0DBBD96D65CF2D23360390E61E4C05CF743CFB31E58B1EA9DF7B80DA8141 +D26D09B3B3864B45C0495C56BCA163C00B6C77C747037AA8A1C0AB5FA2B8EDB7 +E7F305ED235246237A265F52A3223AA6F478533F4634CB6FB6DE6E81910265AE +83A4C384EC4897CD9A044A892079834755212800BCA31BFF1F67C31C975C8FDB +767C1D80DF27485468D48FB0B16F0D3C191705EAE8DA6B41A570A2D5DDE994CB +0ABF11EB4B4E420A5DD8725E870EE3958DF71590FD2317896FAA4C6F3F1558A1 +D829D5B8BA4C59364363D3C20A3F778A72914EB3707E562F244CF96FC90F506C +26349EE971AD5C91723922EECCA11B8D23E94EC119C5F3BAD9018342AF2E1934 +69E49E93524360C250A02544FA58E92E6E39B760E740DAF416938E412B1AF7F6 +D9FA3C9DC7835DE730C93344DD7B02848A4578C8810FF104F2E2A2EF38F52598 +5ABCE06308B024EA70486182FD2BCD88B02EB78420A3145F3E310DB94BBB9889 +F52EB14E39BAA497BBD563E39EBAADA2AF1320341F0D0B865F91EAF2CA91956E +B288D71F0FD38FC462D866082E9A6515AE23D63460EFFF2E3EFC4BC51F799CA0 +4DE2E555C64F9CD1375ACA5698A8EFBCE478F1C9BD344ECC534D83E6E233E709 +C8DF1AC21329965344A747067B03B791AE5C1ED0106412447291FED0A19ADB9C +7D3ABF0E596CADDF5021DF61A98BB2BEB3C7DE70C95407772D070407F28142AD +DB62C727D13483746DAC3CF262BC68B833AD874166B4D0EC10C7E2A4DB5ADDAC +5F248B8CD6ECB789AC03CA093B86700490CFA49D063DCB2A694A52886F2D256A +A59047BA8AA6F15CB5DA0466A857B66FC9E437678BD7EC602903337BF4700C71 +621A7813F120A934EBF5303EC5C0DC42780F3CAE043BF763B542309CFF3F2B87 +2AA14CADBD8D000A67298EE5AE4DFC4ACBC2CD873C4D9098086BD2B2F597E9AB +32E22A86E43A7A2D127C8E50112CA4A224FD28A1F26FD75A3440F0C7CD685414 +A0A738EBD355A62FEA6D46E4F82663AC49A6E91C1BF1D6337DCEDF19AE5C685B +C1224DC47603225DAB9072D54E49C0D51AA35777F1ACB4BF32AC7D01168C3976 +FD5257A7CD8CBAF17DCC98CD31C79839043A8EBD0E54EABE20AB3E113B751578 +C43C2030F99159D7709B6CCEEF4EA02ADFAB59DE70F6BB276EAB521E4E1BD371 +0C665CF7081813BC8A3714A403E2E7989FF396D9196C6A5DBAE6BE6CDB40DD7C +193F91A2911D7D791B8494E2CAFA72079842FF6F84D637C211E2BABE7DE62D11 +E41B8D400AEB3C3272C71CE684F478633151831716B99F52336D731F5BDC09E0 +9F392C58157236596F053A9A9A6AFB440C2C900A539E16E4C37289DD58E94DBE +8BE05D1547265F64C0F65AE960376C074791233175642B9F566C110FD4564480 +4751A13E9EDCBEFCAC10C90CBDF49C8C9D0B5F187F0FA7F3EED161CB038A278F +F08AAB6B033F38D4232D8E1C0543CD85F1ACFE35DA7153385490CD97DD3EE416 +BF37FAC61FFF85D4716A0AFDC45E922791977AD32AD61399565060C26C41F706 +7AAD2D27C3F54986284D3F6E0192DD8EC20BB4DCA8431E4B09CAA7E9C0186A48 +68D3D61DEBBD627AB139868AB0141630559387C58ADF13FD021B323AEC6002BE +51D85A9EB90FC8B47274B02BCE13269FDA90944FDAA40C74B988B23A575A6FF7 +596819BA5F075A6F488F69F7B9C80C4DB4A73CC57EE4C2D4FE07ACD2F163B87C +F7F9BC47308FE26F51C5F52BE9C2C5B2598936B349F8FAA3F1541EE2A0DF756A +EBF16D3C35E97CAD5A9C3AE9F62119B46D2EA30C07C679624297A0B6DF4C9BA2 +810BAFF711FD7D503AA68811A1FAE8F172EFC53F585A278E9C954BB1B4E219E8 +34944BE31B6AE71DC217D7DE08EFD59CDB71BD35D8F229BF4F6B36555BCEFAD2 +92E2B687A353BB608372817B5A598323650137C16CB01F02275F688262C57A3D +ADA0853699372E36A5E94EA76D7F577793EFF2693C13EDF5CAA5D85642408B3B +E12FE05B17CAE8A3F532EF0AEDFBCC352765C4B2DC50D7300721BB2D503152CE +A8BB4A5170E59C049F458666446E52CAFAFCCDDF01067869262E3BB799B06D1B +D44D76A284614D0D02D3A2BC46DCD9F629E9B825A3794802BEF28AF223A3EBEB +E824030274263BA0A9FD91FAA31C1E4A339DE586E37CCBEF60B5571A4831B438 +80C9E24B4D257683B785FF7256367EB2FAB5E79A4BB42901EF4FABB6D3762131 +8FBBBE115F69EFFBFCFE246D7714BE509BE8642954FC6D2DD2B0DEBE1AB9DF80 +DEF7DC1DC786247DE28B62D9630F2C451252D7B60622ED4F0185FC1F8B4BA312 +FF5127B7E2AB7756EA9B3054E9F354635E08267F1D3721061A7119B47B4EE5FD +45E883C73FF64BD9C0F57051D88D3F6F549F6E94E6F69F580B6B297DA0249681 +E02ED4F7B1B84E51F4ACA217D400DAF584A1D0C0997BBE90279B27C97C584964 +482E961EC31C364324011DF04FC850083D6FE0180E31FF62ED4EB02228FB69D1 +2894BCAF37AD240FE874AB293A55EF453E4C0744D2AAA5C5F2910BC281E3D8EF +E706D713A8E074B77EC010AA500506DC82F105C0613FD4E35F06D7C0FEF73B7F +B1F74490EAC3AB9A4F61BA95B02A714987623952E754B225B3E21A18BDE46B20 +0D06B7F1751F9BFF9B30D6C4C20622BA7AF0C43017447BA5630F28A6B2126EC9 +DB901B662FDF6C1A6C8A81AEBC1504531FF542017FF3D54327FA743B21C9021F +36DB6FC504221B93F838C3D7D5731E892F75DF1FFEC5344E867B174052CEDF30 +BE1372B054E3A3A346CC67DE6E608BFFD09BC8B9B8F881C020D74BCA542B85F6 +41E7282E7AA1FB5CFBF4A60530572FBF36F156F6A31F9AE6D026A033D6D78ED6 +441463B179BBEAEDF9ABD9BAFE7CA0CC98B342DB21D0A902F21C5F505DA85FFF +174D2A13DDA547936B84DD7692DC1EEBE9CD9CDAD94E7A0485F17D82B65E3954 +53565E1D6440C3F327E58864AF3284563C013FA1AD1EDED9A38E6283DFF88C5B +E552D23477B453C25E9D9680ED01A27D9F502293D3A40A0BF1E738BDA066314F +771D56EFAB5D2C7EDD5BABEC11C79465A972D8436BB8D5D25CF62CDC741903FF +42757B15F41DBAA2B8BB6958FCAAE52C2DE8B2D5F3B26391B7619F25580934A9 +E7ED5375476EF1DF4764FFF07BAAEF3C0D4DED9CA0E7AC9A82AAB196CDC7AA04 +CFE43427BA049BC17FB567E836DF6E0EC22D7A58D6BB428BF42814C0B071F652 +16EBC9D7FEECCA6DAA2217AAF7564F55FD51261A8E33AE11585A0CED9FAA0890 +5BB9F2EB0504A2F800940FF58FE7F620B719BDD197C65418AAE51310BF8EA272 +4F2C6F732C9F16DE4906291305FC250EEC2F143038F5B919BD79CF0420EAE0BD +E30AB5E9DF473BEC21AD9CD2E78FD2074C435B1B50B7030DFB9B8F2AAA94A19A +BBE3874753A1BAD35782CA78AFF1B7E38AF95674DEEB8464029E146AD48C3319 +0AB788299303914F00FDCE64076CB051C5C0548CDCD55F5E131E02F07A94F146 +0CBA373C6F0FEEF8716D6CDAAB4ACA93B865DB7CC050C3C11A1D1DCCE06F5766 +3E7892BEAF800D4282448477DA3CDE8940A61A561F720960031D0CBB4BA6DB83 +5E098AD2DD4D6C25CF4FFDD5D3E13ED47EE3E7736757C49D650CAE11BF5CF5CC +741EE453447EF37174294A56D503B6551B85C67FDFEF4D2932F8181928713793 +88C22E9036B61F4035DB35544B09D1AE8161AF16A5CA02EBFA117430B2BD5BFA +D7750BDC3ACDB2B466A0FB813820FF6C560650DE37527E4BE4A12E1F6957FDBF +0AC8C8AF75982D4739C752F00E5A23379C572DE45C396A2E657E06E6E04C56FE +4C61BEB991479C1584C31778F604BB8222AA77C7C0F9160ECBCAA3449AF2ED8F +856A66F1039B8B67AB8DFDC4A76BE89F30FC78CB48880B116A602C309BA0D67A +14CF4BC34D81AED5D28A204558443DE85FFA073992162DE80B9F389E6E49B0C7 +231EE73075A3161B7E9A0D7591C96EF8B297935C3D9DEC1F9D7CF2DD6EEC2FF8 +54438D57DE87CEFC9499CC06A39B20498E9FB17358333790E4B0159B8FA20B0B +9E29AE280757001669B4E33EABF675B94F362095CE6A43A1ECDB0E9C952B13EA +CD1AA7A6EF2323D14AA7DF03052F415CE0F712ED4166D40714520ACB06E4D56A +E4CE3E0E1C3C17CA1844AA0DCC2933DDB0C7798C2BFD71E9F520158DA3F8D2AC +D17EB82566E5FDD1075270136A2AC0183E490ABBEF3F94E1D6D59A81687F4FB1 +80C00A63891F0485BA87B5EB29B41070785A8A6EFED488064A4B76DF948465BE +EB0656C214E842EE09DC7E14B9604E5A050394571DC09C7AE76DE6B184A01DE4 +4E24AABE28C1E1B7CF56B3279976224B16C342D130D2A7265315A52BE20BB652 +4DC16E8CD1FC19FC77C94D864385D5AFE19114297AD7E9D74DF5528CC892F1E7 +A57AB51BFD096E2C8F4B30CCE769A0C375AC95F5E8F4217ECD10F65CE78BDEA1 +F157399AFC01B0E3305FCD9E4DD24D51314C0A8F07A10574DE0B62CC86551BB5 +E4CDE434EB44785CBECBD233E81AF34678AECA3912D73AC18D34E9331689E686 +BC2C087B8C091E6CBE80E514E6E0B309E763832EF6A8D653DFF1C988C86C8AC7 +9CECC6FF0F0CCD586FEC597D333C79941FF24B26895FDAE930C76C3DB747087D +16979EB594DE9FF9443ADC35EFE957E5ADCF1F26687E2FDF81D7A205BD7F5A00 +5FFC16CF7ADA9C4228CF55AD85FDB8898C34501F9CCE90E3BC27D13581C0F553 +20628A3E31056757A13134C0E89907CDED524E832DCDE52FB4E0DBFB10E6BFDA +863DF6751767B63BF33166E17070D83E94791D4639CE3AD4B41BF09B41BA96DE +FE756072626D1835234D7B831ACFB832C80244AEB0AB1427C2F3E97B76BBBD67 +9257C8D3864E135B16D933B8DCC2B25D9019F2C5CD0AB7343D39BC3B4E14A957 +123D6F7A6D1BB2B4BC74866666C70A891A5E3AB15941D899F3C5BEC36C0F85E1 +F86F0DC872E66C9B323954C9D7B6F0AA25ABB694D39D5361B2874B193FE93453 +88DE1ADEBB5904C51DE77F623CECA4FC2F14C79AA521E45019D491EADEC7369C +8B569CC8F94553D64BF9D63E0CBCDBF8EA4EA95F951280F6482D36A5D84995F1 +7D6D5C5C853E1D8B9E44EDD50395B56A25D0A256D8046F1AC3D575C2591BFCBB +141C4CFC0433A5DA4BF1125FB31B4E465D67EFED81236FA8AFD8F1F1C8DFB0EB +B3711D9FA6660DAC7DB14A4CB99381BF1FC1F033525B61322513681E4B6DF2B8 +79BD0057573347EECB82EA0144DABB181D9DB4169E934FD7AE90682839FBB17D +20351F9485C49DE403EEA86E791A381FF672442A6600864AB854A23497C928F3 +9DA080BB70DBEDC5F97E7660D4FEFD49790C6AB4512EF0942A095927327BE557 +000723101B1936D7CAD4CEDB9BBA459C29A82878A02EB2B250F486B9E57AFAC9 +611551C0DC60E6654BB5ED253D7D18C386D2E5899ADF6FE07D2632889A2BEF0A +B7E16E04B97E8F290AE461B6A59C194211DBE87FEDF37800CE2EDA3108D9E169 +F1CF3DBE028C2AFAF04094C696AEC52D74BB6747FB3916166D211C8690C478F3 +C1997DBC5EC873170CF61AD6BDD708DE2C1BB428E230C1111AEDDB0A89934966 +A446BB8D7A7646A316071469F314E5499793BF004473DF012EDACF0E3B872C30 +05AE996DE5B7064CB88EA8ACD37B3EB7A3E2D533EFFF9834009FE92329EF76B7 +1BBC9E32659888D5520D5D3B0D7498AC89DE03B975B0BBFA621B34805BA4D999 +ED8BF2877E08E69971D08922D1A7AC0B61FE258BB33509B4780A2163EBA6A39E +644E96E348B00B13A6818EDDB568F6F70D9E530B43F6EC1BCB801D0F2E3EFFC0 +F4F36E528A2AC4C9A961BE96E6CFEDE623DBFC2AEF1D7C5DB9243CFEA4CFD360 +3D9554F129AF3905AB774C6F335A17F6B15A40BE518324C5F7232530C1430372 +E170BB98B7882DCFBBD415E4B826575650418BEB0D6689C86F2DB01A44EA9D1A +748AC9B5C71113BABF43E556F578D4CD562A711FF8CFAE0DB27A6F7522818A5C +CCDAFF81F25BA563A43DC10D995FD0A8CC2C02FBDE62ABDC2A8F48046ADE94A5 +EF141B54D71F0586D2DBA09CF06295CF354F1896B6218326FEAE271BBD922C0C +2A065C71B9CBBFF433C6D32E1191EDC9D68CEA7E9466BC398B444E39CAA07879 +43FA87AF9DB2D129966EAC73400558EE4287A1DD4AC364CC4080803673025078 +028452B925CD6951B3807803804A88345426BD6E59FB1DDF4CB843710BA96300 +18D336294A6BC4E45BAAB2DE0D9A778D88A17FF2588F7AF8B03B5C6BBA17A89E +8B929F83F9B3463F5592A8E710B677C0142FAE8F892CE79FC857A51A8D59DE97 +413DBE7D67C82C0F4E3EF5E26FE61DB3346CCAF36A307E5474B3FE81FA20A925 +58AE61EF420F47B8CC372EE0333A40CCE66817530B3235D9A936FDE388A76AC3 +30EC98D33C16E4BF9188702D5EBCE85192B39811148B08E7E630CCEA8559790E +B89577821CD6428F3FB6F680CA00FE07F1F06C94D5419E2E54AF8A194DA645FD +FE45207B2819C5F178F08E3A08C672AD5C8B3FD0D98DF452A7C633F5B87A0D01 +6B3AC6E85BDE9BAC172EA888A5C86FAF2D4731EC390DE13AD65AF950951B0B1B +3E93836F683BC12AA1F1B6DC371A7E66F0604A43503562B63DF3F45B493A6ED9 +5D9BE9B0B8F5F7BEE60756CF79BBE7A47028CACFEAB637015E4E00BE7F2C9C1F +B3EEB5AC0C9AE3054EED9CCD146B12B56FE435AAB2D92FA4404E44D2E8EACBB9 +C1E21C4DF10F316BAE384E31175CE82C195A79F9B3A3B74123E6A2DAAF54045A +7425E9038AE77B9D1E5AB33F8AAF91D314623BE41A21F1D5F8206AD4A32E5237 +519A42641F18408BEBB6CAC319A74B941D8D3D728ED8D8A0BB3515323315CA1F +23295FB8973BFD3A9D8E66A0FAC8CE431E8E377697F5CD56CB80CC88AF851C60 +DA9DE2711B63B86857AD083838F3936A9E881D96FB03DCEE804C3D6D0CB3AB3C +DB03743E634D80F16E36237BFC44E40C560943924DD7516BD43AC60055C9D7F5 +50484CCB471E014E49C923200CD10390CE92A5B200D5C86ABBCBD6A2C57ED393 +81C45736399B9EAF73B052B5543F8433622DB6C0D36CDF714DC88AB68009BCB4 +2C9219ED28C4ACE9B1ACDA70C35FC07D71C381BCF27A436CC278BE98E28F94D3 +6A41910C08A2AC5E389ADCA56DB69661497EB1ADE463AACC817BDDAB170E578F +8051D01C889ED8F24BA57A7C217DCE931C115321737991FFD542F2E80EC7C91A +1EB513844C9738ED7BC1A280D0AE34D03A77B7AA84CD78DA561B1AAD225F8921 +A3F0374CCA3883CF1CE01B4F993816C2E713D20AC4EB63D3EDAAC9C0FE3D7AA6 +93FAE755A8FC98C9CA35325DDEC153313E2567FC9FDE6400AD44AE31B73010D2 +768A7D2B5D48969ECA35BE603D54FF0CB95CEF1BA064E71CEC8D4D264337F91C +BCB94CE6DCDF2B05E1CD21EA9EC218FDDCD99A461FB5C1076D9B800A86014064 +AA534A2AF51264E34BA27AA23B8314C97230B40C3D05A82A59B19624C9335D39 +EDBE2F2AE3E504ACF475AED646D079C86AB811262E9932D158388AD5A36FA7FD +6B35ECFFA820632720C56761535E504EC4BAE46B5A070FA29816A3B0BF298BD5 +833007A6BAC43BF4971553A69196A166630A96474C338759A03E7E89DA5D2CA4 +98848D52AA5F996ADA1799C4630D27255FC8FA440EE1D6F5886A7540A383167C +C88140B9B3EC4A2927C8442FE853D54EF8C5B076271C7245D979E515C58BDC1F +B927A7ECDADF60CC9353489290155DCF4EA4BD49D8FAA20AE573C1CEA1EEFB4E +2304A568B84CF539A9F01B9566D25A65EBB942AC4E6CDAEC9398D2833C4A3D60 +FD1AED5B25BF4DBBD34D8AF23C0CCB0C4C3A4C56D825689D816F670516D08E6F +788DF52162C2A52A3AA85688E9867E35302BC9323A94881D6FE922928DC71FD2 +ADD02130A509D5E0933BCB3B59849EB0D8B09AB24C7176BBB42479FD8D8581D3 +BE7CE3FA1B6749D977148AF2C06711861A46B57339D8B3D241E300D87E3241AB +1B0AE5918B4F1545BD096C05F50E5C5C6BD8C644BA96940C5DE5EBA2FA47D172 +4F19C22D36B1E2F90D568DA2CDBE55BEFC76257FD6D4D0B2FF4D7E16EED9620B +BF5B043689C355CCC2ED4401C7ADABC3F0370EB1ADE5082581789102D0ED304B +270EFEB8E109CF0F09D1B524C2EB4249820DF8F29FC128F48704596F119766DE +4A790984CA3D87F680CB931EA21666186B7B9FAA695176C83E970A6918EC8292 +41BF38DD48D7C8B449E0C925E2B932D09B9509163C9008812FBFAC8A72E97976 +A78369E181799E338BED92B6A8B03C3B8CABFA98B7DF98E34FE324C52251E0F2 +AAAF32D038C855994C4F45B57DBA59028B1AE0A5BF522C3556875DD84936C7A9 +38B8FD6CCD7250E321C884A6AD0CEB7505D378F96A3F7F76D05D154758605715 +20086DE04410EB8CAFA719879A2DED0E52018A6D9EA748AF20E2C7DF717603AD +09EBE3B8AA7B55131315B98AA4FDD2F83755249EB7E3E7E438FF59C008ED7BD8 +B6825B78B8D441F223B66A797488C24C549DCC355D90964847B598FE681A1986 +F3AAB186EB4A7F340E75CBE6F4B2F0D072696BABBB4617C84E016ED6C33B3EBF +B1EDD2191641AC285CF5E49A8BBEB678547A30EE0DAFCED16F68B2FEFB93342C +1825FE06E871AC15ABCEB0E263C83EB19AFAB1BBF4F38CE080984C9AA22EB892 +4E2A7A8B42B08D51D6C55CBE511A7BCC34674F8947A1512B03BA9A7FCB517702 +81C5D37A5F4A3A9419B0409A75DF568C0FD33A0D7F3F4FBB41E0192876F32186 +B22FD853B181570C16A5B614428FC38F54B7E3779BEEE365360358B63955F774 +38145829FD05B48BE957FA98C435573B918E2883982CAAFF408D5DB3AE15BFCE +7038796F5F0F1E98314C578497C1151AA044212C90D00FE6FD43EE858D362BC2 +18E962635CBC13FC5CA1E3D4C5125C97B37A1F5322C2E4463F7EB92713544EB1 +0D06FE4D23BDE0820440F126F67D4E305C5793D7B3B0C04C1612702FBBC3EDEE +B82F047462AB0E38CB7933FB7A2B939F43976832C7FB90507AD55C5DB6711BB6 +01622290982CD086D6A42FD506A460E7C1DB7CFE3BC9E4307AAD5EC874F5A517 +DE217DC82BE40CFCFDDC44787F71D921C7FDA4679DEC9DACBF17A3142ABF5DCD +F9E640BCFC011B9CB38E0093AA5432E3D468FAF915DDFE924076DA6FE19A81D1 +158F7E756C483015DDEF6F2AF2FE5BC82EFFCA4B4E6CAF441154B6AEC5AF4B5D +C61B919957D886979D0CB320F23AE98258C4FD861FA69BA8FD39E4E8C6171CB9 +D4D1095C65BD5B653B91C5A15DCD3096BD715216456114260530E483ECA9A8CA +F587FA9AD60FF1DDBBAE43BB0BAC1C39367DA374182C74F2937B1C6FD1B7BEDE +95DF3A267C40C160F845E3E98421E2EBCFFB030A26BD0D5750B05FAA8C5A72CA +448A3213463DD4316768C4DE0AFA9B47DC2D9D10C52B9FC14AA5ACA08B83AA8F +09EAD993ECAAA2D31B66B165A0EA8A204B03EEFE675FA0085EDA5FBBEAEF8690 +54643C7B2A345DA3E366AE0B7A7969471AE1384E868238A95158631F86133C63 +B4A70244B216403AEE0600F77D3142CE0BBED4FA9A4BF6D956A86F180606B9C9 +025F7B30E29634708280E7BC03A0FA51BB17BE5CB94D257F1DB542F13E0970CE +42DFFB1307E6F5F7EBCD9292D03850748AB0D22D7F5314E3654D5EFCADBF68FC +751559760FDEF4F078E57F2CCBC3F99F64681648B38E9F26E5B0BF98BD0E7DD5 +6CB55D07A202A2C9A2817E4240E4B00DC0E60C26D4338C7E7C2907FF1CD34127 +5E048B5F55AD11F69843856459750DEA7D7EF76DB9A50F487F6BA4788F3680AF +29621BDA707B3C138F9ABE2F5B7E5D7C3119A5F535FE575E82F65E97AE078020 +36FD51A751CDDB98147074CD6481A96145FCF656DE28FC3A00573FBE06FC429F +E06F918AB3AA095DD3B9DBCDBEBDE69DB459600C46B50D49A563DDCE26A1A5AC +504E07BBC2A48D858B51F51B7A06D56695F8BAFC0518AD8B21E7DCF5C2047EB9 +FC8995D139FB37794ABD9A7387DAC9FD9F2F3E80578928E3F1AB70A50F16591A +034E29CD0C6AC1BD531CFF53478828A1F9A0BE3DFFEEEFAA0C7EF53750427ACE +2BC4A5591FCFF121A9A62CA0EB1069ADB7E51CFFDC8902361575E0E71700DC8C +86B43E1D697A8847C210C5FBB66E2B4E306AF90E0CB97D7FA008F76B1E6B489A +4CABB68EDBB9AFF604E3B355730436FC1A25F72C1FC4DCF6B1C40EA52D3AD46C +BB47EE3098E12CB98015F18B45AF2DF2712CD1187661F4EA24106FA51DD90262 +4FE3EB0D95B3EA446502A33091F2004D1C8F001DBAA7AE9FCAC74B0704D04902 +F832B25C7FBB9304D834A18F22259B81A0C400FE9CC0D811E58F8C3E1D107129 +D1CA233FD481FC6C03BAE7D00AAB2AAED4CEC3A7C8ECB087DF77065D1328A4EB +912CA8AFE5C7DEF3C5A3F42E40E6E60FB241F3FB6A11B5ACF4E6005471881DE6 +156BAE8ED4C75CE8FAC9C3A9B3DA52B07F09C28FF67BAF5767EAF202B3D5FDB8 +1EFAA98B59BF281BCFD45CDEC7707ED4167491F716322CB08248A65BED4FF628 +44AE351D9657BD03E41625E2D855D06444D441CF01330EF8FEEA0D42E0A054B9 +A05A5ADB518607299CECE64A59D52B2902DAB10F37A9F6DA24D95619860A69DE +D9915F414A8B63F8931099AC051C8671F6891F2563FBF902D30734C23E647D7B +A3FBAF4CEFA1F860B1EA1F2633E0E77665767CCB3332C311B8798E35557D3751 +919B770BD244FAC769980699F76C8E1B2D5BC85CC1DFE11017F0FD3878C60F4D +5A33D97AFB822CE4CF8BB50E0B89D73560D05A9053053011E49084204D551707 +2D4356FE5ACE352BDF99638AA07603979AF946D33A96266D7646B724994305AA +C231BCBF8B6D80A47464C242960127160C70E49121A04E986B4845402326C24A +1D5394D26028FE87EB6A6374CB0D0242212E6F7D939487220BD6347FBDB68F34 +415C7438F92D016F3B1EA7429A18B31FA26FCD33B7E60255522272740E31E5A7 +EBFD72F9FE0B6D85C50D9B868E1052FB2197A68EF52B4E59D8439286C96E832F +E01E2DA3EBF151FBABE3D39581D564BF8554C9FA2F3303BD5D0EEE6B2A739838 +37E67D38EBCDBDA0E5A784F4A7C165CB6ABBC00286AE34433766C3FFC6574B3B +BE4B8D36DE246BAB3FA365A33697AB07DEFA881A347470C89951B92D2D820487 +8A6935CFD404E696C61B0BE3D16FB91D5316DED8A003FE55AAD565FBBA8D5928 +D973BA86AF7B9F1BE4C5F157053504D6695DEEE925FA8041E3F76CA7A3C37B3A +B95C181C32E1466EC738C817369C6DB8364920C6F3FBA3BEE10E87B1AF334043 +200A789BD86697F54B344F11D528620B602AD2840C4755B32C4869DDB2DFBBC1 +F6863C0A4FB43835FA8620A2387E58E9CC430FC75162992E6FFB30A72B7686BA +3392399A5F79492531EA995BC1BAD1344E5D1AA70C11E6 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 @@ -6070,9 +6070,9 @@ TeXDict begin 40258431 52099146 1000 600 600 (libtasn1.dvi) 12[{}45 74.7198 /CMR9 rf /Fc 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 2[39 3[39 97[{}13 74.7198 /CMSLTT10 rf /Fd 134[39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 -39 39 39 39 39 39 39 39 39 39 39 39 8[39 39 39 39 2[39 +1[39 39 39 39 39 39 39 39 39 39 39 8[39 39 39 39 2[39 1[39 1[39 2[39 1[39 39 39 39 39 39 39 5[39 7[39 39 39 -1[39 39 39 39 2[39 39 39 39[{}52 74.7198 /CMTT9 rf /Fe +1[39 39 39 39 2[39 39 39 39[{}51 74.7198 /CMTT9 rf /Fe 133[40 4[51 35 36 39 3[51 76 25 2[25 1[45 1[42 51 40 1[44 7[69 3[70 63 51 69 2[68 71 86 55 2[36 71 71 1[60 70 66 65 69 6[25 58[{}32 90.9091 /CMB10 rf /Ff 133[52 @@ -6102,13 +6102,13 @@ rf /Fm 197[33 58[{}1 119.552 /CMMI12 rf /Fn 134[85 85 45[{}18 119.552 /CMTT12 rf /Fq 134[71 71 97 71 75 52 53 55 1[75 67 75 112 37 71 1[37 75 67 41 61 75 60 75 65 11[103 94 75 100 1[92 1[105 128 81 1[69 50 105 106 -85 88 103 97 1[102 6[37 1[67 2[67 67 67 67 67 2[37 4[52 -52 27[75 12[{}51 119.552 /CMBX12 rf /Fr 131[91 1[40 48 -48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 -28 40 51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 66 -51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64 -68 1[43 1[71 1[25 25 45 45 45 45 45 45 45 45 45 45 45 -25 30 25 1[45 35 35 25 2[45 1[45 25 19[51 51 53 11[{}85 +85 88 103 97 1[102 6[37 2[67 1[67 67 67 67 67 67 1[37 +4[52 52 27[75 12[{}52 119.552 /CMBX12 rf /Fr 131[91 1[40 +48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 +45 28 40 51 40 51 45 25 2[25 45 25 56 68 68 93 68 68 +66 51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 +64 68 1[43 1[71 1[25 25 45 45 45 45 45 45 45 45 45 45 +45 25 30 25 1[45 35 35 25 2[45 1[45 25 19[51 51 53 11[{}85 90.9091 /CMR10 rf /Fs 139[75 76 4[108 4[54 6[108 94 20[116 26[97 49[{}8 172.154 /CMBX12 rf end %%EndProlog @@ -6127,13 +6127,13 @@ ifelse TeXDict begin 1 0 bop 150 1318 a Fs(Libtasn1)p 150 1385 3600 34 v 1035 1486 a Fr(Abstract)31 b(Syn)m(tax)f(Notation)j(One)d (\(ASN.1\))h(library)f(for)g(the)h(GNU)g(system)2638 -1594 y(for)f(v)m(ersion)h(4.8,)g(4)g(April)f(2016)150 +1594 y(for)f(v)m(ersion)h(4.9,)g(4)g(April)f(2016)150 4795 y Fq(F)-11 b(abio)45 b(Fiorina)150 4928 y(Simon)g(Josefsson)150 5061 y(Nik)l(os)h(Ma)l(vrogiannop)t(oulos)g(\()p Fp(help-libtasn1@)o (gn)o(u.o)o(rg)o Fq(\))p 150 5141 3600 17 v eop end %%Page: 2 2 TeXDict begin 2 1 bop 150 4523 a Fr(This)24 b(man)m(ual)i(is)f(for)g -(GNU)h(Libtasn1)f(\(v)m(ersion)h(4.8,)i(4)d(April)g(2016\),)k(whic)m(h) +(GNU)h(Libtasn1)f(\(v)m(ersion)h(4.9,)i(4)d(April)g(2016\),)k(whic)m(h) c(is)g(a)h(library)e(for)h(Abstract)150 4633 y(Syn)m(tax)31 b(Notation)h(One)e(\(ASN.1\))h(and)f(Distinguished)h(Enco)s(ding)e (Rules)i(\(DER\))g(manipulation.)150 4767 y(Cop)m(yrigh)m(t)602 @@ -6195,35 +6195,35 @@ h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)47 b Fr(6)150 2327 y Fq(4)135 b(F)-11 b(unction)44 b(reference)21 b Fm(:)g(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)66 -b Fq(8)275 2464 y Fr(4.1)92 b(ASN.1)30 b(sc)m(hema)i(functions)13 +b Fq(7)275 2464 y Fr(4.1)92 b(ASN.1)30 b(sc)m(hema)i(functions)13 b Fl(:)i(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)44 b Fr(8)275 2574 y(4.2)92 b(ASN.1)30 +(:)h(:)f(:)h(:)f(:)g(:)44 b Fr(7)275 2574 y(4.2)92 b(ASN.1)30 b(\014eld)g(functions)12 b Fl(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)43 -b Fr(8)275 2683 y(4.3)92 b(DER)30 b(functions)17 b Fl(:)e(:)g(:)h(:)f +b Fr(7)275 2683 y(4.3)92 b(DER)30 b(functions)17 b Fl(:)e(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g -(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fr(15)275 2793 +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)46 b Fr(14)275 2793 y(4.4)92 b(Error)29 b(handling)h(functions)23 b Fl(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) -f(:)g(:)54 b Fr(22)275 2902 y(4.5)92 b(Auxilliary)31 +f(:)g(:)54 b Fr(20)275 2902 y(4.5)92 b(Auxilliary)31 b(functions)19 b Fl(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)48 -b Fr(22)150 3145 y Fq(App)t(endix)c(A)160 b(Cop)l(ying)45 +b Fr(21)150 3145 y Fq(App)t(endix)c(A)160 b(Cop)l(ying)45 b(Information)25 b Fm(:)c(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f -(:)70 b Fq(24)275 3282 y Fr(A.1)91 b(GNU)31 b(F)-8 b(ree)32 +(:)70 b Fq(22)275 3282 y Fr(A.1)91 b(GNU)31 b(F)-8 b(ree)32 b(Do)s(cumen)m(tation)g(License)21 b Fl(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) -f(:)h(:)f(:)51 b Fr(24)150 3524 y Fq(Concept)45 b(Index)18 +f(:)h(:)f(:)51 b Fr(22)150 3524 y Fq(Concept)45 b(Index)18 b Fm(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f -(:)h(:)f(:)63 b Fq(32)150 3794 y(F)-11 b(unction)44 b(and)h(Data)h +(:)h(:)f(:)63 b Fq(30)150 3794 y(F)-11 b(unction)44 b(and)h(Data)h (Index)24 b Fm(:)19 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f -(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)69 b Fq(33)p +(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)69 b Fq(31)p eop end %%Page: 1 4 TeXDict begin 1 3 bop 150 -116 a Fr(Chapter)30 b(1:)41 @@ -6345,9 +6345,9 @@ b(simple)f(t)m(yp)s(es)h(lik)m(e)g Fk(OCTET)d(STRING)h Fr(the)h(simple)g(parsing)g(functions)g(listed)h(b)s(elo)m(w)f(ma)m(y)h (b)s(e)f(used)150 568 y(instead.)225 702 y Fo(\017)60 b Fr([asn1)p 538 702 28 4 v 41 w(deco)s(de)p 849 702 -V 40 w(simple)p 1142 702 V 40 w(der],)30 b(page)h(21)225 +V 40 w(simple)p 1142 702 V 40 w(der],)30 b(page)h(20)225 837 y Fo(\017)60 b Fr([asn1)p 538 837 V 41 w(enco)s(de)p -849 837 V 40 w(simple)p 1142 837 V 40 w(der],)30 b(page)h(16)150 +849 837 V 40 w(simple)p 1142 837 V 40 w(der],)30 b(page)h(15)150 1069 y Fq(2.4)68 b(Library)45 b(Notes)150 1229 y Fr(The)30 b(header)g(\014le)h(of)f(this)g(library)g(is)h Fk(libtasn1.h)p Fr(.)275 1363 y(The)d(main)g(t)m(yp)s(e)h(used)f(in)h(it)g(is)g @@ -7204,69 +7204,73 @@ b(a)g(length)f(\014eld)g(from)g(BER)g(data.)41 b(The)30 b(di\013erence)h(to)g Fk(asn1_get_length_der\(\))24 b Fr(is)390 408 y(that)31 b(this)f(function)g(will)h(return)e(a)i(length) g(ev)m(en)g(if)f(the)h(v)-5 b(alue)31 b(has)f(inde\014nite)g(enco)s -(ding.)390 543 y Fe(Returns:)40 b Fr(Return)27 b(the)i(deco)s(ded)g +(ding.)390 537 y Fe(Returns:)40 b Fr(Return)27 b(the)i(deco)s(ded)g (length)g(v)-5 b(alue,)30 b(or)e(negativ)m(e)j(v)-5 b(alue)29 -b(when)f(the)h(v)-5 b(alue)29 b(w)m(as)g(to)s(o)390 653 -y(big.)390 787 y Fe(Since:)41 b Fr(2.0)150 986 y Fj(asn1)p -396 986 37 5 v 55 w(get)p 616 986 V 54 w(o)s(ctet)p 941 -986 V 53 w(der)3350 1183 y Fr([F)-8 b(unction])-3599 +b(when)f(the)h(v)-5 b(alue)29 b(w)m(as)g(to)s(o)390 646 +y(big.)390 774 y Fe(Since:)41 b Fr(2.0)150 960 y Fj(asn1)p +396 960 37 5 v 55 w(get)p 616 960 V 54 w(o)s(ctet)p 941 +960 V 53 w(der)3350 1144 y Fr([F)-8 b(unction])-3599 b Fi(int)53 b(asn1_get_octet_der)e Fh(\()p Fg(const)31 b(unsigned)f(c)m(har)g(*)h Ff(der)p Fg(,)h(in)m(t)f Ff(der_len)p -Fg(,)h(in)m(t)565 1293 y(*)f Ff(ret_len)p Fg(,)i(unsigned)c(c)m(har)i +Fg(,)h(in)m(t)565 1254 y(*)f Ff(ret_len)p Fg(,)i(unsigned)c(c)m(har)i (*)f Ff(str)p Fg(,)i(in)m(t)f Ff(str_size)p Fg(,)i(in)m(t)e(*)f -Ff(str_len)p Fh(\))390 1402 y Fg(der)7 b Fr(:)40 b(DER)30 +Ff(str_len)p Fh(\))390 1364 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g(con)m(taining)h(the)e(OCTET)f(SEQUENCE.)390 -1537 y Fg(der)p 523 1537 28 4 v 40 w(len)p Fr(:)40 b(Length)31 -b(of)f(DER)h(data)g(to)g(deco)s(de.)390 1671 y Fg(ret)p -507 1671 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32 -b(con)m(taining)f(the)g(length)g(of)f(the)h(DER)f(data.)390 -1806 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f -(to)i(put)f(deco)s(ded)g(OCTET)f(SEQUENCE)g(in.)390 1940 -y Fg(str)p 503 1940 V 40 w(size)5 b Fr(:)41 b(Length)31 -b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 2075 -y Fg(str)p 503 2075 V 40 w(len)p Fr(:)41 b(Output)29 -b(v)-5 b(ariable)31 b(con)m(taining)h(the)f(length)f(of)h(the)f(OCTET)f -(SEQUENCE.)390 2209 y(Extract)i(an)g(OCTET)d(SEQUENCE)i(from)f(DER)i -(data.)390 2344 y Fe(Returns:)40 b Fr(Returns)30 b Fk(ASN1_SUCCESS)d -Fr(on)j(success,)h(or)f(an)h(error.)150 2543 y Fj(asn1)p -396 2543 37 5 v 55 w(get)p 616 2543 V 54 w(ob)7 b(ject)p -1002 2543 V 54 w(id)p 1158 2543 V 54 w(der)3350 2740 -y Fr([F)-8 b(unction])-3599 b Fi(int)53 b(asn1_get_object_id_de)q(r)e +1492 y Fg(der)p 523 1492 28 4 v 40 w(len)p Fr(:)40 b(The)30 +b(length)h(of)g(the)f Fk(der)g Fr(data)h(to)g(deco)s(de.)390 +1620 y Fg(ret)p 507 1620 V 40 w(len)p Fr(:)41 b(Output)29 +b(v)-5 b(ariable)32 b(con)m(taining)f(the)g(enco)s(ded)f(length)h(of)f +(the)h(DER)f(data.)390 1748 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 +b(output)d(bu\013er)f(to)i(put)f(deco)s(ded)g(OCTET)f(SEQUENCE)g(in.) +390 1876 y Fg(str)p 503 1876 V 40 w(size)5 b Fr(:)41 +b(Length)31 b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 +2004 y Fg(str)p 503 2004 V 40 w(len)p Fr(:)57 b(Output)38 +b(v)-5 b(ariable)40 b(con)m(taining)g(the)f(length)g(of)g(the)g(con)m +(ten)m(ts)h(of)f(the)g(OCTET)e(SE-)390 2113 y(QUENCE.)390 +2241 y(Extract)g(an)f(OCTET)e(SEQUENCE)h(from)h(DER)g(data.)58 +b(Note)37 b(that)g(this)f(function)g(exp)s(ects)390 2351 +y(the)31 b(DER)f(data)h(past)g(the)f(tag)i(\014eld,)e(i.e.,)i(the)e +(length)h(and)f(con)m(ten)m(t)i(o)s(ctets.)390 2479 y +Fe(Returns:)40 b Fr(Returns)30 b Fk(ASN1_SUCCESS)d Fr(on)j(success,)h +(or)f(an)h(error.)150 2665 y Fj(asn1)p 396 2665 37 5 +v 55 w(get)p 616 2665 V 54 w(ob)7 b(ject)p 1002 2665 +V 54 w(id)p 1158 2665 V 54 w(der)3350 2849 y Fr([F)-8 +b(unction])-3599 b Fi(int)53 b(asn1_get_object_id_de)q(r)e Fh(\()p Fg(const)32 b(unsigned)d(c)m(har)i(*)f Ff(der)p -Fg(,)i(in)m(t)565 2849 y Ff(der_len)p Fg(,)h(in)m(t)e(*)f +Fg(,)i(in)m(t)565 2959 y Ff(der_len)p Fg(,)h(in)m(t)e(*)f Ff(ret_len)p Fg(,)j(c)m(har)e(*)g Ff(str)p Fg(,)g(in)m(t)g -Ff(str_size)p Fh(\))390 2959 y Fg(der)7 b Fr(:)40 b(DER)30 +Ff(str_size)p Fh(\))390 3068 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g(con)m(taining)h(the)e(OBJECT)g(IDENTIFIER)390 -3093 y Fg(der)p 523 3093 28 4 v 40 w(len)p Fr(:)40 b(Length)31 -b(of)f(DER)h(data)g(to)g(deco)s(de.)390 3228 y Fg(ret)p -507 3228 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32 +3196 y Fg(der)p 523 3196 28 4 v 40 w(len)p Fr(:)40 b(Length)31 +b(of)f(DER)h(data)g(to)g(deco)s(de.)390 3324 y Fg(ret)p +507 3324 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32 b(con)m(taining)f(the)g(length)g(of)f(the)h(DER)f(data.)390 -3362 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f +3452 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f (to)i(put)f(the)g(textual)i(ob)5 b(ject)31 b(id)f(in.)390 -3497 y Fg(str)p 503 3497 V 40 w(size)5 b Fr(:)41 b(Length)31 -b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 3631 +3581 y Fg(str)p 503 3581 V 40 w(size)5 b Fr(:)41 b(Length)31 +b(of)f(pre-allo)s(cated)j(output)d(bu\013er.)390 3709 y(Con)m(v)m(erts)h(a)g(DER)f(enco)s(ded)g(ob)5 b(ject)32 -b(iden)m(ti\014er)e(to)h(its)g(textual)h(form.)390 3766 +b(iden)m(ti\014er)e(to)h(its)g(textual)h(form.)390 3837 y Fe(Returns:)40 b Fk(ASN1_SUCCESS)27 b Fr(on)k(success,)g(or)f(an)g -(error.)150 3965 y Fj(asn1)p 396 3965 37 5 v 55 w(get)p -616 3965 V 54 w(bit)p 820 3965 V 54 w(der)3350 4162 y +(error.)150 4023 y Fj(asn1)p 396 4023 37 5 v 55 w(get)p +616 4023 V 54 w(bit)p 820 4023 V 54 w(der)3350 4207 y Fr([F)-8 b(unction])-3599 b Fi(int)53 b(asn1_get_bit_der)e Fh(\()p Fg(const)31 b(unsigned)e(c)m(har)i(*)g Ff(der)p -Fg(,)g(in)m(t)g Ff(der_len)p Fg(,)i(in)m(t)d(*)565 4271 +Fg(,)g(in)m(t)g Ff(der_len)p Fg(,)i(in)m(t)d(*)565 4316 y Ff(ret_len)p Fg(,)j(unsigned)c(c)m(har)i(*)g Ff(str)p Fg(,)g(in)m(t)g Ff(str_size)p Fg(,)i(in)m(t)e(*)g Ff(bit_len)p -Fh(\))390 4381 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g -(con)m(taining)h(the)e(BIT)h(SEQUENCE.)390 4515 y Fg(der)p -523 4515 28 4 v 40 w(len)p Fr(:)40 b(Length)31 b(of)f(DER)h(data)g(to)g -(deco)s(de.)390 4650 y Fg(ret)p 507 4650 V 40 w(len)p +Fh(\))390 4426 y Fg(der)7 b Fr(:)40 b(DER)30 b(data)h(to)g(deco)s(de)g +(con)m(taining)h(the)e(BIT)h(SEQUENCE.)390 4554 y Fg(der)p +523 4554 28 4 v 40 w(len)p Fr(:)40 b(Length)31 b(of)f(DER)h(data)g(to)g +(deco)s(de.)390 4682 y Fg(ret)p 507 4682 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)32 b(con)m(taining)f(the)g(length) -g(of)f(the)h(DER)f(data.)390 4784 y Fg(str)7 b Fr(:)40 +g(of)f(the)h(DER)f(data.)390 4810 y Fg(str)7 b Fr(:)40 b(Pre-allo)s(cated)33 b(output)d(bu\013er)f(to)i(put)f(deco)s(ded)g -(BIT)g(SEQUENCE)f(in.)390 4919 y Fg(str)p 503 4919 V +(BIT)g(SEQUENCE)f(in.)390 4938 y Fg(str)p 503 4938 V 40 w(size)5 b Fr(:)41 b(Length)31 b(of)f(pre-allo)s(cated)j(output)d -(bu\013er.)390 5053 y Fg(bit)p 507 5053 V 40 w(len)p +(bu\013er.)390 5066 y Fg(bit)p 507 5066 V 40 w(len)p Fr(:)41 b(Output)29 b(v)-5 b(ariable)31 b(con)m(taining)h(the)f(size)g -(of)g(the)f(BIT)g(SEQUENCE.)390 5188 y(Extract)h(a)g(BIT)f(SEQUENCE)f +(of)g(the)f(BIT)g(SEQUENCE.)390 5194 y(Extract)h(a)g(BIT)f(SEQUENCE)f (from)h(DER)h(data.)390 5322 y Fe(Returns:)40 b Fk(ASN1_SUCCESS)27 b Fr(on)k(success,)g(or)f(an)g(error.)p eop end %%Page: 19 22 @@ -8208,34 +8212,34 @@ b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m %%Page: 32 35 TeXDict begin 32 34 bop 150 -116 a Fr(Concept)31 b(Index)2927 b(32)150 299 y Fn(Concept)52 b(Index)150 638 y Fq(A)150 -758 y Fb(asn1Co)r(ding)27 b(program)10 b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)37 b Fb(5)150 846 y(asn1Deco)r(ding)27 b(program)8 -b Fa(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(6)150 -935 y(asn1P)n(arser)27 b(program)7 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g -(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)g(:)h(:)33 b Fb(5)150 1024 y(ASN.1)25 b(sc)n(hema)14 -b Fa(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 -b Fb(2)150 1266 y Fq(F)150 1385 y Fb(FDL,)26 b(GNU)f(F)-6 +757 y Fb(ASN.1)25 b(sc)n(hema)14 b Fa(:)g(:)f(:)g(:)g(:)g(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) +g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)41 b Fb(2)150 846 y(asn1Co)r(ding)27 +b(program)10 b Fa(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 +b Fb(5)150 935 y(asn1Deco)r(ding)27 b(program)8 b Fa(:)14 +b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fb(6)150 1023 y(asn1P)n(arser)27 +b(program)7 b Fa(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 +b Fb(5)150 1281 y Fq(F)150 1400 y Fb(FDL,)26 b(GNU)f(F)-6 b(ree)25 b(Do)r(cumen)n(tation)h(License)20 b Fa(:)13 -b(:)g(:)g(:)g(:)h(:)f(:)45 b Fb(24)150 1474 y(F)-6 b(uture)25 +b(:)g(:)g(:)g(:)h(:)f(:)45 b Fb(22)150 1489 y(F)-6 b(uture)25 b(dev)n(elopmen)n(ts)9 b Fa(:)k(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)36 -b Fb(4)150 1733 y Fq(H)150 1852 y Fb(Header)26 b(\014le)f(libtasn1.h)18 +b Fb(4)150 1746 y Fq(H)150 1866 y Fb(Header)26 b(\014le)f(libtasn1.h)18 b Fa(:)d(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)45 b Fb(4)2025 -638 y Fq(M)2025 759 y Fb(Main)26 b(t)n(yp)r(e)f(asn1)p -2550 759 24 4 v 34 w(no)r(de)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g +638 y Fq(M)2025 760 y Fb(Main)26 b(t)n(yp)r(e)f(asn1)p +2550 760 24 4 v 34 w(no)r(de)19 b Fa(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) -g(:)46 b Fb(4)2025 1021 y Fq(P)2025 1141 y Fb(P)n(orting)12 +g(:)46 b Fb(4)2025 1023 y Fq(P)2025 1145 y Fb(P)n(orting)12 b Fa(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(1)2025 1403 y Fq(S)2025 -1524 y Fb(Supp)r(orted)24 b(ASN.1)h(t)n(yp)r(es,)h(list)g(of)14 +(:)f(:)g(:)g(:)g(:)g(:)g(:)39 b Fb(1)2025 1408 y Fq(S)2025 +1530 y Fb(Supp)r(orted)24 b(ASN.1)h(t)n(yp)r(es,)h(list)g(of)14 b Fa(:)g(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)41 b Fb(2)2025 1785 y Fq(T)2025 1906 y Fb(threads)13 +g(:)41 b Fb(2)2025 1793 y Fq(T)2025 1915 y Fb(threads)13 b Fa(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(1)p eop end @@ -8245,100 +8249,96 @@ b(and)f(Data)i(Index)2503 b(33)150 299 y Fn(F)-13 b(unction)52 b(and)h(Data)i(Index)150 610 y Fd(asn1_array2tree)13 b Fa(:)k(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 -b Fb(9)150 697 y Fd(asn1_bit_der)22 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h +b Fb(8)150 697 y Fd(asn1_bit_der)22 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(16)150 785 y +g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)45 b Fb(15)150 785 y Fd(asn1_check_version)25 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 -b Fb(22)150 872 y Fd(asn1_copy_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g +b Fb(21)150 872 y Fd(asn1_copy_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(11)150 959 y Fd(asn1_create_element)18 -b Fa(:)g(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)44 b Fb(10)150 1046 -y Fd(asn1_decode_simple_ber)10 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 -b Fb(21)150 1133 y Fd(asn1_decode_simple_der)10 b Fa(:)19 -b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)37 b Fb(21)150 1220 y Fd(asn1_delete_element)25 +g(:)g(:)h(:)f(:)g(:)g(:)40 b Fb(10)150 959 y Fd(asn1_create_element)25 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(9)150 -1308 y Fd(asn1_delete_structure)15 b Fa(:)j(:)13 b(:)g(:)g(:)h(:)f(:)g +1046 y Fd(asn1_decode_simple_der)10 b Fa(:)19 b(:)13 +b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g +(:)g(:)g(:)37 b Fb(20)150 1133 y Fd(asn1_delete_element)25 +b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f +(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(8)150 +1220 y Fd(asn1_delete_structure)15 b Fa(:)j(:)13 b(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 -b Fb(9)150 1395 y Fd(asn1_delete_structure2)13 b Fa(:)18 +b Fb(8)150 1308 y Fd(asn1_delete_structure2)13 b Fa(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) -g(:)g(:)g(:)g(:)g(:)40 b Fb(9)150 1482 y Fd(asn1_der_coding)11 +g(:)g(:)g(:)g(:)g(:)40 b Fb(8)150 1395 y Fd(asn1_der_coding)11 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 -b Fb(16)150 1569 y Fd(asn1_der_decoding)6 b Fa(:)17 b(:)c(:)g(:)h(:)f +b Fb(15)150 1482 y Fd(asn1_der_decoding)6 b Fa(:)17 b(:)c(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)g(:)h(:)32 b Fb(19)150 1656 y Fd(asn1_der_decoding_element) +g(:)g(:)g(:)g(:)h(:)32 b Fb(18)150 1569 y Fd(asn1_der_decoding_element) 26 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)46 b Fb(19)150 1743 y Fd(asn1_der_decoding_startEnd)18 +(:)f(:)g(:)46 b Fb(18)150 1656 y Fd(asn1_der_decoding_startEnd)18 b Fa(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -44 b Fb(20)150 1831 y Fd(asn1_der_decoding2)25 b Fa(:)13 +44 b Fb(19)150 1743 y Fd(asn1_der_decoding2)25 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(19)150 1918 y +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)47 b Fb(17)150 1831 y Fd(asn1_dup_node)16 b Fa(:)g(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)43 b Fb(11)150 2005 y Fd(asn1_encode_simple_der)10 +(:)g(:)g(:)43 b Fb(10)150 1918 y Fd(asn1_encode_simple_der)10 b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(16)150 2092 y Fd +(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fb(15)150 2005 y Fd (asn1_expand_any_defined_by)18 b Fa(:)g(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(20)150 2179 y +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)44 b Fb(19)150 2092 y Fd(asn1_expand_octet_string)28 b Fa(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g -(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(21)150 -2267 y Fd(asn1_find_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)49 b Fb(19)150 +2179 y Fd(asn1_find_node)14 b Fa(:)i(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)40 b Fb(22)2025 610 y Fd(asn1_find_structure_from_oid)13 -b Fa(:)19 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)39 -b Fb(10)2025 697 y Fd(asn1_get_bit_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:) -g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(18)2025 785 y Fd(asn1_get_length_ber)18 -b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 b Fb(17)2025 872 y -Fd(asn1_get_length_der)18 b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 -b Fb(17)2025 959 y Fd(asn1_get_object_id_der)10 b Fa(:)18 -b(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)37 b Fb(18)2025 1046 y Fd(asn1_get_octet_der)25 +(:)f(:)g(:)g(:)40 b Fb(21)2025 610 y Fd(asn1_find_structure_from_oid)15 +b Fa(:)k(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) +42 b Fb(9)2025 697 y Fd(asn1_get_bit_der)9 b Fa(:)16 +b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g +(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fb(17)2025 +785 y Fd(asn1_get_length_ber)18 b Fa(:)f(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)45 +b Fb(16)2025 872 y Fd(asn1_get_length_der)18 b Fa(:)f(:)c(:)h(:)f(:)g +(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) +g(:)g(:)45 b Fb(16)2025 959 y Fd(asn1_get_octet_der)25 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(18)2025 -1133 y Fd(asn1_get_tag_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) +(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)47 b Fb(17)2025 +1046 y Fd(asn1_get_tag_der)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h -(:)f(:)g(:)35 b Fb(17)2025 1220 y Fd(asn1_length_der)11 +(:)f(:)g(:)35 b Fb(16)2025 1133 y Fd(asn1_length_der)11 b Fa(:)17 b(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 -b Fb(15)2025 1308 y Fd(asn1_number_of_elements)8 b Fa(:)18 -b(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -g(:)g(:)h(:)34 b Fb(10)2025 1395 y Fd(asn1_octet_der)14 +b Fb(14)2025 1220 y Fd(asn1_number_of_elements)10 b Fa(:)18 +b(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) +g(:)h(:)f(:)g(:)37 b Fb(9)2025 1308 y Fd(asn1_octet_der)14 b Fa(:)i(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)40 -b Fb(15)2025 1482 y Fd(asn1_parser2array)8 b Fa(:)17 +b Fb(14)2025 1395 y Fd(asn1_parser2array)8 b Fa(:)17 b(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(8)2025 -1569 y Fd(asn1_parser2tree)11 b Fa(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g +(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fb(7)2025 +1482 y Fd(asn1_parser2tree)11 b Fa(:)16 b(:)d(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) -f(:)g(:)g(:)g(:)38 b Fb(8)2025 1656 y Fd(asn1_perror)24 +f(:)g(:)g(:)g(:)38 b Fb(7)2025 1569 y Fd(asn1_perror)24 b Fa(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) -48 b Fb(22)2025 1743 y Fd(asn1_print_structure)16 b Fa(:)h(:)c(:)g(:)g -(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)g(:)42 b Fb(10)2025 1831 y Fd(asn1_read_node_value)16 +48 b Fb(20)2025 1656 y Fd(asn1_print_structure)18 b Fa(:)f(:)c(:)g(:)h +(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) +g(:)g(:)g(:)45 b Fb(9)2025 1743 y Fd(asn1_read_node_value)16 b Fa(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) -g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(15)2025 1918 y Fd(asn1_read_tag)16 +g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 b Fb(14)2025 1831 y Fd(asn1_read_tag)16 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 -b Fb(15)2025 2005 y Fd(asn1_read_value)11 b Fa(:)17 b(:)c(:)g(:)g(:)g +b Fb(14)2025 1918 y Fd(asn1_read_value)11 b Fa(:)17 b(:)c(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) -g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(13)2025 2092 y Fd +g(:)h(:)f(:)g(:)g(:)g(:)g(:)38 b Fb(12)2025 2005 y Fd (asn1_read_value_type)16 b Fa(:)h(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)42 -b Fb(14)2025 2179 y Fd(asn1_strerror)16 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:) +b Fb(13)2025 2092 y Fd(asn1_strerror)16 b Fa(:)g(:)d(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g -(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(22)2025 2267 y +(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)43 b Fb(20)2025 2179 y Fd(asn1_write_value)9 b Fa(:)16 b(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) -g(:)35 b Fb(11)p eop end +g(:)35 b Fb(10)p eop end %%Trailer userdict /end-hook known{end-hook}if diff --git a/doc/man/asn1_get_octet_der.3 b/doc/man/asn1_get_octet_der.3 index e142e52..22fe3d8 100644 --- a/doc/man/asn1_get_octet_der.3 +++ b/doc/man/asn1_get_octet_der.3 @@ -10,17 +10,19 @@ asn1_get_octet_der \- API function .IP "const unsigned char * der" 12 DER data to decode containing the OCTET SEQUENCE. .IP "int der_len" 12 -Length of DER data to decode. +The length of the \fIder\fP data to decode. .IP "int * ret_len" 12 -Output variable containing the length of the DER data. +Output variable containing the encoded length of the DER data. .IP "unsigned char * str" 12 Pre\-allocated output buffer to put decoded OCTET SEQUENCE in. .IP "int str_size" 12 Length of pre\-allocated output buffer. .IP "int * str_len" 12 -Output variable containing the length of the OCTET SEQUENCE. +Output variable containing the length of the contents of the OCTET SEQUENCE. .SH "DESCRIPTION" -Extract an OCTET SEQUENCE from DER data. +Extract an OCTET SEQUENCE from DER data. Note that this function +expects the DER data past the tag field, i.e., the length and +content octets. .SH "RETURNS" Returns \fBASN1_SUCCESS\fP on success, or an error. .SH COPYRIGHT diff --git a/doc/stamp-vti b/doc/stamp-vti index b76228e..45609da 100644 --- a/doc/stamp-vti +++ b/doc/stamp-vti @@ -1,4 +1,4 @@ @set UPDATED 4 April 2016 @set UPDATED-MONTH April 2016 -@set EDITION 4.8 -@set VERSION 4.8 +@set EDITION 4.9 +@set VERSION 4.9 diff --git a/doc/texi/asn1_get_octet_der.texi b/doc/texi/asn1_get_octet_der.texi index 14a8422..5376533 100644 --- a/doc/texi/asn1_get_octet_der.texi +++ b/doc/texi/asn1_get_octet_der.texi @@ -3,17 +3,19 @@ @deftypefun {int} {asn1_get_octet_der} (const unsigned char * @var{der}, int @var{der_len}, int * @var{ret_len}, unsigned char * @var{str}, int @var{str_size}, int * @var{str_len}) @var{der}: DER data to decode containing the OCTET SEQUENCE. -@var{der_len}: Length of DER data to decode. +@var{der_len}: The length of the @code{der} data to decode. -@var{ret_len}: Output variable containing the length of the DER data. +@var{ret_len}: Output variable containing the encoded length of the DER data. @var{str}: Pre-allocated output buffer to put decoded OCTET SEQUENCE in. @var{str_size}: Length of pre-allocated output buffer. -@var{str_len}: Output variable containing the length of the OCTET SEQUENCE. +@var{str_len}: Output variable containing the length of the contents of the OCTET SEQUENCE. -Extract an OCTET SEQUENCE from DER data. +Extract an OCTET SEQUENCE from DER data. Note that this function +expects the DER data past the tag field, i.e., the length and +content octets. @strong{Returns:} Returns @code{ASN1_SUCCESS} on success, or an error. @end deftypefun diff --git a/doc/texi/decoding.c.texi b/doc/texi/decoding.c.texi index 7c04d30..b9a3003 100644 --- a/doc/texi/decoding.c.texi +++ b/doc/texi/decoding.c.texi @@ -56,17 +56,19 @@ the value was too big. @deftypefun {int} {asn1_get_octet_der} (const unsigned char * @var{der}, int @var{der_len}, int * @var{ret_len}, unsigned char * @var{str}, int @var{str_size}, int * @var{str_len}) @var{der}: DER data to decode containing the OCTET SEQUENCE. -@var{der_len}: Length of DER data to decode. +@var{der_len}: The length of the @code{der} data to decode. -@var{ret_len}: Output variable containing the length of the DER data. +@var{ret_len}: Output variable containing the encoded length of the DER data. @var{str}: Pre-allocated output buffer to put decoded OCTET SEQUENCE in. @var{str_size}: Length of pre-allocated output buffer. -@var{str_len}: Output variable containing the length of the OCTET SEQUENCE. +@var{str_len}: Output variable containing the length of the contents of the OCTET SEQUENCE. -Extract an OCTET SEQUENCE from DER data. +Extract an OCTET SEQUENCE from DER data. Note that this function +expects the DER data past the tag field, i.e., the length and +content octets. @strong{Returns:} Returns @code{ASN1_SUCCESS} on success, or an error. @end deftypefun diff --git a/doc/version.texi b/doc/version.texi index b76228e..45609da 100644 --- a/doc/version.texi +++ b/doc/version.texi @@ -1,4 +1,4 @@ @set UPDATED 4 April 2016 @set UPDATED-MONTH April 2016 -@set EDITION 4.8 -@set VERSION 4.8 +@set EDITION 4.9 +@set VERSION 4.9 diff --git a/lib/coding.c b/lib/coding.c index 0c0f69c..7141df7 100644 --- a/lib/coding.c +++ b/lib/coding.c @@ -337,7 +337,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len) int len_len, counter, k, first, max_len; char *temp, *n_end, *n_start; unsigned char bit7; - unsigned long val, val1 = 0; + uint64_t val, val1 = 0; int str_len = _asn1_strlen (str); max_len = *der_len; @@ -355,7 +355,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len) while ((n_end = strchr (n_start, '.'))) { *n_end = 0; - val = strtoul (n_start, NULL, 10); + val = _asn1_strtou64 (n_start, NULL, 10); counter++; if (counter == 1) @@ -369,7 +369,7 @@ _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len) else { first = 0; - for (k = 4; k >= 0; k--) + for (k = sizeof(val); k >= 0; k--) { bit7 = (val >> (k * 7)) & 0x7F; if (bit7 || first || !k) @@ -757,7 +757,7 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node) if (err != ASN1_SUCCESS) goto error; - t = class << 24; + t = ((unsigned int)class) << 24; p_vet->value = t | tag; counter += len2; diff --git a/lib/decoding.c b/lib/decoding.c index e5513a3..2cd9ac3 100644 --- a/lib/decoding.c +++ b/lib/decoding.c @@ -384,7 +384,8 @@ _asn1_get_time_der (unsigned type, const unsigned char *der, int der_len, int *r * @str: Pre-allocated output buffer to put the textual object id in. * @str_size: Length of pre-allocated output buffer. * - * Converts a DER encoded object identifier to its textual form. + * Converts a DER encoded object identifier to its textual form. This + * function expects the DER object identifier without the tag. * * Returns: %ASN1_SUCCESS on success, or an error. **/ @@ -395,7 +396,7 @@ asn1_get_object_id_der (const unsigned char *der, int der_len, int *ret_len, int len_len, len, k; int leading; char temp[LTOSTR_MAX_SIZE]; - unsigned long val, val1; + uint64_t val, val1; *ret_len = 0; if (str && str_size > 0) @@ -1361,7 +1362,15 @@ asn1_der_decoding2 (asn1_node *element, const void *ider, int *max_ider_len, { /* indefinite length method */ p->tmp_ival = -1; } + p2 = p->down; + if (p2 == NULL) + { + result = ASN1_DER_ERROR; + warn(); + goto cleanup; + } + while ((type_field (p2->type) == ASN1_ETYPE_TAG) || (type_field (p2->type) == ASN1_ETYPE_SIZE)) p2 = p2->right; @@ -1532,11 +1541,6 @@ asn1_der_decoding (asn1_node * element, const void *ider, int ider_len, return asn1_der_decoding2 (element, ider, &ider_len, 0, errorDescription); } -#define FOUND 1 -#define SAME_BRANCH 2 -#define OTHER_BRANCH 3 -#define EXIT 4 - /** * asn1_der_decoding_element: * @structure: pointer to an ASN1 structure diff --git a/lib/element.c b/lib/element.c index dceb8ba..b7a0905 100644 --- a/lib/element.c +++ b/lib/element.c @@ -152,7 +152,10 @@ _asn1_append_sequence_set (asn1_node node, struct node_tail_cache_st *pcache) while ((type_field (p->type) == ASN1_ETYPE_TAG) || (type_field (p->type) == ASN1_ETYPE_SIZE)) p = p->right; + p2 = _asn1_copy_structure3 (p); + if (p2 == NULL) + return ASN1_GENERIC_ERROR; if (pcache == NULL || pcache->tail == NULL || pcache->head != node) { @@ -118,6 +118,12 @@ extern const tag_and_class_st _asn1_tags[]; #define _asn1_strcpy(a,b) strcpy((char *)a, (const char *)b) #define _asn1_strcat(a,b) strcat((char *)a, (const char *)b) +#if SIZEOF_UNSIGNED_LONG_INT == 8 +# define _asn1_strtou64(n,e,b) strtoul((const char *) n, e, b) +#else +# define _asn1_strtou64(n,e,b) strtoull((const char *) n, e, b) +#endif + #define MAX_LOG_SIZE 1024 /* maximum number of characters of a log message */ /* Define used for visiting trees. */ diff --git a/lib/libtasn1.h b/lib/libtasn1.h index aa9e8a4..5c4340f 100644 --- a/lib/libtasn1.h +++ b/lib/libtasn1.h @@ -44,7 +44,7 @@ extern "C" { #endif -#define ASN1_VERSION "4.8" +#define ASN1_VERSION "4.9" #if defined(__GNUC__) && !defined(ASN1_INTERNAL_BUILD) # define _ASN1_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) diff --git a/lib/parser_aux.c b/lib/parser_aux.c index 52700c6..2285b20 100644 --- a/lib/parser_aux.c +++ b/lib/parser_aux.c @@ -549,9 +549,9 @@ _asn1_delete_list_and_nodes (void) char * -_asn1_ltostr (long v, char str[LTOSTR_MAX_SIZE]) +_asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE]) { - long d, r; + int64_t d, r; char temp[LTOSTR_MAX_SIZE]; int count, k, start; diff --git a/lib/parser_aux.h b/lib/parser_aux.h index 10b864b..9f91833 100644 --- a/lib/parser_aux.h +++ b/lib/parser_aux.h @@ -54,7 +54,7 @@ void _asn1_delete_list_and_nodes (void); /* Max 64-bit integer length is 20 chars + 1 for sign + 1 for null termination */ #define LTOSTR_MAX_SIZE 22 -char *_asn1_ltostr (long v, char str[LTOSTR_MAX_SIZE]); +char *_asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE]); asn1_node _asn1_find_up (asn1_node node); diff --git a/src/asn1Decoding.c b/src/asn1Decoding.c index b52e791..078963e 100644 --- a/src/asn1Decoding.c +++ b/src/asn1Decoding.c @@ -142,14 +142,18 @@ main (int argc, char *argv[]) usage (EXIT_FAILURE); } - inputFileAsnName = (char *) malloc (strlen (argv[optind]) + 1); - strcpy (inputFileAsnName, argv[optind]); + inputFileAsnName = strdup(argv[optind]); + inputFileDerName = strdup(argv[optind + 1]); + typeName = strdup(argv[optind + 2]); - inputFileDerName = (char *) malloc (strlen (argv[optind + 1]) + 1); - strcpy (inputFileDerName, argv[optind + 1]); - - typeName = (char *) malloc (strlen (argv[optind + 2]) + 1); - strcpy (typeName, argv[optind + 2]); + if (!(inputFileAsnName && inputFileDerName && typeName)) + { + fprintf(stderr, "allocation failed\n"); + free(inputFileAsnName); + free(inputFileDerName); + free(typeName); + exit(1); + } asn1_result = asn1_parser2tree (inputFileAsnName, &definitions, errorDescription); diff --git a/tests/Makefile.am b/tests/Makefile.am index d637ce0..379525e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -54,13 +54,13 @@ MOSTLYCLEANFILES = Test_parser_ERROR.asn check_PROGRAMS = Test_parser Test_tree Test_encoding Test_indefinite \ Test_errors Test_simple Test_overflow Test_strings Test_choice \ Test_encdec copynode coding-decoding2 strict-der Test_choice_ocsp \ - ocsp-basic-response octet-string + ocsp-basic-response octet-string coding-long-oid object-id-decoding TESTS = Test_parser Test_tree Test_encoding Test_indefinite \ Test_errors Test_simple Test_overflow crlf threadsafety \ Test_strings Test_choice Test_encdec copynode coding-decoding2 \ strict-der Test_choice_ocsp decoding decoding-invalid-x509 \ - ocsp-basic-response octet-string + ocsp-basic-response octet-string coding-long-oid object-id-decoding TESTS_ENVIRONMENT = \ ASN1PARSER=$(srcdir)/Test_parser.asn \ diff --git a/tests/Makefile.in b/tests/Makefile.in index c1ad745..f51866d 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -111,7 +111,8 @@ check_PROGRAMS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) \ Test_choice$(EXEEXT) Test_encdec$(EXEEXT) copynode$(EXEEXT) \ coding-decoding2$(EXEEXT) strict-der$(EXEEXT) \ Test_choice_ocsp$(EXEEXT) ocsp-basic-response$(EXEEXT) \ - octet-string$(EXEEXT) + octet-string$(EXEEXT) coding-long-oid$(EXEEXT) \ + object-id-decoding$(EXEEXT) TESTS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) Test_encoding$(EXEEXT) \ Test_indefinite$(EXEEXT) Test_errors$(EXEEXT) \ Test_simple$(EXEEXT) Test_overflow$(EXEEXT) crlf threadsafety \ @@ -119,7 +120,8 @@ TESTS = Test_parser$(EXEEXT) Test_tree$(EXEEXT) Test_encoding$(EXEEXT) \ Test_encdec$(EXEEXT) copynode$(EXEEXT) \ coding-decoding2$(EXEEXT) strict-der$(EXEEXT) \ Test_choice_ocsp$(EXEEXT) decoding decoding-invalid-x509 \ - ocsp-basic-response$(EXEEXT) octet-string$(EXEEXT) + ocsp-basic-response$(EXEEXT) octet-string$(EXEEXT) \ + coding-long-oid$(EXEEXT) object-id-decoding$(EXEEXT) subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/lib/glm4/gnulib-comp.m4 \ @@ -231,10 +233,18 @@ coding_decoding2_SOURCES = coding-decoding2.c coding_decoding2_OBJECTS = coding-decoding2.$(OBJEXT) coding_decoding2_LDADD = $(LDADD) coding_decoding2_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la +coding_long_oid_SOURCES = coding-long-oid.c +coding_long_oid_OBJECTS = coding-long-oid.$(OBJEXT) +coding_long_oid_LDADD = $(LDADD) +coding_long_oid_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la copynode_SOURCES = copynode.c copynode_OBJECTS = copynode.$(OBJEXT) copynode_LDADD = $(LDADD) copynode_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la +object_id_decoding_SOURCES = object-id-decoding.c +object_id_decoding_OBJECTS = object-id-decoding.$(OBJEXT) +object_id_decoding_LDADD = $(LDADD) +object_id_decoding_DEPENDENCIES = ../lib/libtasn1.la ../gl/libgnu.la ocsp_basic_response_SOURCES = ocsp-basic-response.c ocsp_basic_response_OBJECTS = ocsp-basic-response.$(OBJEXT) ocsp_basic_response_LDADD = $(LDADD) @@ -284,13 +294,15 @@ am__v_CCLD_1 = SOURCES = Test_choice.c Test_choice_ocsp.c Test_encdec.c \ Test_encoding.c Test_errors.c Test_indefinite.c \ Test_overflow.c Test_parser.c Test_simple.c Test_strings.c \ - Test_tree.c coding-decoding2.c copynode.c \ - ocsp-basic-response.c octet-string.c strict-der.c + Test_tree.c coding-decoding2.c coding-long-oid.c copynode.c \ + object-id-decoding.c ocsp-basic-response.c octet-string.c \ + strict-der.c DIST_SOURCES = Test_choice.c Test_choice_ocsp.c Test_encdec.c \ Test_encoding.c Test_errors.c Test_indefinite.c \ Test_overflow.c Test_parser.c Test_simple.c Test_strings.c \ - Test_tree.c coding-decoding2.c copynode.c \ - ocsp-basic-response.c octet-string.c strict-der.c + Test_tree.c coding-decoding2.c coding-long-oid.c copynode.c \ + object-id-decoding.c ocsp-basic-response.c octet-string.c \ + strict-der.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -1312,10 +1324,18 @@ coding-decoding2$(EXEEXT): $(coding_decoding2_OBJECTS) $(coding_decoding2_DEPEND @rm -f coding-decoding2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(coding_decoding2_OBJECTS) $(coding_decoding2_LDADD) $(LIBS) +coding-long-oid$(EXEEXT): $(coding_long_oid_OBJECTS) $(coding_long_oid_DEPENDENCIES) $(EXTRA_coding_long_oid_DEPENDENCIES) + @rm -f coding-long-oid$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(coding_long_oid_OBJECTS) $(coding_long_oid_LDADD) $(LIBS) + copynode$(EXEEXT): $(copynode_OBJECTS) $(copynode_DEPENDENCIES) $(EXTRA_copynode_DEPENDENCIES) @rm -f copynode$(EXEEXT) $(AM_V_CCLD)$(LINK) $(copynode_OBJECTS) $(copynode_LDADD) $(LIBS) +object-id-decoding$(EXEEXT): $(object_id_decoding_OBJECTS) $(object_id_decoding_DEPENDENCIES) $(EXTRA_object_id_decoding_DEPENDENCIES) + @rm -f object-id-decoding$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(object_id_decoding_OBJECTS) $(object_id_decoding_LDADD) $(LIBS) + ocsp-basic-response$(EXEEXT): $(ocsp_basic_response_OBJECTS) $(ocsp_basic_response_DEPENDENCIES) $(EXTRA_ocsp_basic_response_DEPENDENCIES) @rm -f ocsp-basic-response$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ocsp_basic_response_OBJECTS) $(ocsp_basic_response_LDADD) $(LIBS) @@ -1346,7 +1366,9 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_strings.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coding-decoding2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coding-long-oid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copynode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/object-id-decoding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ocsp-basic-response.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/octet-string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strict-der.Po@am__quote@ @@ -1711,6 +1733,20 @@ octet-string.log: octet-string$(EXEEXT) --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +coding-long-oid.log: coding-long-oid$(EXEEXT) + @p='coding-long-oid$(EXEEXT)'; \ + b='coding-long-oid'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +object-id-decoding.log: object-id-decoding$(EXEEXT) + @p='object-id-decoding$(EXEEXT)'; \ + b='object-id-decoding'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ diff --git a/tests/coding-long-oid.c b/tests/coding-long-oid.c new file mode 100644 index 0000000..bc2cd56 --- /dev/null +++ b/tests/coding-long-oid.c @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2016 Free Software Foundation, Inc. + * + * This file is part of LIBTASN1. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libtasn1.h> + +/* This checks the decoding and re-encoding of OIDs which contain elements + * >= 2^32 bits. + */ + +const unsigned char der_data[] = + "\x30\x82\x06\xdc\x30\x82\x05\xc4\xa0\x03\x02\x01\x02\x02\x08\x35" + "\x73\x8c\xaf\x21\xea\xbd\x2d\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7" + "\x0d\x01\x01\x05\x05\x00\x30\x81\x8e\x31\x0b\x30\x09\x06\x03\x55" + "\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15\x06\x03\x55\x04\x08\x13" + "\x0e\x4e\x6f\x72\x74\x68\x20\x43\x61\x72\x6f\x6c\x69\x6e\x61\x31" + "\x10\x30\x0e\x06\x03\x55\x04\x07\x13\x07\x52\x61\x6c\x65\x69\x67" + "\x68\x31\x10\x30\x0e\x06\x03\x55\x04\x0a\x13\x07\x4b\x61\x74\x65" + "\x6c\x6c\x6f\x31\x14\x30\x12\x06\x03\x55\x04\x0b\x13\x0b\x53\x6f" + "\x6d\x65\x4f\x72\x67\x55\x6e\x69\x74\x31\x2c\x30\x2a\x06\x03\x55" + "\x04\x03\x13\x23\x73\x61\x74\x2d\x72\x32\x32\x30\x2d\x31\x30\x2e" + "\x6c\x61\x62\x2e\x65\x6e\x67\x2e\x72\x64\x75\x32\x2e\x72\x65\x64" + "\x68\x61\x74\x2e\x63\x6f\x6d\x30\x1e\x17\x0d\x31\x36\x30\x37\x30" + "\x31\x31\x38\x35\x34\x31\x37\x5a\x17\x0d\x34\x39\x31\x32\x30\x31" + "\x31\x33\x30\x30\x30\x30\x5a\x30\x2b\x31\x29\x30\x27\x06\x03\x55" + "\x04\x03\x13\x20\x38\x61\x38\x38\x38\x30\x31\x37\x35\x35\x61\x37" + "\x63\x39\x30\x37\x30\x31\x35\x35\x61\x37\x63\x66\x62\x65\x33\x36" + "\x30\x30\x30\x34\x30\x82\x01\x22\x30\x0d\x06\x09\x2a\x86\x48\x86" + "\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00\x30\x82\x01\x0a" + "\x02\x82\x01\x01\x00\xdc\x70\x8b\x9c\x84\xe9\x3e\x79\x8f\x03\xe5" + "\x5f\x21\xf0\x29\x9e\xd9\x94\x4e\x0f\x37\x45\x47\x42\xda\x2a\xe0" + "\xda\xf5\x8b\xfa\xe1\xf8\x62\x51\x14\x9d\x9e\xe0\xc7\x69\xd0\x3d" + "\xfc\x25\x2f\xb6\x10\x45\xbd\x0d\xbc\x92\x86\x54\xbb\x4e\x7d\xd4" + "\x92\x75\x65\xba\x48\xa4\x64\xa1\xeb\xf7\xe7\xdc\xc0\xd7\x0a\x5e" + "\x36\x13\x0e\x4e\x35\xcc\x2c\xc6\xf3\xe7\xe7\xe5\x32\x8a\x0c\xf7" + "\x47\x28\x7a\x02\xc2\x68\x66\x19\x3a\xba\xca\x31\xe2\xdd\x43\xbe" + "\x26\x4c\x80\x12\x0c\xae\x44\x40\xeb\x69\x7d\x9e\x58\xd3\xab\xaf" + "\x69\xe6\x54\xae\x7d\x80\xee\x2c\x10\xe9\xbb\x5e\x6b\x89\x15\x2e" + "\x2c\x72\x26\xba\x7f\xe5\xa3\x66\xc5\x98\xc6\x57\xbf\x05\x1e\x55" + "\x93\xa6\x16\x83\xa6\x88\x79\x8f\x4e\xb5\x7e\x70\xeb\xf0\xa9\xa6" + "\xd5\xf9\x1f\xe6\xab\x70\x06\x43\xe0\xde\x82\xad\x0e\x04\x17\x2b" + "\x69\x82\x40\x98\x84\x14\x00\x2a\xa2\xda\x61\x7b\x35\xac\x71\x05" + "\x43\x6f\x55\x3a\x28\x4b\xd1\xa4\xeb\x3b\xf5\x03\xc2\xf8\x3c\xfd" + "\x0a\xc4\x99\x1d\xa7\x7d\x08\x5c\xd1\x15\x70\x73\xb9\xdc\x5c\xf2" + "\xfe\x2c\xc6\x21\x8a\xbe\xbd\x52\x37\x64\x04\xe5\x06\x3e\xc6\x62" + "\xa1\xe9\x8e\xcb\xc1\x02\x03\x01\x00\x01\xa3\x82\x03\x9e\x30\x82" + "\x03\x9a\x30\x11\x06\x09\x60\x86\x48\x01\x86\xf8\x42\x01\x01\x04" + "\x04\x03\x02\x05\xa0\x30\x0b\x06\x03\x55\x1d\x0f\x04\x04\x03\x02" + "\x04\xb0\x30\x81\xc3\x06\x03\x55\x1d\x23\x04\x81\xbb\x30\x81\xb8" + "\x80\x14\xca\xca\x62\x86\x04\x05\xf0\xf5\x9b\x38\xd2\x2c\x3c\x8c" + "\x65\x0f\xc6\xba\xa5\x3c\xa1\x81\x94\xa4\x81\x91\x30\x81\x8e\x31" + "\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x17\x30\x15" + "\x06\x03\x55\x04\x08\x13\x0e\x4e\x6f\x72\x74\x68\x20\x43\x61\x72" + "\x6f\x6c\x69\x6e\x61\x31\x10\x30\x0e\x06\x03\x55\x04\x07\x13\x07" + "\x52\x61\x6c\x65\x69\x67\x68\x31\x10\x30\x0e\x06\x03\x55\x04\x0a" + "\x13\x07\x4b\x61\x74\x65\x6c\x6c\x6f\x31\x14\x30\x12\x06\x03\x55" + "\x04\x0b\x13\x0b\x53\x6f\x6d\x65\x4f\x72\x67\x55\x6e\x69\x74\x31" + "\x2c\x30\x2a\x06\x03\x55\x04\x03\x13\x23\x73\x61\x74\x2d\x72\x32" + "\x32\x30\x2d\x31\x30\x2e\x6c\x61\x62\x2e\x65\x6e\x67\x2e\x72\x64" + "\x75\x32\x2e\x72\x65\x64\x68\x61\x74\x2e\x63\x6f\x6d\x82\x09\x00" + "\xa4\xe7\xca\xeb\xbe\x43\x5d\xcc\x30\x1d\x06\x03\x55\x1d\x0e\x04" + "\x16\x04\x14\x0e\x8d\x7b\x53\xba\x5a\x9e\x92\x44\xe5\x64\x58\xa1" + "\xdb\x83\x47\x05\x3e\x32\xd3\x30\x13\x06\x03\x55\x1d\x25\x04\x0c" + "\x30\x0a\x06\x08\x2b\x06\x01\x05\x05\x07\x03\x02\x30\x2a\x06\x10" + "\x2b\x06\x01\x04\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x01" + "\x04\x16\x0c\x14\x6d\x6f\x72\x64\x6f\x72\x5f\x75\x65\x62\x65\x72" + "\x5f\x70\x72\x6f\x64\x75\x63\x74\x30\x16\x06\x10\x2b\x06\x01\x04" + "\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x03\x04\x02\x0c\x00" + "\x30\x16\x06\x10\x2b\x06\x01\x04\x01\x92\x08\x09\x01\xaa\xda\xbe" + "\xbe\xfa\x5b\x02\x04\x02\x0c\x00\x30\x16\x06\x10\x2b\x06\x01\x04" + "\x01\x92\x08\x09\x01\xaa\xda\xbe\xbe\xfa\x5b\x05\x04\x02\x0c\x00" + "\x30\x19\x06\x10\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe" + "\xbe\xfa\x72\x01\x04\x05\x0c\x03\x79\x75\x6d\x30\x24\x06\x11\x2b" + "\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x01" + "\x04\x0f\x0c\x0d\x75\x65\x62\x65\x72\x5f\x63\x6f\x6e\x74\x65\x6e" + "\x74\x30\x32\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda" + "\xbe\xbe\xfa\x72\x01\x02\x04\x1d\x0c\x1b\x31\x34\x36\x37\x33\x39" + "\x39\x32\x35\x37\x34\x33\x35\x5f\x75\x65\x62\x65\x72\x5f\x63\x6f" + "\x6e\x74\x65\x6e\x74\x30\x1d\x06\x11\x2b\x06\x01\x04\x01\x92\x08" + "\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x05\x04\x08\x0c\x06\x43\x75" + "\x73\x74\x6f\x6d\x30\x1e\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09" + "\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x06\x04\x09\x0c\x07\x2f\x6d\x6f" + "\x72\x64\x6f\x72\x30\x17\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09" + "\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x07\x04\x02\x0c\x00\x30\x18\x06" + "\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72" + "\x01\x08\x04\x03\x0c\x01\x31\x30\x24\x06\x0a\x2b\x06\x01\x04\x01" + "\x92\x08\x09\x04\x01\x04\x16\x0c\x14\x6d\x6f\x72\x64\x6f\x72\x5f" + "\x75\x65\x62\x65\x72\x5f\x70\x72\x6f\x64\x75\x63\x74\x30\x10\x06" + "\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x02\x04\x02\x0c\x00\x30" + "\x1d\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x03\x04\x0f\x0c" + "\x0d\x31\x34\x36\x37\x33\x39\x39\x32\x35\x37\x34\x33\x35\x30\x11" + "\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x05\x04\x03\x0c\x01" + "\x31\x30\x24\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x06\x04" + "\x16\x0c\x14\x32\x30\x31\x36\x2d\x30\x37\x2d\x30\x31\x54\x31\x38" + "\x3a\x35\x34\x3a\x31\x37\x5a\x30\x24\x06\x0a\x2b\x06\x01\x04\x01" + "\x92\x08\x09\x04\x07\x04\x16\x0c\x14\x32\x30\x34\x39\x2d\x31\x32" + "\x2d\x30\x31\x54\x31\x33\x3a\x30\x30\x3a\x30\x30\x5a\x30\x11\x06" + "\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x0c\x04\x03\x0c\x01\x30" + "\x30\x11\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04\x0e\x04\x03" + "\x0c\x01\x30\x30\x11\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x04" + "\x0b\x04\x03\x0c\x01\x31\x30\x34\x06\x0a\x2b\x06\x01\x04\x01\x92" + "\x08\x09\x05\x01\x04\x26\x0c\x24\x39\x34\x35\x33\x66\x38\x65\x36" + "\x2d\x38\x34\x62\x32\x2d\x34\x38\x32\x65\x2d\x61\x33\x65\x61\x2d" + "\x30\x31\x63\x33\x62\x33\x65\x32\x36\x36\x61\x35\x30\x0d\x06\x09" + "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x05\x00\x03\x82\x01\x01\x00" + "\xf7\x4d\xf3\x30\x53\xcd\x35\xbf\x49\x07\x29\x9b\xf0\x7a\xaa\x49" + "\x60\xda\xce\x14\x45\xb5\x32\x8f\xda\xc3\xce\x6b\xec\xbf\x20\xc0" + "\x05\xa3\x3a\x89\xc4\x7d\x66\x34\xfc\xf3\x16\xb8\xf3\x03\xda\xfc" + "\x82\x4a\xb8\x97\xf8\x67\x3d\xc2\x8c\x78\xb4\x6d\xb8\xbb\x18\xec" + "\x36\xee\xc4\x28\x79\xda\xfe\xa1\x1f\xaf\x0b\x3f\xe4\x75\xde\x83" + "\xff\x6b\xf9\x11\x60\x09\x57\xea\x85\x34\xed\x60\xe2\x94\x8b\xd6" + "\xf2\x21\x9b\xda\x97\x99\xf3\x0d\xa9\x0f\xb5\x3b\x3a\x8f\x96\x8d" + "\x0b\xdf\x30\x17\x03\xe6\x47\xc3\x71\x32\x09\x18\xbc\xc0\xa9\x83" + "\x7e\xb7\x5f\x5c\xbb\xeb\x0a\x18\x3f\xa9\x40\x98\xae\x57\xab\x99" + "\x3d\x47\x1b\x98\x8a\xdc\x6e\x85\xa2\xea\x5e\x21\x80\xa9\xb5\x48" + "\xc9\x1d\x63\xc1\x1b\xe6\x01\xa1\xbd\x84\x38\x7f\x1a\x43\xa5\xd4" + "\x7f\x41\x5b\xf6\x88\x33\xb0\xf1\xb8\x8f\xe1\x39\x69\x6f\x60\x13" + "\xd3\x5d\x70\xde\x95\x0d\x2f\xa9\x89\x6c\xd4\x3a\xeb\x22\x59\xe6" + "\x31\x67\x71\xa5\xed\xfb\xcb\x20\x11\x0c\x31\x2e\xe0\x98\x9a\x3b" + "\x9c\x7b\xa2\x74\x6f\x87\x97\xa1\xd9\x82\x7f\x7d\x62\x6b\x45\x6c" + "\x0b\x5e\x25\x43\x8a\x20\x16\x7d\xe5\x84\x18\x3f\x7c\xda\xfc\xf9"; + +int der_data_size = sizeof(der_data)-1; + +char new_data[4*1024]; + +int +main (int argc, char** argv) +{ + int result = 0; + asn1_node definitions = NULL, node1 = NULL; + char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE]; + const char *pkixfile = getenv ("ASN1PKIX"); + int new_data_size; + + if (!pkixfile) + pkixfile = "pkix.asn"; + + /* Encode */ + result = asn1_parser2tree (pkixfile, &definitions, errorDescription); + if (result != ASN1_SUCCESS) + { + printf ("error in %d\n", __LINE__); + exit (1); + } + + result = asn1_create_element (definitions, "PKIX1.Certificate", &node1); + if (result != ASN1_SUCCESS) + { + printf ("error in %d\n", __LINE__); + exit (1); + } + + result = asn1_der_decoding (&node1, der_data, der_data_size, errorDescription); + if (result != ASN1_SUCCESS) + { + printf ("error in %d: %s\n", __LINE__, errorDescription); + exit (1); + } + + new_data_size = sizeof(new_data); + result = asn1_der_coding (node1, "", new_data, &new_data_size, errorDescription); + if (result != ASN1_SUCCESS) + { + printf ("error in %d\n", __LINE__); + exit (1); + } + + if (new_data_size != der_data_size) + { + printf ("error in %d\n", __LINE__); + printf ("new_size is %d, expected: %d\n", new_data_size, der_data_size); + exit (1); + } + + if (memcmp(new_data, der_data, der_data_size) != 0) + { + printf ("error in %d\n", __LINE__); + exit (1); + } + + asn1_delete_structure (&node1); + asn1_delete_structure (&definitions); + + return 0; +} diff --git a/tests/object-id-decoding.c b/tests/object-id-decoding.c new file mode 100644 index 0000000..e3e9669 --- /dev/null +++ b/tests/object-id-decoding.c @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2016 Red Hat, Inc. + * + * This file is part of LIBTASN1. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include "libtasn1.h" + +struct tv +{ + int der_len; + const unsigned char *der_str; + const char *oid; + int expected_error; +}; + +static const struct tv tv[] = { + {.der_len = 12, + .der_str = (void *) "\x06\x0a\x2b\x06\x01\x04\x01\x92\x08\x09\x05\x01", + .oid = "1.3.6.1.4.1.2312.9.5.1", + .expected_error = ASN1_SUCCESS}, + {.der_len = 19, + .der_str = + (void *) + "\x06\x11\x2b\x06\x01\x04\x01\x92\x08\x09\x02\xaa\xda\xbe\xbe\xfa\x72\x01\x07", + .oid = "1.3.6.1.4.1.2312.9.2.1467399257458.1.7", + .expected_error = ASN1_SUCCESS}, +}; + +int +main (int argc, char *argv[]) +{ + char str[128]; + int ret, ret_len; + size_t i; + + for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++) + { + /* decode */ + ret = + asn1_get_object_id_der (tv[i].der_str+1, + tv[i].der_len-1, &ret_len, str, + sizeof (str)); + if (ret != tv[i].expected_error) + { + fprintf (stderr, + "%d: asn1_get_object_id_der iter %lu: got %d expected %d\n", + __LINE__, (unsigned long) i, ret, tv[i].expected_error); + return 1; + } + + if (ret_len != tv[i].der_len-1) + { + fprintf (stderr, + "%d: iter %lu: error in DER, length returned is %d, had %d\n", + __LINE__, (unsigned long)i, ret_len, tv[i].der_len-1); + return 1; + } + + if (strcmp (tv[i].oid, str) != 0) + { + fprintf (stderr, + "%d: strcmp iter %lu: got invalid OID: %s, expected: %s\n", + __LINE__, (unsigned long) i, str, tv[i].oid); + return 1; + } + + } + + return 0; +} |