{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses,
  TypeSynonymInstances, FlexibleContexts #-} 
                                                                                                    
-- | Multiple Out 
                  
module CsoundExpr.Base.MultiOut(
    MultiOut,
    mo,
    moA,
    moK,
    moI,
    mo1,
    mo2,
    mo3,
    mo4,
    mo5,
    mo6,
    mo7,
    mo8,
    mo9,
    mo10,
    mo11,
    mo12,
    mo13,
    mo14,
    mo15,
    mo16,
    mo17,
    mo18,
    mo19,
    mo20,
    mo21,
    mo22,
    mo23,
    mo24,
    mo25,
    mo26,
    mo27,
    mo28,
    mo29,
    mo30,
    mo31,
    mo32,
    moA1,
    moA2,
    moA3,
    moA4,
    moA6,
    moA8,
    moA16,
    moA24,
    moA32,
    moK1,
    moK2,
    moK3,
    moK4,
    moK6,
    moK8,
    moK16,
    moK24,
    moK32,
    moI1,
    moI2,
    moI3,
    moI4,
    moI6,
    moI8,
    moI16,
    moI24,
    moI32)
where 
      
import CsoundExpr.Translator.Types
import CsoundExpr.Base.Types
import CsoundExpr.Translator.ExprTree.ExprTree
import CsoundExpr.Translator.Cs.CsTree
import CsoundExpr.Translator.Cs.IM 
                                   
data MultiOut = MultiOut CsTree 
                                
 
instance IM CsTree MultiOut where
        from = MultiOut
        to (MultiOut a) = a 
                                                                                        
 
labelMO :: (IM CsTree a) => Int -> MultiOut -> a
labelMO id x = from $ outPort id $ (to x :: CsTree) 
                                                    
 
rateOf :: (X a) => a -> Rate
rateOf a = head $ exprType $ exprTreeTag t1
  where t1 = to $ from t0 `asTypeOf` a :: CsTree
        t0 = pure (opc "") [] :: CsTree 
                                                                                                                                     
-- | extracts list of values
 
mo :: (X a) => Int -> MultiOut -> [a]
mo n x = map (flip labelMO x) [0 .. n - 1] 
                                           
 
moA :: Int -> MultiOut -> [Arate]
moA = mo 
         
 
moK :: Int -> MultiOut -> [Krate]
moK = mo 
         
 
moI :: Int -> MultiOut -> [Irate]
moI = mo 
         
 
moA1 :: MultiOut -> (Arate)
moA1 = mo1 
           
 
moA2 :: MultiOut -> (Arate, Arate)
moA2 = mo2 
           
 
moA3 :: MultiOut -> (Arate, Arate, Arate)
moA3 = mo3 
           
 
moA4 :: MultiOut -> (Arate, Arate, Arate, Arate)
moA4 = mo4 
           
 
moA6 :: MultiOut -> (Arate, Arate, Arate, Arate, Arate, Arate)
moA6 = mo6 
           
 
moA8 ::
     MultiOut ->
       (Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate)
moA8 = mo8 
           
 
moA16 ::
      MultiOut ->
        (Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate, Arate, Arate)
moA16 = mo16 
             
 
moA24 ::
      MultiOut ->
        (Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate, Arate)
moA24 = mo24 
             
 
moA32 ::
      MultiOut ->
        (Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate, Arate,
         Arate, Arate, Arate, Arate, Arate)
moA32 = mo32 
             
 
moK1 :: MultiOut -> (Krate)
moK1 = mo1 
           
 
moK2 :: MultiOut -> (Krate, Krate)
moK2 = mo2 
           
 
moK3 :: MultiOut -> (Krate, Krate, Krate)
moK3 = mo3 
           
 
moK4 :: MultiOut -> (Krate, Krate, Krate, Krate)
moK4 = mo4 
           
 
moK6 :: MultiOut -> (Krate, Krate, Krate, Krate, Krate, Krate)
moK6 = mo6 
           
 
moK8 ::
     MultiOut ->
       (Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate)
moK8 = mo8 
           
 
moK16 ::
      MultiOut ->
        (Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate, Krate, Krate)
moK16 = mo16 
             
 
moK24 ::
      MultiOut ->
        (Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate, Krate)
moK24 = mo24 
             
 
moK32 ::
      MultiOut ->
        (Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate, Krate,
         Krate, Krate, Krate, Krate, Krate)
moK32 = mo32 
             
 
moI1 :: MultiOut -> (Irate)
moI1 = mo1 
           
 
moI2 :: MultiOut -> (Irate, Irate)
moI2 = mo2 
           
 
moI3 :: MultiOut -> (Irate, Irate, Irate)
moI3 = mo3 
           
 
moI4 :: MultiOut -> (Irate, Irate, Irate, Irate)
moI4 = mo4 
           
 
moI6 :: MultiOut -> (Irate, Irate, Irate, Irate, Irate, Irate)
moI6 = mo6 
           
 
moI8 ::
     MultiOut ->
       (Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate)
moI8 = mo8 
           
 
moI16 ::
      MultiOut ->
        (Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate, Irate, Irate)
moI16 = mo16 
             
 
moI24 ::
      MultiOut ->
        (Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate, Irate)
moI24 = mo24 
             
 
moI32 ::
      MultiOut ->
        (Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate, Irate,
         Irate, Irate, Irate, Irate, Irate)
moI32 = mo32 
             
 
mo1 :: (X a0) => MultiOut -> (a0)
mo1 x = (y0)
  where y0 = rateMO rs $ labelMO 0 x
        rs = [rateOf y0] 
                                                                           
 
mo2 :: (X a0, X a1) => MultiOut -> (a0, a1)
mo2 x = (y0, y1)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        rs = [rateOf y0, rateOf y1] 
                                                                                                                               
 
mo3 :: (X a0, X a1, X a2) => MultiOut -> (a0, a1, a2)
mo3 x = (y0, y1, y2)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        rs = [rateOf y0, rateOf y1, rateOf y2] 
                                                                                                                                                                                   
 
mo4 :: (X a0, X a1, X a2, X a3) => MultiOut -> (a0, a1, a2, a3)
mo4 x = (y0, y1, y2, y3)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        rs = [rateOf y0, rateOf y1, rateOf y2, rateOf y3] 
                                                                                                                                                                                                                                       
 
mo5 ::
      (X a0, X a1, X a2, X a3, X a4) => MultiOut -> (a0, a1, a2, a3, a4)
mo5 x = (y0, y1, y2, y3, y4)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        rs = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4] 
                                                                                                                                                                                                                                                                                           
 
mo6 ::
      (X a0, X a1, X a2, X a3, X a4, X a5) =>
      MultiOut -> (a0, a1, a2, a3, a4, a5)
mo6 x = (y0, y1, y2, y3, y4, y5)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5] 
                                                                                                                                                                                                                                                                                                                                                                      
 
mo7 ::
      (X a0, X a1, X a2, X a3, X a4, X a5, X a6) =>
      MultiOut -> (a0, a1, a2, a3, a4, a5, a6)
mo7 x = (y0, y1, y2, y3, y4, y5, y6)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6] 
                                                                                                                                                                                                                                                                                                                                                                                                                          
 
mo8 ::
      (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7) =>
      MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7)
mo8 x = (y0, y1, y2, y3, y4, y5, y6, y7)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
 
mo9 ::
      (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8) =>
      MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7, a8)
mo9 x = (y0, y1, y2, y3, y4, y5, y6, y7, y8)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
mo10 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9) =>
       MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
mo10 x = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 
mo11 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9,
        X a10) =>
       MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
mo11 x = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
mo12 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11) =>
       MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
mo12 x = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 
mo13 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12) =>
       MultiOut -> (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
mo13 x = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
 
mo14 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
mo14 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
 
mo15 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
mo15 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
 
mo16 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15)
mo16 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 
mo17 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16)
mo17 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
 
mo18 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17)
mo18 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
mo19 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18)
mo19 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
 
mo20 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19)
mo20 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
mo21 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20)
mo21 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
 
mo22 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21)
mo22 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
 
mo23 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22)
mo23 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
 
mo24 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23)
mo24 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
 
mo25 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24)
mo25 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
 
mo26 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25)
mo26 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
 
mo27 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26)
mo27 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
 
mo28 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26, X a27) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27)
mo28 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        y27 = rateMO rs $ labelMO 27 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26, rateOf y27] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 
mo29 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26, X a27, X a28) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28)
mo29 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27,
     y28)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        y27 = rateMO rs $ labelMO 27 x
        y28 = rateMO rs $ labelMO 28 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26, rateOf y27, rateOf y28] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
mo30 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26, X a27, X a28,
        X a29) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29)
mo30 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27,
     y28, y29)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        y27 = rateMO rs $ labelMO 27 x
        y28 = rateMO rs $ labelMO 28 x
        y29 = rateMO rs $ labelMO 29 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26, rateOf y27, rateOf y28, rateOf y29] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
 
mo31 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26, X a27, X a28,
        X a29, X a30) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29, a30)
mo31 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27,
     y28, y29, y30)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        y27 = rateMO rs $ labelMO 27 x
        y28 = rateMO rs $ labelMO 28 x
        y29 = rateMO rs $ labelMO 29 x
        y30 = rateMO rs $ labelMO 30 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26, rateOf y27, rateOf y28, rateOf y29, rateOf y30] 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 
mo32 ::
       (X a0, X a1, X a2, X a3, X a4, X a5, X a6, X a7, X a8, X a9, X a10,
        X a11, X a12, X a13, X a14, X a15, X a16, X a17, X a18, X a19,
        X a20, X a21, X a22, X a23, X a24, X a25, X a26, X a27, X a28,
        X a29, X a30, X a31) =>
       MultiOut ->
         (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
          a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
          a28, a29, a30, a31)
mo32 x
  = (y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14,
     y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27,
     y28, y29, y30, y31)
  where y0 = rateMO rs $ labelMO 0 x
        y1 = rateMO rs $ labelMO 1 x
        y2 = rateMO rs $ labelMO 2 x
        y3 = rateMO rs $ labelMO 3 x
        y4 = rateMO rs $ labelMO 4 x
        y5 = rateMO rs $ labelMO 5 x
        y6 = rateMO rs $ labelMO 6 x
        y7 = rateMO rs $ labelMO 7 x
        y8 = rateMO rs $ labelMO 8 x
        y9 = rateMO rs $ labelMO 9 x
        y10 = rateMO rs $ labelMO 10 x
        y11 = rateMO rs $ labelMO 11 x
        y12 = rateMO rs $ labelMO 12 x
        y13 = rateMO rs $ labelMO 13 x
        y14 = rateMO rs $ labelMO 14 x
        y15 = rateMO rs $ labelMO 15 x
        y16 = rateMO rs $ labelMO 16 x
        y17 = rateMO rs $ labelMO 17 x
        y18 = rateMO rs $ labelMO 18 x
        y19 = rateMO rs $ labelMO 19 x
        y20 = rateMO rs $ labelMO 20 x
        y21 = rateMO rs $ labelMO 21 x
        y22 = rateMO rs $ labelMO 22 x
        y23 = rateMO rs $ labelMO 23 x
        y24 = rateMO rs $ labelMO 24 x
        y25 = rateMO rs $ labelMO 25 x
        y26 = rateMO rs $ labelMO 26 x
        y27 = rateMO rs $ labelMO 27 x
        y28 = rateMO rs $ labelMO 28 x
        y29 = rateMO rs $ labelMO 29 x
        y30 = rateMO rs $ labelMO 30 x
        y31 = rateMO rs $ labelMO 31 x
        rs
          = [rateOf y0, rateOf y1, rateOf y2, rateOf y3, rateOf y4,
             rateOf y5, rateOf y6, rateOf y7, rateOf y8, rateOf y9, rateOf y10,
             rateOf y11, rateOf y12, rateOf y13, rateOf y14, rateOf y15,
             rateOf y16, rateOf y17, rateOf y18, rateOf y19, rateOf y20,
             rateOf y21, rateOf y22, rateOf y23, rateOf y24, rateOf y25,
             rateOf y26, rateOf y27, rateOf y28, rateOf y29, rateOf y30,
             rateOf y31]