이 스크립트는 직접 설치해서 쓰는 게 아닙니다. 다른 스크립트가 메타 명령 // @require https://update.greatest.deepsurf.us/scripts/7601/32976/Parse%20DB%20min.js
(으)로 포함하여 쓰는 라이브러리입니다.
// ==UserScript==
// @name Parse DB min
// @version 1.3.3
// ==/UserScript==
! function(a) {
a.Parse = a.Parse || {}, a.Parse.VERSION = "js1.3.3"
}(this),
function() {
var a = this,
b = a._,
c = {},
d = Array.prototype,
e = Object.prototype,
f = Function.prototype,
g = d.push,
h = d.slice,
i = d.concat,
j = e.toString,
k = e.hasOwnProperty,
l = d.forEach,
m = d.map,
n = d.reduce,
o = d.reduceRight,
p = d.filter,
q = d.every,
r = d.some,
s = d.indexOf,
t = d.lastIndexOf,
u = Array.isArray,
v = Object.keys,
w = f.bind,
x = function(a) {
return a instanceof x ? a : this instanceof x ? (this._wrapped = a, void 0) : new x(a)
};
"undefined" != typeof exports ? ("undefined" != typeof module && module.exports && (exports = module.exports = x), exports._ = x) : a._ = x, x.VERSION = "1.4.4";
var y = x.each = x.forEach = function(a, b, d) {
if (null != a)
if (l && a.forEach === l) a.forEach(b, d);
else if (a.length === +a.length) {
for (var e = 0, f = a.length; f > e; e++)
if (b.call(d, a[e], e, a) === c) return
} else
for (var g in a)
if (x.has(a, g) && b.call(d, a[g], g, a) === c) return
};
x.map = x.collect = function(a, b, c) {
var d = [];
return null == a ? d : m && a.map === m ? a.map(b, c) : (y(a, function(a, e, f) {
d[d.length] = b.call(c, a, e, f)
}), d)
};
var z = "Reduce of empty array with no initial value";
x.reduce = x.foldl = x.inject = function(a, b, c, d) {
var e = arguments.length > 2;
if (null == a && (a = []), n && a.reduce === n) return d && (b = x.bind(b, d)), e ? a.reduce(b, c) : a.reduce(b);
if (y(a, function(a, f, g) {
e ? c = b.call(d, c, a, f, g) : (c = a, e = !0)
}), !e) throw new TypeError(z);
return c
}, x.reduceRight = x.foldr = function(a, b, c, d) {
var e = arguments.length > 2;
if (null == a && (a = []), o && a.reduceRight === o) return d && (b = x.bind(b, d)), e ? a.reduceRight(b, c) : a.reduceRight(b);
var f = a.length;
if (f !== +f) {
var g = x.keys(a);
f = g.length
}
if (y(a, function(h, i, j) {
i = g ? g[--f] : --f, e ? c = b.call(d, c, a[i], i, j) : (c = a[i], e = !0)
}), !e) throw new TypeError(z);
return c
}, x.find = x.detect = function(a, b, c) {
var d;
return A(a, function(a, e, f) {
return b.call(c, a, e, f) ? (d = a, !0) : void 0
}), d
}, x.filter = x.select = function(a, b, c) {
var d = [];
return null == a ? d : p && a.filter === p ? a.filter(b, c) : (y(a, function(a, e, f) {
b.call(c, a, e, f) && (d[d.length] = a)
}), d)
}, x.reject = function(a, b, c) {
return x.filter(a, function(a, d, e) {
return !b.call(c, a, d, e)
}, c)
}, x.every = x.all = function(a, b, d) {
b || (b = x.identity);
var e = !0;
return null == a ? e : q && a.every === q ? a.every(b, d) : (y(a, function(a, f, g) {
return (e = e && b.call(d, a, f, g)) ? void 0 : c
}), !!e)
};
var A = x.some = x.any = function(a, b, d) {
b || (b = x.identity);
var e = !1;
return null == a ? e : r && a.some === r ? a.some(b, d) : (y(a, function(a, f, g) {
return e || (e = b.call(d, a, f, g)) ? c : void 0
}), !!e)
};
x.contains = x.include = function(a, b) {
return null == a ? !1 : s && a.indexOf === s ? -1 != a.indexOf(b) : A(a, function(a) {
return a === b
})
}, x.invoke = function(a, b) {
var c = h.call(arguments, 2),
d = x.isFunction(b);
return x.map(a, function(a) {
return (d ? b : a[b]).apply(a, c)
})
}, x.pluck = function(a, b) {
return x.map(a, function(a) {
return a[b]
})
}, x.where = function(a, b, c) {
return x.isEmpty(b) ? c ? null : [] : x[c ? "find" : "filter"](a, function(a) {
for (var c in b)
if (b[c] !== a[c]) return !1;
return !0
})
}, x.findWhere = function(a, b) {
return x.where(a, b, !0)
}, x.max = function(a, b, c) {
if (!b && x.isArray(a) && a[0] === +a[0] && a.length < 65535) return Math.max.apply(Math, a);
if (!b && x.isEmpty(a)) return -1 / 0;
var d = {
computed: -1 / 0,
value: -1 / 0
};
return y(a, function(a, e, f) {
var g = b ? b.call(c, a, e, f) : a;
g >= d.computed && (d = {
value: a,
computed: g
})
}), d.value
}, x.min = function(a, b, c) {
if (!b && x.isArray(a) && a[0] === +a[0] && a.length < 65535) return Math.min.apply(Math, a);
if (!b && x.isEmpty(a)) return 1 / 0;
var d = {
computed: 1 / 0,
value: 1 / 0
};
return y(a, function(a, e, f) {
var g = b ? b.call(c, a, e, f) : a;
g < d.computed && (d = {
value: a,
computed: g
})
}), d.value
}, x.shuffle = function(a) {
var b, c = 0,
d = [];
return y(a, function(a) {
b = x.random(c++), d[c - 1] = d[b], d[b] = a
}), d
};
var B = function(a) {
return x.isFunction(a) ? a : function(b) {
return b[a]
}
};
x.sortBy = function(a, b, c) {
var d = B(b);
return x.pluck(x.map(a, function(a, b, e) {
return {
value: a,
index: b,
criteria: d.call(c, a, b, e)
}
}).sort(function(a, b) {
var c = a.criteria,
d = b.criteria;
if (c !== d) {
if (c > d || void 0 === c) return 1;
if (d > c || void 0 === d) return -1
}
return a.index < b.index ? -1 : 1
}), "value")
};
var C = function(a, b, c, d) {
var e = {},
f = B(b || x.identity);
return y(a, function(b, g) {
var h = f.call(c, b, g, a);
d(e, h, b)
}), e
};
x.groupBy = function(a, b, c) {
return C(a, b, c, function(a, b, c) {
(x.has(a, b) ? a[b] : a[b] = []).push(c)
})
}, x.countBy = function(a, b, c) {
return C(a, b, c, function(a, b) {
x.has(a, b) || (a[b] = 0), a[b] ++
})
}, x.sortedIndex = function(a, b, c, d) {
c = null == c ? x.identity : B(c);
for (var e = c.call(d, b), f = 0, g = a.length; g > f;) {
var h = f + g >>> 1;
c.call(d, a[h]) < e ? f = h + 1 : g = h
}
return f
}, x.toArray = function(a) {
return a ? x.isArray(a) ? h.call(a) : a.length === +a.length ? x.map(a, x.identity) : x.values(a) : []
}, x.size = function(a) {
return null == a ? 0 : a.length === +a.length ? a.length : x.keys(a).length
}, x.first = x.head = x.take = function(a, b, c) {
return null == a ? void 0 : null == b || c ? a[0] : h.call(a, 0, b)
}, x.initial = function(a, b, c) {
return h.call(a, 0, a.length - (null == b || c ? 1 : b))
}, x.last = function(a, b, c) {
return null == a ? void 0 : null == b || c ? a[a.length - 1] : h.call(a, Math.max(a.length - b, 0))
}, x.rest = x.tail = x.drop = function(a, b, c) {
return h.call(a, null == b || c ? 1 : b)
}, x.compact = function(a) {
return x.filter(a, x.identity)
};
var D = function(a, b, c) {
return y(a, function(a) {
x.isArray(a) ? b ? g.apply(c, a) : D(a, b, c) : c.push(a)
}), c
};
x.flatten = function(a, b) {
return D(a, b, [])
}, x.without = function(a) {
return x.difference(a, h.call(arguments, 1))
}, x.uniq = x.unique = function(a, b, c, d) {
x.isFunction(b) && (d = c, c = b, b = !1);
var e = c ? x.map(a, c, d) : a,
f = [],
g = [];
return y(e, function(c, d) {
(b ? d && g[g.length - 1] === c : x.contains(g, c)) || (g.push(c), f.push(a[d]))
}), f
}, x.union = function() {
return x.uniq(i.apply(d, arguments))
}, x.intersection = function(a) {
var b = h.call(arguments, 1);
return x.filter(x.uniq(a), function(a) {
return x.every(b, function(b) {
return x.indexOf(b, a) >= 0
})
})
}, x.difference = function(a) {
var b = i.apply(d, h.call(arguments, 1));
return x.filter(a, function(a) {
return !x.contains(b, a)
})
}, x.zip = function() {
for (var a = h.call(arguments), b = x.max(x.pluck(a, "length")), c = new Array(b), d = 0; b > d; d++) c[d] = x.pluck(a, "" + d);
return c
}, x.object = function(a, b) {
if (null == a) return {};
for (var c = {}, d = 0, e = a.length; e > d; d++) b ? c[a[d]] = b[d] : c[a[d][0]] = a[d][1];
return c
}, x.indexOf = function(a, b, c) {
if (null == a) return -1;
var d = 0,
e = a.length;
if (c) {
if ("number" != typeof c) return d = x.sortedIndex(a, b), a[d] === b ? d : -1;
d = 0 > c ? Math.max(0, e + c) : c
}
if (s && a.indexOf === s) return a.indexOf(b, c);
for (; e > d; d++)
if (a[d] === b) return d;
return -1
}, x.lastIndexOf = function(a, b, c) {
if (null == a) return -1;
var d = null != c;
if (t && a.lastIndexOf === t) return d ? a.lastIndexOf(b, c) : a.lastIndexOf(b);
for (var e = d ? c : a.length; e--;)
if (a[e] === b) return e;
return -1
}, x.range = function(a, b, c) {
arguments.length <= 1 && (b = a || 0, a = 0), c = arguments[2] || 1;
for (var d = Math.max(Math.ceil((b - a) / c), 0), e = 0, f = new Array(d); d > e;) f[e++] = a, a += c;
return f
}, x.bind = function(a, b) {
if (a.bind === w && w) return w.apply(a, h.call(arguments, 1));
var c = h.call(arguments, 2);
return function() {
return a.apply(b, c.concat(h.call(arguments)))
}
}, x.partial = function(a) {
var b = h.call(arguments, 1);
return function() {
return a.apply(this, b.concat(h.call(arguments)))
}
}, x.bindAll = function(a) {
var b = h.call(arguments, 1);
return 0 === b.length && (b = x.functions(a)), y(b, function(b) {
a[b] = x.bind(a[b], a)
}), a
}, x.memoize = function(a, b) {
var c = {};
return b || (b = x.identity),
function() {
var d = b.apply(this, arguments);
return x.has(c, d) ? c[d] : c[d] = a.apply(this, arguments)
}
}, x.delay = function(a, b) {
var c = h.call(arguments, 2);
return setTimeout(function() {
return a.apply(null, c)
}, b)
}, x.defer = function(a) {
return x.delay.apply(x, [a, 1].concat(h.call(arguments, 1)))
}, x.throttle = function(a, b) {
var c, d, e, f, g = 0,
h = function() {
g = new Date, e = null, f = a.apply(c, d)
};
return function() {
var i = new Date,
j = b - (i - g);
return c = this, d = arguments, 0 >= j ? (clearTimeout(e), e = null, g = i, f = a.apply(c, d)) : e || (e = setTimeout(h, j)), f
}
}, x.debounce = function(a, b, c) {
var d, e;
return function() {
var f = this,
g = arguments,
h = function() {
d = null, c || (e = a.apply(f, g))
},
i = c && !d;
return clearTimeout(d), d = setTimeout(h, b), i && (e = a.apply(f, g)), e
}
}, x.once = function(a) {
var b, c = !1;
return function() {
return c ? b : (c = !0, b = a.apply(this, arguments), a = null, b)
}
}, x.wrap = function(a, b) {
return function() {
var c = [a];
return g.apply(c, arguments), b.apply(this, c)
}
}, x.compose = function() {
var a = arguments;
return function() {
for (var b = arguments, c = a.length - 1; c >= 0; c--) b = [a[c].apply(this, b)];
return b[0]
}
}, x.after = function(a, b) {
return 0 >= a ? b() : function() {
return --a < 1 ? b.apply(this, arguments) : void 0
}
}, x.keys = v || function(a) {
if (a !== Object(a)) throw new TypeError("Invalid object");
var b = [];
for (var c in a) x.has(a, c) && (b[b.length] = c);
return b
}, x.values = function(a) {
var b = [];
for (var c in a) x.has(a, c) && b.push(a[c]);
return b
}, x.pairs = function(a) {
var b = [];
for (var c in a) x.has(a, c) && b.push([c, a[c]]);
return b
}, x.invert = function(a) {
var b = {};
for (var c in a) x.has(a, c) && (b[a[c]] = c);
return b
}, x.functions = x.methods = function(a) {
var b = [];
for (var c in a) x.isFunction(a[c]) && b.push(c);
return b.sort()
}, x.extend = function(a) {
return y(h.call(arguments, 1), function(b) {
if (b)
for (var c in b) a[c] = b[c]
}), a
}, x.pick = function(a) {
var b = {},
c = i.apply(d, h.call(arguments, 1));
return y(c, function(c) {
c in a && (b[c] = a[c])
}), b
}, x.omit = function(a) {
var b = {},
c = i.apply(d, h.call(arguments, 1));
for (var e in a) x.contains(c, e) || (b[e] = a[e]);
return b
}, x.defaults = function(a) {
return y(h.call(arguments, 1), function(b) {
if (b)
for (var c in b) null == a[c] && (a[c] = b[c])
}), a
}, x.clone = function(a) {
return x.isObject(a) ? x.isArray(a) ? a.slice() : x.extend({}, a) : a
}, x.tap = function(a, b) {
return b(a), a
};
var E = function(a, b, c, d) {
if (a === b) return 0 !== a || 1 / a == 1 / b;
if (null == a || null == b) return a === b;
a instanceof x && (a = a._wrapped), b instanceof x && (b = b._wrapped);
var e = j.call(a);
if (e != j.call(b)) return !1;
switch (e) {
case "[object String]":
return a == String(b);
case "[object Number]":
return a != +a ? b != +b : 0 == a ? 1 / a == 1 / b : a == +b;
case "[object Date]":
case "[object Boolean]":
return +a == +b;
case "[object RegExp]":
return a.source == b.source && a.global == b.global && a.multiline == b.multiline && a.ignoreCase == b.ignoreCase
}
if ("object" != typeof a || "object" != typeof b) return !1;
for (var f = c.length; f--;)
if (c[f] == a) return d[f] == b;
c.push(a), d.push(b);
var g = 0,
h = !0;
if ("[object Array]" == e) {
if (g = a.length, h = g == b.length)
for (; g-- && (h = E(a[g], b[g], c, d)););
} else {
var i = a.constructor,
k = b.constructor;
if (i !== k && !(x.isFunction(i) && i instanceof i && x.isFunction(k) && k instanceof k)) return !1;
for (var l in a)
if (x.has(a, l) && (g++, !(h = x.has(b, l) && E(a[l], b[l], c, d)))) break;
if (h) {
for (l in b)
if (x.has(b, l) && !g--) break;
h = !g
}
}
return c.pop(), d.pop(), h
};
x.isEqual = function(a, b) {
return E(a, b, [], [])
}, x.isEmpty = function(a) {
if (null == a) return !0;
if (x.isArray(a) || x.isString(a)) return 0 === a.length;
for (var b in a)
if (x.has(a, b)) return !1;
return !0
}, x.isElement = function(a) {
return !(!a || 1 !== a.nodeType)
}, x.isArray = u || function(a) {
return "[object Array]" == j.call(a)
}, x.isObject = function(a) {
return a === Object(a)
}, y(["Arguments", "Function", "String", "Number", "Date", "RegExp"], function(a) {
x["is" + a] = function(b) {
return j.call(b) == "[object " + a + "]"
}
}), x.isArguments(arguments) || (x.isArguments = function(a) {
return !(!a || !x.has(a, "callee"))
}), "function" != typeof /./ && (x.isFunction = function(a) {
return "function" == typeof a
}), x.isFinite = function(a) {
return isFinite(a) && !isNaN(parseFloat(a))
}, x.isNaN = function(a) {
return x.isNumber(a) && a != +a
}, x.isBoolean = function(a) {
return a === !0 || a === !1 || "[object Boolean]" == j.call(a)
}, x.isNull = function(a) {
return null === a
}, x.isUndefined = function(a) {
return void 0 === a
}, x.has = function(a, b) {
return k.call(a, b)
}, x.noConflict = function() {
return a._ = b, this
}, x.identity = function(a) {
return a
}, x.times = function(a, b, c) {
for (var d = Array(a), e = 0; a > e; e++) d[e] = b.call(c, e);
return d
}, x.random = function(a, b) {
return null == b && (b = a, a = 0), a + Math.floor(Math.random() * (b - a + 1))
};
var F = {
escape: {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'",
"/": "/"
}
};
F.unescape = x.invert(F.escape);
var G = {
escape: new RegExp("[" + x.keys(F.escape).join("") + "]", "g"),
unescape: new RegExp("(" + x.keys(F.unescape).join("|") + ")", "g")
};
x.each(["escape", "unescape"], function(a) {
x[a] = function(b) {
return null == b ? "" : ("" + b).replace(G[a], function(b) {
return F[a][b]
})
}
}), x.result = function(a, b) {
if (null == a) return null;
var c = a[b];
return x.isFunction(c) ? c.call(a) : c
}, x.mixin = function(a) {
y(x.functions(a), function(b) {
var c = x[b] = a[b];
x.prototype[b] = function() {
var a = [this._wrapped];
return g.apply(a, arguments), L.call(this, c.apply(x, a))
}
})
};
var H = 0;
x.uniqueId = function(a) {
var b = ++H + "";
return a ? a + b : b
}, x.templateSettings = {
evaluate: /<%([\s\S]+?)%>/g,
interpolate: /<%=([\s\S]+?)%>/g,
escape: /<%-([\s\S]+?)%>/g
};
var I = /(.)^/,
J = {
"'": "'",
"\\": "\\",
"\r": "r",
"\n": "n",
" ": "t",
"\u2028": "u2028",
"\u2029": "u2029"
},
K = /\\|'|\r|\n|\t|\u2028|\u2029/g;
x.template = function(a, b, c) {
var d;
c = x.defaults({}, c, x.templateSettings);
var e = new RegExp([(c.escape || I).source, (c.interpolate || I).source, (c.evaluate || I).source].join("|") + "|$", "g"),
f = 0,
g = "__p+='";
a.replace(e, function(b, c, d, e, h) {
return g += a.slice(f, h).replace(K, function(a) {
return "\\" + J[a]
}), c && (g += "'+\n((__t=(" + c + "))==null?'':_.escape(__t))+\n'"), d && (g += "'+\n((__t=(" + d + "))==null?'':__t)+\n'"), e && (g += "';\n" + e + "\n__p+='"), f = h + b.length, b
}), g += "';\n", c.variable || (g = "with(obj||{}){\n" + g + "}\n"), g = "var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n" + g + "return __p;\n";
try {
d = new Function(c.variable || "obj", "_", g)
} catch (h) {
throw h.source = g, h
}
if (b) return d(b, x);
var i = function(a) {
return d.call(this, a, x)
};
return i.source = "function(" + (c.variable || "obj") + "){\n" + g + "}", i
}, x.chain = function(a) {
return x(a).chain()
};
var L = function(a) {
return this._chain ? x(a).chain() : a
};
x.mixin(x), y(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function(a) {
var b = d[a];
x.prototype[a] = function() {
var c = this._wrapped;
return b.apply(c, arguments), "shift" != a && "splice" != a || 0 !== c.length || delete c[0], L.call(this, c)
}
}), y(["concat", "join", "slice"], function(a) {
var b = d[a];
x.prototype[a] = function() {
return L.call(this, b.apply(this._wrapped, arguments))
}
}), x.extend(x.prototype, {
chain: function() {
return this._chain = !0, this
},
value: function() {
return this._wrapped
}
})
}.call(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse;
"undefined" != typeof exports && exports._ ? (b._ = exports._.noConflict(), b.localStorage = require("localStorage"), b.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest, exports.Parse = b) : (b._ = _.noConflict(), "undefined" != typeof localStorage && (b.localStorage = localStorage), "undefined" != typeof XMLHttpRequest && (b.XMLHttpRequest = XMLHttpRequest)), "undefined" != typeof $ && (b.$ = $);
var c = function() {},
d = function(a, d, e) {
var f;
return f = d && d.hasOwnProperty("constructor") ? d.constructor : function() {
a.apply(this, arguments)
}, b._.extend(f, a), c.prototype = a.prototype, f.prototype = new c, d && b._.extend(f.prototype, d), e && b._.extend(f, e), f.prototype.constructor = f, f.__super__ = a.prototype, f
};
b.serverURL = "https://api.parse.com", "undefined" != typeof process && process.versions && process.versions.node && (b._isNode = !0), b.initialize = function(a, c, d) {
if (d) throw "Parse.initialize() was passed a Master Key, which is only allowed from within Node.js.";
b._initialize(a, c)
}, b._initialize = function(a, c, d) {
b.applicationId = a, b.javaScriptKey = c, b.masterKey = d, b._useMasterKey = !1
}, b._isNode && (b.initialize = b._initialize, b.Cloud = b.Cloud || {}, b.Cloud.useMasterKey = function() {
b._useMasterKey = !0
}), b._getParsePath = function(a) {
if (!b.applicationId) throw "You need to call Parse.initialize before using Parse.";
if (a || (a = ""), !b._.isString(a)) throw "Tried to get a localStorage path that wasn't a String.";
return "/" === a[0] && (a = a.substring(1)), "Parse/" + b.applicationId + "/" + a
}, b._installationId = null, b._getInstallationId = function() {
if (b._installationId) return b._installationId;
var a = b._getParsePath("installationId");
if (b._installationId = b.localStorage.getItem(a), !b._installationId || "" === b._installationId) {
var c = function() {
return Math.floor(65536 * (1 + Math.random())).toString(16).substring(1)
};
b._installationId = c() + c() + "-" + c() + "-" + c() + "-" + c() + "-" + c() + c() + c(), b.localStorage.setItem(a, b._installationId)
}
return b._installationId
}, b._parseDate = function(a) {
var b = new RegExp("^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})(.([0-9]+))?Z$"),
c = b.exec(a);
if (!c) return null;
var d = c[1] || 0,
e = (c[2] || 1) - 1,
f = c[3] || 0,
g = c[4] || 0,
h = c[5] || 0,
i = c[6] || 0,
j = c[8] || 0;
return new Date(Date.UTC(d, e, f, g, h, i, j))
}, b._ajaxIE8 = function(a, c, d) {
var e = new b.Promise,
f = new XDomainRequest;
return f.onload = function() {
var a;
try {
a = JSON.parse(f.responseText)
} catch (b) {
e.reject(b)
}
a && e.resolve(a)
}, f.onerror = f.ontimeout = function() {
var a = {
responseText: JSON.stringify({
code: b.Error.X_DOMAIN_REQUEST,
error: "IE's XDomainRequest does not supply error info."
})
};
e.reject(a)
}, f.onprogress = function() {}, f.open(a, c), f.send(d), e
}, b._useXDomainRequest = function() {
return "undefined" != typeof XDomainRequest ? "withCredentials" in new XMLHttpRequest ? !1 : !0 : !1
}, b._ajax = function(a, c, d, e, f) {
var g = {
success: e,
error: f
};
if (b._useXDomainRequest()) return b._ajaxIE8(a, c, d)._thenRunCallbacks(g);
var h = new b.Promise,
i = !1,
j = new b.XMLHttpRequest;
return j.onreadystatechange = function() {
if (4 === j.readyState) {
if (i) return;
if (i = !0, j.status >= 200 && j.status < 300) {
var a;
try {
a = JSON.parse(j.responseText)
} catch (b) {
h.reject(b)
}
a && h.resolve(a, j.status, j)
} else h.reject(j)
}
}, j.open(a, c, !0), j.setRequestHeader("Content-Type", "text/plain"), b._isNode && j.setRequestHeader("User-Agent", "Parse/" + b.VERSION + " (NodeJS " + process.versions.node + ")"), j.send(d), h._thenRunCallbacks(g)
}, b._extend = function(a, b) {
var c = d(this, a, b);
return c.extend = this.extend, c
}, b._request = function(a) {
var c = a.route,
d = a.className,
e = a.objectId,
f = a.method,
g = a.useMasterKey,
h = a.sessionToken,
i = a.data;
if (!b.applicationId) throw "You must specify your applicationId using Parse.initialize.";
if (!b.javaScriptKey && !b.masterKey) throw "You must specify a key using Parse.initialize.";
if (!h) {
var j = b.User.current();
j && j._sessionToken && (h = j._sessionToken)
}
if ("batch" !== c && "classes" !== c && "events" !== c && "files" !== c && "functions" !== c && "login" !== c && "push" !== c && "requestPasswordReset" !== c && "rest_verify_analytics" !== c && "users" !== c && "jobs" !== c && "config" !== c) throw "Bad route: '" + c + "'.";
var k = b.serverURL;
"/" !== k.charAt(k.length - 1) && (k += "/"), k += "1/" + c, d && (k += "/" + d), e && (k += "/" + e), i = b._.clone(i || {}), "POST" !== f && (i._method = f, f = "POST"), b._.isUndefined(g) && (g = b._useMasterKey), i._ApplicationId = b.applicationId, g ? i._MasterKey = b.masterKey : i._JavaScriptKey = b.javaScriptKey, i._ClientVersion = b.VERSION, i._InstallationId = b._getInstallationId(), h && (i._SessionToken = h);
var l = JSON.stringify(i);
return b._ajax(f, k, l).then(null, function(a) {
var c;
if (a && a.responseText) try {
var d = JSON.parse(a.responseText);
c = new b.Error(d.code, d.error)
} catch (e) {
c = new b.Error(b.Error.INVALID_JSON, "Received an error with invalid JSON from Parse: " + a.responseText)
} else c = new b.Error(b.Error.CONNECTION_FAILED, "XMLHttpRequest failed: " + JSON.stringify(a));
return b.Promise.error(c)
})
}, b._getValue = function(a, c) {
return a && a[c] ? b._.isFunction(a[c]) ? a[c]() : a[c] : null
}, b._encode = function(a, c, d) {
var e = b._;
if (a instanceof b.Object) {
if (d) throw "Parse.Objects not allowed here";
if (!c || e.include(c, a) || !a._hasData) return a._toPointer();
if (!a.dirty()) return c = c.concat(a), b._encode(a._toFullJSON(c), c, d);
throw "Tried to save an object with a pointer to a new, unsaved object."
}
if (a instanceof b.ACL) return a.toJSON();
if (e.isDate(a)) return {
__type: "Date",
iso: a.toJSON()
};
if (a instanceof b.GeoPoint) return a.toJSON();
if (e.isArray(a)) return e.map(a, function(a) {
return b._encode(a, c, d)
});
if (e.isRegExp(a)) return a.source;
if (a instanceof b.Relation) return a.toJSON();
if (a instanceof b.Op) return a.toJSON();
if (a instanceof b.File) {
if (!a.url()) throw "Tried to save an object containing an unsaved file.";
return {
__type: "File",
name: a.name(),
url: a.url()
}
}
if (e.isObject(a)) {
var f = {};
return b._objectEach(a, function(a, e) {
f[e] = b._encode(a, c, d)
}), f
}
return a
}, b._decode = function(a, c) {
var d = b._;
if (!d.isObject(c)) return c;
if (d.isArray(c)) return b._arrayEach(c, function(a, d) {
c[d] = b._decode(d, a)
}), c;
if (c instanceof b.Object) return c;
if (c instanceof b.File) return c;
if (c instanceof b.Op) return c;
if (c.__op) return b.Op._decode(c);
if ("Pointer" === c.__type && c.className) {
var e = b.Object._create(c.className);
return e._finishFetch({
objectId: c.objectId
}, !1), e
}
if ("Object" === c.__type && c.className) {
var f = c.className;
delete c.__type, delete c.className;
var g = b.Object._create(f);
return g._finishFetch(c, !0), g
}
if ("Date" === c.__type) return b._parseDate(c.iso);
if ("GeoPoint" === c.__type) return new b.GeoPoint({
latitude: c.latitude,
longitude: c.longitude
});
if ("ACL" === a) return c instanceof b.ACL ? c : new b.ACL(c);
if ("Relation" === c.__type) {
var h = new b.Relation(null, a);
return h.targetClassName = c.className, h
}
if ("File" === c.__type) {
var i = new b.File(c.name);
return i._url = c.url, i
}
return b._objectEach(c, function(a, d) {
c[d] = b._decode(d, a)
}), c
}, b._arrayEach = b._.each, b._traverse = function(a, c, d) {
if (a instanceof b.Object) {
if (d = d || [], b._.indexOf(d, a) >= 0) return;
return d.push(a), b._traverse(a.attributes, c, d), c(a)
}
return a instanceof b.Relation || a instanceof b.File ? c(a) : b._.isArray(a) ? (b._.each(a, function(e, f) {
var g = b._traverse(e, c, d);
g && (a[f] = g)
}), c(a)) : b._.isObject(a) ? (b._each(a, function(e, f) {
var g = b._traverse(e, c, d);
g && (a[f] = g)
}), c(a)) : c(a)
}, b._objectEach = b._each = function(a, c) {
var d = b._;
d.isObject(a) ? d.each(d.keys(a), function(b) {
c(a[b], b)
}) : d.each(a, c)
}, b._isNullOrUndefined = function(a) {
return b._.isNull(a) || b._.isUndefined(a)
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Analytics = b.Analytics || {}, c.extend(b.Analytics, {
track: function(a, d, e) {
if (a = a || "", a = a.replace(/^\s*/, ""), a = a.replace(/\s*$/, ""), 0 === a.length) throw "A name for the custom event must be provided";
return c.each(d, function(a, b) {
if (!c.isString(b) || !c.isString(a)) throw 'track() dimensions expects keys and values of type "string".'
}), e = e || {}, b._request({
route: "events",
className: a,
method: "POST",
data: {
dimensions: d
}
})._thenRunCallbacks(e)
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Config = function() {
this.attributes = {}, this._escapedAttributes = {}
}, b.Config.current = function() {
if (b.Config._currentConfig) return b.Config._currentConfig;
var a = b.localStorage.getItem(b._getParsePath(b.Config._CURRENT_CONFIG_KEY)),
c = new b.Config;
return a && (c._finishFetch(JSON.parse(a)), b.Config._currentConfig = c), c
}, b.Config.get = function(a) {
a = a || {};
var c = b._request({
route: "config",
method: "GET"
});
return c.then(function(a) {
if (!a || !a.params) {
var c = new b.Error(b.Error.INVALID_JSON, "Config JSON response invalid.");
return b.Promise.error(c)
}
var d = new b.Config;
return d._finishFetch(a), b.Config._currentConfig = d, d
})._thenRunCallbacks(a)
}, b.Config.prototype = {
escape: function(a) {
var d = this._escapedAttributes[a];
if (d) return d;
var e, f = this.attributes[a];
return e = b._isNullOrUndefined(f) ? "" : c.escape(f.toString()), this._escapedAttributes[a] = e, e
},
get: function(a) {
return this.attributes[a]
},
_finishFetch: function(a) {
this.attributes = b._decode(null, c.clone(a.params)), b.localStorage.setItem(b._getParsePath(b.Config._CURRENT_CONFIG_KEY), JSON.stringify(a))
}
}, b.Config._currentConfig = null, b.Config._CURRENT_CONFIG_KEY = "currentConfig"
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Error = function(a, b) {
this.code = a, this.message = b
}, c.extend(b.Error, {
OTHER_CAUSE: -1,
INTERNAL_SERVER_ERROR: 1,
CONNECTION_FAILED: 100,
OBJECT_NOT_FOUND: 101,
INVALID_QUERY: 102,
INVALID_CLASS_NAME: 103,
MISSING_OBJECT_ID: 104,
INVALID_KEY_NAME: 105,
INVALID_POINTER: 106,
INVALID_JSON: 107,
COMMAND_UNAVAILABLE: 108,
NOT_INITIALIZED: 109,
INCORRECT_TYPE: 111,
INVALID_CHANNEL_NAME: 112,
PUSH_MISCONFIGURED: 115,
OBJECT_TOO_LARGE: 116,
OPERATION_FORBIDDEN: 119,
CACHE_MISS: 120,
INVALID_NESTED_KEY: 121,
INVALID_FILE_NAME: 122,
INVALID_ACL: 123,
TIMEOUT: 124,
INVALID_EMAIL_ADDRESS: 125,
MISSING_CONTENT_TYPE: 126,
MISSING_CONTENT_LENGTH: 127,
INVALID_CONTENT_LENGTH: 128,
FILE_TOO_LARGE: 129,
FILE_SAVE_ERROR: 130,
DUPLICATE_VALUE: 137,
INVALID_ROLE_NAME: 139,
EXCEEDED_QUOTA: 140,
SCRIPT_FAILED: 141,
VALIDATION_ERROR: 142,
INVALID_IMAGE_DATA: 150,
UNSAVED_FILE_ERROR: 151,
INVALID_PUSH_TIME_ERROR: 152,
FILE_DELETE_ERROR: 153,
REQUEST_LIMIT_EXCEEDED: 155,
INVALID_EVENT_NAME: 160,
USERNAME_MISSING: 200,
PASSWORD_MISSING: 201,
USERNAME_TAKEN: 202,
EMAIL_TAKEN: 203,
EMAIL_MISSING: 204,
EMAIL_NOT_FOUND: 205,
SESSION_MISSING: 206,
MUST_CREATE_USER_THROUGH_SIGNUP: 207,
ACCOUNT_ALREADY_LINKED: 208,
LINKED_ID_MISSING: 250,
INVALID_LINKED_SESSION: 251,
UNSUPPORTED_SERVICE: 252,
AGGREGATE_ERROR: 600,
FILE_READ_ERROR: 601,
X_DOMAIN_REQUEST: 602
})
}(this),
function() {
var a = this,
b = a.Parse || (a.Parse = {}),
c = /\s+/,
d = Array.prototype.slice;
b.Events = {
on: function(a, b, d) {
var e, f, g, h, i;
if (!b) return this;
for (a = a.split(c), e = this._callbacks || (this._callbacks = {}), f = a.shift(); f;) i = e[f], g = i ? i.tail : {}, g.next = h = {}, g.context = d, g.callback = b, e[f] = {
tail: h,
next: i ? i.next : g
}, f = a.shift();
return this
},
off: function(a, b, d) {
var e, f, g, h, i, j;
if (f = this._callbacks) {
if (!(a || b || d)) return delete this._callbacks, this;
for (a = a ? a.split(c) : _.keys(f), e = a.shift(); e;)
if (g = f[e], delete f[e], g && (b || d)) {
for (h = g.tail, g = g.next; g !== h;) i = g.callback, j = g.context, (b && i !== b || d && j !== d) && this.on(e, i, j), g = g.next;
e = a.shift()
} else e = a.shift();
return this
}
},
trigger: function(a) {
var b, e, f, g, h, i, j;
if (!(f = this._callbacks)) return this;
for (i = f.all, a = a.split(c), j = d.call(arguments, 1), b = a.shift(); b;) {
if (e = f[b])
for (g = e.tail;
(e = e.next) !== g;) e.callback.apply(e.context || this, j);
if (e = i)
for (g = e.tail, h = [b].concat(j);
(e = e.next) !== g;) e.callback.apply(e.context || this, h);
b = a.shift()
}
return this
}
}, b.Events.bind = b.Events.on, b.Events.unbind = b.Events.off
}.call(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.GeoPoint = function(a, d) {
c.isArray(a) ? (b.GeoPoint._validate(a[0], a[1]), this.latitude = a[0], this.longitude = a[1]) : c.isObject(a) ? (b.GeoPoint._validate(a.latitude, a.longitude), this.latitude = a.latitude, this.longitude = a.longitude) : c.isNumber(a) && c.isNumber(d) ? (b.GeoPoint._validate(a, d), this.latitude = a, this.longitude = d) : (this.latitude = 0, this.longitude = 0);
var e = this;
this.__defineGetter__ && this.__defineSetter__ && (this._latitude = this.latitude, this._longitude = this.longitude, this.__defineGetter__("latitude", function() {
return e._latitude
}), this.__defineGetter__("longitude", function() {
return e._longitude
}), this.__defineSetter__("latitude", function(a) {
b.GeoPoint._validate(a, e.longitude), e._latitude = a
}), this.__defineSetter__("longitude", function(a) {
b.GeoPoint._validate(e.latitude, a), e._longitude = a
}))
}, b.GeoPoint._validate = function(a, b) {
if (-90 > a) throw "Parse.GeoPoint latitude " + a + " < -90.0.";
if (a > 90) throw "Parse.GeoPoint latitude " + a + " > 90.0.";
if (-180 > b) throw "Parse.GeoPoint longitude " + b + " < -180.0.";
if (b > 180) throw "Parse.GeoPoint longitude " + b + " > 180.0."
}, b.GeoPoint.current = function(a) {
var c = new b.Promise;
return navigator.geolocation.getCurrentPosition(function(a) {
c.resolve(new b.GeoPoint({
latitude: a.coords.latitude,
longitude: a.coords.longitude
}))
}, function(a) {
c.reject(a)
}), c._thenRunCallbacks(a)
}, b.GeoPoint.prototype = {
toJSON: function() {
return b.GeoPoint._validate(this.latitude, this.longitude), {
__type: "GeoPoint",
latitude: this.latitude,
longitude: this.longitude
}
},
radiansTo: function(a) {
var b = Math.PI / 180,
c = this.latitude * b,
d = this.longitude * b,
e = a.latitude * b,
f = a.longitude * b,
g = c - e,
h = d - f,
i = Math.sin(g / 2),
j = Math.sin(h / 2),
k = i * i + Math.cos(c) * Math.cos(e) * j * j;
return k = Math.min(1, k), 2 * Math.asin(Math.sqrt(k))
},
kilometersTo: function(a) {
return 6371 * this.radiansTo(a)
},
milesTo: function(a) {
return 3958.8 * this.radiansTo(a)
}
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._,
d = "*";
b.ACL = function(a) {
var d = this;
if (d.permissionsById = {}, c.isObject(a))
if (a instanceof b.User) d.setReadAccess(a, !0), d.setWriteAccess(a, !0);
else {
if (c.isFunction(a)) throw "Parse.ACL() called with a function. Did you forget ()?";
b._objectEach(a, function(a, e) {
if (!c.isString(e)) throw "Tried to create an ACL with an invalid userId.";
d.permissionsById[e] = {}, b._objectEach(a, function(a, b) {
if ("read" !== b && "write" !== b) throw "Tried to create an ACL with an invalid permission type.";
if (!c.isBoolean(a)) throw "Tried to create an ACL with an invalid permission value.";
d.permissionsById[e][b] = a
})
})
}
}, b.ACL.prototype.toJSON = function() {
return c.clone(this.permissionsById)
}, b.ACL.prototype._setAccess = function(a, d, e) {
if (d instanceof b.User ? d = d.id : d instanceof b.Role && (d = "role:" + d.getName()), !c.isString(d)) throw "userId must be a string.";
if (!c.isBoolean(e)) throw "allowed must be either true or false.";
var f = this.permissionsById[d];
if (!f) {
if (!e) return;
f = {}, this.permissionsById[d] = f
}
e ? this.permissionsById[d][a] = !0 : (delete f[a], c.isEmpty(f) && delete f[d])
}, b.ACL.prototype._getAccess = function(a, c) {
c instanceof b.User ? c = c.id : c instanceof b.Role && (c = "role:" + c.getName());
var d = this.permissionsById[c];
return d ? d[a] ? !0 : !1 : !1
}, b.ACL.prototype.setReadAccess = function(a, b) {
this._setAccess("read", a, b)
}, b.ACL.prototype.getReadAccess = function(a) {
return this._getAccess("read", a)
}, b.ACL.prototype.setWriteAccess = function(a, b) {
this._setAccess("write", a, b)
}, b.ACL.prototype.getWriteAccess = function(a) {
return this._getAccess("write", a)
}, b.ACL.prototype.setPublicReadAccess = function(a) {
this.setReadAccess(d, a)
}, b.ACL.prototype.getPublicReadAccess = function() {
return this.getReadAccess(d)
}, b.ACL.prototype.setPublicWriteAccess = function(a) {
this.setWriteAccess(d, a)
}, b.ACL.prototype.getPublicWriteAccess = function() {
return this.getWriteAccess(d)
}, b.ACL.prototype.getRoleReadAccess = function(a) {
if (a instanceof b.Role && (a = a.getName()), c.isString(a)) return this.getReadAccess("role:" + a);
throw "role must be a Parse.Role or a String"
}, b.ACL.prototype.getRoleWriteAccess = function(a) {
if (a instanceof b.Role && (a = a.getName()), c.isString(a)) return this.getWriteAccess("role:" + a);
throw "role must be a Parse.Role or a String"
}, b.ACL.prototype.setRoleReadAccess = function(a, d) {
if (a instanceof b.Role && (a = a.getName()), c.isString(a)) return this.setReadAccess("role:" + a, d), void 0;
throw "role must be a Parse.Role or a String"
}, b.ACL.prototype.setRoleWriteAccess = function(a, d) {
if (a instanceof b.Role && (a = a.getName()), c.isString(a)) return this.setWriteAccess("role:" + a, d), void 0;
throw "role must be a Parse.Role or a String"
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Op = function() {
this._initialize.apply(this, arguments)
}, b.Op.prototype = {
_initialize: function() {}
}, c.extend(b.Op, {
_extend: b._extend,
_opDecoderMap: {},
_registerDecoder: function(a, c) {
b.Op._opDecoderMap[a] = c
},
_decode: function(a) {
var c = b.Op._opDecoderMap[a.__op];
return c ? c(a) : void 0
}
}), b.Op._registerDecoder("Batch", function(a) {
var c = null;
return b._arrayEach(a.ops, function(a) {
a = b.Op._decode(a), c = a._mergeWithPrevious(c)
}), c
}), b.Op.Set = b.Op._extend({
_initialize: function(a) {
this._value = a
},
value: function() {
return this._value
},
toJSON: function() {
return b._encode(this.value())
},
_mergeWithPrevious: function() {
return this
},
_estimate: function() {
return this.value()
}
}), b.Op._UNSET = {}, b.Op.Unset = b.Op._extend({
toJSON: function() {
return {
__op: "Delete"
}
},
_mergeWithPrevious: function() {
return this
},
_estimate: function() {
return b.Op._UNSET
}
}), b.Op._registerDecoder("Delete", function() {
return new b.Op.Unset
}), b.Op.Increment = b.Op._extend({
_initialize: function(a) {
this._amount = a
},
amount: function() {
return this._amount
},
toJSON: function() {
return {
__op: "Increment",
amount: this._amount
}
},
_mergeWithPrevious: function(a) {
if (a) {
if (a instanceof b.Op.Unset) return new b.Op.Set(this.amount());
if (a instanceof b.Op.Set) return new b.Op.Set(a.value() + this.amount());
if (a instanceof b.Op.Increment) return new b.Op.Increment(this.amount() + a.amount());
throw "Op is invalid after previous op."
}
return this
},
_estimate: function(a) {
return a ? a + this.amount() : this.amount()
}
}), b.Op._registerDecoder("Increment", function(a) {
return new b.Op.Increment(a.amount)
}), b.Op.Add = b.Op._extend({
_initialize: function(a) {
this._objects = a
},
objects: function() {
return this._objects
},
toJSON: function() {
return {
__op: "Add",
objects: b._encode(this.objects())
}
},
_mergeWithPrevious: function(a) {
if (a) {
if (a instanceof b.Op.Unset) return new b.Op.Set(this.objects());
if (a instanceof b.Op.Set) return new b.Op.Set(this._estimate(a.value()));
if (a instanceof b.Op.Add) return new b.Op.Add(a.objects().concat(this.objects()));
throw "Op is invalid after previous op."
}
return this
},
_estimate: function(a) {
return a ? a.concat(this.objects()) : c.clone(this.objects())
}
}), b.Op._registerDecoder("Add", function(a) {
return new b.Op.Add(b._decode(void 0, a.objects))
}), b.Op.AddUnique = b.Op._extend({
_initialize: function(a) {
this._objects = c.uniq(a)
},
objects: function() {
return this._objects
},
toJSON: function() {
return {
__op: "AddUnique",
objects: b._encode(this.objects())
}
},
_mergeWithPrevious: function(a) {
if (a) {
if (a instanceof b.Op.Unset) return new b.Op.Set(this.objects());
if (a instanceof b.Op.Set) return new b.Op.Set(this._estimate(a.value()));
if (a instanceof b.Op.AddUnique) return new b.Op.AddUnique(this._estimate(a.objects()));
throw "Op is invalid after previous op."
}
return this
},
_estimate: function(a) {
if (a) {
var d = c.clone(a);
return b._arrayEach(this.objects(), function(a) {
if (a instanceof b.Object && a.id) {
var e = c.find(d, function(c) {
return c instanceof b.Object && c.id === a.id
});
if (e) {
var f = c.indexOf(d, e);
d[f] = a
} else d.push(a)
} else c.contains(d, a) || d.push(a)
}), d
}
return c.clone(this.objects())
}
}), b.Op._registerDecoder("AddUnique", function(a) {
return new b.Op.AddUnique(b._decode(void 0, a.objects))
}), b.Op.Remove = b.Op._extend({
_initialize: function(a) {
this._objects = c.uniq(a)
},
objects: function() {
return this._objects
},
toJSON: function() {
return {
__op: "Remove",
objects: b._encode(this.objects())
}
},
_mergeWithPrevious: function(a) {
if (a) {
if (a instanceof b.Op.Unset) return a;
if (a instanceof b.Op.Set) return new b.Op.Set(this._estimate(a.value()));
if (a instanceof b.Op.Remove) return new b.Op.Remove(c.union(a.objects(), this.objects()));
throw "Op is invalid after previous op."
}
return this
},
_estimate: function(a) {
if (a) {
var d = c.difference(a, this.objects());
return b._arrayEach(this.objects(), function(a) {
a instanceof b.Object && a.id && (d = c.reject(d, function(c) {
return c instanceof b.Object && c.id === a.id
}))
}), d
}
return []
}
}), b.Op._registerDecoder("Remove", function(a) {
return new b.Op.Remove(b._decode(void 0, a.objects))
}), b.Op.Relation = b.Op._extend({
_initialize: function(a, d) {
this._targetClassName = null;
var e = this,
f = function(a) {
if (a instanceof b.Object) {
if (!a.id) throw "You can't add an unsaved Parse.Object to a relation.";
if (e._targetClassName || (e._targetClassName = a.className), e._targetClassName !== a.className) throw "Tried to create a Parse.Relation with 2 different types: " + e._targetClassName + " and " + a.className + ".";
return a.id
}
return a
};
this.relationsToAdd = c.uniq(c.map(a, f)), this.relationsToRemove = c.uniq(c.map(d, f))
},
added: function() {
var a = this;
return c.map(this.relationsToAdd, function(c) {
var d = b.Object._create(a._targetClassName);
return d.id = c, d
})
},
removed: function() {
var a = this;
return c.map(this.relationsToRemove, function(c) {
var d = b.Object._create(a._targetClassName);
return d.id = c, d
})
},
toJSON: function() {
var a = null,
b = null,
d = this,
e = function(a) {
return {
__type: "Pointer",
className: d._targetClassName,
objectId: a
}
},
f = null;
return this.relationsToAdd.length > 0 && (f = c.map(this.relationsToAdd, e), a = {
__op: "AddRelation",
objects: f
}), this.relationsToRemove.length > 0 && (f = c.map(this.relationsToRemove, e), b = {
__op: "RemoveRelation",
objects: f
}), a && b ? {
__op: "Batch",
ops: [a, b]
} : a || b || {}
},
_mergeWithPrevious: function(a) {
if (a) {
if (a instanceof b.Op.Unset) throw "You can't modify a relation after deleting it.";
if (a instanceof b.Op.Relation) {
if (a._targetClassName && a._targetClassName !== this._targetClassName) throw "Related object must be of class " + a._targetClassName + ", but " + this._targetClassName + " was passed in.";
var d = c.union(c.difference(a.relationsToAdd, this.relationsToRemove), this.relationsToAdd),
e = c.union(c.difference(a.relationsToRemove, this.relationsToAdd), this.relationsToRemove),
f = new b.Op.Relation(d, e);
return f._targetClassName = this._targetClassName, f
}
throw "Op is invalid after previous op."
}
return this
},
_estimate: function(a, c, d) {
if (a) {
if (a instanceof b.Relation) {
if (this._targetClassName)
if (a.targetClassName) {
if (a.targetClassName !== this._targetClassName) throw "Related object must be a " + a.targetClassName + ", but a " + this._targetClassName + " was passed in."
} else a.targetClassName = this._targetClassName;
return a
}
throw "Op is invalid after previous op."
}
var e = new b.Relation(c, d);
e.targetClassName = this._targetClassName
}
}), b.Op._registerDecoder("AddRelation", function(a) {
return new b.Op.Relation(b._decode(void 0, a.objects), [])
}), b.Op._registerDecoder("RemoveRelation", function(a) {
return new b.Op.Relation([], b._decode(void 0, a.objects))
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Relation = function(a, b) {
this.parent = a, this.key = b, this.targetClassName = null
}, b.Relation.prototype = {
_ensureParentAndKey: function(a, b) {
if (this.parent = this.parent || a, this.key = this.key || b, this.parent !== a) throw "Internal Error. Relation retrieved from two different Objects.";
if (this.key !== b) throw "Internal Error. Relation retrieved from two different keys."
},
add: function(a) {
c.isArray(a) || (a = [a]);
var d = new b.Op.Relation(a, []);
this.parent.set(this.key, d), this.targetClassName = d._targetClassName
},
remove: function(a) {
c.isArray(a) || (a = [a]);
var d = new b.Op.Relation([], a);
this.parent.set(this.key, d), this.targetClassName = d._targetClassName
},
toJSON: function() {
return {
__type: "Relation",
className: this.targetClassName
}
},
query: function() {
var a, c;
return this.targetClassName ? (a = b.Object._getSubclass(this.targetClassName), c = new b.Query(a)) : (a = b.Object._getSubclass(this.parent.className), c = new b.Query(a), c._extraOptions.redirectClassNameForKey = this.key), c._addCondition("$relatedTo", "object", this.parent._toPointer()), c._addCondition("$relatedTo", "key", this.key), c
}
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Promise = function() {
this._resolved = !1, this._rejected = !1, this._resolvedCallbacks = [], this._rejectedCallbacks = []
}, c.extend(b.Promise, {
_isPromisesAPlusCompliant: !1,
is: function(a) {
return a && a.then && c.isFunction(a.then)
},
as: function() {
var a = new b.Promise;
return a.resolve.apply(a, arguments), a
},
error: function() {
var a = new b.Promise;
return a.reject.apply(a, arguments), a
},
when: function(a) {
var c;
c = a && b._isNullOrUndefined(a.length) ? arguments : a;
var d = c.length,
e = !1,
f = [],
g = [];
if (f.length = c.length, g.length = c.length, 0 === d) return b.Promise.as.apply(this, f);
var h = new b.Promise,
i = function() {
d -= 1, 0 === d && (e ? h.reject(g) : h.resolve.apply(h, f))
};
return b._arrayEach(c, function(a, c) {
b.Promise.is(a) ? a.then(function(a) {
f[c] = a, i()
}, function(a) {
g[c] = a, e = !0, i()
}) : (f[c] = a, i())
}), h
},
_continueWhile: function(a, c) {
return a() ? c().then(function() {
return b.Promise._continueWhile(a, c)
}) : b.Promise.as()
}
}), c.extend(b.Promise.prototype, {
resolve: function() {
if (this._resolved || this._rejected) throw "A promise was resolved even though it had already been " + (this._resolved ? "resolved" : "rejected") + ".";
this._resolved = !0, this._result = arguments;
var a = arguments;
b._arrayEach(this._resolvedCallbacks, function(b) {
b.apply(this, a)
}), this._resolvedCallbacks = [], this._rejectedCallbacks = []
},
reject: function(a) {
if (this._resolved || this._rejected) throw "A promise was rejected even though it had already been " + (this._resolved ? "resolved" : "rejected") + ".";
this._rejected = !0, this._error = a, b._arrayEach(this._rejectedCallbacks, function(b) {
b(a)
}), this._resolvedCallbacks = [], this._rejectedCallbacks = []
},
then: function(a, c) {
var d = new b.Promise,
e = function() {
var c = arguments;
if (a)
if (b.Promise._isPromisesAPlusCompliant) try {
c = [a.apply(this, c)]
} catch (e) {
c = [b.Promise.error(e)]
} else c = [a.apply(this, c)];
1 === c.length && b.Promise.is(c[0]) ? c[0].then(function() {
d.resolve.apply(d, arguments)
}, function(a) {
d.reject(a)
}) : d.resolve.apply(d, c)
},
f = function(a) {
var e = [];
if (c) {
if (b.Promise._isPromisesAPlusCompliant) try {
e = [c(a)]
} catch (f) {
e = [b.Promise.error(f)]
} else e = [c(a)];
1 === e.length && b.Promise.is(e[0]) ? e[0].then(function() {
d.resolve.apply(d, arguments)
}, function(a) {
d.reject(a)
}) : b.Promise._isPromisesAPlusCompliant ? d.resolve.apply(d, e) : d.reject(e[0])
} else d.reject(a)
},
g = function(a) {
a.call()
};
b.Promise._isPromisesAPlusCompliant && ("undefined" != typeof window && window.setTimeout ? g = function(a) {
window.setTimeout(a, 0)
} : "undefined" != typeof process && process.nextTick && (g = function(a) {
process.nextTick(a)
}));
var h = this;
return this._resolved ? g(function() {
e.apply(h, h._result)
}) : this._rejected ? g(function() {
f(h._error)
}) : (this._resolvedCallbacks.push(e), this._rejectedCallbacks.push(f)), d
},
always: function(a) {
return this.then(a, a)
},
done: function(a) {
return this.then(a)
},
fail: function(a) {
return this.then(null, a)
},
_thenRunCallbacks: function(a, d) {
var e;
if (c.isFunction(a)) {
var f = a;
e = {
success: function(a) {
f(a, null)
},
error: function(a) {
f(null, a)
}
}
} else e = c.clone(a);
return e = e || {}, this.then(function(a) {
return e.success ? e.success.apply(this, arguments) : d && d.trigger("sync", d, a, e), b.Promise.as.apply(b.Promise, arguments)
}, function(a) {
return e.error ? c.isUndefined(d) ? e.error(a) : e.error(d, a) : d && d.trigger("error", d, a, e), b.Promise.error(a)
})
},
_continueWith: function(a) {
return this.then(function() {
return a(arguments, null)
}, function(b) {
return a(null, b)
})
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._,
d = function(a) {
if (26 > a) return String.fromCharCode(65 + a);
if (52 > a) return String.fromCharCode(97 + (a - 26));
if (62 > a) return String.fromCharCode(48 + (a - 52));
if (62 === a) return "+";
if (63 === a) return "/";
throw "Tried to encode large digit " + a + " in base64."
},
e = function(a) {
var b = [];
return b.length = Math.ceil(a.length / 3), c.times(b.length, function(c) {
var e = a[3 * c],
f = a[3 * c + 1] || 0,
g = a[3 * c + 2] || 0,
h = 3 * c + 1 < a.length,
i = 3 * c + 2 < a.length;
b[c] = [d(63 & e >> 2), d(48 & e << 4 | 15 & f >> 4), h ? d(60 & f << 2 | 3 & g >> 6) : "=", i ? d(63 & g) : "="].join("")
}), b.join("")
},
f = {
ai: "application/postscript",
aif: "audio/x-aiff",
aifc: "audio/x-aiff",
aiff: "audio/x-aiff",
asc: "text/plain",
atom: "application/atom+xml",
au: "audio/basic",
avi: "video/x-msvideo",
bcpio: "application/x-bcpio",
bin: "application/octet-stream",
bmp: "image/bmp",
cdf: "application/x-netcdf",
cgm: "image/cgm",
"class": "application/octet-stream",
cpio: "application/x-cpio",
cpt: "application/mac-compactpro",
csh: "application/x-csh",
css: "text/css",
dcr: "application/x-director",
dif: "video/x-dv",
dir: "application/x-director",
djv: "image/vnd.djvu",
djvu: "image/vnd.djvu",
dll: "application/octet-stream",
dmg: "application/octet-stream",
dms: "application/octet-stream",
doc: "application/msword",
docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
dotx: "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
docm: "application/vnd.ms-word.document.macroEnabled.12",
dotm: "application/vnd.ms-word.template.macroEnabled.12",
dtd: "application/xml-dtd",
dv: "video/x-dv",
dvi: "application/x-dvi",
dxr: "application/x-director",
eps: "application/postscript",
etx: "text/x-setext",
exe: "application/octet-stream",
ez: "application/andrew-inset",
gif: "image/gif",
gram: "application/srgs",
grxml: "application/srgs+xml",
gtar: "application/x-gtar",
hdf: "application/x-hdf",
hqx: "application/mac-binhex40",
htm: "text/html",
html: "text/html",
ice: "x-conference/x-cooltalk",
ico: "image/x-icon",
ics: "text/calendar",
ief: "image/ief",
ifb: "text/calendar",
iges: "model/iges",
igs: "model/iges",
jnlp: "application/x-java-jnlp-file",
jp2: "image/jp2",
jpe: "image/jpeg",
jpeg: "image/jpeg",
jpg: "image/jpeg",
js: "application/x-javascript",
kar: "audio/midi",
latex: "application/x-latex",
lha: "application/octet-stream",
lzh: "application/octet-stream",
m3u: "audio/x-mpegurl",
m4a: "audio/mp4a-latm",
m4b: "audio/mp4a-latm",
m4p: "audio/mp4a-latm",
m4u: "video/vnd.mpegurl",
m4v: "video/x-m4v",
mac: "image/x-macpaint",
man: "application/x-troff-man",
mathml: "application/mathml+xml",
me: "application/x-troff-me",
mesh: "model/mesh",
mid: "audio/midi",
midi: "audio/midi",
mif: "application/vnd.mif",
mov: "video/quicktime",
movie: "video/x-sgi-movie",
mp2: "audio/mpeg",
mp3: "audio/mpeg",
mp4: "video/mp4",
mpe: "video/mpeg",
mpeg: "video/mpeg",
mpg: "video/mpeg",
mpga: "audio/mpeg",
ms: "application/x-troff-ms",
msh: "model/mesh",
mxu: "video/vnd.mpegurl",
nc: "application/x-netcdf",
oda: "application/oda",
ogg: "application/ogg",
pbm: "image/x-portable-bitmap",
pct: "image/pict",
pdb: "chemical/x-pdb",
pdf: "application/pdf",
pgm: "image/x-portable-graymap",
pgn: "application/x-chess-pgn",
pic: "image/pict",
pict: "image/pict",
png: "image/png",
pnm: "image/x-portable-anymap",
pnt: "image/x-macpaint",
pntg: "image/x-macpaint",
ppm: "image/x-portable-pixmap",
ppt: "application/vnd.ms-powerpoint",
pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
potx: "application/vnd.openxmlformats-officedocument.presentationml.template",
ppsx: "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
ppam: "application/vnd.ms-powerpoint.addin.macroEnabled.12",
pptm: "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
potm: "application/vnd.ms-powerpoint.template.macroEnabled.12",
ppsm: "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
ps: "application/postscript",
qt: "video/quicktime",
qti: "image/x-quicktime",
qtif: "image/x-quicktime",
ra: "audio/x-pn-realaudio",
ram: "audio/x-pn-realaudio",
ras: "image/x-cmu-raster",
rdf: "application/rdf+xml",
rgb: "image/x-rgb",
rm: "application/vnd.rn-realmedia",
roff: "application/x-troff",
rtf: "text/rtf",
rtx: "text/richtext",
sgm: "text/sgml",
sgml: "text/sgml",
sh: "application/x-sh",
shar: "application/x-shar",
silo: "model/mesh",
sit: "application/x-stuffit",
skd: "application/x-koan",
skm: "application/x-koan",
skp: "application/x-koan",
skt: "application/x-koan",
smi: "application/smil",
smil: "application/smil",
snd: "audio/basic",
so: "application/octet-stream",
spl: "application/x-futuresplash",
src: "application/x-wais-source",
sv4cpio: "application/x-sv4cpio",
sv4crc: "application/x-sv4crc",
svg: "image/svg+xml",
swf: "application/x-shockwave-flash",
t: "application/x-troff",
tar: "application/x-tar",
tcl: "application/x-tcl",
tex: "application/x-tex",
texi: "application/x-texinfo",
texinfo: "application/x-texinfo",
tif: "image/tiff",
tiff: "image/tiff",
tr: "application/x-troff",
tsv: "text/tab-separated-values",
txt: "text/plain",
ustar: "application/x-ustar",
vcd: "application/x-cdlink",
vrml: "model/vrml",
vxml: "application/voicexml+xml",
wav: "audio/x-wav",
wbmp: "image/vnd.wap.wbmp",
wbmxl: "application/vnd.wap.wbxml",
wml: "text/vnd.wap.wml",
wmlc: "application/vnd.wap.wmlc",
wmls: "text/vnd.wap.wmlscript",
wmlsc: "application/vnd.wap.wmlscriptc",
wrl: "model/vrml",
xbm: "image/x-xbitmap",
xht: "application/xhtml+xml",
xhtml: "application/xhtml+xml",
xls: "application/vnd.ms-excel",
xml: "application/xml",
xpm: "image/x-xpixmap",
xsl: "application/xml",
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
xlsm: "application/vnd.ms-excel.sheet.macroEnabled.12",
xltm: "application/vnd.ms-excel.template.macroEnabled.12",
xlam: "application/vnd.ms-excel.addin.macroEnabled.12",
xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
xslt: "application/xslt+xml",
xul: "application/vnd.mozilla.xul+xml",
xwd: "image/x-xwindowdump",
xyz: "chemical/x-xyz",
zip: "application/zip"
},
g = function(a, c) {
var d = new b.Promise;
if ("undefined" == typeof FileReader) return b.Promise.error(new b.Error(b.Error.FILE_READ_ERROR, "Attempted to use a FileReader on an unsupported browser."));
var e = new FileReader;
return e.onloadend = function() {
if (2 !== e.readyState) return d.reject(new b.Error(b.Error.FILE_READ_ERROR, "Error reading file.")), void 0;
var a = e.result,
f = /^data:([^;]*);base64,(.*)$/.exec(a);
return f ? (d.resolve(f[2], c || f[1]), void 0) : (d.reject(new b.Error(b.Error.FILE_READ_ERROR, "Unable to interpret data URL: " + a)), void 0)
}, e.readAsDataURL(a), d
};
b.File = function(a, d, h) {
this._name = a;
var i = /\.([^.]*)$/.exec(a);
i && (i = i[1].toLowerCase());
var j = h || f[i] || "text/plain";
if (c.isArray(d)) this._source = b.Promise.as(e(d), j);
else if (d && d.base64) {
var k = /^data:([a-zA-Z]*\/[a-zA-Z+.-]*);(charset=[a-zA-Z0-9\-\/\s]*,)?base64,(\S+)/,
l = k.exec(d.base64);
this._source = l && l.length > 0 ? b.Promise.as(4 === l.length ? l[3] : l[2], l[1]) : b.Promise.as(d.base64, j)
} else if ("undefined" != typeof File && d instanceof File) this._source = g(d, h);
else if (c.isString(d)) throw "Creating a Parse.File from a String is not yet supported."
}, b.File.prototype = {
name: function() {
return this._name
},
url: function() {
return this._url
},
save: function(a) {
a = a || {};
var c = this;
return c._previousSave || (c._previousSave = c._source.then(function(d, e) {
var f = {
base64: d,
_ContentType: e
};
return b._request({
route: "files",
className: c._name,
method: "POST",
data: f,
useMasterKey: a.useMasterKey
})
}).then(function(a) {
return c._name = a.name, c._url = a.url, c
})), c._previousSave._thenRunCallbacks(a)
}
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Object = function(a, d) {
if (c.isString(a)) return b.Object._create.apply(this, arguments);
a = a || {}, d && d.parse && (a = this.parse(a));
var e = b._getValue(this, "defaults");
if (e && (a = c.extend({}, e, a)), d && d.collection && (this.collection = d.collection), this._serverData = {}, this._opSetQueue = [{}], this.attributes = {}, this._hashedJSON = {}, this._escapedAttributes = {}, this.cid = c.uniqueId("c"), this.changed = {}, this._silent = {}, this._pending = {}, !this.set(a, {
silent: !0
})) throw new Error("Can't create an invalid Parse.Object");
this.changed = {}, this._silent = {}, this._pending = {}, this._hasData = !0, this._previousAttributes = c.clone(this.attributes), this.initialize.apply(this, arguments)
}, b.Object.saveAll = function(a, c) {
return c = c || {}, b.Object._deepSaveAsync(a, {
useMasterKey: c.useMasterKey
})._thenRunCallbacks(c)
}, b.Object.destroyAll = function(a, d) {
d = d || {};
var e = function(a) {
a.trigger("destroy", a, a.collection, d)
},
f = [],
g = function(a) {
var g = b.Promise.as();
return a.length > 0 && (g = g.then(function() {
return b._request({
route: "batch",
method: "POST",
useMasterKey: d.useMasterKey,
data: {
requests: c.map(a, function(a) {
return {
method: "DELETE",
path: "/1/classes/" + a.className + "/" + a.id
}
})
}
})
}).then(function(c) {
b._arrayEach(a, function(a, g) {
if (c[g].success && d.wait) e(a);
else if (c[g].error) {
var h = new b.Error(c[g].error.code, c[g].error.error);
h.object = a, f.push(h)
}
})
})), g
},
h = b.Promise.as(),
i = [];
return b._arrayEach(a, function(b, c) {
if (b.id && d.wait || e(b), b.id && i.push(b), 20 === i.length || c + 1 === a.length) {
var f = i;
i = [], h = h.then(function() {
return g(f)
})
}
}), h.then(function() {
if (0 === f.length) return !0;
var a = new b.Error(b.Error.AGGREGATE_ERROR, "Error deleting an object in destroyAll");
return a.errors = f, b.Promise.error(a)
})._thenRunCallbacks(d)
}, b.Object.fetchAll = function(a, c) {
return b.Object._fetchAll(a, !0)._thenRunCallbacks(c)
}, b.Object.fetchAllIfNeeded = function(a, c) {
return b.Object._fetchAll(a, !1)._thenRunCallbacks(c)
}, c.extend(b.Object.prototype, b.Events, {
_existed: !1,
initialize: function() {},
toJSON: function() {
var a = this._toFullJSON();
return b._arrayEach(["__type", "className"], function(b) {
delete a[b]
}), a
},
_toFullJSON: function(a) {
var d = c.clone(this.attributes);
return b._objectEach(d, function(c, e) {
d[e] = b._encode(c, a)
}), b._objectEach(this._operations, function(a, b) {
d[b] = a
}), c.has(this, "id") && (d.objectId = this.id), c.has(this, "createdAt") && (d.createdAt = c.isDate(this.createdAt) ? this.createdAt.toJSON() : this.createdAt), c.has(this, "updatedAt") && (d.updatedAt = c.isDate(this.updatedAt) ? this.updatedAt.toJSON() : this.updatedAt), d.__type = "Object", d.className = this.className, d
},
_refreshCache: function() {
var a = this;
a._refreshingCache || (a._refreshingCache = !0, b._objectEach(this.attributes, function(d, e) {
d instanceof b.Object ? d._refreshCache() : c.isObject(d) && a._resetCacheForKey(e) && a.set(e, new b.Op.Set(d), {
silent: !0
})
}), delete a._refreshingCache)
},
dirty: function(a) {
this._refreshCache();
var b = c.last(this._opSetQueue);
return a ? b[a] ? !0 : !1 : this.id ? c.keys(b).length > 0 ? !0 : !1 : !0
},
dirtyKeys: function() {
return c.keys(c.last(this._opSetQueue))
},
_toPointer: function() {
if (!this.id) throw new Error("Can't serialize an unsaved Parse.Object");
return {
__type: "Pointer",
className: this.className,
objectId: this.id
}
},
get: function(a) {
return this.attributes[a]
},
relation: function(a) {
var c = this.get(a);
if (c) {
if (!(c instanceof b.Relation)) throw "Called relation() on non-relation field " + a;
return c._ensureParentAndKey(this, a), c
}
return new b.Relation(this, a)
},
escape: function(a) {
var d = this._escapedAttributes[a];
if (d) return d;
var e, f = this.attributes[a];
return e = b._isNullOrUndefined(f) ? "" : c.escape(f.toString()), this._escapedAttributes[a] = e, e
},
has: function(a) {
return !b._isNullOrUndefined(this.attributes[a])
},
_mergeMagicFields: function(a) {
var d = this,
e = ["id", "objectId", "createdAt", "updatedAt"];
b._arrayEach(e, function(e) {
a[e] && ("objectId" === e ? d.id = a[e] : d[e] = "createdAt" !== e && "updatedAt" !== e || c.isDate(a[e]) ? a[e] : b._parseDate(a[e]), delete a[e])
})
},
_copyServerData: function(a) {
var c = {};
b._objectEach(a, function(a, d) {
c[d] = b._decode(d, a)
}), this._serverData = c, this._rebuildAllEstimatedData(), this._refreshCache(), this._opSetQueue = [{}], this._rebuildAllEstimatedData()
},
_mergeFromObject: function(a) {
a && (this.id = a.id, this.createdAt = a.createdAt, this.updatedAt = a.updatedAt, this._copyServerData(a._serverData), this._hasData = !0)
},
_startSave: function() {
this._opSetQueue.push({})
},
_cancelSave: function() {
var a = c.first(this._opSetQueue);
this._opSetQueue = c.rest(this._opSetQueue);
var d = c.first(this._opSetQueue);
b._objectEach(a, function(b, c) {
var e = a[c],
f = d[c];
e && f ? d[c] = f._mergeWithPrevious(e) : e && (d[c] = e)
}), this._saving = this._saving - 1
},
_finishSave: function(a) {
var d = {};
b._traverse(this.attributes, function(a) {
a instanceof b.Object && a.id && a._hasData && (d[a.id] = a)
});
var e = c.first(this._opSetQueue);
this._opSetQueue = c.rest(this._opSetQueue), this._applyOpSet(e, this._serverData), this._mergeMagicFields(a);
var f = this;
b._objectEach(a, function(a, c) {
f._serverData[c] = b._decode(c, a);
var e = b._traverse(f._serverData[c], function(a) {
return a instanceof b.Object && d[a.id] ? d[a.id] : void 0
});
e && (f._serverData[c] = e)
}), this._rebuildAllEstimatedData(), this._saving = this._saving - 1
},
_finishFetch: function(a, b) {
this._opSetQueue = [{}], this._mergeMagicFields(a), this._copyServerData(a), this._hasData = b
},
_applyOpSet: function(a, c) {
var d = this;
b._objectEach(a, function(a, e) {
c[e] = a._estimate(c[e], d, e), c[e] === b.Op._UNSET && delete c[e]
})
},
_resetCacheForKey: function(a) {
var d = this.attributes[a];
if (!(!c.isObject(d) || d instanceof b.Object || d instanceof b.File)) {
d = d.toJSON ? d.toJSON() : d;
var e = JSON.stringify(d);
if (this._hashedJSON[a] !== e) {
var f = !!this._hashedJSON[a];
return this._hashedJSON[a] = e, f
}
}
return !1
},
_rebuildEstimatedDataForKey: function(a) {
var c = this;
delete this.attributes[a], this._serverData[a] && (this.attributes[a] = this._serverData[a]), b._arrayEach(this._opSetQueue, function(d) {
var e = d[a];
e && (c.attributes[a] = e._estimate(c.attributes[a], c, a), c.attributes[a] === b.Op._UNSET ? delete c.attributes[a] : c._resetCacheForKey(a))
})
},
_rebuildAllEstimatedData: function() {
var a = this,
d = c.clone(this.attributes);
this.attributes = c.clone(this._serverData), b._arrayEach(this._opSetQueue, function(c) {
a._applyOpSet(c, a.attributes), b._objectEach(c, function(b, c) {
a._resetCacheForKey(c)
})
}), b._objectEach(d, function(b, c) {
a.attributes[c] !== b && a.trigger("change:" + c, a, a.attributes[c], {})
}), b._objectEach(this.attributes, function(b, e) {
c.has(d, e) || a.trigger("change:" + e, a, b, {})
})
},
set: function(a, d, e) {
var f;
if (c.isObject(a) || b._isNullOrUndefined(a) ? (f = a, b._objectEach(f, function(a, c) {
f[c] = b._decode(c, a)
}), e = d) : (f = {}, f[a] = b._decode(a, d)), e = e || {}, !f) return this;
f instanceof b.Object && (f = f.attributes), e.unset && b._objectEach(f, function(a, c) {
f[c] = new b.Op.Unset
});
var g = c.clone(f),
h = this;
if (b._objectEach(g, function(a, c) {
a instanceof b.Op && (g[c] = a._estimate(h.attributes[c], h, c), g[c] === b.Op._UNSET && delete g[c])
}), !this._validate(f, e)) return !1;
this._mergeMagicFields(f), e.changes = {};
var i = this._escapedAttributes;
return this._previousAttributes || {}, b._arrayEach(c.keys(f), function(a) {
var d = f[a];
d instanceof b.Relation && (d.parent = h), d instanceof b.Op || (d = new b.Op.Set(d));
var g = !0;
d instanceof b.Op.Set && c.isEqual(h.attributes[a], d.value) && (g = !1), g && (delete i[a], e.silent ? h._silent[a] = !0 : e.changes[a] = !0);
var j = c.last(h._opSetQueue);
j[a] = d._mergeWithPrevious(j[a]), h._rebuildEstimatedDataForKey(a), g ? (h.changed[a] = h.attributes[a], e.silent || (h._pending[a] = !0)) : (delete h.changed[a], delete h._pending[a])
}), e.silent || this.change(e), this
},
unset: function(a, b) {
return b = b || {}, b.unset = !0, this.set(a, null, b)
},
increment: function(a, d) {
return (c.isUndefined(d) || c.isNull(d)) && (d = 1), this.set(a, new b.Op.Increment(d))
},
add: function(a, c) {
return this.set(a, new b.Op.Add([c]))
},
addUnique: function(a, c) {
return this.set(a, new b.Op.AddUnique([c]))
},
remove: function(a, c) {
return this.set(a, new b.Op.Remove([c]))
},
op: function(a) {
return c.last(this._opSetQueue)[a]
},
clear: function(a) {
a = a || {}, a.unset = !0;
var b = c.extend(this.attributes, this._operations);
return this.set(b, a)
},
_getSaveJSON: function() {
var a = c.clone(c.first(this._opSetQueue));
return b._objectEach(a, function(b, c) {
a[c] = b.toJSON()
}), a
},
_canBeSerialized: function() {
return b.Object._canBeSerializedAsValue(this.attributes)
},
fetch: function(a) {
var c = this;
a = a || {};
var d = b._request({
method: "GET",
route: "classes",
className: this.className,
objectId: this.id,
useMasterKey: a.useMasterKey
});
return d.then(function(a, b, d) {
return c._finishFetch(c.parse(a, b, d), !0), c
})._thenRunCallbacks(a, this)
},
save: function(a, d, e) {
var f, g, h;
if (c.isObject(a) || b._isNullOrUndefined(a) ? (f = a, h = d) : (f = {}, f[a] = d, h = e), !h && f) {
var i = c.reject(f, function(a, b) {
return c.include(["success", "error", "wait"], b)
});
if (0 === i.length) {
var j = !0;
if (c.has(f, "success") && !c.isFunction(f.success) && (j = !1), c.has(f, "error") && !c.isFunction(f.error) && (j = !1), j) return this.save(null, f)
}
}
h = c.clone(h) || {}, h.wait && (g = c.clone(this.attributes));
var k = c.clone(h) || {};
k.wait && (k.silent = !0);
var l;
if (k.error = function(a, b) {
l = b
}, f && !this.set(f, k)) return b.Promise.error(l)._thenRunCallbacks(h, this);
var m = this;
m._refreshCache();
var n = [],
o = [];
return b.Object._findUnsavedChildren(m.attributes, n, o), n.length + o.length > 0 ? b.Object._deepSaveAsync(this.attributes, {
useMasterKey: h.useMasterKey
}).then(function() {
return m.save(null, h)
}, function(a) {
return b.Promise.error(a)._thenRunCallbacks(h, m)
}) : (this._startSave(), this._saving = (this._saving || 0) + 1, this._allPreviousSaves = this._allPreviousSaves || b.Promise.as(), this._allPreviousSaves = this._allPreviousSaves._continueWith(function() {
var a = m.id ? "PUT" : "POST",
d = m._getSaveJSON(),
e = "classes",
i = m.className;
"_User" !== m.className || m.id || (e = "users", i = null);
var j = b._request({
route: e,
className: i,
objectId: m.id,
method: a,
useMasterKey: h.useMasterKey,
data: d
});
return j = j.then(function(a, b, d) {
var e = m.parse(a, b, d);
return h.wait && (e = c.extend(f || {}, e)), m._finishSave(e), h.wait && m.set(g, k), m
}, function(a) {
return m._cancelSave(), b.Promise.error(a)
})._thenRunCallbacks(h, m)
}), this._allPreviousSaves)
},
destroy: function(a) {
a = a || {};
var c = this,
d = function() {
c.trigger("destroy", c, c.collection, a)
};
if (!this.id) return d();
a.wait || d();
var e = b._request({
route: "classes",
className: this.className,
objectId: this.id,
method: "DELETE",
useMasterKey: a.useMasterKey
});
return e.then(function() {
return a.wait && d(), c
})._thenRunCallbacks(a, this)
},
parse: function(a, d) {
var e = c.clone(a);
return c(["createdAt", "updatedAt"]).each(function(a) {
e[a] && (e[a] = b._parseDate(e[a]))
}), e.updatedAt || (e.updatedAt = e.createdAt), d && (this._existed = 201 !== d), e
},
clone: function() {
return new this.constructor(this.attributes)
},
isNew: function() {
return !this.id
},
change: function(a) {
a = a || {};
var d = this._changing;
this._changing = !0;
var e = this;
b._objectEach(this._silent, function(a) {
e._pending[a] = !0
});
var f = c.extend({}, a.changes, this._silent);
if (this._silent = {}, b._objectEach(f, function(b, c) {
e.trigger("change:" + c, e, e.get(c), a)
}), d) return this;
for (var g = function(a, b) {
e._pending[b] || e._silent[b] || delete e.changed[b]
}; !c.isEmpty(this._pending);) this._pending = {}, this.trigger("change", this, a), b._objectEach(this.changed, g), e._previousAttributes = c.clone(this.attributes);
return this._changing = !1, this
},
existed: function() {
return this._existed
},
hasChanged: function(a) {
return arguments.length ? this.changed && c.has(this.changed, a) : !c.isEmpty(this.changed)
},
changedAttributes: function(a) {
if (!a) return this.hasChanged() ? c.clone(this.changed) : !1;
var d = {},
e = this._previousAttributes;
return b._objectEach(a, function(a, b) {
c.isEqual(e[b], a) || (d[b] = a)
}), d
},
previous: function(a) {
return arguments.length && this._previousAttributes ? this._previousAttributes[a] : null
},
previousAttributes: function() {
return c.clone(this._previousAttributes)
},
isValid: function() {
return !this.validate(this.attributes)
},
validate: function(a) {
if (c.has(a, "ACL") && !(a.ACL instanceof b.ACL)) return new b.Error(b.Error.OTHER_CAUSE, "ACL must be a Parse.ACL.");
var d = !0;
return b._objectEach(a, function(a, b) {
/^[A-Za-z][0-9A-Za-z_]*$/.test(b) || (d = !1)
}), d ? !1 : new b.Error(b.Error.INVALID_KEY_NAME)
},
_validate: function(a, b) {
if (b.silent || !this.validate) return !0;
a = c.extend({}, this.attributes, a);
var d = this.validate(a, b);
return d ? (b && b.error ? b.error(this, d, b) : this.trigger("error", this, d, b), !1) : !0
},
getACL: function() {
return this.get("ACL")
},
setACL: function(a, b) {
return this.set("ACL", a, b)
}
}), b.Object._getSubclass = function(a) {
if (!c.isString(a)) throw "Parse.Object._getSubclass requires a string argument.";
var d = b.Object._classMap[a];
return d || (d = b.Object.extend(a), b.Object._classMap[a] = d), d
}, b.Object._create = function(a, c, d) {
var e = b.Object._getSubclass(a);
return new e(c, d)
}, b.Object._toObjectIdArray = function(a, c) {
if (0 === a.length) return b.Promise.as(a);
for (var d, e = a[0].className, f = [], g = 0; g < a.length; g++) {
var h = a[g];
if (e !== h.className) return d = new b.Error(b.Error.INVALID_CLASS_NAME, "All objects should be of the same class"), b.Promise.error(d);
if (!h.id) return d = new b.Error(b.Error.MISSING_OBJECT_ID, "All objects must have an ID"), b.Promise.error(d);
c && h._hasData || f.push(h.id)
}
return b.Promise.as(f)
}, b.Object._updateWithFetchedResults = function(a, c, d) {
var e = {};
b._arrayEach(c, function(a) {
e[a.id] = a
});
for (var f = 0; f < a.length; f++) {
var g = a[f],
h = e[g.id];
if (!h && d) {
var i = new b.Error(b.Error.OBJECT_NOT_FOUND, "All objects must exist on the server");
return b.Promise.error(i)
}
g._mergeFromObject(h)
}
return b.Promise.as(a)
}, b.Object._fetchAll = function(a, c) {
if (0 === a.length) return b.Promise.as(a);
var d = !c;
return b.Object._toObjectIdArray(a, d).then(function(c) {
var d = a[0].className,
e = new b.Query(d);
return e.containedIn("objectId", c), e.limit = c.length, e.find()
}).then(function(d) {
return b.Object._updateWithFetchedResults(a, d, c)
})
}, b.Object._classMap = {}, b.Object._extend = b._extend, b.Object.extend = function(a, d, e) {
if (!c.isString(a)) {
if (a && c.has(a, "className")) return b.Object.extend(a.className, a, d);
throw new Error("Parse.Object.extend's first argument should be the className.")
}
"User" === a && b.User._performUserRewrite && (a = "_User"), d = d || {}, d.className = a;
var f = null;
if (c.has(b.Object._classMap, a)) {
var g = b.Object._classMap[a];
f = g._extend(d, e)
} else f = this._extend(d, e);
return f.extend = function(d) {
if (c.isString(d) || d && c.has(d, "className")) return b.Object.extend.apply(f, arguments);
var e = [a].concat(b._.toArray(arguments));
return b.Object.extend.apply(f, e)
}, b.Object._classMap[a] = f, f
}, b.Object._findUnsavedChildren = function(a, c, d) {
b._traverse(a, function(a) {
return a instanceof b.Object ? (a._refreshCache(), a.dirty() && c.push(a), void 0) : a instanceof b.File ? (a.url() || d.push(a), void 0) : void 0
})
}, b.Object._canBeSerializedAsValue = function(a) {
if (a instanceof b.Object) return !!a.id;
if (a instanceof b.File) return !0;
var d = !0;
return c.isArray(a) ? b._arrayEach(a, function(a) {
b.Object._canBeSerializedAsValue(a) || (d = !1)
}) : c.isObject(a) && b._objectEach(a, function(a) {
b.Object._canBeSerializedAsValue(a) || (d = !1)
}), d
}, b.Object._deepSaveAsync = function(a, d) {
var e = [],
f = [];
b.Object._findUnsavedChildren(a, e, f);
var g = b.Promise.as();
c.each(f, function(a) {
g = g.then(function() {
return a.save(d)
})
});
var h = c.uniq(e),
i = c.uniq(h);
return g.then(function() {
return b.Promise._continueWhile(function() {
return i.length > 0
}, function() {
var a = [],
e = [];
if (b._arrayEach(i, function(b) {
return a.length > 20 ? (e.push(b), void 0) : (b._canBeSerialized() ? a.push(b) : e.push(b), void 0)
}), i = e, 0 === a.length) return b.Promise.error(new b.Error(b.Error.OTHER_CAUSE, "Tried to save a batch with a cycle."));
var f = b.Promise.when(c.map(a, function(a) {
return a._allPreviousSaves || b.Promise.as()
})),
g = new b.Promise;
return b._arrayEach(a, function(a) {
a._allPreviousSaves = g
}), f._continueWith(function() {
return b._request({
route: "batch",
method: "POST",
useMasterKey: d.useMasterKey,
data: {
requests: c.map(a, function(a) {
var b = a._getSaveJSON(),
c = "POST",
d = "/1/classes/" + a.className;
return a.id && (d = d + "/" + a.id, c = "PUT"), a._startSave(), {
method: c,
path: d,
body: b
}
})
}
}).then(function(c, d, e) {
var f;
return b._arrayEach(a, function(a, b) {
c[b].success ? a._finishSave(a.parse(c[b].success, d, e)) : (f = f || c[b].error, a._cancelSave())
}), f ? b.Promise.error(new b.Error(f.code, f.error)) : void 0
}).then(function(a) {
return g.resolve(a), a
}, function(a) {
return g.reject(a), b.Promise.error(a)
})
})
})
}).then(function() {
return a
})
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Role = b.Object.extend("_Role", {
constructor: function(a, d) {
c.isString(a) && d instanceof b.ACL ? (b.Object.prototype.constructor.call(this, null, null), this.setName(a), this.setACL(d)) : b.Object.prototype.constructor.call(this, a, d)
},
getName: function() {
return this.get("name")
},
setName: function(a, b) {
return this.set("name", a, b)
},
getUsers: function() {
return this.relation("users")
},
getRoles: function() {
return this.relation("roles")
},
validate: function(a, d) {
if ("name" in a && a.name !== this.getName()) {
var e = a.name;
if (this.id && this.id !== a.objectId) return new b.Error(b.Error.OTHER_CAUSE, "A role's name can only be set before it has been saved.");
if (!c.isString(e)) return new b.Error(b.Error.OTHER_CAUSE, "A role's name must be a String.");
if (!/^[0-9a-zA-Z\-_ ]+$/.test(e)) return new b.Error(b.Error.OTHER_CAUSE, "A role's name can only contain alphanumeric characters, _, -, and spaces.")
}
return b.Object.prototype.validate ? b.Object.prototype.validate.call(this, a, d) : !1
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Collection = function(a, b) {
b = b || {}, b.comparator && (this.comparator = b.comparator), b.model && (this.model = b.model), b.query && (this.query = b.query), this._reset(), this.initialize.apply(this, arguments), a && this.reset(a, {
silent: !0,
parse: b.parse
})
}, c.extend(b.Collection.prototype, b.Events, {
model: b.Object,
initialize: function() {},
toJSON: function() {
return this.map(function(a) {
return a.toJSON()
})
},
add: function(a, d) {
var e, f, g, h, i, j, k = {},
l = {};
for (d = d || {}, a = c.isArray(a) ? a.slice() : [a], e = 0, g = a.length; g > e; e++) {
if (a[e] = this._prepareModel(a[e], d), h = a[e], !h) throw new Error("Can't add an invalid model to a collection");
if (i = h.cid, k[i] || this._byCid[i]) throw new Error("Duplicate cid: can't add the same model to a collection twice");
if (j = h.id, !b._isNullOrUndefined(j) && (l[j] || this._byId[j])) throw new Error("Duplicate id: can't add the same model to a collection twice");
l[j] = h, k[i] = h
}
for (e = 0; g > e; e++)(h = a[e]).on("all", this._onModelEvent, this), this._byCid[h.cid] = h, h.id && (this._byId[h.id] = h);
if (this.length += g, f = b._isNullOrUndefined(d.at) ? this.models.length : d.at, this.models.splice.apply(this.models, [f, 0].concat(a)), this.comparator && this.sort({
silent: !0
}), d.silent) return this;
for (e = 0, g = this.models.length; g > e; e++) h = this.models[e], k[h.cid] && (d.index = e, h.trigger("add", h, this, d));
return this
},
remove: function(a, b) {
var d, e, f, g;
for (b = b || {}, a = c.isArray(a) ? a.slice() : [a], d = 0, e = a.length; e > d; d++) g = this.getByCid(a[d]) || this.get(a[d]), g && (delete this._byId[g.id], delete this._byCid[g.cid], f = this.indexOf(g), this.models.splice(f, 1), this.length--, b.silent || (b.index = f, g.trigger("remove", g, this, b)), this._removeReference(g));
return this
},
get: function(a) {
return a && this._byId[a.id || a]
},
getByCid: function(a) {
return a && this._byCid[a.cid || a]
},
at: function(a) {
return this.models[a]
},
sort: function(a) {
if (a = a || {}, !this.comparator) throw new Error("Cannot sort a set without a comparator");
var b = c.bind(this.comparator, this);
return 1 === this.comparator.length ? this.models = this.sortBy(b) : this.models.sort(b), a.silent || this.trigger("reset", this, a), this
},
pluck: function(a) {
return c.map(this.models, function(b) {
return b.get(a)
})
},
reset: function(a, c) {
var d = this;
return a = a || [], c = c || {}, b._arrayEach(this.models, function(a) {
d._removeReference(a)
}), this._reset(), this.add(a, {
silent: !0,
parse: c.parse
}), c.silent || this.trigger("reset", this, c), this
},
fetch: function(a) {
a = c.clone(a) || {}, void 0 === a.parse && (a.parse = !0);
var d = this,
e = this.query || new b.Query(this.model);
return e.find({
useMasterKey: a.useMasterKey
}).then(function(b) {
return a.add ? d.add(b, a) : d.reset(b, a), d
})._thenRunCallbacks(a, this)
},
create: function(a, b) {
var d = this;
if (b = b ? c.clone(b) : {}, a = this._prepareModel(a, b), !a) return !1;
b.wait || d.add(a, b);
var e = b.success;
return b.success = function(c, f) {
b.wait && d.add(c, b), e ? e(c, f) : c.trigger("sync", a, f, b)
}, a.save(null, b), a
},
parse: function(a) {
return a
},
chain: function() {
return c(this.models).chain()
},
_reset: function() {
this.length = 0, this.models = [], this._byId = {}, this._byCid = {}
},
_prepareModel: function(a, c) {
if (a instanceof b.Object) a.collection || (a.collection = this);
else {
var d = a;
c.collection = this, a = new this.model(d, c), a._validate(a.attributes, c) || (a = !1)
}
return a
},
_removeReference: function(a) {
this === a.collection && delete a.collection, a.off("all", this._onModelEvent, this)
},
_onModelEvent: function(a, b, c, d) {
("add" !== a && "remove" !== a || c === this) && ("destroy" === a && this.remove(b, d), b && "change:objectId" === a && (delete this._byId[b.previous("objectId")], this._byId[b.id] = b), this.trigger.apply(this, arguments))
}
});
var d = ["forEach", "each", "map", "reduce", "reduceRight", "find", "detect", "filter", "select", "reject", "every", "all", "some", "any", "include", "contains", "invoke", "max", "min", "sortBy", "sortedIndex", "toArray", "size", "first", "initial", "rest", "last", "without", "indexOf", "shuffle", "lastIndexOf", "isEmpty", "groupBy"];
b._arrayEach(d, function(a) {
b.Collection.prototype[a] = function() {
return c[a].apply(c, [this.models].concat(c.toArray(arguments)))
}
}), b.Collection.extend = b._extend
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.View = function(a) {
this.cid = c.uniqueId("view"), this._configure(a || {}), this._ensureElement(), this.initialize.apply(this, arguments), this.delegateEvents()
};
var d = /^(\S+)\s*(.*)$/,
e = ["model", "collection", "el", "id", "attributes", "className", "tagName"];
c.extend(b.View.prototype, b.Events, {
tagName: "div",
$: function(a) {
return this.$el.find(a)
},
initialize: function() {},
render: function() {
return this
},
remove: function() {
return this.$el.remove(), this
},
make: function(a, c, d) {
var e = document.createElement(a);
return c && b.$(e).attr(c), d && b.$(e).html(d), e
},
setElement: function(a, c) {
return this.$el = b.$(a), this.el = this.$el[0], c !== !1 && this.delegateEvents(), this
},
delegateEvents: function(a) {
if (a = a || b._getValue(this, "events")) {
this.undelegateEvents();
var e = this;
b._objectEach(a, function(b, f) {
if (c.isFunction(b) || (b = e[a[f]]), !b) throw new Error('Event "' + a[f] + '" does not exist');
var g = f.match(d),
h = g[1],
i = g[2];
b = c.bind(b, e), h += ".delegateEvents" + e.cid, "" === i ? e.$el.bind(h, b) : e.$el.delegate(i, h, b)
})
}
},
undelegateEvents: function() {
this.$el.unbind(".delegateEvents" + this.cid)
},
_configure: function(a) {
this.options && (a = c.extend({}, this.options, a));
var b = this;
c.each(e, function(c) {
a[c] && (b[c] = a[c])
}), this.options = a
},
_ensureElement: function() {
if (this.el) this.setElement(this.el, !1);
else {
var a = b._getValue(this, "attributes") || {};
this.id && (a.id = this.id), this.className && (a["class"] = this.className), this.setElement(this.make(this.tagName, a), !1)
}
}
}), b.View.extend = b._extend
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.User = b.Object.extend("_User", {
_isCurrentUser: !1,
_mergeFromObject: function(a) {
a.getSessionToken() && (this._sessionToken = a.getSessionToken()), b.User.__super__._mergeFromObject.call(this, a)
},
_mergeMagicFields: function(a) {
a.sessionToken && (this._sessionToken = a.sessionToken, delete a.sessionToken), b.User.__super__._mergeMagicFields.call(this, a)
},
_cleanupAuthData: function() {
if (this.isCurrent()) {
var a = this.get("authData");
a && b._objectEach(this.get("authData"), function(b, c) {
a[c] || delete a[c]
})
}
},
_synchronizeAllAuthData: function() {
var a = this.get("authData");
if (a) {
var c = this;
b._objectEach(this.get("authData"), function(a, b) {
c._synchronizeAuthData(b)
})
}
},
_synchronizeAuthData: function(a) {
if (this.isCurrent()) {
var d;
c.isString(a) ? (d = a, a = b.User._authProviders[d]) : d = a.getAuthType();
var e = this.get("authData");
if (e && a) {
var f = a.restoreAuthentication(e[d]);
f || this._unlinkFrom(a)
}
}
},
_handleSaveResult: function(a) {
a && (this._isCurrentUser = !0), this._cleanupAuthData(), this._synchronizeAllAuthData(), delete this._serverData.password, this._rebuildEstimatedDataForKey("password"), this._refreshCache(), (a || this.isCurrent()) && b.User._saveCurrentUser(this)
},
_linkWith: function(a, d) {
var e;
if (c.isString(a) ? (e = a, a = b.User._authProviders[a]) : e = a.getAuthType(), c.has(d, "authData")) {
var f = this.get("authData") || {};
f[e] = d.authData, this.set("authData", f);
var g = c.clone(d) || {};
return g.success = function(a) {
a._handleSaveResult(!0), d.success && d.success.apply(this, arguments)
}, this.save({
authData: f
}, g)
}
var h = this,
i = new b.Promise;
return a.authenticate({
success: function(a, b) {
h._linkWith(a, {
authData: b,
success: d.success,
error: d.error
}).then(function() {
i.resolve(h)
})
},
error: function(a, b) {
d.error && d.error(h, b), i.reject(b)
}
}), i
},
_unlinkFrom: function(a, d) {
var e;
c.isString(a) ? (e = a, a = b.User._authProviders[a]) : e = a.getAuthType();
var f = c.clone(d),
g = this;
return f.authData = null, f.success = function() {
g._synchronizeAuthData(a), d.success && d.success.apply(this, arguments)
}, this._linkWith(a, f)
},
_isLinked: function(a) {
var b;
b = c.isString(a) ? a : a.getAuthType();
var d = this.get("authData") || {};
return !!d[b]
},
_logOutWithAll: function() {
var a = this.get("authData");
if (a) {
var c = this;
b._objectEach(this.get("authData"), function(a, b) {
c._logOutWith(b)
})
}
},
_logOutWith: function(a) {
this.isCurrent() && (c.isString(a) && (a = b.User._authProviders[a]), a && a.deauthenticate && a.deauthenticate())
},
signUp: function(a, d) {
var e;
d = d || {};
var f = a && a.username || this.get("username");
if (!f || "" === f) return e = new b.Error(b.Error.OTHER_CAUSE, "Cannot sign up user with an empty name."), d && d.error && d.error(this, e), b.Promise.error(e);
var g = a && a.password || this.get("password");
if (!g || "" === g) return e = new b.Error(b.Error.OTHER_CAUSE, "Cannot sign up user with an empty password."), d && d.error && d.error(this, e), b.Promise.error(e);
var h = c.clone(d);
return h.success = function(a) {
a._handleSaveResult(!0), d.success && d.success.apply(this, arguments)
}, this.save(a, h)
},
logIn: function(a) {
var c = this;
a = a || {};
var d = b._request({
route: "login",
method: "GET",
useMasterKey: a.useMasterKey,
data: this.toJSON()
});
return d.then(function(a, b, d) {
var e = c.parse(a, b, d);
return c._finishFetch(e), c._handleSaveResult(!0), c
})._thenRunCallbacks(a, this)
},
save: function(a, d, e) {
var f, g;
c.isObject(a) || c.isNull(a) || c.isUndefined(a) ? (f = a, g = d) : (f = {}, f[a] = d, g = e), g = g || {};
var h = c.clone(g);
return h.success = function(a) {
a._handleSaveResult(!1), g.success && g.success.apply(this, arguments)
}, b.Object.prototype.save.call(this, f, h)
},
fetch: function(a) {
var d = a ? c.clone(a) : {};
return d.success = function(b) {
b._handleSaveResult(!1), a && a.success && a.success.apply(this, arguments)
}, b.Object.prototype.fetch.call(this, d)
},
isCurrent: function() {
return this._isCurrentUser
},
getUsername: function() {
return this.get("username")
},
setUsername: function(a, b) {
return this.set("username", a, b)
},
setPassword: function(a, b) {
return this.set("password", a, b)
},
getEmail: function() {
return this.get("email")
},
setEmail: function(a, b) {
return this.set("email", a, b)
},
authenticated: function() {
return !!this._sessionToken && b.User.current() && b.User.current().id === this.id
},
getSessionToken: function() {
return this._sessionToken
}
}, {
_currentUser: null,
_currentUserMatchesDisk: !1,
_CURRENT_USER_KEY: "currentUser",
_authProviders: {},
_performUserRewrite: !0,
signUp: function(a, c, d, e) {
d = d || {}, d.username = a, d.password = c;
var f = b.Object._create("_User");
return f.signUp(d, e)
},
logIn: function(a, c, d) {
var e = b.Object._create("_User");
return e._finishFetch({
username: a,
password: c
}), e.logIn(d)
},
become: function(a, c) {
c = c || {};
var d = b.Object._create("_User");
return b._request({
route: "users",
className: "me",
method: "GET",
useMasterKey: c.useMasterKey,
sessionToken: a
}).then(function(a, b, c) {
var e = d.parse(a, b, c);
return d._finishFetch(e), d._handleSaveResult(!0), d
})._thenRunCallbacks(c, d)
},
logOut: function() {
null !== b.User._currentUser && (b.User._currentUser._logOutWithAll(), b.User._currentUser._isCurrentUser = !1), b.User._currentUserMatchesDisk = !0, b.User._currentUser = null, b.localStorage.removeItem(b._getParsePath(b.User._CURRENT_USER_KEY))
},
requestPasswordReset: function(a, c) {
c = c || {};
var d = b._request({
route: "requestPasswordReset",
method: "POST",
useMasterKey: c.useMasterKey,
data: {
email: a
}
});
return d._thenRunCallbacks(c)
},
current: function() {
if (b.User._currentUser) return b.User._currentUser;
if (b.User._currentUserMatchesDisk) return b.User._currentUser;
b.User._currentUserMatchesDisk = !0;
var a = b.localStorage.getItem(b._getParsePath(b.User._CURRENT_USER_KEY));
if (!a) return null;
b.User._currentUser = b.Object._create("_User"), b.User._currentUser._isCurrentUser = !0;
var c = JSON.parse(a);
return b.User._currentUser.id = c._id, delete c._id, b.User._currentUser._sessionToken = c._sessionToken, delete c._sessionToken, b.User._currentUser._finishFetch(c), b.User._currentUser._synchronizeAllAuthData(), b.User._currentUser._refreshCache(), b.User._currentUser._opSetQueue = [{}], b.User._currentUser
},
allowCustomUserClass: function(a) {
this._performUserRewrite = !a
},
_saveCurrentUser: function(a) {
b.User._currentUser !== a && b.User.logOut(), a._isCurrentUser = !0, b.User._currentUser = a, b.User._currentUserMatchesDisk = !0;
var c = a.toJSON();
c._id = a.id, c._sessionToken = a._sessionToken, b.localStorage.setItem(b._getParsePath(b.User._CURRENT_USER_KEY), JSON.stringify(c))
},
_registerAuthenticationProvider: function(a) {
b.User._authProviders[a.getAuthType()] = a, b.User.current() && b.User.current()._synchronizeAuthData(a.getAuthType())
},
_logInWith: function(a, c) {
var d = b.Object._create("_User");
return d._linkWith(a, c)
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Query = function(a) {
c.isString(a) && (a = b.Object._getSubclass(a)), this.objectClass = a, this.className = a.prototype.className, this._where = {}, this._include = [], this._limit = -1, this._skip = 0, this._extraOptions = {}
}, b.Query.or = function() {
var a = c.toArray(arguments),
d = null;
b._arrayEach(a, function(a) {
if (c.isNull(d) && (d = a.className), d !== a.className) throw "All queries must be for the same class"
});
var e = new b.Query(d);
return e._orQuery(a), e
}, b.Query.prototype = {
get: function(a, d) {
var e = this;
e.equalTo("objectId", a);
var f = {};
return d && c.has(d, "useMasterKey") && (f = {
useMasterKey: d.useMasterKey
}), e.first(f).then(function(a) {
if (a) return a;
var c = new b.Error(b.Error.OBJECT_NOT_FOUND, "Object not found.");
return b.Promise.error(c)
})._thenRunCallbacks(d, null)
},
toJSON: function() {
var a = {
where: this._where
};
return this._include.length > 0 && (a.include = this._include.join(",")), this._select && (a.keys = this._select.join(",")), this._limit >= 0 && (a.limit = this._limit), this._skip > 0 && (a.skip = this._skip), void 0 !== this._order && (a.order = this._order.join(",")), b._objectEach(this._extraOptions, function(b, c) {
a[c] = b
}), a
},
find: function(a) {
var d = this;
a = a || {};
var e = b._request({
route: "classes",
className: this.className,
method: "GET",
useMasterKey: a.useMasterKey,
data: this.toJSON()
});
return e.then(function(a) {
return c.map(a.results, function(c) {
var e;
return e = a.className ? new b.Object(a.className) : new d.objectClass, e._finishFetch(c, !0), e
})
})._thenRunCallbacks(a)
},
count: function(a) {
var c = this;
a = a || {};
var d = this.toJSON();
d.limit = 0, d.count = 1;
var e = b._request({
route: "classes",
className: c.className,
method: "GET",
useMasterKey: a.useMasterKey,
data: d
});
return e.then(function(a) {
return a.count
})._thenRunCallbacks(a)
},
first: function(a) {
var d = this;
a = a || {};
var e = this.toJSON();
e.limit = 1;
var f = b._request({
route: "classes",
className: this.className,
method: "GET",
useMasterKey: a.useMasterKey,
data: e
});
return f.then(function(a) {
return c.map(a.results, function(c) {
var e;
return e = a.className ? new b.Object(a.className) : new d.objectClass, e._finishFetch(c, !0), e
})[0]
})._thenRunCallbacks(a)
},
collection: function(a, d) {
return d = d || {}, new b.Collection(a, c.extend(d, {
model: this.objectClass,
query: this
}))
},
skip: function(a) {
return this._skip = a, this
},
limit: function(a) {
return this._limit = a, this
},
equalTo: function(a, d) {
return c.isUndefined(d) ? this.doesNotExist(a) : (this._where[a] = b._encode(d), this)
},
_addCondition: function(a, c, d) {
return this._where[a] || (this._where[a] = {}), this._where[a][c] = b._encode(d), this
},
notEqualTo: function(a, b) {
return this._addCondition(a, "$ne", b), this
},
lessThan: function(a, b) {
return this._addCondition(a, "$lt", b), this
},
greaterThan: function(a, b) {
return this._addCondition(a, "$gt", b), this
},
lessThanOrEqualTo: function(a, b) {
return this._addCondition(a, "$lte", b), this
},
greaterThanOrEqualTo: function(a, b) {
return this._addCondition(a, "$gte", b), this
},
containedIn: function(a, b) {
return this._addCondition(a, "$in", b), this
},
notContainedIn: function(a, b) {
return this._addCondition(a, "$nin", b), this
},
containsAll: function(a, b) {
return this._addCondition(a, "$all", b), this
},
exists: function(a) {
return this._addCondition(a, "$exists", !0), this
},
doesNotExist: function(a) {
return this._addCondition(a, "$exists", !1), this
},
matches: function(a, b, c) {
return this._addCondition(a, "$regex", b), c || (c = ""), b.ignoreCase && (c += "i"), b.multiline && (c += "m"), c && c.length && this._addCondition(a, "$options", c), this
},
matchesQuery: function(a, b) {
var c = b.toJSON();
return c.className = b.className, this._addCondition(a, "$inQuery", c), this
},
doesNotMatchQuery: function(a, b) {
var c = b.toJSON();
return c.className = b.className, this._addCondition(a, "$notInQuery", c), this
},
matchesKeyInQuery: function(a, b, c) {
var d = c.toJSON();
return d.className = c.className, this._addCondition(a, "$select", {
key: b,
query: d
}), this
},
doesNotMatchKeyInQuery: function(a, b, c) {
var d = c.toJSON();
return d.className = c.className, this._addCondition(a, "$dontSelect", {
key: b,
query: d
}), this
},
_orQuery: function(a) {
var b = c.map(a, function(a) {
return a.toJSON().where
});
return this._where.$or = b, this
},
_quote: function(a) {
return "\\Q" + a.replace("\\E", "\\E\\\\E\\Q") + "\\E"
},
contains: function(a, b) {
return this._addCondition(a, "$regex", this._quote(b)), this
},
startsWith: function(a, b) {
return this._addCondition(a, "$regex", "^" + this._quote(b)), this
},
endsWith: function(a, b) {
return this._addCondition(a, "$regex", this._quote(b) + "$"), this
},
ascending: function() {
return this._order = [], this.addAscending.apply(this, arguments)
},
addAscending: function() {
var a = this;
return this._order || (this._order = []), b._arrayEach(arguments, function(b) {
Array.isArray(b) && (b = b.join()), a._order = a._order.concat(b.replace(/\s/g, "").split(","))
}), this
},
descending: function() {
return this._order = [], this.addDescending.apply(this, arguments)
},
addDescending: function() {
var a = this;
return this._order || (this._order = []), b._arrayEach(arguments, function(b) {
Array.isArray(b) && (b = b.join()), a._order = a._order.concat(c.map(b.replace(/\s/g, "").split(","), function(a) {
return "-" + a
}))
}), this
},
near: function(a, c) {
return c instanceof b.GeoPoint || (c = new b.GeoPoint(c)), this._addCondition(a, "$nearSphere", c), this
},
withinRadians: function(a, b, c) {
return this.near(a, b), this._addCondition(a, "$maxDistance", c), this
},
withinMiles: function(a, b, c) {
return this.withinRadians(a, b, c / 3958.8)
},
withinKilometers: function(a, b, c) {
return this.withinRadians(a, b, c / 6371)
},
withinGeoBox: function(a, c, d) {
return c instanceof b.GeoPoint || (c = new b.GeoPoint(c)), d instanceof b.GeoPoint || (d = new b.GeoPoint(d)), this._addCondition(a, "$within", {
$box: [c, d]
}), this
},
include: function() {
var a = this;
return b._arrayEach(arguments, function(b) {
c.isArray(b) ? a._include = a._include.concat(b) : a._include.push(b)
}), this
},
select: function() {
var a = this;
return this._select = this._select || [], b._arrayEach(arguments, function(b) {
c.isArray(b) ? a._select = a._select.concat(b) : a._select.push(b)
}), this
},
each: function(a, d) {
if (d = d || {}, this._order || this._skip || this._limit >= 0) {
var e = "Cannot iterate on a query with sort, skip, or limit.";
return b.Promise.error(e)._thenRunCallbacks(d)
}
new b.Promise;
var f = new b.Query(this.objectClass);
f._limit = d.batchSize || 100, f._where = c.clone(this._where), f._include = c.clone(this._include), f.ascending("objectId");
var g = {};
c.has(d, "useMasterKey") && (g.useMasterKey = d.useMasterKey);
var h = !1;
return b.Promise._continueWhile(function() {
return !h
}, function() {
return f.find(g).then(function(c) {
var d = b.Promise.as();
return b._.each(c, function(b) {
d = d.then(function() {
return a(b)
})
}), d.then(function() {
c.length >= f._limit ? f.greaterThan("objectId", c[c.length - 1].id) : h = !0
})
})
})._thenRunCallbacks(d)
}
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b, c, d = a.Parse,
e = d._,
f = !1,
g = {
authenticate: function(a) {
var c = this;
FB.login(function(b) {
b.authResponse ? a.success && a.success(c, {
id: b.authResponse.userID,
access_token: b.authResponse.accessToken,
expiration_date: new Date(1e3 * b.authResponse.expiresIn + (new Date).getTime()).toJSON()
}) : a.error && a.error(c, b)
}, {
scope: b
})
},
restoreAuthentication: function(a) {
if (a) {
var b = {
userID: a.id,
accessToken: a.access_token,
expiresIn: (d._parseDate(a.expiration_date).getTime() - (new Date).getTime()) / 1e3
},
f = e.clone(c);
f.authResponse = b, f.status = !1;
var g = FB.getAuthResponse();
g && g.userID !== b.userID && FB.logout(), FB.init(f)
}
return !0
},
getAuthType: function() {
return "facebook"
},
deauthenticate: function() {
this.restoreAuthentication(null)
}
};
d.FacebookUtils = {
init: function(a) {
if ("undefined" == typeof FB) throw "The Facebook JavaScript SDK must be loaded before calling init.";
if (c = e.clone(a) || {}, c.status && "undefined" != typeof console) {
var b = console.warn || console.log || function() {};
b.call(console, "The 'status' flag passed into FB.init, when set to true, can interfere with Parse Facebook integration, so it has been suppressed. Please call FB.getLoginStatus() explicitly if you require this behavior.")
}
c.status = !1, FB.init(c), d.User._registerAuthenticationProvider(g), f = !0
},
isLinked: function(a) {
return a._isLinked("facebook")
},
logIn: function(a, c) {
if (!a || e.isString(a)) {
if (!f) throw "You must initialize FacebookUtils before calling logIn.";
return b = a, d.User._logInWith("facebook", c)
}
var g = e.clone(c) || {};
return g.authData = a, d.User._logInWith("facebook", g)
},
link: function(a, c, d) {
if (!c || e.isString(c)) {
if (!f) throw "You must initialize FacebookUtils before calling link.";
return b = c, a._linkWith("facebook", d)
}
var g = e.clone(d) || {};
return g.authData = c, a._linkWith("facebook", g)
},
unlink: function(a, b) {
if (!f) throw "You must initialize FacebookUtils before calling unlink.";
return a._unlinkFrom("facebook", b)
}
}
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.History = function() {
this.handlers = [], c.bindAll(this, "checkUrl")
};
var d = /^[#\/]/,
e = /msie [\w.]+/;
b.History.started = !1, c.extend(b.History.prototype, b.Events, {
interval: 50,
getHash: function(a) {
var b = a ? a.location : window.location,
c = b.href.match(/#(.*)$/);
return c ? c[1] : ""
},
getFragment: function(a, c) {
if (b._isNullOrUndefined(a))
if (this._hasPushState || c) {
a = window.location.pathname;
var e = window.location.search;
e && (a += e)
} else a = this.getHash();
return a.indexOf(this.options.root) || (a = a.substr(this.options.root.length)), a.replace(d, "")
},
start: function(a) {
if (b.History.started) throw new Error("Parse.history has already been started");
b.History.started = !0, this.options = c.extend({}, {
root: "/"
}, this.options, a), this._wantsHashChange = this.options.hashChange !== !1, this._wantsPushState = !!this.options.pushState, this._hasPushState = !!(this.options.pushState && window.history && window.history.pushState);
var f = this.getFragment(),
g = document.documentMode,
h = e.exec(navigator.userAgent.toLowerCase()) && (!g || 7 >= g);
h && (this.iframe = b.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow, this.navigate(f)), this._hasPushState ? b.$(window).bind("popstate", this.checkUrl) : this._wantsHashChange && "onhashchange" in window && !h ? b.$(window).bind("hashchange", this.checkUrl) : this._wantsHashChange && (this._checkUrlInterval = window.setInterval(this.checkUrl, this.interval)), this.fragment = f;
var i = window.location,
j = i.pathname === this.options.root;
return this._wantsHashChange && this._wantsPushState && !this._hasPushState && !j ? (this.fragment = this.getFragment(null, !0), window.location.replace(this.options.root + "#" + this.fragment), !0) : (this._wantsPushState && this._hasPushState && j && i.hash && (this.fragment = this.getHash().replace(d, ""), window.history.replaceState({}, document.title, i.protocol + "//" + i.host + this.options.root + this.fragment)), this.options.silent ? void 0 : this.loadUrl())
},
stop: function() {
b.$(window).unbind("popstate", this.checkUrl).unbind("hashchange", this.checkUrl), window.clearInterval(this._checkUrlInterval), b.History.started = !1
},
route: function(a, b) {
this.handlers.unshift({
route: a,
callback: b
})
},
checkUrl: function() {
var a = this.getFragment();
return a === this.fragment && this.iframe && (a = this.getFragment(this.getHash(this.iframe))), a === this.fragment ? !1 : (this.iframe && this.navigate(a), this.loadUrl() || this.loadUrl(this.getHash()), void 0)
},
loadUrl: function(a) {
var b = this.fragment = this.getFragment(a),
d = c.any(this.handlers, function(a) {
return a.route.test(b) ? (a.callback(b), !0) : void 0
});
return d
},
navigate: function(a, c) {
if (!b.History.started) return !1;
c && c !== !0 || (c = {
trigger: c
});
var e = (a || "").replace(d, "");
if (this.fragment !== e) {
if (this._hasPushState) {
0 !== e.indexOf(this.options.root) && (e = this.options.root + e), this.fragment = e;
var f = c.replace ? "replaceState" : "pushState";
window.history[f]({}, document.title, e)
} else this._wantsHashChange ? (this.fragment = e, this._updateHash(window.location, e, c.replace), this.iframe && e !== this.getFragment(this.getHash(this.iframe)) && (c.replace || this.iframe.document.open().close(), this._updateHash(this.iframe.location, e, c.replace))) : window.location.assign(this.options.root + a);
c.trigger && this.loadUrl(a)
}
},
_updateHash: function(a, b, c) {
if (c) {
var d = a.toString().replace(/(javascript:|#).*$/, "");
a.replace(d + "#" + b)
} else a.hash = b
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Router = function(a) {
a = a || {}, a.routes && (this.routes = a.routes), this._bindRoutes(), this.initialize.apply(this, arguments)
};
var d = /:\w+/g,
e = /\*\w+/g,
f = /[\-\[\]{}()+?.,\\\^\$\|#\s]/g;
c.extend(b.Router.prototype, b.Events, {
initialize: function() {},
route: function(a, d, e) {
return b.history = b.history || new b.History, c.isRegExp(a) || (a = this._routeToRegExp(a)), e || (e = this[d]), b.history.route(a, c.bind(function(c) {
var f = this._extractParameters(a, c);
e && e.apply(this, f), this.trigger.apply(this, ["route:" + d].concat(f)), b.history.trigger("route", this, d, f)
}, this)), this
},
navigate: function(a, c) {
b.history.navigate(a, c)
},
_bindRoutes: function() {
if (this.routes) {
var a = [];
for (var b in this.routes) this.routes.hasOwnProperty(b) && a.unshift([b, this.routes[b]]);
for (var c = 0, d = a.length; d > c; c++) this.route(a[c][0], a[c][1], this[a[c][1]])
}
},
_routeToRegExp: function(a) {
return a = a.replace(f, "\\$&").replace(d, "([^/]+)").replace(e, "(.*?)"), new RegExp("^" + a + "$")
},
_extractParameters: function(a, b) {
return a.exec(b).slice(1)
}
}), b.Router.extend = b._extend
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse,
c = b._;
b.Cloud = b.Cloud || {}, c.extend(b.Cloud, {
run: function(a, c, d) {
d = d || {};
var e = b._request({
route: "functions",
className: a,
method: "POST",
useMasterKey: d.useMasterKey,
data: b._encode(c, null, !0)
});
return e.then(function(a) {
return b._decode(null, a).result
})._thenRunCallbacks(d)
}
})
}(this),
function(a) {
a.Parse = a.Parse || {};
var b = a.Parse;
b.Installation = b.Object.extend("_Installation"), b.Push = b.Push || {}, b.Push.send = function(a, c) {
if (c = c || {}, a.where && (a.where = a.where.toJSON().where), a.push_time && (a.push_time = a.push_time.toJSON()), a.expiration_time && (a.expiration_time = a.expiration_time.toJSON()), a.expiration_time && a.expiration_interval) throw "Both expiration_time and expiration_interval can't be set";
var d = b._request({
route: "push",
method: "POST",
data: a,
useMasterKey: c.useMasterKey
});
return d._thenRunCallbacks(c)
}
}(this);