Vysor 1.7.6 chrome 插件破解

2023-11-08

在你的Chrome扩展文件里面,找到 名为uglify.js的文件。
我的文件地址:

C:\Users\jin\AppData\Local\Google\Chrome\User Data\Default\Extensions\gidgenkbbabolejbgbpnhbimgjbffefm\1.7.7_0

实在不行,你手动搜索一下,然后打开之后把文件格式化一下,这个自行百度。然后找到下面这个图的地方。你可以用 Vysor subscription is 这个关键词去搜索,找到这个地方,然后去掉

var e = !1, t = !1 (原文)
改后:
var e = 1, t = 1 (改后)

这里写图片描述

改完,保存重启。谢谢。

下面的代码下载地址:
完整代码:这里展示:

/**
 * Created by jin on 2017/6/27.
 */
!function (e, t) {
  function n(e) {
    setTimeout(e, 0)
  }

  function o(e) {
    for (var t = e.toString(16); t.length < 4;)t = "0" + t;
    return t
  }

  function i(e) {
    return unescape(encodeURIComponent(e))
  }

  function r(e) {
    return decodeURIComponent(escape(e))
  }

  function s(e) {
    return "ArrayBuffer" == e.constructor.name && (e = new Uint8Array(e)), r(String.fromCharCode.apply(null, e))
  }

  function c(e, t, n) {
    e = i(e);
    var o = e.length;
    n && o++, t || (t = new ArrayBuffer(o));
    var r = new Uint8Array(t);
    n && (r[e.length] = 0);
    for (var s = 0, c = e.length; s < c; s++)r[s] = e.charCodeAt(s);
    return t
  }

  function a(e, t, n) {
    "Object" == t.constructor.name && (t = JSON.stringify(t)), u(e, t + "\n", n)
  }

  function d(e, t) {
    function n() {
      e.read(function (i) {
        for (var r = 0; r < i.byteLength; r++)if (i[r] == we) {
          var c = i.subarray(0, r);
          o.push(c);
          var a = "";
          for (var d in o)d = o[d], a += s(d);
          var l = i.subarray(r + 1);
          return e.unshift(l), void t(a)
        }
        o.push(i), n()
      })
    }

    var o = [];
    n()
  }

  function l(e, t) {
    function n(t) {
      o += s(t), e.read(n)
    }

    var o = "";
    e.onClose = function () {
      t(o)
    }, e.read(n)
  }

  function u(e, t, n) {
    "Object" == t.constructor.name && (t = JSON.stringify(t)), e.write(c(t), n)
  }

  function h(e, t) {
    var n = new Uint8Array(e.byteLength + t.byteLength);
    return n.set(e, 0), n.set(t, e.byteLength), n
  }

  function f(e) {
    for (var t = window.atob(e), n = t.length, o = new Uint8Array(n), i = 0; i < n; i++) {
      var r = t.charCodeAt(i);
      o[i] = r
    }
    return o.buffer
  }

  function p(e) {
    var t, n, o = "";
    for (t = 0; t + 3 <= e.length; t += 3)n = parseInt(e.substring(t, t + 3), 16), o += be.charAt(n >> 6) + be.charAt(63 & n);
    for (t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16), o += be.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16), o += be.charAt(n >> 2) + be.charAt((3 & n) << 4)); (3 & o.length) > 0;)o += ke;
    return o
  }

  function v(e, t) {
    t || (t = window.location);
    for (var n = t.search.substring(1), o = n.split("&"), i = 0; i < o.length; i++) {
      var r = o[i].split("=");
      if (decodeURIComponent(r[0]) == e)return decodeURIComponent(r[1])
    }
  }

  function g(e, t, n, o) {
    return e || (e = {items: []}), e.items.push(t), e.timeout || (e.timeout = setTimeout(function () {
      delete e.timeout, o(e.items), e.items = []
    }, n)), e
  }

  function m(e, t) {
    if (console.log("notification:", e), window.chrome && window.chrome.notifications) {
      var n = chrome.runtime.getManifest(), o = n.name;
      t = t || n.icons[128], chrome.notifications.create({type: "basic", iconUrl: t, title: o, message: e})
    }
  }

  function y() {
  }

  function w(e, t) {
    return window.chrome && window.chrome.identity ? void chrome.identity.getAuthToken({
      interactive: e,
      scopes: ["https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/chromewebstore.readonly"]
    }, function (e) {
      e || console.error("unable to get authToken", chrome.runtime.lastError), t(e)
    }) : (console.error("no auth token implemented"), void process.nextTick(t))
  }

  function b(e) {
    e && (this.dataReceived(e), this.dataReceived(null))
  }

  function k(e, t) {
    this.promise = fetch(e).then(function (e) {
      this.connected = !0, this.response = e, this.reader = this.response.body.getReader(), this.reader.closed.then(function () {
        this.onClose && this.dataReceived(null)
      }.bind(this)), this.onResume(), t(this)
    }.bind(this), function (e) {
      t(null, e)
    })
  }

  function C(e, t, n, o, i) {
    o = f(o), n = c(n), window.crypto.subtle.importKey("jwk", {
      kty: "RSA",
      e: e,
      n: t,
      alg: "RS1"
    }, {name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, !0, ["verify"]).then(function (e) {
      window.crypto.subtle.verify({name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"}}, e, o, n).then(function (e) {
        return e ? void i() : void i("invalid signature")
      }).catch(function (e) {
        i("failure to verify", e)
      })
    }).catch(function (e) {
      i("key import failed", e)
    })
  }

  function S() {
  }

  function A(e, t, n) {
    this.adbSocketFactory = e, this.conn = n, this.conn.openSocket = this.openSocket.bind(this);
    var o = t.properties.substring(t.properties.indexOf("product")).replace(/ /g, ";").replace("device", "ro.product.device").replace("model", "ro.product.model").replace("product", "ro.product.name").replace(/:/g, "=");
    this.properties = "device::" + o + ";"
  }

  function D(e) {
    chrome.storage.local.get("whitelist", function (t) {
      var n = {};
      return t.whitelist && "Array" == t.whitelist.constructor.name ? ($.each(t.whitelist, function (e, t) {
        n[t] = !0
      }), void e(n)) : void e(n)
    })
  }

  function I(e, t) {
    chrome.storage.local.set({whitelist: Object.keys(e)}, t)
  }

  function L(e, t) {
    D(function (n) {
      n[e] = !0, I(n, t)
    })
  }

  function O(e, t) {
    chrome.storage.local.get(["whitelist", "serverMode"], function (n) {
      if (1 == n.serverMode)return void t(!0);
      if (2 != n.serverMode) {
        return n.whitelist && "Array" == n.whitelist.constructor.name ? void t(n.whitelist.indexOf(e) != -1, !0) : void t(!1, !0)
      }
      w(!1, function (n) {
        return n ? void $.ajax({
          type: "get",
          url: "https://billing.vysor.io/whitelist",
          headers: {Authorization: "Bearer " + n},
          data: {email: e},
          error: function () {
            console.error("failure checking vysor enterprise whitelist", arguments), t(!1)
          },
          success: function (n) {
            n.whitelist || console.error("access denied to", e, n), t(n.whitelist, !1)
          }
        }) : (console.error("unable to get token for vysor enterprise whitelist check"), void t(!1))
      })
    })
  }

  function R(e) {
    return e ? (e.friendlyName && !e.friendlyName.length && delete e.friendlyName, e) : null
  }

  function E(e) {
    window.chrome && window.chrome.storage ? chrome.storage.local.get("device-settings", function (t) {
      e(t["device-settings"] || {})
    }) : e({})
  }

  function U(e) {
    e.contentWindow._lm = {
      _il: We.a(),
      _ilc: We.c(),
      _cl: We.b.bind(We),
      refresh: We.refresh.bind(We),
      startPurchase: We.startPurchase.bind(We)
    }, e.contentWindow._rl && e.contentWindow._rl()
  }

  function T(e, t) {
    if (De) {
      var n = De.contentWindow.shortModal;
      n && n(e, t)
    }
  }

  function W() {
    T(null, Pe)
  }

  function P() {
    De && De.contentWindow.updateVysorShareServer && De.contentWindow.updateVysorShareServer(Ae)
  }

  function M(e, t) {
    var n = j(e);
    console.log(e, n, "status", t);
    var o = chrome.app.window.get(n);
    o && o.contentWindow.updateWindowStatusText && o.contentWindow.updateWindowStatusText(t)
  }

  function N(e, t) {
    M(e, "Installing Vysor APK..."), AdbUtils.installApk("/Vysor-release.apk", e, t)
  }

  function _(e, t, n) {
    function o(o) {
      var i = Math.round(Math.random() * (1 << 30)).toString(16),
        r = "echo -n " + i + " > /data/local/tmp/vysor.pwd ; chmod 600 /data/local/tmp/vysor.pwd";
      AdbUtils.runMain(e, o, "com.koushikdutta.vysor.Main password=" + i + " keyboard=" + Se, function (o) {
        Adb.shell({serialno: e, command: 'sh -c "' + r + '"'}, function (e) {
          Socket.eat(o), n(t, i)
        })
      }, function (e, t) {
        e.command = "shell:" + e.command, Adb.sendClientCommand(e, t)
      })
    }

    function i(t) {
      M(e, "Connecting..."), AdbUtils.getApkPath(e, "com.koushikdutta.vysor", function (n) {
        return n ? void AdbUtils.runMain(e, n, "com.koushikdutta.vysor.ProtocolVersionMain", function (e) {
          var o = e.match(/vysor-io-.*?[\r\n]/);
          return o && o.length ? (e = o[0], e && (e = e.trim()), console.log("protocol version: " + e), void t("vysor-io-45" != e ? null : n)) : void t(null)
        }) : void t()
      })
    }

    M(e, "Connecting..."), i(function (t) {
      return t ? void o(t) : (console.log("installing apk"), void N(e, function (t) {
        i(function (n) {
          return n ? void o(n) : (t || (t = ""), m("Error installing APK:\n" + t.trim()), void x(e))
        })
      }))
    })
  }

  function x(e) {
    var t = j(e), n = chrome.app.window.get(t);
    n && n.close()
  }

  function F(e, t) {
    return void _(e, null, t)
  }

  function B(e, t, n, o) {
    isElectron() ? (console.log("adb client socket factory path"), e.contentWindow.adbSocketFactory = null, e.contentWindow.adbSocketFactoryFactory = {
      type: "adb-client",
      arguments: {serialno: t}
    }) : Le[t] ? (console.log("vysor socket fast path"), e.contentWindow.adbSocketFactory = Le[t]) : Ie.isRunning() ? (console.log("adb server socket path"), e.contentWindow.adbSocketFactory = Ie.adbDevices[t]) : (console.log("adb client socket path"), e.contentWindow.adbSocketFactory = Adb.createSocketFactory(t)), U(e), e.contentWindow.openList = G, e.contentWindow.password = o, e.contentWindow.port = n, Me && Me.socket && (e.contentWindow.httpPort = Me.socket.localPort), e.contentWindow.device = Le[t] || $e[t], e.contentWindow.tracker = Ue
  }

  function V() {
    setTimeout(function () {
      chrome.app.window.getAll().length || chrome.runtime.reload()
    }, 5e3)
  }

  function j(e) {
    var t = e;
    return Le[e] && Le[e].id ? t = Le[e].id : $e[e] && $e[e].id ? t = $e[e].id : Ye[e] && (t = Ye[e]), t
  }

  function K(e, t, n) {
    ee();
    var o = j(e), i = chrome.app.window.get(o);
    return i ? (i.show(), t && F(e, function (t, n) {
      B(i, e, t, n), i.contentWindow.connectionReady()
    }), void(n && n(i))) : void chrome.app.window.create("screen.html", {
      id: o,
      innerBounds: {width: 576, height: 1024}
    }, function (t) {
      var o;
      t.onClosed.addListener(o = function () {
        t.onClosed.removeListener(o), V(), t.contentWindow.h264Socket && (console.log("cleaning up h264 socket"), t.contentWindow.h264Socket.destroy(), t.contentWindow.h264Socket = null), t.contentWindow.inputWebSocket && (console.log("cleaning up input websocket"), t.contentWindow.inputWebSocket.close(), t.contentWindow.inputWebSocket = null)
      }), B(t, e, null, null), t.contentWindow.onload = function () {
        return n && n(t), $e[e] ? void F(e, function (n, o) {
          B(t, e, n, o), t.contentWindow.connectionReady()
        }) : void console.log("Vysor requested for", e, "which is not available yet")
      }
    })
  }

  function q() {
    Ae = null, _e && _e.stopListen("share"), P()
  }

  function H(e) {
    var t = Re[e];
    t && t.gcmConn.destroy()
  }

  function J(e, t, n) {
    var o = Re[e];
    if (o && o.devices[t]) {
      o.gcmConn.gcmConns[t] && o.gcmConn.gcmConns[t].destroy();
      var i, r = o.gcmConn.gcmConns[t] = {
        id: t, farm: !0, newSocket: function (e, n) {
          i || o.gcmConn.newSocket(t + ":" + e, n)
        }, destroy: function () {
          i = !0, o.gcmConn.gcmConns[t] == r && delete o.gcmConn.gcmConns[t], delete $e[r.serialno], o.gcmConn.newSocket("close:" + t, function (e) {
            e && e.destroy()
          });
          var e = r.onClose;
          e && (delete r.onClose, e()), ue()
        }
      };
      Q(t, function (e) {
        e(r)
      }, n), ue()
    }
  }

  function Y(e, t, n) {
    function o(e) {
      n && n(null, e)
    }

    function i(e) {
      return _e ? void _e.connect({
        senderId: "64148182473",
        registrationId: e.registration,
        port: "share"
      }, function (i) {
        function s() {
          i.newSocket("devices:", function (e) {
            l(e, function (e) {
              var t = JSON.parse(e), n = t.devices, o = t.sharedDevices;
              h.devices ? ($.each(Object.keys(n), function (e, t) {
                delete h.devices[t]
              }), $.each(Object.keys(h.devices), function (e, t) {
                var n = i.gcmConns[t];
                n && n.destroy()
              }), h.devices = n) : h.devices = n, h.sharedDevices = o, ue()
            })
          })
        }

        Ue.sendEvent("connected-device-farm");
        var c, u = Re[r];
        u && u.gcmConn.destroy();
        var h = Re[r] = {info: e, gcmConn: i};
        i.gcmConns = {}, i.openSocket = function (e, r) {
          function l() {
            c.read(function () {
              s(), l()
            })
          }

          if (e.startsWith("challenge:")) {
            console.log("received challenge", e);
            var u = e.split(":")[1];
            $.ajax({
              type: "post",
              url: "https://billing.vysor.io/verifyauth",
              headers: {Authorization: "Bearer " + t},
              data: {nonce: u},
              dataType: "json",
              success: function (e) {
                Ne = JSON.parse(e.signed_data), console.log("sending challenge response", e), a(r, e, function () {
                  d(r, function (e) {
                    return r.destroy(), "ok" == e ? (s(), void(n && n(h.info))) : void o("Access denied: " + e)
                  })
                })
              },
              error: function (e, t) {
                o("Unable to verify identity."), r.destroy()
              }
            })
          } else if (e.startsWith("close:")) {
            r.destroy();
            var f = e.split(":")[1], p = i.gcmConns[f];
            if (!p)return void console.log("can't close unknown subconn");
            p.destroy()
          } else e.startsWith("tracker:") ? (console.log("got tracker socket"), c = r, l()) : (console.log("got unknown socket request", e), r.destroy())
        }, i.onClose = function () {
          Re[r] == h && delete Re[r], $.each(Object.keys(i.gcmConns), function (e, t) {
            var n = i.gcmConns[t];
            n && n.destroy()
          }), ue()
        }, console.log("Connection to device farm established", i)
      }) : void o(Pe)
    }

    e = new URL(e);
    var r = e.hash.replace("#", "");
    $.ajax({
      url: "https://billing.vysor.io/gcm/" + r, dataType: "json", success: i, error: function (e, t) {
        m("Unable to find server: " + t)
      }
    })
  }

  function X(e, t) {
    function n(e) {
      ue(), t ? t(null, e) : m(e)
    }

    function o() {
      ue(), t && t(Ae)
    }

    q(), w(e, function (e) {
      function t() {
        console.log("registering vysor share server"), $.ajax({
          type: "post",
          url: "https://billing.vysor.io/gcm",
          headers: {Authorization: "Bearer " + e},
          data: {registration: _e.registrationId},
          dataType: "json",
          success: function (e) {
            console.log("vysor share server", e), chrome.storage.local.set({
              lastDeviceFarmRegistrationId: _e.registrationId,
              lastDeviceFarmServerId: e.id
            }), Ae = "https://vysor.clockworkmod.com/server#" + e.id, o(Ae)
          }.bind(this),
          error: function (e, t) {
            q(), n("Unable to register server: " + t)
          }
        })
      }

      function i() {
        r = g(r, null, 500, function () {
          $.each(l, function (e, t) {
            t.trackerSocket && t.trackerSocket.write(c("0000\n"), function () {
            })
          }), ue()
        })
      }

      if (!e)return void n("Unable to get Auth Token.");
      if (!_e)return void n(Pe);
      _e.onRegistrationIdChanged = t, chrome.storage.local.get(["lastDeviceFarmRegistrationId", "lastDeviceFarmServerId"], function (e) {
        return e && e.lastDeviceFarmRegistrationId == _e.registrationId && e.lastDeviceFarmServerId ? (console.log("device farm registration unchanged, not registering with server."), Ae = "https://vysor.clockworkmod.com/server#" + e.lastDeviceFarmServerId, void o(Ae)) : void t()
      });
      var r, s, l = [];
      _e.listen("share", function (e) {
        var t, n, o, r = {},
          c = Math.round(Math.random() * (1 << 30)).toString(16) + Math.round(Math.random() * (1 << 30)).toString(16);
        e.onClose = function () {
          var t = l.indexOf(e);
          t != -1 && l.splice(t, 1), e.trackerSocket && (e.trackerSocket.destroy(), delete e.trackerSocket), $.each(Object.keys(r), function (e, t) {
            var n = r[t];
            n.destroy()
          })
        }, e.newSocket("challenge:" + c, function (i) {
          return i ? void d(i, function (r) {
            function s(e) {
              e = e || "fail", console.log("Remote user failed to authorize", e), a(i, e, function () {
                i.destroy()
              })
            }

            console.log("received challenge response", r);
            var d = JSON.parse(r);
            C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", d.signed_data, d.signature, function (r) {
              function u() {
                function r() {
                  l.push(e), t = !0, a(i, "ok", function () {
                    i.destroy()
                  }), m("Vysor is sharing Android devices with " + n.name, o), Adb.sendHostCommand("host:track-devices", function (t) {
                    return t ? void e.newSocket("tracker:", function (n) {
                      return n ? (e.trackerSocket = n, void Socket.stream(n, t)) : (t.destroy(), void console.error("unable to open remote tracker"))
                    }) : void console.error("unable to track adb devices", chrome.runtime.lastError)
                  })
                }

                O(n.email, function (e, t) {
                  if (e)return void r();
                  if (!t)return void s("Denied by policy.");
                  var i = chrome.runtime.getManifest().name;
                  chrome.notifications.create({
                    type: "basic",
                    iconUrl: o,
                    title: i,
                    message: n.name + " is requesting access to Vysor shared Android devices.",
                    buttons: [{title: "Allow"}, {title: "Deny"}]
                  }, function (e) {
                    var t, o = function (n) {
                      n == e && (chrome.notifications.onClosed.removeListener(o), chrome.notifications.onButtonClicked.removeListener(i), t || s("Denied by user."))
                    }, i = function (o, i) {
                      o == e && (chrome.notifications.clear(o), t = !0, 0 == i ? (L(n.email, function () {
                        P()
                      }), r()) : s("Denied by user."))
                    };
                    chrome.notifications.onClosed.addListener(o), chrome.notifications.onButtonClicked.addListener(i)
                  })
                })
              }

              return r ? void s("Identify signature verification failed.") : (n = JSON.parse(d.signed_data), n.nonce != c ? void s("Mismatched nonce in authentication.") : void(n.picture ? Ce(n.picture, function (e) {
                o = e, u()
              }) : (o = "/icon.png", u())))
            })
          }) : (console.error("challenge socket failed"), void e.destroy())
        }), e.openSocket = function (o, c) {
          if (!t)return void c.destroy();
          if ("devices:" == o) s = g(s, c, 500, function (e) {
            E(function (t) {
              Adb.devices(function (n) {
                n || (n = {}), $.each(Object.keys(n), function (e, o) {
                  Le[o] && delete n[o], R(t[o]), t[o] && t[o].friendlyName && (n[o].name = t[o].friendlyName)
                });
                var o = {};
                $.each(Object.keys(Oe), function (e, t) {
                  o[t] = {userInfo: Oe[t].userInfo}
                }), $(e).each(function (e, t) {
                  u(t, {devices: n, sharedDevices: o}, function () {
                    t.destroy()
                  })
                })
              })
            })
          }); else if (o.startsWith("close:")) {
            c.destroy();
            var a = o.split(":")[1], d = r[a];
            d && d.destroy()
          } else {
            var l = o.indexOf(":");
            if (l == -1)return console.error("unexpected command received by device farm server"), void c.destroy();
            var a = o.substring(0, l);
            if (!$e[a]) {
              if (l = o.indexOf(":", l + 1), l == -1)return void c.destroy();
              if (a = o.substring(0, l), !$e[a])return void console.error("request for unknown device", a)
            }
            var d = r[a];
            if (!d) {
              var h = Adb.createSocketFactory(a);
              d = r[a] = new A(h, $e[a], {}), d.destroy = function () {
                try {
                  e.newSocket("close:" + a, function (e) {
                    e && e.destroy()
                  })
                } catch (e) {
                }
                var t = Oe[a];
                t && (t.userInfo == n && delete t.userInfo, t.gcmConn == this && delete t.gcmConn, t.key || t.gcmConn || delete Oe[a]);
                var o = this.onClose;
                o && (delete this.onClose, o()), i()
              }.bind(d)
            }
            var f = Oe[a];
            f || (f = Oe[a] = {}), f.gcmConn != d && (te(a), f.gcmConn = d, f.userInfo = n, Oe[a] = f), i();
            var p = o.substring(l + 1);
            d.openSocket(p, c)
          }
        }
      })
    })
  }

  function z(e) {
    Se = e
  }

  function G() {
    return De ? void De.focus() : void chrome.app.window.create("list.html", {
      id: "list",
      innerBounds: {width: 768, height: 768, minWidth: 768, minHeight: 768}
    }, function (e) {
      De = e, De.contentWindow.openList = G, U(De), De.contentWindow.disconnectSharedDevice = ae, De.contentWindow.toggleShare = de, De.contentWindow.unshareDevice = ne, De.contentWindow.quietSerial = ce, De.contentWindow.openWindow = K, De.contentWindow.closeWindow = x, De.contentWindow.createDeviceFarmConnection = J, De.contentWindow.destroyDeviceFarmConnection = H, De.contentWindow.adbServer = Ie, De.contentWindow.tracker = Ue, De.contentWindow.startWireless = le, De.contentWindow.startDeviceFarm = X, De.contentWindow.stopDeviceFarm = q, De.contentWindow.updateKeyboard = z, De.contentWindow.onload = function () {
        U(De), P(), ue()
      }, De.onClosed.addListener(function () {
        De = null, V()
      })
    })
  }

  function Q(e, t, n) {
    Ie.start();
    var o = new Server;
    o.listen({port: 0, address: "127.0.0.1"}, function (e) {
      o.destroy();
      var i = new AdbDaemon(new AdbTcpTransport(e));
      t(function (e) {
        Ue.sendEvent("connected-shared-device");
        var t = "127.0.0.1:" + o.localPort;
        e.serialno = t, e.id || (e.id = t), Le[t] = e, console.log("connected gcm socket"), e.openSocket = function () {
          console.log("got a new socket? this should not happen..."), e.destroy()
        }, i.onClose = e.onClose = function () {
          delete Le[t], i.destroy(), e.destroy()
        }, e.onClose = function () {
          delete Le[t], i.destroy(), e.destroy(), m("Disconnected from shared Android device.")
        }, i.openSocket = function (t, n) {
          e.newSocket(t, function (e) {
            Socket.stream(n, e, function () {
            })
          })
        }, e.newSocket("properties", function (o) {
          l(o, function (o) {
            var r = AdbDevice.parseConnectionPayload(o);
            e.name = e.name || r["ro.product.model"].replace("_", " "), i.start(o), console.log("got properties", o), n(t)
          })
        })
      })
    }.bind(this), function (t) {
      if (t)return void console.log("adb daemon failed to listen: " + t);
      var n = "127.0.0.1:" + o.localPort;
      Le[n] = {
        id: e || n, destroy: function () {
        }
      }, console.log("mapping", n, e), ue(), Adb.sendHostCommand("host:connect:" + n, function (e, t) {
        e && (e.destroy(), t = s(t), console.log("adb connect result", t))
      })
    }.bind(this))
  }

  function Z(e, t) {
    if (m("Vysor is connecting to a remote Android device"), De && De.show(), console.log("attempting to connect to shared device", e), !_e)return void W();
    var n = new URL(e), o = v("senderId", n), i = v("registrationId", n), r = v("channel", n);
    o || (o = "64148182473"), Q(null, function (e) {
      _e.connect({senderId: o, registrationId: i, port: r}, e)
    }, t)
  }

  function ee() {
    chrome.runtime.requestUpdateCheck(function (e, t) {
      console.log("update check", arguments), "update_available" == e && ye()
    })
  }

  function te(e) {
    var t = Oe[e];
    if (t && t.gcmConn) {
      var n = t.gcmConn;
      delete t.gcmConn, n.destroy()
    }
  }

  function ne(e) {
    te(e), delete Oe[e], ue()
  }

  function oe(e, t) {
    function n(e) {
      t && t(null, e)
    }

    var o = $e[e];
    if (!_e)return void n(Pe);
    var i = Math.round(Math.random() * (1 << 30)).toString(16);
    Oe[e] || (Oe[e] = {}), Oe[e].key = i, ue();
    var r = "https://vysor.clockworkmod.com/redirect/?registrationId=" + encodeURIComponent(_e.registrationId) + "&channel=" + i;
    console.log(r), _e.listen(i, function (t) {
      Ue.sendEvent("shared-device");
      var n = Oe[e];
      if (!n || n.key != i)return t.destroy(), void console.log("device is no longer being shared.");
      n.gcmConn && n.gcmConn.destroy(), n.gcmConn = t, n.userInfo = {name: "Someone"}, ue(), console.log("accepted gcm socket");
      var r = Adb.createSocketFactory(e), s = new A(r, o, t);
      s.onOpenSocket = function (t, n) {
        if ("webstart" == t)return _(e, null, function (e, t) {
          a(n, t, function () {
            console.log("sent password", t), n.destroy()
          })
        }), !0
      }
    });
    var s = "https://tu3ph.app.goo.gl/?ad=0&apn=com.koushikdutta.inkwire&link=" + encodeURIComponent(r);
    t(s)
  }

  function ie() {
    return xe ? xe : (console.log("creating persistent gcm connection"), xe = new Promise(function (e, t) {
      GcmRtcManager.start({
        3505780036: "AIzaSyDt0GimPRhk8_d_4XjOYzQUn50UkvXhMtE",
        64148182473: "AIzaSyDd7k1v017osyYbIC92fyf-36s3pv0z73U"
      }, {
        iceServers: [{
          url: "turn:n0.clockworkmod.com",
          username: "foo",
          credential: "bar"
        }, {url: "turn:n1.clockworkmod.com", username: "foo", credential: "bar"}]
      }, function (t) {
        return _e = t, console.log("persistent gcm connection created", null != t), _e ? (_e.defaultSenderId = "64148182473", void e(_e)) : (xe = null, void e())
      })
    }))
  }

  function re(e) {
    return function () {
      var t = arguments;
      ie().then(function () {
        e.apply(null, t)
      })
    }
  }

  function se(e) {
    var t = ze[e];
    clearTimeout(t), ze[e] = setTimeout(function () {
      delete ze[e]
    }, 1e4), delete Xe[e]
  }

  function ce(e) {
    var t = Xe[e];
    clearTimeout(t), Xe[e] = setTimeout(function () {
      delete Xe[e]
    }, 1e4), delete ze[e]
  }

  function ae(e) {
    x(e);
    var t = Le[e];
    t && t.destroy()
  }

  function de(e, t) {
    Oe[e] ? ne(e) : oe(e, t), ue()
  }

  function le(e) {
    var t = Adb.createSocketFactory(e);
    t.newSocket("shell:ifconfig wlan0", function (n) {
      return n ? void l(n, function (n) {
        function o(e, t) {
          Adb.sendHostCommand("host:disconnect:" + a, function (n, o) {
            n && n.destroy(), delete $e[a], Adb.sendHostCommand("host:connect:" + a, function (n, o) {
              return n ? (n.destroy(), o = s(o), o.indexOf("unable to connect") != -1 ? (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t(o))) : (t && t(), chrome.storage.local.set({lastConnectAddress: a}), console.log("adb connect result", o), void(e && i()))) : (m("Unable to connect via wireless. Is your Android on the same network as your PC?"), void(t && t("host connect failed")))
            })
          })
        }

        function i() {
          ue(), m("Vysor is connected wirelessly. You may disconnect your device."), Ue.sendEvent("go-wireless"), ce(a), K(a, !0, function (e) {
            se(a), e.contentWindow.tryReconnect = function () {
              se(a), o(!1)
            }
          })
        }

        console.log("ifconfig result", n);
        var r = n.match("inet addr:(.*?) ");
        if (r || (r = n.match("wlan0: ip (.*?) ")), !r)return void m("Unable to switch to wireless mode. Is your Android connected to Wifi?");
        var c = r[1], a = c + ":5555";
        Je[e] = a, Ye[a] = e;
        var d = $e[a];
        return d && (d.id = e), Ye[e] && (device.id = Ye[e]), d && "device" == d.status ? void i() : (ce(e), void t.newSocket("tcpip:5555", function (e) {
          return e ? void l(e, function (e) {
            console.log("tcpip:5555 result", e), o(!0, function (e) {
              e && (console.error("host:connect failed, trying again in a few seconds", e), setTimeout(function () {
                o(!0, function (e) {
                  e && console.err("host:connect failed again, giving up.", e)
                })
              }, 3e3))
            })
          }) : void m("Failure while switching to wireless mode.")
        }))
      }) : void console.log("error running tcpip:5555")
    })
  }

  function ue() {
    Be || (Be = n(function () {
      Be = null, De && De.contentWindow.refreshList && De.contentWindow.refreshList($e, Le, Ne, Re, Oe, Ye, Je, _e && _e.isListening("share"), Fe, Ie.isRunning(), je)
    }))
  }

  function he() {
    chrome.storage.local.get("connect-automatically", function (e) {
      var t;
      t = e["connect-automatically"] === !1 ? 2 : e["connect-automatically"] === !0 ? 0 : e["connect-automatically"] || 0, Adb.devices(function (e) {
        if (e) {
          var n;
          $.each(e, function (o, i) {
            function r() {
              return "unauthorized" != s.status || (m("Vysor has detected an Android device. Please Allow USB Debugging on your Android device to continue."), !1)
            }

            n = !0;
            var s = e[o];
            Ye[o] && (s.id = Ye[o]);
            var c = $e[o];
            if (!c || s.status != c.status) {
              ne(o);
              var a = s.properties.indexOf("emulator") != -1 || s.properties.indexOf("vbox") != -1, d = j(o);
              if (!a && Ve && !Xe[d]) {
                if (chrome.app.window.get(d) || Ie.isRunning() || ze[d])return void(r() && K(o, !0));
                if (2 != t && r() && "device" == s.status) {
                  var l = chrome.runtime.getManifest().name;
                  return 1 != t ? (chrome.notifications.create("never-start-automatically", {
                    type: "basic",
                    iconUrl: "/icon.png",
                    title: l,
                    message: "Vysor has connected to an Android device and is starting.",
                    buttons: [{title: "Never Start Automatically"}]
                  }), void K(o, !0)) : void chrome.notifications.create("never-start-automatically-" + Math.random(), {
                    type: "basic",
                    iconUrl: "/icon.png",
                    title: l,
                    message: "Vysor has detected an Android device.",
                    buttons: [{title: "View Android with Vysor"}, {title: "Never Start Automatically"}]
                  }, function (e) {
                    var t = function (o) {
                      o == e && (chrome.notifications.onClosed.removeListener(t), chrome.notifications.onButtonClicked.removeListener(n))
                    }, n = function (t, n) {
                      t == e && (chrome.notifications.clear(t), 0 == n ? K(o, !0) : chrome.storage.local.set({"connect-automatically": !1}))
                    };
                    chrome.notifications.onClosed.addListener(t), chrome.notifications.onButtonClicked.addListener(n)
                  })
                }
              }
            }
          }), $e = e
        } else $e = {};
        ue(), Ve = !0
      })
    })
  }

  function fe() {
    if (!Fe) {
      if (isElectron()) {
        var e = require("os").platform(), t = chrome.runtime.getAppDirectory(),
          n = require("path").join(t, "native", e, "adb");
        return "win32" == e ? n += ".exe" : require("fs").chmodSync(n, "755"), console.log("attempting to start built in adb binary", n), void require("child_process").execFile(n, ["start-server"])
      }
      je || window.chrome && window.chrome.runtime && window.chrome.runtime.connectNative && (je = chrome.runtime.connectNative("com.clockworkmod.adb"), je.onDisconnect.addListener(function () {
        je = null
      }), je.postMessage({command: "start-server"}))
    }
  }

  function pe() {
    Ke || fe(), Ke = g(Ke, null, 1e4, fe)
  }

  function ve() {
    He = g(He, null, 300, function () {
      he()
    })
  }

  function ge() {
    function e(t) {
      t.read(function (n) {
        ve(), e(t)
      })
    }

    qe || (Adb.sendHostCommand("host:version", function (e, t) {
      e && (e.destroy(), t = s(t), console.log("ADB Server Version: ", t))
    }), Adb.sendHostCommand("host:track-devices", function (t) {
      return qe ? void t.destroy() : void(t && (console.log("Connected to ADB Server"), Ie.isRunning() ? console.log("Using Vysor ADB") : console.log("Using Android SDK ADB"), Fe = !0, t.onClose = function () {
        qe = null, Fe = !1, ve()
      }, qe = t, e(t), ve()))
    }))
  }

  function me() {
    ge(), pe(), setTimeout(me, 1e3)
  }

  function ye() {
    Ge = g(Ge, null, 1e4, function () {
      var e = chrome.runtime.getManifest().name;
      chrome.notifications.create("reload", {
        type: "basic",
        iconUrl: "/icon.png",
        title: e,
        message: "There is an update available for Vysor.",
        buttons: [{title: "Reload"}]
      })
    })
  }

  var we = "\n".charCodeAt(0),
    be = ((new Date).getTime(), "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"), ke = "=";
  String.prototype.startsWith || Object.defineProperty(String.prototype, "startsWith", {
    enumerable: !1,
    configurable: !1,
    writable: !1,
    value: function (e, t) {
      return t = t || 0, this.lastIndexOf(e, t) === t
    }
  }), Object.fromArray = function (e) {
    var t = {};
    for (var n in e) {
      var o = e[n];
      t[o] = o
    }
    return t
  }, $.ajaxTransport("+binary", function (e, t, n) {
    if (window.FormData && (e.dataType && "binary" == e.dataType || e.data && (window.ArrayBuffer && e.data instanceof ArrayBuffer || window.Blob && e.data instanceof Blob)))return {
      send: function (t, n) {
        var o = new XMLHttpRequest, i = e.url, r = e.type, s = e.async || !0, c = e.responseType || "blob",
          a = e.data || null, d = e.username || null, l = e.password || null;
        o.addEventListener("load", function () {
          var t = {};
          t[e.dataType] = o.response, n(o.status, o.statusText, t, o.getAllResponseHeaders())
        }), o.open(r, i, s, d, l);
        for (var u in t)o.setRequestHeader(u, t[u]);
        o.responseType = c, o.send(a)
      }, abort: function () {
        n.abort()
      }
    }
  });
  var Ce = function () {
    var e = {};
    return function (t, n) {
      if (e[t])return void n(e[t]);
      var o = new XMLHttpRequest;
      o.open("GET", t, !0), o.responseType = "blob", o.onload = function (o) {
        n(e[t] = window.URL.createObjectURL(this.response))
      }, o.send()
    }
  }();
  !function () {
    function*e() {
    }

    var t = e();
    t.constructor.prototype.async = function () {
      function e() {
        i = o.throw(new Error(arguments)), n()
      }

      function t() {
        var e = arguments[0];
        i = o.next(e), n()
      }

      function n(n) {
        var r, s;
        if (!i.done) {
          if (!i.value)return void(i = o.next(t));
          if (i.value.constructor == Promise)return void i.value.then(t).catch(e);
          if (i.value == Error) r = !0, i = o.next(e); else {
            if (i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");
            s = !0, i = o.next(t)
          }
          if (!i.value)throw new Error("Double yield callbacks must explicitly define both Error and Success");
          if (i.value == Error && r)throw new Error("Error callback already defined");
          if (i.value == y && s)throw new Error("Success callback already defined");
          if (i.value != Error && i.value != y)throw new Error("Unexpected yield value for callback. Only Error and Success allowed.");
          i = r ? o.next(t) : o.next(e)
        }
      }

      var o = this, i = o.next();
      i.done || n()
    }
  }(), window.isElectron = function () {
    return navigator.userAgent.indexOf("Electron") != -1
  }, isElectron() || (window.sharedGlobals = window), function () {
    function e(e) {
      try {
        for (var t in e)e[t] && e[t].constructor != String && (e[t] = JSON.stringify(e[t]));
        i += e.join(" ") + "\n"
      } catch (e) {
      }
    }

    function t(e) {
      return new Promise(function (t, n) {
        return e.getConsoleLog ? void e.getConsoleLog(function (e) {
          t({content: e && e.length ? e : "log is empty"})
        }) : void t("getConsoleLog not found")
      })
    }

    var n = console.log, o = console.error, i = "";
    console.error = function () {
      o.apply(console, arguments), e(Array.prototype.slice.call(arguments))
    }, console.log = function () {
      n.apply(console, arguments), e(Array.prototype.slice.call(arguments))
    }, sharedGlobals.getConsoleLog = function (e) {
      e(i)
    }, window.gistConsoleLog = function (e, n) {
      chrome.runtime.getBackgroundPage(function (o) {
        t(o).then(function (n) {
          e["background.txt"] = n;
          var o = chrome.app.window.getAll(), i = o.map(function (n) {
            return t(n.contentWindow).then(function (t) {
              e["window-" + n.id + ".txt"] = t
            })
          });
          return Promise.all(i)
        }).then(function () {
          var t = {description: chrome.runtime.getManifest().name + " console log", public: !1, files: e};
          fetch("https://api.github.com/gists", {method: "POST", body: JSON.stringify(t)}).then(function (e) {
            e.json().then(function (e) {
              n(e.html_url)
            })
          })
        })
      })
    }
  }(), function () {
    function e(e) {
      this.buffer = new ArrayBuffer(e), this.dataView = new DataView(this.buffer), this.uint8array = new Uint8Array(this.buffer), this.littleEndian = !1, this.position = 0, this.limit = e, this.capacity = e
    }

    function t(t, n) {
      var o = 8 * n, i = t + o, r = "get" + i, s = "set" + i, c = "put" + i;
      e.prototype[r] = function () {
        if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");
        var e = this.dataView[r](this.position, this.littleEndian);
        return this.position += n, e
      }, e.prototype[c] = function (e) {
        if (this.position + n > this.limit)throw new Error("Not enough room in byte buffer");
        if (null == e || void 0 == e || NaN == e || e.constructor != Number)throw new Error("no value provided");
        return this.dataView[s](this.position, e, this.littleEndian), this.position += n, this
      }
    }

    e.prototype.flip = function () {
      this.limit = this.position, this.position = 0
    }, e.prototype.asUint8Array = function () {
      return this.uint8array.subarray(this.position, this.limit)
    };
    var n = {Int: [1, 2, 4], Uint: [1, 2, 4], Float: [4, 8]};
    for (var o in n) {
      var i = n[o];
      for (var r in i) {
        var r = i[r];
        t(o, r)
      }
    }
    e.prototype.put = function (e) {
      if (e.constructor == Number)return this.putInt8(e);
      if (e.constructor == String && (e = c(e)), e.constructor == ArrayBuffer && (e = new Uint8Array(e)), this.position + e.byteLength > this.limit)throw new Error("Not enough room in byte buffer");
      return this.uint8array.set(e, this.position), this.position += e.byteLength, this
    }, e.prototype.putByte = e.prototype.putInt8, e.prototype.putShort = e.prototype.putInt16, e.prototype.putInt = e.prototype.putInt32, e.prototype.putFloat = e.prototype.putFloat32, e.prototype.putDouble = e.prototype.putFloat64, window.ByteBuffer = e
  }(), window.chrome && window.chrome.sockets && (chrome.sockets.tcp.onReceive.addListener(function (e) {
    var t = Socket.readers[e.socketId];
    null != t && t.dataReceived(new Uint8Array(e.data))
  }), chrome.sockets.tcp.onReceiveError.addListener(function (e) {
    var t = Socket.readers[e.socketId];
    null != t && (t.destroy(), t.dataReceived(null))
  }), chrome.sockets.tcpServer.onAccept.addListener(function (e) {
    chrome.sockets.tcp.setPaused(e.clientSocketId, !1);
    var t = Server.listeners[e.socketId];
    null != t && t(new Socket({socketId: e.clientSocketId}))
  })), function () {
    function e(t, n) {
      if (t.socketId) this.socketId = t.socketId, e.readers[this.socketId] = this; else if (window.chrome && window.chrome.sockets) chrome.sockets.tcp.create(function (o) {
        this.socketId = o.socketId, chrome.sockets.tcp.connect(this.socketId, t.host, t.port, function (t) {
          t ? (chrome.runtime.lastError, this.destroy(), n(null)) : (e.readers[o.socketId] = this, n(this))
        }.bind(this))
      }.bind(this)); else {
        var o;
        t.ns ? (this.ns = t.ns, o = !0) : (this.ns = new require("net").Socket(), this.ns.connect({
          port: t.port,
          host: t.host
        }, function () {
          o = !0, n(this)
        }.bind(this))), this.ns.on("close", function () {
          this.destroy(), o || n(null)
        }.bind(this)), this.ns.on("data", function (e) {
          this.dataReceived(e)
        }.bind(this))
      }
    }

    function t() {
    }

    e.readers = {}, e.connect = function (t, n) {
      return new e(t, n)
    }, e.pump = function (e, t, n) {
      if (!e || !t)return console.error("Socket.pump called with null socket", e, t), void n();
      var o = function () {
        e.read(i)
      }.bind(e), i = function (e) {
        var n = e.buffer;
        (e.byteOffset || e.length != n.byteLength) && (n = n.slice(e.byteOffset, e.byteOffset + e.length)), t.write(n, o)
      }.bind(t);
      e.read(i), e.onClose = n
    }, e.stream = function (t, n, o) {
      e.pump(t, n, function () {
        if (n && n.destroy(), o) {
          var e = o;
          o = null, e()
        }
      }), e.pump(n, t, function () {
        if (t && t.destroy(), o) {
          var e = o;
          o = null, e()
        }
      })
    }, e.eat = function (e) {
      function t() {
        e.read(t)
      }

      t()
    }, e.prototype.read = function () {
      if (this.pendingCallback)throw new Error("double callback");
      if (this.closed && !this.pending) {
        var e = this.onClose;
        return void(e && (delete this.onClose, e()))
      }
      var t = 0;
      "Number" == arguments[t].constructor.name ? this.pendingLength = arguments[t++] : this.pendingLength = 0;
      var e = arguments[t];
      if (!this.pending || this.paused)return void(this.pendingCallback = e);
      if (this.pendingLength) {
        if (this.pendingLength > this.buffered())return void(this.pendingCallback = e)
      } else this.pendingLength = this.buffered();
      for (var n, o = 0; o < this.pendingLength;) {
        var i = this.pending.shift();
        this.bufferedLength -= i.length, this.pending.length || delete this.pending;
        var r = i, s = Math.min(r.byteLength, this.pendingLength - o);
        if (s != r.byteLength) {
          var c = r.subarray(0, s), a = r.subarray(s);
          this.unshift(a), r = c;
        }
        n || r.byteLength == this.pendingLength || (n = new Uint8Array(this.pendingLength)), n ? n.set(r, o) : n = r, o += r.byteLength
      }
      e(n)
    }, e.prototype.write = function (e, t) {
      if (this.pendingWrite && console.error("write is already in progress!"), null == t && (console.error("write callback is null?"), t = function () {
        }), this.pendingWrite = t, window.chrome && window.chrome.sockets) chrome.sockets.tcp.send(this.socketId, e, function (n) {
        return chrome.runtime.lastError, !n || n.resultCode ? void delete this.pendingWrite : void(n.bytesSent < e.byteLength ? this.write(e.slice(n.bytesSent), t) : (delete this.pendingWrite, t()))
      }.bind(this)); else {
        if (!this.ns)return;
        if (!e.byteLength)return void require("process").nextTick(function () {
          delete this.pendingWrite, t()
        }.bind(this));
        const n = window.Buffer || require("buffer").Buffer;
        this.ns.write(n.from(e), function () {
          delete this.pendingWrite, t()
        }.bind(this))
      }
    }, e.prototype.destroy = function (e, t) {
      window.chrome && window.chrome.sockets ? chrome.sockets.tcp.close(this.socketId, function () {
        chrome.runtime.lastError
      }) : (this.dataReceived(null), this.ns && (this.ns.destroy(), delete this.ns))
    }, e.prototype.unshift = function (e) {
      0 != e.byteLength && (this.pending ? this.pending.unshift(e) : this.pending = [e], this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length)
    }, e.prototype.dataReceived = function (e) {
      if (e && (e.asUint8Array && (e = e.asUint8Array()), e.constructor == ArrayBuffer && (e = new Uint8Array(e))), e && e.length) {
        var t = new Uint8Array(e);
        this.pending ? this.pending.push(t) : this.pending = [t]
      }
      if (null == e ? this.closed = !0 : (this.bufferedLength || (this.bufferedLength = 0), this.bufferedLength += e.length), this.paused || !this.pending || !this.pending.length) {
        var n = this.onClose;
        return void(this.closed && n && (delete this.onClose, n()))
      }
      var o = this.pendingLength, n = this.pendingCallback;
      n && (delete this.pendingCallback, this.read(o, n))
    }, e.prototype.buffered = function () {
      return this.bufferedLength
    }, e.prototype.pause = function () {
      this.paused || (this.paused = !0, this.onPause())
    }, e.prototype.resume = function () {
      this.paused && (this.paused = !1, this.onResume())
    }, e.prototype.onResume = function () {
      chrome.sockets.tcp.setPaused(this.socketId, !1, function () {
      })
    }, e.prototype.onPause = function () {
      chrome.sockets.tcp.setPaused(this.socketId, !0, function () {
      })
    }, t.listeners = {}, t.prototype.__proto__ = e.prototype, t.prototype.destroy = function () {
      window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.close(this.socketId, function () {
        chrome.runtime.lastError
      }) : this.ns && (this.ns.close(), delete this.ns)
    }, t.prototype.listen = function (n, o, i) {
      var r, s;
      "Number" == n.constructor.name ? (r = n, s = "0.0.0.0") : (s = n.address, r = n.port), window.chrome && window.chrome.sockets ? chrome.sockets.tcpServer.create(function (e) {
        this.socketId = e.socketId, t.listeners[this.socketId] = o, chrome.sockets.tcpServer.listen(e.socketId, s, r, function (e) {
          return chrome.runtime.lastError, e ? (this.destroy(), void(i && i(e))) : void chrome.sockets.tcpServer.getInfo(this.socketId, function (t) {
            this.localAddress = t.localAddress, this.localPort = t.localPort, i && i(e)
          }.bind(this))
        }.bind(this))
      }.bind(this)) : (this.ns = require("net").createServer(function (t) {
        o(new e({ns: t}))
      }.bind(this)), this.ns.on("close", function () {
        this.destroy()
      }.bind(this)), this.ns.on("error", function (e) {
        i && i(e)
      }.bind(this)), this.ns.on("listening", function () {
        var e = this.ns.address();
        this.localAddress = e.address, this.localPort = e.port, i && i()
      }.bind(this)), this.ns.listen({port: r, host: s}))
    }, window.Socket = e, window.Server = t
  }(), function () {
    function e() {
    }

    function t(e) {
      this.request = e, this.statusLine = "HTTP/1.1 200 OK", this.headers = {Date: (new Date).toUTCString()}
    }

    function n(e, n, o) {
      this.server = e, this.socket = n, this.headers = {}, this.parseRequest(function () {
        o(this, new t(this))
      }.bind(this))
    }

    e.prototype.listen = function (e, t, n) {
      this.socket = new Server, this.requestCallback = t, this.socket.listen(e, this.onSocket.bind(this), n)
    }, e.prototype.onSocket = function (e) {
      new n(this, e, this.requestCallback)
    }, e.prototype.destroy = function () {
      this.socket.destroy()
    }, t.prototype.code = function (e) {
      this.statusLine = "HTTP/1.1 " + e + " " + HttpResponseCodes[e]
    }, t.prototype.write = function (e, t) {
      if (e.constructor.name == Object.prototype.constructor.name && (e = JSON.stringify(e)), e.constructor.name == String.prototype.constructor.name && (e = c(e)), !this.hasWritten) {
        this.hasWritten = !0, this.headers["Content-Length"] || "close" == this.headers.Connection || (this.headers["Content-Length"] = e.byteLength);
        var n = [this.statusLine];
        for (var o in this.headers)n.push(o + ": " + this.headers[o]);
        var i = n.join("\r\n") + "\r\n\r\n";
        return void this.request.socket.write(c(i), function () {
          this.write(e, t)
        }.bind(this))
      }
      this.request.socket.write(e, t)
    }, t.prototype.end = function () {
      "close" == this.headers.Connection ? this.request.socket.destroy() : this.request.server.onSocket(this.request.socket), this.request.socket = null
    }, n.prototype.parseRequest = function (e) {
      var t = function () {
        d(this.socket, function (n) {
          if (n = n.trim(), !n.length) {
            var o = this.headers["content-length"];
            return o ? (o = Number.parseInt(o), void this.socket.read(o, function (t) {
              this.body = t, "application/json" === this.headers["content-type"] && (this.body = JSON.parse(s(this.body))), e()
            }.bind(this))) : void e()
          }
          if (this.statusLine) {
            var i = n.split(":", 2);
            2 == i.length && (this.headers[i[0].toLowerCase()] = i[1].trim())
          } else {
            this.statusLine = n;
            var i = n.split(" ");
            if (i.length > 2 && (i = i[1].split("?"), this.path = i[0], this.queries = {}, i.length > 1))for (var r = this.query = i[1], c = r.split("&"), a = 0; a < c.length; a++) {
              var d, l = c[a].split("="), u = l[0];
              l.length > 1 && (d = l[1]), this.queries[u] = d
            }
          }
          t()
        }.bind(this))
      }.bind(this);
      t()
    }, window.HttpRequestParser = n, window.HttpServer = e, window.HttpResponseCodes = {
      200: "OK",
      202: "Accepted",
      206: "Partial Content",
      101: "Switching Protocols",
      301: "Moved Permanently",
      302: "Found",
      402: "Payment Required",
      404: "Not Found"
    }
  }(), b.prototype.write = function (e, t) {
    throw new Error("write not supported on dummy socket")
  }, b.prototype.destroy = function () {
    this.dataReceived(null)
  }, b.prototype.buffered = Socket.prototype.buffered, b.prototype.unshift = Socket.prototype.unshift, b.prototype.dataReceived = Socket.prototype.dataReceived, b.prototype.read = Socket.prototype.read, b.prototype.pause = Socket.prototype.pause, b.prototype.resume = Socket.prototype.resume, b.prototype.buffered = Socket.prototype.buffered, b.prototype.onPause = function () {
  }, b.prototype.onResume = function () {
  }, k.connect = function (e, t) {
    new k(e, t)
  }, k.prototype.write = function (e, t) {
    throw new Error("write not supported on fetch socket")
  }, k.prototype.destroy = function () {
    this.promise && this.promise.cancel && this.promise.cancel()
  }, k.prototype.unshift = Socket.prototype.unshift, k.prototype.dataReceived = Socket.prototype.dataReceived, k.prototype.read = Socket.prototype.read, k.prototype.pause = Socket.prototype.pause, k.prototype.resume = Socket.prototype.resume, k.prototype.buffered = Socket.prototype.buffered, k.prototype.onPause = function () {
  }, k.prototype.onResume = function () {
    this.reader.read().then(function (e) {
      e.value && (this.dataReceived(e.value), this.paused || this.onResume())
    }.bind(this))
  }, function () {
    function e(e, t) {
      this.conn = e, this.dc = t, this.gotEof = !1, t.onmessage = function (e) {
        var t = new Uint8Array(e.data), n = 1 == t[t.byteLength - 1];
        this.dataReceived(t.subarray(0, t.byteLength - 1)), n && (this.gotEof = !0, this.destroy())
      }.bind(this), t.onclose = t.onerror = this.destroy.bind(this), this.needsBufferShim = !0
    }

    function t(e, t, n) {
      this.manager = e, this.pc = t, this.key = n, this.pc.oniceconnectionstatechange = function () {
        "new" != this.pc.iceConnectionState && "checking" != this.pc.iceConnectionState && delete e.gcmRtcConnections[n], "disconnected" != this.pc.iceConnectionState && "closed" != this.pc.iceConnectionState || this.destroy()
      }.bind(this)
    }

    function n(e, t, n) {
      this.senders = e, this.registrationId = t, this.rtcc = n, this.gcmRtcConnections = {}, this.gcmRtcListeners = {}
    }

    e.prototype.buffered = Socket.prototype.buffered, e.prototype.unshift = Socket.prototype.unshift, e.prototype.dataReceived = Socket.prototype.dataReceived, e.prototype.read = Socket.prototype.read, e.prototype.pause = Socket.prototype.pause, e.prototype.resume = Socket.prototype.resume, e.prototype.buffered = Socket.prototype.buffered, e.prototype.writeable = function () {
      var e = this.writeCallback;
      e && (delete this.writeCallback, e())
    }, e.prototype.write = function (e, t) {
      if (!this.dc || "open" != this.dc.readyState)return void this.destroy();
      this.writeCallback = t;
      var n = new Uint8Array(e.byteLength + 1);
      if (n.set(new Uint8Array(e)), this.dc.send(n.buffer), !this.reentrantWrite)try {
        for (this.reentrantWrite = !0; this.writeCallback && (0 == this.dc.bufferedAmount || this.needsBufferShim);)this.writeable()
      } finally {
        this.reentrantWrite = !1
      }
    }, e.prototype.destroy = function () {
      if (this.dataReceived(null), null != this.dc) {
        var e = this.dc;
        if (this.dc = null, e.onclose = null, e.onerror = null, "open" == e.readyState)try {
          e.send(new Uint8Array([1])), this.gotEof ? this.conn.recycleChannel(e) : this.conn.waitForEof(e)
        } catch (e) {
        }
      }
    }, t.prototype.waitForCommand = function (t) {
      t.onmessage = function (n) {
        if (1 != n.data.byteLength) {
          this.removeChannel(t);
          var o = s(n.data), i = new e(this, t);
          this.openSocket(o, i)
        }
      }.bind(this)
    }, t.prototype.compactChannels = function () {
      this.inboundChannels && !this.inboundChannels.length && (this.inboundChannels = null), this.outboundChannels && !this.outboundChannels.length && (this.outboundChannels = null)
    }, t.prototype.getAppropriateChannels = function (e, t) {
      var n;
      return e.inbound ? (!this.inboundChannels && t && (this.inboundChannels = []), n = this.inboundChannels) : (!this.outboundChannels && t && (this.outboundChannels = []), n = this.outboundChannels), n
    }, t.prototype.removeChannel = function (e) {
      if (channels = this.getAppropriateChannels(e), channels) {
        var t = channels.indexOf(e);
        t != -1 && (channels.splice(t, 1), this.compactChannels())
      }
    }, t.prototype.waitForEof = function (e) {
      e.onmessage = function (t) {
        var n = new Uint8Array(t.data), o = 1 == n[n.byteLength - 1];
        o && this.recycleChannel(e)
      }.bind(this)
    }, t.prototype.recycleChannel = function (e) {
      var t = this.getAppropriateChannels(e, !0);
      t.push(e), e.onclose = e.onerror = function () {
        this.removeChannel(e)
      }.bind(this), this.waitForCommand(e)
    }, t.prototype.addCandidates = function (e) {
      for (var t in e.candidates)this.pc.addIceCandidate(new RTCIceCandidate(e.candidates[t]))
    }, t.prototype.setupPinger = function (e) {
      function t() {
        e.send(c("ping")), n = setTimeout(t, 1e3)
      }

      var n;
      e.onmessage = function (e) {
      }, e.onclose = e.onerror = function () {
        clearTimeout(n), this.destroy()
      }.bind(this), t()
    }, t.prototype.listenSockets = function () {
      this.pc.ondatachannel = function (e) {
        e.channel.inbound = !0, this.waitForCommand(e.channel)
      }.bind(this)
    }, t.prototype.prepareChannel = function (e) {
      var t = this.pc.createDataChannel(e || "gcm", {reliable: !0, ordered: !0});
      return t.binaryType = "arraybuffer", t
    }, t.prototype.newSocket = function (t, n) {
      if ("closed" == this.pc.signalingState)return void n();
      if (this.outboundChannels) {
        var o = this.outboundChannels.shift();
        this.compactChannels(), o.send(c(t));
        var i = new e(this, o);
        return void n(i, this)
      }
      var o = this.prepareChannel("gcm");
      o.onopen = function () {
        o.send(c(t));
        var i = new e(this, o);
        n(i, this)
      }.bind(this)
    }, t.prototype.destroy = function () {
      delete this.manager.gcmRtcConnections[this.key], "closed" != this.pc.signalingState && this.pc.close();
      var e = this.onClose;
      e && (delete this.onClose, e())
    }, n.prototype.onMessage = function (e) {
      var t = JSON.parse(e.message), o = e.type, i = e.senderId, r = e.src, s = e.srcPort, c = e.dstPort;
      if ("offer" == o) {
        var a = this.gcmRtcListeners[c];
        return void(a ? a.listener.incoming(i, r, s, c, t, a.listenCallback) : console.log("not listening on " + c))
      }
      if ("answer" == o) {
        var d = n.getKey(r, s, c), l = this.gcmRtcConnections[d];
        return l ? void l.manager.incoming(i, r, s, c, t) : void console.log("pending connection not found")
      }
      n.onUnknownMessage ? n.onUnknownMessage(e) : console.log("unknown message " + o)
    }, n.hasLoadedChannels = !1, n.start = function (e, t, o) {
      if (console.log("starting GtcRtcManger"), window.chrome && window.chrome.gcm) {
        var i = Object.keys(e);
        chrome.gcm.register(i, function (i) {
          if (chrome.runtime.lastError, !i)return void o();
          var r = new n(e, i, t);
          chrome.gcm.onMessage.addListener(function (e) {
            r.onMessage(e.data)
          }), o(r)
        })
      } else {
        var r = new n(e, null, t);
        $.getScript("https://push.clockworkmod.com/socket.io/socket.io.js", function () {
          var e = io("https://push.clockworkmod.com");
          e.on("registration", function (e) {
            e = "web:" + e, r.registrationId ? (r.registrationId = e, r.onRegistrationIdChanged && r.onRegistrationIdChanged(e)) : (r.registrationId = e, o(r))
          }), e.on("data", function (e) {
            r.onMessage(e)
          })
        })
      }
    }, n.prototype.ensureChannel = function () {
      function e() {
        return delete n.channelPromise, n.gcmRtcConnections = {}, n.channel && (delete n.channel, !Object.keys(n.gcmRtcListeners).length) ? void console.log("not reconnecting, no listeners") : void t()
      }

      function t() {
        console.error("scheduling gcm reconnect"), n.reconnectTimeout = g(n.reconnectTimeout, null, 3e5, function () {
          console.error("reconnecting gcm"), n.ensureChannel()
        })
      }

      if (this.channel)return Promise.resolve();
      var n = this;
      return this.channelPromise ? this.channelPromise : this.channelPromise = new Promise(function (o, i) {
        $.ajax({
          type: "GET", url: "https://vysor-1026.appspot.com/listen", error: function () {
            delete n.channelPromise, console.error("error ensuring gcm channe", error), t()
          }, success: function (t) {
            var i = new goog.appengine.Channel(t.token), r = {
              onopen: function () {
                n.channel = i;
                var e = "web:" + t.channel;
                n.registrationId = e, n.onRegistrationIdChanged && n.onRegistrationIdChanged(e), o()
              }, onmessage: function (e) {
                n.onMessage(JSON.parse(e.data))
              }, onerror: function () {
                console.error("gcm onerror", arguments), e()
              }, onclose: function () {
                console.error("gcm onclose", arguments), e()
              }
            };
            i.open(r)
          }
        })
      })
    }, n.prototype.sendGcm = function (e, t, n, o, i, r) {
      e || (e = this.defaultSenderId), t.startsWith("web:") ? $.ajax({
        type: "POST",
        url: "https://vysor-1026.appspot.com/send",
        data: JSON.stringify({
          channel: t.substring(4),
          data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}
        }),
        contentType: "application/json",
        dataType: "json",
        success: function () {
        }
      }) : $.ajax({
        type: "POST",
        url: "https://gcm-http.googleapis.com/gcm/send",
        headers: {Authorization: "key=" + this.senders[e]},
        data: JSON.stringify({
          to: t,
          data: {senderId: e, src: this.registrationId, srcPort: o, dstPort: n, type: i, message: JSON.stringify(r)}
        }),
        contentType: "application/json",
        dataType: "json",
        error: function () {
          console.log("gcm error", arguments)
        },
        success: function () {
          console.log("gcm", arguments)
        }
      })
    }, n.getKey = function (e, t, n) {
      return n + ":" + t + ":" + e
    }, n.prototype.setupPeerConnection = function (e, o, i, r, s, c) {
      var a, d = window.RTCPeerConnection || window.webkitRTCPeerConnection, l = new d(this.rtcc), u = function (t) {
        var n = [];
        for (var a in t)a = t[a], n.push(a), JSON.stringify(n).length > 3200 && (this.sendGcm(o, i, r, s, e, {
          desc: c(),
          candidates: n
        }), n = []);
        n.length > 0 && this.sendGcm(o, i, r, s, e, {desc: c(), candidates: n})
      }.bind(this);
      l.onicecandidate = function (e) {
        null != e.candidate && (console.log(e.candidate), a = g(a, e.candidate, 500, u))
      }.bind(this);
      var h = n.getKey(i, r, s), f = new t(this, l, h);
      return l.onsignalingstatechange = function (e) {
        "stable" == l.signalingState ? this.gcmRtcConnections[h] == f : "closed" == l.signalingState && f.destroy()
      }.bind(this), this.gcmRtcConnections[h] = f, f
    }, n.gcmPortCount = 0, n.prototype.connect = function (e, t) {
      function o(e) {
        l.createOffer(e).then(function (e) {
          i = e, l.setLocalDescription(e)
        })
      }

      var i, r = e.senderId, s = e.registrationId, c = e.port, a = n.gcmPortCount++,
        d = this.setupPeerConnection("offer", r, s, c, a, function () {
          return i
        }), l = d.pc;
      if (e.audio) navigator.webkitGetUserMedia({audio: !0, video: !1}, function (e) {
        l.addStream(e), l.onaddstream = function (e) {
          console.log("got the remote stream"), t(d, e)
        }, o({offerToReceiveAudio: !0, offerToReceiveVideo: !1, voiceActivityDetection: !1})
      }, function () {
        console.error("audio fail", arguments), o({
          offerToReceiveAudio: !0,
          offerToReceiveVideo: !1,
          voiceActivityDetection: !1
        })
      }); else {
        var u = d.prepareChannel("pinger");
        u.onopen = function () {
          console.log("got rtc pinger"), d.setupPinger(u), t(d)
        }, d.listenSockets(), o({})
      }
    }, n.prototype.isListening = function (e) {
      return null != this.gcmRtcListeners[e]
    }, n.prototype.stopListen = function (e) {
      delete this.gcmRtcListeners[e]
    }, n.prototype.listen = function (e, t) {
      return this.gcmRtcListeners[e] ? void console.log("already listening on gcm port " + e) : void(this.gcmRtcListeners[e] = {
        listener: this,
        listenCallback: t
      })
    }, n.prototype.incoming = function (e, t, o, i, r, s) {
      var c = n.getKey(t, o, i), a = this.gcmRtcConnections[c];
      if (a) {
        if (!a.remoteDesc) {
          a.remoteDesc = new RTCSessionDescription(r.desc);
          var d = a.pc;
          d.setRemoteDescription(a.remoteDesc)
        }
      } else {
        var l;
        a = this.setupPeerConnection("answer", e, t, o, i, function () {
          return l
        }), a.remoteDesc = new RTCSessionDescription(r.desc);
        var d = a.pc;
        d.ondatachannel = function (e) {
          console.log("got rtc pinger"), this.setupPinger(e.channel), s(a), this.listenSockets()
        }.bind(a), d.setRemoteDescription(a.remoteDesc, function () {
          d.createAnswer().then(function (e) {
            l = e, d.setLocalDescription(e)
          }, function () {
            console.error("answer error", arguments)
          })
        })
      }
      a.addCandidates(r)
    }, window.GcmRtcSocket = e, window.GcmRtcManager = n
  }(), function () {
    function e(e, t) {
      this.handle = e, this.iface = t, this.type = "usb";
      for (var n in t.endpoints)n = t.endpoints[n], "bulk" == n.type && (this.zero_mask = n.maximumPacketSize - 1, "in" == n.direction ? this.in = n : this.out = n)
    }

    function t(e) {
      this.socket = e, this.zero_mask = (1 << 30) - 1, this.type = "tcp", e.onClose = function () {
        var e = this.currentRead;
        e && (delete this.currentRead, e({resultCode: -1}))
      }.bind(this)
    }

    function n(e, t) {
      this.onConnected = t, this.transport = e, this.currentSocketId = 0, this.sockets = {}, this.forwards = {}, this.maxPayload = n.MAX_PAYLOAD
    }

    function i(e) {
      var t = {};
      "String" != e.constructor.name && (e = s(e));
      var n = e.replace("device::", "").split(";");
      for (var o in n) {
        o = n[o];
        var i = o.split("=");
        2 == i.length && (t[i[0]] = i[1])
      }
      return t
    }

    function r(e, t, n) {
      n || (n = function () {
      }), this.device = e, this.localId = t, this.onConnected = n
    }

    function a(t, o, i) {
      console.log("connecting");
      var r = new n(new e(t, o), i);
      console.log("sending CNXN"), r.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), console.log("starting receive loop"), r.receiveMessages()
    }

    function d(e) {
      var e = e || {}, t = e.port || 5037, n = e.start !== !1;
      this.currentSocketId = 0, this.pendingDevices = {}, this.port = t, this.adbDevices = {}, this.clients = {}, n && this.start()
    }

    function u() {
      return (new Date).getTime()
    }

    function f(e, t) {
      this.server = e, this.socket = t
    }

    e.prototype.destroy = function () {
      chrome.usb.releaseInterface(this.handle, this.iface.interfaceNumber, function () {
        chrome.runtime.lastError, chrome.usb.closeDevice(this.handle, function () {
          chrome.runtime.lastError
        })
      }.bind(this))
    }, e.prototype.write = function (e, t) {
      if (this.writing)return this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({
        data: e,
        callback: t
      });
      var n = {direction: "out", endpoint: this.out.address, data: e};
      this.writing = !0, chrome.usb.bulkTransfer(this.handle, n, function (e) {
        if (chrome.runtime.lastError, this.writing = !1, t(e), this.pendingWrites) {
          var n = this.pendingWrites.shift();
          this.pendingWrites.length || (this.pendingWrites = null), this.write(n.data, n.callback)
        }
      }.bind(this))
    }, e.prototype.read = function (e, t) {
      var n = {direction: "in", endpoint: this.in.address, length: e};
      chrome.usb.bulkTransfer(this.handle, n, function (e) {
        chrome.runtime.lastError, t(e)
      })
    }, t.prototype.destroy = function () {
      this.socket.destroy()
    }, t.prototype.write = function (e, t) {
      return this.writing ? (this.pendingWrites || (this.pendingWrites = []), void this.pendingWrites.push({
        data: e,
        callback: t
      })) : (this.writing = !0, void this.socket.write(e, function () {
        if (this.writing = !1, t({resultCode: 0}), this.pendingWrites) {
          var e = this.pendingWrites.shift();
          this.pendingWrites.length || (this.pendingWrites = null), this.write(e.data, e.callback)
        }
      }.bind(this)))
    }, t.prototype.read = function (e, t) {
      this.currentRead = t, this.socket.read(e, function (e) {
        delete this.currentRead, t({resultCode: 0, data: e.buffer.slice(e.byteOffset, e.byteOffset + e.byteLength)})
      })
    }, n.prototype.fatal = function (e) {
      console.log("fatal error", JSON.stringify(e));
      var t = this.onConnected;
      t ? (delete this.onConnected, t()) : this.onError && (this.onError(), delete this.onError), this.destroy()
    }, n.prototype.destroy = function () {
      for (var e in this.sockets)e = this.sockets[e], e.dataReceived(null);
      this.forwards && $.each(this.forwards, function (e, t) {
        t.destroy()
      }), this.transport.destroy()
    }, n.kCommandSYNC = 1129208147, n.kCommandCNXN = 1314410051, n.kCommandOPEN = 1313165391, n.kCommandOKAY = 1497451343, n.kCommandCLSE = 1163086915, n.kCommandWRTE = 1163154007, n.kCommandAUTH = 1213486401, n.kAuthToken = 1, n.kAuthSignature = 2, n.kAuthRSAPublicKey = 3, n.ADB_PROTOCOL_VERSION = 16777216, n.ADB_VERSION = 39, n.MAX_PAYLOAD = 4096, n.checksum = function (e) {
      e = new Uint8Array(e);
      for (var t = 0, n = 0; n < e.byteLength; n++)t += e[n];
      return 4294967295 & t
    }, n.prototype.sendMessage = function (e, t, o, i, r) {
      i || (i = ""), "String" == i.constructor.name && (i = c(i));
      var s = !0;
      i.byteLength || (s = !1), e == n.kCommandAUTH && t == n.kAuthSignature && (s = !1), e == n.kCommandWRTE && (s = !1);
      var a = i.byteLength;
      if (s && a++, s) {
        var d = new ArrayBuffer(i.byteLength + 1), l = new Uint8Array(d);
        l.set(new Uint8Array(i)), l[d.byteLength - 1] = 0, i = d
      }
      var u = new ArrayBuffer(24), l = new DataView(u);
      l.setUint32(0, e, !0), l.setUint32(4, t, !0), l.setUint32(8, o, !0), l.setUint32(12, a, !0), l.setUint32(16, n.checksum(i), !0), l.setUint32(20, 4294967295 ^ e, !0), this.transport.write(u, function (e) {
        e.resultCode && this.fatal(e), !i.byteLength && r && r()
      }.bind(this)), i.byteLength && this.transport.write(i, function (e) {
        e.resultCode && this.fatal(e), r && r()
      }.bind(this))
    }, n.prototype.getKey = function (e) {
      chrome.storage.local.get("adbkey", function (t) {
        var n = t.adbkey, o = new JSEncrypt({default_key_size: 2048});
        n ? o.setPrivateKey(n) : (n = o.getPrivateKeyB64(), o.setPrivateKey(n), chrome.storage.local.set({adbkey: n})), e(o)
      })
    }, n.prototype._convertToMinCrypt = function (e) {
      var t = 2048, n = t / 8 / 4, o = BigInteger.ONE.shiftLeft(32), i = e.n.clone(),
        r = BigInteger.ONE.shiftLeft(1).pow(t), s = r.multiply(r).mod(i), c = new Uint32Array(3 + 2 * n);
      c[0] = n, c[1] = o.subtract(i.modInverse(o)).intValue();
      for (var a = n + 2, d = 2, l = 2 + n; d < a; ++d, ++l)c[d] = i.mod(o).intValue(), i = i.divide(o), c[l] = s.mod(o).intValue(), s = s.divide(o);
      c[c.length - 1] = e.e;
      for (var u = "", h = new Uint8Array(c.buffer), d = 0; d < h.length; ++d) {
        var f = h[d].toString(16);
        1 == f.length && (u += "0"), u += f
      }
      return p(u) + " adb@chrome"
    }, n.prototype.sign = function (e, t) {
      if (null == e)throw"AuthManager is not initialized";
      var n = 256, o = new Uint8Array(n);
      o[0] = 0, o[1] = 1;
      for (var i = [0, 48, 33, 48, 9, 6, 5, 43, 14, 3, 2, 26, 5, 0, 4, 20], r = n - i.length - t.byteLength, s = 2; s < r; s++)o[s] = 255;
      o.set(new Uint8Array(i), r), r += i.length, o.set(new Uint8Array(t), r);
      var c = new BigInteger(Array.apply([], o));
      return new Uint8Array(e.doPrivate(c).toByteArray()).buffer
    }, n.parseConnectionPayload = i, n.prototype.handleUnknown = function (e, t) {
      console.log("no idea what this socket is."), this.sendMessage(n.kCommandCLSE, e, t)
    }, n.prototype.handleMessage = function (e, t) {
      var o = e.getUint32(0, !0), r = e.getUint32(4, !0), c = e.getUint32(8, !0);
      e.getUint32(12, !0), e.getUint32(16, !0);
      switch (o) {
        case n.kCommandOPEN:
          this.onOpenSocket && this.onOpenSocket(t, r);
          break;
        case n.kCommandAUTH:
          console.log("auth:", this), this.getKey(function (e) {
            if (this.sentSignature) {
              var o = this._convertToMinCrypt(e.getKey());
              this.sendMessage(n.kCommandAUTH, n.kAuthRSAPublicKey, 0, o), m('Check your Android device and click "Allow USB Debugging".')
            } else {
              this.sentSignature = !0;
              var i = this.sign(e.getKey(), t);
              this.sendMessage(n.kCommandAUTH, n.kAuthSignature, 0, i, function () {
              })
            }
          }.bind(this));
          break;
        case n.kCommandOKAY:
          var a = r, d = c, l = this.sockets[d];
          if (!l)return void this.handleUnknown(d, a);
          var u = l.onConnected;
          u && (delete l.onConnected, l.remoteId = a, u(l));
          var h = l.pendingWrite;
          if (h)return u = l.wrote, delete l.wrote, delete l.pendingWrite, void l.write(h, u);
          u = l.wrote, u && (delete l.wrote, u());
          break;
        case n.kCommandCNXN:
          this.rawProperties = s(t), this.properties = i(t);
          var u = this.onConnected;
          u && (delete this.onConnected, u(this));
          break;
        case n.kCommandWRTE:
          var a = r, d = c, l = this.sockets[d];
          if (!l)return void this.handleUnknown(d, a);
          l.paused || this.sendMessage(n.kCommandOKAY, l.localId, l.remoteId), l.dataReceived(new Uint8Array(t));
          break;
        case n.kCommandCLSE:
          var a = r, d = c, l = this.sockets[d];
          if (!l)return void console.log("asked to close unknown socket?");
          delete this.sockets[d], l.destroy();
          var u = l.onConnected;
          u && (delete l.onConnected, u());
          break;
        default:
          console.log("unknown command: ", o.toString(16), r, c, t)
      }
    }, n.prototype.onReceiveMessage = function (e) {
      if (e.resultCode)return void this.fatal(e);
      var t = new DataView(e.data), o = t.getUint32(12, !0);
      if (o) this.transport.read(o, function (e) {
        if (e.resultCode)return void this.fatal(e);
        var o = e.data;
        if (n.checksum(o) != t.getUint32(16, !0))return void this.receiveMessages();
        try {
          this.handleMessage(t, o)
        } finally {
          this.receiveMessages()
        }
      }.bind(this)); else try {
        this.handleMessage(t, null)
      } finally {
        this.receiveMessages()
      }
    }, n.prototype.receiveMessages = function () {
      this.transport.read(24, this.onReceiveMessage.bind(this))
    }, n.prototype.forwardPort = function (e) {
      var t = new Server;
      t.listen({port: e.fromPort, address: "127.0.0.1"}, function (t) {
        this.newSocket(e.to, function (e) {
          e ? Socket.stream(t, e) : t.destroy()
        }.bind(this))
      }.bind(this), function () {
        this.forwards[e.fromPort] = t
      }.bind(this))
    }, n.prototype.newAdbSocket = function (e, t) {
      var n;
      return n = this.createSocket ? this.createSocket(e, t) : new r(this, e, t)
    }, n.prototype.newSocket = function (e, t) {
      var o = ++this.currentSocketId;
      this.sockets[o] = this.newAdbSocket(o, t), this.sendMessage(n.kCommandOPEN, o, 0, e)
    }, r.prototype.write = function (e, t) {
      if (this.pendingWrite || this.wrote)throw console.log("bad adb socket state, already writing"), new Error("bad adb socket state, already writing");
      var o = Math.min(this.device.transport.zero_mask, this.device.maxPayload);
      o < e.byteLength ? (this.pendingWrite = e.slice(o), e = e.slice(0, o)) : this.pendingWrite = null, this.wrote = t, this.device.sendMessage(n.kCommandWRTE, this.localId, this.remoteId, e)
    }, r.prototype.destroy = function () {
      this.device.sendMessage(n.kCommandCLSE, this.localId, this.remoteId), this.dataReceived(null)
    }, r.prototype.buffered = Socket.prototype.buffered, r.prototype.dataReceived = Socket.prototype.dataReceived, r.prototype.read = Socket.prototype.read, r.prototype.pause = Socket.prototype.pause, r.prototype.resume = Socket.prototype.resume, r.prototype.unshift = Socket.prototype.unshift, r.prototype.onPause = function () {
    }, r.prototype.onResume = function () {
      this.device.sendMessage(n.kCommandOKAY, this.localId, this.remoteId)
    }, d.prototype.start = function () {
      if (this.server)return void console.log("ADB Server started while already started");
      this.clients = {}, this.adbDevices = {}, this.pendingDevices = {}, this.refreshing = {};
      var e = new Server;
      e.listen({port: this.port, address: "127.0.0.1"}, function (e) {
        var t = new f(this, e), n = ++this.currentSocketId;
        this.clients[n] = t, e.onClose = function () {
          delete this.clients[n]
        }.bind(this), t.receiveHeader()
      }.bind(this), function (t) {
        return t ? void console.log("adb server failed to listen: " + t) : (console.log("ADB Server started"), this.server = e, void this.refresh())
      }.bind(this))
    }, d.prototype.isRunning = function () {
      return null != this.server
    }, d.prototype.kill = function () {
      this.server.destroy(), this.server = null, this.refreshing = {};
      for (var e in this.clients)e = this.clients[e], e.socket.destroy();
      this.clients = {};
      for (var t in this.adbDevices)t = this.adbDevices[t], t.destroy();
      this.adbDevices = {}, this.pendingDevices = {}
    }, d.prototype.selectDevice = function (e) {
      chrome.usb.getUserSelectedDevices({
        filters: [{
          interfaceClass: 255,
          interfaceSubclass: 66,
          interfaceProtocol: 1
        }]
      }, function (t) {
        for (var n in t)n = t[n], this.refreshDevice(n, e)
      }.bind(this))
    }, d.prototype.withAdbDevice = function (e, t) {
      e.onError = function () {
        delete this.adbDevices[e.serialno], this.internalOnDevicesChanged()
      }.bind(this);
      var n = function (n) {
        e.serialno = n.trim(), this.adbDevices[e.serialno] = e, console.log("found device: " + e.serialno), this.internalOnDevicesChanged(), t(e)
      }.bind(this);
      return e.serialno ? void n(e.serialno) : void e.newSocket("shell:getprop ro.serialno", function (e) {
        l(e, function (e) {
          n(e)
        }.bind(this))
      }.bind(this))
    }, d.prototype.tryDevice = function (e, t, n) {
      function o(o) {
        var s = o.interfaceNumber;
        return !i[s] && (i[s] = e, console.log("claiming:", JSON.stringify(e), JSON.stringify(o)), chrome.usb.claimInterface(e, o.interfaceNumber, function () {
            console.log("claimed:", JSON.stringify(chrome.runtime.lastError)), a(e, o, function (e) {
              return e ? (e.serialno = t, void r.withAdbDevice(e, function (e) {
                delete i[s], n(e)
              })) : (delete i[s], void n())
            })
          }), !0)
      }

      var i = (this.adbDevices, this.pendingDevices), r = this;
      chrome.usb.listInterfaces(e, function (t) {
        if (!t)return console.log("unable list interfaces", JSON.stringify(chrome.runtime.lastError)), void(n && n());
        console.log("got interfaces", JSON.stringify(t));
        var i = !1;
        for (var r in t)r = t[r], 255 == r.interfaceClass && 66 == r.interfaceSubclass && 1 == r.interfaceProtocol && (i |= o(r));
        i || chrome.usb.closeDevice(e)
      })
    }, d.prototype.refreshDevice = function (e, t) {
      chrome.usb.openDevice(e, function (n) {
        return n ? (this.start(), void this.tryDevice(n, e.serialNumber, function (n) {
          n && (n.usbDevice = e), t(n)
        })) : (console.log("unable to open device", JSON.stringify(chrome.runtime.lastError)), void(t && t()))
      }.bind(this))
    }, d.prototype.refresh = function () {
      if (!this.server)return void console.log("adb server refresh requested while server killed");
      var e = u();
      if (!(this.server.lastRefresh && this.server.lastRefresh > e - 1e4)) {
        this.server.lastRefresh = e;
        var t = chrome.runtime.getManifest().permissions.pop().usbDevices;
        $(t).each(function (e, t) {
          var n = t.vendorId + "&" + t.productId;
          this.refreshing[n] || (this.refreshing[n] = !0, chrome.usb.findDevices({
            productId: t.productId,
            vendorId: t.vendorId
          }, function (e) {
            var o = e.length;
            if (!o)return void delete this.refreshing[n];
            console.log("found:", t, e);
            for (var i in e)console.log("trying:", e[i]), this.tryDevice(e[i], e[i].serialNumber, function () {
              o--, o || delete this.refreshing[n]
            }.bind(this))
          }.bind(this)))
        }.bind(this))
      }
    }, d.prototype.internalOnDevicesChanged = function () {
      for (var e in this.clients)if (e = this.clients[e], e.tracking) {
        var t = e.getDevicesString();
        t.length || (t = "0000\n"), e.socket.write(c(t), function () {
        })
      }
    }, d.prototype.stop = function () {
      this.server.destroy()
    }, f.prototype.resolveTransport = function (e, t) {
      if (t) {
        var n = this.server.adbDevices[t];
        return n ? n : "device not found"
      }
      var o = Object.keys(this.server.adbDevices);
      if (o > 1)return "more than one device";
      if (0 == o)return "no devices connected";
      for (var i in this.server.adbDevices)return this.server.adbDevices[i]
    }, f.prototype.write = function (e, t, n) {
      t || (t = "OKAY"), e = c(e);
      var i = e.byteLength, r = o(i);
      r = c(t + r);
      var s = h(new Uint8Array(r), new Uint8Array(e)).buffer;
      n || (n = function () {
        this.socket.destroy()
      }.bind(this)), this.socket.write(s, n)
    }, f.prototype.getDevicesString = function (e) {
      var e = e || {}, t = e.longformDevices, n = "";
      for (var o in this.server.adbDevices)o = this.server.adbDevices[o], n += o.serialno + "\tdevice", t && (n += "usb" == o.transport.type ? " usb:" + o.transport.iface.interfaceNumber : " tpcip:something", n += " product:" + o.properties["ro.product.name"], n += " model:" + o.properties["ro.product.model"], n += " device:" + o.properties["ro.product.device"]), n += "\n";
      return n
    }, f.prototype.writeDevices = function (e, t) {
      this.write(this.getDevicesString(e), null, t)
    }, f.prototype.handlePayload = function (e) {
      e = s(e);
      var i, r = e.split(":"), a = e;
      switch ("host-serial" == r[0] && (r[0] = "host", i = r.splice(1, 1)[0], Number.isInteger(parseInt(r[1])) && (i += ":" + r.splice(1, 1)[0])), r.length >= 2 && (a = r[0] + ":" + r[1]), a) {
        case"host:version":
          this.write(o(n.ADB_VERSION));
          break;
        case"host:devices-l":
        case"host:devices":
          var d = "host:devices-l" == e;
          this.server.refresh(), this.writeDevices({longformDevices: d});
          break;
        case"host:features":
          var l = this.resolveTransport(e, i);
          if ("String" == l.constructor.name) {
            this.write(l, "FAIL");
            break
          }
          var h = l.properties.features;
          h || (h = ""), this.write(o(h));
          break;
        case"host:transport-usb":
        case"host:transport-any":
          var l = this.resolveTransport(e, i);
          if ("String" == l.constructor.name) {
            this.write(l, "FAIL");
            break
          }
          this.transport = l, this.socket.write(c("OKAY"), function () {
          });
          break;
        case"host:kill":
          this.server.kill();
          break;
        case"host:disconnect":
          if (r.length > 4) {
            this.write("host:disconnect only takes 1 argument", "FAIL");
            break
          }
          if (r.length > 2) {
            var f = r[2];
            if (f.length) {
              var p = 5555;
              r.length > 3 && (p = Number.parseInt(r[3]));
              var v = f + ":" + p, g = this.server.adbDevices[v];
              g && "tcp" == g.transport.type && g.destroy(), this.write("disconnected");
              break
            }
          }
          for (var g in this.server.adbDevices)g = this.server.adbDevices[g], "tcp" == g.transport.type && g.destroy();
          this.write("disconnected");
          break;
        case"host:connect":
          if (r.length < 3) {
            this.write("need more arguments for connect <host>[:<port>]", "FAIL");
            break
          }
          var f = r[2], p = 5555;
          r.length > 3 && (p = Number.parseInt(r[3])), Socket.connect({host: f, port: p}, function (e, o) {
            if (!e)return console.error("connect failed"), this.write("unable to connect to " + f + " " + p + ": " + o, "FAIL"), this;
            var i = new n(new t(e), function (e) {
              this.server.withAdbDevice(e, function () {
                var e = "connected to " + f + ":" + p;
                console.log(e), this.write(e)
              }.bind(this))
            }.bind(this));
            i.serialno = f + ":" + p, e.onClose = function () {
              i.fatal("socket closed")
            }.bind(this), i.sendMessage(n.kCommandCNXN, n.ADB_PROTOCOL_VERSION, n.MAX_PAYLOAD, "host::"), i.receiveMessages()
          }.bind(this));
          break;
        case"host:track-devices":
          this.tracking = u(), this.writeDevices({}, function () {
          });
          break;
        case"host:forward":
          var m = r.join(":").substring(a.length + 1).split(";"), y = m[0].split(":"), w = parseInt(y[1]),
            l = this.resolveTransport(e, i);
          if ("String" == l.constructor.name) {
            this.write(l, "FAIL");
            break
          }
          l.forwardPort({fromPort: w, to: m[1]}), this.socket.write(c("OKAYOKAY"), function () {
          }.bind(this));
          break;
        default:
          if (this.transport) {
            var l = this.transport;
            return void l.newSocket(e, function (e) {
              return e ? (this.socket.write(c("OKAY"), function () {
              }), void Socket.stream(e, this.socket)) : void this.socket.write(c("OKAY"), function () {
                this.socket.destroy()
              }.bind(this))
            }.bind(this))
          }
          var b = "host:transport:";
          if (e.startsWith(b)) {
            var i = e.substr(b.length), g = this.server.adbDevices[i];
            if (!g)return void this.write("device not found", "FAIL");
            this.transport = g, this.socket.write(c("OKAY"), function () {
            });
            break
          }
          console.log("unknown request: " + e), this.write("unknown command: " + e, "FAIL");
          var k = chrome.runtime.getManifest().name;
          chrome.notifications.create({
            type: "basic",
            iconUrl: "/icon.png",
            title: k,
            message: k + "'s adb server encountered an unknown adb command.\nYou may want to close " + k + " and start your adb binary manually."
          })
      }
      this.receiveHeader()
    }, f.prototype.receivePayload = function (e) {
      var t = parseInt(s(e), 16);
      this.socket.read(t, this.handlePayload.bind(this))
    }, f.prototype.receiveHeader = function () {
      this.socket.read(4, this.receivePayload.bind(this))
    }, window.AdbDevice = n, window.AdbServer = d, window.AdbTcpTransport = t
  }(), function () {
    function e() {
    }

    var t = {};
    t.sendHostCommand = function (e, t) {
      Socket.connect({host: "127.0.0.1", port: 5037}, function (n) {
        if (!n)return void t();
        var i = e;
        e = o(e.length) + e, n.read(4, function (e) {
          var o = s(e);
          return "OKAY" != o ? (console.error("error in response to adb host command", i, o), n.destroy(), void t()) : void n.read(4, function (e) {
            var o = s(e);
            return e = parseInt(o, 16), 0 == e || "OKAY" == o ? void t(n, new ArrayBuffer(0)) : void n.read(e, function (e) {
              t(n, e)
            })
          })
        }), n.write(c(e), function () {
        })
      })
    }, t.devices = function (e) {
      function n(e) {
        var t = e;
        e = e.replace("\t", " ");
        var n = e.indexOf(" ");
        if (n != -1) {
          var i = e.substring(0, n);
          e = e.substring(n).trim();
          for (var r; r != e;)r = e, e = e.replace("  ", " ");
          var s = {}, c = e.indexOf(" ");
          c == -1 && (c = e.length);
          var a = e.substring(0, c);
          for (e = e.substring(c + 1); e.length && (n = e.indexOf(":"), n != -1);) {
            var d, l = e.substring(0, n), u = e.substring(n + 1), h = u.indexOf(" "), f = u.indexOf(":");
            if (h == -1 || f == -1) d = u, e = ""; else for (; h != -1 && h < f;)d = u.substring(0, h), e = u.substring(h + 1), h = u.indexOf(" ", h + 1);
            s[l] = d
          }
          var p;
          p = s.model ? s.model.replace("_", " ") : i, o[i] = {serialno: i, name: p, status: a, properties: t}
        }
      }

      var o = {};
      t.sendHostCommand("host:devices-l", function (t, i) {
        if (!t)return void e();
        t.destroy(), i = s(i), console.log("ADB devices:", i), i = i.trim();
        var r = i.split("\n");
        for (var c in r)c = r[c], n(c);
        e(o)
      })
    }, t.killServer = function (e) {
      t.sendHostCommand("host:kill-server", function (t, n) {
        return t ? (t.destroy(), n = s(n), void(e && e())) : void e()
      })
    }, t.sendClientCommand = function (e, t) {
      var n = e.command, i = e.serialno;
      Socket.connect({host: "127.0.0.1", port: 5037}, function (e) {
        if (!e)return void t();
        e.read(4, function (i) {
          var r = s(i);
          if ("OKAY" != r)return e.destroy(), void t(null);
          var a = n;
          a = o(a.length) + a, e.read(4, function (n) {
            var o = s(n);
            return "OKAY" != o ? (e.destroy(), void t(null)) : void t(e)
          }), e.write(c(a), function () {
          })
        });
        var r = "host:transport:" + i;
        r = o(r.length) + r, e.write(c(r), function () {
        })
      })
    }, t.shell = function (e, n) {
      var o = e.command;
      e.serialno;
      t.getOrCreateSockFactory(e).newSocket("shell:" + o, function (e) {
        return e ? void l(e, function (e) {
          n(e)
        }) : void n()
      })
    }, t.forward = function (e, n) {
      var o = "host-serial:" + e.serialno + ":forward:" + e.from + ";" + e.to;
      t.sendHostCommand(o, function (e, t) {
        e && e.destroy(), n(e, t)
      })
    }, e.MKID = function (e, t, n, o) {
      return e.charCodeAt(0) | t.charCodeAt(0) << 8 | n.charCodeAt(0) << 16 | o.charCodeAt(0) << 24
    }, e.ID_RECV = e.MKID("R", "E", "C", "V"), e.ID_SEND = e.MKID("S", "E", "N", "D"), e.ID_DONE = e.MKID("D", "O", "N", "E"), e.ID_DATA = e.MKID("D", "A", "T", "A"), e.DATA_MAX = 65536, t.pull = function (n, o) {
      var i = n.file, r = (n.serialno, n.fileEntry), s = n.socket;
      s || !function () {
        var e;
        s = {
          write: function (t, n) {
            return e ? (e.onwriteend = n, void e.write(new Blob([t]))) : void r.createWriter(function (o) {
              e = o, s.write(t, n)
            })
          }
        }
      }();
      var a = new b;
      Socket.pump(a, s, function () {
        o(r)
      }), t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {
        function n(e) {
          t.read(e, function (e) {
            a.dataReceived(e), r()
          })
        }

        function r() {
          t.read(8, function (i) {
            var r = new DataView(i.buffer, i.byteOffset, i.byteLength), s = r.getUint32(0, !0);
            if (s == e.ID_DATA) {
              var c = r.getUint32(4, !0);
              return void n(c)
            }
            return t.destroy(), s == e.ID_DONE ? void a.dataReceived(null) : void o()
          })
        }

        if (!t)return void o();
        var s = new ArrayBuffer(8), d = new DataView(s);
        d.setUint32(0, e.ID_RECV, !0), d.setUint32(4, i.length, !0), t.write(s, function () {
          t.write(c(i), function () {
            r()
          })
        })
      })
    }, t.createSocketFactory = function (e) {
      return {
        newSocket: function (n, o) {
          t.sendClientCommand({serialno: e, command: n}, o)
        }
      }
    }, t.getOrCreateSockFactory = function (e) {
      return e.socketFactory || t.createSocketFactory(e.serialno)
    }, t.push = function (n, o) {
      var i = n.file, r = (n.serialno, n.socket);
      t.getOrCreateSockFactory(n).newSocket("sync:", function (t) {
        if (!t)return void o();
        var n = new ArrayBuffer(8), s = new DataView(n), a = i + ",0644";
        s.setUint32(0, e.ID_SEND, !0), s.setUint32(4, a.length, !0), t.write(n, function () {
          t.write(c(a), function () {
            function n() {
              r.read(function (t) {
                if (t.byteLength > e.DATA_MAX) {
                  var n = t.subarray(e.DATA_MAX);
                  t = t.subarray(0, e.DATA_MAX), r.unshift(n)
                }
                i(t)
              })
            }

            function i(o) {
              var i = new ArrayBuffer(8), r = new DataView(i);
              r.setUint32(0, e.ID_DATA, !0), r.setUint32(4, o.byteLength, !0), t.write(i, function () {
                var e = o.buffer;
                (o.byteOffset || o.length != e.byteLength) && (e = e.slice(o.byteOffset, o.byteOffset + o.byteLength)), t.write(e, function () {
                  n()
                })
              })
            }

            r.onClose = function () {
              var n = new ArrayBuffer(8), i = new DataView(n);
              i.setUint32(0, e.ID_DONE, !0), i.setUint32(4, 0, !0), t.write(n, function () {
                t.read(8, function () {
                  o()
                })
              })
            }, n()
          })
        })
      })
    }, window.Adb = t
  }(), function () {
    function e(e, t) {
      this.transport = e, this.sockets = {}, this.currentSocketId = 0, this.maxPayload = t || AdbDevice.MAX_PAYLOAD
    }

    e.prototype.start = function (e) {
      var t = c(e, void 0, !0);
      this.sendMessage(AdbDevice.kCommandCNXN, AdbDevice.ADB_PROTOCOL_VERSION, this.maxPayload, t), this.receiveMessages()
    }, e.prototype.fatal = function (e) {
      console.log("fatal error", e);
      var t = this.onClose;
      t && (delete this.onClose, t())
    }, e.prototype.sendMessage = AdbDevice.prototype.sendMessage, e.prototype.receiveMessages = AdbDevice.prototype.receiveMessages, e.prototype.onReceiveMessage = AdbDevice.prototype.onReceiveMessage, e.prototype.handleMessage = AdbDevice.prototype.handleMessage, e.prototype.handleUnknown = AdbDevice.prototype.handleUnknown, e.prototype.newAdbSocket = AdbDevice.prototype.newAdbSocket, e.prototype.destroy = AdbDevice.prototype.destroy, e.prototype.onOpenSocket = function (e, t) {
      if (this.openSocket) {
        var n = ++this.currentSocketId, o = this.newAdbSocket(n);
        o.remoteId = t, this.sockets[n] = o, this.sendMessage(AdbDevice.kCommandOKAY, n, t), this.openSocket(s(e), o)
      }
    }, window.AdbDaemon = e
  }(), function () {
    function e(e, t, n) {
      $.ajax({
        url: e, dataType: "binary", responseType: "arraybuffer", success: function (e) {
          var o = new Uint8Array(e), i = new b(o), r = "/data/local/tmp/apk" + (new Date).getTime() + ".apk";
          Adb.push({serialno: t, file: r, socket: i}, function () {
            Adb.shell({command: "pm install -r " + r, serialno: t}, n)
          })
        }, error: function (e) {
          console.error("error fetching apk", e), n()
        }
      })
    }

    function t(e, t, n) {
      Adb.shell({command: "pm path " + t, serialno: e}, function (e) {
        if ("" == e || !e)return void n(null);
        var t = e.match(/package:\/.*?[\r\n]/);
        return t && t.length ? (e = t[0], e = e.replace("package:", "").trim(), void n(e)) : void n(null)
      })
    }

    function n(e, t, n, o, i) {
      i || (i = Adb.shell), Adb.shell({command: "ls -l /system/bin/app_process*", serialno: e}, function (r) {
        var s = "/system/bin/app_process";
        r && r.indexOf("app_process32") != -1 && (s += "32"), i({
          command: 'sh -c "CLASSPATH=' + t + " " + s + " /system/bin " + n + '"',
          serialno: e
        }, o)
      })
    }

    window.AdbUtils = {runMain: n, installApk: e, getApkPath: t}
  }(), function () {
    var e = function (e) {
      this.authorization = e
    };
    e.prototype.shorten = function (e, t) {
      $.ajax({
        type: "POST",
        url: "https://www.googleapis.com/urlshortener/v1/url?key=" + this.authorization,
        data: JSON.stringify({longUrl: e}),
        contentType: "application/json",
        dataType: "json",
        success: function (e) {
          t(e.id)
        }
      })
    }, window.Googl = e
  }(), function () {
    var e = 1, t = 1;
    S.prototype.refresh = function (e, t) {
      this.refreshInternal(e, t).async()
    }, S.prototype.refreshInternal = function*(o, i) {
      var r, s = function () {
        n(function () {
          if (this.a()) {
            var e, t = chrome.app.window.getAll().filter(function (e) {
              return e && "purchase" == e.id
            });
            t && t.length, e = t[0], null != e && (e.close(), m("Vysor subscription is active. Thank you for your support!"))
          }
        }.bind(this)), this.globalRefresh ? this.globalRefresh() : console.error("no global refresh?"), r || (r = !0, o && o(this.a()))
      }.bind(this), c = !1, a = !1, d = !1, l = !1;
      window.chrome && window.chrome.runtime && window.chrome.runtime.connect || (d = !0);
      var u, h, f, p = function (e, t) {
        return !!t.licensed && (e != t.email ? (console.log("email mismatch"), !1) : (console.log("enterprise license retrieved"), !0))
      }.bind(this), v = function (e, t) {
        if (t.sandbox != c)return console.log("sandbox mismatch"), !1;
        if (e != t.buyer_id)return console.log("id mismatch"), !1;
        if ("koushd@gmail.com" != t.seller_id)return console.log("seller mismatch"), !1;
        var n = !1;
        return t.subscriptions && $.each(t.subscriptions, function (e, t) {
          return console.log("subscription found", t), t.remote_plan_id.startsWith("vysor") ? void(t.subscription_active && (console.log("clockwork subscription retrieved"), n = t.license_first_retrieved)) : void console.log("skipping non-vysor subscription")
        }.bind(this)), $.each(t.orders, function (e, t) {
          return console.log("purchase found", t), t.product_id.startsWith("vysor") ? void(t.is_purchased && (console.log("clockwork license retrieved"), n = t.order_date)) : void console.log("skipping non-vysor purchase")
        }.bind(this)), n
      }.bind(this), g = function (t) {
        $.each(t, function (t, n) {
          console.log("subscription status", n), "ACTIVE" == n.state && (console.log("chrome license retrieved"), e = !0)
        }.bind(this))
      }.bind(this), b = function*() {
        if (l)return void console.log("skipping enterprise");
        if (f && !i)return console.log("Skipping enterprise license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
        console.log("checking chrome enterprise licenses");
        var n = yield w(!1, yield);
        if (!n)return chrome.runtime.lastError, void console.error("No auth token for enterprise licensing");
        try {
          var o = yield chrome.identity.getProfileUserInfo(yield);
          if (!R)return void console.log("unable to retrieve user info for enterprise");
          var r = (o.id, o.email);
          try {
            var o = yield $.ajax({
              url: "https://billing.vysor.io/license",
              headers: {Authorization: "Bearer " + n},
              dataType: "json",
              success: yield y,
              error: yield Error
            }), c = JSON.parse(o.signed_data);
            yield chrome.storage.local.set({cachedEnterpriseLicense: o}, yield);
            var a = p(r, c);
            if (!a)return void console.log("No enterprise license found on server");
            e = !0, t = !0, s()
          } catch (e) {
            yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Error communicating with vysor enterprise", e)
          }
        } catch (e) {
          yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get email for enterprise", e)
        }
      }.bind(this), k = function*() {
        if (a)return void console.log("skipping clockwork");
        if (h && !i)return console.log("Skipping clockwork license server check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
        console.log("checking clockwork purchases");
        var n = yield w(!1, yield);
        if (!n)return chrome.runtime.lastError, void console.error("No auth token for clockwork billing");
        try {
          var o = yield chrome.identity.getProfileUserInfo(yield);
          if (!R)return void console.log("unable to retrieve user info for clockwork");
          var r = o.id,
            d = "https://billing.clockworkmod.com/api/v1/purchase/koushd@gmail.com?sandbox=" + c + "&nonce=" + Date.now();
          try {
            var o = yield $.ajax({
              url: d,
              dataType: "json",
              headers: {Authorization: "Bearer " + n},
              error: yield Error,
              success: yield y
            }), l = JSON.parse(o.signed_data);
            yield chrome.storage.local.set({cachedClockworkLicense: o}, yield);
            var u = v(r, l);
            if (!u)return void console.log("no clockwork license found on server");
            e = !0, t = !0, s()
          } catch (e) {
            console.error("error requesting purchases", e)
          }
        } catch (e) {
          yield chrome.identity.removeCachedAuthToken({token: n}, yield), console.error("Unable to get buyer id for clockworkbilling", e)
        }
      }.bind(this), S = function*() {
        if (!d) {
          console.log("checking chrome store purchases");
          var e;
          try {
            e = yield google.payments.inapp.getPurchases({
              parameters: {env: "prod"},
              success: yield y,
              failure: yield Error
            })
          } catch (e) {
            if (console.error("Failed to query license from chrome store.", e), !i)return console.log("Skipping Chrome license server fallback check."), void console.log("Use Retrieve License from the purchase page to force refresh.");
            console.log("Falling back to server proxied query.");
            try {
              yield this.b(!1, yield), yield * I()
            } catch (e) {
              console.error("failed to do fallback server check", e)
            }
            return
          }
          if (g(e.response.details), !this.a())return void console.log("no chrome license found on server");
          s(), console.log("Caching Vysor license."), yield this.b(!1, yield), this.c() && s()
        }
      }.bind(this), A = 4, D = A / 2, I = function*() {
        if (!d) {
          console.log("checking cached chrome license");
          var e = yield chrome.storage.local.get("cachedLicense", yield);
          if (!e)return void console.error("storage access failed?", chrome.runtime.lastError);
          if (!e.cachedLicense)return void console.log("no cached chrome license found");
          if (!R)return void console.log("unable to retrieve user info for cache");
          var n = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", e.cachedLicense.signed_data, e.cachedLicense.signature, yield);
          if (n)return void console.error("error verifying cached signature", n);
          var o = JSON.parse(e.cachedLicense.signed_data);
          u = !1;
          var i = Date.now();
          if ($.each(o.payments, function (e, t) {
              "ACTIVE" == t.state && (u = !0, i = Math.min(i, t.createdTime))
            }.bind(this)), o.date > Date.now())return void console.log("cached license date from future?");
          var r, c = new Date - new Date(i), a = c / 1e3 / 60 / 60 / 24;
          r = a < 14 ? 4 : Math.min(30, 4 + (a - 14) / 7);
          var l = r / 2;
          if (o.date + 24 * r * 60 * 60 * 1e3 < Date.now())return void console.log("cached license is expired.");
          if (R.id != o.userinfo.id)return void console.log("id mismatch");
          if (g(o.payments), !this.a())return void console.log("no chrome license found in cache");
          if (console.log("cached license is valid for " + (o.date + 24 * r * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), o.date + 24 * l * 60 * 60 * 1e3 < Date.now()) {
            console.log("Refreshing cached license");
            try {
              yield this.b(!1, yield)
            } catch (e) {
              console.warn("Failed to re-cache license.", e)
            }
          }
        }
      }.bind(this), L = function*() {
        if (!a) {
          console.log("Checking cached Clockwork license.");
          var n = yield chrome.storage.local.get("cachedClockworkLicense", yield);
          if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);
          if (!n.cachedClockworkLicense)return void console.log("Cached Clockwork payload not found.");
          if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");
          var o = R.id,
            i = yield C("AQAB", "vMGBBmLcMO4lOmg-YAHq2DjZKHTaW-xs9KPNXU_zKJ7ZhFhWH3I6skF9ZO8lKeXOSwVEIW4HVMa7m16S6WTrUw", n.cachedClockworkLicense.signed_data, n.cachedClockworkLicense.signature, yield);
          if (i)return void console.error("Error verifying cached clockwork signature", i);
          var r = JSON.parse(n.cachedClockworkLicense.signed_data), c = v(o, r);
          if (!c)return console.log("No Clockwork license found in cache."), void(h = !0);
          var d, l = new Date - new Date(c), u = l / 1e3 / 60 / 60 / 24;
          d = u < 14 ? 4 : Math.min(30, 4 + (u - 14) / 7);
          var f = d / 2;
          if (r.timestamp + 24 * d * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Clockwork license is expired. Requires server check.");
          if (r.timestamp > Date.now())return void console.error("Cached Clockwork license date from future?");
          e = !0, console.log("Cached Clockwork license is valid for " + (r.timestamp + 24 * d * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), r.timestamp + 24 * f * 60 * 60 * 1e3 < Date.now() && (h = !1, yield * k())
        }
      }.bind(this), O = function*() {
        if (!l) {
          console.log("Checking cached enterprise license.");
          var n = yield chrome.storage.local.get("cachedEnterpriseLicense", yield);
          if (!n)return void console.error("storage access failed?", chrome.runtime.lastError);
          if (!n.cachedEnterpriseLicense)return void console.log("Cached Enterprise payload not found.");
          if (!R)return void console.error("Unable to retrieve user info for cached Clockwork license.");
          var o = yield C("AQAB", "hDuGsIhbjLYXteQX3F3KNriQHwUSZurS5voCkdpA1733A65pqtGOrk9g_yLiF94_vSK0VmL-4stq7WAYEbn6nw", n.cachedEnterpriseLicense.signed_data, n.cachedEnterpriseLicense.signature, yield);
          if (o)return void console.error("Error verifying cached enterprise signature", o);
          var i = JSON.parse(n.cachedEnterpriseLicense.signed_data), r = p(R.email, i);
          if (!r)return f = !0, void console.log("No Enterprise license found in cache.");
          if (i.timestamp + 24 * A * 60 * 60 * 1e3 < Date.now())return void console.log("Cached Enterprise license is expired. Requires server check.");
          if (i.timestamp > Date.now())return void console.error("Cached Enterprise license date from future?");
          e = !0, console.log("Cached Enterprise license is valid for " + (i.timestamp + 24 * A * 60 * 60 * 1e3 - Date.now()) / 36e5 + " hours"), t = !0, s(), i.timestamp + 24 * D * 60 * 60 * 1e3 < Date.now() && (f = !1, yield * b())
        }
      }.bind(this);
      if (this.a())return void s();
      console.log("starting license check");
      var R = yield chrome.identity.getProfileUserInfo(yield);
      R ? console.log("user info", R) : console.log("unable to retrieve user info"), yield * O(), this.a() || (yield * L(), this.a() || (yield * I(), this.a() || (yield * b(), this.a() || (yield * k(), this.a() || (yield * S(), this.a() || s())))))
    }, S.prototype.b = function (e, n) {
      console.log("caching chrome license"), w(e, function (o) {
        return o ? void $.ajax({
          type: "post",
          url: "https://billing.clockworkmod.com/api/v1/verify/google/koushd@gmail.com",
          data: {token: o, item: chrome.runtime.id, version: chrome.runtime.getManifest().version},
          dataType: "json",
          success: function (e) {
            console.log("chrome license cached"), t = !0, chrome.storage.local.set({cachedLicense: e}, n)
          }.bind(this),
          error: function (e, t) {
            console.error("unable to cache license", t), chrome.identity.removeCachedAuthToken({token: o}, function () {
              n && n(t)
            })
          }
        }) : (chrome.runtime.lastError, e && m("Unable to get auth token: " + chrome.runtime.lastError), console.error("Unable to get auth token while caching license", chrome.runtime.lastError), void(n && n(chrome.runtime.lastError)))
      }.bind(this))
    }, S.prototype.a = function () {
      return e
    }, S.prototype.c = function () {
      return t
    }, S.prototype.startPurchase = function () {
      chrome.app.window.create("purchase.html", {
        id: "purchase",
        innerBounds: {minWidth: 800, minHeight: 860}
      }, function (e) {
        this.refresh(), e.contentWindow._rlm = function (e) {
          chrome.storage.local.remove(["cachedLicense", "cachedClockworkLicense", "cachedEnterpriseLicense"], function () {
            this.refresh(e, !0)
          }.bind(this))
        }.bind(this)
      }.bind(this))
    }
  }(), A.prototype.openSocket = function (e, t) {
    if (!this.onOpenSocket || !this.onOpenSocket(e, t)) {
      if ("properties" == e) {
        var n = this.properties;
        return void t.write(c(n), function () {
          console.log("sent properties", n), t.destroy()
        })
      }
      this.adbSocketFactory.newSocket(e, function (n) {
        return n ? void Socket.stream(n, t, function () {
        }) : (console.log("unable to execute adb proxy command?", e), void t.destroy())
      })
    }
  };
  console.log("Vysor version", chrome.runtime.getManifest().version), console.log(navigator.userAgent), console.log("Electron", isElectron());
  var Se, Ae, De, Ie = new AdbServer({start: !1}), Le = {}, Oe = {}, Re = {}, Ee = analytics.getService("vysor_app"),
    Ue = Ee.getTracker("UA-4956323-6");
  if (isElectron()) {
    var Te = Ue;
    Ue = {sendEvent: Te.sendEvent.bind(Te), sendAppView: Te.sendAppView.bind(Te)}
  }
  var We = new S, Pe = "Chrome GCM Service is unavailable. Try restarting Chrome?", Me = new HttpServer;
  We.globalRefresh = function () {
    console.log("license global refresh");
    var e = chrome.app.window.getAll();
    for (var t in e)t = e[t], U(t)
  }, chrome.identity.onSignInChanged.addListener(function () {
    console.log("onSignInChanged, refreshing license"), We.refresh(null, !0)
  }), chrome.storage.local.get("keyboard", function (e) {
    Se = e.keyboard
  }), chrome.storage.local.get("vysorHttp", function (e) {
    function t() {
      Me.listen({port: n.port || 0, address: "127.0.0.1"}, function (e, t) {
        console.log("http request", e.path);
        var n, i;
        for (var r in o)if (n = e.path.match(r), i = o[r], n)break;
        return n ? void i(e, t, n) : (t.code(404), void t.write("", function () {
        }))
      }, function (e) {
        return e ? (console.error("http server failed to listen", e), void(n.port && (console.log("trying port 0"), n.port = 0, t()))) : (n.port = Me.socket.localPort, console.log("vysor http port: " + n.port), void chrome.storage.local.set({vysorHttp: n}))
      })
    }

    if (!e)return void console.error("unable to start vysor httpServer, no dict");
    var n = e.vysorHttp || {};
    n.password = n.password || Math.round(Math.random() * (1 << 30)).toString(16);
    var o = {
      "/device/(.*?)/screenshot.jpg": function (e, t, n) {
        var o = n[1], i = chrome.app.window.get(o);
        if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {
          t.end()
        });
        var r = i.contentWindow.password, s = Adb.createSocketFactory(o);
        s.newSocket("tcp:53516", function (e) {
          if (!e)return console.error("no socket", o, "for screenshot"), t.code(404), void t.write("", function () {
            t.end()
          });
          t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache";
          var n = new HttpRequestParser(null, e, function () {
            var e = n.body.buffer.slice(n.body.byteOffset, n.body.byteOffset + n.body.byteLength);
            t.write(e, function () {
              t.end()
            })
          });
          e.write(c("GET /screenshot.jpg?password=" + r + " HTTP/1.1\r\nConnection: close\r\n\r\n"), function (e) {
          })
        })
      }, "/device/(.*?)/sdcard-vysor/(.*)": function (e, t, n) {
        var o = n[1], i = n[2];
        t.headers.Connection = "close", t.headers["Cache-Control"] = "no-cache", t.headers["Content-Type"] = "application/binary", Adb.pull({
          file: "/sdcard/vysor/" + i,
          serialno: o,
          socket: t
        }, function () {
          t.end()
        })
      }, "/device/(.*?)/video.flv": function (e, t, n) {
        var o = n[1], i = chrome.app.window.get(o);
        if (!We.a())return console.error("ignoring request, not licensed"), t.code(402), void t.write("This feature is only available in Vysor Pro", function () {
          t.end()
        });
        if (!i)return console.error("device window", o, "not found"), t.code(404), void t.write("", function () {
          t.end()
        });
        if (!i.contentWindow.siphonFlv)return console.error("siphonFlv", o, "not found"), t.code(404), void t.write("", function () {
          t.end()
        });
        var r = new b;
        if (t.headers.Connection = "close", t.headers["Content-Type"] = "video/x-flv", Socket.pump(r, t, function () {
            console.log("flv source closed")
          }), isElectron()) {
          var s = r;
          r = {
            dataReceived: function (e) {
              s.dataReceived(e)
            }, destroy: s.destroy.bind(r)
          }
        }
        i.contentWindow.siphonFlv(r)
      }
    };
    t()
  }), We.refresh();
  var Ne;
  chrome.app.runtime.onLaunched.addListener(function (e) {
    G(), e && "vysor_purchase" == e.id && We.refresh(null, !0), e && "vysor_presentation" == e.id && Z(e.url, function (e) {
      K(e)
    }), e && "vysor_device_farm" == e.id && (console.log("device farm", e.url), De && De.show(), G(), m("Vysor is connecting to shared Android devices"), w(!0, function (t) {
      return t ? void Y(e.url, t, function (e, t) {
        return t ? void T("Vysor Share", "Unable to connect to shared devices. " + t) : void T("Vysor Share", "Connected to " + e.name + "'s remote devices.")
      }) : void m("Unable to get auth token")
    })), ee()
  });
  var _e, xe;
  Y = re(Y), X = re(X), oe = re(oe), Z = re(Z), chrome.storage.local.get("share-all-devices", function (e) {
    e["share-all-devices"] && X(!1, function () {
      P()
    })
  });
  var Fe, Be, Ve, je, Ke, qe, He, Je = {}, Ye = {}, $e = {}, Xe = {}, ze = {};
  me(), ve();
  var Ge;
  chrome.runtime.onUpdateAvailable.addListener(function () {
    V()
  }), chrome.notifications.onButtonClicked.addListener(function (e, t) {
    "reload" == e ? chrome.runtime.reload() : "never-start-automatically" == e && (chrome.storage.local.set({"connect-automatically": !1}), chrome.notifications.clear(e))
  }), chrome.notifications.onClicked.addListener(function (e, t) {
  }), t[""] = e
}({}, function () {
  return this
}());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vysor 1.7.6 chrome 插件破解 的相关文章

  • 爬虫日常练习-selenium登录12306

    文章目录 前言 页面分析 代码设计 前言 hello 好兄弟们 经过前面几篇文章后 想必小伙伴们对于简单的网页文本爬取 图片爬取类的内容已经熟练掌握了 今天我们开始练习一个新的内容 selenium 有关这一块的基础知识网上太多了 我们作为
  • 【Chrome】分享几个常用的插件,持续集成

    文章目录 一 准备 打开扩展程序 1 1 方式一 1 2 方式二 1 3 打开开发者模式 二 Chrome应用商店在线安装 需要科学上网 三 离线安装 3 1 离线crx下载地址 3 2 crx方式安装 3 3 加载已解压的扩展程序 方式安
  • Selenium系列教程 - 番外篇 控制浏览器的两种方式

    目录 一 让代码打开浏览器 二 先打开浏览器 然后再让代码进行接管 1 原理 2 打开浏览器 3 接管浏览器 一 让代码打开浏览器 这种就是我们平时常用的方式 如下 driver webdriver Chrome driver get ht
  • 获取电商网站主图和详情图的浏览器插件

    介绍 搞图宝 专门获取各大电商平台详情页面主图和详情图的浏览器插件 现已支持京东 京东国际 淘宝 天猫 coupang 1688 naver gmarket alibaba 兰亭集势 谷歌浏览器下载地址 Google Chrome 网络浏览
  • 如何使用chrome 浏览器自带截屏?

    1 ctrl shift c 2 ctrl shift p 3 输入 capture 4 选择capture full size screenshot 实现截取整个网页
  • 关于:Google Chrome 官方下载地址

    1 官方在线安装版 Google Chrome 网络浏览器https www google cn intl zh CN chrome 2 官方离线安装版
  • Linux touch 命令指南大全

    1 概述 在本教程中 我们将学习touch命令 简而言之 这个命令允许我们更新文件或目录的最后修改时间和最后访问时间 因此 我们将重点关注如何使用该命令及其各种选项 请注意 我们使用 Bash 测试了此处显示的所有命令 但是 它们应该与任何
  • chrome扩展开发调试

    chrome扩展由content scripts browser actions background等多个部分组成 其中 content scripts属于注入web页面 所以在contentscripts中的console log会被正
  • 谷歌浏览器Google Chrome离线版(持续更新中)

    谷歌浏览器官方正式版采用自主研发Chromium内核 它是全球受欢迎的谷歌浏览器电脑版 追求速度 隐私安全的网络浏览器 而Google Chrome浏览器离线版更可以在无网络的情况下安装 一 在线版和离线版区别 在线版 即下载官方下载的一个
  • 使用 ChatGPT 总是出现「Something went wrong」解决方案

    1 前言 最近使用 ChatGPT 总是出现 Something went wrong If this issue persists please contact us through our help center at help ope
  • 解决Chrome, NET::ERR_CERT_AUTHORITY_INVALID

    文章目录 前言 解决方法一 解决方法二 总结 前言 解决方法一 首先清理一下缓存 三个点 gt 设置 gt 清除浏览数据 即可 如果还解决不了 因为Chrome是默认使用HSTS传输 严格的http传输方式 解决方法二 在Chrome浏览框
  • (转)42个超实用的Google Chrome 插件,值得你拥有,建议收藏!

    每日英文 When friends ignore you don t be sad everyone has his own life who can not always be with you 当朋友忽略你时 不要伤心 每个人都有自己的
  • ubuntu wget ERROR 403: Forbidden 错误

    解决办法 临时变更wget的UA wget U 浏览器的useragent 下载地址 永久变更Wget 未测试 修改配置文件 etc wgetrc 添加下面这一行 header User Agent 浏览器的useragent 上面这个配置
  • selenium的使用

    selenium的使用 0 使用selenium import time from selenium webdriver import Chrome from selenium webdriver common by import By 1
  • 如何在 Fedora 和 RHEL 系统中安装 Google Chrome

    Google Chrome 是一款功能强大 快速且流行的网络浏览器 以其简约的设计和强大的功能套件而闻名 虽然 Fedora 和 Red Hat Enterprise Linux RHEL 系统配备了默认的 Web 浏览器 大多数情况下为
  • Python-抓取小红书文章的心路历程

    在这之前从未了解过小红书 然后习惯性地百度了一下 发现是这样的 研究发现 这玩意没有pc端的接口 也就是说没办法直接从pc端抓取数据 好吧 放弃 不过pc端还是有用处的 打开社区精选 点开几个推送详情页看了看 发现所有的文章url都是htt
  • chrome设置为深色模式

    作为一个程序员 大部分编辑器和软件其实更喜欢深色的模式 那么作为接触最多的chrome浏览器也是想同样设置为深色 但是修改主题的方式只能够让首页和浏览器的边缘为深色 对于实际访问的网页内容并不能做到深色 操作 先检查浏览器版本是否是最新版本
  • Axure谷歌Chrome浏览器插件安装教程

    1 引言 经常看到这样的问题 1 我用Axure做的原型怎么不能用谷歌浏览器查看 2 到哪里下载Axure谷歌浏览器插件 3 Axure谷歌浏览器插件下载下来怎么安装 其实这些问题百度一下都能找到答案 不过有些答案对于新手来说比较麻烦 就拿
  • 设置windos电脑开机自动启动chrome浏览器,并且打开指定网页

    需求 web项目设置windos电脑开机自动启动chrome浏览器 打开指定网页地址 并设置为全屏显示 解决 使用windos的bat脚本 设置为开机自启动 代码如下 echo off cd d dp0 title Chrome taskl
  • 谷歌Chrome浏览器无法安装插件的解决方法

    Google Chrome是一款由Google公司开发的网页浏览器 该浏览器基于其他开源软件撰写 包括WebKit 目标是提升稳定性 速度和安全性 并创造出简单且有效率的使用者界面 使用谷歌浏览器安装扩展插件的时候有时会遇到无法安装问题 解

随机推荐

  • 基于Linux操作系统下的Shell排序算法

    一 Shell排序算法原理 希尔排序 Shell Sort 是 DLShell 于1959 年提出来的一种排序算法 在这之前排序算法的时间复杂度基本都是 O n2 的 希尔排序算法是突破这个时间复杂度的第一批算法之一 直接插入排序 应该说
  • 牛客网在线编程输入输出

    多行输入 输入第一个数据为接下来要输入的行数 接下来的几行每一行仅有一个数字 const readline require readline const rl readline createInterface input process s
  • Visual Assist X 10.6.1837.0 Cracked

    http download csdn net download dengai 2918948 http download csdn net detail u013127159 6721815
  • 设计模式--访问者模式

    访问者模式 属于行为型模式基本原理 元素类的执行算法随着访问者改变而改变 主要流程 1 创建元素类 内有不同的执行算法 根据不同的访问者选择不同的执行算法 2 创建访问类 实现不同的访问派生类 将自身传入元素类的执行算法 include
  • Linux中opengl库叫什么名字,Linux下的OpenGL——Mesa和GLX简介

    一 什么是Mesa和GLX 众所周知 OpenGL作为图形界的工业标准 其仅仅定义了一组2D和3D图形接口API 而对于窗口管理 IO消息响应等并没有规定 也就是说 OpenGL依赖各平台提供用于渲染的context以及具体实现方式 而各平
  • 时间序列数据的正态性检验

    目录 正态分布 柯尔莫可洛夫 斯米洛夫检验 Kolmogorov Smirnov检验原理 工具箱介绍 Lilliefors检验 雅各 贝拉检验 安得森 达令检验 正态分布 y1中100是 5是 而不是平方 Matlab中legend的用法总
  • 管理数据库用户

    紫色代表一级目录 粉红代表二级目录 蓝色代表三级目录 红色代表关键字 橙色代表说明 管理过程 创建用户 Oracle中 创建用户的语法 授予用户权限的语法 Microsoft SQL Server中 创建用户 账户的语法 把用户添加到数据库
  • Unity 云雾shader

    先上效果图 Shader Demo MainCloud Properties LightIntensity 光照强度 Range 0 75 1 1 MainColor MainCol Color 0 6 0 6 0 6 1 MainTex
  • 什么是反向跟单?反向跟单怎么运作?

    所谓反向跟单 顾名思义 就是依据跟单样本的下单方向 反方向下单交易 一 反向原理 基于交易市场的 二八定律 即 二盈八亏 或 一盈二平七亏 依据市场的交易行为 进行反方向操作 锁定盈利 二 反跟途径 运用计算机技术 搭建一套虚拟交易端软件
  • ChatGPT/GPT4开源“平替”汇总

    寻找那些ChatGPT GPT4开源 平替 们 ChatGPT爆火出圈 国内很多高校 研究机构和企业都发出类似ChatGPT的发布计划 ChatGPT没有开源 复现难度极大 即使到现在GPT3的完全能力也没有任何一个单位或者企业进行了复现
  • openvswitch--OpenFlow 流表设置

    流规则组成 每条流规则由一系列字段组成 分为基本字段 条件字段和动作字段三部分 基本字段包括生效时间duration sec 所属表项table id 优先级priority 处理的数据包数n packets 空闲超时时间idle time
  • Windows 8 Metro Stype App 学习笔记(五)--文件操作

    Windows 8 Metro Style App中文件操作都包含在Windows Storage命名空间中 其中包括StorageFolder StorageFile FileIO等类库 文件对象用StorageFile实现 文件头用St
  • 001 Python数据可视化之折线图

    话说 人是视觉的动物 本文从可视化入手来展现数据 试想一场景 某制造业工厂的CEO想了解两种成品的次品数及次品率 进而进行下一步决策 对于应用 excel在一定程度上可满足 如下图 对于开发 Python 1 2 作为受众度高的语言 3 在
  • AI实战:docker中用TensorBroad可视化模型训练过程

    前言 TensorBoard是TensorFlow自带的一个强大的可视化工具 目前支持7种可视化 Scalars Images Audio Graphs Distributions Histograms 和 Embeddings 主要功能如
  • 在C++中 char 到底是什么类型?

    在C 中 char 是一个用来表示字符的整数数据类型 它通常占据一个字节 8位 用于存储单个字符的ASCII码或其他字符编码的值 char 类型可以用于表示字符 比如字母 数字 标点符号等 每个字符在计算机内部都有一个对应的整数值 这个值可
  • 机器学习--使用朴素贝叶斯进行垃圾邮件分类

    一 学习背景 垃圾邮件的问题一直困扰着人们 传统的垃圾邮件分类的方法主要有 关键词法 和 校验码法 等 然而这两种方法效果并不理想 其中 如果使用的是 关键词 法 垃圾邮件中如果这个关键词被拆开则可能识别不了 比如 中奖 如果被拆成 中 奖
  • 学习Vue3第一天

    一 Vue简介 Vue是一款用于构建用户界面的 JavaScript 框架 它基于标准 HTML CSS 和 JavaScript 构建 并提供了一套声明式的 组件化的编程模型 帮助你高效地开发用户界面 无论是简单还是复杂的界面 Vue 都
  • Linux中的NFS共享

    1 NFS服务介绍 1 1什么是NFS服务 一 NFS工作原理 1 什么是NFS服务器 NFS就是Network File System的缩写 它最大的功能就是可以通过网络 让不同的机器 不同的操作系统可以共享彼此的文件 NFS服务器可以让
  • tr linux中文,linux中的tr用法详解

    tr命令可以对来自标准输入的字符进行替换 压缩和删除 它可以将一组字符成另一组字符 经常用来编写优美的单行命令 作用很强大 tr 选项 参数 c或 complerment 取代所有不属于第一字符集的字符 d或 delete 删除所有属于第一
  • Vysor 1.7.6 chrome 插件破解

    在你的Chrome扩展文件里面 找到 名为uglify js的文件 我的文件地址 C Users jin AppData Local Google Chrome User Data Default Extensions gidgenkbba