#This work is licensed under the
#Creative Commons Attribution-Share Alike 3.0 United States License.
#To view a copy of this license, visit
#http://creativecommons.org/licenses/by-sa/3.0/us/ or send a letter to
#Creative Commons,
#171 Second Street, Suite 300,
#San Francisco, California, 94105, USA.

INPUT m[i],entropies;
OUTPUT base,add,entropies;
VAR entropies "entropy";
VAR base "base";
VAR add "add";
switch m[i] {
    case 0 {
        base <- 0;
        add <- floor(entropies[0] / 2 ^ 4);
        entropies[0] <- entropies[0] - floor((entropies[0] + 126) / 2 ^ 7) * 2;
        entropies[1] <- entropies[1];
        entropies[2] <- entropies[2];
    }
    case 1 {
        base <- floor(entropies[0] / 2 ^ 4) + 1;
        add <- floor(entropies[1] / 2 ^ 4);
        entropies[0] <- entropies[0] + floor((entropies[0] + 128) / 2 ^ 7) * 5;
        entropies[1] <- entropies[1] - floor((entropies[1] + 62) / 2 ^ 6) * 2;
        entropies[2] <- entropies[2];
    }
    case 2 {
        base <- (floor(entropies[0] / 2 ^ 4) + 1) +
                (floor(entropies[1] / 2 ^ 4) + 1);
        add <- floor(entropies[2] / 2 ^ 4);
        entropies[0] <- entropies[0] + floor((entropies[0] + 128) / 2 ^ 7) * 5;
        entropies[1] <- entropies[1] + floor((entropies[1] + 64) / 2 ^ 6) * 5;
        entropies[2] <- entropies[2] - floor((entropies[2] + 30) / 2 ^ 5) * 2;
    }
    default {
        base <- (floor(entropies[0] / 2 ^ 4) + 1) +
                (floor(entropies[1] / 2 ^ 4) + 1) +
                ((floor(entropies[2] / 2 ^ 4) + 1) * (m[i] * 2));
        add <- floor(entropies[2] / 2 ^ 4);
        entropies[0] <- entropies[0] + floor((entropies[0] + 128) / 2 ^ 7) * 5;
        entropies[1] <- entropies[1] + floor((entropies[1] + 64) / 2 ^ 6) * 5;
        entropies[2] <- entropies[2] + floor((entropies[2] + 32) / 2 ^ 5) * 5;
    }
}
return base,add,entropies;
