├── .gitignore ├── tests ├── base16.testvec ├── base32hex.testvec ├── base32.testvec ├── tests.lisp ├── rt.lisp └── base64url.testvec ├── README ├── package.lisp ├── LICENSE ├── binascii.asd ├── types.lisp ├── TODO ├── doc └── binascii-doc.txt ├── format.lisp ├── base16.lisp ├── octets.lisp ├── base85.lisp ├── streams.lisp ├── base64.lisp ├── ascii85.lisp └── base32.lisp /.gitignore: -------------------------------------------------------------------------------- 1 | *.fasl 2 | *.FASL 3 | *.ufasl 4 | *.ufsl 5 | *.dx32fsl 6 | *.dx64fsl 7 | *.pfsl 8 | *.dfsl 9 | *.p64fsl 10 | *.d64fsl 11 | *.lx32fsl 12 | *.lx64fsl 13 | *.fx32fsl 14 | *.fx64fsl 15 | *.fas 16 | *.lib 17 | 18 | -------------------------------------------------------------------------------- /tests/base16.testvec: -------------------------------------------------------------------------------- 1 | ;;; Test vectors from RFC 4648. 2 | 3 | (:encoding-ascii-test "" "") 4 | (:encoding-ascii-test "f" "66") 5 | (:encoding-ascii-test "fo" "666F") 6 | (:encoding-ascii-test "foo" "666F6F") 7 | (:encoding-ascii-test "foob" "666F6F62") 8 | (:encoding-ascii-test "fooba" "666F6F6261") 9 | (:encoding-ascii-test "foobar" "666F6F626172") 10 | -------------------------------------------------------------------------------- /tests/base32hex.testvec: -------------------------------------------------------------------------------- 1 | ;;; Test vectors from RFC 4648. 2 | 3 | (:encoding-ascii-test "" "") 4 | (:encoding-ascii-test "f" "CO======") 5 | (:encoding-ascii-test "fo" "CPNG====") 6 | (:encoding-ascii-test "foo" "CPNMU===") 7 | (:encoding-ascii-test "foob" "CPNMUOG=") 8 | (:encoding-ascii-test "fooba" "CPNMUOJ1") 9 | (:encoding-ascii-test "foobar" "CPNMUOJ1E8======") 10 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | binascii is a Common Lisp library for converting binary data to ASCII 2 | text of some kind. Such conversions are common in email protocols (for 3 | encoding attachments to support old non-8-bit clean transports) or 4 | encoding binary data in HTTP and XML applications. binascii supports 5 | the encodings described in RFC 4648: base64, base32, base16, and 6 | variants. It also supports base85, used in Adobe's PostScript and PDF 7 | document formats, and a variant called ascii85, used by git for binary 8 | diff files. 9 | 10 | It is documented, flexible, and fast, and comes with a BSD license. 11 | -------------------------------------------------------------------------------- /package.lisp: -------------------------------------------------------------------------------- 1 | ;;;; package.lisp -- package definition for BINASCII 2 | 3 | (cl:defpackage :binascii 4 | (:use :cl) 5 | (:shadow simple-string) 6 | 7 | ;; Main entry points for one-shot encoding and decoding. 8 | (:export #:encode #:decode) 9 | 10 | ;; Incremental encoding and decoding. 11 | (:export #:encode-octets #:decode-octets 12 | #:make-encoder #:make-decoder) 13 | 14 | ;; Format names. For each NAME here, there exists a ENCODE-NAME and 15 | ;; DECODE-NAME function that work identically to ENCODE and DECODE, 16 | ;; respectively. 17 | (:export #:base16 #:hex #:base32 #:base32hex 18 | #:base64 #:base64url #:base85 #:ascii85)) 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009, Nathan Froyd 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are 7 | met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, 10 | this list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in the 14 | documentation and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holders nor the names of 17 | contributors to this software may be used to endorse or promote 18 | products derived from this software without specific prior written 19 | permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS 22 | IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 24 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 25 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 | -------------------------------------------------------------------------------- /tests/base32.testvec: -------------------------------------------------------------------------------- 1 | ;;; Test vectors from RFC 4648. 2 | 3 | (:encoding-ascii-test "" "") 4 | (:encoding-ascii-test "f" "MY======") 5 | (:encoding-ascii-test "fo" "MZXQ====") 6 | (:encoding-ascii-test "foo" "MZXW6===") 7 | (:encoding-ascii-test "foob" "MZXW6YQ=") 8 | (:encoding-ascii-test "fooba" "MZXW6YTB") 9 | (:encoding-ascii-test "foobar" "MZXW6YTBOI======") 10 | 11 | ;;; These correspond to the test vectors in ironclad/tests/test-vectors/tree-hash.testvec 12 | (:encoding-test "5D9ED00A030E638BDB753A6A24FB900E5A63B8E73E6C25B6" 13 | "LWPNACQDBZRYXW3VHJVCJ64QBZNGHOHHHZWCLNQ=") 14 | (:encoding-test "AABBCCA084ACECD0511D1F6232A17BFAEFA441B2982E5548" 15 | "VK54ZIEEVTWNAUI5D5RDFIL37LX2IQNSTAXFKSA=") 16 | (:encoding-test "5FBD0E62AD016D596B77D1D28883B94FED78ECBAF4640914" 17 | "L66Q4YVNAFWVS23X2HJIRA5ZJ7WXR3F26RSASFA=") 18 | (:encoding-test "7E591C1CD8F2E6121FDBCD8071BA279626B771642D10A3DB" 19 | "PZMRYHGY6LTBEH63ZWAHDORHSYTLO4LEFUIKHWY=") 20 | (:encoding-test "0487CA26443F59CFBC780F3CA0CE509C8C352C27C5DCCA20" 21 | "ASD4UJSEH5M47PDYB46KBTSQTSGDKLBHYXOMUIA=") 22 | (:encoding-test "C339BD324EBF6085A0FA5F26D77B44DBB7DB60D690649704" 23 | "YM432MSOX5QILIH2L4TNO62E3O35WYGWSBSJOBA=") 24 | (:encoding-test "5B0ED06AB8773DD7EA2371A71D097EBA8F96A357E0854C77" 25 | "LMHNA2VYO465P2RDOGTR2CL6XKHZNI2X4CCUY5Y=") 26 | (:encoding-test "A9E27D4684D9E49D49A09A7803DA15B258E5DDE0923870E9" 27 | "VHRH2RUE3HSJ2SNATJ4AHWQVWJMOLXPASI4HB2I=") 28 | (:encoding-test "997FC234BF6175678C9BEB35B6C655525115622C9AEC03DA" 29 | "TF74ENF7MF2WPDE35M23NRSVKJIRKYRMTLWAHWQ=") 30 | (:encoding-test "685420361A70DB395782FE1252ED31057EB54CA879E0D0A7" 31 | "NBKCANQ2ODNTSV4C7YJFF3JRAV7LKTFIPHQNBJY=") 32 | -------------------------------------------------------------------------------- /binascii.asd: -------------------------------------------------------------------------------- 1 | ; -*- mode: lisp -*- 2 | 3 | (cl:defpackage #:binascii-system 4 | (:use :cl :asdf)) 5 | 6 | (cl:in-package #:binascii-system) 7 | 8 | (asdf:defsystem :binascii 9 | :version "1.0" 10 | :author "Nathan Froyd " 11 | :maintainer "Nathan Froyd " 12 | :description "A library of ASCII encoding schemes for binary data" 13 | :license "BSD-style (http://opensource.org/licenses/BSD-3-Clause)" 14 | :components ((:static-file "LICENSE") 15 | (:file "package") 16 | (:file "types" :depends-on ("package")) 17 | (:file "format" :depends-on ("types")) 18 | (:file "octets" :depends-on ("types" "format")) 19 | (:file "ascii85" :depends-on ("octets")) 20 | (:file "base85" :depends-on ("octets")) 21 | (:file "base64" :depends-on ("octets")) 22 | (:file "base32" :depends-on ("octets")) 23 | (:file "base16" :depends-on ("octets")))) 24 | 25 | (defmethod perform ((op test-op) (c (eql (find-system :binascii)))) 26 | (asdf:oos 'asdf:test-op :binascii-tests)) 27 | 28 | (defmethod operation-done-p ((op test-op) (c (eql (find-system :binascii)))) 29 | nil) 30 | 31 | (defclass test-vector-file (static-file) 32 | ()) 33 | 34 | (defmethod source-file-type ((c test-vector-file) (s module)) "testvec") 35 | 36 | (asdf:defsystem :binascii-tests 37 | :depends-on (binascii) 38 | :version "1.0" 39 | :in-order-to ((test-op (load-op :binascii-tests))) 40 | :components ((:module "tests" 41 | :components 42 | ((:file "rt") 43 | (:file "tests" :depends-on ("rt")) 44 | (:test-vector-file "ascii85") 45 | (:test-vector-file "base85") 46 | (:test-vector-file "base64") 47 | (:test-vector-file "base32") 48 | (:test-vector-file "base32hex") 49 | (:test-vector-file "base16"))))) 50 | 51 | (defmethod operation-done-p ((op test-op) (c (eql (find-system :binascii-tests)))) 52 | nil) 53 | 54 | (defmethod perform ((op test-op) (c (eql (find-system :binascii-tests)))) 55 | (or (funcall (intern "DO-TESTS" (find-package "RTEST"))) 56 | (error "TEST-OP failed for BINASCII-TESTS"))) 57 | -------------------------------------------------------------------------------- /types.lisp: -------------------------------------------------------------------------------- 1 | ;;;; types.lisp -- various useful types 2 | 3 | (cl:in-package :binascii) 4 | 5 | (deftype index () '(mod #.array-dimension-limit)) 6 | 7 | (deftype simple-octet-vector (&optional (length '*)) 8 | #+(or sbcl cmu ccl) `(simple-array (unsigned-byte 8) (,length)) 9 | #-(or sbcl cmu ccl) `(array (unsigned-byte 8) (,length))) 10 | 11 | (deftype simple-string () 12 | #+sbcl '(and cl:simple-string (not (simple-array nil (*)))) 13 | #+(or cmu ccl) 'cl:simple-string 14 | #-(or sbcl cmu ccl) 'cl:string) 15 | 16 | (defun required-argument () 17 | (error "Required argument not provided")) 18 | 19 | (defstruct (format-descriptor 20 | (:conc-name fd-) 21 | (:copier nil) 22 | (:constructor make-format-descriptor 23 | (encoded-length octets->string 24 | octets->octets/encode 25 | decoded-length 26 | string->octets 27 | octets->octets/decode))) 28 | (encoded-length (required-argument) :type function :read-only t) 29 | (octets->string (required-argument) :type function :read-only t) 30 | (octets->octets/encode (required-argument) :type function :read-only t) 31 | (decoded-length (required-argument) :type function :read-only t) 32 | (string->octets (required-argument) :type function :read-only t) 33 | (octets->octets/decode (required-argument) :type function :read-only t)) 34 | 35 | (defstruct (state 36 | (:copier nil) 37 | (:predicate nil) 38 | (:constructor nil)) 39 | (descriptor (required-argument) :type format-descriptor :read-only t) 40 | ;; FINISHED-INPUT-P is either T or NIL depending on whether we have 41 | ;; seen all of the input. 42 | (finished-input-p nil) 43 | ;; Likewise for FINISHED-OUTPUT-P. 44 | (finished-output-p nil)) 45 | 46 | (defstruct (encode-state 47 | (:include state) 48 | (:copier nil) 49 | (:predicate nil) 50 | (:constructor nil)) 51 | ;; LINE-BREAK describes after how many characters we should be 52 | ;; inserting newlines into the encoded output. It is zero if we 53 | ;; should never insert newlines. 54 | (line-break 0 :type (integer 0 *))) 55 | 56 | (defstruct (decode-state 57 | (:include state) 58 | (:copier nil) 59 | (:predicate nil) 60 | (:constructor nil)) 61 | ) 62 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | -*- mode: org -*- 2 | 3 | * add documentation for the library 4 | ** DONE basic documentation for ENCODE/DECODE 5 | CLOSED: [2010-09-29 Wed 22:40] 6 | ** extended documentation on incremental encoding/decoding 7 | * add decoding gray streams 8 | Hard because we really want to decode groups at a time. But ascii85 screws 9 | that paradigm up with variable-sized groups. 10 | * fix ascii85 encoding 11 | Must SHRINK-VECTOR on NIL destination in case we encoded 'z'. 12 | * line-breaking encoded output 13 | This is probably really only doable for encoding to freshly-consed vectors. 14 | Certainly it's much more doable for clients with the upcoming async 15 | interface. 16 | * compiler macros for optimizing constant-format versions of encode/decode 17 | The trick will be to do this without adding too much bloat. Will 18 | probably only do this for a NIL destination, as that's the case where we 19 | have the most to win from inlining the writer closure. 20 | * testing 21 | ** separate encode/decode tests 22 | ** tests for encoding to octet vectors 23 | ** tests for encoding to streams 24 | ** tests for encoding to fill-pointered things 25 | ** tests for decoding strings 26 | ** tests for decoding to fill-pointered things 27 | ** tests for decoding to streams 28 | Going to be hard because there's not a standard interface for octet streams. 29 | * still not sure the decoding interface is right 30 | Trying to do minimal allocation; might have to just suck it up and 31 | admit that we are going to over-allocate fairly often. 32 | 33 | Especially in the ascii85 case, over-allocation is just a fact of life. 34 | * figure out how to make the library fast for non-CMUCL/SBCL 35 | We might just have to accept a bit of code bloat everyplace else, by 36 | duplicating logic/functions for simple vs. non-simple. 37 | I don't want to restrict clients to always using simple arrays everywhere. 38 | 39 | CCL looks like it ought to be able to get around this, but I can't find 40 | the magic call. 41 | * ignoring whitespace when decoding 42 | We are definitely going to over-allocate if we permit whitespace. 43 | * other formats 44 | Python's binascii module has a few we might consider adding. 45 | * convert to async API 46 | ** encode 47 | *** DONE base16 48 | CLOSED: [2010-02-09 Tue 22:26] 49 | *** DONE base32 50 | CLOSED: [2010-02-09 Tue 22:26] 51 | *** DONE base64 52 | CLOSED: [2010-02-09 Tue 22:27] 53 | *** DONE base85 54 | CLOSED: [2010-02-09 Tue 22:27] 55 | *** DONE ascii85 56 | CLOSED: [2010-02-09 Tue 22:27] 57 | ** decode 58 | *** DONE base16 59 | CLOSED: [2010-02-09 Tue 22:27] 60 | *** DONE base32 61 | CLOSED: [2010-02-09 Tue 22:27] 62 | *** DONE base64 63 | CLOSED: [2010-02-09 Tue 22:27] 64 | *** DONE base85 65 | CLOSED: [2010-02-13 Sat 15:33] 66 | *** DONE ascii85 67 | CLOSED: [2010-02-13 Sat 15:33] 68 | -------------------------------------------------------------------------------- /doc/binascii-doc.txt: -------------------------------------------------------------------------------- 1 | (:author "Nathan Froyd" 2 | :email "froydnj@gmail.com" 3 | :package "binascii" 4 | :cl-package "BINASCII" 5 | :version #.(asdf:component-version (asdf:find-system :binascii)) 6 | :homepage "http://www.method-combination.net/lisp/binascii/" 7 | :download "http://www.method-combination.net/lisp/files/binascii.tar.gz") 8 | 9 | (:h1 ${package}) 10 | 11 | (:p ${package} " is a Common Lisp library for converting binary data to 12 | ASCII text of some kind. Such conversions are common in email protocols 13 | (for encoding attachments to support old non-8-bit clean transports) or 14 | encoding binary data in HTTP and XML applications. " ${package} 15 | supports the encodings described in " ((:a href 16 | "http://tools.ietf.org/html/rfc4648") "RFC 4648") ": base64, base32, 17 | base16, and variants. It also supports base85, used in Adobe's 18 | PostScript and PDF document formats, and a variant called ascii85, used 19 | by git for binary diff files.") 20 | 21 | (:p ${package} " was written by " ${author} " (" ${email} ").") 22 | 23 | (:h2 "Installation") 24 | 25 | (:p ${package} " can be downloaded at " (:url ${download} ${download}) 26 | ". The latest version is " ${version} ".") 27 | 28 | (:p "It comes with an ASDF system definition, so " `(ASDF:OOS 29 | 'ASDF:LOAD-OP :BINASCII)` " should be all that you need to get started. 30 | The testsuite can be run by substituting " `ASDF:TEST-OP` " for " 31 | `ASDF:LOAD-OP` " in the form above.") 32 | 33 | (:h2 "Usage") 34 | 35 | (:p "The easiest way to use " ${package} " is to simply call " `ENCODE` ":") 36 | 37 | (:pre "CL-USER> (let ((message (coerce '(72 101 108 108 111) 38 | '(vector (unsigned-byte 8))))) 39 | (binascii:encode message :base64)) 40 | \"SGVsbG8=\") 41 | 42 | (:p "You can select whether the output is a string, as above, or the 43 | ASCII encoding in octets of the string:") 44 | 45 | (:pre "CL-USER> (let ((message (coerce '(72 101 108 108 111) 46 | '(vector (unsigned-byte 8))))) 47 | (binascii:encode message :base64 :element-type '(unsigned-byte 8))) 48 | #(83 71 86 115 98 71 56 61)") 49 | 50 | (:p "The valid values for " `:ELEMENT-TYPE` " are " `BASE-CHAR` ", " 51 | `CHARACTER` ", and type specifiers that are type-equivalent to " 52 | `(UNSIGNED-BYTE 8) ".") 53 | 54 | (:p "You can also indicate " `:START` " and " `:END` " values, just like 55 | you would with any sequence function:") 56 | 57 | (:pre "CL-USER> (let ((message (coerce '(0 72 101 108 108 111) 58 | '(vector (unsigned-byte 8))))) 59 | (binascii:encode message :base64 :start 1)) 60 | \"SGVsbG8=\" 61 | CL-USER> (let ((message (coerce '(72 101 108 108 111 0) 62 | '(vector (unsigned-byte 8))))) 63 | (binascii:encode message :base64 :end 5)) 64 | \"SGVsbG8=\"") 65 | 66 | (:p "Note that you cannot encode strings; you first have to encode them 67 | as octets using your favorite encoding package.") 68 | 69 | (:p "You are also not limited to simple vectors. For instance, on SBCL:") 70 | 71 | (:pre "CL-USER> (let ((message (make-array 5 :element-type '(unsigned-byte 8) 72 | :fill-pointer 4 :initial-element 0))) 73 | (binascii:encode message :base64)) 74 | \"AAAAAA==\") 75 | 76 | (:p "The above form encodes a vector of four zeros in base64.") 77 | 78 | (:p "There is an symmteric function for decoding called, inventively 79 | enough, " `DECODE` ". " `DECODE` " inherits much of its interface from 80 | " `ENCODE` " and so we won't review functionality already covered above. 81 | There are some new keyword arguments to " `DECODE` " that deserve 82 | special mention, though.") 83 | 84 | (:p "For base16 and base32 encodings only, the " `:CASE-FOLD` keyword 85 | argument may be " `T` " to indicate whether lowercase letters are 86 | considered equivalent to uppercase letters. RFC 4648 defines base16 and 87 | base32 as using exclusively uppercase letters, but it may be useful to 88 | be lenient in what you accept.") 89 | 90 | (:p "For the base32 encoding only, the " `:MAP01` " keyword argument 91 | indicates whether the number 0 should be treated as though it were the 92 | character O. Additionally, if " `:MAP01` " is the character I or the 93 | character L, those values indicate that the character 1 should be 94 | treated as though it were I or L, respectively. Again, this behavior 95 | contradicts the RFC, but may be useful for leniency purposes.") 96 | 97 | (:p "For all other encodings, the " `:MAP01` " and " `:CASE-FOLD` " 98 | arguments are ignored.") 99 | -------------------------------------------------------------------------------- /tests/tests.lisp: -------------------------------------------------------------------------------- 1 | (cl:defpackage #:binascii-tests 2 | (:use :cl)) 3 | 4 | (cl:in-package #:binascii-tests) 5 | 6 | (defun ascii-string-to-octets (string &key (start 0) end) 7 | "Convert STRING to a (VECTOR (UNSIGNED-BYTE 8)). It is an error if 8 | STRING contains any character whose CHAR-CODE is greater than 255." 9 | (declare (type string string) 10 | (type fixnum start) 11 | (type (or cl:null fixnum) end) 12 | (optimize (speed 3) (safety 1))) 13 | (let* ((length (length string)) 14 | (vec (make-array length :element-type '(unsigned-byte 8))) 15 | (end (or end length))) 16 | (loop for i from start below end do 17 | (let ((byte (char-code (char string i)))) 18 | (unless (< byte 256) 19 | (error "~A is not an ASCII character" (char string i))) 20 | (setf (aref vec i) byte)) 21 | finally (return vec)))) 22 | 23 | (defun test-vector-filename (ident) 24 | (merge-pathnames (make-pathname :directory '(:relative) 25 | :name (format nil "~(~A~)" ident) 26 | :type "testvec") 27 | #.*compile-file-pathname*)) 28 | 29 | (defun run-test-vector-file (name function-map) 30 | (let ((filename (test-vector-filename name)) 31 | (*readtable* (copy-readtable))) 32 | (with-open-file (stream filename :direction :input 33 | :element-type 'character 34 | :if-does-not-exist :error) 35 | (loop for form = (read stream nil stream) 36 | until (eq form stream) do 37 | (cond 38 | ((not (listp form)) 39 | (error "Invalid form in test vector file ~A: ~A" filename form)) 40 | (t 41 | (let ((test-function (cdr (assoc (car form) function-map)))) 42 | (unless test-function 43 | (error "No test function defined for ~A" (car form))) 44 | (apply test-function name (cdr form))))) 45 | finally (return t))))) 46 | 47 | (defvar *coding-output-element-type* 'base-char) 48 | 49 | (defun encoding-test* (name input encoded-output decoded-length) 50 | (let* ((output (binascii:encode input name :end decoded-length 51 | :element-type *coding-output-element-type*)) 52 | (mismatchable-encoded-output 53 | (cond 54 | ((or (eql *coding-output-element-type* 'base-char) 55 | (eql *coding-output-element-type* 'character)) 56 | encoded-output) 57 | ((equal *coding-output-element-type* '(unsigned-byte 8)) 58 | (ascii-string-to-octets encoded-output)) 59 | (t 60 | (error "unknown value for *CODING-OUTPUT-ELEMENT-TYPE* ~A" 61 | *coding-output-element-type*)))) 62 | (decoded-input (binascii:decode mismatchable-encoded-output name 63 | :decoded-length decoded-length))) 64 | (unless (typep output `(array ,*coding-output-element-type* (*))) 65 | (error "encoded output not of proper type")) 66 | (when (mismatch output mismatchable-encoded-output) 67 | (error "encoding ~A failed on ~A, produced ~A, wanted ~A" 68 | name input output encoded-output)) 69 | (when (mismatch input decoded-input :end1 decoded-length :end2 decoded-length) 70 | (error "decoding ~A failed on ~A, produced ~A, wanted ~A" 71 | name encoded-output decoded-input input)))) 72 | 73 | (defun encoding-test (name hexinput encoded-output &optional decoded-length) 74 | (encoding-test* name (binascii:decode hexinput :hex) 75 | encoded-output decoded-length)) 76 | 77 | (defun encoding-test-ascii (name ascii-input encoded-output 78 | &optional decoded-length) 79 | (encoding-test* name (ascii-string-to-octets ascii-input) 80 | encoded-output decoded-length)) 81 | 82 | (defparameter *encoding-tests* 83 | (list (cons :encoding-test 'encoding-test) 84 | (cons :encoding-ascii-test 'encoding-test-ascii))) 85 | 86 | (eval-when (:compile-toplevel :load-toplevel :execute) 87 | (defparameter *encodings* '(:base16 :base32 :base32hex :base64 :base85 :ascii85))) 88 | 89 | #.(flet ((deftest-form (e eltype) 90 | (let ((pretty-name (if (equal eltype '(unsigned-byte 8)) 91 | 'ub8 92 | eltype))) 93 | `(rtest:deftest ,(intern (format nil "~A/TO-NIL/~A" e pretty-name)) 94 | (let ((*coding-output-element-type* ',eltype)) 95 | (run-test-vector-file ,e *encoding-tests*)) 96 | t)))) 97 | (loop for e in *encodings* 98 | append (loop for eltype in '(base-char character (unsigned-byte 8)) 99 | collect (deftest-form e eltype)) into forms 100 | finally (return `(progn ,@forms)))) 101 | -------------------------------------------------------------------------------- /format.lisp: -------------------------------------------------------------------------------- 1 | ;;;; format.lisp -- a central repository for encoding formats and accessors 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *format-descriptors* (make-hash-table)) 6 | 7 | (defvar *format-state-constructors* (make-hash-table)) 8 | 9 | (defun unknown-format-error (format) 10 | (error "Unknown format ~A" format)) 11 | 12 | (defun find-descriptor-for-format-or-lose (format) 13 | (or (gethash format *format-descriptors*) 14 | (unknown-format-error format))) 15 | 16 | (defun find-encode-state-constructor-or-lose (format) 17 | (or (car (gethash format *format-state-constructors*)) 18 | (unknown-format-error format))) 19 | 20 | (defun find-decode-state-constructor-or-lose (format) 21 | (or (cdr (gethash format *format-state-constructors*)) 22 | (unknown-format-error format))) 23 | 24 | (defun register-descriptor-and-constructors (format-names 25 | descriptor 26 | encoder-constructor 27 | decoder-constructor) 28 | (flet ((add-with-specified-format (format) 29 | (setf (gethash format *format-descriptors*) descriptor) 30 | (setf (gethash format *format-state-constructors*) 31 | (cons encoder-constructor decoder-constructor)))) 32 | (mapc #'add-with-specified-format format-names) 33 | format-names)) 34 | 35 | (defmacro define-format (name &key 36 | ((:encode-state-maker encoder-constructor)) 37 | ((:decode-state-maker decoder-constructor)) 38 | encode-length-fun decode-length-fun 39 | encoder-fun decoder-fun) 40 | (flet ((format-docstring (&rest args) 41 | (declare (optimize (debug 3))) 42 | (loop with docstring = (apply #'format nil args) 43 | for start = 0 then (when pos (1+ pos)) 44 | for pos = (and start (position #\Space docstring :start start)) 45 | while start 46 | collect (subseq docstring start pos) into words 47 | finally (return (format nil "~{~<~%~1,76:;~A~>~^ ~}" 48 | words)))) 49 | (intern-symbol (string &rest args) 50 | (intern (with-standard-io-syntax (apply #'format nil string args)) 51 | (find-package '#:binascii)))) 52 | (let ((binascii-name (intern (symbol-name name))) 53 | (descriptor-fun (intern-symbol "~A-FORMAT-DESCRIPTOR" name)) 54 | (simple-encode-fun (intern-symbol "ENCODE-~A" name)) 55 | (simple-decode-fun (intern-symbol "DECODE-~A" name)) 56 | (octets->octets/encode (intern-symbol "OCTETS->OCTETS/ENCODE/~A" name)) 57 | (octets->string (intern-symbol "OCTETS->STRING/~A" name)) 58 | (octets->octets/decode (intern-symbol "OCTETS->OCTETS/DECODE/~A" name)) 59 | (string->octets (intern-symbol "STRING->OCTETS/~A" name))) 60 | ;; FORMAT needs a little help to do proper line wrapping. 61 | `(progn 62 | (defun ,descriptor-fun () 63 | (flet ((,octets->octets/encode (state output input 64 | output-start output-end 65 | input-start input-end lastp) 66 | (declare (type simple-octet-vector output)) 67 | (declare (optimize speed)) 68 | (,encoder-fun state output input output-start output-end 69 | input-start input-end lastp #'char-code)) 70 | (,octets->string (state output input 71 | output-start output-end 72 | input-start input-end lastp) 73 | (declare (type simple-string output)) 74 | (declare (optimize speed)) 75 | (,encoder-fun state output input output-start output-end 76 | input-start input-end lastp #'identity)) 77 | (,string->octets (state output input 78 | output-index output-end 79 | input-index input-end lastp) 80 | (declare (type simple-string input)) 81 | (declare (optimize speed)) 82 | (,decoder-fun state output input output-index output-end 83 | input-index input-end lastp #'char-code)) 84 | (,octets->octets/decode (state output input 85 | output-index output-end 86 | input-index input-end lastp) 87 | (declare (type simple-octet-vector input)) 88 | (declare (optimize speed)) 89 | (,decoder-fun state output input output-index output-end 90 | input-index input-end lastp #'identity))) 91 | (let* ((cell (load-time-value (list nil))) 92 | (fd (car cell))) 93 | (if fd 94 | fd 95 | (setf (car cell) 96 | (make-format-descriptor #',encode-length-fun 97 | #',octets->string 98 | #',octets->octets/encode 99 | #',decode-length-fun 100 | #',string->octets 101 | #',octets->octets/decode)))))) 102 | (export ',simple-encode-fun) 103 | (defun ,simple-encode-fun (octets &key (start 0) end 104 | (element-type 'base-char)) 105 | ,(format-docstring "Encodes OCTETS using ~(~A~) encoding. The rest of the arguments are as for ENCODE." name) 106 | (encode-to-fresh-vector octets (funcall #',encoder-constructor) 107 | start end element-type)) 108 | (export ',simple-decode-fun) 109 | (defun ,simple-decode-fun (string &key (start 0) end 110 | case-fold map01 decoded-length) 111 | ,(format-docstring "Decodes STRING using ~(~A~) encoding. The rest of the arguments are as for DECODE." name) 112 | (decode-to-fresh-vector string (funcall #',decoder-constructor 113 | case-fold map01) 114 | start end decoded-length)) 115 | (register-descriptor-and-constructors '(,name ,binascii-name) 116 | (,descriptor-fun) 117 | (function ,encoder-constructor) 118 | (function ,decoder-constructor)))))) 119 | 120 | (defun make-encoder (format) 121 | "Return an ENCODE-STATE for FORMAT. Error if FORMAT is not a known 122 | encoding format." 123 | (let ((constructor (find-encode-state-constructor-or-lose format))) 124 | (funcall (the function constructor)))) 125 | 126 | (defun find-encoder (format) 127 | (etypecase format 128 | (symbol (make-encoder format)) 129 | (encode-state format))) 130 | 131 | (defun make-decoder (format case-fold map01) 132 | "Return a DECODE-STATE for FORMAT. Use CASE-FOLD and MAP01 to 133 | parameterize the returned decoder. Error if FORMAT is not a known 134 | decoding format." 135 | (let ((constructor (find-decode-state-constructor-or-lose format))) 136 | (funcall (the function constructor) case-fold map01))) 137 | 138 | (defun find-decoder (format case-fold map01) 139 | (etypecase format 140 | (symbol (make-decoder format case-fold map01)) 141 | (decode-state format))) 142 | -------------------------------------------------------------------------------- /base16.lisp: -------------------------------------------------------------------------------- 1 | ;;;; base16.lisp -- The base16 encoding, formalized in RFC 3548 and RFC 4648. 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *hex-encode-table* 6 | #.(coerce "0123456789abcdef" 'simple-base-string)) 7 | (defvar *base16-encode-table* 8 | #.(coerce "0123456789ABCDEF" 'simple-base-string)) 9 | 10 | (defvar *base16-decode-table* 11 | (make-decode-table *base16-encode-table*)) 12 | (declaim (type decode-table *base16-decode-table*)) 13 | 14 | (defstruct (base16-encode-state 15 | (:include encode-state) 16 | (:copier nil) 17 | (:predicate nil) 18 | (:constructor make-base16-encode-state 19 | (&aux (descriptor (base16-format-descriptor)) 20 | (table *base16-encode-table*))) 21 | (:constructor make-hex-encode-state 22 | (&aux (descriptor (base16-format-descriptor)) 23 | (table *hex-encode-table*)))) 24 | (bits 0 :type (unsigned-byte 8)) 25 | (n-bits 0 :type fixnum) 26 | (table *base16-encode-table* :read-only t 27 | :type (simple-array base-char (16)))) 28 | 29 | (declaim (inline base16-encoder)) 30 | (defun base16-encoder (state output input 31 | output-index output-end 32 | input-index input-end lastp converter) 33 | (declare (type base16-encode-state state)) 34 | (declare (type simple-octet-vector input)) 35 | (declare (type index output-index output-end input-index input-end)) 36 | (declare (type function converter)) 37 | (let ((bits (base16-encode-state-bits state)) 38 | (n-bits (base16-encode-state-n-bits state)) 39 | (table (base16-encode-state-table state))) 40 | (declare (type index input-index output-index)) 41 | (declare (type (unsigned-byte 8) bits)) 42 | (declare (type fixnum n-bits)) 43 | (tagbody 44 | PAD-CHECK 45 | (when (base16-encode-state-finished-input-p state) 46 | (go FLUSH-BITS)) 47 | INPUT-CHECK 48 | (when (>= input-index input-end) 49 | (go DONE)) 50 | DO-INPUT 51 | (when (zerop n-bits) 52 | (setf bits (aref input input-index)) 53 | (incf input-index) 54 | (setf n-bits 8)) 55 | OUTPUT-CHECK 56 | (when (>= output-index output-end) 57 | (go DONE)) 58 | DO-OUTPUT 59 | (decf n-bits 4) 60 | (setf (aref output output-index) 61 | (funcall converter (aref table (ldb (byte 4 n-bits) bits)))) 62 | (incf output-index) 63 | (if (>= n-bits 4) 64 | (go OUTPUT-CHECK) 65 | (go INPUT-CHECK)) 66 | DONE 67 | (unless lastp 68 | (go RESTORE-STATE)) 69 | (setf (base16-encode-state-finished-input-p state) t) 70 | FLUSH-BITS 71 | (when (zerop n-bits) 72 | (go RESTORE-STATE)) 73 | FLUSH-OUTPUT-CHECK 74 | (when (>= output-index output-end) 75 | (go RESTORE-STATE)) 76 | DO-FLUSH-OUTPUT 77 | (decf n-bits 4) 78 | (setf (aref output output-index) 79 | (funcall converter (aref table (ldb (byte 4 n-bits) bits)))) 80 | (incf output-index) 81 | (when (= n-bits 4) 82 | (go FLUSH-OUTPUT-CHECK)) 83 | RESTORE-STATE 84 | (setf (base16-encode-state-bits state) bits 85 | (base16-encode-state-n-bits state) n-bits)) 86 | (values input-index output-index))) 87 | 88 | (defun encoded-length-base16 (count) 89 | "Return the number of characters required to encode COUNT octets in Base16." 90 | (* count 2)) 91 | 92 | (defun base16-decode-table (case-fold) 93 | (if case-fold 94 | (case-fold-decode-table *base16-decode-table* 95 | *base16-encode-table*) 96 | *base16-decode-table*)) 97 | 98 | (defstruct (base16-decode-state 99 | (:include decode-state) 100 | (:copier nil) 101 | (:predicate nil) 102 | (:constructor %make-base16-decode-state 103 | (table 104 | &aux (descriptor (base16-format-descriptor))))) 105 | (bits 0 :type (unsigned-byte 8)) 106 | (n-bits 0 :type fixnum) 107 | (table *base16-decode-table* :read-only t :type decode-table)) 108 | 109 | (defun make-base16-decode-state (case-fold map01) 110 | (declare (ignore map01)) 111 | (%make-base16-decode-state (base16-decode-table case-fold))) 112 | 113 | (defun make-hex-decode-state (case-fold map01) 114 | (declare (ignore case-fold map01)) 115 | (%make-base16-decode-state (base16-decode-table t))) 116 | 117 | (defun base16-decoder (state output input 118 | output-index output-end 119 | input-index input-end lastp converter) 120 | (declare (type base16-decode-state state)) 121 | (declare (type simple-octet-vector output)) 122 | (declare (type index output-index output-end input-index input-end)) 123 | (declare (type function converter)) 124 | (let ((bits (base16-decode-state-bits state)) 125 | (n-bits (base16-decode-state-n-bits state)) 126 | (table (base16-decode-state-table state))) 127 | (declare (type (unsigned-byte 8) bits)) 128 | (tagbody 129 | START 130 | (when (base16-decode-state-finished-input-p state) 131 | (go FLUSH-BITS)) 132 | OUTPUT-AVAILABLE-CHECK 133 | (when (< n-bits 8) 134 | (go INPUT-AVAILABLE-CHECK)) 135 | OUTPUT-SPACE-CHECK 136 | (when (>= output-index output-end) 137 | (go DONE)) 138 | DO-OUTPUT 139 | (setf (aref output output-index) bits 140 | bits 0 141 | n-bits 0) 142 | (incf output-index) 143 | (go INPUT-AVAILABLE-CHECK) 144 | INPUT-AVAILABLE-CHECK 145 | (when (>= input-index input-end) 146 | (go DONE)) 147 | DO-INPUT 148 | (assert (< n-bits 8)) 149 | (let* ((v (aref input input-index)) 150 | (c (dtref table (funcall converter v)))) 151 | (when (= c +dt-invalid+) 152 | (error "invalid hex digit ~A at position ~D" v input-index)) 153 | (incf input-index) 154 | (cond 155 | ((= n-bits 0) 156 | (setf bits (* (logand c #xf) 16) 157 | n-bits 4) 158 | (go INPUT-AVAILABLE-CHECK)) 159 | ((= n-bits 4) 160 | (setf bits (+ bits (logand c #xf)) 161 | n-bits 8) 162 | (go OUTPUT-SPACE-CHECk)))) 163 | DONE 164 | (unless lastp 165 | (go RESTORE-STATE)) 166 | (setf (base16-decode-state-finished-input-p state) t) 167 | FLUSH-BITS 168 | (when (zerop n-bits) 169 | (go RESTORE-STATE)) 170 | FLUSH-OUTPUT-CHECK 171 | (when (>= output-index output-end) 172 | (go RESTORE-STATE)) 173 | DO-FLUSH-OUTPUT 174 | (when (= n-bits 4) 175 | (error "attempting to decode an odd number of hex digits")) 176 | (setf (aref output output-index) bits 177 | bits 0 178 | n-bits 0) 179 | RESTORE-STATE 180 | (setf (base16-decode-state-n-bits state) n-bits 181 | (base16-decode-state-bits state) bits)) 182 | (values input-index output-index))) 183 | 184 | (defun decoded-length-base16 (length) 185 | (unless (evenp length) 186 | (error "cannot decode an odd number of base16 characters")) 187 | (truncate length 2)) 188 | 189 | (define-format :base16 190 | :encode-state-maker make-base16-encode-state 191 | :decode-state-maker make-base16-decode-state 192 | :encode-length-fun encoded-length-base16 193 | :decode-length-fun decoded-length-base16 194 | :encoder-fun base16-encoder 195 | :decoder-fun base16-decoder) 196 | (define-format :hex 197 | :encode-state-maker make-hex-encode-state 198 | :decode-state-maker make-hex-decode-state 199 | :encode-length-fun encoded-length-base16 200 | :decode-length-fun decoded-length-base16 201 | :encoder-fun base16-encoder 202 | :decoder-fun base16-decoder) 203 | -------------------------------------------------------------------------------- /octets.lisp: -------------------------------------------------------------------------------- 1 | ;;;; octets.lisp -- substrate for encoding functionality 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defun case-fold-decode-table (decode-table encode-table) 6 | (loop with table = (copy-seq decode-table) 7 | for c across encode-table 8 | do (setf (aref table (char-code (char-downcase c))) 9 | (aref table (char-code c))) 10 | finally (return table))) 11 | 12 | (defun canonicalize-element-type (element-type &optional (errorp t)) 13 | (cond 14 | ((eq element-type 'character) element-type) 15 | ((eq element-type 'base-char) element-type) 16 | ;; We want (UNSIGNED-BYTE 8), but there are a variety of 17 | ;; ways to express that and we don't want to go through 18 | ;; SUBTYPEP all the time. Do a quick check for the most 19 | ;; likely form, then use SUBTYPEP for people who do things 20 | ;; weirdly. 21 | ((or (equal element-type '(unsigned-byte 8)) 22 | (and (subtypep element-type '(unsigned-byte 8)) 23 | (subtypep '(unsigned-byte 8) element-type))) 24 | 'octet) 25 | (t 26 | (when errorp 27 | (error "Unsupported element-type ~A" element-type))))) 28 | 29 | (declaim (inline array-data-and-offsets)) 30 | (defun array-data-and-offsets (v start end) 31 | "Like ARRAY-DISPLACEMENT, only more useful." 32 | #+sbcl 33 | (let ((end (or end (length v)))) 34 | (sb-kernel:with-array-data ((v v) (real-start start) (real-end end)) 35 | (declare (ignore real-end)) 36 | (values v start (+ real-start (- end start))))) 37 | #+cmu 38 | (let ((end (or end (length v)))) 39 | (lisp::with-array-data ((v v) (real-start start) (real-end end)) 40 | (declare (ignore real-end)) 41 | (values v start (+ real-start (- end start))))) 42 | #+ccl 43 | (multiple-value-bind (v* offset) (ccl::array-data-and-offset v) 44 | (values v* (+ start offset) (+ (or end (length v)) offset))) 45 | #-(or sbcl cmu ccl) 46 | (values v start (or end (length v)))) 47 | 48 | (defun encode-to-fresh-vector (octets state start end element-type) 49 | (declare (type encode-state state)) 50 | (multiple-value-bind (input start end) 51 | (array-data-and-offsets octets start end) 52 | (let* ((fd (state-descriptor state)) 53 | (length (funcall (fd-encoded-length fd) (- end start)))) 54 | (declare (type format-descriptor fd)) 55 | (declare (type index length)) 56 | (flet ((frob (etype encode-fun) 57 | (let ((v (make-array length :element-type etype))) 58 | (multiple-value-bind (input-index output-index) 59 | (funcall encode-fun state v input 60 | 0 length start end t) 61 | (declare (ignore input-index)) 62 | (if (= output-index length) 63 | v 64 | (subseq v 0 output-index)))))) 65 | (declare (inline frob)) 66 | (ecase (canonicalize-element-type element-type) 67 | (character 68 | (frob 'character (fd-octets->string fd))) 69 | (base-char 70 | (frob 'base-char (fd-octets->string fd))) 71 | (octet 72 | (frob '(unsigned-byte 8) (fd-octets->octets/encode fd)))))))) 73 | 74 | (defun encode (octets format &key (start 0) end (element-type 'base-char)) 75 | "Encode OCTETS between START and END into ASCII characters according to 76 | FORMAT. Return a fresh vector containing the characters. The type of 77 | the vector depends on ELEMENT-TYPE; if ELEMENT-TYPE is a subtype of 78 | CHARACTER, then a string is returned. If ELEMENT-TYPE is type-equivalent 79 | to (UNSIGNED-BYTE 8), then an octet vector is returned." 80 | (encode-to-fresh-vector octets (find-encoder format) start end element-type)) 81 | 82 | (defun encode-octets (destination octets format &key (start 0) end 83 | (output-start 0) output-end (element-type 'base-char) 84 | finishp) 85 | "Encode OCTETS between START and END into ASCII characters 86 | according to FORMAT and write them to DESTINATION according to ELEMENT-TYPE. 87 | 88 | If DESTINATION is NIL and ELEMENT-TYPE is a subtype of CHARACTER, then a 89 | string is returned. If DESTINATION is NIL and ELEMENT-TYPE is 90 | \(UNSIGNED-BYTE 8) or an equivalent type, then an octet vector is returned. 91 | 92 | If ELEMENT-TYPE is a subtype of CHARACTER, then DESTINATION may also be 93 | a string. Similarly, if ELEMENT-TYPE is (UNSIGNED-BYTE 8) or an 94 | equivalent type, then DESTINATION may be an octet vector. In this case, 95 | OUTPUT-START and OUTPUT-END are used to determine the portion of 96 | DESTINATION where the encoded output may be placed. 97 | 98 | If DESTINATION is not NIL, The index of the first input element that was 99 | not read and the index of the first output element that was not updated 100 | are returned as multiple values. respectively, written are returned as 101 | multiple values. ELEMENT-TYPE is ignored. 102 | 103 | If FINISHP is true, then in addition to any encoding of OCTETS, also output 104 | any necessary padding required by FORMAT." 105 | (let* ((state (find-encoder format)) 106 | (fd (state-descriptor state))) 107 | (declare (type encode-state state)) 108 | (declare (type format-descriptor fd)) 109 | (flet ((frob (encode-fun) 110 | (multiple-value-bind (input input-start input-end) 111 | (array-data-and-offsets octets start end) 112 | (multiple-value-bind (output output-start output-end) 113 | (array-data-and-offsets destination output-start output-end) 114 | (funcall encode-fun state 115 | output input 116 | output-start output-end 117 | input-start input-end finishp))))) 118 | (declare (inline frob)) 119 | (etypecase destination 120 | (null 121 | (encode-to-fresh-vector octets state start end element-type)) 122 | (string 123 | (frob (fd-octets->string fd))) 124 | ((array (unsigned-byte 8) (*)) 125 | (frob (fd-octets->octets/encode fd))))))) 126 | 127 | (defun decode-to-fresh-vector (string state start end decoded-length) 128 | (declare (type decode-state state)) 129 | (multiple-value-bind (input start end) 130 | (array-data-and-offsets string start end) 131 | (let* ((fd (state-descriptor state)) 132 | (length (or decoded-length 133 | (funcall (fd-decoded-length fd) (- end start))))) 134 | (declare (type format-descriptor fd)) 135 | (declare (type index length)) 136 | (flet ((frob (v decode-fun) 137 | (multiple-value-bind (input-index output-index) 138 | (funcall decode-fun state v input 0 length start end t) 139 | ;; FIXME: we should check to see if we actually 140 | ;; consumed all the input. If we didn't, then we need 141 | ;; to reallocate V and continue decoding. Even though 142 | ;; we said LASTP=T. Hmmm. 143 | (declare (ignore input-index)) 144 | (if (= output-index length) 145 | v 146 | (subseq v 0 output-index))))) 147 | (let ((octets (make-array length :element-type '(unsigned-byte 8)))) 148 | (etypecase string 149 | (simple-string 150 | (frob octets (fd-string->octets fd))) 151 | (simple-octet-vector 152 | (frob octets (fd-octets->octets/decode fd))))))))) 153 | 154 | (defun decode (string format &key (start 0) end case-fold map01 decoded-length) 155 | "Decode the characters of STRING between START and END into octets 156 | according to FORMAT. DECODED-LENGTH indicates the number of decoded 157 | octets to expect. CASE-FOLD indicates whether to consider lowercase 158 | characters as equivalent to uppercase characters; it is only considered 159 | for certain values of FORMAT. MAP01 indicates whether to consider #\\0 160 | equivalent to #\\O and possibly #\\1 as equivalent to #\\I or #\\L; see 161 | the documentation for further details." 162 | (decode-to-fresh-vector string (find-decoder format case-fold map01) 163 | start end decoded-length)) 164 | 165 | (defun decode-octets (destination string format &key (start 0) end 166 | (output-start 0) output-end case-fold map01 finishp 167 | decoded-length) 168 | "Decode the characters of STRING between START and END into octets 169 | according to FORMAT. DECODED-LENGTH indicates the number of decoded 170 | octets to expect. DESTINATION may be NIL." 171 | (let ((state (find-decoder format case-fold map01))) 172 | (declare (type decode-state state)) 173 | (flet ((frob (decode-fun) 174 | (multiple-value-bind (input input-start input-end) 175 | (array-data-and-offsets string start end) 176 | (multiple-value-bind (output output-start output-end) 177 | (array-data-and-offsets destination output-start output-end) 178 | (funcall decode-fun state 179 | output input 180 | output-start output-end 181 | input-start input-end finishp))))) 182 | (declare (inline frob)) 183 | (etypecase string 184 | (null 185 | (decode-to-fresh-vector string state start end decoded-length)) 186 | (string 187 | (frob (fd-string->octets (state-descriptor state)))) 188 | ((array (unsigned-byte 8) (*)) 189 | (frob (fd-octets->octets/decode (state-descriptor state)))))))) 190 | 191 | (defconstant +dt-invalid+ -1) 192 | 193 | (defun make-decode-table (encode-table) 194 | (loop with table = (make-array 256 :element-type 'fixnum 195 | :initial-element +dt-invalid+) 196 | for char across encode-table 197 | for i from 0 198 | do (setf (aref table (char-code char)) i) 199 | finally (return table))) 200 | 201 | (deftype decode-table () '(simple-array fixnum (256))) 202 | 203 | (declaim (inline dtref)) 204 | (defun dtref (table i) 205 | (declare (type decode-table table)) 206 | (declare (type index i)) 207 | ;; FIXME: statically handle CHAR-CODE-LIMIT <= 256 208 | (if (>= i 256) 209 | +dt-invalid+ 210 | (aref table i))) 211 | -------------------------------------------------------------------------------- /base85.lisp: -------------------------------------------------------------------------------- 1 | ;;; base85.lisp -- base85 encoding, in the flavor that git uses 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *base85-encode-table* 6 | #.(coerce "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~" 'simple-base-string)) 7 | 8 | (defstruct (base85-encode-state 9 | (:include encode-state) 10 | (:copier nil) 11 | (:predicate nil) 12 | (:constructor make-base85-encode-state 13 | (&aux (descriptor (base85-format-descriptor))))) 14 | ;; TODO: Clever hack for little-endian machines: fill in GROUP 15 | ;; back-to-front, using PENDING to count down, then use SBCL's 16 | ;; %VECTOR-RAW-BITS or similar to read out the group in proper 17 | ;; big-endian order. We could even do the same thing on x86-64 if we 18 | ;; made the buffer bigger. 19 | ;; 20 | ;; For now, though, we'll fill GROUP front-to-back and PENDING will 21 | ;; indicate how many octets we've filled in. 22 | #+nil 23 | (group (make-array 4 :element-type '(unsigned-byte 8)) 24 | :read-only t :type (simple-array (unsigned-byte 8) (4))) 25 | (bits 0 :type (unsigned-byte 32)) 26 | (pending 0 :type (integer 0 4)) 27 | (output-group (make-array 5 :element-type 'base-char) 28 | :read-only t :type (simple-array base-char (5))) 29 | (output-pending 0 :type (integer 0 5)) 30 | (table *base85-encode-table* :read-only t :type (simple-array base-char (85)))) 31 | 32 | (defun encoded-length-base85 (count) 33 | "Return the number of characters required to encode COUNT octets in Base85." 34 | (* (ceiling count 4) 5)) 35 | 36 | (declaim (inline base85-encode)) 37 | (defun base85-encoder (state output input 38 | output-index output-end 39 | input-index input-end lastp converter) 40 | (declare (type base85-encode-state state)) 41 | (declare (type simple-octet-vector input)) 42 | (declare (type index output-index output-end input-index input-end)) 43 | (declare (type function converter)) 44 | (let ((bits (base85-encode-state-bits state)) 45 | (pending (base85-encode-state-pending state)) 46 | (output-group (base85-encode-state-output-group state)) 47 | (output-pending (base85-encode-state-output-pending state)) 48 | (table (base85-encode-state-table state))) 49 | (declare (type index input-index output-index)) 50 | (declare (type (unsigned-byte 32) bits)) 51 | (declare (type (integer 0 4) pending)) 52 | (declare (type (integer 0 5) output-pending)) 53 | (flet ((expand-for-output (bits output-group) 54 | (loop for i from 0 to 4 55 | do (multiple-value-bind (b index) (truncate bits 85) 56 | (setf bits b 57 | (aref output-group i) (aref table index))) 58 | finally (setf output-pending 5)))) 59 | (declare (inline expand-for-output)) 60 | (tagbody 61 | PAD-CHECK 62 | (when (base85-encode-state-finished-input-p state) 63 | (go FLUSH-BITS)) 64 | INPUT-CHECK 65 | (when (>= input-index input-end) 66 | (go DONE)) 67 | DO-INPUT 68 | (when (< pending 4) 69 | (setf bits (ldb (byte 32 0) 70 | (logior (ash bits 8) (aref input input-index)))) 71 | (incf input-index) 72 | (unless (= (incf pending) 4) 73 | (go INPUT-CHECK))) 74 | EXPAND-FOR-OUTPUT 75 | (expand-for-output bits output-group) 76 | OUTPUT-CHECK 77 | (when (>= output-index output-end) 78 | (go DONE)) 79 | DO-OUTPUT 80 | (when (> output-pending 0) 81 | (setf (aref output output-index) 82 | (funcall converter 83 | (aref output-group (decf output-pending)))) 84 | (incf output-index) 85 | (cond 86 | ((zerop output-pending) 87 | (setf bits 0) 88 | (setf pending 0) 89 | (go INPUT-CHECK)) 90 | (t 91 | (go OUTPUT-CHECK)))) 92 | DONE 93 | (unless lastp 94 | (go RESTORE-STATE)) 95 | (setf (base85-encode-state-finished-input-p state) t) 96 | ;; Make it appear as though the input were padded with zeros to a 97 | ;; full input group. 98 | (let ((for-pad (- 4 pending))) 99 | (setf bits (ldb (byte 32 0) (ash bits (* 8 for-pad)))) 100 | (setf pending 4) 101 | (expand-for-output bits output-group)) 102 | FLUSH-BITS 103 | (when (zerop output-pending) 104 | (go RESTORE-STATE)) 105 | FLUSH-OUTPUT-CHECK 106 | (when (>= output-index output-end) 107 | (go RESTORE-STATE)) 108 | DO-FLUSH-OUTPUT 109 | (when (> output-pending 0) 110 | (setf (aref output output-index) 111 | (funcall converter 112 | (aref output-group (decf output-pending)))) 113 | (incf output-index) 114 | (cond 115 | ((zerop output-pending) 116 | (setf bits 0) 117 | (setf pending 0) 118 | (go RESTORE-STATE)) 119 | (t 120 | (go FLUSH-OUTPUT-CHECK)))) 121 | RESTORE-STATE 122 | (setf (base85-encode-state-bits state) bits 123 | (base85-encode-state-pending state) pending 124 | (base85-encode-state-output-pending state) output-pending)) 125 | (values input-index output-index)))) 126 | 127 | (defvar *base85-decode-table* (make-decode-table *base85-encode-table*)) 128 | (declaim (type decode-table *base85-decode-table*)) 129 | 130 | (defstruct (base85-decode-state 131 | (:include decode-state) 132 | (:copier nil) 133 | (:predicate nil) 134 | (:constructor %make-base85-decode-state 135 | (&aux (descriptor (base85-format-descriptor))))) 136 | (bits 0 :type (unsigned-byte 32)) 137 | (pending 0 :type (integer 0 5)) 138 | (output-pending 0 :type (integer 0 4)) 139 | (table *base85-decode-table* :read-only t :type decode-table)) 140 | 141 | (defun make-base85-decode-state (case-fold map01) 142 | (declare (ignore case-fold map01)) 143 | (%make-base85-decode-state)) 144 | 145 | (defun base85-decoder (state output input 146 | output-index output-end 147 | input-index input-end lastp converter) 148 | (declare (type base85-decode-state state)) 149 | (declare (type simple-octet-vector output)) 150 | (declare (type index output-index output-end input-index input-end)) 151 | (declare (type function converter)) 152 | (let ((bits (base85-decode-state-bits state)) 153 | (pending (base85-decode-state-pending state)) 154 | (output-pending (base85-decode-state-output-pending state)) 155 | (table (base85-decode-state-table state))) 156 | (declare (type (unsigned-byte 32) bits)) 157 | (declare (type (integer 0 5) pending)) 158 | (declare (type (integer 0 4) output-pending)) 159 | (tagbody 160 | FINISHED-CHECK 161 | (when (base85-decode-state-finished-input-p state) 162 | (go FLUSH-BITS)) 163 | OUTPUT-AVAILABLE-CHECK 164 | (when (zerop output-pending) 165 | (go INPUT-AVAILABLE-CHECK)) 166 | OUTPUT-SPACE-CHECK 167 | (when (>= output-index output-end) 168 | (go DONE)) 169 | DO-OUTPUT 170 | (setf (aref output output-index) 171 | (ldb (byte 8 (* (decf output-pending) 8)) bits)) 172 | (incf output-index) 173 | (cond 174 | ((zerop output-pending) 175 | (setf bits 0) 176 | (setf pending 0) 177 | (setf output-pending 0) 178 | (go INPUT-AVAILABLE-CHECK)) 179 | (t 180 | (go OUTPUT-SPACE-CHECK))) 181 | INPUT-AVAILABLE-CHECK 182 | (when (>= input-index input-end) 183 | (go DONE)) 184 | DO-INPUT 185 | (cond 186 | ((< pending 5) 187 | (let* ((c (aref input input-index)) 188 | (v (funcall converter c)) 189 | (d (dtref table v))) 190 | (when (= d +dt-invalid+) 191 | (error "invalid base85 character ~A at position ~D" c input-index)) 192 | ;; FIXME: check for overflow. 193 | (setf bits (+ (* bits 85) d)) 194 | (incf pending) 195 | (incf input-index) 196 | (go INPUT-AVAILABLE-CHECK))) 197 | (t 198 | (setf output-pending 4) 199 | (go OUTPUT-SPACE-CHECK))) 200 | DONE 201 | (unless lastp 202 | (go RESTORE-STATE)) 203 | (setf (base85-decode-state-finished-input-p state) t) 204 | ;; We should *always* have a complete group or nothing at this 205 | ;; point. 206 | EOT-VALIDITY-CHECK 207 | (when (<= 1 pending 4) 208 | (error "invalid base85 input")) 209 | (setf output-pending (if (zerop pending) 0 4)) 210 | FLUSH-BITS 211 | (when (zerop output-pending) 212 | (go RESTORE-STATE)) 213 | FLUSH-OUTPUT-CHECK 214 | (when (>= output-index output-end) 215 | (go RESTORE-STATE)) 216 | DO-FLUSH-OUTPUT 217 | (when (> output-pending 0) 218 | (setf (aref output output-index) 219 | (ldb (byte 8 (* (decf output-pending) 8)) bits)) 220 | (incf output-index) 221 | (cond 222 | ((zerop output-pending) 223 | (setf bits 0) 224 | (setf pending 0) 225 | (setf output-pending 0) 226 | (go RESTORE-STATE)) 227 | (t 228 | (go FLUSH-OUTPUT-CHECK)))) 229 | RESTORE-STATE 230 | (setf (base85-decode-state-bits state) bits 231 | (base85-decode-state-pending state) pending 232 | (base85-decode-state-output-pending state) output-pending)) 233 | (values input-index output-index))) 234 | 235 | (defun decoded-length-base85 (length) 236 | (multiple-value-bind (n-groups rem) (truncate length 5) 237 | (unless (zerop rem) 238 | (error "base85 input length ~D must be a multiple of 5" length)) 239 | (* n-groups 4))) 240 | 241 | (define-format :base85 242 | :encode-state-maker make-base85-encode-state 243 | :decode-state-maker make-base85-decode-state 244 | :encode-length-fun encoded-length-base85 245 | :decode-length-fun decoded-length-base85 246 | :encoder-fun base85-encoder 247 | :decoder-fun base85-decoder) 248 | -------------------------------------------------------------------------------- /streams.lisp: -------------------------------------------------------------------------------- 1 | ;;;; streams.lisp -- a gray streams interface to octet encoding. 2 | 3 | (cl:in-package :binascii) 4 | 5 | 6 | ;;; portability definitions 7 | 8 | #+cmu 9 | (eval-when (:compile-toplevel :load-toplevel :execute) 10 | (require :gray-streams)) 11 | 12 | ;;; TRIVIAL-GRAY-STREAMS has it, we might as well, too... 13 | #+allegro 14 | (eval-when (:compile-toplevel :load-toplevel :execute) 15 | (unless (fboundp 'stream:stream-write-string) 16 | (require "streamc.fasl"))) 17 | 18 | (eval-when (:compile-toplevel :load-toplevel :execute) 19 | (defvar *binary-input-stream-class* 20 | (quote 21 | #+lispworks stream:fundamental-binary-input-stream 22 | #+sbcl sb-gray:fundamental-binary-input-stream 23 | #+openmcl gray:fundamental-binary-input-stream 24 | #+cmu ext:fundamental-binary-input-stream 25 | #+allegro excl:fundamental-binary-input-stream 26 | #-(or lispworks sbcl openmcl cmu allegro) 27 | (error "octet streams not supported in this implementation"))) 28 | 29 | (defvar *binary-output-stream-class* 30 | (quote 31 | #+lispworks stream:fundamental-binary-output-stream 32 | #+sbcl sb-gray:fundamental-binary-output-stream 33 | #+openmcl gray:fundamental-binary-output-stream 34 | #+cmu ext:fundamental-binary-output-stream 35 | #+allegro excl:fundamental-binary-output-stream 36 | #-(or lispworks sbcl openmcl cmu allegro) 37 | (error "octet streams not supported in this implementation"))) 38 | 39 | ;;; FIXME: how to do CMUCL support for this? 40 | (defvar *stream-element-type-function* 41 | (quote 42 | #+lispworks cl:stream-element-type 43 | #+sbcl sb-gray::stream-element-type 44 | #+openmcl cl:stream-element-type 45 | #+cmu cl:stream-element-type 46 | #+allegro cl:stream-element-type 47 | #-(or lispworks sbcl openmcl cmu allegro) 48 | (error "octet streams not supported in this implementation"))) 49 | 50 | (defvar *stream-read-byte-function* 51 | (quote 52 | #+lispworks stream:stream-read-byte 53 | #+sbcl sb-gray:stream-read-byte 54 | #+openmcl gray:stream-read-byte 55 | #+cmu ext:stream-read-byte 56 | #+allegro excl:stream-read-byte 57 | #-(or lispworks sbcl openmcl cmu allegro) 58 | (error "octet streams not supported in this implementation"))) 59 | 60 | (defvar *stream-write-byte-function* 61 | (quote 62 | #+lispworks stream:stream-write-byte 63 | #+sbcl sb-gray:stream-write-byte 64 | #+openmcl gray:stream-write-byte 65 | #+cmu ext:stream-write-byte 66 | #+allegro excl:stream-write-byte 67 | #-(or lispworks sbcl openmcl cmu allegro) 68 | (error "octet streams not supported in this implementation"))) 69 | 70 | (defvar *stream-read-sequence-function* 71 | (quote 72 | #+lispworks stream:stream-read-sequence 73 | #+sbcl sb-gray:stream-read-sequence 74 | #+openmcl ccl:stream-read-vector 75 | #+cmu ext:stream-read-sequence 76 | #+allegro excl:stream-read-sequence 77 | #-(or lispworks sbcl openmcl cmu allegro) 78 | (error "octet streams not supported in this implementation"))) 79 | 80 | (defvar *stream-write-sequence-function* 81 | (quote 82 | #+lispworks stream:stream-write-sequence 83 | #+sbcl sb-gray:stream-write-sequence 84 | #+openmcl ccl:stream-write-vector 85 | #+cmu ext:stream-write-sequence 86 | #+allegro excl:stream-write-sequence 87 | #-(or lispworks sbcl openmcl cmu allegro) 88 | (error "octet streams not supported in this implementation"))) 89 | 90 | (defvar *stream-finish-output-function* 91 | (quote 92 | #+lispworks stream:stream-finish-output 93 | #+sbcl sb-gray:stream-finish-output 94 | #+openmcl gray:stream-finish-output 95 | #+cmu ext:stream-finish-output 96 | #+allegro excl:stream-finish-output 97 | #-(or lispworks sbcl openmcl cmu allegro) 98 | (error "octet streams not supported in this implementation"))) 99 | 100 | (defvar *stream-force-output-function* 101 | (quote 102 | #+lispworks stream:stream-force-output 103 | #+sbcl sb-gray:stream-force-output 104 | #+openmcl gray:stream-force-output 105 | #+cmu ext:stream-force-output 106 | #+allegro excl:stream-force-output 107 | #-(or lispworks sbcl openmcl cmu allegro) 108 | (error "octet streams not supported in this implementation"))) 109 | 110 | (defvar *stream-clear-output-function* 111 | (quote 112 | #+lispworks stream:stream-clear-output 113 | #+sbcl sb-gray:stream-clear-output 114 | #+openmcl gray:stream-clear-output 115 | #+cmu ext:stream-clear-output 116 | #+allegro excl:stream-clear-output 117 | #-(or lispworks sbcl openmcl cmu allegro) 118 | (error "octet streams not supported in this implementation"))) 119 | ) 120 | 121 | (defmacro define-stream-write-sequence (specializer type &body body) 122 | #+sbcl 123 | `(defmethod sb-gray:stream-write-sequence ((stream ,specializer) seq &optional (start 0) end) 124 | (typecase seq 125 | (,type 126 | (let ((end (or end (length seq)))) 127 | ,@body)) 128 | (t 129 | (call-next-method)))) 130 | #+cmu 131 | `(defmethod ext:stream-write-sequence ((stream ,specializer) seq &optional (start 0) end) 132 | (typecase seq 133 | (,type 134 | (let ((end (or end (length seq)))) 135 | ,@body)) 136 | (t 137 | (call-next-method)))) 138 | #+allegro 139 | `(defmethod stream:stream-write-sequence ((stream ,specializer) seq &optional (start 0) end) 140 | (typecase seq 141 | (,type 142 | (let ((end (or end (length seq)))) 143 | ,@body)) 144 | (t 145 | (call-next-method)))) 146 | #+openmcl 147 | `(defmethod ccl:stream-write-vector ((stream ,specializer) seq start end) 148 | (typecase seq 149 | (,type 150 | ,@body) 151 | (t 152 | (call-next-method)))) 153 | #+lispworks 154 | `(defmethod stream:stream-write-sequence ((stream ,specializer) seq start end) 155 | (typecase seq 156 | (,type 157 | ,@body) 158 | (t 159 | (call-next-method))))) 160 | 161 | ;;; encoding streams 162 | 163 | (defclass encoding-stream (#.*binary-output-stream-class*) 164 | ((buffer :reader buffer :initarg :buffer) 165 | (index :accessor index :initform 0) 166 | (encode-fun :reader encode-fun :initarg :encode-fun) 167 | (encode-table :reader encode-table :initarg :encode-table) 168 | (writer :reader writer :initarg :writer))) 169 | 170 | (defun make-encoding-stream (destination format &key (element-type 'base-char)) 171 | "Return a stream that encodes octets written to it according to FORMAT and 172 | writes the results to DESTINATION. 173 | 174 | If DESTINATION is a STREAM, then the result is written to DESTINATION using 175 | WRITE-CHAR or WRITE-BYTE as chosen by ELEMENT-TYPE. 176 | 177 | If ELEMENT-TYPE is a subtype of CHARACTER, then DESTINATION may also be a 178 | string with a fill pointer. The result is written to the string as if by use 179 | of VECTOR-PUSH-EXTEND. Similarly, if ELEMENT-TYPE is (UNSIGNED-BYTE 8) or an 180 | equivalent type, then DESTINATION may be an octet vector with a fill pointer. 181 | 182 | The advantage of using this versus ENCODE-OCTETS is that ENCODE-OCTETS 183 | is only useful if you have the entire entity to be encoded available. 184 | With a stream, you can write the results incrementally, thereby saving 185 | memory. Please note that you do have to call CLOSE, FINISH-OUTPUT, or 186 | FORCE-OUTPUT once you are done encoding data so that any buffered input 187 | may be encoded appropriately." 188 | (multiple-value-bind (encode-fun length-fun table) (encoding-tools format) 189 | (let ((canonical-element-type (canonicalize-element-type element-type))) 190 | ;; FIXME: is it worth supporting this case and saving the user a 191 | ;; smidgen of coding? 192 | (when (null destination) 193 | (case canonical-element-type 194 | ((character base-char) 195 | (setf destination (make-string-output-stream 196 | :element-type canonical-element-type))) 197 | (octet 198 | ;; No octet streams in CLHS, so just output to an adjustable 199 | ;; octet vector. 200 | (setf destination (make-array 128 :element-type '(unsigned-byte 8) 201 | :fill-pointer 0 :adjustable t))))) 202 | (multiple-value-bind (writer return-value) 203 | (determine-encoding-writer destination 0 canonical-element-type) 204 | (declare (ignore return-value)) 205 | (make-instance 'encoding-stream 206 | :encode-fun encode-fun 207 | :encode-table table 208 | :writer writer))))) 209 | 210 | (defmethod #.*stream-write-byte-function* ((stream encoding-stream) byte) 211 | (let ((v (make-array 1 :element-type '(unsigned-byte 8) 212 | :initial-element byte))) 213 | (write-sequence v stream))) 214 | 215 | (define-stream-write-sequence encoding-stream (simple-array (unsigned-byte 8) (*)) 216 | (loop with buffer = (buffer stream) 217 | with index = (index stream) 218 | with chunk-size = (length buffer) 219 | with length = (- end start) 220 | with encode-fun of-type function = (encode-fun stream) 221 | with table = (encode-table stream) 222 | with writer = (writer stream) 223 | initially (unless (zerop index) 224 | (let ((to-copy (min (- chunk-size index) length))) 225 | (replace buffer seq :start1 index :start2 start :end2 end) 226 | (decf length to-copy) 227 | (incf index to-copy) 228 | (incf start to-copy) 229 | (cond 230 | ((= index chunk-size) 231 | (funcall encode-fun 232 | buffer 0 chunk-size 233 | table writer) 234 | (setf index 0)) 235 | (t (return-from #.*stream-write-sequence-function* start))))) 236 | while (> length chunk-size) 237 | do (funcall encode-fun seq start (+ start chunk-size) table writer) 238 | (decf length chunk-size) 239 | (incf start chunk-size) 240 | finally 241 | (unless (plusp length) 242 | (replace buffer seq :start1 0 :start2 start :end2 end) 243 | (setf (index stream) length) 244 | (incf start length)) 245 | (return start))) 246 | 247 | (defmethod #.*stream-finish-output-function* ((stream encoding-stream)) 248 | (flush-buffer stream) 249 | nil) 250 | 251 | (defmethod #.*stream-force-output-function* ((stream encoding-stream)) 252 | (flush-buffer stream) 253 | nil) 254 | 255 | (defmethod #.*stream-clear-output-function* ((stream encoding-stream)) 256 | (setf (index stream) 0) 257 | nil) 258 | 259 | -------------------------------------------------------------------------------- /base64.lisp: -------------------------------------------------------------------------------- 1 | ;;; base64.lisp -- The base64 encoding, defined in RFC 3548 and 4648. 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *base64-encode-table* 6 | #.(coerce "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 'simple-base-string)) 7 | 8 | (defvar *base64url-encode-table* 9 | #.(coerce "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" 'simple-base-string)) 10 | 11 | (defstruct (base64-encode-state 12 | (:include encode-state) 13 | (:copier nil) 14 | (:predicate nil) 15 | (:constructor make-base64-encode-state 16 | (&aux (descriptor (base64-format-descriptor)) 17 | (table *base64-encode-table*))) 18 | (:constructor make-base64url-encode-state 19 | (&aux (descriptor (base64-format-descriptor)) 20 | (table *base64url-encode-table*)))) 21 | (bits 0 :type (unsigned-byte 16)) 22 | (n-bits 0 :type (unsigned-byte 8)) 23 | (table *base64-encode-table* :read-only t :type (simple-array base-char (64))) 24 | (padding-remaining 0 :type (integer 0 3))) 25 | 26 | (declaim (notinline base64-encoder)) 27 | (defun base64-encoder (state output input 28 | output-index output-end 29 | input-index input-end lastp converter) 30 | (declare (type (or simple-string simple-octet-vector) output)) 31 | (declare (type base64-encode-state state)) 32 | (declare (type simple-octet-vector input)) 33 | (declare (type index output-index output-end input-index input-end)) 34 | (declare (type function converter)) 35 | (let ((bits (base64-encode-state-bits state)) 36 | (n-bits (base64-encode-state-n-bits state)) 37 | (table (base64-encode-state-table state))) 38 | (declare (type index input-index output-index)) 39 | (declare (type (unsigned-byte 16) bits)) 40 | (declare (type (integer 0 16) n-bits)) 41 | (tagbody 42 | PAD-CHECK 43 | (when (base64-encode-state-finished-input-p state) 44 | (go PAD)) 45 | INPUT-CHECK 46 | (when (>= input-index input-end) 47 | (go DONE)) 48 | DO-INPUT 49 | (when (< n-bits 6) 50 | (setf bits (ldb (byte 16 0) 51 | (logior (ash bits 8) (aref input input-index)))) 52 | (incf input-index) 53 | (incf n-bits 8)) 54 | OUTPUT-CHECK 55 | (when (>= output-index output-end) 56 | (go DONE)) 57 | DO-OUTPUT 58 | (decf n-bits 6) 59 | (setf (aref output output-index) 60 | (funcall converter (aref table (ldb (byte 6 n-bits) bits)))) 61 | (incf output-index) 62 | (if (>= n-bits 6) 63 | (go OUTPUT-CHECK) 64 | (go INPUT-CHECK)) 65 | DONE 66 | (unless lastp 67 | (go RESTORE-STATE)) 68 | (setf (base64-encode-state-finished-input-p state) t) 69 | (cond 70 | ((= n-bits 2) 71 | (setf (base64-encode-state-padding-remaining state) 3)) 72 | ((= n-bits 4) 73 | (setf (base64-encode-state-padding-remaining state) 2))) 74 | PAD 75 | (cond 76 | ((or (zerop n-bits) 77 | (zerop (base64-encode-state-padding-remaining state))) 78 | (go RESTORE-STATE)) 79 | ((= n-bits 2) 80 | (go DO-PAD-FOR-2-BITS)) 81 | ((= n-bits 4) 82 | (go DO-PAD-FOR-4-BITS))) 83 | DO-PAD-FOR-2-BITS 84 | (let ((padding-remaining (base64-encode-state-padding-remaining state))) 85 | (declare (type (integer 0 3) padding-remaining)) 86 | (when (and (>= padding-remaining 3) 87 | (< output-index output-end)) 88 | (setf (aref output output-index) 89 | (funcall converter 90 | (aref table (ash (ldb (byte 2 0) bits) 4)))) 91 | (incf output-index) 92 | (decf padding-remaining)) 93 | (when (and (>= padding-remaining 2) 94 | (< output-index output-end)) 95 | (setf (aref output output-index) (funcall converter #\=)) 96 | (incf output-index) 97 | (decf padding-remaining)) 98 | (when (and (>= padding-remaining 1) 99 | (< output-index output-end)) 100 | (setf (aref output output-index) (funcall converter #\=)) 101 | (incf output-index) 102 | (decf padding-remaining)) 103 | (when (zerop padding-remaining) 104 | (setf n-bits 0)) 105 | (setf (base64-encode-state-padding-remaining state) padding-remaining) 106 | (go RESTORE-STATE)) 107 | DO-PAD-FOR-4-BITS 108 | (let ((padding-remaining (base64-encode-state-padding-remaining state))) 109 | (declare (type (integer 0 3) padding-remaining)) 110 | (when (and (>= padding-remaining 2) 111 | (< output-index output-end)) 112 | (setf (aref output output-index) 113 | (funcall converter 114 | (aref table (ash (ldb (byte 4 0) bits) 2)))) 115 | (incf output-index) 116 | (decf padding-remaining)) 117 | (when (and (>= padding-remaining 1) 118 | (< output-index output-end)) 119 | (setf (aref output output-index) (funcall converter #\=)) 120 | (incf output-index) 121 | (decf padding-remaining)) 122 | (when (zerop padding-remaining) 123 | (setf n-bits 0)) 124 | (setf (base64-encode-state-padding-remaining state) padding-remaining) 125 | (go RESTORE-STATE)) 126 | RESTORE-STATE 127 | (setf (base64-encode-state-bits state) bits 128 | (base64-encode-state-n-bits state) n-bits)) 129 | (values input-index output-index))) 130 | 131 | (defun encoded-length-base64 (count) 132 | "Return the number of characters required to encode COUNT octets in Base64." 133 | (* (ceiling count 3) 4)) 134 | 135 | (defvar *base64-decode-table* 136 | (make-decode-table *base64-encode-table*)) 137 | (declaim (type decode-table *base64-decode-table*)) 138 | 139 | (defvar *base64url-decode-table* 140 | (make-decode-table *base64url-encode-table*)) 141 | (declaim (type decode-table *base64url-decode-table*)) 142 | 143 | (defstruct (base64-decode-state 144 | (:include decode-state) 145 | (:copier nil) 146 | (:predicate nil) 147 | (:constructor %make-base64-decode-state 148 | (table 149 | &aux (descriptor (base64-format-descriptor))))) 150 | (bits 0 :type (unsigned-byte 16)) 151 | (n-bits 0 :type (unsigned-byte 8)) 152 | (padding-remaining 0 :type (integer 0 3)) 153 | (table *base64-decode-table* :read-only t :type decode-table)) 154 | 155 | (defun make-base64-decode-state (case-fold map01) 156 | (declare (ignore case-fold map01)) 157 | (%make-base64-decode-state *base64-decode-table*)) 158 | 159 | (defun make-base64url-decode-state (case-fold map01) 160 | (declare (ignore case-fold map01)) 161 | (%make-base64-decode-state *base64url-decode-table*)) 162 | 163 | (defun base64-decoder (state output input 164 | output-index output-end 165 | input-index input-end lastp converter) 166 | (declare (type base64-decode-state state)) 167 | (declare (type simple-octet-vector output)) 168 | (declare (type index output-index output-end input-index input-end)) 169 | (declare (type function converter)) 170 | (let ((bits (base64-decode-state-bits state)) 171 | (n-bits (base64-decode-state-n-bits state)) 172 | (padding-remaining (base64-decode-state-padding-remaining state)) 173 | (table (base64-decode-state-table state))) 174 | (declare (type (unsigned-byte 16) bits)) 175 | (declare (type fixnum n-bits)) 176 | (declare (type (integer 0 6) padding-remaining)) 177 | (tagbody 178 | PAD-CHECK 179 | (when (base64-decode-state-finished-input-p state) 180 | (go EAT-EQUAL-CHECK-PAD)) 181 | OUTPUT-AVAILABLE-CHECK 182 | (when (< n-bits 8) 183 | (go INPUT-AVAILABLE-CHECK)) 184 | OUTPUT-SPACE-CHECK 185 | (when (>= output-index output-end) 186 | (go DONE)) 187 | DO-OUTPUT 188 | (decf n-bits 8) 189 | (setf (aref output output-index) (logand (ash bits (- n-bits)) #xff) 190 | bits (logand bits #xff)) 191 | (incf output-index) 192 | (go INPUT-AVAILABLE-CHECK) 193 | INPUT-AVAILABLE-CHECK 194 | (when (>= input-index input-end) 195 | (go DONE)) 196 | DO-INPUT 197 | (let* ((c (aref input input-index)) 198 | (v (funcall converter c)) 199 | (d (dtref table v))) 200 | (when (= v (if (typep input 'simple-octet-vector) 201 | (char-code #\=) 202 | (funcall converter #\=))) 203 | (go SAW-EQUAL)) 204 | (when (= d +dt-invalid+) 205 | (error "invalid base64 character ~A at position ~D" c input-index)) 206 | (incf input-index) 207 | (setf bits (ldb (byte 16 0) (logior (ash bits 6) d))) 208 | (incf n-bits 6) 209 | (go OUTPUT-AVAILABLE-CHECK)) 210 | DONE 211 | (unless lastp 212 | (go RESTORE-STATE)) 213 | SAW-EQUAL 214 | (setf (base64-decode-state-finished-input-p state) t) 215 | (cond 216 | ((zerop n-bits) 217 | (go RESTORE-STATE)) 218 | ((= n-bits 2) 219 | (setf padding-remaining 3)) 220 | ((= n-bits 4) 221 | (setf padding-remaining 2))) 222 | EAT-EQUAL-CHECK-PAD 223 | (when (zerop padding-remaining) 224 | (go RESTORE-STATE)) 225 | EAT-EQUAL-CHECK-INPUT 226 | (when (>= input-index input-end) 227 | (go RESTORE-STATE)) 228 | EAT-EQUAL 229 | (let ((v (aref input input-index))) 230 | (unless (= (funcall converter v) 231 | (if (typep input 'simple-octet-vector) 232 | (char-code #\=) 233 | (funcall converter #\=))) 234 | (error "invalid base64 input ~A at position ~D" v input-index)) 235 | (incf input-index) 236 | (decf padding-remaining) 237 | (go EAT-EQUAL-CHECK-PAD)) 238 | RESTORE-STATE 239 | (setf (base64-decode-state-n-bits state) n-bits 240 | (base64-decode-state-bits state) bits 241 | (base64-decode-state-padding-remaining state) padding-remaining)) 242 | (values input-index output-index))) 243 | 244 | (defun decoded-length-base64 (length) 245 | (* (ceiling length 4) 3)) 246 | 247 | (define-format :base64 248 | :encode-state-maker make-base64-encode-state 249 | :decode-state-maker make-base64-decode-state 250 | :encode-length-fun encoded-length-base64 251 | :decode-length-fun decoded-length-base64 252 | :encoder-fun base64-encoder 253 | :decoder-fun base64-decoder) 254 | (define-format :base64url 255 | :encode-state-maker make-base64url-encode-state 256 | :decode-state-maker make-base64url-decode-state 257 | :encode-length-fun encoded-length-base64 258 | :decode-length-fun decoded-length-base64 259 | :encoder-fun base64-encoder 260 | :decoder-fun base64-decoder) 261 | -------------------------------------------------------------------------------- /ascii85.lisp: -------------------------------------------------------------------------------- 1 | ;;;; ascii85.lisp -- The ascii85 encoding, as used in PDF and btoa/atob. 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *ascii85-encode-table* 6 | #.(coerce "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstu" 'simple-base-string)) 7 | 8 | (defstruct (ascii85-encode-state 9 | (:include encode-state) 10 | (:copier nil) 11 | (:predicate nil) 12 | (:constructor make-ascii85-encode-state 13 | (&aux (descriptor (ascii85-format-descriptor))))) 14 | (bits 0 :type (unsigned-byte 32)) 15 | (pending 0 :type (integer 0 4)) 16 | (output-group (make-array 5 :element-type 'base-char) 17 | :read-only t :type (simple-array base-char (5))) 18 | (group-index 0 :type (integer 0 4)) 19 | (output-pending 0 :type (integer 0 5)) 20 | (table *ascii85-encode-table* :read-only t 21 | :type (simple-array base-char (85)))) 22 | 23 | (defun encoded-length-ascii85 (count) 24 | "Return the number of characters required to encode COUNT octets in Ascii85." 25 | (multiple-value-bind (q r) (truncate count 4) 26 | (let ((complete (* q 5))) 27 | (if (zerop r) 28 | complete 29 | (+ complete r 1))))) 30 | 31 | (declaim (notinline ascii85-encoder)) 32 | (defun ascii85-encoder (state output input 33 | output-index output-end 34 | input-index input-end lastp converter) 35 | (declare (type ascii85-encode-state state)) 36 | (declare (type simple-octet-vector input)) 37 | (declare (type index output-index output-end input-index input-end)) 38 | (declare (type function converter)) 39 | (let ((bits (ascii85-encode-state-bits state)) 40 | (pending (ascii85-encode-state-pending state)) 41 | (output-group (ascii85-encode-state-output-group state)) 42 | (group-index (ascii85-encode-state-group-index state)) 43 | (output-pending (ascii85-encode-state-output-pending state))) 44 | (declare (type index input-index output-index)) 45 | (declare (type (unsigned-byte 32) bits)) 46 | (declare (type (integer 0 4) pending)) 47 | (declare (type (integer 0 5) output-pending group-index)) 48 | (flet ((expand-for-output (bits output-group) 49 | (cond 50 | ((zerop bits) 51 | (setf (aref output-group 0) #\z) 52 | 1) 53 | (t 54 | (loop for i from 4 downto 0 55 | do (multiple-value-bind (b index) (truncate bits 85) 56 | (setf bits b 57 | (aref output-group i) 58 | (code-char (+ #.(char-code #\!) index)))) 59 | finally (return 5)))))) 60 | (tagbody 61 | PAD-CHECK 62 | (when (ascii85-encode-state-finished-input-p state) 63 | (go FLUSH-BITS)) 64 | INPUT-CHECK 65 | (when (>= input-index input-end) 66 | (go DONE)) 67 | DO-INPUT 68 | (when (< pending 4) 69 | (setf bits (ldb (byte 32 0) 70 | (logior (ash (aref input input-index) 71 | (- 24 (* pending 8))) 72 | bits))) 73 | (incf input-index) 74 | (incf pending) 75 | (go INPUT-CHECK)) 76 | EXPAND-FOR-OUTPUT 77 | (setf output-pending (expand-for-output bits output-group) 78 | group-index 0) 79 | OUTPUT-CHECK 80 | (when (>= output-index output-end) 81 | (go DONE)) 82 | DO-OUTPUT 83 | (when (< group-index output-pending) 84 | (setf (aref output output-index) 85 | (funcall converter 86 | (aref output-group group-index))) 87 | (incf group-index) 88 | (incf output-index) 89 | (cond 90 | ((= group-index output-pending) 91 | (setf bits 0) 92 | (setf pending 0) 93 | (setf group-index 0) 94 | (setf output-pending 0) 95 | (go INPUT-CHECK)) 96 | (t 97 | (go OUTPUT-CHECK)))) 98 | DONE 99 | (unless lastp 100 | (go RESTORE-STATE)) 101 | (setf (ascii85-encode-state-finished-input-p state) t) 102 | (setf output-pending (expand-for-output bits output-group) 103 | group-index 0) 104 | FLUSH-BITS 105 | (when (zerop output-pending) 106 | (go RESTORE-STATE)) 107 | FLUSH-OUTPUT-CHECK 108 | (when (>= output-index output-end) 109 | (go RESTORE-STATE)) 110 | DO-FLUSH-OUTPUT 111 | (when (< group-index output-pending) 112 | (setf (aref output output-index) 113 | (funcall converter 114 | (aref output-group group-index))) 115 | (incf group-index) 116 | (incf output-index) 117 | (cond 118 | ((= group-index output-pending) 119 | (setf bits 0) 120 | (setf pending 0) 121 | (setf group-index 0) 122 | (setf output-pending 0) 123 | (go RESTORE-STATE)) 124 | (t 125 | (go FLUSH-OUTPUT-CHECK)))) 126 | RESTORE-STATE 127 | (setf (ascii85-encode-state-bits state) bits 128 | (ascii85-encode-state-pending state) pending 129 | (ascii85-encode-state-group-index state) group-index 130 | (ascii85-encode-state-output-pending state) output-pending)) 131 | (values input-index output-index)))) 132 | 133 | (defvar *ascii85-decode-table* (make-decode-table *ascii85-encode-table*)) 134 | (declaim (type decode-table *ascii85-decode-table*)) 135 | 136 | (defstruct (ascii85-decode-state 137 | (:include decode-state) 138 | (:copier nil) 139 | (:predicate nil) 140 | (:constructor %make-ascii85-decode-state 141 | (&aux (descriptor (ascii85-format-descriptor))))) 142 | (bits 0 :type (unsigned-byte 32)) 143 | (pending 0 :type (integer 0 5)) 144 | (output-pending 0 :type (integer 0 4)) 145 | (table *ascii85-decode-table* :read-only t :type decode-table)) 146 | 147 | (defun make-ascii85-decode-state (case-fold map01) 148 | (declare (ignore case-fold map01)) 149 | (%make-ascii85-decode-state)) 150 | 151 | (defun ascii85-decoder (state output input 152 | output-index output-end 153 | input-index input-end lastp converter) 154 | (declare (type ascii85-decode-state state)) 155 | (declare (type simple-octet-vector output)) 156 | (declare (type index output-index output-end input-index input-end)) 157 | (declare (type function converter)) 158 | (let ((bits (ascii85-decode-state-bits state)) 159 | (pending (ascii85-decode-state-pending state)) 160 | (output-pending (ascii85-decode-state-output-pending state)) 161 | (table (ascii85-decode-state-table state))) 162 | (declare (type (unsigned-byte 32) bits)) 163 | (declare (type (integer 0 5) pending)) 164 | (declare (type (integer 0 4) output-pending)) 165 | (tagbody 166 | FINISHED-CHECK 167 | (when (ascii85-decode-state-finished-input-p state) 168 | (go FLUSH-BITS)) 169 | OUTPUT-AVAILABLE-CHECK 170 | (when (zerop output-pending) 171 | (go INPUT-AVAILABLE-CHECK)) 172 | OUTPUT-SPACE-CHECK 173 | (when (>= output-index output-end) 174 | (go DONE)) 175 | DO-OUTPUT 176 | (setf (aref output output-index) 177 | (ldb (byte 8 (* (decf output-pending) 8)) bits)) 178 | (incf output-index) 179 | (cond 180 | ((zerop output-pending) 181 | (setf bits 0) 182 | (setf pending 0) 183 | (setf output-pending 0) 184 | (go INPUT-AVAILABLE-CHECK)) 185 | (t 186 | (go OUTPUT-SPACE-CHECK))) 187 | INPUT-AVAILABLE-CHECK 188 | (when (>= input-index input-end) 189 | (go DONE)) 190 | DO-INPUT 191 | (cond 192 | ((< pending 5) 193 | (let* ((c (aref input input-index)) 194 | (v (funcall converter c)) 195 | (d (dtref table v))) 196 | (cond 197 | ((eql v (if (typep input 'simple-octet-vector) 198 | (char-code #\z) 199 | (funcall converter #\z))) 200 | (unless (zerop pending) 201 | (error "z found in the middle of an ascii85 group")) 202 | (incf input-index) 203 | (setf output-pending 4) 204 | (go OUTPUT-SPACE-CHECK)) 205 | ((= d +dt-invalid+) 206 | (error "invalid ascii85 character ~A at position ~D" c input-index)) 207 | (t 208 | ;; FIXME: check for overflow. 209 | (setf bits (+ (* bits 85) d)) 210 | (incf pending) 211 | (incf input-index) 212 | (go INPUT-AVAILABLE-CHECK))))) 213 | (t 214 | (setf output-pending 4) 215 | (go OUTPUT-SPACE-CHECK))) 216 | DONE 217 | (unless lastp 218 | (go RESTORE-STATE)) 219 | (setf (ascii85-decode-state-finished-input-p state) t) 220 | EOT-VALIDITY-CHECK 221 | (when (zerop pending) 222 | (go RESTORE-STATE)) 223 | (when (= pending 1) 224 | (error "invalid ascii85 input")) 225 | (dotimes (i (- 5 pending)) 226 | (setf bits (+ (* bits 85) 84))) 227 | (setf output-pending (1- pending) 228 | bits (ldb (byte (* output-pending 8) (* (- 4 output-pending) 8)) 229 | bits)) 230 | FLUSH-BITS 231 | (when (zerop output-pending) 232 | (go RESTORE-STATE)) 233 | FLUSH-OUTPUT-CHECK 234 | (when (>= output-index output-end) 235 | (go RESTORE-STATE)) 236 | DO-FLUSH-OUTPUT 237 | (when (> output-pending 0) 238 | (setf (aref output output-index) 239 | (ldb (byte 8 (* (decf output-pending) 8)) bits)) 240 | (incf output-index) 241 | (cond 242 | ((zerop output-pending) 243 | (setf bits 0) 244 | (setf pending 0) 245 | (setf output-pending 0) 246 | (go RESTORE-STATE)) 247 | (t 248 | (go FLUSH-OUTPUT-CHECK)))) 249 | RESTORE-STATE 250 | (setf (ascii85-decode-state-bits state) bits 251 | (ascii85-decode-state-pending state) pending 252 | (ascii85-decode-state-output-pending state) output-pending)) 253 | (values input-index output-index))) 254 | 255 | (defun decoded-length-ascii85 (length) 256 | ;; FIXME: There's nothing smart we can do without scanning the string. 257 | ;; We have to assume the worst case, that all the characters in the 258 | ;; string are #\z. 259 | (* length 5)) 260 | 261 | (define-format :ascii85 262 | :encode-state-maker make-ascii85-encode-state 263 | :decode-state-maker make-ascii85-decode-state 264 | :encode-length-fun encoded-length-ascii85 265 | :decode-length-fun decoded-length-ascii85 266 | :encoder-fun ascii85-encoder 267 | :decoder-fun ascii85-decoder) 268 | -------------------------------------------------------------------------------- /base32.lisp: -------------------------------------------------------------------------------- 1 | ;;;; base32.lisp -- The base32 encoding, defined in RFC 3548 and 4648. 2 | 3 | (cl:in-package :binascii) 4 | 5 | (defvar *base32-encode-table* 6 | #.(coerce "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" 'simple-base-string)) 7 | (defvar *base32hex-encode-table* 8 | #.(coerce "0123456789ABCDEFGHIJKLMNOPQRSTUV" 'simple-base-string)) 9 | 10 | (defstruct (base32-encode-state 11 | (:include encode-state) 12 | (:copier nil) 13 | (:predicate nil) 14 | (:constructor make-base32-encode-state 15 | (&aux (descriptor (base32-format-descriptor)) 16 | (table *base32-encode-table*))) 17 | (:constructor make-base32hex-encode-state 18 | (&aux (descriptor (base32-format-descriptor)) 19 | (table *base32hex-encode-table*)))) 20 | (bits 0 :type (unsigned-byte 16)) 21 | (n-bits 0 :type (unsigned-byte 8)) 22 | (table *base32-encode-table* :read-only t 23 | :type (simple-array base-char (32))) 24 | (padding-remaining 0 :type (integer 0 6))) 25 | 26 | (declaim (inline base32-encoder)) 27 | (defun base32-encoder (state output input 28 | output-index output-end 29 | input-index input-end lastp converter) 30 | (declare (type base32-encode-state state)) 31 | (declare (type simple-octet-vector input)) 32 | (declare (type index output-index output-end input-index input-end)) 33 | (declare (type function converter)) 34 | (let ((bits (base32-encode-state-bits state)) 35 | (n-bits (base32-encode-state-n-bits state)) 36 | (table (base32-encode-state-table state)) 37 | (n-pad-chars #.(make-array 5 :initial-contents '(0 4 1 6 3) 38 | :element-type 'fixnum))) 39 | 40 | (declare (type index input-index output-index)) 41 | (declare (type (unsigned-byte 16) bits)) 42 | (declare (type (unsigned-byte 8) n-bits)) 43 | (declare (type (simple-array fixnum (5)) n-pad-chars)) 44 | (tagbody 45 | PAD-CHECK 46 | (when (base32-encode-state-finished-input-p state) 47 | (go PAD)) 48 | INPUT-CHECK 49 | (when (>= input-index input-end) 50 | (go DONE)) 51 | DO-INPUT 52 | (when (< n-bits 5) 53 | (setf bits (ldb (byte 16 0) 54 | (logior (ash bits 8) (aref input input-index)))) 55 | (incf input-index) 56 | (incf n-bits 8)) 57 | OUTPUT-CHECK 58 | (when (>= output-index output-end) 59 | (go DONE)) 60 | DO-OUTPUT 61 | (decf n-bits 5) 62 | (setf (aref output output-index) 63 | (funcall converter (aref table (ldb (byte 5 n-bits) bits)))) 64 | (incf output-index) 65 | (if (>= n-bits 5) 66 | (go OUTPUT-CHECK) 67 | (go INPUT-CHECK)) 68 | DONE 69 | (unless lastp 70 | (go RESTORE-STATE)) 71 | (setf (base32-encode-state-finished-input-p state) t) 72 | (setf (base32-encode-state-padding-remaining state) 73 | (aref n-pad-chars n-bits)) 74 | PAD 75 | (locally (declare (type (integer 0 4) n-bits)) 76 | (let ((padding-remaining (base32-encode-state-padding-remaining state)) 77 | (max-pad-chars (aref n-pad-chars n-bits))) 78 | (declare (type (integer 0 6) padding-remaining)) 79 | (declare (type (integer 0 6) max-pad-chars)) 80 | (when (and (= padding-remaining max-pad-chars) 81 | (< output-index output-end)) 82 | (setf (aref output output-index) 83 | (funcall converter 84 | (aref table (ash (ldb (byte n-bits 0) bits) 85 | (- 5 n-bits))))) 86 | (incf output-index)) 87 | (loop while (and (> padding-remaining 0) 88 | (< output-index output-end)) 89 | do (setf (aref output output-index) (funcall converter #\=)) 90 | (incf output-index) 91 | (decf padding-remaining)) 92 | (when (zerop padding-remaining) 93 | (setf n-bits 0)) 94 | (setf (base32-encode-state-padding-remaining state) padding-remaining))) 95 | RESTORE-STATE 96 | (setf (base32-encode-state-bits state) bits 97 | (base32-encode-state-n-bits state) n-bits)) 98 | (values input-index output-index))) 99 | 100 | (defvar *base32-decode-table* (make-decode-table *base32-encode-table*)) 101 | (defvar *base32hex-decode-table* (make-decode-table *base32hex-encode-table*)) 102 | (declaim (type decode-table *base32-decode-table* *base32hex-decode-table*)) 103 | 104 | (defun base32-decode-table (case-fold map01) 105 | (let ((table *base32-decode-table*)) 106 | (when map01 107 | (setf table (copy-seq table)) 108 | (setf (aref table (char-code #\0)) (aref table (char-code #\O))) 109 | (case map01 110 | ((#\I #\L) (setf (aref table (char-code #\1)) 111 | (aref table (char-code map01)))))) 112 | (when case-fold 113 | (setf table (case-fold-decode-table table *base32-encode-table*))) 114 | table)) 115 | 116 | (defstruct (base32-decode-state 117 | (:include decode-state) 118 | (:copier nil) 119 | (:predicate nil) 120 | (:constructor %make-base32-decode-state 121 | (table 122 | &aux (descriptor (base32-format-descriptor))))) 123 | (bits 0 :type (unsigned-byte 16)) 124 | (n-bits 0 :type (unsigned-byte 8)) 125 | (padding-remaining 0 :type (integer 0 6)) 126 | (table *base32-decode-table* :read-only t :type decode-table)) 127 | 128 | (defun make-base32-decode-state (case-fold map01) 129 | (%make-base32-decode-state (base32-decode-table case-fold map01))) 130 | 131 | (defun make-base32hex-decode-state (case-fold map01) 132 | (declare (ignore case-fold map01)) 133 | (%make-base32-decode-state *base32hex-decode-table*)) 134 | 135 | (defun base32-decoder (state output input 136 | output-index output-end 137 | input-index input-end lastp converter) 138 | (declare (type base32-decode-state state)) 139 | (declare (type simple-octet-vector output)) 140 | (declare (type index output-index output-end input-index input-end)) 141 | (declare (type function converter)) 142 | (let ((bits (base32-decode-state-bits state)) 143 | (n-bits (base32-decode-state-n-bits state)) 144 | (padding-remaining (base32-decode-state-padding-remaining state)) 145 | (table (base32-decode-state-table state))) 146 | (declare (type (unsigned-byte 16) bits)) 147 | (declare (type fixnum n-bits)) 148 | (declare (type (integer 0 6) padding-remaining)) 149 | (tagbody 150 | PAD-CHECK 151 | (when (base32-decode-state-finished-input-p state) 152 | (go EAT-EQUAL-CHECK-PAD)) 153 | OUTPUT-AVAILABLE-CHECK 154 | (when (< n-bits 8) 155 | (go INPUT-AVAILABLE-CHECK)) 156 | OUTPUT-SPACE-CHECK 157 | (when (>= output-index output-end) 158 | (go DONE)) 159 | DO-OUTPUT 160 | (decf n-bits 8) 161 | (setf (aref output output-index) (logand (ash bits (- n-bits)) #xff) 162 | bits (logand bits #xff)) 163 | (incf output-index) 164 | (go INPUT-AVAILABLE-CHECK) 165 | INPUT-AVAILABLE-CHECK 166 | (when (>= input-index input-end) 167 | (go DONE)) 168 | DO-INPUT 169 | (let* ((c (aref input input-index)) 170 | (v (funcall converter c)) 171 | (d (dtref table v))) 172 | (when (= v (if (typep input 'simple-octet-vector) 173 | (char-code #\=) 174 | (funcall converter #\=))) 175 | (go SAW-EQUAL)) 176 | (when (= d +dt-invalid+) 177 | (error "invalid base32 character ~A at position ~D" c input-index)) 178 | (incf input-index) 179 | (setf bits (ldb (byte 16 0) (logior (ash bits 5) d))) 180 | (incf n-bits 5) 181 | (go OUTPUT-AVAILABLE-CHECK)) 182 | DONE 183 | (unless lastp 184 | (go RESTORE-STATE)) 185 | SAW-EQUAL 186 | (setf (base32-decode-state-finished-input-p state) t) 187 | ;; A complete base32 group is: 188 | ;; 189 | ;; vvvvvvvv wwwwwwww xxxxxxxx yyyyyyyy zzzzzzzz 190 | ;; 191 | ;; which gets encoded by: 192 | ;; 193 | ;; vvvvv vvvww wwwww wxxxx xxxxy yyyyy yyzzz zzzzz 194 | ;; 195 | ;; so the intermediate bits left are: 3 1 4 2 0 196 | ;; corresponding to padding amounts : 6 4 3 1 0 (in characters) 197 | ;; 198 | ;; but we also have to handle cases where we start padding too 199 | ;; soon: we can't handle padding after seeing 1 group of 5, 3 200 | ;; groups of 5, 4 groups of 5 or 6 groups of five. those 201 | ;; correspond to 5 bits remaining (having not seen the 3 v's), 7 202 | ;; bits remaining (having not seen the 1 w), 4 bits remaining 203 | ;; (having not seen the 4 x's), and 6 bits remaining (having not 204 | ;; seen the 2 y's). 205 | (let ((n-pad-chars #.(make-array 5 :initial-contents '(0 4 1 6 3) 206 | :element-type 'fixnum))) 207 | (if (<= n-bits 4) 208 | (setf padding-remaining (aref n-pad-chars n-bits)) 209 | (error "invalid base32 input"))) 210 | EAT-EQUAL-CHECK-PAD 211 | (when (zerop padding-remaining) 212 | (go RESTORE-STATE)) 213 | EAT-EQUAL-CHECK-INPUT 214 | (when (>= input-index input-end) 215 | (go RESTORE-STATE)) 216 | EAT-EQUAL 217 | (let ((v (aref input input-index))) 218 | (unless (= (funcall converter v) 219 | (if (typep input 'simple-octet-vector) 220 | (char-code #\=) 221 | (funcall converter #\=))) 222 | (error "invalid base32 input ~A at position ~D" v input-index)) 223 | (incf input-index) 224 | (decf padding-remaining) 225 | (go EAT-EQUAL-CHECK-PAD)) 226 | RESTORE-STATE 227 | (setf (base32-decode-state-n-bits state) n-bits 228 | (base32-decode-state-bits state) bits 229 | (base32-decode-state-padding-remaining state) padding-remaining)) 230 | (values input-index output-index))) 231 | 232 | (defun encoded-length-base32 (count) 233 | "Return the number of characters required to encode COUNT octets in Base32." 234 | (* (ceiling count 5) 8)) 235 | 236 | (defun decoded-length-base32 (length) 237 | (* (ceiling length 8) 5)) 238 | 239 | (define-format :base32 240 | :encode-state-maker make-base32-encode-state 241 | :decode-state-maker make-base32-decode-state 242 | :encode-length-fun encoded-length-base32 243 | :decode-length-fun decoded-length-base32 244 | :encoder-fun base32-encoder 245 | :decoder-fun base32-decoder) 246 | (define-format :base32hex 247 | :encode-state-maker make-base32hex-encode-state 248 | :decode-state-maker make-base32hex-decode-state 249 | :encode-length-fun encoded-length-base32 250 | :decode-length-fun decoded-length-base32 251 | :encoder-fun base32-encoder 252 | :decoder-fun base32-decoder) 253 | -------------------------------------------------------------------------------- /tests/rt.lisp: -------------------------------------------------------------------------------- 1 | ;-*-syntax:COMMON-LISP;Package:(RT :use "COMMON-LISP" :colon-mode :external)-*- 2 | 3 | #|----------------------------------------------------------------------------| 4 | | Copyright 1990 by the Massachusetts Institute of Technology, Cambridge MA. | 5 | | | 6 | | Permission to use, copy, modify, and distribute this software and its | 7 | | documentation for any purpose and without fee is hereby granted, provided | 8 | | that this copyright and permission notice appear in all copies and | 9 | | supporting documentation, and that the name of M.I.T. not be used in | 10 | | advertising or publicity pertaining to distribution of the software | 11 | | without specific, written prior permission. M.I.T. makes no | 12 | | representations about the suitability of this software for any purpose. | 13 | | It is provided "as is" without express or implied warranty. | 14 | | | 15 | | M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING | 16 | | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL | 17 | | M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR | 18 | | ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, | 19 | | WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | 20 | | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS | 21 | | SOFTWARE. | 22 | |----------------------------------------------------------------------------|# 23 | 24 | (defpackage #:regression-test 25 | (:nicknames #:rtest #-lispworks #:rt) 26 | (:use #:cl) 27 | (:export #:*do-tests-when-defined* #:*test* #:continue-testing 28 | #:deftest #:do-test #:do-tests #:get-test #:pending-tests 29 | #:rem-all-tests #:rem-test) 30 | (:documentation "The MIT regression tester with pfdietz's modifications")) 31 | 32 | ;;This was the December 19, 1990 version of the regression tester, but 33 | ;;has since been modified. 34 | 35 | (in-package :regression-test) 36 | 37 | (declaim (ftype (function (t) t) get-entry expanded-eval do-entries)) 38 | (declaim (type list *entries*)) 39 | (declaim (ftype (function (t &rest t) t) report-error)) 40 | (declaim (ftype (function (t &optional t) t) do-entry)) 41 | 42 | (defvar *test* nil "Current test name") 43 | (defvar *do-tests-when-defined* nil) 44 | (defvar *entries* '(nil) "Test database. Has a leading dummy cell that does not contain an entry.") 45 | (defvar *entries-tail* *entries* "Tail of the *entries* list") 46 | (defvar *entries-table* (make-hash-table :test #'equal) 47 | "Map the names of entries to the cons cell in *entries* that precedes the one whose car is the entry.") 48 | (defvar *in-test* nil "Used by TEST") 49 | (defvar *debug* nil "For debugging") 50 | (defvar *catch-errors* t "When true, causes errors in a test to be caught.") 51 | (defvar *print-circle-on-failure* nil 52 | "Failure reports are printed with *PRINT-CIRCLE* bound to this value.") 53 | 54 | (defvar *compile-tests* nil "When true, compile the tests before running them.") 55 | (defvar *expanded-eval* nil "When true, convert the tests into a form that is less likely to have compiler optimizations.") 56 | (defvar *optimization-settings* '((safety 3))) 57 | 58 | (defvar *expected-failures* nil 59 | "A list of test names that are expected to fail.") 60 | 61 | (defvar *notes* (make-hash-table :test 'equal) 62 | "A mapping from names of notes to note objects.") 63 | 64 | (defstruct (entry (:conc-name nil)) 65 | pend name props form vals) 66 | 67 | ;;; Note objects are used to attach information to tests. 68 | ;;; A typical use is to mark tests that depend on a particular 69 | ;;; part of a set of requirements, or a particular interpretation 70 | ;;; of the requirements. 71 | 72 | (defstruct note 73 | name 74 | contents 75 | disabled ;; When true, tests with this note are considered inactive 76 | ) 77 | 78 | ;; (defmacro vals (entry) `(cdddr ,entry)) 79 | 80 | (defmacro defn (entry) 81 | (let ((var (gensym))) 82 | `(let ((,var ,entry)) 83 | (list* (name ,var) (form ,var) (vals ,var))))) 84 | 85 | (defun entry-notes (entry) 86 | (let* ((props (props entry)) 87 | (notes (getf props :notes))) 88 | (if (listp notes) 89 | notes 90 | (list notes)))) 91 | 92 | (defun has-disabled-note (entry) 93 | (let ((notes (entry-notes entry))) 94 | (loop for n in notes 95 | for note = (if (note-p n) n 96 | (gethash n *notes*)) 97 | thereis (and note (note-disabled note))))) 98 | 99 | (defun pending-tests () 100 | (loop for entry in (cdr *entries*) 101 | when (and (pend entry) (not (has-disabled-note entry))) 102 | collect (name entry))) 103 | 104 | (defun rem-all-tests () 105 | (setq *entries* (list nil)) 106 | (setq *entries-tail* *entries*) 107 | (clrhash *entries-table*) 108 | nil) 109 | 110 | (defun rem-test (&optional (name *test*)) 111 | (let ((pred (gethash name *entries-table*))) 112 | (when pred 113 | (if (null (cddr pred)) 114 | (setq *entries-tail* pred) 115 | (setf (gethash (name (caddr pred)) *entries-table*) pred)) 116 | (setf (cdr pred) (cddr pred)) 117 | (remhash name *entries-table*) 118 | name))) 119 | 120 | (defun get-test (&optional (name *test*)) 121 | (defn (get-entry name))) 122 | 123 | (defun get-entry (name) 124 | (let ((entry ;; (find name (the list (cdr *entries*)) 125 | ;; :key #'name :test #'equal) 126 | (cadr (gethash name *entries-table*)) 127 | )) 128 | (when (null entry) 129 | (report-error t 130 | "~%No test with name ~:@(~S~)." 131 | name)) 132 | entry)) 133 | 134 | (defmacro deftest (name &rest body) 135 | (let* ((p body) 136 | (properties 137 | (loop while (keywordp (first p)) 138 | unless (cadr p) 139 | do (error "Poorly formed deftest: ~A~%" 140 | (list* 'deftest name body)) 141 | append (list (pop p) (pop p)))) 142 | (form (pop p)) 143 | (vals p)) 144 | `(add-entry (make-entry :pend t 145 | :name ',name 146 | :props ',properties 147 | :form ',form 148 | :vals ',vals)))) 149 | 150 | (defun add-entry (entry) 151 | (setq entry (copy-entry entry)) 152 | (let* ((pred (gethash (name entry) *entries-table*))) 153 | (cond 154 | (pred 155 | (setf (cadr pred) entry) 156 | (report-error nil 157 | "Redefining test ~:@(~S~)" 158 | (name entry))) 159 | (t 160 | (setf (gethash (name entry) *entries-table*) *entries-tail*) 161 | (setf (cdr *entries-tail*) (cons entry nil)) 162 | (setf *entries-tail* (cdr *entries-tail*)) 163 | ))) 164 | (when *do-tests-when-defined* 165 | (do-entry entry)) 166 | (setq *test* (name entry))) 167 | 168 | (defun report-error (error? &rest args) 169 | (cond (*debug* 170 | (apply #'format t args) 171 | (if error? (throw '*debug* nil))) 172 | (error? (apply #'error args)) 173 | (t (apply #'warn args))) 174 | nil) 175 | 176 | (defun do-test (&optional (name *test*)) 177 | #-sbcl (do-entry (get-entry name)) 178 | #+sbcl (handler-bind ((sb-ext:code-deletion-note #'muffle-warning)) 179 | (do-entry (get-entry name)))) 180 | 181 | (defun my-aref (a &rest args) 182 | (apply #'aref a args)) 183 | 184 | (defun my-row-major-aref (a index) 185 | (row-major-aref a index)) 186 | 187 | (defun equalp-with-case (x y) 188 | "Like EQUALP, but doesn't do case conversion of characters. 189 | Currently doesn't work on arrays of dimension > 2." 190 | (cond 191 | ((eq x y) t) 192 | ((consp x) 193 | (and (consp y) 194 | (equalp-with-case (car x) (car y)) 195 | (equalp-with-case (cdr x) (cdr y)))) 196 | ((and (typep x 'array) 197 | (= (array-rank x) 0)) 198 | (equalp-with-case (my-aref x) (my-aref y))) 199 | ((typep x 'vector) 200 | (and (typep y 'vector) 201 | (let ((x-len (length x)) 202 | (y-len (length y))) 203 | (and (eql x-len y-len) 204 | (loop 205 | for i from 0 below x-len 206 | for e1 = (my-aref x i) 207 | for e2 = (my-aref y i) 208 | always (equalp-with-case e1 e2)))))) 209 | ((and (typep x 'array) 210 | (typep y 'array) 211 | (not (equal (array-dimensions x) 212 | (array-dimensions y)))) 213 | nil) 214 | 215 | ((typep x 'array) 216 | (and (typep y 'array) 217 | (let ((size (array-total-size x))) 218 | (loop for i from 0 below size 219 | always (equalp-with-case (my-row-major-aref x i) 220 | (my-row-major-aref y i)))))) 221 | 222 | (t (eql x y)))) 223 | 224 | (defun do-entry (entry &optional 225 | (s *standard-output*)) 226 | (catch '*in-test* 227 | (setq *test* (name entry)) 228 | (setf (pend entry) t) 229 | (let* ((*in-test* t) 230 | ;; (*break-on-warnings* t) 231 | (aborted nil) 232 | r) 233 | ;; (declare (special *break-on-warnings*)) 234 | 235 | (block aborted 236 | (setf r 237 | (flet ((%do 238 | () 239 | (cond 240 | (*compile-tests* 241 | (multiple-value-list 242 | (funcall (compile 243 | nil 244 | `(lambda () 245 | (declare 246 | (optimize ,@*optimization-settings*)) 247 | ,(form entry)))))) 248 | (*expanded-eval* 249 | (multiple-value-list 250 | (expanded-eval (form entry)))) 251 | (t 252 | (multiple-value-list 253 | (eval (form entry))))))) 254 | (if *catch-errors* 255 | (handler-bind 256 | (#-ecl (style-warning #'muffle-warning) 257 | (error #'(lambda (c) 258 | (setf aborted t) 259 | (setf r (list c)) 260 | (return-from aborted nil)))) 261 | (%do)) 262 | (%do))))) 263 | 264 | (setf (pend entry) 265 | (or aborted 266 | (not (equalp-with-case r (vals entry))))) 267 | 268 | (when (pend entry) 269 | (let ((*print-circle* *print-circle-on-failure*)) 270 | (format s "~&Test ~:@(~S~) failed~ 271 | ~%Form: ~S~ 272 | ~%Expected value~P: ~ 273 | ~{~S~^~%~17t~}~%" 274 | *test* (form entry) 275 | (length (vals entry)) 276 | (vals entry)) 277 | (handler-case 278 | (let ((st (format nil "Actual value~P: ~ 279 | ~{~S~^~%~15t~}.~%" 280 | (length r) r))) 281 | (format s "~A" st)) 282 | (error () (format s "Actual value: #~%") 283 | )) 284 | (finish-output s) 285 | )))) 286 | (when (not (pend entry)) *test*)) 287 | 288 | (defun expanded-eval (form) 289 | "Split off top level of a form and eval separately. This reduces the chance that 290 | compiler optimizations will fold away runtime computation." 291 | (if (not (consp form)) 292 | (eval form) 293 | (let ((op (car form))) 294 | (cond 295 | ((eq op 'let) 296 | (let* ((bindings (loop for b in (cadr form) 297 | collect (if (consp b) b (list b nil)))) 298 | (vars (mapcar #'car bindings)) 299 | (binding-forms (mapcar #'cadr bindings))) 300 | (apply 301 | (the function 302 | (eval `(lambda ,vars ,@(cddr form)))) 303 | (mapcar #'eval binding-forms)))) 304 | ((and (eq op 'let*) (cadr form)) 305 | (let* ((bindings (loop for b in (cadr form) 306 | collect (if (consp b) b (list b nil)))) 307 | (vars (mapcar #'car bindings)) 308 | (binding-forms (mapcar #'cadr bindings))) 309 | (funcall 310 | (the function 311 | (eval `(lambda (,(car vars) &aux ,@(cdr bindings)) ,@(cddr form)))) 312 | (eval (car binding-forms))))) 313 | ((eq op 'progn) 314 | (loop for e on (cdr form) 315 | do (if (null (cdr e)) (return (eval (car e))) 316 | (eval (car e))))) 317 | ((and (symbolp op) (fboundp op) 318 | (not (macro-function op)) 319 | (not (special-operator-p op))) 320 | (apply (symbol-function op) 321 | (mapcar #'eval (cdr form)))) 322 | (t (eval form)))))) 323 | 324 | (defun continue-testing () 325 | (if *in-test* 326 | (throw '*in-test* nil) 327 | (do-entries *standard-output*))) 328 | 329 | (defun do-tests (&optional 330 | (out *standard-output*)) 331 | (dolist (entry (cdr *entries*)) 332 | (setf (pend entry) t)) 333 | (if (streamp out) 334 | (do-entries out) 335 | (with-open-file 336 | (stream out :direction :output) 337 | (do-entries stream)))) 338 | 339 | (defun do-entries* (s) 340 | (format s "~&Doing ~A pending test~:P ~ 341 | of ~A tests total.~%" 342 | (count t (the list (cdr *entries*)) :key #'pend) 343 | (length (cdr *entries*))) 344 | (finish-output s) 345 | (dolist (entry (cdr *entries*)) 346 | (when (and (pend entry) 347 | (not (has-disabled-note entry))) 348 | (format s "~@[~<~%~:; ~:@(~S~)~>~]" 349 | (do-entry entry s)) 350 | (finish-output s) 351 | )) 352 | (let ((pending (pending-tests)) 353 | (expected-table (make-hash-table :test #'equal))) 354 | (dolist (ex *expected-failures*) 355 | (setf (gethash ex expected-table) t)) 356 | (let ((new-failures 357 | (loop for pend in pending 358 | unless (gethash pend expected-table) 359 | collect pend))) 360 | (if (null pending) 361 | (format s "~&No tests failed.") 362 | (progn 363 | (format s "~&~A out of ~A ~ 364 | total tests failed: ~ 365 | ~:@(~{~<~% ~1:;~S~>~ 366 | ~^, ~}~)." 367 | (length pending) 368 | (length (cdr *entries*)) 369 | pending) 370 | (if (null new-failures) 371 | (format s "~&No unexpected failures.") 372 | (when *expected-failures* 373 | (format s "~&~A unexpected failures: ~ 374 | ~:@(~{~<~% ~1:;~S~>~ 375 | ~^, ~}~)." 376 | (length new-failures) 377 | new-failures))) 378 | )) 379 | (finish-output s) 380 | (null pending)))) 381 | 382 | (defun do-entries (s) 383 | #-sbcl (do-entries* s) 384 | #+sbcl (handler-bind ((sb-ext:code-deletion-note #'muffle-warning)) 385 | (do-entries* s))) 386 | 387 | ;;; Note handling functions and macros 388 | 389 | (defmacro defnote (name contents &optional disabled) 390 | `(eval-when (:load-toplevel :execute) 391 | (let ((note (make-note :name ',name 392 | :contents ',contents 393 | :disabled ',disabled))) 394 | (setf (gethash (note-name note) *notes*) note) 395 | note))) 396 | 397 | (defun disable-note (n) 398 | (let ((note (if (note-p n) n 399 | (setf n (gethash n *notes*))))) 400 | (unless note (error "~A is not a note or note name." n)) 401 | (setf (note-disabled note) t) 402 | note)) 403 | 404 | (defun enable-note (n) 405 | (let ((note (if (note-p n) n 406 | (setf n (gethash n *notes*))))) 407 | (unless note (error "~A is not a note or note name." n)) 408 | (setf (note-disabled note) nil) 409 | note)) 410 | -------------------------------------------------------------------------------- /tests/base64url.testvec: -------------------------------------------------------------------------------- 1 | (:encoding-test "5d" "XQ==") 2 | (:encoding-test "33" "Mw==") 3 | (:encoding-test "3f" "Pw==") 4 | (:encoding-test "e1" "4Q==") 5 | (:encoding-test "8f" "jw==") 6 | (:encoding-test "c2" "wg==") 7 | (:encoding-test "3d" "PQ==") 8 | (:encoding-test "2f" "Lw==") 9 | (:encoding-test "df" "3w==") 10 | (:encoding-test "39" "OQ==") 11 | (:encoding-test "f1" "8Q==") 12 | (:encoding-test "2c" "LA==") 13 | (:encoding-test "34" "NA==") 14 | (:encoding-test "c5" "xQ==") 15 | (:encoding-test "2f" "Lw==") 16 | (:encoding-test "18" "GA==") 17 | (:encoding-test "47" "Rw==") 18 | (:encoding-test "6e" "bg==") 19 | (:encoding-test "ac" "rA==") 20 | (:encoding-test "15" "FQ==") 21 | (:encoding-test "5f" "Xw==") 22 | (:encoding-test "c1" "wQ==") 23 | (:encoding-test "9a" "mg==") 24 | (:encoding-test "6f" "bw==") 25 | (:encoding-test "76" "dg==") 26 | (:encoding-test "e1" "4Q==") 27 | (:encoding-test "0a" "Cg==") 28 | (:encoding-test "ac" "rA==") 29 | (:encoding-test "b1" "sQ==") 30 | (:encoding-test "98" "mA==") 31 | (:encoding-test "44" "RA==") 32 | (:encoding-test "2f48" "L0g=") 33 | (:encoding-test "382a" "OCo=") 34 | (:encoding-test "4a5d" "Sl0=") 35 | (:encoding-test "165a" "Flo=") 36 | (:encoding-test "c771" "x3E=") 37 | (:encoding-test "c81d" "yB0=") 38 | (:encoding-test "f2f9" "8vk=") 39 | (:encoding-test "1638" "Fjg=") 40 | (:encoding-test "da13" "2hM=") 41 | (:encoding-test "d552" "1VI=") 42 | (:encoding-test "f57d" "9X0=") 43 | (:encoding-test "dc17" "3Bc=") 44 | (:encoding-test "53a4" "U6Q=") 45 | (:encoding-test "f7d3" "99M=") 46 | (:encoding-test "4d7d" "TX0=") 47 | (:encoding-test "11f1" "EfE=") 48 | (:encoding-test "0771" "B3E=") 49 | (:encoding-test "07a3" "B6M=") 50 | (:encoding-test "c8dd" "yN0=") 51 | (:encoding-test "1fef" "H-8=") 52 | (:encoding-test "fcba" "_Lo=") 53 | (:encoding-test "e82e" "6C4=") 54 | (:encoding-test "e5af" "5a8=") 55 | (:encoding-test "3b28" "Oyg=") 56 | (:encoding-test "9400" "lAA=") 57 | (:encoding-test "f4f5" "9PU=") 58 | (:encoding-test "39db" "Ods=") 59 | (:encoding-test "6f91" "b5E=") 60 | (:encoding-test "7393" "c5M=") 61 | (:encoding-test "577d" "V30=") 62 | (:encoding-test "8d0f" "jQ8=") 63 | (:encoding-test "fb849b" "-4Sb") 64 | (:encoding-test "71ff59" "cf9Z") 65 | (:encoding-test "6d92c1" "bZLB") 66 | (:encoding-test "01d997" "AdmX") 67 | (:encoding-test "70b392" "cLOS") 68 | (:encoding-test "0c3359" "DDNZ") 69 | (:encoding-test "235ab3" "I1qz") 70 | (:encoding-test "1f6477" "H2R3") 71 | (:encoding-test "242d24" "JC0k") 72 | (:encoding-test "8f78f7" "j3j3") 73 | (:encoding-test "c41b08" "xBsI") 74 | (:encoding-test "53511c" "U1Ec") 75 | (:encoding-test "af3bdc" "rzvc") 76 | (:encoding-test "a09a98" "oJqY") 77 | (:encoding-test "61ad88" "Ya2I") 78 | (:encoding-test "abfed2" "q_7S") 79 | (:encoding-test "12b910" "ErkQ") 80 | (:encoding-test "2f93e5" "L5Pl") 81 | (:encoding-test "0a8c72" "Coxy") 82 | (:encoding-test "502a6b" "UCpr") 83 | (:encoding-test "658bdf" "ZYvf") 84 | (:encoding-test "130f8a" "Ew-K") 85 | (:encoding-test "848277" "hIJ3") 86 | (:encoding-test "8f2c47" "jyxH") 87 | (:encoding-test "a3f5bc" "o_W8") 88 | (:encoding-test "b80089" "uACJ") 89 | (:encoding-test "924708" "kkcI") 90 | (:encoding-test "779244" "d5JE") 91 | (:encoding-test "be60c5" "vmDF") 92 | (:encoding-test "418735" "QYc1") 93 | (:encoding-test "ed4289" "7UKJ") 94 | (:encoding-test "c0212dd9" "wCEt2Q==") 95 | (:encoding-test "49dea829" "Sd6oKQ==") 96 | (:encoding-test "2497a54b" "JJelSw==") 97 | (:encoding-test "98101959" "mBAZWQ==") 98 | (:encoding-test "9c086e43" "nAhuQw==") 99 | (:encoding-test "42a84e8c" "QqhOjA==") 100 | (:encoding-test "484cbd37" "SEy9Nw==") 101 | (:encoding-test "c808dfae" "yAjfrg==") 102 | (:encoding-test "11818da8" "EYGNqA==") 103 | (:encoding-test "b79d3162" "t50xYg==") 104 | (:encoding-test "611d4920" "YR1JIA==") 105 | (:encoding-test "885dfe67" "iF3-Zw==") 106 | (:encoding-test "d3e3885a" "0-OIWg==") 107 | (:encoding-test "3f5e372a" "P143Kg==") 108 | (:encoding-test "7438546a" "dDhUag==") 109 | (:encoding-test "8c06f6c9" "jAb2yQ==") 110 | (:encoding-test "93c2ea4e" "k8LqTg==") 111 | (:encoding-test "7a89bdf6" "eom99g==") 112 | (:encoding-test "de72cb39" "3nLLOQ==") 113 | (:encoding-test "69a06aee" "aaBq7g==") 114 | (:encoding-test "cbc069b1" "y8BpsQ==") 115 | (:encoding-test "70a53f4e" "cKU_Tg==") 116 | (:encoding-test "8c12adaf" "jBKtrw==") 117 | (:encoding-test "b3f3ec22" "s_PsIg==") 118 | (:encoding-test "bbab0977" "u6sJdw==") 119 | (:encoding-test "6e6c2574" "bmwldA==") 120 | (:encoding-test "f518dfbc" "9RjfvA==") 121 | (:encoding-test "e0aab7ef" "4Kq37w==") 122 | (:encoding-test "a8dac8e7" "qNrI5w==") 123 | (:encoding-test "128db0bf" "Eo2wvw==") 124 | (:encoding-test "53307fee" "UzB_7g==") 125 | (:encoding-test "4800c0cfe3" "SADAz-M=") 126 | (:encoding-test "4a47fd32e8" "Skf9Mug=") 127 | (:encoding-test "67409345f0" "Z0CTRfA=") 128 | (:encoding-test "3e00906f2e" "PgCQby4=") 129 | (:encoding-test "b8e5fdad0c" "uOX9rQw=") 130 | (:encoding-test "35c9e00c65" "NcngDGU=") 131 | (:encoding-test "96a0f50ebe" "lqD1Dr4=") 132 | (:encoding-test "b4c8a27171" "tMiicXE=") 133 | (:encoding-test "6f8f60f04c" "b49g8Ew=") 134 | (:encoding-test "5b536cf453" "W1Ns9FM=") 135 | (:encoding-test "9f43cc5aa2" "n0PMWqI=") 136 | (:encoding-test "1da97d33e6" "Hal9M-Y=") 137 | (:encoding-test "88323a139a" "iDI6E5o=") 138 | (:encoding-test "1ece074252" "Hs4HQlI=") 139 | (:encoding-test "b0aaf58807" "sKr1iAc=") 140 | (:encoding-test "89b8784a17" "ibh4Shc=") 141 | (:encoding-test "062ed6f587" "Bi7W9Yc=") 142 | (:encoding-test "70ec2daa28" "cOwtqig=") 143 | (:encoding-test "bdfad93d52" "vfrZPVI=") 144 | (:encoding-test "df23922275" "3yOSInU=") 145 | (:encoding-test "10e9ffe9c6" "EOn_6cY=") 146 | (:encoding-test "202825d2f6" "ICgl0vY=") 147 | (:encoding-test "74b013bb10" "dLATuxA=") 148 | (:encoding-test "8c30da062e" "jDDaBi4=") 149 | (:encoding-test "0ea91c6320" "DqkcYyA=") 150 | (:encoding-test "e49c87c311" "5JyHwxE=") 151 | (:encoding-test "2cdc0eca2e" "LNwOyi4=") 152 | (:encoding-test "957fecfae8" "lX_s-ug=") 153 | (:encoding-test "34bf667494" "NL9mdJQ=") 154 | (:encoding-test "cb56ae977c" "y1aul3w=") 155 | (:encoding-test "072200cea6" "ByIAzqY=") 156 | (:encoding-test "4db77c080959" "Tbd8CAlZ") 157 | (:encoding-test "a372a599b204" "o3KlmbIE") 158 | (:encoding-test "271522b9f56d" "JxUiufVt") 159 | (:encoding-test "37f541ffca7a" "N_VB_8p6") 160 | (:encoding-test "62b2b19be1e9" "YrKxm-Hp") 161 | (:encoding-test "42ac64aa8fd0" "Qqxkqo_Q") 162 | (:encoding-test "e513eaded753" "5RPq3tdT") 163 | (:encoding-test "43ec52b7728f" "Q-xSt3KP") 164 | (:encoding-test "4a0616899c18" "SgYWiZwY") 165 | (:encoding-test "65b9fbacc039" "Zbn7rMA5") 166 | (:encoding-test "8613b298e386" "hhOymOOG") 167 | (:encoding-test "c65ae8a1d8a9" "xlroodip") 168 | (:encoding-test "ff4fc6852509" "_0_GhSUJ") 169 | (:encoding-test "5c546d7b8fa3" "XFRte4-j") 170 | (:encoding-test "e9a7dba0c34f" "6afboMNP") 171 | (:encoding-test "f748ebbc8187" "90jrvIGH") 172 | (:encoding-test "2351b23a18f2" "I1GyOhjy") 173 | (:encoding-test "0d4d82788e8d" "DU2CeI6N") 174 | (:encoding-test "3775179b20cc" "N3UXmyDM") 175 | (:encoding-test "d8a57a0c3807" "2KV6DDgH") 176 | (:encoding-test "36003a2f32f6" "NgA6LzL2") 177 | (:encoding-test "b2e44a57b65f" "suRKV7Zf") 178 | (:encoding-test "f6e5962948b6" "9uWWKUi2") 179 | (:encoding-test "b679b924de36" "tnm5JN42") 180 | (:encoding-test "e9b9cc8bb008" "6bnMi7AI") 181 | (:encoding-test "320e70518fe2" "Mg5wUY_i") 182 | (:encoding-test "b786e36e5ed7" "t4bjbl7X") 183 | (:encoding-test "33db06f87568" "M9sG-HVo") 184 | (:encoding-test "2f31bd8ffdd7" "LzG9j_3X") 185 | (:encoding-test "016dcc37c8fc" "AW3MN8j8") 186 | (:encoding-test "4cd317ecbbf1" "TNMX7Lvx") 187 | (:encoding-test "bed3bc517fcb1c" "vtO8UX_LHA==") 188 | (:encoding-test "75a09e71aecafa" "daCeca7K-g==") 189 | (:encoding-test "f14a7ab96e5006" "8Up6uW5QBg==") 190 | (:encoding-test "e78e0df3f6c20d" "544N8_bCDQ==") 191 | (:encoding-test "fa17e6ea1b6c45" "-hfm6htsRQ==") 192 | (:encoding-test "c017bb6f1fdb67" "wBe7bx_bZw==") 193 | (:encoding-test "69779585da5d62" "aXeVhdpdYg==") 194 | (:encoding-test "f993efcb7fff9a" "-ZPvy3__mg==") 195 | (:encoding-test "6b941f8cbafbf4" "a5QfjLr79A==") 196 | (:encoding-test "0e6c7ff9a2a0bb" "Dmx_-aKguw==") 197 | (:encoding-test "bb0622170ba59a" "uwYiFwulmg==") 198 | (:encoding-test "cca35fd53cdd1a" "zKNf1TzdGg==") 199 | (:encoding-test "f6b43cffd4aa79" "9rQ8_9SqeQ==") 200 | (:encoding-test "c6078a37ff58fe" "xgeKN_9Y_g==") 201 | (:encoding-test "fef0fadded3e08" "_vD63e0-CA==") 202 | (:encoding-test "7f0dbe457955d0" "fw2-RXlV0A==") 203 | (:encoding-test "1951a73a62f905" "GVGnOmL5BQ==") 204 | (:encoding-test "3f27d53c60bf9b" "PyfVPGC_mw==") 205 | (:encoding-test "62f97c71317bf5" "Yvl8cTF79Q==") 206 | (:encoding-test "8e8e0779b8a9a0" "jo4HebipoA==") 207 | (:encoding-test "9c8071746ff25a" "nIBxdG_yWg==") 208 | (:encoding-test "ca7f140665e7a5" "yn8UBmXnpQ==") 209 | (:encoding-test "fc6f32d3ca5670" "_G8y08pWcA==") 210 | (:encoding-test "ef4f7be1e7b3c7" "70974eezxw==") 211 | (:encoding-test "51f9dc797ac4a2" "UfnceXrEog==") 212 | (:encoding-test "be18af719debcf" "vhivcZ3rzw==") 213 | (:encoding-test "6b9edd574d09d4" "a57dV00J1A==") 214 | (:encoding-test "38d7da8f15d307" "ONfajxXTBw==") 215 | (:encoding-test "fbc1c18f85200c" "-8HBj4UgDA==") 216 | (:encoding-test "a4fa73007d54a2" "pPpzAH1Uog==") 217 | (:encoding-test "e2e00de90a6cb7" "4uAN6Qpstw==") 218 | (:encoding-test "16f48cf7eeda215b" "FvSM9-7aIVs=") 219 | (:encoding-test "c88ecedb522014da" "yI7O21IgFNo=") 220 | (:encoding-test "d486666cb1c9166c" "1IZmbLHJFmw=") 221 | (:encoding-test "d47126a711305727" "1HEmpxEwVyc=") 222 | (:encoding-test "1eceb1c8e3202cec" "Hs6xyOMgLOw=") 223 | (:encoding-test "afca7846ab8e9eff" "r8p4RquOnv8=") 224 | (:encoding-test "802a279f0e4c1cac" "gConnw5MHKw=") 225 | (:encoding-test "7cb382bf9344fd03" "fLOCv5NE_QM=") 226 | (:encoding-test "ee170f33322c5f3f" "7hcPMzIsXz8=") 227 | (:encoding-test "7fe39af26994351b" "f-Oa8mmUNRs=") 228 | (:encoding-test "7f83acdda83c32d2" "f4Os3ag8MtI=") 229 | (:encoding-test "5d6a53942f9b29fe" "XWpTlC-bKf4=") 230 | (:encoding-test "4eac7a051c7be8e5" "Tqx6BRx76OU=") 231 | (:encoding-test "292b5608ff79fb8e" "KStWCP95-44=") 232 | (:encoding-test "e95cafe5d2a06dce" "6Vyv5dKgbc4=") 233 | (:encoding-test "884b475005f19a23" "iEtHUAXxmiM=") 234 | (:encoding-test "4b9b890f53ff93f8" "S5uJD1P_k_g=") 235 | (:encoding-test "89a32c7bef6da150" "iaMse-9toVA=") 236 | (:encoding-test "ed6286a350b20796" "7WKGo1CyB5Y=") 237 | (:encoding-test "f05f9170a8de94ec" "8F-RcKjelOw=") 238 | (:encoding-test "1489c7b55e589e7a" "FInHtV5Ynno=") 239 | (:encoding-test "6f69d7b182d878a0" "b2nXsYLYeKA=") 240 | (:encoding-test "00dbee7fc2f427da" "ANvuf8L0J9o=") 241 | (:encoding-test "a66062d0d0e36661" "pmBi0NDjZmE=") 242 | (:encoding-test "524ec158ef60efd6" "Uk7BWO9g79Y=") 243 | (:encoding-test "ec8589740d51b7e5" "7IWJdA1Rt-U=") 244 | (:encoding-test "d9197c7ebd667246" "2Rl8fr1mckY=") 245 | (:encoding-test "6a5921d2fa0f5a56" "alkh0voPWlY=") 246 | (:encoding-test "58738db6db4e366b" "WHONtttONms=") 247 | (:encoding-test "b306af73dd1e614e" "swavc90eYU4=") 248 | (:encoding-test "b5431cb2739517a4" "tUMcsnOVF6Q=") 249 | (:encoding-test "557739d9309f7e9bc2" "VXc52TCffpvC") 250 | (:encoding-test "461066af3165c5370c" "RhBmrzFlxTcM") 251 | (:encoding-test "3ce859dd2bb6a77ad1" "POhZ3Su2p3rR") 252 | (:encoding-test "b88a487c87f53f9064" "uIpIfIf1P5Bk") 253 | (:encoding-test "0482cce808a530fb00" "BILM6AilMPsA") 254 | (:encoding-test "05e3a993ee2ec7f983" "BeOpk-4ux_mD") 255 | (:encoding-test "46d658b889184eabd6" "RtZYuIkYTqvW") 256 | (:encoding-test "4d9e39852d1c28c119" "TZ45hS0cKMEZ") 257 | (:encoding-test "a0adbf8d43d8340eca" "oK2_jUPYNA7K") 258 | (:encoding-test "c1411821b5a3ed1f88" "wUEYIbWj7R-I") 259 | (:encoding-test "5425794b980e95ad6d" "VCV5S5gOla1t") 260 | (:encoding-test "f69dd4833e9f89d2c9" "9p3Ugz6fidLJ") 261 | (:encoding-test "257888f73ee9e726bc" "JXiI9z7p5ya8") 262 | (:encoding-test "0a02b700ee555576e7" "CgK3AO5VVXbn") 263 | (:encoding-test "22acef2ca9af1aa2d0" "IqzvLKmvGqLQ") 264 | (:encoding-test "60d9612473ba88ab0f" "YNlhJHO6iKsP") 265 | (:encoding-test "9d5071b577fdbbadc5" "nVBxtXf9u63F") 266 | (:encoding-test "5d5beb1a9a0a07e326" "XVvrGpoKB-Mm") 267 | (:encoding-test "3b662279397d4d3f28" "O2YieTl9TT8o") 268 | (:encoding-test "67e7b2a06687da7ffe" "Z-eyoGaH2n_-") 269 | (:encoding-test "79268e8ab4e781ffb7" "eSaOirTngf-3") 270 | (:encoding-test "88183a08cec307ad95" "iBg6CM7DB62V") 271 | (:encoding-test "44c6f9472ff7eb3592" "RMb5Ry_36zWS") 272 | (:encoding-test "3adb209145c401b61d" "OtsgkUXEAbYd") 273 | (:encoding-test "5f074bd2ea6f551045" "XwdL0upvVRBF") 274 | (:encoding-test "0430a98f65a3c35dc0" "BDCpj2Wjw13A") 275 | (:encoding-test "6fb0eec0513886cc1c" "b7DuwFE4hswc") 276 | (:encoding-test "512e491c75762c72a5" "US5JHHV2LHKl") 277 | (:encoding-test "b0a9d849f24c3d2fb5" "sKnYSfJMPS-1") 278 | (:encoding-test "5b0bd97740e4f9a8e5" "WwvZd0Dk-ajl") 279 | (:encoding-test "cc7d8a32784a4156f4" "zH2KMnhKQVb0") 280 | (:encoding-test "2c7ed4093d12c0c32c69" "LH7UCT0SwMMsaQ==") 281 | (:encoding-test "286374e394a9bde8399c" "KGN045Spveg5nA==") 282 | (:encoding-test "7b423e6278c43d440dba" "e0I-YnjEPUQNug==") 283 | (:encoding-test "306c732a43c707462f0c" "MGxzKkPHB0YvDA==") 284 | (:encoding-test "878e91e49d23b192deb2" "h46R5J0jsZLesg==") 285 | (:encoding-test "42502802d5a108ca74f2" "QlAoAtWhCMp08g==") 286 | (:encoding-test "306ddda23d3ccb56f956" "MG3doj08y1b5Vg==") 287 | (:encoding-test "7db110b47b381363f63e" "fbEQtHs4E2P2Pg==") 288 | (:encoding-test "93d75260d262225c4cea" "k9dSYNJiIlxM6g==") 289 | (:encoding-test "902b7b1e426bf7a4536d" "kCt7HkJr96RTbQ==") 290 | (:encoding-test "454afd08992840c2fb99" "RUr9CJkoQML7mQ==") 291 | (:encoding-test "6b127f276d695ce19df0" "axJ_J21pXOGd8A==") 292 | (:encoding-test "46c7f7fa818454a20cc0" "Rsf3-oGEVKIMwA==") 293 | (:encoding-test "4ea3a6213d9e42a3fe2b" "TqOmIT2eQqP-Kw==") 294 | (:encoding-test "d48b0e41b5ee8ed7d345" "1IsOQbXujtfTRQ==") 295 | (:encoding-test "152e9be7d1b1091e77cd" "FS6b59GxCR53zQ==") 296 | (:encoding-test "8ab99947fde02aa7a01d" "irmZR_3gKqegHQ==") 297 | (:encoding-test "b677fcee2e87efcdb6ac" "tnf87i6H7822rA==") 298 | (:encoding-test "516613ab83cb43875617" "UWYTq4PLQ4dWFw==") 299 | (:encoding-test "6413c806fa2e60b072db" "ZBPIBvouYLBy2w==") 300 | (:encoding-test "027706c3a10dc2f42c17" "AncGw6ENwvQsFw==") 301 | (:encoding-test "86d5bad2332ef6ff389e" "htW60jMu9v84ng==") 302 | (:encoding-test "ad3f60ed9c4682be301a" "rT9g7ZxGgr4wGg==") 303 | (:encoding-test "8281aec43f0dd05760e9" "goGuxD8N0Fdg6Q==") 304 | (:encoding-test "fcc2b223ac5beec4b525" "_MKyI6xb7sS1JQ==") 305 | (:encoding-test "4963ec85b83133621cec" "SWPshbgxM2Ic7A==") 306 | (:encoding-test "7e7b9dce48755e1407d2" "fnudzkh1XhQH0g==") 307 | (:encoding-test "88c90ac90ed3f1448256" "iMkKyQ7T8USCVg==") 308 | (:encoding-test "339f2670d29f3beeb0e2" "M58mcNKfO-6w4g==") 309 | (:encoding-test "0c40e10a316eac469765" "DEDhCjFurEaXZQ==") 310 | (:encoding-test "eb2c0bf41a3102eb22ac" "6ywL9BoxAusirA==") 311 | (:encoding-test "eac3421f42214e5c6160ff" "6sNCH0IhTlxhYP8=") 312 | (:encoding-test "3a237b8e6248946a0ef733" "OiN7jmJIlGoO9zM=") 313 | (:encoding-test "9cb685739e6bb6928ceb8c" "nLaFc55rtpKM64w=") 314 | (:encoding-test "bdacb37aab1639610a8d66" "vayzeqsWOWEKjWY=") 315 | (:encoding-test "8b9e23ba0e900c2579d577" "i54jug6QDCV51Xc=") 316 | (:encoding-test "052e183eb83311e72424c3" "BS4YPrgzEeckJMM=") 317 | (:encoding-test "281cb334046177c8ec11a3" "KByzNARhd8jsEaM=") 318 | (:encoding-test "6d6d0182110b9377be802f" "bW0BghELk3e-gC8=") 319 | (:encoding-test "ad5d48900fbc7ed48a2f7a" "rV1IkA-8ftSKL3o=") 320 | (:encoding-test "08c6e870c3a585111aaa27" "CMbocMOlhREaqic=") 321 | (:encoding-test "951d9bb7e4f986cc7ce5fb" "lR2bt-T5hsx85fs=") 322 | (:encoding-test "de9ae7970797f5c5044d79" "3prnlweX9cUETXk=") 323 | (:encoding-test "85bf006a5f0d39053c3815" "hb8Aal8NOQU8OBU=") 324 | (:encoding-test "819205c2f052a23a8466c1" "gZIFwvBSojqEZsE=") 325 | (:encoding-test "f48c67793724a870c4da14" "9IxneTckqHDE2hQ=") 326 | (:encoding-test "83035ea1e5381579a4e680" "gwNeoeU4FXmk5oA=") 327 | (:encoding-test "3610c5e4d685bb63775107" "NhDF5NaFu2N3UQc=") 328 | (:encoding-test "3b76b9929b2b4beb67f0f1" "O3a5kpsrS-tn8PE=") 329 | (:encoding-test "2f9d5527bbf1f1a5deee68" "L51VJ7vx8aXe7mg=") 330 | (:encoding-test "dbc5593d74828c5d6f430b" "28VZPXSCjF1vQws=") 331 | (:encoding-test "7819c0bb293fa32633ea13" "eBnAuyk_oyYz6hM=") 332 | (:encoding-test "03a7f42147de528c73a04b" "A6f0IUfeUoxzoEs=") 333 | (:encoding-test "850b00dfa6db6340da18a9" "hQsA36bbY0DaGKk=") 334 | (:encoding-test "1e2c7a819837c0b5b76f5d" "Hix6gZg3wLW3b10=") 335 | (:encoding-test "d5e6cf2a14fbcfe53a0be5" "1ebPKhT7z-U6C-U=") 336 | (:encoding-test "f064a368b817025900a093" "8GSjaLgXAlkAoJM=") 337 | (:encoding-test "3dc8b3c7a783d0982ad73f" "Pcizx6eD0Jgq1z8=") 338 | (:encoding-test "3348d1657c50a98d290000" "M0jRZXxQqY0pAAA=") 339 | (:encoding-test "99c5d9c36351596e0bdb9b" "mcXZw2NRWW4L25s=") 340 | (:encoding-test "e04829291aa91b7e336795" "4EgpKRqpG34zZ5U=") 341 | (:encoding-test "c3d256573e92b4a1d1aa87" "w9JWVz6StKHRqoc=") 342 | (:encoding-test "a815fde4529da7a0932f5f16" "qBX95FKdp6CTL18W") 343 | (:encoding-test "e11eef485aee9a1c3b1990f5" "4R7vSFrumhw7GZD1") 344 | (:encoding-test "2f43b39abae287acae767c84" "L0Ozmrrih6yudnyE") 345 | (:encoding-test "988e5cb55eb610c0bf9bb74d" "mI5ctV62EMC_m7dN") 346 | (:encoding-test "5aea79efac8d5520a3ed43ef" "Wup576yNVSCj7UPv") 347 | (:encoding-test "a011a237d0c9076bb6662767" "oBGiN9DJB2u2Zidn") 348 | (:encoding-test "1816bf1712676fd5207e0865" "GBa_FxJnb9Ugfghl") 349 | (:encoding-test "74e8b7638bb80339ee02d8fc" "dOi3Y4u4AznuAtj8") 350 | (:encoding-test "7892100784687a635d88d2c0" "eJIQB4RoemNdiNLA") 351 | (:encoding-test "1b05528f8f060f19cb2590e5" "GwVSj48GDxnLJZDl") 352 | (:encoding-test "463e029ea2794cd8cad36091" "Rj4CnqJ5TNjK02CR") 353 | (:encoding-test "7732b5e9c395c7af406d7295" "dzK16cOVx69AbXKV") 354 | (:encoding-test "478c3056e516db6a4b106607" "R4wwVuUW22pLEGYH") 355 | (:encoding-test "193ec8bbb1f82b3595b48784" "GT7Iu7H4KzWVtIeE") 356 | (:encoding-test "42f20f5ce714c22dc18b9ed8" "QvIPXOcUwi3Bi57Y") 357 | (:encoding-test "c4f23bd0782f596efde3599c" "xPI70HgvWW7941mc") 358 | (:encoding-test "7a9dc392db5e49418c090b75" "ep3DktteSUGMCQt1") 359 | (:encoding-test "fd939f62bc311e68c0c46a8c" "_ZOfYrwxHmjAxGqM") 360 | (:encoding-test "b0ff017a97b99b4a1fdc85a5" "sP8Bepe5m0of3IWl") 361 | (:encoding-test "a55ac81838b08cc9b36d3b58" "pVrIGDiwjMmzbTtY") 362 | (:encoding-test "2887281b168c4392b8d0906b" "KIcoGxaMQ5K40JBr") 363 | (:encoding-test "9f061682617bb973d21fe316" "nwYWgmF7uXPSH-MW") 364 | (:encoding-test "abb99ca100edc41d91c939d4" "q7mcoQDtxB2RyTnU") 365 | (:encoding-test "269e6886b4ba6533e54085c5" "Jp5ohrS6ZTPlQIXF") 366 | (:encoding-test "2fea3ce185f36cdaf6b641c7" "L-o84YXzbNr2tkHH") 367 | (:encoding-test "40b7c0c4135c3bb175af72e1" "QLfAxBNcO7F1r3Lh") 368 | (:encoding-test "cc8964273a43ecebe6f0529d" "zIlkJzpD7Ovm8FKd") 369 | (:encoding-test "691e2108477939ddee8e13ad" "aR4hCEd5Od3ujhOt") 370 | (:encoding-test "9eb02fbb2d596333fedcf11c" "nrAvuy1ZYzP-3PEc") 371 | (:encoding-test "1e90286f1a7d782f66237217" "HpAobxp9eC9mI3IX") 372 | (:encoding-test "994e681945650f4328fe8caa" "mU5oGUVlD0Mo_oyq") 373 | (:encoding-test "0f909a4635293839ac45cca3c5" "D5CaRjUpODmsRcyjxQ==") 374 | (:encoding-test "321d30c52940d01771c130746b" "Mh0wxSlA0BdxwTB0aw==") 375 | (:encoding-test "68209898e7a0dc396e6ee0c575" "aCCYmOeg3DlubuDFdQ==") 376 | (:encoding-test "e783e9bd4678fb2d5a636a8dbc" "54PpvUZ4-y1aY2qNvA==") 377 | (:encoding-test "64592cd4d274515a79cde75959" "ZFks1NJ0UVp5zedZWQ==") 378 | (:encoding-test "1b4212e59e1e81e1d54c5aacdc" "G0IS5Z4egeHVTFqs3A==") 379 | (:encoding-test "90546301e1ae623dc8c9bbec60" "kFRjAeGuYj3IybvsYA==") 380 | (:encoding-test "94e6fa5d82904a6a466b3f0977" "lOb6XYKQSmpGaz8Jdw==") 381 | (:encoding-test "689ef46301dee291862724f352" "aJ70YwHe4pGGJyTzUg==") 382 | (:encoding-test "900b92d3c4b74ca5088c9f3bd8" "kAuS08S3TKUIjJ872A==") 383 | (:encoding-test "bfdd434b3cb122f7a442f909b5" "v91DSzyxIvekQvkJtQ==") 384 | (:encoding-test "b3a0822f303eb675facf6bd736" "s6CCLzA-tnX6z2vXNg==") 385 | (:encoding-test "ab49937cf0c2801ed509daef62" "q0mTfPDCgB7VCdrvYg==") 386 | (:encoding-test "f73a3a98ad3b2f808bf25bf166" "9zo6mK07L4CL8lvxZg==") 387 | (:encoding-test "425777c3224020447fbba292bc" "Qld3wyJAIER_u6KSvA==") 388 | (:encoding-test "1c34c6ccf22eb440da72d5c9ce" "HDTGzPIutEDactXJzg==") 389 | (:encoding-test "1ba4c611165ea2fffb27f8941b" "G6TGERZeov_7J_iUGw==") 390 | (:encoding-test "a00e8f85fbc125f4e52d6a5ad9" "oA6PhfvBJfTlLWpa2Q==") 391 | (:encoding-test "24f86e0597d84e0900b4e8e4b8" "JPhuBZfYTgkAtOjkuA==") 392 | (:encoding-test "69fc5501ca7e119181843ea466" "afxVAcp-EZGBhD6kZg==") 393 | (:encoding-test "845f76bed154020a8643638529" "hF92vtFUAgqGQ2OFKQ==") 394 | (:encoding-test "bb3640e3f24ba09716afa46d7e" "uzZA4_JLoJcWr6Rtfg==") 395 | (:encoding-test "1d520231803d10a8ddd7d0a0c6" "HVICMYA9EKjd19Cgxg==") 396 | (:encoding-test "6f1af8dbdbcec9fc9146a85ea7" "bxr429vOyfyRRqhepw==") 397 | (:encoding-test "cfe8365b8c6be5f9abd80548d2" "z-g2W4xr5fmr2AVI0g==") 398 | (:encoding-test "40ba2cd4e9812ac4990a5f9d89" "QLos1OmBKsSZCl-diQ==") 399 | (:encoding-test "05f4d8fabee8f57fcf7855abf6" "BfTY-r7o9X_PeFWr9g==") 400 | (:encoding-test "a8c05416445322bc263a8873cf" "qMBUFkRTIrwmOohzzw==") 401 | (:encoding-test "c1d4a9d2e49526b6445dbbf271" "wdSp0uSVJrZEXbvycQ==") 402 | (:encoding-test "836461514bc643262cb172ffdc" "g2RhUUvGQyYssXL_3A==") 403 | (:encoding-test "c6b751596aeac00bb351aaea90" "xrdRWWrqwAuzUarqkA==") 404 | (:encoding-test "ebde85244e105552441177deed67" "696FJE4QVVJEEXfe7Wc=") 405 | (:encoding-test "0baefdc6e70f5b41ea7dd992f162" "C679xucPW0HqfdmS8WI=") 406 | (:encoding-test "861cbc2d1c8a6b02e39701684c36" "hhy8LRyKawLjlwFoTDY=") 407 | (:encoding-test "42b57e0d63f826d86106e88a4b94" "QrV-DWP4JthhBuiKS5Q=") 408 | (:encoding-test "399c468034c5900607492363666c" "OZxGgDTFkAYHSSNjZmw=") 409 | (:encoding-test "4c9e77ae043055741d353be83dfe" "TJ53rgQwVXQdNTvoPf4=") 410 | (:encoding-test "6948b5406141c60918d488e7d059" "aUi1QGFBxgkY1Ijn0Fk=") 411 | (:encoding-test "689166b1cdaaa7d8ae524733e499" "aJFmsc2qp9iuUkcz5Jk=") 412 | (:encoding-test "128e37b2139d2880d3e9f05e0b38" "Eo43shOdKIDT6fBeCzg=") 413 | (:encoding-test "a391dd90ea417b77cb081f3ef2bb" "o5HdkOpBe3fLCB8-8rs=") 414 | (:encoding-test "ff4f9cf76860744be98d60446cbd" "_0-c92hgdEvpjWBEbL0=") 415 | (:encoding-test "787558d4a9ca60fe75c5c093ad25" "eHVY1KnKYP51xcCTrSU=") 416 | (:encoding-test "4ed761a5a45c7e283916d3dddbaf" "TtdhpaRcfig5FtPd268=") 417 | (:encoding-test "23cfe64f72cb36d879f0e70f9188" "I8_mT3LLNth58OcPkYg=") 418 | (:encoding-test "c956f67299693f82ccf8ef0f7bfa" "yVb2cplpP4LM-O8Pe_o=") 419 | (:encoding-test "f29deee8c34dc8544eace4d9f30f" "8p3u6MNNyFROrOTZ8w8=") 420 | (:encoding-test "93e22b9b6dfc83391a13b7f10936" "k-Irm238gzkaE7fxCTY=") 421 | (:encoding-test "3faaf6920dc0d2705609e424f9e9" "P6r2kg3A0nBWCeQk-ek=") 422 | (:encoding-test "a2666c782539e9b56a246ef2a094" "omZseCU56bVqJG7yoJQ=") 423 | (:encoding-test "14046471f7cd54c643bf47ce8379" "FARkcffNVMZDv0fOg3k=") 424 | (:encoding-test "ada66b831a16c4efcd4376b19a7a" "raZrgxoWxO_NQ3axmno=") 425 | (:encoding-test "7e0c49a3a8226a27ea859ef9e6e3" "fgxJo6giaifqhZ755uM=") 426 | (:encoding-test "50a6afbfcb2087fab1f1bff13e49" "UKavv8sgh_qx8b_xPkk=") 427 | (:encoding-test "38fbe7df6989a81312885de0046f" "OPvn32mJqBMSiF3gBG8=") 428 | (:encoding-test "d3006d80c529ab3ad700c7f32f4a" "0wBtgMUpqzrXAMfzL0o=") 429 | (:encoding-test "666b73379b0f6788fb9e09321c4f" "ZmtzN5sPZ4j7ngkyHE8=") 430 | (:encoding-test "a5ffc0cdbc6373b8c861cb3d7917" "pf_Azbxjc7jIYcs9eRc=") 431 | (:encoding-test "637bbca2b0e0480e22ae9e160d5a" "Y3u8orDgSA4irp4WDVo=") 432 | (:encoding-test "c6b15aa10db89ed803820154881d" "xrFaoQ24ntgDggFUiB0=") 433 | (:encoding-test "ffde7b3821a45629e142e7e6768e" "_957OCGkVinhQufmdo4=") 434 | (:encoding-test "0837c452b9db15b7b50b308754b7" "CDfEUrnbFbe1CzCHVLc=") 435 | (:encoding-test "e063090df3079d885b0a475406dc66" "4GMJDfMHnYhbCkdUBtxm") 436 | (:encoding-test "dd0cf458b5b22d2e1141ecd9590265" "3Qz0WLWyLS4RQezZWQJl") 437 | (:encoding-test "494fb92c19f2ae6cbdd670b9dd2910" "SU-5LBnyrmy91nC53SkQ") 438 | (:encoding-test "82b842ab2b60cf6c5972a141d74474" "grhCqytgz2xZcqFB10R0") 439 | (:encoding-test "4cddd6eb7168b1e206a192be4cbe02" "TN3W63FoseIGoZK-TL4C") 440 | (:encoding-test "4fd5b78b091c16945a1f076b6250f6" "T9W3iwkcFpRaHwdrYlD2") 441 | (:encoding-test "45e3696fc601202ed3049500dd6efb" "ReNpb8YBIC7TBJUA3W77") 442 | (:encoding-test "9c105a03d2bc64dbfe192109cd8bb1" "nBBaA9K8ZNv-GSEJzYux") 443 | (:encoding-test "62d0c73237edfb982cb083380ba483" "YtDHMjft-5gssIM4C6SD") 444 | (:encoding-test "7984edd2a6f987e518807bb67adde5" "eYTt0qb5h-UYgHu2et3l") 445 | (:encoding-test "c45d268a5e5e5af9468928c75bbc12" "xF0mil5eWvlGiSjHW7wS") 446 | (:encoding-test "ad2f66c0fb6ade54910dfa8b8cde09" "rS9mwPtq3lSRDfqLjN4J") 447 | (:encoding-test "0b57bafb6489380f92b9e911caab49" "C1e6-2SJOA-SuekRyqtJ") 448 | (:encoding-test "a9b0cd6eebd90fd4683b52da3ae197" "qbDNbuvZD9RoO1LaOuGX") 449 | (:encoding-test "4fd4dea405840474fb53012d69f206" "T9TepAWEBHT7UwEtafIG") 450 | (:encoding-test "3a9eebc840b453842aae5bdb4d51f1" "Op7ryEC0U4QqrlvbTVHx") 451 | (:encoding-test "43664def6e38401e634e0126e1f85b" "Q2ZN7244QB5jTgEm4fhb") 452 | (:encoding-test "f906a85718935816e10235221d408b" "-QaoVxiTWBbhAjUiHUCL") 453 | (:encoding-test "5d53cc69b39883f2fda60a3297ab9b" "XVPMabOYg_L9pgoyl6ub") 454 | (:encoding-test "1edf6e82e5d8ed2a130ff9911d8255" "Ht9uguXY7SoTD_mRHYJV") 455 | (:encoding-test "54f873bd59e35cf41b86859abf5712" "VPhzvVnjXPQbhoWav1cS") 456 | (:encoding-test "8883503d8befc7d7427e617b14ff5d" "iINQPYvvx9dCfmF7FP9d") 457 | (:encoding-test "6ef491aa576b1ac4b170d55bf498f2" "bvSRqldrGsSxcNVb9Jjy") 458 | (:encoding-test "d029fc8a99abf322d1d53bad65b2e6" "0Cn8ipmr8yLR1TutZbLm") 459 | (:encoding-test "28556afa21d8a625d2f36533fb1e4f" "KFVq-iHYpiXS82Uz-x5P") 460 | (:encoding-test "41c70316a035646c74e4b93eecd19e" "QccDFqA1ZGx05Lk-7NGe") 461 | (:encoding-test "ca5be08e2d961be690aff59fc671eb" "ylvgji2WG-aQr_WfxnHr") 462 | (:encoding-test "cb4a90abe7152aa9e19da2bb80e195" "y0qQq-cVKqnhnaK7gOGV") 463 | (:encoding-test "f1b50fe16a5903657bff205195675f" "8bUP4WpZA2V7_yBRlWdf") 464 | (:encoding-test "367ba1aff846ed61edd3c558ce4316" "Nnuhr_hG7WHt08VYzkMW") 465 | (:encoding-test "e55b527158b85a82adb2e3c1f0305a" "5VtScVi4WoKtsuPB8DBa") 466 | (:encoding-test "912163cab534ac15ce0dd05de0568b83" "kSFjyrU0rBXODdBd4FaLgw==") 467 | (:encoding-test "53e0ccef8371b48e8f903eac9400b709" "U-DM74NxtI6PkD6slAC3CQ==") 468 | (:encoding-test "42dbb239b3c9b39a44a680ea67d05f41" "QtuyObPJs5pEpoDqZ9BfQQ==") 469 | (:encoding-test "3688702310eaa2280dc99d142e9fa165" "NohwIxDqoigNyZ0ULp-hZQ==") 470 | (:encoding-test "05a6da7071b4a242446e77f982d9f129" "BabacHG0okJEbnf5gtnxKQ==") 471 | (:encoding-test "7d0bca0649e1873db7b805f9a135e027" "fQvKBknhhz23uAX5oTXgJw==") 472 | (:encoding-test "995fac0c760c63a67e93d80b99d57b7e" "mV-sDHYMY6Z-k9gLmdV7fg==") 473 | (:encoding-test "c7de506637f3f2a1dc6e2c19047f3377" "x95QZjfz8qHcbiwZBH8zdw==") 474 | (:encoding-test "4ef6d13f06c730c5920bc14fdbec2043" "TvbRPwbHMMWSC8FP2-wgQw==") 475 | (:encoding-test "63445649a4f4f4ac04cb45eaf95716e4" "Y0RWSaT09KwEy0Xq-VcW5A==") 476 | (:encoding-test "cbca2267f94bcd6d320cbc595363a31a" "y8oiZ_lLzW0yDLxZU2OjGg==") 477 | (:encoding-test "57ee14c29080d588fcf3dd6364c6d4b1" "V-4UwpCA1Yj8891jZMbUsQ==") 478 | (:encoding-test "a15970b96e2fe10edba95851ef6b89fa" "oVlwuW4v4Q7bqVhR72uJ-g==") 479 | (:encoding-test "1d0460cfc9c84682ea78fc5e8cdd7d75" "HQRgz8nIRoLqePxejN19dQ==") 480 | (:encoding-test "1bd9fe82e305003f23e5bcbc417d74a3" "G9n-guMFAD8j5by8QX10ow==") 481 | (:encoding-test "53a2e8f0ab870032a5fdc4ec2e7e1429" "U6Lo8KuHADKl_cTsLn4UKQ==") 482 | (:encoding-test "e4b8a51e10d2a018df9814db48c8ed26" "5LilHhDSoBjfmBTbSMjtJg==") 483 | (:encoding-test "63822cbb02846741bf672745ed8db87e" "Y4IsuwKEZ0G_ZydF7Y24fg==") 484 | (:encoding-test "f27ca67257f404592079a92d2a2c4fd3" "8nymclf0BFkgeaktKixP0w==") 485 | (:encoding-test "b236633391dece973ffe4be279152253" "sjZjM5Hezpc__kvieRUiUw==") 486 | (:encoding-test "b0b429f498340821bbe940ba192efe02" "sLQp9Jg0CCG76UC6GS7-Ag==") 487 | (:encoding-test "6b9e7e8b99656bbba2c85c30f5d9931b" "a55-i5lla7uiyFww9dmTGw==") 488 | (:encoding-test "040bd159710c329d0ceb71b5aa85789e" "BAvRWXEMMp0M63G1qoV4ng==") 489 | (:encoding-test "b7aacada372e83faa1ecb38405e9e116" "t6rK2jcug_qh7LOEBenhFg==") 490 | (:encoding-test "8693253d91215ead939718bd06907417" "hpMlPZEhXq2Tlxi9BpB0Fw==") 491 | (:encoding-test "546de15827d22be1672de71286129da9" "VG3hWCfSK-FnLecShhKdqQ==") 492 | (:encoding-test "8092f184df6da940816ed188b943938b" "gJLxhN9tqUCBbtGIuUOTiw==") 493 | (:encoding-test "c8e7f197ebd502ad1549fa2458a07ec5" "yOfxl-vVAq0VSfokWKB-xQ==") 494 | (:encoding-test "e7b5a10439a84aa99cee29bc334f4604" "57WhBDmoSqmc7im8M09GBA==") 495 | (:encoding-test "739493854e630e5d9ede4f3496b06857" "c5SThU5jDl2e3k80lrBoVw==") 496 | (:encoding-test "d4bfb053bc162641214b5616634aba01" "1L-wU7wWJkEhS1YWY0q6AQ==") 497 | (:encoding-test "4305e4540e7e39effe79ef6d1b2c5cc5af" "QwXkVA5-Oe_-ee9tGyxcxa8=") 498 | (:encoding-test "9ab855978f5d81deb552af63cac6642f0e" "mrhVl49dgd61Uq9jysZkLw4=") 499 | (:encoding-test "450e101f384c57d9176b4b7ca810a370e1" "RQ4QHzhMV9kXa0t8qBCjcOE=") 500 | (:encoding-test "fb701ec452377beab2fa5769a6e05250ca" "-3AexFI3e-qy-ldppuBSUMo=") 501 | (:encoding-test "9e5f9392dcca4440381b13acff21ecf469" "nl-TktzKREA4GxOs_yHs9Gk=") 502 | (:encoding-test "06d8dede0233190dff73e669f8590e9a8b" "Btje3gIzGQ3_c-Zp-FkOmos=") 503 | (:encoding-test "27745af6901b4f905535553319e802051f" "J3Ra9pAbT5BVNVUzGegCBR8=") 504 | (:encoding-test "ca90afefc1f17afc27ebf62a1e8c5fbb40" "ypCv78Hxevwn6_YqHoxfu0A=") 505 | (:encoding-test "d61d963a0cb1f074a92fbffcdb647767fb" "1h2WOgyx8HSpL7_822R3Z_s=") 506 | (:encoding-test "f84fba8e96106ebea0f4674fce765164fe" "-E-6jpYQbr6g9GdPznZRZP4=") 507 | (:encoding-test "8ac645347bbf57fdf52ba99968b8ca495b" "isZFNHu_V_31K6mZaLjKSVs=") 508 | (:encoding-test "1ad048fbc4e9be03ab14e0adb78cd6d73c" "GtBI-8TpvgOrFOCtt4zW1zw=") 509 | (:encoding-test "f5b281597397de6914c5012b1921c3890e" "9bKBWXOX3mkUxQErGSHDiQ4=") 510 | (:encoding-test "7b87bf20315e49e439d4c48d6a393dd9c1" "e4e_IDFeSeQ51MSNajk92cE=") 511 | (:encoding-test "5dcee2a6581554667f86a340a0ad1779ca" "Xc7iplgVVGZ_hqNAoK0Xeco=") 512 | (:encoding-test "7c7c34033fb53e62dda7821736f7364014" "fHw0Az-1PmLdp4IXNvc2QBQ=") 513 | (:encoding-test "2e38a4568baf8b221cd395deb3b92ebe81" "LjikVouviyIc05Xes7kuvoE=") 514 | (:encoding-test "a0a0af2541ba9bf674ec3ed9b7e47ae0c0" "oKCvJUG6m_Z07D7Zt-R64MA=") 515 | (:encoding-test "85ba4a822eaae36232c485695cb278e956" "hbpKgi6q42IyxIVpXLJ46VY=") 516 | (:encoding-test "b6a741082c17eb9c6b5620d75b873b6a79" "tqdBCCwX65xrViDXW4c7ank=") 517 | (:encoding-test "833f89eea8cffe38dbea44aea8f6e00486" "gz-J7qjP_jjb6kSuqPbgBIY=") 518 | (:encoding-test "d002f99d2983a57a47e2a6600d56a4ab06" "0AL5nSmDpXpH4qZgDVakqwY=") 519 | (:encoding-test "fdadeeb11dc2302c15f505f79aca2ebeda" "_a3usR3CMCwV9QX3msouvto=") 520 | (:encoding-test "b4d50827ffd139d6bb907084fec2fc82a9" "tNUIJ__ROda7kHCE_sL8gqk=") 521 | (:encoding-test "c9b50358ea77e2a3c819a23b64b2e4ca94" "ybUDWOp34qPIGaI7ZLLkypQ=") 522 | (:encoding-test "e969c6f88bb3163a7179d3832521f63063" "6WnG-IuzFjpxedODJSH2MGM=") 523 | (:encoding-test "0f73c00b9f96b8a8bb57e56c18c078d9f9" "D3PAC5-WuKi7V-VsGMB42fk=") 524 | (:encoding-test "98d8d32038fbe2b203f6eda50b76bd778d" "mNjTIDj74rID9u2lC3a9d40=") 525 | (:encoding-test "47dc66b616e16e23106e42e5a4968a1b40" "R9xmthbhbiMQbkLlpJaKG0A=") 526 | (:encoding-test "f62518c47e2c74ac0d468983761e62a653" "9iUYxH4sdKwNRomDdh5iplM=") 527 | (:encoding-test "2019cd699334a6d8767c5a8bc98337c31e" "IBnNaZM0pth2fFqLyYM3wx4=") 528 | (:encoding-test "c48d28a0954b96dab631d72c1c6de14a1bbb" "xI0ooJVLltq2MdcsHG3hShu7") 529 | (:encoding-test "1f923bba1e6decb9ed7d6a68a4d56e394c4c" "H5I7uh5t7LntfWpopNVuOUxM") 530 | (:encoding-test "2d2483e2bc56a3726dc00ee509fc86a8048e" "LSSD4rxWo3JtwA7lCfyGqASO") 531 | (:encoding-test "659034424e35477e70dee969869ba5490f5f" "ZZA0Qk41R35w3ulphpulSQ9f") 532 | (:encoding-test "2dac7583b98e47278644896362d820f2593d" "Lax1g7mORyeGRIljYtgg8lk9") 533 | (:encoding-test "74b60422dbcc3836c4d0374aa24501687d69" "dLYEItvMODbE0DdKokUBaH1p") 534 | (:encoding-test "efce89628f512a4bad67741936d89c6742a1" "786JYo9RKkutZ3QZNticZ0Kh") 535 | (:encoding-test "e7480e850bb8707a915d6954bb6b0241ae8e" "50gOhQu4cHqRXWlUu2sCQa6O") 536 | (:encoding-test "2981c19b783d212738596d7824c89b0b97ff" "KYHBm3g9ISc4WW14JMibC5f_") 537 | (:encoding-test "931d6e5e45832027e0c7fd55c9026814410f" "kx1uXkWDICfgx_1VyQJoFEEP") 538 | (:encoding-test "879dd7a8272ed893ef798ad06b729a2815fb" "h53XqCcu2JPveYrQa3KaKBX7") 539 | (:encoding-test "0a68e79b9d80ada1b37b702e3b83d4dbbaf0" "Cmjnm52AraGze3AuO4PU27rw") 540 | (:encoding-test "3794153eb1e95809f77b76c56b4186665849" "N5QVPrHpWAn3e3bFa0GGZlhJ") 541 | (:encoding-test "2634cecad57b1000a41b4e80dd710e9906f9" "JjTOytV7EACkG06A3XEOmQb5") 542 | (:encoding-test "b059e1e42e8881f6dd5ed2b89a69efca49f1" "sFnh5C6IgfbdXtK4mmnvyknx") 543 | (:encoding-test "a3d0131f9bf166e9c8488303f4ac643c9fb9" "o9ATH5vxZunISIMD9KxkPJ-5") 544 | (:encoding-test "e253904a45b9c9594fb1b444a7fc8ec27094" "4lOQSkW5yVlPsbREp_yOwnCU") 545 | (:encoding-test "f989413f755d27f128a3f691f5890bb8017a" "-YlBP3VdJ_Eoo_aR9YkLuAF6") 546 | (:encoding-test "aeb13ff1ebb35a515358d86405515041836a" "rrE_8euzWlFTWNhkBVFQQYNq") 547 | (:encoding-test "a2ec87cecaabc94e922a7ece917c449b1d3b" "ouyHzsqryU6SKn7OkXxEmx07") 548 | (:encoding-test "89fbc4f407ae7ae4d223e3da171a6562bba3" "ifvE9AeueuTSI-PaFxplYruj") 549 | (:encoding-test "052edeea3cbb43590a1d051d9bece94f315c" "BS7e6jy7Q1kKHQUdm-zpTzFc") 550 | (:encoding-test "8bebf2aad4247056fee23fba29678032f04f" "i-vyqtQkcFb-4j-6KWeAMvBP") 551 | (:encoding-test "ce66ec9bd220bae1c5bf4839eaf9dc83ab6c" "zmbsm9IguuHFv0g56vncg6ts") 552 | (:encoding-test "081a5239cad29a5001e2dc770daf7fe400fc" "CBpSOcrSmlAB4tx3Da9_5AD8") 553 | (:encoding-test "fa3a30c51b8a6338c57f0291999e4cd9a035" "-jowxRuKYzjFfwKRmZ5M2aA1") 554 | (:encoding-test "27b70261e205708fb24dc83c529726c80f69" "J7cCYeIFcI-yTcg8UpcmyA9p") 555 | (:encoding-test "951ce09b49bdf9be33d0cae5646cdcd6b61a" "lRzgm0m9-b4z0MrlZGzc1rYa") 556 | (:encoding-test "61656611e97e3b06b216862a43c1253246b4" "YWVmEel-OwayFoYqQ8ElMka0") 557 | (:encoding-test "6cf9bbad310fa15cc4b576bf6e107f246812" "bPm7rTEPoVzEtXa_bhB_JGgS") 558 | (:encoding-test "94c87a41eef4e7872b9644edc30916d32c1d" "lMh6Qe7054crlkTtwwkW0ywd") 559 | (:encoding-test "2b77c5fea1513347f859cc1893df21341cbba4" "K3fF_qFRM0f4WcwYk98hNBy7pA==") 560 | (:encoding-test "3946385273851a33be5791ff7a4942bb02e1e0" "OUY4UnOFGjO-V5H_eklCuwLh4A==") 561 | (:encoding-test "b1defd13645dcbda5adca089888e31a7e975e4" "sd79E2Rdy9pa3KCJiI4xp-l15A==") 562 | (:encoding-test "977380e2771d3872db9adfdf7cfa7296b8d422" "l3OA4ncdOHLbmt_ffPpylrjUIg==") 563 | (:encoding-test "9d65fa245198aa287797d7b6c4771eb6360c26" "nWX6JFGYqih3l9e2xHcetjYMJg==") 564 | (:encoding-test "dd183acee5c8f6ae33932b067e68fbb45dc257" "3Rg6zuXI9q4zkysGfmj7tF3CVw==") 565 | (:encoding-test "6099e336baebf82871dbfc85c3d436ad473365" "YJnjNrrr-Chx2_yFw9Q2rUczZQ==") 566 | (:encoding-test "9d4e9cbebde2041eb4b0f54214344cf4f39c4f" "nU6cvr3iBB60sPVCFDRM9POcTw==") 567 | (:encoding-test "41143e72a53b1982d166edefcb1ba9533ec357" "QRQ-cqU7GYLRZu3vyxupUz7DVw==") 568 | (:encoding-test "896e129e40d0ce602f7d7e8642008bf19afea4" "iW4SnkDQzmAvfX6GQgCL8Zr-pA==") 569 | (:encoding-test "4939723cf09157a4c3ee8a38135d434b4ad0d9" "STlyPPCRV6TD7oo4E11DS0rQ2Q==") 570 | (:encoding-test "dd34f2c4d3fb6f11e0924e5dd7d7649e32b7fe" "3TTyxNP7bxHgkk5d19dknjK3_g==") 571 | (:encoding-test "564579de145a66ca1aee7836d6ab1cb2da5999" "VkV53hRaZsoa7ng21qscstpZmQ==") 572 | (:encoding-test "5c3bb3ec8ec9b259932786d192bd69717d8bc2" "XDuz7I7JslmTJ4bRkr1pcX2Lwg==") 573 | (:encoding-test "680173dc6b6dfb4f25e1cf54119a495e742777" "aAFz3Gtt-08l4c9UEZpJXnQndw==") 574 | (:encoding-test "5a59df8896b975add1a0f3e80fa93911ca1fae" "WlnfiJa5da3RoPPoD6k5Ecofrg==") 575 | (:encoding-test "aba5fc725a01f5a288f476057d31b2cbc9deae" "q6X8cloB9aKI9HYFfTGyy8nerg==") 576 | (:encoding-test "427d71718ad7c9bb61e88d143b3e40564719a4" "Qn1xcYrXybth6I0UOz5AVkcZpA==") 577 | (:encoding-test "ce2967a5a93b7467fa7b54650359798db3c708" "zilnpak7dGf6e1RlA1l5jbPHCA==") 578 | (:encoding-test "1e71cab678a62ccb333fa00f0ccae1e65f9c1f" "HnHKtnimLMszP6APDMrh5l-cHw==") 579 | (:encoding-test "ee854e63422b6cae9395c8d1e3151042767658" "7oVOY0IrbK6TlcjR4xUQQnZ2WA==") 580 | (:encoding-test "5a1a2b6858b06ddb75e23c17fffb4a82991913" "WhoraFiwbdt14jwX__tKgpkZEw==") 581 | (:encoding-test "09278d6ac143afe84bd99b77d47dafacc4c4db" "CSeNasFDr-hL2Zt31H2vrMTE2w==") 582 | (:encoding-test "62faa9f7b345d975f6aa53829bab6ecea66a28" "Yvqp97NF2XX2qlOCm6tuzqZqKA==") 583 | (:encoding-test "eab788d8a10704d1a16b73024c9d4be18b1eec" "6reI2KEHBNGha3MCTJ1L4Yse7A==") 584 | (:encoding-test "0a316609c19fa4934ce986ab9f0de8cb7cf192" "CjFmCcGfpJNM6Yarnw3oy3zxkg==") 585 | (:encoding-test "7d6ef35fed7bc0b9555095e53dfd8fd5e815e1" "fW7zX-17wLlVUJXlPf2P1egV4Q==") 586 | (:encoding-test "42ac3452e82a726c97af9dc945c6236f4e99f9" "Qqw0UugqcmyXr53JRcYjb06Z-Q==") 587 | (:encoding-test "6d5730bf0d4cebc0a3525478f1293add4c5110" "bVcwvw1M68CjUlR48Sk63UxREA==") 588 | (:encoding-test "52c4ec327c8afe6a15db7c698cb5774304eabc" "UsTsMnyK_moV23xpjLV3QwTqvA==") 589 | (:encoding-test "a23d412f0693f19b479565086326c9183c236b" "oj1BLwaT8ZtHlWUIYybJGDwjaw==") 590 | (:encoding-test "91aaf58bd1cb7b6d50ff0eeddb860ab594d47007" "kar1i9HLe21Q_w7t24YKtZTUcAc=") 591 | (:encoding-test "ed088ec98367f654a7aabb5d55bd5652acf0718a" "7QiOyYNn9lSnqrtdVb1WUqzwcYo=") 592 | (:encoding-test "9b34f6595ca5b3285287613954c1a405f5c7e3cd" "mzT2WVylsyhSh2E5VMGkBfXH480=") 593 | (:encoding-test "499fb75c6cd41ab5f1a9368c73b48d279d878dfd" "SZ-3XGzUGrXxqTaMc7SNJ52Hjf0=") 594 | (:encoding-test "9fa682657bef410260b3a2e7540a22c5517cb156" "n6aCZXvvQQJgs6LnVAoixVF8sVY=") 595 | (:encoding-test "f8b59af21ea55d50ac64b45791383ef77a521225" "-LWa8h6lXVCsZLRXkTg-93pSEiU=") 596 | (:encoding-test "eb01ec566f847727854e4ec2a2dd140b98787661" "6wHsVm-EdyeFTk7Cot0UC5h4dmE=") 597 | (:encoding-test "4fa58caca744d7c633f9dc9fbf81997f1e535086" "T6WMrKdE18Yz-dyfv4GZfx5TUIY=") 598 | (:encoding-test "ffec19a565f17e8bbb59f894da2ef6cad4cf98af" "_-wZpWXxfou7WfiU2i72ytTPmK8=") 599 | (:encoding-test "04ca3b79d7934154966173ee5390295e5146eb09" "BMo7edeTQVSWYXPuU5ApXlFG6wk=") 600 | (:encoding-test "b717e35450bec4fa43f911c11605d4f9cf9e0794" "txfjVFC-xPpD-RHBFgXU-c-eB5Q=") 601 | (:encoding-test "0537031d159346712cd512dcbd9d359515df6c63" "BTcDHRWTRnEs1RLcvZ01lRXfbGM=") 602 | (:encoding-test "a1eb09c2a0504471ad83e8e5911766329cc15a23" "oesJwqBQRHGtg-jlkRdmMpzBWiM=") 603 | (:encoding-test "352c336ae4634f7dce8fd1efae6a301c73ec42bf" "NSwzauRjT33Oj9HvrmowHHPsQr8=") 604 | (:encoding-test "b5c43847f57e32b803ab31b4299d24f83188ab37" "tcQ4R_V-MrgDqzG0KZ0k-DGIqzc=") 605 | (:encoding-test "cc5b6ae4235403f695148a133b7245fac2ca212a" "zFtq5CNUA_aVFIoTO3JF-sLKISo=") 606 | (:encoding-test "66d5337ba5198302f2e79b0972945f062508cbbd" "ZtUze6UZgwLy55sJcpRfBiUIy70=") 607 | (:encoding-test "1be8f27cbc5cc6f00d2cd87bcabc020ab3d6cfd1" "G-jyfLxcxvANLNh7yrwCCrPWz9E=") 608 | (:encoding-test "a8ed157af3f95f3d59d65f5ffd81ef8dfa30dd57" "qO0VevP5Xz1Z1l9f_YHvjfow3Vc=") 609 | (:encoding-test "c1953322cf423abeab60951e0838cc1d096013f7" "wZUzIs9COr6rYJUeCDjMHQlgE_c=") 610 | (:encoding-test "f27a9c352384d2c38d02f35eca1a8478f8c6b589" "8nqcNSOE0sONAvNeyhqEePjGtYk=") 611 | (:encoding-test "14554447737c4d7200734abe6c632fa2168bb103" "FFVER3N8TXIAc0q-bGMvohaLsQM=") 612 | (:encoding-test "8a9fdecbe01c9e0d99ef0202e00bfc5b5a5f39ed" "ip_ey-Acng2Z7wIC4Av8W1pfOe0=") 613 | (:encoding-test "21acc383835e9f861d0f562111af4e81e3711977" "IazDg4Nen4YdD1YhEa9OgeNxGXc=") 614 | (:encoding-test "0a94767fda15279fef8fa030844540c00ed8456c" "CpR2f9oVJ5_vj6AwhEVAwA7YRWw=") 615 | (:encoding-test "1e73e888cf5b6038d4d6f2952f6c97a7514254d0" "HnPoiM9bYDjU1vKVL2yXp1FCVNA=") 616 | (:encoding-test "b0dfba05a59439baf23e7098feb726be9fd98960" "sN-6BaWUObryPnCY_rcmvp_ZiWA=") 617 | (:encoding-test "773edf9f9692377d89e014a8444e325962854662" "dz7fn5aSN32J4BSoRE4yWWKFRmI=") 618 | (:encoding-test "e58b7d8500161c8b8497969c2cb5f4a71aeee887" "5Yt9hQAWHIuEl5acLLX0pxru6Ic=") 619 | (:encoding-test "0790d5c047474b651953c34b8f1872515eb091ce" "B5DVwEdHS2UZU8NLjxhyUV6wkc4=") 620 | (:encoding-test "cd7ed95b8bb8dffcdf6b3ce30bbd1c7f18c645c4" "zX7ZW4u43_zfazzjC70cfxjGRcQ=") 621 | (:encoding-test "32894e2969430bcacb9ade7057aa7dd34ca2f7fdb2" "MolOKWlDC8rLmt5wV6p900yi9_2y") 622 | (:encoding-test "e5b104888adc7c22237c04f0464d67227be846f5a0" "5bEEiIrcfCIjfATwRk1nInvoRvWg") 623 | (:encoding-test "04be319c8ef6d33b1d0b1800648358c641902abc78" "BL4xnI720zsdCxgAZINYxkGQKrx4") 624 | (:encoding-test "71abb01cb2c3b098a31d97a6f13fa57a32eca8a04b" "cauwHLLDsJijHZem8T-lejLsqKBL") 625 | (:encoding-test "2383d6c6914bf81d02acdd804faffd9bb717c7ae9a" "I4PWxpFL-B0CrN2AT6_9m7cXx66a") 626 | (:encoding-test "c35f5170cd0e8c3ad89146802db226237051f09918" "w19RcM0OjDrYkUaALbImI3BR8JkY") 627 | (:encoding-test "56322bac0b86912c31936c627471863de28d799185" "VjIrrAuGkSwxk2xidHGGPeKNeZGF") 628 | (:encoding-test "f53a4568c5dce13584154034c0366298941bb25416" "9TpFaMXc4TWEFUA0wDZimJQbslQW") 629 | (:encoding-test "a240d692ea3d25167aef464c04832b7b53a149d518" "okDWkuo9JRZ670ZMBIMre1OhSdUY") 630 | (:encoding-test "bdac7f844a0cddcb1adce73ac98ab2c0e701c32c0d" "vax_hEoM3csa3Oc6yYqywOcBwywN") 631 | (:encoding-test "54f185342fdf0bbe3f69569bd15db393d17e8ac4b6" "VPGFNC_fC74_aVab0V2zk9F-isS2") 632 | (:encoding-test "f4e756cd494b3d3b498d090e7603d67307532f1409" "9OdWzUlLPTtJjQkOdgPWcwdTLxQJ") 633 | (:encoding-test "be8c019c60df9a54f4db9eeacc0c37fff564fa75fa" "vowBnGDfmlT0257qzAw3__Vk-nX6") 634 | (:encoding-test "2d93446a3e7cbdb0c8bed9134398d6b05ef474a64d" "LZNEaj58vbDIvtkTQ5jWsF70dKZN") 635 | (:encoding-test "056e43b2cbb9cc8ba5168064e088c33fc4205bec82" "BW5Dssu5zIulFoBk4IjDP8QgW-yC") 636 | (:encoding-test "48b0f6b367ac56f5cefc0e775fd01677ed1c04fa23" "SLD2s2esVvXO_A53X9AWd-0cBPoj") 637 | (:encoding-test "14d76efc064475ffd3215a67ced9c9226cbf37c85d" "FNdu_AZEdf_TIVpnztnJImy_N8hd") 638 | (:encoding-test "36c94f69de4aa510326c902380510ffa5e0ece1694" "NslPad5KpRAybJAjgFEP-l4OzhaU") 639 | (:encoding-test "bbf93131c224b5d49da748ddb8d763723bc373e8e1" "u_kxMcIktdSdp0jduNdjcjvDc-jh") 640 | (:encoding-test "c5285e9f77bd9d1f0f4e30920e32798edfb1654df4" "xShen3e9nR8PTjCSDjJ5jt-xZU30") 641 | (:encoding-test "dcda2adedf5f1566899050de5d92362a04062bd652" "3Noq3t9fFWaJkFDeXZI2KgQGK9ZS") 642 | (:encoding-test "aef0f728bdcd89621a7a9a46b2a0d237180b961530" "rvD3KL3NiWIaeppGsqDSNxgLlhUw") 643 | (:encoding-test "4de3df1a1c5a01c25b7f7065cba3ba39109daedb79" "TePfGhxaAcJbf3Bly6O6ORCdrtt5") 644 | (:encoding-test "f181eb83ea2fa9f3289ed65a8c0eb5c4d7110da64d" "8YHrg-ovqfMontZajA61xNcRDaZN") 645 | (:encoding-test "bf9d13289f5da1a8ee78beffa7917a6337de293989" "v50TKJ9doajueL7_p5F6YzfeKTmJ") 646 | (:encoding-test "156f8ce673239a31ec009b45a01b1ca07607711662" "FW-M5nMjmjHsAJtFoBscoHYHcRZi") 647 | (:encoding-test "3b1a10e6fffd9e4c71fe9f7b5fe72efe1b789db733" "OxoQ5v_9nkxx_p97X-cu_ht4nbcz") 648 | (:encoding-test "3636695b231650a9daf88c09692506e89a9079d533" "NjZpWyMWUKna-IwJaSUG6JqQedUz") 649 | (:encoding-test "399046758fb1f65df9b148352b3985103b1ca827b3" "OZBGdY-x9l35sUg1KzmFEDscqCez") 650 | (:encoding-test "8af5958d8856b8acff0546ead7df4a34880bdd93a2" "ivWVjYhWuKz_BUbq199KNIgL3ZOi") 651 | (:encoding-test "d51be5f608d81dd2cebc23bdd1909184d55ef73588" "1Rvl9gjYHdLOvCO90ZCRhNVe9zWI") 652 | (:encoding-test "32bb2057adfd5e90a1a5283459ccfdbe9de2629f48f8" "MrsgV639XpChpSg0Wcz9vp3iYp9I-A==") 653 | (:encoding-test "61a8993e57187a3ed482991cef6e80a4d1d527590d92" "YaiZPlcYej7Ugpkc726ApNHVJ1kNkg==") 654 | (:encoding-test "21131a692aa2a15bc73fc37fd45f241762e8e173bb59" "IRMaaSqioVvHP8N_1F8kF2Lo4XO7WQ==") 655 | (:encoding-test "335c952860530c62b8960ee2c1d4eb1ed802a352401f" "M1yVKGBTDGK4lg7iwdTrHtgCo1JAHw==") 656 | (:encoding-test "882edc67ab4de368c5baa8b92546a06b46cca1d390b3" "iC7cZ6tN42jFuqi5JUaga0bModOQsw==") 657 | (:encoding-test "4ca18df2df2dedfdc54065bdb6c81c3a08c71101b215" "TKGN8t8t7f3FQGW9tsgcOgjHEQGyFQ==") 658 | (:encoding-test "f6f73ef4b7c3b004cea341e2f55d7c7fb68447b218ac" "9vc-9LfDsATOo0Hi9V18f7aER7IYrA==") 659 | (:encoding-test "c72dd47ada25346f8587fc66f785b092dc34a44f43d5" "xy3UetolNG-Fh_xm94Wwktw0pE9D1Q==") 660 | (:encoding-test "e1274a328d45f9a10150a78ad545252b500726c9def5" "4SdKMo1F-aEBUKeK1UUlK1AHJsne9Q==") 661 | (:encoding-test "2d18fedc0031cf3f7d5f2e042f8bd19d262f3e978e41" "LRj-3AAxzz99Xy4EL4vRnSYvPpeOQQ==") 662 | (:encoding-test "959714d0fcc384755e19fc73a052a40b1a50e546ad7f" "lZcU0PzDhHVeGfxzoFKkCxpQ5Uatfw==") 663 | (:encoding-test "2f83a7d5b837f99c5dd2ce047d10c21ea66a5c22ba5a" "L4On1bg3-Zxd0s4EfRDCHqZqXCK6Wg==") 664 | (:encoding-test "249db9163f1a15b68185e15649313a363a8eeece74ec" "JJ25Fj8aFbaBheFWSTE6NjqO7s507A==") 665 | (:encoding-test "7892513645baf177bb87cb6aabfbc8b1679d905d32bc" "eJJRNkW68Xe7h8tqq_vIsWedkF0yvA==") 666 | (:encoding-test "3e28cb7940e7b35b6cdf06c5faaf24afdd04f5a2bd38" "PijLeUDns1ts3wbF-q8kr90E9aK9OA==") 667 | (:encoding-test "17de644a651c77ab5d90918828bd603fd10f7bbe5f31" "F95kSmUcd6tdkJGIKL1gP9EPe75fMQ==") 668 | (:encoding-test "43d4357191d85aedf1df832b30dd49c2489131c666c5" "Q9Q1cZHYWu3x34MrMN1JwkiRMcZmxQ==") 669 | (:encoding-test "fb5afbe77aaaf27f7e1f5352c172fbee4c3d532e2b6a" "-1r753qq8n9-H1NSwXL77kw9Uy4rag==") 670 | (:encoding-test "505099168b800585a18434a567a988b7d483efe2fb89" "UFCZFouABYWhhDSlZ6mIt9SD7-L7iQ==") 671 | (:encoding-test "7e22b04fd2992ff6cdd1c331058128e53f13d928d9a3" "fiKwT9KZL_bN0cMxBYEo5T8T2SjZow==") 672 | (:encoding-test "d7c423934622e033e6171fb728e532a8f24cd2b2f511" "18Qjk0Yi4DPmFx-3KOUyqPJM0rL1EQ==") 673 | (:encoding-test "19e269d734f4a58e011e2c0c51c67316c82df74c340b" "GeJp1zT0pY4BHiwMUcZzFsgt90w0Cw==") 674 | (:encoding-test "cc7b79ce1043b09fb79615b2904866252b1aaadb9d47" "zHt5zhBDsJ-3lhWykEhmJSsaqtudRw==") 675 | (:encoding-test "63e6ffabff144ce2ff346a9764fe2fdb47a6f9c88d5f" "Y-b_q_8UTOL_NGqXZP4v20em-ciNXw==") 676 | (:encoding-test "d2be9306ec1c3a13c7425949de20be78274140b6bacf" "0r6TBuwcOhPHQllJ3iC-eCdBQLa6zw==") 677 | (:encoding-test "408c3213a290cd79672f780ed9f3d22c3862e59ecc39" "QIwyE6KQzXlnL3gO2fPSLDhi5Z7MOQ==") 678 | (:encoding-test "667827476b4d1c0a45cb390dc6d03b0c3068afdd36e3" "ZngnR2tNHApFyzkNxtA7DDBor9024w==") 679 | (:encoding-test "8eb16906a4ac7a98b152ad11aa19c36dc8bf6320a1ae" "jrFpBqSsepixUq0RqhnDbci_YyChrg==") 680 | (:encoding-test "ef6925dc17ce2e49c94daee752b4b065661bd9033aa7" "72kl3BfOLknJTa7nUrSwZWYb2QM6pw==") 681 | (:encoding-test "48eb66178c5cbc49a34cb6ae8215d0ac3846c31371a8" "SOtmF4xcvEmjTLaughXQrDhGwxNxqA==") 682 | (:encoding-test "cfa4f7a48f070b7d219323d271257619b66213a437fb" "z6T3pI8HC30hkyPScSV2GbZiE6Q3-w==") 683 | (:encoding-test "b782b710078332fb35c2209cb5a9c44b04abd8f02b0c6e" "t4K3EAeDMvs1wiCctanESwSr2PArDG4=") 684 | (:encoding-test "244376bf76e1ceccffff2f83088a84e666fd9704a07163" "JEN2v3bhzsz__y-DCIqE5mb9lwSgcWM=") 685 | (:encoding-test "358868a576ad906a9b8b26c6f9121ef5fb8923e67e189a" "NYhopXatkGqbiybG-RIe9fuJI-Z-GJo=") 686 | (:encoding-test "16bc23fd4167ee1dbbc7f127c3465ada310fc0815da0ad" "Frwj_UFn7h27x_Enw0Za2jEPwIFdoK0=") 687 | (:encoding-test "48c7c07cbd48feb1126567b29270fc1dcd798eafa11f28" "SMfAfL1I_rESZWeyknD8Hc15jq-hHyg=") 688 | (:encoding-test "534535062d719d53f9bb4a7fedb02c9e1095667b31dc7e" "U0U1Bi1xnVP5u0p_7bAsnhCVZnsx3H4=") 689 | (:encoding-test "bee6a03946c8805be8f9157a20d73ae24aff27d40df5c7" "vuagOUbIgFvo-RV6INc64kr_J9QN9cc=") 690 | (:encoding-test "27c60d8bf48fe5ebc1c5730bf987b42d592710869f0a94" "J8YNi_SP5evBxXML-Ye0LVknEIafCpQ=") 691 | (:encoding-test "b527d46ba90a24b38c1e9d1fe324d8c6bef75803735525" "tSfUa6kKJLOMHp0f4yTYxr73WANzVSU=") 692 | (:encoding-test "1096b94555bc6c44054c0e3398992aea05c01ab0af33ab" "EJa5RVW8bEQFTA4zmJkq6gXAGrCvM6s=") 693 | (:encoding-test "dc5eef4832188cf6afd7e7c4d7cc9934a419bcb6127a27" "3F7vSDIYjPav1-fE18yZNKQZvLYSeic=") 694 | (:encoding-test "8cffaebf19dafeb934ae7627f6e4460bc15a0998498b01" "jP-uvxna_rk0rnYn9uRGC8FaCZhJiwE=") 695 | (:encoding-test "cd113d750446061f87ce8ccdb9bebc8c1cc01fa8c219a3" "zRE9dQRGBh-HzozNub68jBzAH6jCGaM=") 696 | (:encoding-test "94b790e1a389d56f458ccf35854752ae8f8069588e38f2" "lLeQ4aOJ1W9FjM81hUdSro-AaViOOPI=") 697 | (:encoding-test "f43dacf691f5ac1fdde0c6aeb508ba23d504a42ae0b1bf" "9D2s9pH1rB_d4MautQi6I9UEpCrgsb8=") 698 | (:encoding-test "b17c1801a331811d35898cea2d25d50bd35c5269016626" "sXwYAaMxgR01iYzqLSXVC9NcUmkBZiY=") 699 | (:encoding-test "409ad81fa158416a3faa5c9d322f68fffe68a4de1bdce1" "QJrYH6FYQWo_qlydMi9o__5opN4b3OE=") 700 | (:encoding-test "fcc63bdcb80ba04678f8560dd510097441b6045f238ab8" "_MY73LgLoEZ4-FYN1RAJdEG2BF8jirg=") 701 | (:encoding-test "ab357a7a45342f6216f0cc940fef0146d948fc7053902c" "qzV6ekU0L2IW8MyUD-8BRtlI_HBTkCw=") 702 | (:encoding-test "8da076ca4cfa717f74ece65b3d50dbe977a20fb27f187c" "jaB2ykz6cX907OZbPVDb6XeiD7J_GHw=") 703 | (:encoding-test "699aa84a48fb5a359f3d2f3878de30e26a6f8ffbfc5773" "aZqoSkj7WjWfPS84eN4w4mpvj_v8V3M=") 704 | (:encoding-test "c954b31e2930fc4f62f83d546127bcd6767a53350a2290" "yVSzHikw_E9i-D1UYSe81nZ6UzUKIpA=") 705 | (:encoding-test "c294816725ed050a0821c29039da82d3163f5be8e6fb77" "wpSBZyXtBQoIIcKQOdqC0xY_W-jm-3c=") 706 | (:encoding-test "da697cb0a43e6ebbe5cba66dae2678354c10ebb84a637b" "2ml8sKQ-brvly6ZtriZ4NUwQ67hKY3s=") 707 | (:encoding-test "184d1c1ddd4009bb6129d276c1e2e5cdf259ab7075bbc3" "GE0cHd1ACbthKdJ2weLlzfJZq3B1u8M=") 708 | (:encoding-test "da46f255bc72bb902f6bd1b9ea27de7b2a2edc53085489" "2kbyVbxyu5Ava9G56ifeeyou3FMIVIk=") 709 | (:encoding-test "e2ca08154100cdd9aa92c79b939375f97fd158a61e15fc" "4soIFUEAzdmqksebk5N1-X_RWKYeFfw=") 710 | (:encoding-test "0684558eb40a0f69202384acf272f235e4a002f8e64200" "BoRVjrQKD2kgI4Ss8nLyNeSgAvjmQgA=") 711 | (:encoding-test "fad908333a9eb1ec510859b0332befb8c8cfd80638dd64" "-tkIMzqesexRCFmwMyvvuMjP2AY43WQ=") 712 | (:encoding-test "c6e38f2ac63a4bf94a431a25bbc3a2aa7876aef9c02b27" "xuOPKsY6S_lKQxolu8Oiqnh2rvnAKyc=") 713 | (:encoding-test "20383f2bd16ed510834b3aa4821f57fb84e7eccaefb6a7" "IDg_K9Fu1RCDSzqkgh9X-4Tn7Mrvtqc=") 714 | (:encoding-test "e1fd7b4ee5c203f0e33cd771c23ba43b4e9a2fa171f24fd8" "4f17TuXCA_DjPNdxwjukO06aL6Fx8k_Y") 715 | (:encoding-test "e097b80aa93b56f5a4641fb4b9e2ab7bd18756146b9f3e3e" "4Je4Cqk7VvWkZB-0ueKre9GHVhRrnz4-") 716 | (:encoding-test "77fd11e0645e83bdc0c86b2b8ff9fbf0da8c71f958d60d9a" "d_0R4GReg73AyGsrj_n78NqMcflY1g2a") 717 | (:encoding-test "f78054e15b4578122cad738df0d12d92f2b336a695521a54" "94BU4VtFeBIsrXON8NEtkvKzNqaVUhpU") 718 | (:encoding-test "8b4e0ca3b71bea7c4e4a38688d1ec00803ef6d9b433229f3" "i04Mo7cb6nxOSjhojR7ACAPvbZtDMinz") 719 | (:encoding-test "01e0a39e54a281fddc029bd4297ecf33405688a48ce1c543" "AeCjnlSigf3cApvUKX7PM0BWiKSM4cVD") 720 | (:encoding-test "84d85ec8aa4ea3aa113d05409229a92e726d8efd0fdeb292" "hNheyKpOo6oRPQVAkimpLnJtjv0P3rKS") 721 | (:encoding-test "2398057acfcc398816fec6173a0bbedc1dd64a7517d3a9c7" "I5gFes_MOYgW_sYXOgu-3B3WSnUX06nH") 722 | (:encoding-test "668f9b91e007e2d2d8563eb974a6e1091b1704a6f9c67b99" "Zo-bkeAH4tLYVj65dKbhCRsXBKb5xnuZ") 723 | (:encoding-test "1ad63a275e21b9b77f8e3da33f4a2e673165cfbf6114a24f" "GtY6J14hubd_jj2jP0ouZzFlz79hFKJP") 724 | (:encoding-test "5bdbfdccafb5d191394b2cdc960b3bc4ed861f5e98e54fc6" "W9v9zK-10ZE5Syzclgs7xO2GH16Y5U_G") 725 | (:encoding-test "7dce98a67752cd2e131d9aef2da57a73bd87bb56be73b0ac" "fc6YpndSzS4THZrvLaV6c72Hu1a-c7Cs") 726 | (:encoding-test "af58237d6cc028e9accb6c27196c281ef947009cafb426d0" "r1gjfWzAKOmsy2wnGWwoHvlHAJyvtCbQ") 727 | (:encoding-test "4f98ec2766f769d3dc3389e98eedf73c7ba7b3aac5eb594d" "T5jsJ2b3adPcM4npju33PHuns6rF61lN") 728 | (:encoding-test "a321edf969bed497c0febafed6cf6b6d12b79bf6c56498f6" "oyHt-Wm-1JfA_rr-1s9rbRK3m_bFZJj2") 729 | (:encoding-test "7ad0a119c1697122bc566940c7803a589d00e95374410449" "etChGcFpcSK8VmlAx4A6WJ0A6VN0QQRJ") 730 | (:encoding-test "7c51952cb1b40f8910f4cf5a3259178de91e18048753a8eb" "fFGVLLG0D4kQ9M9aMlkXjekeGASHU6jr") 731 | (:encoding-test "3e1776223a9dccff71faee61ac5ebfd97c67207f4539fea6" "Phd2IjqdzP9x-u5hrF6_2XxnIH9FOf6m") 732 | (:encoding-test "9e1371a24191026e060e884bd2de21296cbe945b0556d086" "nhNxokGRAm4GDohL0t4hKWy-lFsFVtCG") 733 | (:encoding-test "3de7c609f98598d0b90c0cdb5d7554b620fce06f1705f9ee" "PefGCfmFmNC5DAzbXXVUtiD84G8XBfnu") 734 | (:encoding-test "b7385ac7d18fa546f9830ff1945bf29496ebd66d4a1bee56" "tzhax9GPpUb5gw_xlFvylJbr1m1KG-5W") 735 | (:encoding-test "fa44016c9b03c782c41dd0e1482fb4e88b1a145f243e0b8b" "-kQBbJsDx4LEHdDhSC-06IsaFF8kPguL") 736 | (:encoding-test "8d72d66116a1215f42d0fce1616d0698f6cee63e97dfc5ac" "jXLWYRahIV9C0PzhYW0GmPbO5j6X38Ws") 737 | (:encoding-test "c8a967124a525f8671cb01ff07d644867078724af0929b77" "yKlnEkpSX4ZxywH_B9ZEhnB4ckrwkpt3") 738 | (:encoding-test "a02c9cbb586369df5a03c28ae37c8a6287ef25ccddb0cefc" "oCycu1hjad9aA8KK43yKYofvJczdsM78") 739 | (:encoding-test "47a51de3bad2c72244a7d75fa1549dd4bcefa30c2c3f9916" "R6Ud47rSxyJEp9dfoVSd1LzvowwsP5kW") 740 | (:encoding-test "56c3729e476e533f74f9b02711ba8333123cfcf9bac4571e" "VsNynkduUz90-bAnEbqDMxI8_Pm6xFce") 741 | (:encoding-test "b850b257eabaf79a44259b3a48ea22867f7357471a2145d4" "uFCyV-q695pEJZs6SOoihn9zV0caIUXU") 742 | (:encoding-test "f3f387c2c0a591b4eb4d3ba156228ef77e7797f365309be3" "8_OHwsClkbTrTTuhViKO9353l_NlMJvj") 743 | (:encoding-test "0f3a1dbd73d69eb207f63f98dca35ccf375f26b500af8a8d" "DzodvXPWnrIH9j-Y3KNczzdfJrUAr4qN") 744 | (:encoding-test "868d30271bb2ea44cac37551335621e5c93e4f662226979f" "ho0wJxuy6kTKw3VRM1Yh5ck-T2YiJpef") 745 | (:encoding-test "2b25dec0914b69fcd5aa07a7a7e47679f1447c1a6ba8560c04" "KyXewJFLafzVqgenp-R2efFEfBprqFYMBA==") 746 | (:encoding-test "3aca383bf4b50fe0a8b5f7db3fba685201e3f13a1313ce4ea7" "Oso4O_S1D-CotffbP7poUgHj8ToTE85Opw==") 747 | (:encoding-test "06c0969002a38b7021535f7cf719fc0c70bf9a05ef5da4f4a1" "BsCWkAKji3AhU1989xn8DHC_mgXvXaT0oQ==") 748 | (:encoding-test "2c907e46fc287c4e34805d2fcff43bf4e5f12b83a311218799" "LJB-RvwofE40gF0vz_Q79OXxK4OjESGHmQ==") 749 | (:encoding-test "3974c60075a9d781e2d6b627a63e24fdf80893ab9070e91fa3" "OXTGAHWp14Hi1rYnpj4k_fgIk6uQcOkfow==") 750 | (:encoding-test "1a82e68397eac1b36d2445ba5f59682c2503a2fcdb76c6521d" "GoLmg5fqwbNtJEW6X1loLCUDovzbdsZSHQ==") 751 | (:encoding-test "856c8dad9427825e7cb78af3848980c03f8c76c72c0fcc56e2" "hWyNrZQngl58t4rzhImAwD-MdscsD8xW4g==") 752 | (:encoding-test "e6b7b1438b2da3db0fcd6d0b184ec41408166406608b2d9875" "5rexQ4sto9sPzW0LGE7EFAgWZAZgiy2YdQ==") 753 | (:encoding-test "1a90038a4425356b053a529c07e71c6c426e0926dbb2e93ef6" "GpADikQlNWsFOlKcB-ccbEJuCSbbsuk-9g==") 754 | (:encoding-test "1774f81320ef15caa5799a97ae3dc3a67117dc6c3b79347d91" "F3T4EyDvFcqleZqXrj3DpnEX3Gw7eTR9kQ==") 755 | (:encoding-test "49b8148b85bd76bf6dd667ab8d110f1fa1774b9d723d1f4686" "SbgUi4W9dr9t1merjREPH6F3S51yPR9Ghg==") 756 | (:encoding-test "44cfe0f5b22887d813a96ed533a8f6b4c238e719e7a205f95f" "RM_g9bIoh9gTqW7VM6j2tMI45xnnogX5Xw==") 757 | (:encoding-test "8f00b65d8ca34ac97a35e57ba385be4ef449ba8f126d20881d" "jwC2XYyjSsl6NeV7o4W-TvRJuo8SbSCIHQ==") 758 | (:encoding-test "7b20f92b0cf74671f0d0ed8fe35737d34e8d8016fa412123c6" "eyD5Kwz3RnHw0O2P41c3006NgBb6QSEjxg==") 759 | (:encoding-test "0ded5fda0deea731394f6f5288816f87f72fda85ed325595f0" "De1f2g3upzE5T29SiIFvh_cv2oXtMlWV8A==") 760 | (:encoding-test "bbb5341ac936ec4ab786852d35ec3cdd20ad111cf5a0b7c319" "u7U0Gsk27Eq3hoUtNew83SCtERz1oLfDGQ==") 761 | (:encoding-test "03acf6feaf4996dd276bb987428c774968a18154dec78bc43a" "A6z2_q9Jlt0na7mHQox3SWihgVTex4vEOg==") 762 | (:encoding-test "9edb4182130db687d8464296cb42b6f6a9df9ce51afcf7c0cc" "nttBghMNtofYRkKWy0K29qnfnOUa_PfAzA==") 763 | (:encoding-test "32b8503de1ec8ec5386043d911023d9a42edbbc7cf17375c24" "MrhQPeHsjsU4YEPZEQI9mkLtu8fPFzdcJA==") 764 | (:encoding-test "b9882ca43e9ef41333d2f4a6d0589ebb0a8183cab5cfc1917b" "uYgspD6e9BMz0vSm0FieuwqBg8q1z8GRew==") 765 | (:encoding-test "dde282e9b79ebbbb6481ecdee4be2401ca89cbf10b58399bda" "3eKC6beeu7tkgeze5L4kAcqJy_ELWDmb2g==") 766 | (:encoding-test "f884d08796fd35f30c54b43d3bc61a20ea7498d34176e7cfd7" "-ITQh5b9NfMMVLQ9O8YaIOp0mNNBdufP1w==") 767 | (:encoding-test "cbc6d593f73f49e31c9cd86e86caeb4f02da96f2355d8d42c4" "y8bVk_c_SeMcnNhuhsrrTwLalvI1XY1CxA==") 768 | (:encoding-test "7655f777c7e2b6aa21febac8db888f6acf6ca057781b8147f1" "dlX3d8fitqoh_rrI24iPas9soFd4G4FH8Q==") 769 | (:encoding-test "eb423d59bd6a17c895ce881929679d69ad1b2718ad171d3cdb" "60I9Wb1qF8iVzogZKWedaa0bJxitFx082w==") 770 | (:encoding-test "b25e2d71a98a196cbb2277d939de57e568ceee4c5ded4930a7" "sl4tcamKGWy7InfZOd5X5WjO7kxd7Ukwpw==") 771 | (:encoding-test "efecdee1d86c23730edb894f203ed5556c045d5670e6e775bb" "7-ze4dhsI3MO24lPID7VVWwEXVZw5ud1uw==") 772 | (:encoding-test "03af7c2bb8b1339e3f6442795919a8d86fc7e3543eac026337" "A698K7ixM54_ZEJ5WRmo2G_H41Q-rAJjNw==") 773 | (:encoding-test "01e7d333d4b44fabf480c315d58d780b66931f46d933fcf868" "AefTM9S0T6v0gMMV1Y14C2aTH0bZM_z4aA==") 774 | (:encoding-test "c38fb4acb957cbc70a345029cb236499919e74cadd83182203" "w4-0rLlXy8cKNFApyyNkmZGedMrdgxgiAw==") 775 | (:encoding-test "075d052dfdb1f1951ca0b4bf572cb11f4b85645fc098050918" "B10FLf2x8ZUcoLS_VyyxH0uFZF_AmAUJGA==") 776 | (:encoding-test "cbecb6ed84153be5f7983bddf2913476464bd9bce8678df6a79f" "y-y27YQVO-X3mDvd8pE0dkZL2bzoZ432p58=") 777 | (:encoding-test "d1d4286aa57356d7d793a58e6e9b2e8a9b77f39c6a9818618c20" "0dQoaqVzVtfXk6WObpsuipt385xqmBhhjCA=") 778 | (:encoding-test "4034ffe56cff57b84104f53e62694c5567c38c77ef571cdacdc2" "QDT_5Wz_V7hBBPU-YmlMVWfDjHfvVxzazcI=") 779 | (:encoding-test "f4749496b603ed813bf891330e0f14e06b08411076f6fdd69e8a" "9HSUlrYD7YE7-JEzDg8U4GsIQRB29v3Wnoo=") 780 | (:encoding-test "d583ddda657f568638b930bb0279f3ea3950c092216f9b8dd401" "1YPd2mV_VoY4uTC7Annz6jlQwJIhb5uN1AE=") 781 | (:encoding-test "d9fa4068f0322bb29aa66ba4e37bbfed2d84acfef2ac6a120647" "2fpAaPAyK7Kapmuk43u_7S2ErP7yrGoSBkc=") 782 | (:encoding-test "8aea7a5fcc1204361bd187651defc6b6412b9643358b3e09aec2" "iup6X8wSBDYb0YdlHe_GtkErlkM1iz4JrsI=") 783 | (:encoding-test "cb8d92b6296f1c888dc1962a5c4982aa3e6d65f96934dfed1fff" "y42StilvHIiNwZYqXEmCqj5tZflpNN_tH_8=") 784 | (:encoding-test "0498a2f600e5df3395b7fd9c73ff1be05ddb9a1108b16c7a78ea" "BJii9gDl3zOVt_2cc_8b4F3bmhEIsWx6eOo=") 785 | (:encoding-test "6e6fa12d922a977c929cf9daeec5a16d8384c92f35ad8e1066f2" "bm-hLZIql3ySnPna7sWhbYOEyS81rY4QZvI=") 786 | (:encoding-test "2f081d8d9ee0e16f9d6fc32aa3e743ba3918d2c631ed1dcfca70" "LwgdjZ7g4W-db8Mqo-dDujkY0sYx7R3PynA=") 787 | (:encoding-test "202a596018d037e54729c21b675c1d677418799fbc7f0cc80d83" "ICpZYBjQN-VHKcIbZ1wdZ3QYeZ-8fwzIDYM=") 788 | (:encoding-test "55c21fc8a418719b4289934af6d5897081a109b8572034cbc951" "VcIfyKQYcZtCiZNK9tWJcIGhCbhXIDTLyVE=") 789 | (:encoding-test "e0423be82e402eb360a45eb3f3b5927c4030f98a25f712c4afab" "4EI76C5ALrNgpF6z87WSfEAw-Yol9xLEr6s=") 790 | (:encoding-test "df21920c6c4d219e7986dce9d75d5a43ae60823ed2ca61484590" "3yGSDGxNIZ55htzp111aQ65ggj7SymFIRZA=") 791 | (:encoding-test "05bcd24c93206e5d6d187cea9229eaf9d095de024753a5234efa" "BbzSTJMgbl1tGHzqkinq-dCV3gJHU6UjTvo=") 792 | (:encoding-test "61c8486127952a91e4a9bfa84f63a604d347690b96e1c789e56f" "YchIYSeVKpHkqb-oT2OmBNNHaQuW4ceJ5W8=") 793 | (:encoding-test "c24404c4728d68455bf8e1d4079e5dacc6e6aec127c07b259e5e" "wkQExHKNaEVb-OHUB55drMbmrsEnwHslnl4=") 794 | (:encoding-test "bfb9e604f915adc03d194cb5b01ec6aa31fea9597462d809493e" "v7nmBPkVrcA9GUy1sB7GqjH-qVl0YtgJST4=") 795 | (:encoding-test "00fc8758760f6cdf694e138d6976d5d2669f5de00054206f1129" "APyHWHYPbN9pThONaXbV0mafXeAAVCBvESk=") 796 | (:encoding-test "3fc3c7d3645b641c3776c7bc778623c6a3b798627703106167d9" "P8PH02RbZBw3dse8d4YjxqO3mGJ3AxBhZ9k=") 797 | (:encoding-test "ea72431b2501ff1c83cc49a54bb283d7df4d40297292073cb05b" "6nJDGyUB_xyDzEmlS7KD199NQClykgc8sFs=") 798 | (:encoding-test "6ef747d111042972d2dc8495c8846e2246836716817d0764efb0" "bvdH0REEKXLS3ISVyIRuIkaDZxaBfQdk77A=") 799 | (:encoding-test "d25385d5e58141cc1cd4f952969b3ab883b4c38a5a5758b3c4b2" "0lOF1eWBQcwc1PlSlps6uIO0w4paV1izxLI=") 800 | (:encoding-test "deba3b2950cb2648c53c25648c2e222c7250415586cb01788605" "3ro7KVDLJkjFPCVkjC4iLHJQQVWGywF4hgU=") 801 | (:encoding-test "b83df52b5798e6b859b2b7f71810c83a0313a904afb91a849aff" "uD31K1eY5rhZsrf3GBDIOgMTqQSvuRqEmv8=") 802 | (:encoding-test "291478a0ab687fb5608646a739a8da596854b16f8c415b82025a" "KRR4oKtof7VghkanOajaWWhUsW-MQVuCAlo=") 803 | (:encoding-test "c47230810acaa5916fd305e73263d0b4337a552bfa14f069ebbf" "xHIwgQrKpZFv0wXnMmPQtDN6VSv6FPBp678=") 804 | (:encoding-test "308394dc6fcda73b49b8ac272fd67727ebe2387d3c086bec1e48" "MIOU3G_NpztJuKwnL9Z3J-viOH08CGvsHkg=") 805 | (:encoding-test "cb9f8aaab1b1e4b9df4c88c3f37d507a5d04b0d7968a4c289cdc" "y5-KqrGx5LnfTIjD831Qel0EsNeWikwonNw=") 806 | (:encoding-test "e38bdc90f3205f842df36a77d6c4ad83c8b1e684200ae7c7ab08" "44vckPMgX4Qt82p31sStg8ix5oQgCufHqwg=") 807 | (:encoding-test "9656ff151f16f895ffdc45b3ce46542b653d7c5ae6978aa2ece0b3" "llb_FR8W-JX_3EWzzkZUK2U9fFrml4qi7OCz") 808 | (:encoding-test "1291ec0e8af318fb15c928cf7f6c766a20237343e7fb18e79738d2" "EpHsDorzGPsVySjPf2x2aiAjc0Pn-xjnlzjS") 809 | (:encoding-test "d597a5107971de13d2bd59585af8178540878accead11b020d93c3" "1ZelEHlx3hPSvVlYWvgXhUCHiszq0RsCDZPD") 810 | (:encoding-test "2d89a3582f8ccaa4670300d0361ca81e22bd6f8b8217a188c1dbc6" "LYmjWC-MyqRnAwDQNhyoHiK9b4uCF6GIwdvG") 811 | (:encoding-test "da4fefaa642925401ad1206f31908f344c3ceb4970a44b5535c55d" "2k_vqmQpJUAa0SBvMZCPNEw860lwpEtVNcVd") 812 | (:encoding-test "44880705b7afdddf8a5a30eea6d9df2da0f68a99b217204b15ed3b" "RIgHBbev3d-KWjDuptnfLaD2ipmyFyBLFe07") 813 | (:encoding-test "676933abbd9f551a4b9802754aa63d41009d947f9e4e9c95c5f9c0" "Z2kzq72fVRpLmAJ1SqY9QQCdlH-eTpyVxfnA") 814 | (:encoding-test "7ef809b37cff14dc11d4b4bfc5d3c277c4ad63197046e605234228" "fvgJs3z_FNwR1LS_xdPCd8StYxlwRuYFI0Io") 815 | (:encoding-test "4d8b07aa2da56e9263ef2ef14109e8b1fb5eb1ee8359a6c9d1c594" "TYsHqi2lbpJj7y7xQQnosftese6DWabJ0cWU") 816 | (:encoding-test "a23c0c449c6c8f2a2c106b07184e436d08f982cc250a5f7667c0d7" "ojwMRJxsjyosEGsHGE5DbQj5gswlCl92Z8DX") 817 | (:encoding-test "92daeaeff3c808d4afe1fb8d04cb3340abcf440ac56a31332c87d8" "ktrq7_PICNSv4fuNBMszQKvPRArFajEzLIfY") 818 | (:encoding-test "64465df1f0914bef1774debd7c6de951df69ce5380487ea59d1364" "ZEZd8fCRS-8XdN69fG3pUd9pzlOASH6lnRNk") 819 | (:encoding-test "ed85d07fd9663189f31fc6484456079ab0ec4a8eafea52df84be91" "7YXQf9lmMYnzH8ZIRFYHmrDsSo6v6lLfhL6R") 820 | (:encoding-test "ffa15786f89bfb9cc4956af24fba26a495bb5d3431d0826399baa3" "_6FXhvib-5zElWryT7ompJW7XTQx0IJjmbqj") 821 | (:encoding-test "d2475537d2b6a8b650eaebef804956cc7409eb6f1dc61bb1f983dc" "0kdVN9K2qLZQ6uvvgElWzHQJ628dxhux-YPc") 822 | (:encoding-test "f3d35c7aaa77da038a996bd6acf51106fee2c7afa5ac54f74f6996" "89Nceqp32gOKmWvWrPURBv7ix6-lrFT3T2mW") 823 | (:encoding-test "480c9fd4b57136168c061687a2f103ad40f1ef7a6441322118c510" "SAyf1LVxNhaMBhaHovEDrUDx73pkQTIhGMUQ") 824 | (:encoding-test "1c94beff44751ee73e2f9ebcf02b40b6bae67f91cd9debd511ec2f" "HJS-_0R1Huc-L5688CtAtrrmf5HNnevVEewv") 825 | (:encoding-test "33a745d137493a1376411b89fe7799ff24088fa42729be415083b8" "M6dF0TdJOhN2QRuJ_neZ_yQIj6QnKb5BUIO4") 826 | (:encoding-test "16a6103667ee1db8e2152fbaae0947d76508b22384e6aeb0affda8" "FqYQNmfuHbjiFS-6rglH12UIsiOE5q6wr_2o") 827 | (:encoding-test "5eb15b4b1ce610a5688ca8a8f01d294b5f78f6a3bddb45f423c728" "XrFbSxzmEKVojKio8B0pS1949qO920X0I8co") 828 | (:encoding-test "5367776499e5e52d2fb4d1eff9195a8beefd5fc34eeb0a70201a37" "U2d3ZJnl5S0vtNHv-Rlai-79X8NO6wpwIBo3") 829 | (:encoding-test "4ab9ecb99baa77910f84a4ba3cc0454d1b0096055acf2e30f0b191" "SrnsuZuqd5EPhKS6PMBFTRsAlgVazy4w8LGR") 830 | (:encoding-test "97103b5868671316f97bf0050a03991da24e64f95d630e9e6225b2" "lxA7WGhnExb5e_AFCgOZHaJOZPldYw6eYiWy") 831 | (:encoding-test "81fc696334e1f4de479eb82d078575b7a06f6e65c231ef6421a122" "gfxpYzTh9N5HnrgtB4V1t6BvbmXCMe9kIaEi") 832 | (:encoding-test "c0f98f7b02e64995b5b687acaa45f835c00c9330c0b6fe8eeb5215" "wPmPewLmSZW1toesqkX4NcAMkzDAtv6O61IV") 833 | (:encoding-test "38d58cad82e4ccbce808648333d6a3c9dfe092bbf00a9edfc224b9" "ONWMrYLkzLzoCGSDM9ajyd_gkrvwCp7fwiS5") 834 | (:encoding-test "a13fa6ef47f9919625deba05fa4031599f2029177bb630b8b70292" "oT-m70f5kZYl3roF-kAxWZ8gKRd7tjC4twKS") 835 | (:encoding-test "44e207a648d5ad0ee42f061ba9be1690db99adc474a1c8875b75d8" "ROIHpkjVrQ7kLwYbqb4WkNuZrcR0ociHW3XY") 836 | (:encoding-test "edf59d1d4f052abb88d3f91027b71621a30e0a4a4fc6b32b60fdf0" "7fWdHU8FKruI0_kQJ7cWIaMOCkpPxrMrYP3w") 837 | (:encoding-test "bfa9e857fc0f238caf2826abab40150b50b7e03a437dfd3e557ea4" "v6noV_wPI4yvKCarq0AVC1C34DpDff0-VX6k") 838 | (:encoding-test "d488e677e6ad62f6a5bb5964d6f73333a9e365b6f686f0d656aa7c16" "1Ijmd-atYvalu1lk1vczM6njZbb2hvDWVqp8Fg==") 839 | (:encoding-test "c2061550a69149d3de634defce39ec2a6cd0f242c32d47ea53b28879" "wgYVUKaRSdPeY03vzjnsKmzQ8kLDLUfqU7KIeQ==") 840 | (:encoding-test "5786a0da116e524ea5d2df4e620deb7ab890eabcabbdec8b2c04b31c" "V4ag2hFuUk6l0t9OYg3reriQ6ryrveyLLASzHA==") 841 | (:encoding-test "a117ecc4942a34530d96b7bc601d10717e4550e35dd6d80744f0d196" "oRfsxJQqNFMNlre8YB0QcX5FUONd1tgHRPDRlg==") 842 | (:encoding-test "769c37b71c51997919f491b3e1a329aa5663f5b8e91f0a1c543ab7c8" "dpw3txxRmXkZ9JGz4aMpqlZj9bjpHwocVDq3yA==") 843 | (:encoding-test "67fa1811ca332f438790d150cb7080d7e967f1bf11827fcbfe98db50" "Z_oYEcozL0OHkNFQy3CA1-ln8b8Rgn_L_pjbUA==") 844 | (:encoding-test "b5e95db7af42984c49011ae4c1d10ff4f3a1b33aea329496c1204bb7" "teldt69CmExJARrkwdEP9POhszrqMpSWwSBLtw==") 845 | (:encoding-test "65dfa5b7d8cba9eb8dc23fc19b3e966373d22e45756690af9efd072e" "Zd-lt9jLqeuNwj_Bmz6WY3PSLkV1ZpCvnv0HLg==") 846 | (:encoding-test "8fda0c82c1d6cb5d92938bf5d59d7bd629ddbe5694be4df55c395332" "j9oMgsHWy12Sk4v11Z171indvlaUvk31XDlTMg==") 847 | (:encoding-test "9de72fb6cc864a28745cbdb14d51927cdfb48eed96537366de34bd3b" "necvtsyGSih0XL2xTVGSfN-0ju2WU3Nm3jS9Ow==") 848 | (:encoding-test "090e68e164491246b4260d8724572d0e7821efff402e12f22ab75ed8" "CQ5o4WRJEka0Jg2HJFctDngh7_9ALhLyKrde2A==") 849 | (:encoding-test "a2c7fab6ac8ca70b4b25e80d7219a90ab83fc196069a82fd3036d083" "osf6tqyMpwtLJegNchmpCrg_wZYGmoL9MDbQgw==") 850 | (:encoding-test "582d0c277ebedf818a559df5124941d0089c2ffdb1f539147fc727be" "WC0MJ36-34GKVZ31EklB0AicL_2x9TkUf8cnvg==") 851 | (:encoding-test "730dda029c93ab7f5fbcffd291ea43afecc1afdd98d482a7b17cb06f" "cw3aApyTq39fvP_SkepDr-zBr92Y1IKnsXywbw==") 852 | (:encoding-test "0665f2a8b36c3bc9f8b081d6202e19742567405856051de9e900b784" "BmXyqLNsO8n4sIHWIC4ZdCVnQFhWBR3p6QC3hA==") 853 | (:encoding-test "c96bef28e55f0969d7a8acba2d6d6622dcf2f42426659c1eb2bd2b37" "yWvvKOVfCWnXqKy6LW1mItzy9CQmZZwesr0rNw==") 854 | (:encoding-test "e397a1dfb1bd513503d5af80a1e8b9a7632af018848e79a6ef5e9dd8" "45eh37G9UTUD1a-Aoei5p2Mq8BiEjnmm716d2A==") 855 | (:encoding-test "b3d036716e2fa97aae6f1befc23acd0627a0cf8c4f5db93863d491cc" "s9A2cW4vqXqubxvvwjrNBiegz4xPXbk4Y9SRzA==") 856 | (:encoding-test "26361c7a9ca21a7c0d4d917e9306ceab17175ce0f8e806974e6a0638" "JjYcepyiGnwNTZF-kwbOqxcXXOD46AaXTmoGOA==") 857 | (:encoding-test "09b125f8c969978a9c64f3455476c9e488b067ae3a7ab957e5e0c2b1" "CbEl-Mlpl4qcZPNFVHbJ5IiwZ646erlX5eDCsQ==") 858 | (:encoding-test "ced1371001e816ecddaa2f7f29df80a144ec9a6b3f916cce330bfa13" "ztE3EAHoFuzdqi9_Kd-AoUTsmms_kWzOMwv6Ew==") 859 | (:encoding-test "e70d76cbd6cf6ed3fb27f3f3c2afaf3c58a8047ba4099fd1cf179770" "5w12y9bPbtP7J_Pzwq-vPFioBHukCZ_RzxeXcA==") 860 | (:encoding-test "27b8bb5800cec498e3e7e6b5b656bac292ac31462c82039292c40761" "J7i7WADOxJjj5-a1tla6wpKsMUYsggOSksQHYQ==") 861 | (:encoding-test "24d16fc99c31bd514bf2da7bacd8af3956945d305720ca4d4eef72e1" "JNFvyZwxvVFL8tp7rNivOVaUXTBXIMpNTu9y4Q==") 862 | (:encoding-test "3858674e3084559ba92149cd293507f7b10657327b672f90ff0132a3" "OFhnTjCEVZupIUnNKTUH97EGVzJ7Zy-Q_wEyow==") 863 | (:encoding-test "25602254ee3b2fa79a1b4bd9562ffa153a4ee0629b47d77af738c33d" "JWAiVO47L6eaG0vZVi_6FTpO4GKbR9d69zjDPQ==") 864 | (:encoding-test "422ec179faa1096f82050793f7a9c8e8fe03a2ee281b83543ca33708" "Qi7BefqhCW-CBQeT96nI6P4Dou4oG4NUPKM3CA==") 865 | (:encoding-test "c96ce3ef5a7cd550939d273b1d56402a5a68ae6bd4bedab5e1736617" "yWzj71p81VCTnSc7HVZAKlpormvUvtq14XNmFw==") 866 | (:encoding-test "ca1f0da1910a3292c0d2796d894acd40e26769d147ebcd64a8dd03b0" "yh8NoZEKMpLA0nltiUrNQOJnadFH681kqN0DsA==") 867 | (:encoding-test "90b59e0b1d347b06725b9054aac5afbb3df4066718e3202cbcc94234" "kLWeCx00ewZyW5BUqsWvuz30BmcY4yAsvMlCNA==") 868 | (:encoding-test "da31bd0572c10a31d7815007d042bf33abf28f4357a1dcd027d5dbad" "2jG9BXLBCjHXgVAH0EK_M6vyj0NXodzQJ9XbrQ==") 869 | (:encoding-test "fd93df7ca33dece79643109cac071ce3129b99c4a8a9e69df108c39403" "_ZPffKM97OeWQxCcrAcc4xKbmcSoqead8QjDlAM=") 870 | (:encoding-test "28b7a6670dd7cf7a79dc8b21ad32f15f9526ae1bddf2caf4aeff1a5d7d" "KLemZw3Xz3p53IshrTLxX5Umrhvd8sr0rv8aXX0=") 871 | (:encoding-test "7511292d0422e38fbb7890778078f773cfa41b55989e38696006c8b25c" "dREpLQQi44-7eJB3gHj3c8-kG1WYnjhpYAbIslw=") 872 | (:encoding-test "86aaac5e3a4744a9ee7bb3df2e92feaa9ca3a7ffb88f39066455d3394f" "hqqsXjpHRKnue7PfLpL-qpyjp_-4jzkGZFXTOU8=") 873 | (:encoding-test "ab168627ba7391f6ca4ab77c7401320f240dfda1af6075151f074483b5" "qxaGJ7pzkfbKSrd8dAEyDyQN_aGvYHUVHwdEg7U=") 874 | (:encoding-test "463e7eeb18a98074db93b15901844ead44f13c0d7964712269be2bff6f" "Rj5-6xipgHTbk7FZAYROrUTxPA15ZHEiab4r_28=") 875 | (:encoding-test "6017909e18439216c9347bf6e61e0de47cce5830863f7b01949d453948" "YBeQnhhDkhbJNHv25h4N5HzOWDCGP3sBlJ1FOUg=") 876 | (:encoding-test "5056bdc3020e9ad4ac15877b9a7f564c995f9a347ee18fa5915c2ee5f7" "UFa9wwIOmtSsFYd7mn9WTJlfmjR-4Y-lkVwu5fc=") 877 | (:encoding-test "4d249c10298b121e24a80ac531eab4bc9e709a1ce5696c0e807c04e877" "TSScECmLEh4kqArFMeq0vJ5wmhzlaWwOgHwE6Hc=") 878 | (:encoding-test "e642b7d460f4d7083cb5faefae1fe077f33846057b1b1ee98983586383" "5kK31GD01wg8tfrvrh_gd_M4RgV7Gx7piYNYY4M=") 879 | (:encoding-test "258dedf2d317a32c0e51ce6eb9738732422e32848d7fd5a2bae7826247" "JY3t8tMXoywOUc5uuXOHMkIuMoSNf9WiuueCYkc=") 880 | (:encoding-test "89f0aec200bb58588e90f22e3d8a7ab8564d5d9c6fd30493b878826280" "ifCuwgC7WFiOkPIuPYp6uFZNXZxv0wSTuHiCYoA=") 881 | (:encoding-test "bf41c4a56532a18b5fd450ca6e751717c257ca0c92372dad0c391029fb" "v0HEpWUyoYtf1FDKbnUXF8JXygySNy2tDDkQKfs=") 882 | (:encoding-test "9bcfd4ddd424e89eed62b50ed1c555eea2ae57345256af864ba9a97e38" "m8_U3dQk6J7tYrUO0cVV7qKuVzRSVq-GS6mpfjg=") 883 | (:encoding-test "005a30d2b59f3c0ce05a1c6dabea2f984d0476c18a5f6fd52cd0536f8c" "AFow0rWfPAzgWhxtq-ovmE0EdsGKX2_VLNBTb4w=") 884 | (:encoding-test "bdf0760a025e4df6f7f54ebd60a0fb5dbe325e522d8b4dfc0ad77714f0" "vfB2CgJeTfb39U69YKD7Xb4yXlIti038Ctd3FPA=") 885 | (:encoding-test "a4b8b0803344fb328935dfeb900a1a31d4a832820334d79b0f4fbb5650" "pLiwgDNE-zKJNd_rkAoaMdSoMoIDNNebD0-7VlA=") 886 | (:encoding-test "c68577f23ae2ba2c2650a256c39498a9714aafc1061e846323eacf9ac5" "xoV38jriuiwmUKJWw5SYqXFKr8EGHoRjI-rPmsU=") 887 | (:encoding-test "819e8d73ff15c7cee51247f412ae5a1bb5b9cb9d5bebf8d2cf81238c4b" "gZ6Nc_8Vx87lEkf0Eq5aG7W5y51b6_jSz4EjjEs=") 888 | (:encoding-test "f3bf0b1debfa889c7340a7ec780dcc3c5315dd8312157eafda54fd131e" "878LHev6iJxzQKfseA3MPFMV3YMSFX6v2lT9Ex4=") 889 | (:encoding-test "2c2c146f6f707ce42e47746844093d92c27cb389fe4e0f5be472f2672b" "LCwUb29wfOQuR3RoRAk9ksJ8s4n-Tg9b5HLyZys=") 890 | (:encoding-test "8daef5e36fb52745b75a13863726389bee4a952bb540be070a713625fb" "ja7142-1J0W3WhOGNyY4m-5KlSu1QL4HCnE2Jfs=") 891 | (:encoding-test "7f488d3530a870f8655b85c8da8468e40254986b993be884cfbbd5911e" "f0iNNTCocPhlW4XI2oRo5AJUmGuZO-iEz7vVkR4=") 892 | (:encoding-test "26e89408c67dd0c45495f816f8b58eed8970b7a47d5aec8c3591eb1001" "JuiUCMZ90MRUlfgW-LWO7Ylwt6R9WuyMNZHrEAE=") 893 | (:encoding-test "dad077e616b402dc9a5946c33858f6d1a1b42bee8137bbe51503ac60e7" "2tB35ha0AtyaWUbDOFj20aG0K-6BN7vlFQOsYOc=") 894 | (:encoding-test "6480c82e6092991e7042ca756e12575a2a118b7051b5d677398412d475" "ZIDILmCSmR5wQsp1bhJXWioRi3BRtdZ3OYQS1HU=") 895 | (:encoding-test "0bb9e28d496b815be958828257d826754688ce1b9ebfe520d8e9550887" "C7nijUlrgVvpWIKCV9gmdUaIzhuev-Ug2OlVCIc=") 896 | (:encoding-test "aa215b0584ec9c8feb9e9f488e887cf3aed39a90653c6c4b9d8c960aac" "qiFbBYTsnI_rnp9Ijoh8867TmpBlPGxLnYyWCqw=") 897 | (:encoding-test "f88fc530e6deadd782ffe5c9ed02a116f08ee8f02a0ca815882ee4bf60" "-I_FMOberdeC_-XJ7QKhFvCO6PAqDKgViC7kv2A=") 898 | (:encoding-test "df30af45e4765b62ed677b81be2725c79d68a6e59878dbb650a8d393ca" "3zCvReR2W2LtZ3uBviclx51opuWYeNu2UKjTk8o=") 899 | (:encoding-test "52b1ca5ade22886caff7b47cbba6798310230cd6df7bf149b3aef93da4" "UrHKWt4iiGyv97R8u6Z5gxAjDNbfe_FJs675PaQ=") 900 | (:encoding-test "e8f7953e5009fe62a60876578d29a3644cf570a1dbb3a9d12c229fb884f8" "6PeVPlAJ_mKmCHZXjSmjZEz1cKHbs6nRLCKfuIT4") 901 | (:encoding-test "0779448ef02bf991da59690bf2fe02c98ace553bc35e6c95226ad5105a66" "B3lEjvAr-ZHaWWkL8v4CyYrOVTvDXmyVImrVEFpm") 902 | (:encoding-test "c7153387f5d37487392ab95d5aade87984859f7a304c71539ad319075165" "xxUzh_XTdIc5KrldWq3oeYSFn3owTHFTmtMZB1Fl") 903 | (:encoding-test "881bb1fab2f2304948ef23503c40eb0f33603ce97a2bdc8210a1ae64a111" "iBux-rLyMElI7yNQPEDrDzNgPOl6K9yCEKGuZKER") 904 | (:encoding-test "ee4e42fe4bd823bd7066532d1324e6a0eab3e159b386de83034d685db74b" "7k5C_kvYI71wZlMtEyTmoOqz4Vmzht6DA01oXbdL") 905 | (:encoding-test "4f4f76f19c10685a3d18aa0ce32052153dd641c2e0d5b10040445dbb033f" "T0928ZwQaFo9GKoM4yBSFT3WQcLg1bEAQERduwM_") 906 | (:encoding-test "48fc6ffa239096a80860ddb91d86f79e1370e3d307d33e9d5152aba1ed84" "SPxv-iOQlqgIYN25HYb3nhNw49MH0z6dUVKroe2E") 907 | (:encoding-test "2f832850ec8c330476ad954fd49399f4bf02b24ff6d3ced1407358b51133" "L4MoUOyMMwR2rZVP1JOZ9L8Csk_2087RQHNYtREz") 908 | (:encoding-test "2d73816e88064820821be0bae01ef21969d9846e40d190720c3a23c5d292" "LXOBbogGSCCCG-C64B7yGWnZhG5A0ZByDDojxdKS") 909 | (:encoding-test "601286b5c451e7b783f8ab33b90277bcd958eff352b382c167e9721c90dd" "YBKGtcRR57eD-KszuQJ3vNlY7_NSs4LBZ-lyHJDd") 910 | (:encoding-test "ce5e66a5feac4806253402e2cc27fe57ca279ff4d9c5169b65dfc3d2d924" "zl5mpf6sSAYlNALizCf-V8onn_TZxRabZd_D0tkk") 911 | (:encoding-test "ddfa0531091c7f6fd0fcea86db1b7ebac978dbec9fd485fdda28116632c1" "3foFMQkcf2_Q_OqG2xt-usl42-yf1IX92igRZjLB") 912 | (:encoding-test "fda9f7d889c6ab50598212d98f83ec22f673572bdc02279481a515b11ed9" "_an32InGq1BZghLZj4PsIvZzVyvcAieUgaUVsR7Z") 913 | (:encoding-test "88454f7559c90f9517a8c612dc334ab589b27643df4c3590b5001c62fae9" "iEVPdVnJD5UXqMYS3DNKtYmydkPfTDWQtQAcYvrp") 914 | (:encoding-test "9a4f1151552e86b986cbe4ba2088dc13ac21d3191aa885b43e060a21084a" "mk8RUVUuhrmGy-S6IIjcE6wh0xkaqIW0PgYKIQhK") 915 | (:encoding-test "b507b48ddce98959f98bafe96a9901b043f45757eaa2f7584bcdb7bcbee5" "tQe0jdzpiVn5i6_papkBsEP0V1fqovdYS823vL7l") 916 | (:encoding-test "ca60ed130c95b4c181743308078d70abb3b23e2fbcabcb68770f13db7e17" "ymDtEwyVtMGBdDMIB41wq7OyPi-8q8todw8T234X") 917 | (:encoding-test "817b53d8acf1603239f5b9986018069ac1ffe1f4d0d061659361d3b12569" "gXtT2KzxYDI59bmYYBgGmsH_4fTQ0GFlk2HTsSVp") 918 | (:encoding-test "77824134fc98f64ce14ca002f317b15fafc70cb6c5eb4c237e67cfcd894f" "d4JBNPyY9kzhTKAC8xexX6_HDLbF60wjfmfPzYlP") 919 | (:encoding-test "4ec66e1065fe793d2b463efcaf6464aee7fc5b7a50532b97d5715f417113" "TsZuEGX-eT0rRj78r2Rkruf8W3pQUyuX1XFfQXET") 920 | (:encoding-test "de98fa42149fb2127515067642818719e943d8f239939becc057737f996a" "3pj6QhSfshJ1FQZ2QoGHGelD2PI5k5vswFdzf5lq") 921 | (:encoding-test "93016a8bc6c743aa413f1d8ad9198c553c28c70f2f8076892c85cc4e1799" "kwFqi8bHQ6pBPx2K2RmMVTwoxw8vgHaJLIXMTheZ") 922 | (:encoding-test "9962572004429609e9893ed16539ef3e18f285aba40ab65cb4f9155327bc" "mWJXIARClgnpiT7RZTnvPhjyhaukCrZctPkVUye8") 923 | (:encoding-test "56f0557e1f97d2893b7f18cd4cb5ce110652d33a0a0ac518c092130a3942" "VvBVfh-X0ok7fxjNTLXOEQZS0zoKCsUYwJITCjlC") 924 | (:encoding-test "c04699d48df6c05f31f69a0fe56f9fea7d632a8cef4e47c8fd5ea8a09d6a" "wEaZ1I32wF8x9poP5W-f6n1jKozvTkfI_V6ooJ1q") 925 | (:encoding-test "75a9ee9e89c6ac12276dcc36926a0e563468d9c8fc0a131d4d90fbc10126" "danunonGrBInbcw2kmoOVjRo2cj8ChMdTZD7wQEm") 926 | (:encoding-test "2e67501869f1d90a05140792cd7d05cc0479fd67978c6318aeda66262603" "LmdQGGnx2QoFFAeSzX0FzAR5_WeXjGMYrtpmJiYD") 927 | (:encoding-test "b3d2ab20f8494f75b8e0122786242957f780fae01b3aa45d63ccec13ce6c" "s9KrIPhJT3W44BInhiQpV_eA-uAbOqRdY8zsE85s") 928 | (:encoding-test "aa496426be5bebc5e8e9f3568fad809b07781f40782f9bc49d79db6f908e" "qklkJr5b68Xo6fNWj62Amwd4H0B4L5vEnXnbb5CO") 929 | (:encoding-test "0cfed09a41f2e1f6493e5aaf2c47df9608fdf52163c4975e4d426a5099c1" "DP7QmkHy4fZJPlqvLEfflgj99SFjxJdeTUJqUJnB") 930 | (:encoding-test "9526d91c5c009ee22f743996f8c4e3fb5a5a0832a2c7f84283ae214a4714" "lSbZHFwAnuIvdDmW-MTj-1paCDKix_hCg64hSkcU") 931 | (:encoding-test "4eafb8cf62f5f9cf19758f91587e380d553113704bb91a4b6756ca224e4be0" "Tq-4z2L1-c8ZdY-RWH44DVUxE3BLuRpLZ1bKIk5L4A==") 932 | (:encoding-test "0c92dbb9981baaa3e069b7473991925a8dcd8ddbb5a8bf445cd24392d6bec1" "DJLbuZgbqqPgabdHOZGSWo3Njdu1qL9EXNJDkta-wQ==") 933 | (:encoding-test "ecde1fd94e4009b17e3c0bf98bd00851603d180d21adf87031a4ef74f1ef76" "7N4f2U5ACbF-PAv5i9AIUWA9GA0hrfhwMaTvdPHvdg==") 934 | (:encoding-test "183aa52cb77b34b21ae120f4c2a529bc7955c375c5efc8697aedb512fc0a7f" "GDqlLLd7NLIa4SD0wqUpvHlVw3XF78hpeu21EvwKfw==") 935 | (:encoding-test "4b2f224b63a3ef9c0ff2b58a268954098c39b026ffb6457f7e81bdc7fe515c" "Sy8iS2Oj75wP8rWKJolUCYw5sCb_tkV_foG9x_5RXA==") 936 | (:encoding-test "581a22b310e310fdf60703ad04bcde6e53b5b9f4be04caa1ea8ee37cc230a2" "WBoisxDjEP32BwOtBLzeblO1ufS-BMqh6o7jfMIwog==") 937 | (:encoding-test "39ae5196ecfc27f336b8a14473a702b683d9b6bcd004f94b846c98cb4b8af9" "Oa5Rluz8J_M2uKFEc6cCtoPZtrzQBPlLhGyYy0uK-Q==") 938 | (:encoding-test "b5fac638b16ddfbe71217fefccea95231f48124f07b8e0314f3f4393478c45" "tfrGOLFt375xIX_vzOqVIx9IEk8HuOAxTz9Dk0eMRQ==") 939 | (:encoding-test "58e0c2bb39d774612edb504d431c3515a6dd15003fca10830fab9d726343d7" "WODCuznXdGEu21BNQxw1FabdFQA_yhCDD6udcmND1w==") 940 | (:encoding-test "5b83cf0609a0b138f4d8161b8c19a26a59c0c5616dca2451845ee100c8ed11" "W4PPBgmgsTj02BYbjBmialnAxWFtyiRRhF7hAMjtEQ==") 941 | (:encoding-test "5808ab954ca2c85f1bfc03f9a20bb567a000f7743b5c25a505557b6cd91ea1" "WAirlUyiyF8b_AP5ogu1Z6AA93Q7XCWlBVV7bNkeoQ==") 942 | (:encoding-test "e0c3468204834d95f980af6a43d2e8b08310f6e811d1f62469c946d92e5a93" "4MNGggSDTZX5gK9qQ9LosIMQ9ugR0fYkaclG2S5akw==") 943 | (:encoding-test "d312b15adab4dbb665dfc72abccbffb208a3d461dfa47ad53556f1e6730645" "0xKxWtq027Zl38cqvMv_sgij1GHfpHrVNVbx5nMGRQ==") 944 | (:encoding-test "5d6848416b2b44dd0404cfa22643c1aa8ce1139676fdec94011105f3dd6d33" "XWhIQWsrRN0EBM-iJkPBqozhE5Z2_eyUAREF891tMw==") 945 | (:encoding-test "076b1dd2e7e1c633a6a494a814909acea600ff4630fbfe914d3e1b8ac0b791" "B2sd0ufhxjOmpJSoFJCazqYA_0Yw-_6RTT4bisC3kQ==") 946 | (:encoding-test "4cd6ee3dfb13e4b8ac059fe726194cd2c22c48cd033e0af2374805a2ed490d" "TNbuPfsT5LisBZ_nJhlM0sIsSM0DPgryN0gFou1JDQ==") 947 | (:encoding-test "a5db7afe88ae9a79cd98eb320bab59b2d0ac635725b5c66e23cbc3648c93b9" "pdt6_oiumnnNmOsyC6tZstCsY1cltcZuI8vDZIyTuQ==") 948 | (:encoding-test "5eb0cf0be389f29290a162d4757a7a2aa1cecc8b30d75cb9ebec2ad74fd175" "XrDPC-OJ8pKQoWLUdXp6KqHOzIsw11y56-wq10_RdQ==") 949 | (:encoding-test "757f4037e5b048f66cbf1c6186ae657105da3aefe706e927d9d8b6c76bf16b" "dX9AN-WwSPZsvxxhhq5lcQXaOu_nBukn2di2x2vxaw==") 950 | (:encoding-test "cabf862de7adba2ee39ce5fe48a9ec669e0e1a7cc271c0683ba8df1f08eaac" "yr-GLeetui7jnOX-SKnsZp4OGnzCccBoO6jfHwjqrA==") 951 | (:encoding-test "32c7cec58d3951fc73292d3548ec45dea616b83c7a461ba35077a9d73f14a3" "MsfOxY05UfxzKS01SOxF3qYWuDx6RhujUHep1z8Uow==") 952 | (:encoding-test "42c3c254edeb7fea5e441193643afa4c56265a21ca9cdb20101c9b5138fbd9" "QsPCVO3rf-peRBGTZDr6TFYmWiHKnNsgEBybUTj72Q==") 953 | (:encoding-test "aeb3338b65da5bf9ff429dec6dc33fe833fa1453c5ec15fae0ec174721c118" "rrMzi2XaW_n_Qp3sbcM_6DP6FFPF7BX64OwXRyHBGA==") 954 | (:encoding-test "e4ef23f91a20b4c408519557f03ba88dff56d73a406db5cba1f17ebb0cad7f" "5O8j-RogtMQIUZVX8Duojf9W1zpAbbXLofF-uwytfw==") 955 | (:encoding-test "b0d13aab2417c6251dcf630a2c131c96fd4475171ede01287dc1546ff2c206" "sNE6qyQXxiUdz2MKLBMclv1EdRce3gEofcFUb_LCBg==") 956 | (:encoding-test "cc930ed04fba9f8471e9ae2aba5d202222567691baad6c1e60a7084cf4f087" "zJMO0E-6n4Rx6a4qul0gIiJWdpG6rWweYKcITPTwhw==") 957 | (:encoding-test "99d9a521f21e1f3609589ace5fe574daa5e33bd81ba4caf5209ab833671af1" "mdmlIfIeHzYJWJrOX-V02qXjO9gbpMr1IJq4M2ca8Q==") 958 | (:encoding-test "47bc7d61c7285ea027ae28782f1f5657f82886369f303151d0deb71b586d72" "R7x9YccoXqAnrih4Lx9WV_gohjafMDFR0N63G1htcg==") 959 | (:encoding-test "4274c3383c8bd838df4a93be0e9f39bba667d5ca825af82e558c1162070300" "QnTDODyL2DjfSpO-Dp85u6Zn1cqCWvguVYwRYgcDAA==") 960 | (:encoding-test "a71c96e78beeba414540b20336e895dcf4fbc9337d821abab96156816b015e" "pxyW54vuukFFQLIDNuiV3PT7yTN9ghq6uWFWgWsBXg==") 961 | (:encoding-test "008e89e1435ea9029dc16e5fb221c1c591451a297a6448e899a797a24b15db" "AI6J4UNeqQKdwW5fsiHBxZFFGil6ZEjomaeXoksV2w==") 962 | --------------------------------------------------------------------------------