 
 <PRIVATE
 
-: v-w+ ( v1 v2 -- v3 ) [ w+ ] 2map ;
-
 : update-md5 ( md5 -- )
-    [ state>> ] [ old-state>> v-w+ dup clone ] [ ] tri
-    [ old-state<< ] [ state<< ] bi ;
-
-CONSTANT: T
-    $[
-        80 iota [ sin abs 32 2^ * >integer ] uint-array{ } map-as
-    ]
+    [ state>> ] [ old-state>> [ w+ ] 2map dup clone ] [ ] tri
+    [ old-state<< ] [ state<< ] bi ; inline
+
+CONSTANT: T $[
+    80 iota [ sin abs 32 2^ * >integer ] uint-array{ } map-as
+]
 
 :: F ( X Y Z -- FXYZ )
     #! F(X,Y,Z) = XY v not(X) Z

        nip update-md5
    ] 2bi ;

: md5>checksum ( md5 -- bytes ) state>> uint-array>byte-array-le ;

M: md5-state clone ( md5 -- new-md5 )
    call-next-method
    [ clone ] change-state
    [ clone ] change-old-state ;

M: md5-state get-checksum ( md5 -- bytes )
    clone [ bytes>> f ] [ bytes-read>> pad-last-block ] [ ] tri
    [ [ checksum-block ] curry each ] [ md5>checksum ] bi ;

M: md5 checksum-stream ( stream checksum -- byte-array )
    drop
    [ <md5-state> ] dip add-checksum-stream get-checksum ;


        [ d a b c 12 S32 46 ]
        [ c d a b 15 S33 47 ]
        [ b c d a 2  S34 48 ]
    } [ H ] with-md5-round ; inline

: (process-md5-block-I) ( block state -- )
    {
