您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Parse DB ver 1.3.3 min
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @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);