18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*-
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels%!TEX root = Vorbis_I_spec.tex
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% $Id$
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\section{Floor type 0 setup and decode} \label{vorbis:spec:floor0}
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Overview}
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVorbis floor type zero uses Line Spectral Pair (LSP, also alternately
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsknown as Line Spectral Frequency or LSF) representation to encode a
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssmooth spectral envelope curve as the frequency response of the LSP
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfilter.  This representation is equivalent to a traditional all-pole
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsinfinite impulse response filter as would be used in linear predictive
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoding; LSP representation may be converted to LPC representation and
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvice-versa.
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Floor 0 format}
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFloor zero configuration consists of six integer fields and a list of
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVQ codebooks for use in coding/decoding the LSP filter coefficient
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvalues used by each frame.
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{header decode}
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsConfiguration information for instances of floor zero decodes from the
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodec setup header (third packet).  configuration decode proceeds as
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfollows:
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{Verbatim}[commandchars=\\\{\}]
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [floor0_order] = read an unsigned integer of 8 bits
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) [floor0_rate] = read an unsigned integer of 16 bits
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3) [floor0_bark_map_size] = read an unsigned integer of 16 bits
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4) [floor0_amplitude_bits] = read an unsigned integer of six bits
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  5) [floor0_amplitude_offset] = read an unsigned integer of eight bits
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  6) [floor0_number_of_books] = read an unsigned integer of four bits and add 1
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7) array [floor0_book_list] = read a list of [floor0_number_of_books] unsigned integers of eight bits each;
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{Verbatim}
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAn end-of-packet condition during any of these bitstream reads renders
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthis stream undecodable.  In addition, any element of the array
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[floor0_book_list]} that is greater than the maximum codebook
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnumber for this bitstream is an error condition that also renders the
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstream undecodable.
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{packet decode} \label{vorbis:spec:floor0-decode}
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsExtracting a floor0 curve from an audio packet consists of first
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecoding the curve amplitude and \varname{[floor0_order]} LSP
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoefficient values from the bitstream, and then computing the floor
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscurve, which is defined as the frequency response of the decoded LSP
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfilter.
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsPacket decode proceeds as follows:
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{Verbatim}[commandchars=\\\{\}]
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [amplitude] = read an unsigned integer of [floor0_amplitude_bits] bits
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) if ( [amplitude] is greater than zero ) \{
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       3) [coefficients] is an empty, zero length vector
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0_number_of_books] ) bits
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       6) [last] = zero;
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       7) vector [temp_vector] = read vector from bitstream using codebook number [floor0_book_list] element [booknumber] in VQ context.
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       8) add the scalar value [last] to each scalar in vector [temp_vector]
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       9) [last] = the value of the last scalar in vector [temp_vector]
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      10) concatenate [temp_vector] onto the end of the [coefficients] vector
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      11) if (length of vector [coefficients] is less than [floor0_order], continue at step 6
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     \}
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12) done.
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{Verbatim}
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsTake note of the following properties of decode:
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{itemize}
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item An \varname{[amplitude]} value of zero must result in a return code that indicates this channel is unused in this frame (the output of the channel will be all-zeroes in synthesis).  Several later stages of decode don't occur for an unused channel.
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item An end-of-packet condition during decode should be considered a
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnominal occruence; if end-of-packet is reached during any read
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsoperation above, floor decode is to return 'unused' status as if the
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[amplitude]} value had read zero at the beginning of decode.
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item The book number used for decode
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscan, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0_number_of_books]} -
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels1 ) bits.  Nevertheless, the above specification is correct and values
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsgreater than the maximum possible book value are reserved.
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item The number of scalars read into the vector \varname{[coefficients]}
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmay be greater than \varname{[floor0_order]}, the number actually
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrequired for curve computation.  For example, if the VQ codebook used
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfor the floor currently being decoded has a
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[codebook_dimensions]} value of three and
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[floor0_order]} is ten, the only way to fill all the needed
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscalars in \varname{[coefficients]} is to to read a total of twelve
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsscalars as four vectors of three scalars each.  This is not an error
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscondition, and care must be taken not to allow a buffer overflow in
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecode. The extra values are not used and may be ignored or discarded.
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{itemize}
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{curve computation} \label{vorbis:spec:floor0-synth}
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsGiven an \varname{[amplitude]} integer and \varname{[coefficients]}
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector from packet decode as well as the [floor0_order],
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels[floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels[floor0_amplitude_offset] values from floor setup, and an output
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector size \varname{[n]} specified by the decode process, we compute a
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfloor output vector.
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIf the value \varname{[amplitude]} is zero, the return value is a
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelslength \varname{[n]} vector with all-zero scalars.  Otherwise, begin by
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsassuming the following definitions for the given vector to be
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssynthesized:
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   \begin{displaymath}
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     \mathrm{map}_i = \left\{
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       \begin{array}{ll}
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          \min (
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            \mathtt{floor0\_bark\_map\_size} - 1,
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            foobar
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          ) & \textrm{for } i \in [0,n-1] \\
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          -1 & \textrm{for } i = n
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        \end{array}
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      \right.
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    \end{displaymath}
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    where
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    \begin{displaymath}
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    foobar =
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      \left\lfloor
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels        \mathrm{bark}\left(\frac{\mathtt{floor0\_rate} \cdot i}{2n}\right) \cdot \frac{\mathtt{floor0\_bark\_map\_size}} {\mathrm{bark}(.5 \cdot \mathtt{floor0\_rate})}
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      \right\rfloor
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    \end{displaymath}
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    and
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    \begin{displaymath}
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x)
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    \end{displaymath}
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe above is used to synthesize the LSP curve on a Bark-scale frequency
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsaxis, then map the result to a linear-scale frequency axis.
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsSimilarly, the below calculation synthesizes the output LSP curve \varname{[output]} on a log
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels(dB) amplitude scale, mapping it to linear amplitude in the last step:
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{enumerate}
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item  \varname{[i]} = 0
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item  \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0_bark_map_size]}
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( \varname{[floor0_order]} is odd ) {
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \begin{enumerate}
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   \item calculate \varname{[p]} and \varname{[q]} according to:
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           \begin{eqnarray*}
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\_order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           \end{eqnarray*}
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \end{enumerate}
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  } else \varname{[floor0_order]} is even {
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \begin{enumerate}
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels   \item calculate \varname{[p]} and \varname{[q]} according to:
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           \begin{eqnarray*}
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             p & = & \frac{(1 - \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels             q & = & \frac{(1 + \cos^2\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\_order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           \end{eqnarray*}
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \end{enumerate}
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item calculate \varname{[linear_floor_value]} according to:
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         \begin{displaymath}
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           \exp \left( .11512925 \left(\frac{\mathtt{amplitude} \cdot \mathtt{floor0\_amplitute\_offset}}{(2^{\mathtt{floor0\_amplitude\_bits}}-1)\sqrt{p+q}}
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                  - \mathtt{floor0\_amplitude\_offset} \right) \right)
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         \end{displaymath}
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[iteration_condition]} = map element \varname{[i]}
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item \varname{[output]} element \varname{[i]} = \varname{[linear_floor_value]}
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item increment \varname{[i]}
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( map element \varname{[i]} is equal to \varname{[iteration_condition]} ) continue at step 5
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item if ( \varname{[i]} is less than \varname{[n]} ) continue at step 2
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item done
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{enumerate}
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
193