/gi, R = /^(?:body|html)$/i, Z = /([A-Z])/g, z = ["val", "css", "html", "text", "data", "width", "height", "offset"], q = A.createElement("table"), H = A.createElement("tr"), I = { tr: A.createElement("tbody"), tbody: q, thead: q, tfoot: q, td: H, th: H, "*": A.createElement("div") }, V = /complete|loaded|interactive/, _ = /^[\w-]*$/, B = {}, U = B.toString, X = {}, J = A.createElement("div"), W = { tabindex: "tabIndex", readonly: "readOnly", for: "htmlFor", class: "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, Y = Array.isArray || function (t) { return t instanceof Array }; return X.matches = function (t, e) { if (!e || !t || 1 !== t.nodeType) return !1; var n = t.matches || t.webkitMatchesSelector || t.mozMatchesSelector || t.oMatchesSelector || t.matchesSelector; if (n) return n.call(t, e); var r, i = t.parentNode, o = !i; return o && (i = J).appendChild(t), r = ~X.qsa(i, e).indexOf(t), o && J.removeChild(t), r }, w = function (t) { return t.replace(/-+(.)?/g, function (t, e) { return e ? e.toUpperCase() : "" }) }, S = function (t) { return O.call(t, function (e, n) { return t.indexOf(e) == n }) }, X.fragment = function (t, e, n) { var r, i, o; return k.test(t) && (r = j(A.createElement(RegExp.$1))), r || (t.replace && (t = t.replace(M, "<$1>$2>")), e === b && (e = F.test(t) && RegExp.$1), e in I || (e = "*"), (o = I[e]).innerHTML = "" + t, r = j.each(P.call(o.childNodes), function () { o.removeChild(this) })), a(n) && (i = j(r), j.each(n, function (t, e) { z.indexOf(t) > -1 ? i[t](e) : i.attr(t, e) })), r }, X.Z = function (t, e) { return new p(t, e) }, X.isZ = function (t) { return t instanceof X.Z }, X.init = function (t, e) { var r; if (!t) return X.Z(); if ("string" == typeof t) if ("<" == (t = t.trim())[0] && F.test(t)) r = X.fragment(t, RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } else { if (n(t)) return j(A).ready(t); if (X.isZ(t)) return t; if (Y(t)) r = function (t) { return O.call(t, function (t) { return null != t }) }(t); else if (o(t)) r = [t], t = null; else if (F.test(t)) r = X.fragment(t.trim(), RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } } return X.Z(r, t) }, (j = function (t, e) { return X.init(t, e) }).extend = function (t) { var e, n = P.call(arguments, 1); return "boolean" == typeof t && (e = t, t = n.shift()), n.forEach(function (n) { d(t, n, e) }), t }, X.qsa = function (t, e) { var n, r = "#" == e[0], i = !r && "." == e[0], o = r || i ? e.slice(1) : e, a = _.test(o); return t.getElementById && a && r ? (n = t.getElementById(o)) ? [n] : [] : 1 !== t.nodeType && 9 !== t.nodeType && 11 !== t.nodeType ? [] : P.call(a && !r && t.getElementsByClassName ? i ? t.getElementsByClassName(o) : t.getElementsByTagName(e) : t.querySelectorAll(e)) }, j.contains = A.documentElement.contains ? function (t, e) { return t !== e && t.contains(e) } : function (t, e) { for (; e && (e = e.parentNode);)if (e === t) return !0; return !1 }, j.type = e, j.isFunction = n, j.isWindow = r, j.isArray = Y, j.isPlainObject = a, j.isEmptyObject = function (t) { var e; for (e in t) return !1; return !0 }, j.isNumeric = function (t) { var e = Number(t), n = typeof t; return null != t && "boolean" != n && ("string" != n || t.length) && !isNaN(e) && isFinite(e) || !1 }, j.inArray = function (t, e, n) { return C.indexOf.call(e, t, n) }, j.camelCase = w, j.trim = function (t) { return null == t ? "" : String.prototype.trim.call(t) }, j.uuid = 0, j.support = {}, j.expr = {}, j.noop = function () { }, j.map = function (t, e) { var n, r, i, o = []; if (s(t)) for (r = 0; r < t.length; r++)null != (n = e(t[r], r)) && o.push(n); else for (i in t) null != (n = e(t[i], i)) && o.push(n); return u(o) }, j.each = function (t, e) { var n, r; if (s(t)) { for (n = 0; n < t.length; n++)if (!1 === e.call(t[n], n, t[n])) return t } else for (r in t) if (!1 === e.call(t[r], r, t[r])) return t; return t }, j.grep = function (t, e) { return O.call(t, e) }, t.JSON && (j.parseJSON = JSON.parse), j.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (t, e) { B["[object " + e + "]"] = e.toLowerCase() }), j.fn = { constructor: X.Z, length: 0, forEach: C.forEach, reduce: C.reduce, push: C.push, sort: C.sort, splice: C.splice, indexOf: C.indexOf, concat: function () { var t, e, n = []; for (t = 0; t < arguments.length; t++)e = arguments[t], n[t] = X.isZ(e) ? e.toArray() : e; return N.apply(X.isZ(this) ? this.toArray() : this, n) }, map: function (t) { return j(j.map(this, function (e, n) { return t.call(e, n, e) })) }, slice: function () { return j(P.apply(this, arguments)) }, ready: function (t) { return V.test(A.readyState) && A.body ? t(j) : A.addEventListener("DOMContentLoaded", function () { t(j) }, !1), this }, get: function (t) { return t === b ? P.call(this) : this[t >= 0 ? t : t + this.length] }, toArray: function () { return this.get() }, size: function () { return this.length }, remove: function () { return this.each(function () { null != this.parentNode && this.parentNode.removeChild(this) }) }, each: function (t) { return C.every.call(this, function (e, n) { return !1 !== t.call(e, n, e) }), this }, filter: function (t) { return n(t) ? this.not(this.not(t)) : j(O.call(this, function (e) { return X.matches(e, t) })) }, add: function (t, e) { return j(S(this.concat(j(t, e)))) }, is: function (t) { return this.length > 0 && X.matches(this[0], t) }, not: function (t) { var e = []; if (n(t) && t.call !== b) this.each(function (n) { t.call(this, n) || e.push(this) }); else { var r = "string" == typeof t ? this.filter(t) : s(t) && n(t.item) ? P.call(t) : j(t); this.forEach(function (t) { r.indexOf(t) < 0 && e.push(t) }) } return j(e) }, has: function (t) { return this.filter(function () { return o(t) ? j.contains(this, t) : j(this).find(t).size() }) }, eq: function (t) { return -1 === t ? this.slice(t) : this.slice(t, +t + 1) }, first: function () { var t = this[0]; return t && !o(t) ? t : j(t) }, last: function () { var t = this[this.length - 1]; return t && !o(t) ? t : j(t) }, find: function (t) { var e = this; return t ? "object" == typeof t ? j(t).filter(function () { var t = this; return C.some.call(e, function (e) { return j.contains(e, t) }) }) : 1 == this.length ? j(X.qsa(this[0], t)) : this.map(function () { return X.qsa(this, t) }) : j() }, closest: function (t, e) { var n = [], r = "object" == typeof t && j(t); return this.each(function (o, a) { for (; a && !(r ? r.indexOf(a) >= 0 : X.matches(a, t));)a = a !== e && !i(a) && a.parentNode; a && n.indexOf(a) < 0 && n.push(a) }), j(n) }, parents: function (t) { for (var e = [], n = this; n.length > 0;)n = j.map(n, function (t) { return (t = t.parentNode) && !i(t) && e.indexOf(t) < 0 ? (e.push(t), t) : void 0 }); return m(e, t) }, parent: function (t) { return m(S(this.pluck("parentNode")), t) }, children: function (t) { return m(this.map(function () { return h(this) }), t) }, contents: function () { return this.map(function () { return this.contentDocument || P.call(this.childNodes) }) }, siblings: function (t) { return m(this.map(function (t, e) { return O.call(h(e.parentNode), function (t) { return t !== e }) }), t) }, empty: function () { return this.each(function () { this.innerHTML = "" }) }, pluck: function (t) { return j.map(this, function (e) { return e[t] }) }, show: function () { return this.each(function () { var t, e, n; "none" == this.style.display && (this.style.display = ""), "none" == getComputedStyle(this, "").getPropertyValue("display") && (this.style.display = (t = this.nodeName, D[t] || (e = A.createElement(t), A.body.appendChild(e), n = getComputedStyle(e, "").getPropertyValue("display"), e.parentNode.removeChild(e), "none" == n && (n = "block"), D[t] = n), D[t])) }) }, replaceWith: function (t) { return this.before(t).remove() }, wrap: function (t) { var e = n(t); if (this[0] && !e) var r = j(t).get(0), i = r.parentNode || this.length > 1; return this.each(function (n) { j(this).wrapAll(e ? t.call(this, n) : i ? r.cloneNode(!0) : r) }) }, wrapAll: function (t) { if (this[0]) { j(this[0]).before(t = j(t)); for (var e; (e = t.children()).length;)t = e.first(); j(t).append(this) } return this }, wrapInner: function (t) { var e = n(t); return this.each(function (n) { var r = j(this), i = r.contents(), o = e ? t.call(this, n) : t; i.length ? i.wrapAll(o) : r.append(o) }) }, unwrap: function () { return this.parent().each(function () { j(this).replaceWith(j(this).children()) }), this }, clone: function () { return this.map(function () { return this.cloneNode(!0) }) }, hide: function () { return this.css("display", "none") }, toggle: function (t) { return this.each(function () { var e = j(this); (t === b ? "none" == e.css("display") : t) ? e.show() : e.hide() }) }, prev: function (t) { return j(this.pluck("previousElementSibling")).filter(t || "*") }, next: function (t) { return j(this.pluck("nextElementSibling")).filter(t || "*") }, html: function (t) { return 0 in arguments ? this.each(function (e) { var n = this.innerHTML; j(this).empty().append(v(this, t, e, n)) }) : 0 in this ? this[0].innerHTML : null }, text: function (t) { return 0 in arguments ? this.each(function (e) { var n = v(this, t, e, this.textContent); this.textContent = null == n ? "" : "" + n }) : 0 in this ? this.pluck("textContent").join("") : null }, attr: function (t, e) { var n; return "string" != typeof t || 1 in arguments ? this.each(function (n) { if (1 === this.nodeType) if (o(t)) for (E in t) g(this, E, t[E]); else g(this, t, v(this, e, n, this.getAttribute(t))) }) : 0 in this && 1 == this[0].nodeType && null != (n = this[0].getAttribute(t)) ? n : b }, removeAttr: function (t) { return this.each(function () { 1 === this.nodeType && t.split(" ").forEach(function (t) { g(this, t) }, this) }) }, prop: function (t, e) { return t = W[t] || t, 1 in arguments ? this.each(function (n) { this[t] = v(this, e, n, this[t]) }) : this[0] && this[0][t] }, removeProp: function (t) { return t = W[t] || t, this.each(function () { delete this[t] }) }, data: function (t, e) { var n = "data-" + t.replace(Z, "-$1").toLowerCase(), r = 1 in arguments ? this.attr(n, e) : this.attr(n); return null !== r ? x(r) : b }, val: function (t) { return 0 in arguments ? (null == t && (t = ""), this.each(function (e) { this.value = v(this, t, e, this.value) })) : this[0] && (this[0].multiple ? j(this[0]).find("option").filter(function () { return this.selected }).pluck("value") : this[0].value) }, offset: function (e) { if (e) return this.each(function (t) { var n = j(this), r = v(this, e, t, n.offset()), i = n.offsetParent().offset(), o = { top: r.top - i.top, left: r.left - i.left }; "static" == n.css("position") && (o.position = "relative"), n.css(o) }); if (!this.length) return null; if (A.documentElement !== this[0] && !j.contains(A.documentElement, this[0])) return { top: 0, left: 0 }; var n = this[0].getBoundingClientRect(); return { left: n.left + t.pageXOffset, top: n.top + t.pageYOffset, width: Math.round(n.width), height: Math.round(n.height) } }, css: function (t, n) { if (arguments.length < 2) { var r = this[0]; if ("string" == typeof t) { if (!r) return; return r.style[w(t)] || getComputedStyle(r, "").getPropertyValue(t) } if (Y(t)) { if (!r) return; var i = {}, o = getComputedStyle(r, ""); return j.each(t, function (t, e) { i[e] = r.style[w(e)] || o.getPropertyValue(e) }), i } } var a = ""; if ("string" == e(t)) n || 0 === n ? a = c(t) + ":" + f(t, n) : this.each(function () { this.style.removeProperty(c(t)) }); else for (E in t) t[E] || 0 === t[E] ? a += c(E) + ":" + f(E, t[E]) + ";" : this.each(function () { this.style.removeProperty(c(E)) }); return this.each(function () { this.style.cssText += ";" + a }) }, index: function (t) { return t ? this.indexOf(j(t)[0]) : this.parent().children().indexOf(this[0]) }, hasClass: function (t) { return !!t && C.some.call(this, function (t) { return this.test(y(t)) }, l(t)) }, addClass: function (t) { return t ? this.each(function (e) { if ("className" in this) { T = []; var n = y(this); v(this, t, e, n).split(/\s+/g).forEach(function (t) { j(this).hasClass(t) || T.push(t) }, this), T.length && y(this, n + (n ? " " : "") + T.join(" ")) } }) : this }, removeClass: function (t) { return this.each(function (e) { if ("className" in this) { if (t === b) return y(this, ""); T = y(this), v(this, t, e, T).split(/\s+/g).forEach(function (t) { T = T.replace(l(t), " ") }), y(this, T.trim()) } }) }, toggleClass: function (t, e) { return t ? this.each(function (n) { var r = j(this); v(this, t, n, y(this)).split(/\s+/g).forEach(function (t) { (e === b ? !r.hasClass(t) : e) ? r.addClass(t) : r.removeClass(t) }) }) : this }, scrollTop: function (t) { if (this.length) { var e = "scrollTop" in this[0]; return t === b ? e ? this[0].scrollTop : this[0].pageYOffset : this.each(e ? function () { this.scrollTop = t } : function () { this.scrollTo(this.scrollX, t) }) } }, scrollLeft: function (t) { if (this.length) { var e = "scrollLeft" in this[0]; return t === b ? e ? this[0].scrollLeft : this[0].pageXOffset : this.each(e ? function () { this.scrollLeft = t } : function () { this.scrollTo(t, this.scrollY) }) } }, position: function () { if (this.length) { var t = this[0], e = this.offsetParent(), n = this.offset(), r = R.test(e[0].nodeName) ? { top: 0, left: 0 } : e.offset(); return n.top -= parseFloat(j(t).css("margin-top")) || 0, n.left -= parseFloat(j(t).css("margin-left")) || 0, r.top += parseFloat(j(e[0]).css("border-top-width")) || 0, r.left += parseFloat(j(e[0]).css("border-left-width")) || 0, { top: n.top - r.top, left: n.left - r.left } } }, offsetParent: function () { return this.map(function () { for (var t = this.offsetParent || A.body; t && !R.test(t.nodeName) && "static" == j(t).css("position");)t = t.offsetParent; return t }) } }, j.fn.detach = j.fn.remove, ["width", "height"].forEach(function (t) { var e = t.replace(/./, function (t) { return t[0].toUpperCase() }); j.fn[t] = function (n) { var o, a = this[0]; return n === b ? r(a) ? a["inner" + e] : i(a) ? a.documentElement["scroll" + e] : (o = this.offset()) && o[t] : this.each(function (e) { (a = j(this)).css(t, v(this, n, e, a[t]())) }) } }), ["after", "prepend", "before", "append"].forEach(function (n, r) { var i = r % 2; j.fn[n] = function () { var n, o, a = j.map(arguments, function (t) { var r = []; return "array" == (n = e(t)) ? (t.forEach(function (t) { return t.nodeType !== b ? r.push(t) : j.zepto.isZ(t) ? r = r.concat(t.get()) : void (r = r.concat(X.fragment(t))) }), r) : "object" == n || null == t ? t : X.fragment(t) }), s = this.length > 1; return a.length < 1 ? this : this.each(function (e, n) { o = i ? n : n.parentNode, n = 0 == r ? n.nextSibling : 1 == r ? n.firstChild : 2 == r ? n : null; var u = j.contains(A.documentElement, o); a.forEach(function (e) { if (s) e = e.cloneNode(!0); else if (!o) return j(e).remove(); o.insertBefore(e, n), u && function t(e, n) { n(e); for (var r = 0, i = e.childNodes.length; i > r; r++)t(e.childNodes[r], n) }(e, function (e) { if (!(null == e.nodeName || "SCRIPT" !== e.nodeName.toUpperCase() || e.type && "text/javascript" !== e.type || e.src)) { var n = e.ownerDocument ? e.ownerDocument.defaultView : t; n.eval.call(n, e.innerHTML) } }) }) }) }, j.fn[i ? n + "To" : "insert" + (r ? "Before" : "After")] = function (t) { return j(t)[n](this), this } }), X.Z.prototype = p.prototype = j.fn, X.uniq = S, X.deserializeValue = x, j.zepto = X, j }(); return t.Zepto = e, void 0 === t.$ && (t.$ = e), function (e) { function n(t) { return t._zid || (t._zid = h++) } function r(t, e, r, o) { if ((e = i(e)).ns) var a = function (t) { return new RegExp("(?:^| )" + t.replace(" ", " .* ?") + "(?: |$)") }(e.ns); return (v[n(t)] || []).filter(function (t) { return t && (!e.e || t.e == e.e) && (!e.ns || a.test(t.ns)) && (!r || n(t.fn) === n(r)) && (!o || t.sel == o) }) } function i(t) { var e = ("" + t).split("."); return { e: e[0], ns: e.slice(1).sort().join(" ") } } function o(t, e) { return t.del && !y && t.e in x || !!e } function a(t) { return b[t] || y && x[t] || t } function s(t, r, s, u, l, h, p) { var d = n(t), m = v[d] || (v[d] = []); r.split(/\s/).forEach(function (n) { if ("ready" == n) return e(document).ready(s); var r = i(n); r.fn = s, r.sel = l, r.e in b && (s = function (t) { var n = t.relatedTarget; return !n || n !== this && !e.contains(this, n) ? r.fn.apply(this, arguments) : void 0 }), r.del = h; var d = h || s; r.proxy = function (e) { if (!(e = c(e)).isImmediatePropagationStopped()) { e.data = u; var n = d.apply(t, e._args == f ? [e] : [e].concat(e._args)); return !1 === n && (e.preventDefault(), e.stopPropagation()), n } }, r.i = m.length, m.push(r), "addEventListener" in t && t.addEventListener(a(r.e), r.proxy, o(r, p)) }) } function u(t, e, i, s, u) { var c = n(t); (e || "").split(/\s/).forEach(function (e) { r(t, e, i, s).forEach(function (e) { delete v[c][e.i], "removeEventListener" in t && t.removeEventListener(a(e.e), e.proxy, o(e, u)) }) }) } function c(t, n) { return (n || !t.isDefaultPrevented) && (n || (n = t), e.each(w, function (e, r) { var i = n[e]; t[e] = function () { return this[r] = E, i && i.apply(n, arguments) }, t[r] = j }), t.timeStamp || (t.timeStamp = Date.now()), (n.defaultPrevented !== f ? n.defaultPrevented : "returnValue" in n ? !1 === n.returnValue : n.getPreventDefault && n.getPreventDefault()) && (t.isDefaultPrevented = E)), t } function l(t) { var e, n = { originalEvent: t }; for (e in t) T.test(e) || t[e] === f || (n[e] = t[e]); return c(n, t) } var f, h = 1, p = Array.prototype.slice, d = e.isFunction, m = function (t) { return "string" == typeof t }, v = {}, g = {}, y = "onfocusin" in t, x = { focus: "focusin", blur: "focusout" }, b = { mouseenter: "mouseover", mouseleave: "mouseout" }; g.click = g.mousedown = g.mouseup = g.mousemove = "MouseEvents", e.event = { add: s, remove: u }, e.proxy = function (t, r) { var i = 2 in arguments && p.call(arguments, 2); if (d(t)) { var o = function () { return t.apply(r, i ? i.concat(p.call(arguments)) : arguments) }; return o._zid = n(t), o } if (m(r)) return i ? (i.unshift(t[r], t), e.proxy.apply(null, i)) : e.proxy(t[r], t); throw new TypeError("expected function") }, e.fn.bind = function (t, e, n) { return this.on(t, e, n) }, e.fn.unbind = function (t, e) { return this.off(t, e) }, e.fn.one = function (t, e, n, r) { return this.on(t, e, n, r, 1) }; var E = function () { return !0 }, j = function () { return !1 }, T = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/, w = { preventDefault: "isDefaultPrevented", stopImmediatePropagation: "isImmediatePropagationStopped", stopPropagation: "isPropagationStopped" }; e.fn.delegate = function (t, e, n) { return this.on(e, t, n) }, e.fn.undelegate = function (t, e, n) { return this.off(e, t, n) }, e.fn.live = function (t, n) { return e(document.body).delegate(this.selector, t, n), this }, e.fn.die = function (t, n) { return e(document.body).undelegate(this.selector, t, n), this }, e.fn.on = function (t, n, r, i, o) { var a, c, h = this; return t && !m(t) ? (e.each(t, function (t, e) { h.on(t, n, r, e, o) }), h) : (m(n) || d(i) || !1 === i || (i = r, r = n, n = f), (i === f || !1 === r) && (i = r, r = f), !1 === i && (i = j), h.each(function (f, h) { o && (a = function (t) { return u(h, t.type, i), i.apply(this, arguments) }), n && (c = function (t) { var r, o = e(t.target).closest(n, h).get(0); return o && o !== h ? (r = e.extend(l(t), { currentTarget: o, liveFired: h }), (a || i).apply(o, [r].concat(p.call(arguments, 1)))) : void 0 }), s(h, t, i, r, n, c || a) })) }, e.fn.off = function (t, n, r) { var i = this; return t && !m(t) ? (e.each(t, function (t, e) { i.off(t, n, e) }), i) : (m(n) || d(r) || !1 === r || (r = n, n = f), !1 === r && (r = j), i.each(function () { u(this, t, r, n) })) }, e.fn.trigger = function (t, n) { return (t = m(t) || e.isPlainObject(t) ? e.Event(t) : c(t))._args = n, this.each(function () { t.type in x && "function" == typeof this[t.type] ? this[t.type]() : "dispatchEvent" in this ? this.dispatchEvent(t) : e(this).triggerHandler(t, n) }) }, e.fn.triggerHandler = function (t, n) { var i, o; return this.each(function (a, s) { (i = l(m(t) ? e.Event(t) : t))._args = n, i.target = s, e.each(r(s, t.type || t), function (t, e) { return o = e.proxy(i), !i.isImmediatePropagationStopped() && void 0 }) }), o }, "focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function (t) { e.fn[t] = function (e) { return 0 in arguments ? this.bind(t, e) : this.trigger(t) } }), e.Event = function (t, e) { m(t) || (t = (e = t).type); var n = document.createEvent(g[t] || "Events"), r = !0; if (e) for (var i in e) "bubbles" == i ? r = !!e[i] : n[i] = e[i]; return n.initEvent(t, r, !0), c(n) } }(e), function (e) { function n(t, n, r) { var i = e.Event(n); return e(t).trigger(i, r), !i.isDefaultPrevented() } function r(t, e, r, i) { return t.global ? n(e || g, r, i) : void 0 } function i(t) { t.global && 0 == e.active++ && r(t, null, "ajaxStart") } function o(t) { t.global && !--e.active && r(t, null, "ajaxStop") } function a(t, e) { var n = e.context; return !1 !== e.beforeSend.call(n, t, e) && !1 !== r(e, n, "ajaxBeforeSend", [t, e]) && void r(e, n, "ajaxSend", [t, e]) } function s(t, e, n, i) { var o = n.context, a = "success"; n.success.call(o, t, a, e), i && i.resolveWith(o, [t, a, e]), r(n, o, "ajaxSuccess", [e, n, t]), c(a, e, n) } function u(t, e, n, i, o) { var a = i.context; i.error.call(a, n, e, t), o && o.rejectWith(a, [n, e, t]), r(i, a, "ajaxError", [n, i, t || e]), c(e, n, i) } function c(t, e, n) { var i = n.context; n.complete.call(i, e, t), r(n, i, "ajaxComplete", [e, n]), o(n) } function l() { } function f(t) { return t && (t = t.split(";", 2)[0]), t && (t == j ? "html" : t == E ? "json" : x.test(t) ? "script" : b.test(t) && "xml") || "text" } function h(t, e) { return "" == e ? t : (t + "&" + e).replace(/[&?]{1,2}/, "?") } function p(t, n, r, i) { return e.isFunction(n) && (i = r, r = n, n = void 0), e.isFunction(r) || (i = r, r = void 0), { url: t, data: n, success: r, dataType: i } } var d, m, v = +new Date, g = t.document, y = /
版本更新日期:2021年06月04日
版本生效日期:2021年06月04日
《有車以后隱私政策》
有車以后應用是由廣州市有車以后信息科技有限公司(注冊地址:廣州市海珠區新港西路135號中大科技園B座1403-1404,以下稱“我們”或“公司”)作為運營主體為您提供的一款汽車資訊和交易服務產品。我們非常重視用戶的隱私和個人信息保護,并會盡全力保護您的個人信息和數據。我們承諾依照《中華人民共和國網絡安全法》等法律規定,并參考《信息安全技術個人信息安全規范》(GB/T 35273-2020),以及其他相關法律法規保護用戶的隱私。
我們通過本《隱私政策》向您說明我們如何收集、使用、存儲、分享、轉讓及保護個人信息,以及我們為您提供的訪問、更新、刪除和保護這些信息的方式。其中,有關您個人信息權益的條款等重要內容我們已用加粗或下劃線形式提示,請特別關注。
請您仔細閱讀本《隱私政策》并確定了解我們對您個人信息的處理規則,如您不同意協議中的任何條款或約定,我們將無法為您提供完整的產品以及服務,并且您有權選擇立即停止使用相關服務。
本政策將幫助您了解以下內容:
- 適用范圍
- 我們如何收集和使用您的個人信息
- 我們如何使用 Cookie 和同類技術
- 我們如何使用SDK技術
- 我們如何存儲個人信息
- 我們如何委托處理、分享、轉讓、公開披露您的個人信息
- 我們如何保護您的個人信息
- 您如何管理個人信息
- 未成年人信息的保護
- 《隱私政策》的修訂、通知和查看
- 聯系我們
- 附錄
一、適用范圍
本《隱私政策》適用于由我們運營主體提供的所有產品及相關服務,包括但不限于App應用程序、官網、M站、小程序。除本《隱私政策》另有規定外,本《隱私政策》所用詞語與《有車以后用戶協議》所定義的詞語具有相同的涵義。
本《隱私政策》不適用于:
1)第三方產品或服務,包括在我們應用內為您展示的產品或網站和廣告或服務鏈接跳轉到的其他產品或網站;
2)為我們的產品或服務進行廣告宣傳的其他第三方。
您使用這些第三方服務(包括您向這些第三方提供的任何個人信息),將受這些第三方的服務條款及隱私政策約束(而非本《隱私政策》),請您仔細閱讀第三方的條款并妥善保護自己的個人信息,僅在必要的情況下向第三方提供。
請您了解,本《隱私政策》中所述的產品及相關服務會根據您所使用的設備型號、系統版本、軟件應用程序版本、移動客戶端等因素而有所不同。最終的產品和相關服務以您所使用的產品及相關服務為準。
二、我們如何收集和使用您的個人信息
1. 我們主動收集與使用的個人信息
我們會按照如下方式收集、保存和使用您在使用我們服務時主動提供的,以及通過自動化手段收集您在使用功能或接受服務過程中產生的信息,用以實現我們的一些基礎功能或服務。如果您不提供相關信息,您將無法享受我們提供的完整功能和相關服務。請注意:如果您提供的信息中包括非您本人的個人信息,請確保您已取得相關主體的同意。
1.1 注冊、登錄與認證服務
您注冊的賬號可以登錄或使用有車以后運營主體關聯的產品及相關服務,包括:有車以后App、車小蜂App、有車以后+小程序,并獲得相關服務或使用相關功能。
如果您不提供下述所列舉的信息,則無法完成賬號登錄或認證,但這不會影響您使用我們提供的內容瀏覽、選車看車等服務。
1)注冊并登錄有車以后賬號
當您注冊我們的應用時,您可以通過手機號碼創建賬號,我們將通過發送短信驗證碼來驗證您的身份是否有效,并且您可以完善相關的網絡身份識別信息(如頭像、昵稱或名稱、性別、個人簡介)。當您成為我們的注冊用戶,并準備登錄時,您同樣需要提供您注冊時的手機號碼和相應的驗證碼。收集這些信息是為了幫助你完成注冊和登錄功能,在您之后的使用過程中,我們的客服人員會根據需要,使用該手機號碼與您聯系,以響應您的反饋需求。
2)第三方賬號登錄
您也可通過第三方賬號注冊并登錄應用服務,此時代表您將授權我們獲取您在第三方平臺注冊的公開信息(頭像、昵稱、地區、性別以及您授權的其他信息),并在您同意本《隱私政策》后將您的賬號與第三方賬號綁定,以便通過第三方賬號直接登錄并使用我們的產品和服務。
您也可以進入“設置-賬號管理”您的賬號與第三方賬號的綁定。如果您對此有疑問,請及時通過「聯系我們」方式聯系我們。
3)一鍵登錄(僅APP適用)
當您選擇適用「一鍵登錄」方式注冊并登錄我們的應用時,我們會通過從移動運營商(中國聯通、中國移動、中國電信)處獲取您的手機號碼及該號碼所屬的運營商信息。請在操作前根據提示查看運營商的服務條款,如您不使用「一鍵登錄」功能,您可以通過其他方式進行注冊和登錄。
4)認證服務
在您使用需要身份認證的功能和相關服務時,根據相關法律法規,您需要提供您的真實身份信息(真實姓名、身份證號碼以及進行實名認證所需要的其他信息)以便完成實名驗證。這些信息屬于個人敏感信息,您務必清晰理解,如果拒絕提供,您將無法獲得相關服務,但不影響其他功能與服務的正常使用。
1.2 車主認證服務
當您使用車主認證功能時,您需要向我們提供您的行駛證、駕駛證照片,以便我們認證您的車主身份。請您注意:證件信息屬于個人敏感信息,我們收集信息僅用于驗證身份真實性以便提供更多車主服務,您在提供前需要清晰理解。如果您不提供,將導致我們無法認證您的車主身份,但不影響其他功能與服務的正常使用。
1.3 資訊瀏覽、個性化推薦服務(汽車資訊、社區內容、車輛經銷商展示)
1)為了讓您快速地找到您所感興趣的汽車資訊、社區內容或其他服務,我們會收集如下必要的日志信息
- 您的設備或軟件信息,包括:設備信息(移動設備所用的版本、硬件型號、設備品牌、設備型號、屏幕分辨率)、設備唯一識別碼(如IMEI/MEID/android ID/IDFA/OPENUDID/IDFV/出廠序列號,獲取IMEI時部分手機會提示申請讀取通話狀態權限)、SIM卡IMSI信息、操作系統版本號、網絡運營商信息、網絡IP信息;
- 您操作、使用的行為日志:點擊、關注、收藏、搜索詞、瀏覽、分享;
- 您主動提供的信息:反饋、發布、點贊、評論;
- 地理位置信息:GPS位置信息;
2)地理位置是敏感個人信息,如果您拒絕授權提供,我們將不會根據地理位置信息向您推薦或展示內容和服務,但這并不影響其他功能的正常使用;您可以在手機“設置-應用權限”(具體參考您的設備指引)管理界面關閉定位權限,以拒絕我們獲取您的地理位置信息;
3)我們會基于IP地址對應的城市位置信息向您展示您所在地區的相關信息或提供相應的服務;
4)我們收集、使用上述信息進行了去標識化處理,數據分析僅對應特定的、無法直接關聯您身份的編碼,不會與您的真實身份相關聯;
1.4 信息發布服務
您發布帖子、口碑、評論、評價、提問或回答時,我們將收集您發布的信息,并展示您的昵稱、頭像、發布內容、發布時間等信息。
1)當您選擇圖片、音視頻上傳時,我們會請求您授權相機、相冊(存儲)、照片、麥克風權限。如果您拒絕授權提供,將無法使用此功能,但不影響您使用其他功能;
2)當您選擇顯示位置時,我們會請求您授權地理位置信息權限,并收集與之相關的位置信息。如果您拒絕授權提供,將無法使用此功能,但不影響您使用其他功能;
3)請您知悉并理解:您發布的任何內容都將在我們應用中公開展示,如果包含您或他人的個人信息,會對您或他人產生一定風險,建議您謹慎提交,并且確保其中的他人的個人信息已經獲得其主體本人的授權同意。
1.5 互動交流功能和服務
1)您主動關注您感興趣的賬號、話題并與之進行互動時,包括:瀏覽、評論、收藏、點贊或分享時,我們會收集您關注的賬號,并在之后向您展示該關注賬號的已發布內容;
2)您知悉并同意,在我們的互動功能運營過程中,會通過應用內通知或您的手機號碼通過短信、電話等方式,為您提供您感興趣的內容或服務。您可以在APP中通過“設置-新消息通知”關閉相應的功能,或通過「聯系我們」提供的方式與我們聯系處理。
3)如果您不希望提供上述信息,您可以拒絕使用關注、互動功能,但不影響您使用其他功能和服務。
1.6 搜索(車型、資訊、經銷商優惠)
您使用搜索時,我們會收集您的設備IP信息、搜索關鍵字、日志信息。為了提供高效的搜索服務,上述部分信息會暫時存儲在您的本地存儲設備中,并可向您展示搜索結果內容、搜索歷史記錄。
您可以選擇刪除本地記錄的搜索關鍵字歷史記錄。如果您不提供上述信息,將無法使用搜索服務,但不影響您使用其他功能和服務。
1.7 在線咨詢底價、下訂服務
當您希望獲得我們提供的經銷商/廠商/集團及相關金融服務方提供的促銷價格、團購優惠、金融優惠等購車權益活動時,請詳細閱讀頁面中的“咨詢服務條款”,我們會按如下方式收集您的必要信息。
1)免費咨詢
當您訪問車型優惠信息并使用咨詢服務時,您需要提供您的姓名、手機號碼、購車地區信息,以便我們將您的咨詢請求發送給您選擇的經銷商或者運營客服。如您不提供前述信息,則無法使用咨詢服務,但不影響您使用其他功能和服務。
2)下訂服務
當您訪問車型優惠信息并使用下訂服務時,您需要提供您的購車車型信息、姓名、手機號碼、購車地區信息,同時訂單中會記錄您預訂的購車優惠全系你信息、訂單號、創建時間、訂單金額信息,以便我們幫助您鎖定購車優惠權益,查詢和管理訂單信息以及提供售前和售后客服服務。
3)支付服務
當您參與購車權益預訂活動時,你需要支付一定金額的意向金/訂金用于鎖定優惠權益,在您提交訂單后,您需要授權我們合作的第三方支付機構(微信支付或銀聯)所提供的支付服務。
我們需要將您的訂單交易金額和相關必要信息與這些支付機構共享,已實現其確認您的支付指令并完成支付。為方便我們及時獲悉并確認您的支付進度及狀態、為您提供售后和爭議解決服務,您需要授權并同意我們可從您選擇的支付金融機構處收集與支付進度相關的信息。
1.8 車品商城(養車)、虛擬幣兌換、特權和福利相關服務
1)商城
您可通過商城兌換、購買實物或虛擬物品,您在使用購買服務時需要提供您的收貨人姓名,聯系電話以及收貨地址信息,以便接受我們及我們的合作商提供的服務。
2)有車黑金卡特權
您可以開通、使用有車黑金卡的相關特權,您在開通、使用的過程中需要提供您的收貨人姓名,聯系電話以及收貨地址信息。
3)支付服務
當您購買商品、開通特權時,你需要支付一定金額的用于完成訂單,在您提交訂單后,您需要授權我們合作的第三方支付機構(微信支付或銀聯)所提供的支付服務。
我們需要將您的訂單交易金額和相關必要信息與這些支付機構共享,已實現其確認您的支付指令并完成支付。為方便我們及時獲悉并確認您的支付進度及狀態、為您提供售后和爭議解決服務,您需要授權并同意我們可從您選擇的支付金融機構處收集與支付進度相關的信息。
1.9 開展營銷活動
當您選擇參加我們舉辦的有關營銷活動時,根據活動需要,您需要提供姓名、聯系方式、聯系地址、身份證號等信息,這些信息包含個人敏感信息,并有可能需要支付活動要求的費用。這是您參加活動所必要的條件,您有權拒絕提供信息或支付費用。如果您拒絕提供活動所需信息或拒絕支付活動所需費用,我們無法將您列入相關的活動參與名單,但不會影響您使用其他功能和服務。
1.10 客服與售后功能
1)當您與我們聯系或提出咨詢、投訴、爭議糾紛處理等申請時,為保障您的賬戶與系統安全,我們需要您提供必要的個人信息以核驗您的身份,為您提供相關服務。
2)為便于與您聯系、盡快幫助您解決問題或記錄相關問題的處理方案及結果,我們會根據必要性保存您與我們的通信/通話記錄及相關內容(包括不限于賬號信息、訂單信息、聯系方式以及提供的其他信息)
1.11 保障產品、服務及用戶使用安全
我們致力于提供可靠、安全、可信的產品與使用環境,為幫助更好地了解我們服務的運行環境和情況,以確保產品服務運行的安全,我們會收集如下必要信息
1)為保障軟件的安全運行,我們會收集:
- 您的設備或軟件信息,包括:設備品牌、設備型號、屏幕分辨率、操作系統版本號、設備唯一識別碼(如IMEI/MEID/android ID/IDFA/OPENUDID/IDFV/出廠序列號,獲取IMEI部分手機會提示申請讀取通話狀態權限)、SIM卡IMSI信息;
- 您的網絡信息,包括:網絡設備Mac地址、IP地址、網絡運營商、網絡接入方式、基站、WLAN接入點、網絡狀態、網絡質量數據;
2)為預防惡意程序以及提升應用運行體驗,我們會收集應用日志:應用運行日志、崩潰日志、性能數據、渠道來源、總體安裝應用情況;
3)為更準確地預防釣魚網站欺詐和保護賬號安全,我們會使用您的賬號信息、瀏覽信息、訂單信息、設備信息、服務日志信息以及我們關聯公司、合作方在獲得您授權或依法可以共享的信息,來判斷您的賬號風險、檢測及防范安全事件。
4)為更好的提升您在使用我們產品服務過程中的體驗和節省網絡流量,我們會嘗試申請讀/寫存儲權限來緩存部分網絡數據,若您拒絕提供可能會影響使用體驗。
5)您提供上述信息,將在APP啟動時獲取一次,并在本次服務期間授權我們使用。您可以在手機機系統“設置-應用權限”(不同設備路徑可能不同)關閉相應權限以拒絕我們獲取信息。
1.12 其他
1)當您希望在應用內直接與相關服務商聯系時,我們會申請電話權限,申請該權限的目的僅為幫助您調起手機撥號鍵盤和顯示對方電話以實現您在App內即可進行電話撥打,請您放心,我們不會通過該權限獲取您的電話號碼、通話內容,也不會在您不知情的情況下撥打電話。您如果拒絕授權提供,將無法使用此功能,但不影響您正常使用其他功能。
2)為提升您在詢價及預約等功能時的使用體驗,我們會在您進行詢價及預約咨詢的頁面幫您預先填寫您登錄時或最近詢價留資時使用的手機號(展示時中間四位加密處理),且只有在您點擊提交按鈕之后才會根據您的授權進行共享。若您拒絕使用手機號預填充功能,也可直接在頁面主動輸入相關信息并繼續使用我們的產品/服務。
2. 我們可能從第三方獲得的您的個人信息
2.1 當您使用第三方賬號登錄時,經過您的明確同意授權,我們會收集第三方賬號的昵稱、頭像、地區、性別以及您授權的其他信息;
2.2 其他用戶使用我們的產品或服務而被我們收集的信息,如:其他用戶使用內容發布的信息中可能含有您的部分信息(包括不限于:評論、留言、發布圖文、音視頻);
2.3 您在使用由我們運營主體或關聯方所提供的其他產品或服務中填寫或發布的信息(包括不限于:賬號、評論、發布文本/音視頻內容),如:有車以后+小程序,車小蜂App;
2.4 為提供更好的服務,如您通過我們的服務向相關汽車經銷商、廠商及集團詢價,且您最終通過其購買相關車輛,您同意我們上述主體許可的前提下,依法依規獲取您的實際購買成交信息,這些信息不包含敏感信息。
3. 收集、使用個人信息目的變更的處理
請您了解,隨著我們業務的發展,可能會對當前產品的功能和服務有所調整變化。原則上,當新功能或服務與當前提供的功能或服務場景相關時,收集與使用的個人信息將與原處理目的具有直接或合理關聯。在與原處理目的無直接或合理關聯的場景下,我們收集、使用您的個人信息,會再次進行告知,并征得您的同意。
4. 依法豁免征得同意收集和使用的個人信息
請您理解,根據法律法規及相關國家標準,在以下情形中,我們收集、使用和對外提供您的個人信息無需征得您的授權同意:
1)與個人信息控制者履行法律法規規定的義務相關的;
2)與國家安全、國防安全直接相關的;
3)與公共安全、公共衛生、重大公共利益直接相關的;
4)與犯罪偵查、起訴、審判和判決執行等直接相關的,或公安、檢察院、法院、工商行政管理局等有權機關要求提供的;
5)出于維護個人信息主體或其他個人的生命、財產等重大合法權益但又很難得到本人同意的;
6)所涉及的個人信息是個人信息主體自行向社會公眾公開的;
7)從合法公開披露的信息中收集的您的個人信息的,如合法的新聞報道、政府信息公開等渠道;
8)根據個人信息主體要求簽訂和履行合同所必需的;
9)用于維護所提供的產品及相關服務的安全穩定運行所必需的,例如發現、處置產品及相關服務的故障;
10)為合法的新聞報道所必需的;
11)學術研究機構基于公共利益開展統計或學術研究所必要,且對外提供學術研究或描述的結果時,對結果中所包含的個人信息進行去標識化處理的;
12)法律法規規定的其他情形。
5. 您個人信息使用的規則
1)我們會根據本《隱私政策》的約定并為實現我們的服務與/或產品功能對所收集的個人信息進行使用。
2)在收集您的個人信息后,我們將通過技術手段對數據進行去標識化處理,去標識化處理的信息將無法識別主體。請您了解并同意,在此情況下我們有權使用已經去標識化的信息;并在不透露您個人信息的前提下,我們有權對用戶數據庫進行分析并予以商業化的利用。
3)請您注意,您在使用我們的產品或相關服務時所提供的所有個人信息,除非您刪除或通過系統設置拒絕我們收集,否則將在您使用我們的產品與/或服務期間持續授權我們使用。在您注銷賬號時,我們將停止使用并刪除您的個人信息或對您的個人信息進行匿名化處理。
4)我們會對我們的產品或相關服務使用情況進行統計,并可能會與公眾或第三方共享這些統計信息,以展示我們的產品或相關服務的整體使用趨勢。但這些統計信息不包含您的任何身份識別信息。
5)當我們展示您的個人信息時,我們會采用包括內容替換、匿名處理方式對您的信息進行脫敏,以保護您的信息安全。
6)當我們要將您的個人信息用于本《隱私政策》未載明的其它用途時,或基于特定目的收集而來的信息用于其他目的時,會通過您主動做出勾選或彈窗等形式事先征求您的同意。
三、我們如何使用 Cookie 和同類技術
Cookie和同類技術是互聯網中的通用常用技術。當您使用產品及相關服務時,我們可能會使用相關技術向您的設備發送一個或多個Cookie或匿名標識符(Cookie 通常包含標識符、站點名稱以及一些號碼和字符),以收集和存儲您訪問、使用本產品時的信息。我們使用 Cookie 和同類技術主要為了實現以下功能或服務:
1)保障產品與服務的安全、高效運轉
我們可能會設置認證與保障安全性的cookie 或匿名標識符,使我們確認您是否安全登錄服務,或者是否遇到盜用、欺詐等不法行為,這些技術還會幫助我們改進服務效率,提升登錄和響應速度。
2)幫助您獲得更輕松的訪問體驗
使用此類技術可以幫助您省去重復填寫個人信息、輸入搜索內容的步驟和流程(示例:記錄搜索、表單填寫);
我們不會將上述信息用于本隱私政策所述目的之外的任何用途。大多數瀏覽器均為用戶提供了清除瀏覽器緩存數據的功能,您可以在瀏覽器設置功能中進行相應的數據清除操作。如您進行清除,您可能無法使用依賴于Cookie的功能及服務和安全保障,如:每次訪問我們的網站或應用時需要另行設置,您之前設置記錄的相關信息也可能會被刪除,并且對您所使用服務的安全性有一定影響。
四、我們如何使用SDK技術
在為用戶提供服務時,我們將使用以下SDK技術。SDK技術由與我們合作的第三方機構提供,他們將會需要收集您的信息,我們僅能知悉其要求獲得授權的權限以及其明確向我們披露的要收集的敏感信息。SDK提供的功能所需的權限與收集的用戶信息為:
1、我們使用了“百度地圖”SDK,功能是“獲取用戶所在的位置,展示商家所在的位置”。所需的權限是“定位權限、存儲權限、讀取設備信息、讀取網絡狀態、讀取WIFI狀態、震動權限”。收集的用戶信息是“個人常用設備信息”、“個人位置信息”。其中,“個人常用設備信息”、“個人位置信息”屬于敏感信息。
2、我們使用了“個推推送”SDK,功能是“Push推送”。所需的權限是“存儲權限、讀取設備信息、讀取網絡狀態、讀取WIFI狀態”。收集的用戶信息是“個人常用設備信息”。其中,“個人常用設備信息”屬于敏感信息。
3、我們使用了“微信分享”SDK,功能是“分享”。所需的權限是“存儲權限、讀取設備信息、讀取網絡狀態、讀取WIFI狀態”。收集的用戶信息是“個人常用設備信息”。其中,“個人常用設備信息”屬于敏感信息。
4、我們使用了“微信支付”SDK,功能是“支付”。所需的權限是“存儲權限、讀取設備信息、讀取網絡狀態、讀取WIFI狀態”。收集的用戶信息是“個人常用設備信息”。其中,“個人常用設備信息”屬于敏感信息。
5、我們使用了“閃驗”SDK,功能是“三方登錄” ,用于幫助實現用戶一鍵登錄行為。所需的權限是“讀取設備信息、讀取網絡狀態、讀取WIFI狀態,改變網絡狀態”。為了實現網關取號技術,閃驗SDK需要獲取IP地址、網卡(MAC)地址、國際移動設備識別碼(IMEI)、SIM卡信息,并會收集手機機型、系統類型、系統版本、網絡環境、網關取號報錯日志等以提供統計分析服務能力,并可提供反欺詐功能。
6、我們的產品集成友盟+SDK,友盟+SDK需要收集您的設備Mac地址、唯一設備識別碼(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供統計分析服務,并通過地理位置校準報表數據準確性,提供基礎反作弊能力。友盟+SDK所需的權限是“讀取設備信息、讀取網絡狀態、讀取WIFI狀態”。請您仔細閱讀《友盟SDK隱私政策》了解。
7、我們使用了“TalkingData”SDK,功能是“數據統計和分析”。所需的權限是“讀取設備信息、讀取網絡狀態、讀取WIFI狀態、定位權限”。 收集的用戶信息是“個人常用設備信息”、“個人位置信息”。其中,“個人常用設備信息”、“個人位置信息”屬于敏感信息。如果您不愿參與【TalkingData】的大數據計算,您也可以通過http://www.talkingdata.com/optout.jsp?languagetype=zh_cn行使opt-out權利。
8、我們使用了“網易七魚”SDK,功能是“商城聯系客服”。所需的權限是“讀取網絡、讀取WIFI狀態、獲取設備信息、存儲權限、定位權限”,其中,“個人常用設備信息”、“個人位置信息”屬于敏感信息。
9、我們使用了“七牛云”SDK,功能是“短視頻播放”。所需的權限是“存儲權限、讀取設備信息、讀取網絡狀態、讀取WIFI狀態”。收集的用戶信息是“個人常用設備信息”。其中,“個人常用設備信息”屬于敏感信息。
10、我們使用了移動安全聯盟MSA提供的“廣告標識符(OAID)” SDK,需要您的網絡權限、設備信息,用于獲取Android Q設備唯一標識,用于統計更精準的廣告投放效果。
11、我們使用了騰訊“bugly”SDK,用于App出現崩潰時收集內存信息和設備信息,所需的權限是“讀取設備信息”。
五、我們如何存儲個人信息
1.信息存儲的地點
我們依照法律法規的規定,將在境內運營過程中收集和產生的您的個人信息存儲于中華人民共和國境內。目前,我們不會將上述信息傳輸至境外,如果我們向境外傳輸,我們將會遵循法律法規的規定,征求您的自主選擇同意。
2.存儲期限
我們僅在為提供產品及相關服務之目的所必需的期間內保留您的個人信息,例如,您發布的內容、評論、點贊等信息,在您未刪除、注銷賬號期間,我們會保留相關信息。超出必要期限后,我們將對您的個人信息進行刪除或匿名化處理,但法律法規另有規定的除外。
六、我們如何共享、轉讓、公開披露您的個人信息
1. 共享
1.1 我們不會與有車以后以外的任何公司、組織和個人共享您的個人信息,但以下情況除外:
(1)事先獲得您明確的同意或授權;
(2)根據適用的法律法規、法律程序的要求,或按政府主管部門的強制性的行政或司法要求所必須的情況下進行提供;
(3)我們可能會將您的個人信息與我們的關聯方共享。但我們只會共享必要的個人信息,且受本《隱私政策》中所聲明目的的約束。我們的關聯方如要改變個人信息的處理目的,將再次征求您的授權同意。
(4)我們可能會向合作伙伴及第三方共享您的訂單信息、賬號信息、設備信息以及位置信息,以保障為您提供的服務順利完成。但我們僅會出于合法、正當、必要、特定、明確的目的共享您的個人信息,并且只會共享提供服務所必要的個人信息。我們的合作伙伴無權將共享的個人信息用于任何其他用途。
(5)應您需求為您處理您與他人的糾紛或爭議;
(6)符合與您簽署的相關協議(包括在線簽署的電子協議以及相應的平臺規則)或其他的法律文件約定所提供;
(7)基于學術研究而使用;
(8)基于符合法律法規的社會公共利益而使用。
1.2 我們的授權合作伙伴包括以下類型:
(1)車輛或服務的供應商。我們可能會將您的個人信息共享給支持有車以后相關服務功能的第三方。這些支持包括為您網上選車提供基礎設施技術服務、支付服務、數據處理等。我們共享這些信息的目的是可以實現我們產品或相關服務的核心網上選車功能,比如我們必須與汽車經銷商共享您的聯系方式才能為您提供詢價服務等。
(2)委托我們進行推廣的合作伙伴。有時我們會代表其他企業向使用我們產品或相關服務的用戶群提供促銷推廣的服務。我們可能會使用您的個人信息以及您的非個人信息集合形成的間接用戶畫像與委托我們進行推廣的合作伙伴(“委托方”)共享,但我們僅會向這些委托方提供推廣的覆蓋面和有效性的信息,而不會提供您的個人身份信息,或者我們將這些信息進行匯總,以便它不會成為能夠識別您個人身份的信息。例如我們可以告知該委托方有多少人瀏覽了他們的推廣信息或在看到這些信息后進行了下一步的相關操作等,或者向他們提供不能識別個人身份的統計信息,幫助他們了解其受眾的大致情況。
(3)消息推送服務供應商:由每日互動股份有限公司提供推送技術服務,我們可能會將您的設備平臺、設備廠商、設備品牌、設備識別碼等設備信息,應用列表信息、網絡信息以及位置相關信息提供給每日互動股份有限公司,用于為您提供消息推送技術服務。我們在向您推送消息時,我們可能會授權每日互動股份有限公司進行鏈路調節,相互促活被關閉的SDK推送進程,保障您可以及時接收到我們向您推送的消息。詳細內容請訪問《個推用戶隱私政策》(需將《個推用戶隱私政策》超鏈至:https://docs.getui.com/privacy )。
1.3 對我們與之共享個人信息的公司、組織和個人,我們會與其簽署嚴格的保密協定,要求他們按照我們的說明、本《隱私政策》以及其他任何相關的保密和安全措施來處理個人信息。
1.4 為了遵守法律、執行或適用我們的使用條件和其他協議,或者為了保護有車以后、您或其他有車以后用戶的權利及其財產或安全,比如為防止欺詐等違法活動和減少信用風險,而與其他公司和組織交換信息。不過,這并不包括違反本《隱私政策》中所作的承諾而為獲利目的出售、出租、共享或以其它方式披露您的個人信息。
1.5 您同意,有車以后可以通過以下方式對個人信息進行使用和分享(包含對于個人信息的存儲和處理):
1)我們和運營主體關聯公司使用;
2)我們及關聯公司向相關有合作關系的包括但不限于汽車經銷商、廠商及集團、電信運營商、網絡服務提供商等主體分享并由其使用,以及與我們及關聯公司有合作關系第三方機構可驗證您提供的信息的真實性、合法性及有效性,特別是在必須由前述主體分享和使用您的個人信息后您才能夠享受我們提供的服務的情況下;
3)我們及關聯公司可從有合作關系的電信運營商、網絡服務提供商獲取您的相關數據,電信運營商、網絡服務提供商可根據合作內容提供您的相應數據。
4)我們及關聯公司和相關有合作關系的汽車經銷商、廠商為滿足您的需求,可能通過您提供的信息與您聯系,并根據您對相應主體的選擇,或者出于實現為您提供服務之目的,使得相應主體獲悉您的其他相關數據;
5)我們及關聯公司和相關有合作關系的汽車經銷商、廠商可能定期或不定期向您發送有關產品、服務或相關活動的信息,您同意接收上述信息。
您同意免除上述個人信息的接收和/或使用方在按照本法律聲明所述情形下進行信息披露和使用而導致的或可能導致的所有索賠、責任和損失。 您同意免除上述個人信息的接收和/或使用方在按照本法律聲明所述情形下進行信息披露和使用而導致的或可能導致的所有索賠、責任和損失。
2. 轉讓
我們不會將您的個人信息轉讓給任何公司、組織和個人,但以下情況除外:
1)在事先獲得您明確的同意或授權;
2)根據適用的法律法規、法律程序的要求、強制性的行政或司法要求所必須的情況進行提供;
3)符合與您簽署的相關協議(包括在線簽署的電子協議以及相應的平臺規則)或其他的法律文件約定所提供;
4)在涉及合并、收購、破產清算或資產轉讓或類似的交易時,如涉及到個人信息轉讓,我們會要求新的持有您個人信息的公司、組織繼續受本《隱私政策》的約束,否則,我們將要求該公司、組織重新向您征求授權同意。
3. 公開披露
我們僅會在以下情況下,才會公開披露您的個人信息:
1)根據您的需求,在您明確同意的披露方式下披露您所指定的個人信息;
2)根據法律、法規的要求、強制性的行政執法或司法要求所必須提供您個人信息的情況下,我們可能會依據所要求的個人信息類型和披露方式公開披露您的個人信息,此類個人信息包括但不限于以下情形:
(1)與國家安全、國防安全直接相關的;
(2)與公共安全、公共衛生、重大公共利益直接相關的;
(3)與犯罪偵查、起訴、審判和判決執行等直接相關的;
(4)出于維護您或其他個人的生命、財產等重大合法權益但又很難得到本人同意的;
(5)您自行向社會公眾公開的個人信息;
(6)從合法公開披露的信息中收集個人信息的,如合法的新聞報道、政府信息公開等渠道。
在符合法律法規的前提下,當我們收到上述披露信息的請求時,我們會要求必須出具與之相應的法律文件,如傳票或調查函。我們堅信,對于要求我們提供的信息,應該在法律允許的范圍內盡可能保持透明。我們對所有的請求都進行了慎重的審查,以確保其具備合法依據,且僅限于執法部門因特定調查目的且有合法權利獲取的數據。
特別提示:使用有車以后的過程中,您主動公開分享、共享的個人信息,不受本政策限制(如向其他互聯網平臺轉發內容)。您應注意,任何您分享的信息均可被任何第三方閱讀、收集和使用,請您審慎考慮您通過有車以后發布和傳播的內容以及其中可能指向您個人的信息。我們建議您在使用互動功能時特別關注您的個人信息是否已做好隱私保護,發布內容時我們建議您對車牌號進行馬賽克處理,也建議您不在發布內容中展示個人手機號碼。
七、我們如何保護您的個人信息
我們非常重視您的個人信息安全,并采取一切合理可行的措施,保護您的個人信息:
1、數據安全技術措施
我們會采用符合業界標準的安全防護措施,包括建立合理的制度規范、安全技術來防止您的個人信息遭到未經授權的訪問使用、修改,避免數據的損壞或丟失。
有車以后采取加密技術對用戶個人信息進行加密保存,并通過隔離技術進行隔離。
在個人信息使用時,例如個人信息展示、個人信息關聯計算,我們會采用包括內容替換、SHA256在內多種數據脫敏技術增強個人信息在使用中安全性。
有車以后采用嚴格的數據訪問權限控制和多重身份認證技術保護個人信息,避免數據被違規使用。
有車以后采用代碼安全自動檢查、數據訪問日志分析技術進行個人信息安全審計。
2、有車以后為保護個人信息采取的其他安全措施
有車以后通過建立數據分類分級制度、數據安全管理規范、數據安全開發規范來管理規范個人信息的存儲和使用。
有車以后通過信息接觸者保密協議、監控和審計機制來對數據進行全面安全控制。
有車以后建立信息安全管理委員會來推進和保障個人信息安全。
安全認證和服務。我們存儲您個人數據的底層云技術通過了公安部安全等級保護二級認證。
加強安全意識。我們還會舉辦安全和隱私保護培訓課程,加強員工對于保護個人信息重要性的認識。
3、個人信息訪問權限控制
我們僅允許有必要知曉這些信息的有車以后及有車以后關聯方的員工、合作伙伴訪問個人信息,并為此設置了嚴格的訪問權限控制和監控機制。我們同時要求可能接觸到您個人信息的所有人員履行相應的保密義務。如果未能履行這些義務,可能會被追究法律責任或被中止與有車以后的合作關系。
4、個人信息收集與保留
我們會采取一切合理可行的措施,確保未收集無關的個人信息。我們只會在達成本政策所述目的所需的期限內保留您的個人信息,除非需要延長保留期或受到法律的允許。
5、互聯網環境安全性保障聲明
互聯網并非絕對安全的環境,而且電子郵件、即時通訊、社交軟件等與其他用戶的交流方式無法確定是否完全加密,我們建議您使用此類工具時請使用復雜密碼,并注意保護您的個人信息安全。
我們將盡力確保或擔保您發送給我們的任何信息的安全性。如果我們的物理、技術、或管理防護設施遭到破壞,導致信息被非授權訪問、公開披露、篡改或毀壞,導致您的合法權益受損,我們將承擔相應的法律責任。
6、安全事件處置
在通過有車以后與第三方進行網上服務的交易時,您不可避免的要向交易對方或潛在的交易對方披露自己的個人信息,如聯系方式或者通信地址等。請您妥善保護自己的個人信息,僅在必要的情形下向他人提供。
為應對個人信息泄露、損毀和丟失等可能出現的風險,有車以后制定了多項制度,明確安全事件、安全漏洞的分類分級標準及相應的處理流程。有車以后也為安全事件建立了專門的應急響應團隊,按照安全事件處置規范要求,針對不同安全事件啟動安全預案,進行止損、分析、定位、制定補救措施、聯合相關部門進行溯源和打擊。
在不幸發生個人信息安全事件后,我們將按照法律法規的要求,及時向您告知:安全事件的基本情況和可能的影響、我們已采取或將要采取的處置措施、您可自主防范和降低風險的建議、對您的補救措施等。我們同時將及時將事件相關情況以郵件、電話等方式告知您,難以逐一告知個人信息主體時,我們會采取合理、有效的方式發布公告。同時,我們還將按照監管部門要求,主動上報個人信息安全事件的處置情況。
7、免責聲明
本《隱私政策》提供的個人信息保護措施僅適用于有車以后及相關服務。一旦您離開有車以后及相關服務,瀏覽或使用其他網站、服務及內容資源,我們沒有能力及義務保護您在有車以后及相關服務之外的軟件、網站提交的任何個人信息,無論您登錄、瀏覽或使用上述軟件、網站是否基于有車以后的鏈接或引導。當由于以上情形而導致發生個人信息安全事件時,我們將會盡我們所能幫助您進行補救或者止損,但我們將不承擔相應的法律責任。
8、聯系我們
如果您對我們的個人信息保護有任何疑問,可通過個人設置中的問題反饋功能與我們聯系。如您發現自己的個人信息泄密,尤其是您的賬號及密碼發生泄露,請您立即通過個人設置中的問題反饋功能與我們取得聯系,以便我們采取相應措施。
八、您如何管理個人信息
有車以后非常重視您對個人信息的管理,按照中國相關的法律、法規、標準,以及其他國家、地區的通行做法,我們盡全力保障您對自己的個人信息行使以下權利:
1、訪問、查詢和更正您的個人信息
除法律法規規定外,您有權隨時訪問和查詢您的個人信息,您可以在“我的”頁面點擊您的頭像或者用戶名,進入“編輯個人資料”模塊查詢和更正您的頭像、昵稱、性別、個人簡介等個人信息。
2、訪問、查詢和更正您的關注賬號
在有車以后App或有車以后+小程序中,進入“我的”頁面,點擊“關注”可以訪問和查詢您所關注的賬號,您也可以進行取消關注的操作。
3、訪問、查詢和更正您的收藏內容
在有車以后App或有車以后+小程序中,進入“我的”頁面,點擊“收藏”可以訪問和查詢您所收藏的內容,您也可以通過“編輯”來進行取消收藏的操作。
4、自主管理控制個性化推送及定向推送
消息推送——如您不希望收到App頁面上的消息通知,可以在首次安裝App時拒絕接收消息通知,或者在移動端操作系統中的“通知”中心關掉對應的通知功能。
猜你喜歡——如您不希望使用我們的智能推薦服務,可以自主選擇按照銷量、價格、車型等不針對您個人特征的方式進行選車。
推廣/回訪——如您不希望接收我們的推廣短信或電話回訪,可通過信息中相應的退訂功能進行退訂,或者在電話回訪中明確表示拒絕。
5、改變您授權同意的范圍或撤回您的授權
您可以通過刪除信息、關閉設備功能、在軟件或系統中進行隱私設置等方式改變您授權我們繼續收集個人信息的范圍或撤回您的授權。您也可以通過注銷賬號的方式,撤回我們繼續收集您個人信息的全部授權。
請您理解,每個業務功能需要一些基本的個人信息才能得以完成,當您撤回同意或授權后,我們無法繼續為您提供撤回同意或授權所對應的服務,也不再處理您相應的個人信息。但您撤回同意或授權的決定,不會影響此前基于您的授權而開展的個人信息處理。
6、注銷賬號
您可以在我們的產品中直接申請注銷賬號,您注銷賬號后,我們將停止為您提供產品與/或服務,并依據您的要求,除法律法規另有規定外,我們將刪除您的個人信息。在各個有車以后的展示文案和注銷路徑可能略有區別。
7、獲取個人信息副本
您有權獲取您的個人信息副本,您可以通過本《隱私政策》文末提供的方式聯系我們,在核實您的身份后,我們將向您提供您在我們的服務中的個人信息副本(包括基本資料、身份信息),但法律法規另有規定的或本政策另有約定的除外。
8、響應您的上述請求
如果您無法通過上述方式訪問、更正或刪除您的個人信息,或您需要訪問、更正或刪除您在使用我們產品與/或服務時所產生的其他個人信息,或您認為有車以后存在任何違反法律法規或與您關于個人信息的收集或使用的約定,您均可以發送電子郵件至dev_support@youcheyihou.com或通過本《隱私政策》下方的其他方式與我們聯系。為了保障安全,我們可能需要您提供書面請求,或以其他方式證明您的身份,我們將在收到您反饋并驗證您的身份后的【15個工作日】內答復您的請求。對于您合理的請求,我們原則上不收取費用,但對多次重復、超出合理限度的請求,我們將視情況收取一定成本費用。對于那些無端重復、需要過多技術手段(例如,需要開發新系統或從根本上改變現行慣例)、給他人合法權益帶來風險或者非常不切實際(例如,涉及備份磁帶上存放的信息)的請求,我們可能會予以拒絕。
在以下情形中,按照法律法規要求,我們將無法響應您的請求:
(1)與國家安全、國防安全相關的;
(2)與公共安全、公共衛生、重大公共利益相關的;
(3)與犯罪偵查、起訴和審判和執行判決等直接相關的;
(4)有充分證據表明您存在主觀惡意或濫用權利的;
(5)響應您的請求將導致您或其他個人、組織的合法權益受到嚴重損害的;
(6)涉及商業秘密的。
九、未成年人個人信息的保護
1、有車以后非常重視對未成年人個人信息的保護。若您是18周歲以下的未成年人,在使用我們的產品與/或服務前,應事先取得您家長或法定監護人的書面同意。有車以后根據國家相關法律法規的規定保護未成年人的個人信息。
2、對于經父母或法定監護人同意而收集未成年人個人信息的情況,我們只會在受到法律允許、父母或監護人明確同意或者保護未成年人所必要的情況下使用、共享、轉讓或披露此信息。
3、如果有事實證明未成年人并未取得父母或法定監護人同意的情況下注冊使用了我們的產品或相關服務,我們會與相關監護人協商,并設法盡快刪除相關個人信息。
十、《隱私政策》的修訂、通知和查看
1、為了給您提供更好的服務,有車以后及相關服務將不時更新與變化,我們會適時對本《隱私政策》進行修訂,這些修訂構成本《隱私政策》的一部分。
2、本《隱私政策》更新后,我們會發出更新版本,并在更新后的條款生效前通過官方網站公告或其他適當的方式提醒您更新的內容,以便您及時了解本《隱私政策》的最新版本。如您繼續使用我們的服務,表示同意接受修訂后的《隱私政策》的內容。
3、對于重大變更,我們還會提供更為顯著的通知(我們會通過包括但不限于郵件、短信或在瀏覽頁面做特別提示等方式,說明《隱私政策》的具體變更內容)。
本《隱私政策》所指的重大變更包括但不限于:
(1)我們的服務模式發生重大變化。如處理個人信息的目的、處理的個人信息類型、個人信息的使用方式等;
(2)我們在所有權結構、組織架構等方面發生重大變化。如業務調整、破產并購等引起的所有者變更等;
(3)個人信息共享、轉讓或公開披露的主要對象發生變化;
(4)您參與個人信息處理方面的權利及其行使方式發生重大變化;
(5)我們負責處理個人信息安全的責任部門、聯絡方式及投訴渠道發生變化時;
(6)個人信息安全影響評估報告表明存在高風險時。
4、您可以在首次使用有車以后App通過彈窗查看本《隱私政策》,也可在有車以后App通過“我的-設置-隱私政策”再次查看。我們懇請您定期查看本《隱私政策》,以確保您對本政策最新版本始終保持了解。
十一、聯系我們
1、我們設立了專門負責個人信息保護的部門,如您對本政策有任何疑問、意見或建議,您可以通過以下方式與我們取得聯系:
(1)點擊“我的-設置-問題反饋”給我們留言反饋;
(2)發送郵件至:dev_support@youcheyihou.com;
(3)郵寄信件至:廣東省廣州市海珠區新港西路135號中山大學國家大學科技園B座14樓 郵編:510275。
2、我們會在收到您的意見及建議后的【15個工作日】內核驗您的身份并盡快向您回復。如無法響應您的請求,我們會在法律規定的最大時限要求內,向您發送通知并解釋原因。
3、如您對我們的回復不滿意,或我們對您個人信息的處理方式侵害了您的合法權益,且在您向我們反饋后我們無法提供讓您滿意的回復且拒絕改進的,您可以向相關監管機構進行投訴和舉報。
十二、附錄
1、本《隱私政策》中的標題僅為方便及閱讀而設,并不影響本《隱私政策》中任何規定的含義或解釋。
2、本《隱私政策》相關詞語釋義:
(1)有車以后及相關服務是指,公司及其關聯方通過合法擁有并運營的、標注名稱為有車以后的客戶端應用程序、微信小程序、微信公眾號以及youcheyihou.com網站,向您提供的產品與服務,包括但不限于個性化推薦、選車看車、發布信息、互動交流、搜索查詢等核心功能以及其他功能。
(2)關聯方是指,一方現在或將來控制、受控制或與其處于共同控制下的任何公司、機構以及上述公司或機構的法定代表人。“控制”是指直接或間接地擁有影響所提及公司管理的能力,無論是通過所有權、有投票權的股份、合同或其他被依法認定的方式。
(3)個人信息是指,以電子或者其他方式記錄的能夠單獨或者與其他信息結合識別特定自然人身份或者反映特定自然人活動情況的各種信息。本《隱私政策》中涉及的個人信息包括:基本信息(包括個人姓名、生日、性別、住址、個人電話號碼、電子郵箱);個人身份信息(包括身份證、軍官證、護照、車輛行駛證、駕駛證等您上傳到網站的內容中包含的任何個人信息);面部特征;網絡身份標識信息(包括系統賬號、賬號名、賬號昵稱、IP地址、郵箱地址及與前述有關的密碼、口令、口令保護答案);個人財產信息(訂單記錄、有車以后現金余額、有車以后有車幣、有車以后聲望等虛擬財產信息);個人上網記錄(包括網站瀏覽記錄、軟件使用記錄、點擊記錄);個人常用設備信息(包括硬件型號、設備MAC地址、操作系統類型、軟件列表唯一設備識別碼(如IMEI/android ID/IDFA/OPENUDID/GUID、SIM卡IMSI信息等在內的描述個人常用設備基本情況的信息);個人位置信息(包括精準定位信息、經緯度等);其他個人信息(包括您明確聲稱歸您所有的車輛號牌等個人信息)。
以上個人信息包含的內容出自于GB/T35273《個人信息安全規范》。
(4)個人敏感信息是指,一旦泄露、非法提供或濫用可能危害人身和財產安全,極易導致個人名譽、身心健康受到損害或歧視性待遇等的個人信息,本隱私政策中涉及的個人敏感信息包括:您的財產信息(包括銀行賬號、交易和消費記錄以及有車以后現金余額、有車以后有車幣、有車以后聲望等虛擬財產信息);面部識別特征;個人身份信息(包括身份證、軍官證、護照、駕駛證、戶口本);網絡身份標識信息(包括賬號名、用戶昵稱、郵箱地址)。其他信息(包括通訊錄、個人電話號碼、手機號碼、行程信息、網頁瀏覽記錄、住宿信息、精準定位信息)。
以上個人信息包含的內容出自于GB/T35273《個人信息安全規范》。
(5)去標識化是指,通過對個人信息的技術處理,使其在不借助額外信息的情況下,無法識別個人信息主體的過程。
(6)匿名化是指,通過對個人信息的技術處理,使得個人信息主體無法被識別,且處理后的信息不能被復原的過程。
3、本《隱私政策》的版權為我們所有,在法律允許的范圍內,我們擁有解釋和修改的權利。
主站蜘蛛池模板:
337p日本欧洲亚洲大胆精品|
夜夜夜夜曰天天天天拍国产|
久青草久青草视频在线观看|
337p西西人体大胆瓣开下部|
性xxxx欧美老妇胖老太269|
亚洲人成色77777|
久久66热人妻偷产精品|
欧美日韩精品|
领导边摸边吃奶边做爽在线观看|
日韩人妻无码精品无码中文字幕|
岳把腿扒开让我添|
国产精品污www一区二区三区|
中字幕视频在线永久在线观看免费|
免费看无码特级毛片|
欧美黑人性暴力猛交喷水黑人巨大|
成年免费a级毛片免费看无码|
国产无遮挡裸体免费视频|
国产成人综合亚洲av第一页|
最近最新中文字幕|
成人区人妻精品一区二区不卡
|
欧美亚洲人成网站在线观看|
色噜噜亚洲精品中文字幕|
亚洲日韩在线中文字幕综合|
天堂网www在线资源|
污污内射在线观看一区二区少妇|
亚洲avav天堂av在线网爱情|
国产xxxx视频在线观看|
中文在线中文a|
朝鲜女子内射杂交bbw|
人妻有码中文字幕在线|
国产人碰人摸人爱视频|
无码任你躁久久久久久|
特黄aaaaaaa片免费视频|
处破女轻点疼丨98分钟|
美女无遮挡免费视频网站|
亚洲国产精品无码中文字|
妓院一钑片免看黄大片|
av怡红院一区二区三区|
国产精品美女久久久久av爽|
女人让男人桶30分钟|
日韩 无码 偷拍 中文字幕|