| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | 
							
- var base64 = require('./base64');
 
- var VLQ_BASE_SHIFT = 5;
 
- var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
 
- var VLQ_BASE_MASK = VLQ_BASE - 1;
 
- var VLQ_CONTINUATION_BIT = VLQ_BASE;
 
- function toVLQSigned(aValue) {
 
-   return aValue < 0
 
-     ? ((-aValue) << 1) + 1
 
-     : (aValue << 1) + 0;
 
- }
 
- function fromVLQSigned(aValue) {
 
-   var isNegative = (aValue & 1) === 1;
 
-   var shifted = aValue >> 1;
 
-   return isNegative
 
-     ? -shifted
 
-     : shifted;
 
- }
 
- exports.encode = function base64VLQ_encode(aValue) {
 
-   var encoded = "";
 
-   var digit;
 
-   var vlq = toVLQSigned(aValue);
 
-   do {
 
-     digit = vlq & VLQ_BASE_MASK;
 
-     vlq >>>= VLQ_BASE_SHIFT;
 
-     if (vlq > 0) {
 
-       
 
-       
 
-       digit |= VLQ_CONTINUATION_BIT;
 
-     }
 
-     encoded += base64.encode(digit);
 
-   } while (vlq > 0);
 
-   return encoded;
 
- };
 
- exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
 
-   var strLen = aStr.length;
 
-   var result = 0;
 
-   var shift = 0;
 
-   var continuation, digit;
 
-   do {
 
-     if (aIndex >= strLen) {
 
-       throw new Error("Expected more digits in base 64 VLQ value.");
 
-     }
 
-     digit = base64.decode(aStr.charCodeAt(aIndex++));
 
-     if (digit === -1) {
 
-       throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
 
-     }
 
-     continuation = !!(digit & VLQ_CONTINUATION_BIT);
 
-     digit &= VLQ_BASE_MASK;
 
-     result = result + (digit << shift);
 
-     shift += VLQ_BASE_SHIFT;
 
-   } while (continuation);
 
-   aOutParam.value = fromVLQSigned(result);
 
-   aOutParam.rest = aIndex;
 
- };
 
 
  |