private void hbCreateDecodeTables(int[] limit, int[] base,
									  int[] perm, char[] length,
									  int minLen, int maxLen, int alphaSize) {
		int pp, i, j, vec;

		pp = 0;
		for (i = minLen; i <= maxLen; i++) {
			for (j = 0; j < alphaSize; j++) {
				if (length[j] == i) {
					perm[pp] = j;
					pp++;
				}
			}
		};

		for (i = 0; i < MAX_CODE_LEN; i++) {
			base[i] = 0;
		}
		for (i = 0; i < alphaSize; i++) {
			base[length[i] + 1]++;
		}

		for (i = 1; i < MAX_CODE_LEN; i++) {
			base[i] += base[i - 1];
		}

		for (i = 0; i < MAX_CODE_LEN; i++) {
			limit[i] = 0;
		}
		vec = 0;

		for (i = minLen; i <= maxLen; i++) {
			vec += (base[i + 1] - base[i]);
			limit[i] = vec - 1;
			vec <<= 1;
		}
		for (i = minLen + 1; i <= maxLen; i++) {
			base[i] = ((limit[i - 1] + 1) << 1) - base[i];
		}
	}