var azure = new Object();
azure._unenc = new Object();
azure.enc = function(targ) {
  if (targ.constructor == String) {
    return "$" + targ.length + ":" + targ;
  } else if (targ.constructor == Number) {
    targ = targ.toString();
    return "#" + targ.length + ":" + targ;
  } else if (targ.constructor == Boolean) {
    if (targ == true) {
      return "+";
    } else {
      return "-";
    }
  } else if (typeof targ == "undefined" || targ == null) {
    return "!";
  } else if (targ.constructor == Function) {
    targ = targ.toSource();
    return "&" + string.length + ":" + targ;
  } else if (targ.constructor == Array) {
    var retval = "";
    for (var i=0; i<targ.length; i++) {
      retval += azure.enc(targ[i]);
    }
    return "@" + targ.length + ":" + retval;
  } else if (targ.constructor == Object) {
    var retval = "";
    var pairnum = 0;
    for (var key in targ) {
      retval += azure.enc(key) + azure.enc(targ[key]);
      pairnum++;
    }
    return "%" + pairnum + ":" + retval;
  } else {
    return "!";
  }
};
azure.unenc = function(targ) {
  if (targ.constructor != String) return;
  azure._unenc.targ = targ;
  azure._unenc.i = 0;
  var retval = azure._unenc.unenc();
  azure._unenc.targ = null;
  azure._unenc.i = null;
  return retval;
};
azure._unenc.unenc = function() {
  var type = azure._unenc.next(1);
  if (type=="#" || type=="$" || type=="&" || type=="%" || type=="@") {
    var len="";
    var tmp="";
    var i=0;
    while (tmp != ":") {
      len += tmp;
      tmp = azure._unenc.next(1);
    }
    len = parseInt(len);
    if (type=="#") {
      return parseFloat(azure._unenc.next(len));
    } else if (type=="$") {
      return azure._unenc.next(len);
    } else if (type=="&") {
      return eval(azure._unenc.next(len));
    } else if (type=="@") {
      var retval = new Array();
      for (var i=0; i<len; i++) {
        retval.push(azure._unenc.unenc());
      }
      return retval;
    } else if (type=="%") {
      var retval = new Object();
      var key = "";
      var val = "";
      for (var i=0; i<len; i++) {
        key = azure._unenc.unenc();
        val = azure._unenc.unenc();
        retval[key] = val;
      }
      return retval;
    }
  } else if (type=="!") {
    return null;
  } else if (type=="+") {
    return true;
  } else if (type=="-") {
    return false;
  } else {
    return null;
  }
};
azure._unenc.next = function(i) {
  var retval = azure._unenc.targ.substring(azure._unenc.i, azure._unenc.i+i);
  azure._unenc.i += i;
  return retval;
};
