| Index: lib/adblockplus.js | 
| =================================================================== | 
| deleted file mode 100644 | 
| --- a/lib/adblockplus.js | 
| +++ /dev/null | 
| @@ -1,3457 +0,0 @@ | 
| -/* | 
| - * This file is part of the Adblock Plus extension, | 
| - * Copyright (C) 2006-2012 Eyeo GmbH | 
| - * | 
| - * Adblock Plus is free software: you can redistribute it and/or modify | 
| - * it under the terms of the GNU General Public License version 3 as | 
| - * published by the Free Software Foundation. | 
| - * | 
| - * Adblock Plus is distributed in the hope that it will be useful, | 
| - * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| - * GNU General Public License for more details. | 
| - * | 
| - * You should have received a copy of the GNU General Public License | 
| - * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| - */ | 
| - | 
| -// | 
| -// This file has been generated automatically from Adblock Plus for Firefox | 
| -// source code. DO NOT MODIFY, change the original source code instead. | 
| -// | 
| -// Relevant repositories: | 
| -// * https://hg.adblockplus.org/adblockplus/ | 
| -// * https://hg.adblockplus.org/jshydra/ | 
| -// | 
| - | 
| -require.scopes["filterNotifier"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var listeners = []; | 
| -  var FilterNotifier = exports.FilterNotifier = | 
| -  { | 
| -    addListener: function(listener) | 
| -    { | 
| -      if (listeners.indexOf(listener) >= 0) | 
| -      { | 
| -        return; | 
| -      } | 
| -      listeners.push(listener); | 
| -    }, | 
| -    removeListener: function(listener) | 
| -    { | 
| -      var index = listeners.indexOf(listener); | 
| -      if (index >= 0) | 
| -      { | 
| -        listeners.splice(index, 1); | 
| -      } | 
| -    }, | 
| -    triggerListeners: function(action, item, param1, param2, param3) | 
| -    { | 
| -      for (var _loopIndex0 = 0; _loopIndex0 < listeners.length; ++_loopIndex0) | 
| -      { | 
| -        var listener = listeners[_loopIndex0]; | 
| -        listener(action, item, param1, param2, param3); | 
| -      } | 
| -    } | 
| -  }; | 
| -  return exports; | 
| -})(); | 
| -require.scopes["filterClasses"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| - | 
| -  function Filter(text) | 
| -  { | 
| -    this.text = text; | 
| -    this.subscriptions = []; | 
| -  } | 
| -  exports.Filter = Filter; | 
| -  Filter.prototype = | 
| -  { | 
| -    text: null, | 
| -    subscriptions: null, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      buffer.push("[Filter]"); | 
| -      buffer.push("text=" + this.text); | 
| -    }, | 
| -    toString: function() | 
| -    { | 
| -      return this.text; | 
| -    } | 
| -  }; | 
| -  Filter.knownFilters = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; | 
| -  Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; | 
| -  Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; | 
| -  Filter.fromText = function(text) | 
| -  { | 
| -    if (text in Filter.knownFilters) | 
| -    { | 
| -      return Filter.knownFilters[text]; | 
| -    } | 
| -    var ret; | 
| -    var match = text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null; | 
| -    if (match) | 
| -    { | 
| -      ret = ElemHideBase.fromText(text, match[1], match[2], match[3], match[4], match[5]); | 
| -    } | 
| -    else if (text[0] == "!") | 
| -    { | 
| -      ret = new CommentFilter(text); | 
| -    } | 
| -    else | 
| -    { | 
| -      ret = RegExpFilter.fromText(text); | 
| -    } | 
| -    Filter.knownFilters[ret.text] = ret; | 
| -    return ret; | 
| -  }; | 
| -  Filter.fromObject = function(obj) | 
| -  { | 
| -    var ret = Filter.fromText(obj.text); | 
| -    if (ret instanceof ActiveFilter) | 
| -    { | 
| -      if ("disabled" in obj) | 
| -      { | 
| -        ret._disabled = obj.disabled == "true"; | 
| -      } | 
| -      if ("hitCount" in obj) | 
| -      { | 
| -        ret._hitCount = parseInt(obj.hitCount) || 0; | 
| -      } | 
| -      if ("lastHit" in obj) | 
| -      { | 
| -        ret._lastHit = parseInt(obj.lastHit) || 0; | 
| -      } | 
| -    } | 
| -    return ret; | 
| -  }; | 
| -  Filter.normalize = function(text) | 
| -  { | 
| -    if (!text) | 
| -    { | 
| -      return text; | 
| -    } | 
| -    text = text.replace(/[^\S ]/g, ""); | 
| -    if (/^\s*!/.test(text)) | 
| -    { | 
| -      return text.replace(/^\s+/, "").replace(/\s+$/, ""); | 
| -    } | 
| -    else if (Filter.elemhideRegExp.test(text)) | 
| -    { | 
| -      var _tempVar1 = /^(.*?)(#\@?#?)(.*)$/.exec(text); | 
| -      var domain = _tempVar1[1]; | 
| -      var separator = _tempVar1[2]; | 
| -      var selector = _tempVar1[3]; | 
| -      return domain.replace(/\s/g, "") + separator + selector.replace(/^\s+/, "").replace(/\s+$/, ""); | 
| -    } | 
| -    else | 
| -    { | 
| -      return text.replace(/\s/g, ""); | 
| -    } | 
| -  }; | 
| - | 
| -  function InvalidFilter(text, reason) | 
| -  { | 
| -    Filter.call(this, text); | 
| -    this.reason = reason; | 
| -  } | 
| -  exports.InvalidFilter = InvalidFilter; | 
| -  InvalidFilter.prototype = | 
| -  { | 
| -    __proto__: Filter.prototype, | 
| -    reason: null, | 
| -    serialize: function(buffer){} | 
| -  }; | 
| - | 
| -  function CommentFilter(text) | 
| -  { | 
| -    Filter.call(this, text); | 
| -  } | 
| -  exports.CommentFilter = CommentFilter; | 
| -  CommentFilter.prototype = | 
| -  { | 
| -    __proto__: Filter.prototype, | 
| -    serialize: function(buffer){} | 
| -  }; | 
| - | 
| -  function ActiveFilter(text, domains) | 
| -  { | 
| -    Filter.call(this, text); | 
| -    this.domainSource = domains; | 
| -  } | 
| -  exports.ActiveFilter = ActiveFilter; | 
| -  ActiveFilter.prototype = | 
| -  { | 
| -    __proto__: Filter.prototype, | 
| -    _disabled: false, | 
| -    _hitCount: 0, | 
| -    _lastHit: 0, | 
| -    get disabled() | 
| -    { | 
| -      return this._disabled; | 
| -    }, | 
| -    set disabled(value) | 
| -    { | 
| -      if (value != this._disabled) | 
| -      { | 
| -        var oldValue = this._disabled; | 
| -        this._disabled = value; | 
| -        FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue); | 
| -      } | 
| -      return this._disabled; | 
| -    }, | 
| -    get hitCount() | 
| -    { | 
| -      return this._hitCount; | 
| -    }, | 
| -    set hitCount(value) | 
| -    { | 
| -      if (value != this._hitCount) | 
| -      { | 
| -        var oldValue = this._hitCount; | 
| -        this._hitCount = value; | 
| -        FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue); | 
| -      } | 
| -      return this._hitCount; | 
| -    }, | 
| -    get lastHit() | 
| -    { | 
| -      return this._lastHit; | 
| -    }, | 
| -    set lastHit(value) | 
| -    { | 
| -      if (value != this._lastHit) | 
| -      { | 
| -        var oldValue = this._lastHit; | 
| -        this._lastHit = value; | 
| -        FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue); | 
| -      } | 
| -      return this._lastHit; | 
| -    }, | 
| -    domainSource: null, | 
| -    domainSeparator: null, | 
| -    ignoreTrailingDot: true, | 
| -    get domains() | 
| -    { | 
| -      var domains = null; | 
| -      if (this.domainSource) | 
| -      { | 
| -        var list = this.domainSource.split(this.domainSeparator); | 
| -        if (list.length == 1 && list[0][0] != "~") | 
| -        { | 
| -          domains = | 
| -          { | 
| -            __proto__: null, | 
| -            "": false | 
| -          }; | 
| -          if (this.ignoreTrailingDot) | 
| -          { | 
| -            list[0] = list[0].replace(/\.+$/, ""); | 
| -          } | 
| -          domains[list[0]] = true; | 
| -        } | 
| -        else | 
| -        { | 
| -          var hasIncludes = false; | 
| -          for (var i = 0; i < list.length; i++) | 
| -          { | 
| -            var domain = list[i]; | 
| -            if (this.ignoreTrailingDot) | 
| -            { | 
| -              domain = domain.replace(/\.+$/, ""); | 
| -            } | 
| -            if (domain == "") | 
| -            { | 
| -              continue; | 
| -            } | 
| -            var include; | 
| -            if (domain[0] == "~") | 
| -            { | 
| -              include = false; | 
| -              domain = domain.substr(1); | 
| -            } | 
| -            else | 
| -            { | 
| -              include = true; | 
| -              hasIncludes = true; | 
| -            } | 
| -            if (!domains) | 
| -            { | 
| -              domains = | 
| -              { | 
| -                __proto__: null | 
| -              }; | 
| -            } | 
| -            domains[domain] = include; | 
| -          } | 
| -          domains[""] = !hasIncludes; | 
| -        } | 
| -        delete this.domainSource; | 
| -      } | 
| -      this.__defineGetter__("domains", function() | 
| -      { | 
| -        return domains; | 
| -      }); | 
| -      return this.domains; | 
| -    }, | 
| -    isActiveOnDomain: function(docDomain) | 
| -    { | 
| -      if (!this.domains) | 
| -      { | 
| -        return true; | 
| -      } | 
| -      if (!docDomain) | 
| -      { | 
| -        return this.domains[""]; | 
| -      } | 
| -      if (this.ignoreTrailingDot) | 
| -      { | 
| -        docDomain = docDomain.replace(/\.+$/, ""); | 
| -      } | 
| -      docDomain = docDomain.toUpperCase(); | 
| -      while (true) | 
| -      { | 
| -        if (docDomain in this.domains) | 
| -        { | 
| -          return this.domains[docDomain]; | 
| -        } | 
| -        var nextDot = docDomain.indexOf("."); | 
| -        if (nextDot < 0) | 
| -        { | 
| -          break; | 
| -        } | 
| -        docDomain = docDomain.substr(nextDot + 1); | 
| -      } | 
| -      return this.domains[""]; | 
| -    }, | 
| -    isActiveOnlyOnDomain: function(docDomain) | 
| -    { | 
| -      if (!docDomain || !this.domains || this.domains[""]) | 
| -      { | 
| -        return false; | 
| -      } | 
| -      if (this.ignoreTrailingDot) | 
| -      { | 
| -        docDomain = docDomain.replace(/\.+$/, ""); | 
| -      } | 
| -      docDomain = docDomain.toUpperCase(); | 
| -      for (var domain in this.domains) | 
| -      { | 
| -        if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) | 
| -        { | 
| -          return false; | 
| -        } | 
| -      } | 
| -      return true; | 
| -    }, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      if (this._disabled || this._hitCount || this._lastHit) | 
| -      { | 
| -        Filter.prototype.serialize.call(this, buffer); | 
| -        if (this._disabled) | 
| -        { | 
| -          buffer.push("disabled=true"); | 
| -        } | 
| -        if (this._hitCount) | 
| -        { | 
| -          buffer.push("hitCount=" + this._hitCount); | 
| -        } | 
| -        if (this._lastHit) | 
| -        { | 
| -          buffer.push("lastHit=" + this._lastHit); | 
| -        } | 
| -      } | 
| -    } | 
| -  }; | 
| - | 
| -  function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty) | 
| -  { | 
| -    ActiveFilter.call(this, text, domains); | 
| -    if (contentType != null) | 
| -    { | 
| -      this.contentType = contentType; | 
| -    } | 
| -    if (matchCase) | 
| -    { | 
| -      this.matchCase = matchCase; | 
| -    } | 
| -    if (thirdParty != null) | 
| -    { | 
| -      this.thirdParty = thirdParty; | 
| -    } | 
| -    if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/") | 
| -    { | 
| -      var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); | 
| -      this.__defineGetter__("regexp", function() | 
| -      { | 
| -        return regexp; | 
| -      }); | 
| -    } | 
| -    else | 
| -    { | 
| -      this.regexpSource = regexpSource; | 
| -    } | 
| -  } | 
| -  exports.RegExpFilter = RegExpFilter; | 
| -  RegExpFilter.prototype = | 
| -  { | 
| -    __proto__: ActiveFilter.prototype, | 
| -    length: 1, | 
| -    domainSeparator: "|", | 
| -    regexpSource: null, | 
| -    get regexp() | 
| -    { | 
| -      var source = this.regexpSource.replace(/\*+/g, "*"); | 
| -      if (source[0] == "*") | 
| -      { | 
| -        source = source.substr(1); | 
| -      } | 
| -      var pos = source.length - 1; | 
| -      if (pos >= 0 && source[pos] == "*") | 
| -      { | 
| -        source = source.substr(0, pos); | 
| -      } | 
| -      source = source.replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x80]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^.\\/]+\\.)*?").replace(/^\\\|/, "^").replace(/\\\|$/, "$"); | 
| -      var regexp = new RegExp(source, this.matchCase ? "" : "i"); | 
| -      delete this.regexpSource; | 
| -      this.__defineGetter__("regexp", function() | 
| -      { | 
| -        return regexp; | 
| -      }); | 
| -      return this.regexp; | 
| -    }, | 
| -    contentType: 2147483647, | 
| -    matchCase: false, | 
| -    thirdParty: null, | 
| -    matches: function(location, contentType, docDomain, thirdParty) | 
| -    { | 
| -      if (this.regexp.test(location) && (RegExpFilter.typeMap[contentType] & this.contentType) != 0 && (this.thirdParty == null || this.thirdParty == thirdParty) && this.isActiveOnDomain(docDomain)) | 
| -      { | 
| -        return true; | 
| -      } | 
| -      return false; | 
| -    } | 
| -  }; | 
| -  RegExpFilter.prototype.__defineGetter__("0", function() | 
| -  { | 
| -    return this; | 
| -  }); | 
| -  RegExpFilter.fromText = function(text) | 
| -  { | 
| -    var blocking = true; | 
| -    var origText = text; | 
| -    if (text.indexOf("@@") == 0) | 
| -    { | 
| -      blocking = false; | 
| -      text = text.substr(2); | 
| -    } | 
| -    var contentType = null; | 
| -    var matchCase = null; | 
| -    var domains = null; | 
| -    var siteKeys = null; | 
| -    var thirdParty = null; | 
| -    var collapse = null; | 
| -    var options; | 
| -    var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; | 
| -    if (match) | 
| -    { | 
| -      options = match[1].toUpperCase().split(","); | 
| -      text = match.input.substr(0, match.index); | 
| -      for (var _loopIndex2 = 0; _loopIndex2 < options.length; ++_loopIndex2) | 
| -      { | 
| -        var option = options[_loopIndex2]; | 
| -        var value = null; | 
| -        var separatorIndex = option.indexOf("="); | 
| -        if (separatorIndex >= 0) | 
| -        { | 
| -          value = option.substr(separatorIndex + 1); | 
| -          option = option.substr(0, separatorIndex); | 
| -        } | 
| -        option = option.replace(/-/, "_"); | 
| -        if (option in RegExpFilter.typeMap) | 
| -        { | 
| -          if (contentType == null) | 
| -          { | 
| -            contentType = 0; | 
| -          } | 
| -          contentType |= RegExpFilter.typeMap[option]; | 
| -        } | 
| -        else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap) | 
| -        { | 
| -          if (contentType == null) | 
| -          { | 
| -            contentType = RegExpFilter.prototype.contentType; | 
| -          } | 
| -          contentType &= ~RegExpFilter.typeMap[option.substr(1)]; | 
| -        } | 
| -        else if (option == "MATCH_CASE") | 
| -        { | 
| -          matchCase = true; | 
| -        } | 
| -        else if (option == "DOMAIN" && typeof value != "undefined") | 
| -        { | 
| -          domains = value; | 
| -        } | 
| -        else if (option == "THIRD_PARTY") | 
| -        { | 
| -          thirdParty = true; | 
| -        } | 
| -        else if (option == "~THIRD_PARTY") | 
| -        { | 
| -          thirdParty = false; | 
| -        } | 
| -        else if (option == "COLLAPSE") | 
| -        { | 
| -          collapse = true; | 
| -        } | 
| -        else if (option == "~COLLAPSE") | 
| -        { | 
| -          collapse = false; | 
| -        } | 
| -        else if (option == "SITEKEY" && typeof value != "undefined") | 
| -        { | 
| -          siteKeys = value.split(/\|/); | 
| -        } | 
| -      } | 
| -    } | 
| -    if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) | 
| -    { | 
| -      if (contentType == null) | 
| -      { | 
| -        contentType = RegExpFilter.prototype.contentType; | 
| -      } | 
| -      contentType &= ~RegExpFilter.typeMap.DOCUMENT; | 
| -    } | 
| -    if (!blocking && siteKeys) | 
| -    { | 
| -      contentType = RegExpFilter.typeMap.DOCUMENT; | 
| -    } | 
| -    try | 
| -    { | 
| -      if (blocking) | 
| -      { | 
| -        return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, collapse); | 
| -      } | 
| -      else | 
| -      { | 
| -        return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys); | 
| -      } | 
| -    } | 
| -    catch (e) | 
| -    { | 
| -      return new InvalidFilter(text, e); | 
| -    } | 
| -  }; | 
| -  RegExpFilter.typeMap = | 
| -  { | 
| -    OTHER: 1, | 
| -    SCRIPT: 2, | 
| -    IMAGE: 4, | 
| -    STYLESHEET: 8, | 
| -    OBJECT: 16, | 
| -    SUBDOCUMENT: 32, | 
| -    DOCUMENT: 64, | 
| -    XBL: 1, | 
| -    PING: 1, | 
| -    XMLHTTPREQUEST: 2048, | 
| -    OBJECT_SUBREQUEST: 4096, | 
| -    DTD: 1, | 
| -    MEDIA: 16384, | 
| -    FONT: 32768, | 
| -    BACKGROUND: 4, | 
| -    POPUP: 268435456, | 
| -    DONOTTRACK: 536870912, | 
| -    ELEMHIDE: 1073741824 | 
| -  }; | 
| -  RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.DONOTTRACK | RegExpFilter.typeMap.POPUP); | 
| - | 
| -  function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, collapse) | 
| -  { | 
| -    RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty); | 
| -    this.collapse = collapse; | 
| -  } | 
| -  exports.BlockingFilter = BlockingFilter; | 
| -  BlockingFilter.prototype = | 
| -  { | 
| -    __proto__: RegExpFilter.prototype, | 
| -    collapse: null | 
| -  }; | 
| - | 
| -  function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys) | 
| -  { | 
| -    RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty); | 
| -    if (siteKeys != null) | 
| -    { | 
| -      this.siteKeys = siteKeys; | 
| -    } | 
| -  } | 
| -  exports.WhitelistFilter = WhitelistFilter; | 
| -  WhitelistFilter.prototype = | 
| -  { | 
| -    __proto__: RegExpFilter.prototype, | 
| -    siteKeys: null | 
| -  }; | 
| - | 
| -  function ElemHideBase(text, domains, selector) | 
| -  { | 
| -    ActiveFilter.call(this, text, domains ? domains.toUpperCase() : null); | 
| -    if (domains) | 
| -    { | 
| -      this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase(); | 
| -    } | 
| -    this.selector = selector; | 
| -  } | 
| -  exports.ElemHideBase = ElemHideBase; | 
| -  ElemHideBase.prototype = | 
| -  { | 
| -    __proto__: ActiveFilter.prototype, | 
| -    domainSeparator: ",", | 
| -    ignoreTrailingDot: false, | 
| -    selectorDomain: null, | 
| -    selector: null | 
| -  }; | 
| -  ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector) | 
| -  { | 
| -    if (!selector) | 
| -    { | 
| -      if (tagName == "*") | 
| -      { | 
| -        tagName = ""; | 
| -      } | 
| -      var id = null; | 
| -      var additional = ""; | 
| -      if (attrRules) | 
| -      { | 
| -        attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g); | 
| -        for (var _loopIndex3 = 0; _loopIndex3 < attrRules.length; ++_loopIndex3) | 
| -        { | 
| -          var rule = attrRules[_loopIndex3]; | 
| -          rule = rule.substr(1, rule.length - 2); | 
| -          var separatorPos = rule.indexOf("="); | 
| -          if (separatorPos > 0) | 
| -          { | 
| -            rule = rule.replace(/=/, "=\"") + "\""; | 
| -            additional += "[" + rule + "]"; | 
| -          } | 
| -          else | 
| -          { | 
| -            if (id) | 
| -            { | 
| -              var Utils = require("utils").Utils; | 
| -              return new InvalidFilter(text, Utils.getString("filter_elemhide_duplicate_id")); | 
| -            } | 
| -            else | 
| -            { | 
| -              id = rule; | 
| -            } | 
| -          } | 
| -        } | 
| -      } | 
| -      if (id) | 
| -      { | 
| -        selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional; | 
| -      } | 
| -      else if (tagName || additional) | 
| -      { | 
| -        selector = tagName + additional; | 
| -      } | 
| -      else | 
| -      { | 
| -        var Utils = require("utils").Utils; | 
| -        return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria")); | 
| -      } | 
| -    } | 
| -    if (isException) | 
| -    { | 
| -      return new ElemHideException(text, domain, selector); | 
| -    } | 
| -    else | 
| -    { | 
| -      return new ElemHideFilter(text, domain, selector); | 
| -    } | 
| -  }; | 
| - | 
| -  function ElemHideFilter(text, domains, selector) | 
| -  { | 
| -    ElemHideBase.call(this, text, domains, selector); | 
| -  } | 
| -  exports.ElemHideFilter = ElemHideFilter; | 
| -  ElemHideFilter.prototype = | 
| -  { | 
| -    __proto__: ElemHideBase.prototype | 
| -  }; | 
| - | 
| -  function ElemHideException(text, domains, selector) | 
| -  { | 
| -    ElemHideBase.call(this, text, domains, selector); | 
| -  } | 
| -  exports.ElemHideException = ElemHideException; | 
| -  ElemHideException.prototype = | 
| -  { | 
| -    __proto__: ElemHideBase.prototype | 
| -  }; | 
| -  return exports; | 
| -})(); | 
| -require.scopes["subscriptionClasses"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var _tempVar4 = require("filterClasses"); | 
| -  var ActiveFilter = _tempVar4.ActiveFilter; | 
| -  var BlockingFilter = _tempVar4.BlockingFilter; | 
| -  var WhitelistFilter = _tempVar4.WhitelistFilter; | 
| -  var ElemHideBase = _tempVar4.ElemHideBase; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| - | 
| -  function Subscription(url, title) | 
| -  { | 
| -    this.url = url; | 
| -    this.filters = []; | 
| -    if (title) | 
| -    { | 
| -      this._title = title; | 
| -    } | 
| -    else | 
| -    { | 
| -      var Utils = require("utils").Utils; | 
| -      this._title = Utils.getString("newGroup_title"); | 
| -    } | 
| -    Subscription.knownSubscriptions[url] = this; | 
| -  } | 
| -  exports.Subscription = Subscription; | 
| -  Subscription.prototype = | 
| -  { | 
| -    url: null, | 
| -    filters: null, | 
| -    _title: null, | 
| -    _fixedTitle: false, | 
| -    _disabled: false, | 
| -    get title() | 
| -    { | 
| -      return this._title; | 
| -    }, | 
| -    set title(value) | 
| -    { | 
| -      if (value != this._title) | 
| -      { | 
| -        var oldValue = this._title; | 
| -        this._title = value; | 
| -        FilterNotifier.triggerListeners("subscription.title", this, value, oldValue); | 
| -      } | 
| -      return this._title; | 
| -    }, | 
| -    get fixedTitle() | 
| -    { | 
| -      return this._fixedTitle; | 
| -    }, | 
| -    set fixedTitle(value) | 
| -    { | 
| -      if (value != this._fixedTitle) | 
| -      { | 
| -        var oldValue = this._fixedTitle; | 
| -        this._fixedTitle = value; | 
| -        FilterNotifier.triggerListeners("subscription.fixedTitle", this, value, oldValue); | 
| -      } | 
| -      return this._fixedTitle; | 
| -    }, | 
| -    get disabled() | 
| -    { | 
| -      return this._disabled; | 
| -    }, | 
| -    set disabled(value) | 
| -    { | 
| -      if (value != this._disabled) | 
| -      { | 
| -        var oldValue = this._disabled; | 
| -        this._disabled = value; | 
| -        FilterNotifier.triggerListeners("subscription.disabled", this, value, oldValue); | 
| -      } | 
| -      return this._disabled; | 
| -    }, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      buffer.push("[Subscription]"); | 
| -      buffer.push("url=" + this.url); | 
| -      buffer.push("title=" + this._title); | 
| -      if (this._fixedTitle) | 
| -      { | 
| -        buffer.push("fixedTitle=true"); | 
| -      } | 
| -      if (this._disabled) | 
| -      { | 
| -        buffer.push("disabled=true"); | 
| -      } | 
| -    }, | 
| -    serializeFilters: function(buffer) | 
| -    { | 
| -      for (var _loopIndex5 = 0; _loopIndex5 < this.filters.length; ++_loopIndex5) | 
| -      { | 
| -        var filter = this.filters[_loopIndex5]; | 
| -        buffer.push(filter.text.replace(/\[/g, "\\[")); | 
| -      } | 
| -    }, | 
| -    toString: function() | 
| -    { | 
| -      var buffer = []; | 
| -      this.serialize(buffer); | 
| -      return buffer.join("\n"); | 
| -    } | 
| -  }; | 
| -  Subscription.knownSubscriptions = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  Subscription.fromURL = function(url) | 
| -  { | 
| -    if (url in Subscription.knownSubscriptions) | 
| -    { | 
| -      return Subscription.knownSubscriptions[url]; | 
| -    } | 
| -    try | 
| -    { | 
| -      url = Services.io.newURI(url, null, null).spec; | 
| -      return new DownloadableSubscription(url, null); | 
| -    } | 
| -    catch (e) | 
| -    { | 
| -      return new SpecialSubscription(url); | 
| -    } | 
| -  }; | 
| -  Subscription.fromObject = function(obj) | 
| -  { | 
| -    var result; | 
| -    try | 
| -    { | 
| -      obj.url = Services.io.newURI(obj.url, null, null).spec; | 
| -      result = new DownloadableSubscription(obj.url, obj.title); | 
| -      if ("nextURL" in obj) | 
| -      { | 
| -        result.nextURL = obj.nextURL; | 
| -      } | 
| -      if ("downloadStatus" in obj) | 
| -      { | 
| -        result._downloadStatus = obj.downloadStatus; | 
| -      } | 
| -      if ("lastModified" in obj) | 
| -      { | 
| -        result.lastModified = obj.lastModified; | 
| -      } | 
| -      if ("lastSuccess" in obj) | 
| -      { | 
| -        result.lastSuccess = parseInt(obj.lastSuccess) || 0; | 
| -      } | 
| -      if ("lastCheck" in obj) | 
| -      { | 
| -        result._lastCheck = parseInt(obj.lastCheck) || 0; | 
| -      } | 
| -      if ("expires" in obj) | 
| -      { | 
| -        result.expires = parseInt(obj.expires) || 0; | 
| -      } | 
| -      if ("softExpiration" in obj) | 
| -      { | 
| -        result.softExpiration = parseInt(obj.softExpiration) || 0; | 
| -      } | 
| -      if ("errors" in obj) | 
| -      { | 
| -        result._errors = parseInt(obj.errors) || 0; | 
| -      } | 
| -      if ("requiredVersion" in obj) | 
| -      { | 
| -        var addonVersion = require("info").addonVersion; | 
| -        result.requiredVersion = obj.requiredVersion; | 
| -        if (Services.vc.compare(result.requiredVersion, addonVersion) > 0) | 
| -        { | 
| -          result.upgradeRequired = true; | 
| -        } | 
| -      } | 
| -      if ("alternativeLocations" in obj) | 
| -      { | 
| -        result.alternativeLocations = obj.alternativeLocations; | 
| -      } | 
| -      if ("homepage" in obj) | 
| -      { | 
| -        result._homepage = obj.homepage; | 
| -      } | 
| -      if ("lastDownload" in obj) | 
| -      { | 
| -        result._lastDownload = parseInt(obj.lastDownload) || 0; | 
| -      } | 
| -    } | 
| -    catch (e) | 
| -    { | 
| -      if (!("title" in obj)) | 
| -      { | 
| -        if (obj.url == "~wl~") | 
| -        { | 
| -          obj.defaults = "whitelist"; | 
| -        } | 
| -        else if (obj.url == "~fl~") | 
| -        { | 
| -          obj.defaults = "blocking"; | 
| -        } | 
| -        else if (obj.url == "~eh~") | 
| -        { | 
| -          obj.defaults = "elemhide"; | 
| -        } | 
| -        if ("defaults" in obj) | 
| -        { | 
| -          var Utils = require("utils").Utils; | 
| -          obj.title = Utils.getString(obj.defaults + "Group_title"); | 
| -        } | 
| -      } | 
| -      result = new SpecialSubscription(obj.url, obj.title); | 
| -      if ("defaults" in obj) | 
| -      { | 
| -        result.defaults = obj.defaults.split(" "); | 
| -      } | 
| -    } | 
| -    if ("fixedTitle" in obj) | 
| -    { | 
| -      result._fixedTitle = obj.fixedTitle == "true"; | 
| -    } | 
| -    if ("disabled" in obj) | 
| -    { | 
| -      result._disabled = obj.disabled == "true"; | 
| -    } | 
| -    return result; | 
| -  }; | 
| - | 
| -  function SpecialSubscription(url, title) | 
| -  { | 
| -    Subscription.call(this, url, title); | 
| -  } | 
| -  exports.SpecialSubscription = SpecialSubscription; | 
| -  SpecialSubscription.prototype = | 
| -  { | 
| -    __proto__: Subscription.prototype, | 
| -    defaults: null, | 
| -    isDefaultFor: function(filter) | 
| -    { | 
| -      if (this.defaults && this.defaults.length) | 
| -      { | 
| -        for (var _loopIndex6 = 0; _loopIndex6 < this.defaults.length; ++_loopIndex6) | 
| -        { | 
| -          var type = this.defaults[_loopIndex6]; | 
| -          if (filter instanceof SpecialSubscription.defaultsMap[type]) | 
| -          { | 
| -            return true; | 
| -          } | 
| -          if (!(filter instanceof ActiveFilter) && type == "blacklist") | 
| -          { | 
| -            return true; | 
| -          } | 
| -        } | 
| -      } | 
| -      return false; | 
| -    }, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      Subscription.prototype.serialize.call(this, buffer); | 
| -      if (this.defaults && this.defaults.length) | 
| -      { | 
| -        buffer.push("defaults=" + this.defaults.filter(function(type) | 
| -        { | 
| -          return type in SpecialSubscription.defaultsMap; | 
| -        }).join(" ")); | 
| -      } | 
| -      if (this._lastDownload) | 
| -      { | 
| -        buffer.push("lastDownload=" + this._lastDownload); | 
| -      } | 
| -    } | 
| -  }; | 
| -  SpecialSubscription.defaultsMap = | 
| -  { | 
| -    __proto__: null, | 
| -    "whitelist": WhitelistFilter, | 
| -    "blocking": BlockingFilter, | 
| -    "elemhide": ElemHideBase | 
| -  }; | 
| -  SpecialSubscription.create = function(title) | 
| -  { | 
| -    var url; | 
| -    do | 
| -    { | 
| -      url = "~user~" + Math.round(Math.random() * 1000000); | 
| -    } | 
| -    while (url in Subscription.knownSubscriptions); | 
| -    return new SpecialSubscription(url, title); | 
| -  }; | 
| -  SpecialSubscription.createForFilter = function(filter) | 
| -  { | 
| -    var subscription = SpecialSubscription.create(); | 
| -    subscription.filters.push(filter); | 
| -    for (var type in SpecialSubscription.defaultsMap) | 
| -    { | 
| -      if (filter instanceof SpecialSubscription.defaultsMap[type]) | 
| -      { | 
| -        subscription.defaults = [type]; | 
| -      } | 
| -    } | 
| -    if (!subscription.defaults) | 
| -    { | 
| -      subscription.defaults = ["blocking"]; | 
| -    } | 
| -    var Utils = require("utils").Utils; | 
| -    subscription.title = Utils.getString(subscription.defaults[0] + "Group_title"); | 
| -    return subscription; | 
| -  }; | 
| - | 
| -  function RegularSubscription(url, title) | 
| -  { | 
| -    Subscription.call(this, url, title || url); | 
| -  } | 
| -  exports.RegularSubscription = RegularSubscription; | 
| -  RegularSubscription.prototype = | 
| -  { | 
| -    __proto__: Subscription.prototype, | 
| -    _homepage: null, | 
| -    _lastDownload: 0, | 
| -    get homepage() | 
| -    { | 
| -      return this._homepage; | 
| -    }, | 
| -    set homepage(value) | 
| -    { | 
| -      if (value != this._homepage) | 
| -      { | 
| -        var oldValue = this._homepage; | 
| -        this._homepage = value; | 
| -        FilterNotifier.triggerListeners("subscription.homepage", this, value, oldValue); | 
| -      } | 
| -      return this._homepage; | 
| -    }, | 
| -    get lastDownload() | 
| -    { | 
| -      return this._lastDownload; | 
| -    }, | 
| -    set lastDownload(value) | 
| -    { | 
| -      if (value != this._lastDownload) | 
| -      { | 
| -        var oldValue = this._lastDownload; | 
| -        this._lastDownload = value; | 
| -        FilterNotifier.triggerListeners("subscription.lastDownload", this, value, oldValue); | 
| -      } | 
| -      return this._lastDownload; | 
| -    }, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      Subscription.prototype.serialize.call(this, buffer); | 
| -      if (this._homepage) | 
| -      { | 
| -        buffer.push("homepage=" + this._homepage); | 
| -      } | 
| -      if (this._lastDownload) | 
| -      { | 
| -        buffer.push("lastDownload=" + this._lastDownload); | 
| -      } | 
| -    } | 
| -  }; | 
| - | 
| -  function ExternalSubscription(url, title) | 
| -  { | 
| -    RegularSubscription.call(this, url, title); | 
| -  } | 
| -  exports.ExternalSubscription = ExternalSubscription; | 
| -  ExternalSubscription.prototype = | 
| -  { | 
| -    __proto__: RegularSubscription.prototype, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      throw new Error("Unexpected call, external subscriptions should not be serialized"); | 
| -    } | 
| -  }; | 
| - | 
| -  function DownloadableSubscription(url, title) | 
| -  { | 
| -    RegularSubscription.call(this, url, title); | 
| -  } | 
| -  exports.DownloadableSubscription = DownloadableSubscription; | 
| -  DownloadableSubscription.prototype = | 
| -  { | 
| -    __proto__: RegularSubscription.prototype, | 
| -    _downloadStatus: null, | 
| -    _lastCheck: 0, | 
| -    _errors: 0, | 
| -    nextURL: null, | 
| -    get downloadStatus() | 
| -    { | 
| -      return this._downloadStatus; | 
| -    }, | 
| -    set downloadStatus(value) | 
| -    { | 
| -      var oldValue = this._downloadStatus; | 
| -      this._downloadStatus = value; | 
| -      FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, oldValue); | 
| -      return this._downloadStatus; | 
| -    }, | 
| -    lastModified: null, | 
| -    lastSuccess: 0, | 
| -    get lastCheck() | 
| -    { | 
| -      return this._lastCheck; | 
| -    }, | 
| -    set lastCheck(value) | 
| -    { | 
| -      if (value != this._lastCheck) | 
| -      { | 
| -        var oldValue = this._lastCheck; | 
| -        this._lastCheck = value; | 
| -        FilterNotifier.triggerListeners("subscription.lastCheck", this, value, oldValue); | 
| -      } | 
| -      return this._lastCheck; | 
| -    }, | 
| -    expires: 0, | 
| -    softExpiration: 0, | 
| -    get errors() | 
| -    { | 
| -      return this._errors; | 
| -    }, | 
| -    set errors(value) | 
| -    { | 
| -      if (value != this._errors) | 
| -      { | 
| -        var oldValue = this._errors; | 
| -        this._errors = value; | 
| -        FilterNotifier.triggerListeners("subscription.errors", this, value, oldValue); | 
| -      } | 
| -      return this._errors; | 
| -    }, | 
| -    requiredVersion: null, | 
| -    upgradeRequired: false, | 
| -    alternativeLocations: null, | 
| -    serialize: function(buffer) | 
| -    { | 
| -      RegularSubscription.prototype.serialize.call(this, buffer); | 
| -      if (this.nextURL) | 
| -      { | 
| -        buffer.push("nextURL=" + this.nextURL); | 
| -      } | 
| -      if (this.downloadStatus) | 
| -      { | 
| -        buffer.push("downloadStatus=" + this.downloadStatus); | 
| -      } | 
| -      if (this.lastModified) | 
| -      { | 
| -        buffer.push("lastModified=" + this.lastModified); | 
| -      } | 
| -      if (this.lastSuccess) | 
| -      { | 
| -        buffer.push("lastSuccess=" + this.lastSuccess); | 
| -      } | 
| -      if (this.lastCheck) | 
| -      { | 
| -        buffer.push("lastCheck=" + this.lastCheck); | 
| -      } | 
| -      if (this.expires) | 
| -      { | 
| -        buffer.push("expires=" + this.expires); | 
| -      } | 
| -      if (this.softExpiration) | 
| -      { | 
| -        buffer.push("softExpiration=" + this.softExpiration); | 
| -      } | 
| -      if (this.errors) | 
| -      { | 
| -        buffer.push("errors=" + this.errors); | 
| -      } | 
| -      if (this.requiredVersion) | 
| -      { | 
| -        buffer.push("requiredVersion=" + this.requiredVersion); | 
| -      } | 
| -      if (this.alternativeLocations) | 
| -      { | 
| -        buffer.push("alternativeLocations=" + this.alternativeLocations); | 
| -      } | 
| -    } | 
| -  }; | 
| -  return exports; | 
| -})(); | 
| -require.scopes["filterStorage"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var IO = require("io").IO; | 
| -  var Prefs = require("prefs").Prefs; | 
| -  var _tempVar7 = require("filterClasses"); | 
| -  var Filter = _tempVar7.Filter; | 
| -  var ActiveFilter = _tempVar7.ActiveFilter; | 
| -  var _tempVar8 = require("subscriptionClasses"); | 
| -  var Subscription = _tempVar8.Subscription; | 
| -  var SpecialSubscription = _tempVar8.SpecialSubscription; | 
| -  var ExternalSubscription = _tempVar8.ExternalSubscription; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| -  var formatVersion = 4; | 
| -  var FilterStorage = exports.FilterStorage = | 
| -  { | 
| -    get formatVersion() | 
| -    { | 
| -      return formatVersion; | 
| -    }, | 
| -    get sourceFile() | 
| -    { | 
| -      var file = null; | 
| -      if (Prefs.patternsfile) | 
| -      { | 
| -        file = IO.resolveFilePath(Prefs.patternsfile); | 
| -      } | 
| -      if (!file) | 
| -      { | 
| -        file = IO.resolveFilePath(Prefs.data_directory); | 
| -        if (file) | 
| -        { | 
| -          file.append("patterns.ini"); | 
| -        } | 
| -      } | 
| -      if (!file) | 
| -      { | 
| -        try | 
| -        { | 
| -          file = IO.resolveFilePath(Services.prefs.getDefaultBranch("extensions.adblockplus.").getCharPref("data_directory")); | 
| -          if (file) | 
| -          { | 
| -            file.append("patterns.ini"); | 
| -          } | 
| -        } | 
| -        catch (e){} | 
| -      } | 
| -      if (!file) | 
| -      { | 
| -        Cu.reportError("Adblock Plus: Failed to resolve filter file location from extensions.adblockplus.patternsfile preference"); | 
| -      } | 
| -      this.__defineGetter__("sourceFile", function() | 
| -      { | 
| -        return file; | 
| -      }); | 
| -      return this.sourceFile; | 
| -    }, | 
| -    fileProperties: | 
| -    { | 
| -      __proto__: null | 
| -    }, | 
| -    subscriptions: [], | 
| -    knownSubscriptions: | 
| -    { | 
| -      __proto__: null | 
| -    }, | 
| -    getGroupForFilter: function(filter) | 
| -    { | 
| -      var generalSubscription = null; | 
| -      for (var _loopIndex9 = 0; _loopIndex9 < FilterStorage.subscriptions.length; ++_loopIndex9) | 
| -      { | 
| -        var subscription = FilterStorage.subscriptions[_loopIndex9]; | 
| -        if (subscription instanceof SpecialSubscription && !subscription.disabled) | 
| -        { | 
| -          if (subscription.isDefaultFor(filter)) | 
| -          { | 
| -            return subscription; | 
| -          } | 
| -          if (!generalSubscription && (!subscription.defaults || !subscription.defaults.length)) | 
| -          { | 
| -            generalSubscription = subscription; | 
| -          } | 
| -        } | 
| -      } | 
| -      return generalSubscription; | 
| -    }, | 
| -    addSubscription: function(subscription, silent) | 
| -    { | 
| -      if (subscription.url in FilterStorage.knownSubscriptions) | 
| -      { | 
| -        return; | 
| -      } | 
| -      FilterStorage.subscriptions.push(subscription); | 
| -      FilterStorage.knownSubscriptions[subscription.url] = subscription; | 
| -      addSubscriptionFilters(subscription); | 
| -      if (!silent) | 
| -      { | 
| -        FilterNotifier.triggerListeners("subscription.added", subscription); | 
| -      } | 
| -    }, | 
| -    removeSubscription: function(subscription, silent) | 
| -    { | 
| -      for (var i = 0; i < FilterStorage.subscriptions.length; i++) | 
| -      { | 
| -        if (FilterStorage.subscriptions[i].url == subscription.url) | 
| -        { | 
| -          removeSubscriptionFilters(subscription); | 
| -          FilterStorage.subscriptions.splice(i--, 1); | 
| -          delete FilterStorage.knownSubscriptions[subscription.url]; | 
| -          if (!silent) | 
| -          { | 
| -            FilterNotifier.triggerListeners("subscription.removed", subscription); | 
| -          } | 
| -          return; | 
| -        } | 
| -      } | 
| -    }, | 
| -    moveSubscription: function(subscription, insertBefore) | 
| -    { | 
| -      var currentPos = FilterStorage.subscriptions.indexOf(subscription); | 
| -      if (currentPos < 0) | 
| -      { | 
| -        return; | 
| -      } | 
| -      var newPos = insertBefore ? FilterStorage.subscriptions.indexOf(insertBefore) : -1; | 
| -      if (newPos < 0) | 
| -      { | 
| -        newPos = FilterStorage.subscriptions.length; | 
| -      } | 
| -      if (currentPos < newPos) | 
| -      { | 
| -        newPos--; | 
| -      } | 
| -      if (currentPos == newPos) | 
| -      { | 
| -        return; | 
| -      } | 
| -      FilterStorage.subscriptions.splice(currentPos, 1); | 
| -      FilterStorage.subscriptions.splice(newPos, 0, subscription); | 
| -      FilterNotifier.triggerListeners("subscription.moved", subscription); | 
| -    }, | 
| -    updateSubscriptionFilters: function(subscription, filters) | 
| -    { | 
| -      removeSubscriptionFilters(subscription); | 
| -      subscription.oldFilters = subscription.filters; | 
| -      subscription.filters = filters; | 
| -      addSubscriptionFilters(subscription); | 
| -      FilterNotifier.triggerListeners("subscription.updated", subscription); | 
| -      delete subscription.oldFilters; | 
| -    }, | 
| -    addFilter: function(filter, subscription, position, silent) | 
| -    { | 
| -      if (!subscription) | 
| -      { | 
| -        if (filter.subscriptions.some(function(s) | 
| -        { | 
| -          return s instanceof SpecialSubscription && !s.disabled; | 
| -        })) | 
| -        { | 
| -          return; | 
| -        } | 
| -        subscription = FilterStorage.getGroupForFilter(filter); | 
| -      } | 
| -      if (!subscription) | 
| -      { | 
| -        subscription = SpecialSubscription.createForFilter(filter); | 
| -        this.addSubscription(subscription); | 
| -        return; | 
| -      } | 
| -      if (typeof position == "undefined") | 
| -      { | 
| -        position = subscription.filters.length; | 
| -      } | 
| -      if (filter.subscriptions.indexOf(subscription) < 0) | 
| -      { | 
| -        filter.subscriptions.push(subscription); | 
| -      } | 
| -      subscription.filters.splice(position, 0, filter); | 
| -      if (!silent) | 
| -      { | 
| -        FilterNotifier.triggerListeners("filter.added", filter, subscription, position); | 
| -      } | 
| -    }, | 
| -    removeFilter: function(filter, subscription, position) | 
| -    { | 
| -      var subscriptions = subscription ? [subscription] : filter.subscriptions.slice(); | 
| -      for (var i = 0; i < subscriptions.length; i++) | 
| -      { | 
| -        var subscription = subscriptions[i]; | 
| -        if (subscription instanceof SpecialSubscription) | 
| -        { | 
| -          var positions = []; | 
| -          if (typeof position == "undefined") | 
| -          { | 
| -            var index = -1; | 
| -            do | 
| -            { | 
| -              index = subscription.filters.indexOf(filter, index + 1); | 
| -              if (index >= 0) | 
| -              { | 
| -                positions.push(index); | 
| -              } | 
| -            } | 
| -            while (index >= 0); | 
| -          } | 
| -          else | 
| -          { | 
| -            positions.push(position); | 
| -          } | 
| -          for (var j = positions.length - 1; j >= 0; j--) | 
| -          { | 
| -            var position = positions[j]; | 
| -            if (subscription.filters[position] == filter) | 
| -            { | 
| -              subscription.filters.splice(position, 1); | 
| -              if (subscription.filters.indexOf(filter) < 0) | 
| -              { | 
| -                var index = filter.subscriptions.indexOf(subscription); | 
| -                if (index >= 0) | 
| -                { | 
| -                  filter.subscriptions.splice(index, 1); | 
| -                } | 
| -              } | 
| -              FilterNotifier.triggerListeners("filter.removed", filter, subscription, position); | 
| -            } | 
| -          } | 
| -        } | 
| -      } | 
| -    }, | 
| -    moveFilter: function(filter, subscription, oldPosition, newPosition) | 
| -    { | 
| -      if (!(subscription instanceof SpecialSubscription) || subscription.filters[oldPosition] != filter) | 
| -      { | 
| -        return; | 
| -      } | 
| -      newPosition = Math.min(Math.max(newPosition, 0), subscription.filters.length - 1); | 
| -      if (oldPosition == newPosition) | 
| -      { | 
| -        return; | 
| -      } | 
| -      subscription.filters.splice(oldPosition, 1); | 
| -      subscription.filters.splice(newPosition, 0, filter); | 
| -      FilterNotifier.triggerListeners("filter.moved", filter, subscription, oldPosition, newPosition); | 
| -    }, | 
| -    increaseHitCount: function(filter) | 
| -    { | 
| -      if (!Prefs.savestats || PrivateBrowsing.enabled || !(filter instanceof ActiveFilter)) | 
| -      { | 
| -        return; | 
| -      } | 
| -      filter.hitCount++; | 
| -      filter.lastHit = Date.now(); | 
| -    }, | 
| -    resetHitCounts: function(filters) | 
| -    { | 
| -      if (!filters) | 
| -      { | 
| -        filters = []; | 
| -        for (var text in Filter.knownFilters) | 
| -        { | 
| -          filters.push(Filter.knownFilters[text]); | 
| -        } | 
| -      } | 
| -      for (var _loopIndex10 = 0; _loopIndex10 < filters.length; ++_loopIndex10) | 
| -      { | 
| -        var filter = filters[_loopIndex10]; | 
| -        filter.hitCount = 0; | 
| -        filter.lastHit = 0; | 
| -      } | 
| -    }, | 
| -    _loading: false, | 
| -    loadFromDisk: function(sourceFile) | 
| -    { | 
| -      if (this._loading) | 
| -      { | 
| -        return; | 
| -      } | 
| -      var readFile = function(sourceFile, backupIndex) | 
| -      { | 
| -        var parser = new INIParser(); | 
| -        IO.readFromFile(sourceFile, true, parser, function(e) | 
| -        { | 
| -          if (!e && parser.subscriptions.length == 0) | 
| -          { | 
| -            e = new Error("No data in the file"); | 
| -          } | 
| -          if (e) | 
| -          { | 
| -            Cu.reportError(e); | 
| -          } | 
| -          if (e && !explicitFile) | 
| -          { | 
| -            sourceFile = this.sourceFile; | 
| -            if (sourceFile) | 
| -            { | 
| -              var _tempVar11 = /^(.*)(\.\w+)$/.exec(sourceFile.leafName) || [null, sourceFile.leafName, ""]; | 
| -              var part1 = _tempVar11[1]; | 
| -              var part2 = _tempVar11[2]; | 
| -              sourceFile = sourceFile.clone(); | 
| -              sourceFile.leafName = part1 + "-backup" + ++backupIndex + part2; | 
| -              IO.statFile(sourceFile, function(e, statData) | 
| -              { | 
| -                if (!e && statData.exists) | 
| -                { | 
| -                  readFile(sourceFile, backupIndex); | 
| -                } | 
| -                else | 
| -                { | 
| -                  doneReading(parser); | 
| -                } | 
| -              }); | 
| -              return; | 
| -            } | 
| -          } | 
| -          doneReading(parser); | 
| -        }.bind(this), "FilterStorageRead"); | 
| -      }.bind(this); | 
| -      var doneReading = function(parser) | 
| -      { | 
| -        var specialMap = | 
| -        { | 
| -          "~il~": true, | 
| -          "~wl~": true, | 
| -          "~fl~": true, | 
| -          "~eh~": true | 
| -        }; | 
| -        var knownSubscriptions = | 
| -        { | 
| -          __proto__: null | 
| -        }; | 
| -        for (var i = 0; i < parser.subscriptions.length; i++) | 
| -        { | 
| -          var subscription = parser.subscriptions[i]; | 
| -          if (subscription instanceof SpecialSubscription && subscription.filters.length == 0 && subscription.url in specialMap) | 
| -          { | 
| -            parser.subscriptions.splice(i--, 1); | 
| -          } | 
| -          else | 
| -          { | 
| -            knownSubscriptions[subscription.url] = subscription; | 
| -          } | 
| -        } | 
| -        this.fileProperties = parser.fileProperties; | 
| -        this.subscriptions = parser.subscriptions; | 
| -        this.knownSubscriptions = knownSubscriptions; | 
| -        Filter.knownFilters = parser.knownFilters; | 
| -        Subscription.knownSubscriptions = parser.knownSubscriptions; | 
| -        if (parser.userFilters) | 
| -        { | 
| -          for (var i = 0; i < parser.userFilters.length; i++) | 
| -          { | 
| -            var filter = Filter.fromText(parser.userFilters[i]); | 
| -            this.addFilter(filter, null, undefined, true); | 
| -          } | 
| -        } | 
| -        this._loading = false; | 
| -        FilterNotifier.triggerListeners("load"); | 
| -        if (sourceFile != this.sourceFile) | 
| -        { | 
| -          this.saveToDisk(); | 
| -        } | 
| -      }.bind(this); | 
| -      var startRead = function(file) | 
| -      { | 
| -        this._loading = true; | 
| -        readFile(file, 0); | 
| -      }.bind(this); | 
| -      var explicitFile; | 
| -      if (sourceFile) | 
| -      { | 
| -        explicitFile = true; | 
| -        startRead(sourceFile); | 
| -      } | 
| -      else | 
| -      { | 
| -        explicitFile = false; | 
| -        sourceFile = FilterStorage.sourceFile; | 
| -        var callback = function(e, statData) | 
| -        { | 
| -          if (e || !statData.exists) | 
| -          { | 
| -            var addonRoot = require("info").addonRoot; | 
| -            sourceFile = Services.io.newURI(addonRoot + "defaults/patterns.ini", null, null); | 
| -          } | 
| -          startRead(sourceFile); | 
| -        }; | 
| -        if (sourceFile) | 
| -        { | 
| -          IO.statFile(sourceFile, callback); | 
| -        } | 
| -        else | 
| -        { | 
| -          callback(true); | 
| -        } | 
| -      } | 
| -    }, | 
| -    _generateFilterData: function(subscriptions) | 
| -    { | 
| -      var _generatorResult12 = []; | 
| -      _generatorResult12.push("# Adblock Plus preferences"); | 
| -      _generatorResult12.push("version=" + formatVersion); | 
| -      var saved = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      var buf = []; | 
| -      for (var i = 0; i < subscriptions.length; i++) | 
| -      { | 
| -        var subscription = subscriptions[i]; | 
| -        for (var j = 0; j < subscription.filters.length; j++) | 
| -        { | 
| -          var filter = subscription.filters[j]; | 
| -          if (!(filter.text in saved)) | 
| -          { | 
| -            filter.serialize(buf); | 
| -            saved[filter.text] = filter; | 
| -            for (var k = 0; k < buf.length; k++) | 
| -            { | 
| -              _generatorResult12.push(buf[k]); | 
| -            } | 
| -            buf.splice(0); | 
| -          } | 
| -        } | 
| -      } | 
| -      for (var i = 0; i < subscriptions.length; i++) | 
| -      { | 
| -        var subscription = subscriptions[i]; | 
| -        _generatorResult12.push(""); | 
| -        subscription.serialize(buf); | 
| -        if (subscription.filters.length) | 
| -        { | 
| -          buf.push("", "[Subscription filters]"); | 
| -          subscription.serializeFilters(buf); | 
| -        } | 
| -        for (var k = 0; k < buf.length; k++) | 
| -        { | 
| -          _generatorResult12.push(buf[k]); | 
| -        } | 
| -        buf.splice(0); | 
| -      } | 
| -      return _generatorResult12; | 
| -    }, | 
| -    _saving: false, | 
| -    _needsSave: false, | 
| -    saveToDisk: function(targetFile) | 
| -    { | 
| -      var explicitFile = true; | 
| -      if (!targetFile) | 
| -      { | 
| -        targetFile = FilterStorage.sourceFile; | 
| -        explicitFile = false; | 
| -      } | 
| -      if (!targetFile) | 
| -      { | 
| -        return; | 
| -      } | 
| -      if (!explicitFile && this._saving) | 
| -      { | 
| -        this._needsSave = true; | 
| -        return; | 
| -      } | 
| -      try | 
| -      { | 
| -        targetFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); | 
| -      } | 
| -      catch (e){} | 
| -      var writeFilters = function() | 
| -      { | 
| -        IO.writeToFile(targetFile, true, this._generateFilterData(subscriptions), function(e) | 
| -        { | 
| -          if (!explicitFile) | 
| -          { | 
| -            this._saving = false; | 
| -          } | 
| -          if (e) | 
| -          { | 
| -            Cu.reportError(e); | 
| -          } | 
| -          if (!explicitFile && this._needsSave) | 
| -          { | 
| -            this._needsSave = false; | 
| -            this.saveToDisk(); | 
| -          } | 
| -          else | 
| -          { | 
| -            FilterNotifier.triggerListeners("save"); | 
| -          } | 
| -        }.bind(this), "FilterStorageWrite"); | 
| -      }.bind(this); | 
| -      var checkBackupRequired = function(callbackNotRequired, callbackRequired) | 
| -      { | 
| -        if (explicitFile || Prefs.patternsbackups <= 0) | 
| -        { | 
| -          callbackNotRequired(); | 
| -        } | 
| -        else | 
| -        { | 
| -          IO.statFile(targetFile, function(e, statData) | 
| -          { | 
| -            if (e || !statData.exists) | 
| -            { | 
| -              callbackNotRequired(); | 
| -            } | 
| -            else | 
| -            { | 
| -              var _tempVar13 = /^(.*)(\.\w+)$/.exec(targetFile.leafName) || [null, targetFile.leafName, ""]; | 
| -              var part1 = _tempVar13[1]; | 
| -              var part2 = _tempVar13[2]; | 
| -              var newestBackup = targetFile.clone(); | 
| -              newestBackup.leafName = part1 + "-backup1" + part2; | 
| -              IO.statFile(newestBackup, function(e, statData) | 
| -              { | 
| -                if (!e && (!statData.exists || (Date.now() - statData.lastModified) / 3600000 >= Prefs.patternsbackupinterval)) | 
| -                { | 
| -                  callbackRequired(part1, part2); | 
| -                } | 
| -                else | 
| -                { | 
| -                  callbackNotRequired(); | 
| -                } | 
| -              }); | 
| -            } | 
| -          }); | 
| -        } | 
| -      }.bind(this); | 
| -      var removeLastBackup = function(part1, part2) | 
| -      { | 
| -        var file = targetFile.clone(); | 
| -        file.leafName = part1 + "-backup" + Prefs.patternsbackups + part2; | 
| -        IO.removeFile(file, function(e) | 
| -        { | 
| -          return renameBackup(part1, part2, Prefs.patternsbackups - 1); | 
| -        }); | 
| -      }.bind(this); | 
| -      var renameBackup = function(part1, part2, index) | 
| -      { | 
| -        if (index > 0) | 
| -        { | 
| -          var fromFile = targetFile.clone(); | 
| -          fromFile.leafName = part1 + "-backup" + index + part2; | 
| -          var toName = part1 + "-backup" + (index + 1) + part2; | 
| -          IO.renameFile(fromFile, toName, function(e) | 
| -          { | 
| -            return renameBackup(part1, part2, index - 1); | 
| -          }); | 
| -        } | 
| -        else | 
| -        { | 
| -          var toFile = targetFile.clone(); | 
| -          toFile.leafName = part1 + "-backup" + (index + 1) + part2; | 
| -          IO.copyFile(targetFile, toFile, writeFilters); | 
| -        } | 
| -      }.bind(this); | 
| -      var subscriptions = this.subscriptions.filter(function(s) | 
| -      { | 
| -        return !(s instanceof ExternalSubscription); | 
| -      }); | 
| -      if (!explicitFile) | 
| -      { | 
| -        this._saving = true; | 
| -      } | 
| -      checkBackupRequired(writeFilters, removeLastBackup); | 
| -    }, | 
| -    getBackupFiles: function() | 
| -    { | 
| -      var result = []; | 
| -      var _tempVar14 = /^(.*)(\.\w+)$/.exec(FilterStorage.sourceFile.leafName) || [null, FilterStorage.sourceFile.leafName, ""]; | 
| -      var part1 = _tempVar14[1]; | 
| -      var part2 = _tempVar14[2]; | 
| -      for (var i = 1;; i++) | 
| -      { | 
| -        var file = FilterStorage.sourceFile.clone(); | 
| -        file.leafName = part1 + "-backup" + i + part2; | 
| -        if (file.exists()) | 
| -        { | 
| -          result.push(file); | 
| -        } | 
| -        else | 
| -        { | 
| -          break; | 
| -        } | 
| -      } | 
| -      return result; | 
| -    } | 
| -  }; | 
| - | 
| -  function addSubscriptionFilters(subscription) | 
| -  { | 
| -    if (!(subscription.url in FilterStorage.knownSubscriptions)) | 
| -    { | 
| -      return; | 
| -    } | 
| -    for (var _loopIndex15 = 0; _loopIndex15 < subscription.filters.length; ++_loopIndex15) | 
| -    { | 
| -      var filter = subscription.filters[_loopIndex15]; | 
| -      filter.subscriptions.push(subscription); | 
| -    } | 
| -  } | 
| - | 
| -  function removeSubscriptionFilters(subscription) | 
| -  { | 
| -    if (!(subscription.url in FilterStorage.knownSubscriptions)) | 
| -    { | 
| -      return; | 
| -    } | 
| -    for (var _loopIndex16 = 0; _loopIndex16 < subscription.filters.length; ++_loopIndex16) | 
| -    { | 
| -      var filter = subscription.filters[_loopIndex16]; | 
| -      var i = filter.subscriptions.indexOf(subscription); | 
| -      if (i >= 0) | 
| -      { | 
| -        filter.subscriptions.splice(i, 1); | 
| -      } | 
| -    } | 
| -  } | 
| -  var PrivateBrowsing = exports.PrivateBrowsing = | 
| -  { | 
| -    enabled: false, | 
| -    init: function() | 
| -    { | 
| -      if ("@mozilla.org/privatebrowsing;1" in Cc) | 
| -      { | 
| -        try | 
| -        { | 
| -          this.enabled = Cc["@mozilla.org/privatebrowsing;1"].getService(Ci.nsIPrivateBrowsingService).privateBrowsingEnabled; | 
| -          Services.obs.addObserver(this, "private-browsing", true); | 
| -          onShutdown.add(function() | 
| -          { | 
| -            Services.obs.removeObserver(this, "private-browsing"); | 
| -          }.bind(this)); | 
| -        } | 
| -        catch (e) | 
| -        { | 
| -          Cu.reportError(e); | 
| -        } | 
| -      } | 
| -    }, | 
| -    observe: function(subject, topic, data) | 
| -    { | 
| -      if (topic == "private-browsing") | 
| -      { | 
| -        if (data == "enter") | 
| -        { | 
| -          this.enabled = true; | 
| -        } | 
| -        else if (data == "exit") | 
| -        { | 
| -          this.enabled = false; | 
| -        } | 
| -      } | 
| -    }, | 
| -    QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) | 
| -  }; | 
| -  PrivateBrowsing.init(); | 
| - | 
| -  function INIParser() | 
| -  { | 
| -    this.fileProperties = this.curObj = {}; | 
| -    this.subscriptions = []; | 
| -    this.knownFilters = | 
| -    { | 
| -      __proto__: null | 
| -    }; | 
| -    this.knownSubscriptions = | 
| -    { | 
| -      __proto__: null | 
| -    }; | 
| -  } | 
| -  INIParser.prototype = | 
| -  { | 
| -    subscriptions: null, | 
| -    knownFilters: null, | 
| -    knownSubscrptions: null, | 
| -    wantObj: true, | 
| -    fileProperties: null, | 
| -    curObj: null, | 
| -    curSection: null, | 
| -    userFilters: null, | 
| -    process: function(val) | 
| -    { | 
| -      var origKnownFilters = Filter.knownFilters; | 
| -      Filter.knownFilters = this.knownFilters; | 
| -      var origKnownSubscriptions = Subscription.knownSubscriptions; | 
| -      Subscription.knownSubscriptions = this.knownSubscriptions; | 
| -      var match; | 
| -      try | 
| -      { | 
| -        if (this.wantObj === true && (match = /^(\w+)=(.*)$/.exec(val))) | 
| -        { | 
| -          this.curObj[match[1]] = match[2]; | 
| -        } | 
| -        else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val))) | 
| -        { | 
| -          if (this.curObj) | 
| -          { | 
| -            switch (this.curSection) | 
| -            { | 
| -            case "filter": | 
| -            case "pattern": | 
| -              if ("text" in this.curObj) | 
| -              { | 
| -                Filter.fromObject(this.curObj); | 
| -              } | 
| -              break; | 
| -            case "subscription": | 
| -              var subscription = Subscription.fromObject(this.curObj); | 
| -              if (subscription) | 
| -              { | 
| -                this.subscriptions.push(subscription); | 
| -              } | 
| -              break; | 
| -            case "subscription filters": | 
| -            case "subscription patterns": | 
| -              if (this.subscriptions.length) | 
| -              { | 
| -                var subscription = this.subscriptions[this.subscriptions.length - 1]; | 
| -                for (var _loopIndex17 = 0; _loopIndex17 < this.curObj.length; ++_loopIndex17) | 
| -                { | 
| -                  var text = this.curObj[_loopIndex17]; | 
| -                  var filter = Filter.fromText(text); | 
| -                  subscription.filters.push(filter); | 
| -                  filter.subscriptions.push(subscription); | 
| -                } | 
| -              } | 
| -              break; | 
| -            case "user patterns": | 
| -              this.userFilters = this.curObj; | 
| -              break; | 
| -            } | 
| -          } | 
| -          if (val === null) | 
| -          { | 
| -            return; | 
| -          } | 
| -          this.curSection = match[1].toLowerCase(); | 
| -          switch (this.curSection) | 
| -          { | 
| -          case "filter": | 
| -          case "pattern": | 
| -          case "subscription": | 
| -            this.wantObj = true; | 
| -            this.curObj = {}; | 
| -            break; | 
| -          case "subscription filters": | 
| -          case "subscription patterns": | 
| -          case "user patterns": | 
| -            this.wantObj = false; | 
| -            this.curObj = []; | 
| -            break; | 
| -          default: | 
| -            this.wantObj = undefined; | 
| -            this.curObj = null; | 
| -          } | 
| -        } | 
| -        else if (this.wantObj === false && val) | 
| -        { | 
| -          this.curObj.push(val.replace(/\\\[/g, "[")); | 
| -        } | 
| -      } | 
| -      finally | 
| -      { | 
| -        Filter.knownFilters = origKnownFilters; | 
| -        Subscription.knownSubscriptions = origKnownSubscriptions; | 
| -      } | 
| -    } | 
| -  }; | 
| -  return exports; | 
| -})(); | 
| -require.scopes["elemHide"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var Utils = require("utils").Utils; | 
| -  var IO = require("io").IO; | 
| -  var Prefs = require("prefs").Prefs; | 
| -  var ElemHideException = require("filterClasses").ElemHideException; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| -  var AboutHandler = require("elemHideHitRegistration").AboutHandler; | 
| -  var filterByKey = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  var keyByFilter = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  var knownExceptions = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  var exceptions = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  var styleURL = null; | 
| -  var ElemHide = exports.ElemHide = | 
| -  { | 
| -    isDirty: false, | 
| -    applied: false, | 
| -    init: function() | 
| -    { | 
| -      Prefs.addListener(function(name) | 
| -      { | 
| -        if (name == "enabled") | 
| -        { | 
| -          ElemHide.apply(); | 
| -        } | 
| -      }); | 
| -      onShutdown.add(function() | 
| -      { | 
| -        ElemHide.unapply(); | 
| -      }); | 
| -      var styleFile = IO.resolveFilePath(Prefs.data_directory); | 
| -      styleFile.append("elemhide.css"); | 
| -      styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); | 
| -    }, | 
| -    clear: function() | 
| -    { | 
| -      filterByKey = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      keyByFilter = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      knownExceptions = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      exceptions = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      ElemHide.isDirty = false; | 
| -      ElemHide.unapply(); | 
| -    }, | 
| -    add: function(filter) | 
| -    { | 
| -      if (filter instanceof ElemHideException) | 
| -      { | 
| -        if (filter.text in knownExceptions) | 
| -        { | 
| -          return; | 
| -        } | 
| -        var selector = filter.selector; | 
| -        if (!(selector in exceptions)) | 
| -        { | 
| -          exceptions[selector] = []; | 
| -        } | 
| -        exceptions[selector].push(filter); | 
| -        knownExceptions[filter.text] = true; | 
| -      } | 
| -      else | 
| -      { | 
| -        if (filter.text in keyByFilter) | 
| -        { | 
| -          return; | 
| -        } | 
| -        var key; | 
| -        do | 
| -        { | 
| -          key = Math.random().toFixed(15).substr(5); | 
| -        } | 
| -        while (key in filterByKey); | 
| -        filterByKey[key] = filter; | 
| -        keyByFilter[filter.text] = key; | 
| -        ElemHide.isDirty = true; | 
| -      } | 
| -    }, | 
| -    remove: function(filter) | 
| -    { | 
| -      if (filter instanceof ElemHideException) | 
| -      { | 
| -        if (!(filter.text in knownExceptions)) | 
| -        { | 
| -          return; | 
| -        } | 
| -        var list = exceptions[filter.selector]; | 
| -        var index = list.indexOf(filter); | 
| -        if (index >= 0) | 
| -        { | 
| -          list.splice(index, 1); | 
| -        } | 
| -        delete knownExceptions[filter.text]; | 
| -      } | 
| -      else | 
| -      { | 
| -        if (!(filter.text in keyByFilter)) | 
| -        { | 
| -          return; | 
| -        } | 
| -        var key = keyByFilter[filter.text]; | 
| -        delete filterByKey[key]; | 
| -        delete keyByFilter[filter.text]; | 
| -        ElemHide.isDirty = true; | 
| -      } | 
| -    }, | 
| -    getException: function(filter, docDomain) | 
| -    { | 
| -      var selector = filter.selector; | 
| -      if (!(filter.selector in exceptions)) | 
| -      { | 
| -        return null; | 
| -      } | 
| -      var list = exceptions[filter.selector]; | 
| -      for (var i = list.length - 1; i >= 0; i--) | 
| -      { | 
| -        if (list[i].isActiveOnDomain(docDomain)) | 
| -        { | 
| -          return list[i]; | 
| -        } | 
| -      } | 
| -      return null; | 
| -    }, | 
| -    _applying: false, | 
| -    _needsApply: false, | 
| -    apply: function() | 
| -    { | 
| -      if (this._applying) | 
| -      { | 
| -        this._needsApply = true; | 
| -        return; | 
| -      } | 
| -      if (!ElemHide.isDirty || !Prefs.enabled) | 
| -      { | 
| -        if (Prefs.enabled && !ElemHide.applied) | 
| -        { | 
| -          try | 
| -          { | 
| -            Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); | 
| -            ElemHide.applied = true; | 
| -          } | 
| -          catch (e) | 
| -          { | 
| -            Cu.reportError(e); | 
| -          } | 
| -        } | 
| -        else if (!Prefs.enabled && ElemHide.applied) | 
| -        { | 
| -          ElemHide.unapply(); | 
| -        } | 
| -        return; | 
| -      } | 
| -      IO.writeToFile(styleURL.file, false, this._generateCSSContent(), function(e) | 
| -      { | 
| -        this._applying = false; | 
| -        if (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE) | 
| -        { | 
| -          IO.removeFile(styleURL.file, function(e2){}); | 
| -        } | 
| -        else if (e) | 
| -        { | 
| -          Cu.reportError(e); | 
| -        } | 
| -        if (this._needsApply) | 
| -        { | 
| -          this._needsApply = false; | 
| -          this.apply(); | 
| -        } | 
| -        else if (!e || e.result == Cr.NS_ERROR_NOT_AVAILABLE) | 
| -        { | 
| -          ElemHide.isDirty = false; | 
| -          ElemHide.unapply(); | 
| -          if (!e) | 
| -          { | 
| -            try | 
| -            { | 
| -              Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); | 
| -              ElemHide.applied = true; | 
| -            } | 
| -            catch (e) | 
| -            { | 
| -              Cu.reportError(e); | 
| -            } | 
| -          } | 
| -          FilterNotifier.triggerListeners("elemhideupdate"); | 
| -        } | 
| -      }.bind(this), "ElemHideWrite"); | 
| -      this._applying = true; | 
| -    }, | 
| -    _generateCSSContent: function() | 
| -    { | 
| -      var _generatorResult12 = []; | 
| -      var domains = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      var hasFilters = false; | 
| -      for (var key in filterByKey) | 
| -      { | 
| -        var filter = filterByKey[key]; | 
| -        var domain = filter.selectorDomain || ""; | 
| -        var list; | 
| -        if (domain in domains) | 
| -        { | 
| -          list = domains[domain]; | 
| -        } | 
| -        else | 
| -        { | 
| -          list = | 
| -          { | 
| -            __proto__: null | 
| -          }; | 
| -          domains[domain] = list; | 
| -        } | 
| -        list[filter.selector] = key; | 
| -        hasFilters = true; | 
| -      } | 
| -      if (!hasFilters) | 
| -      { | 
| -        throw Cr.NS_ERROR_NOT_AVAILABLE; | 
| -      } | 
| - | 
| -      function escapeChar(match) | 
| -      { | 
| -        return "\\" + match.charCodeAt(0).toString(16) + " "; | 
| -      } | 
| -      var cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;"; | 
| -      for (var domain in domains) | 
| -      { | 
| -        var rules = []; | 
| -        var list = domains[domain]; | 
| -        if (domain) | 
| -        { | 
| -          _generatorResult12.push(("@-moz-document domain(\"" + domain.split(",").join("\"),domain(\"") + "\"){").replace(/[^\x01-\x7F]/g, escapeChar)); | 
| -        } | 
| -        else | 
| -        { | 
| -          _generatorResult12.push("@-moz-document url-prefix(\"http://\"),url-prefix(\"https://\")," + "url-prefix(\"mailbox://\"),url-prefix(\"imap://\")," + "url-prefix(\"news://\"),url-prefix(\"snews://\"){"); | 
| -        } | 
| -        for (var selector in list) | 
| -        { | 
| -          _generatorResult12.push(selector.replace(/[^\x01-\x7F]/g, escapeChar) + "{" + cssTemplate.replace("%ID%", list[selector]) + "}"); | 
| -        } | 
| -        _generatorResult12.push("}"); | 
| -      } | 
| -      return _generatorResult12; | 
| -    }, | 
| -    unapply: function() | 
| -    { | 
| -      if (ElemHide.applied) | 
| -      { | 
| -        try | 
| -        { | 
| -          Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); | 
| -        } | 
| -        catch (e) | 
| -        { | 
| -          Cu.reportError(e); | 
| -        } | 
| -        ElemHide.applied = false; | 
| -      } | 
| -    }, | 
| -    get styleURL() | 
| -    { | 
| -      return ElemHide.applied ? styleURL.spec : null; | 
| -    }, | 
| -    getFilterByKey: function(key) | 
| -    { | 
| -      return key in filterByKey ? filterByKey[key] : null; | 
| -    }, | 
| -    getSelectorsForDomain: function(domain, specificOnly) | 
| -    { | 
| -      var result = []; | 
| -      for (var key in filterByKey) | 
| -      { | 
| -        var filter = filterByKey[key]; | 
| -        if (specificOnly && (!filter.domains || filter.domains[""])) | 
| -        { | 
| -          continue; | 
| -        } | 
| -        if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain)) | 
| -        { | 
| -          result.push(filter.selector); | 
| -        } | 
| -      } | 
| -      return result; | 
| -    } | 
| -  }; | 
| -  return exports; | 
| -})(); | 
| -require.scopes["matcher"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var _tempVar18 = require("filterClasses"); | 
| -  var Filter = _tempVar18.Filter; | 
| -  var RegExpFilter = _tempVar18.RegExpFilter; | 
| -  var WhitelistFilter = _tempVar18.WhitelistFilter; | 
| - | 
| -  function Matcher() | 
| -  { | 
| -    this.clear(); | 
| -  } | 
| -  exports.Matcher = Matcher; | 
| -  Matcher.prototype = | 
| -  { | 
| -    filterByKeyword: null, | 
| -    keywordByFilter: null, | 
| -    clear: function() | 
| -    { | 
| -      this.filterByKeyword = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      this.keywordByFilter = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -    }, | 
| -    add: function(filter) | 
| -    { | 
| -      if (filter.text in this.keywordByFilter) | 
| -      { | 
| -        return; | 
| -      } | 
| -      var keyword = this.findKeyword(filter); | 
| -      var oldEntry = this.filterByKeyword[keyword]; | 
| -      if (typeof oldEntry == "undefined") | 
| -      { | 
| -        this.filterByKeyword[keyword] = filter; | 
| -      } | 
| -      else if (oldEntry.length == 1) | 
| -      { | 
| -        this.filterByKeyword[keyword] = [oldEntry, filter]; | 
| -      } | 
| -      else | 
| -      { | 
| -        oldEntry.push(filter); | 
| -      } | 
| -      this.keywordByFilter[filter.text] = keyword; | 
| -    }, | 
| -    remove: function(filter) | 
| -    { | 
| -      if (!(filter.text in this.keywordByFilter)) | 
| -      { | 
| -        return; | 
| -      } | 
| -      var keyword = this.keywordByFilter[filter.text]; | 
| -      var list = this.filterByKeyword[keyword]; | 
| -      if (list.length <= 1) | 
| -      { | 
| -        delete this.filterByKeyword[keyword]; | 
| -      } | 
| -      else | 
| -      { | 
| -        var index = list.indexOf(filter); | 
| -        if (index >= 0) | 
| -        { | 
| -          list.splice(index, 1); | 
| -          if (list.length == 1) | 
| -          { | 
| -            this.filterByKeyword[keyword] = list[0]; | 
| -          } | 
| -        } | 
| -      } | 
| -      delete this.keywordByFilter[filter.text]; | 
| -    }, | 
| -    findKeyword: function(filter) | 
| -    { | 
| -      var defaultResult = filter.contentType & RegExpFilter.typeMap.DONOTTRACK ? "donottrack" : ""; | 
| -      var text = filter.text; | 
| -      if (Filter.regexpRegExp.test(text)) | 
| -      { | 
| -        return defaultResult; | 
| -      } | 
| -      var match = Filter.optionsRegExp.exec(text); | 
| -      if (match) | 
| -      { | 
| -        text = match.input.substr(0, match.index); | 
| -      } | 
| -      if (text.substr(0, 2) == "@@") | 
| -      { | 
| -        text = text.substr(2); | 
| -      } | 
| -      var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); | 
| -      if (!candidates) | 
| -      { | 
| -        return defaultResult; | 
| -      } | 
| -      var hash = this.filterByKeyword; | 
| -      var result = defaultResult; | 
| -      var resultCount = 16777215; | 
| -      var resultLength = 0; | 
| -      for (var i = 0, l = candidates.length; i < l; i++) | 
| -      { | 
| -        var candidate = candidates[i].substr(1); | 
| -        var count = candidate in hash ? hash[candidate].length : 0; | 
| -        if (count < resultCount || count == resultCount && candidate.length > resultLength) | 
| -        { | 
| -          result = candidate; | 
| -          resultCount = count; | 
| -          resultLength = candidate.length; | 
| -        } | 
| -      } | 
| -      return result; | 
| -    }, | 
| -    hasFilter: function(filter) | 
| -    { | 
| -      return filter.text in this.keywordByFilter; | 
| -    }, | 
| -    getKeywordForFilter: function(filter) | 
| -    { | 
| -      if (filter.text in this.keywordByFilter) | 
| -      { | 
| -        return this.keywordByFilter[filter.text]; | 
| -      } | 
| -      else | 
| -      { | 
| -        return null; | 
| -      } | 
| -    }, | 
| -    _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty) | 
| -    { | 
| -      var list = this.filterByKeyword[keyword]; | 
| -      for (var i = 0; i < list.length; i++) | 
| -      { | 
| -        var filter = list[i]; | 
| -        if (filter.matches(location, contentType, docDomain, thirdParty)) | 
| -        { | 
| -          return filter; | 
| -        } | 
| -      } | 
| -      return null; | 
| -    }, | 
| -    matchesAny: function(location, contentType, docDomain, thirdParty) | 
| -    { | 
| -      var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); | 
| -      if (candidates === null) | 
| -      { | 
| -        candidates = []; | 
| -      } | 
| -      if (contentType == "DONOTTRACK") | 
| -      { | 
| -        candidates.unshift("donottrack"); | 
| -      } | 
| -      else | 
| -      { | 
| -        candidates.push(""); | 
| -      } | 
| -      for (var i = 0, l = candidates.length; i < l; i++) | 
| -      { | 
| -        var substr = candidates[i]; | 
| -        if (substr in this.filterByKeyword) | 
| -        { | 
| -          var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); | 
| -          if (result) | 
| -          { | 
| -            return result; | 
| -          } | 
| -        } | 
| -      } | 
| -      return null; | 
| -    } | 
| -  }; | 
| - | 
| -  function CombinedMatcher() | 
| -  { | 
| -    this.blacklist = new Matcher(); | 
| -    this.whitelist = new Matcher(); | 
| -    this.keys = | 
| -    { | 
| -      __proto__: null | 
| -    }; | 
| -    this.resultCache = | 
| -    { | 
| -      __proto__: null | 
| -    }; | 
| -  } | 
| -  exports.CombinedMatcher = CombinedMatcher; | 
| -  CombinedMatcher.maxCacheEntries = 1000; | 
| -  CombinedMatcher.prototype = | 
| -  { | 
| -    blacklist: null, | 
| -    whitelist: null, | 
| -    keys: null, | 
| -    resultCache: null, | 
| -    cacheEntries: 0, | 
| -    clear: function() | 
| -    { | 
| -      this.blacklist.clear(); | 
| -      this.whitelist.clear(); | 
| -      this.keys = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      this.resultCache = | 
| -      { | 
| -        __proto__: null | 
| -      }; | 
| -      this.cacheEntries = 0; | 
| -    }, | 
| -    add: function(filter) | 
| -    { | 
| -      if (filter instanceof WhitelistFilter) | 
| -      { | 
| -        if (filter.siteKeys) | 
| -        { | 
| -          for (var i = 0; i < filter.siteKeys.length; i++) | 
| -          { | 
| -            this.keys[filter.siteKeys[i]] = filter.text; | 
| -          } | 
| -        } | 
| -        else | 
| -        { | 
| -          this.whitelist.add(filter); | 
| -        } | 
| -      } | 
| -      else | 
| -      { | 
| -        this.blacklist.add(filter); | 
| -      } | 
| -      if (this.cacheEntries > 0) | 
| -      { | 
| -        this.resultCache = | 
| -        { | 
| -          __proto__: null | 
| -        }; | 
| -        this.cacheEntries = 0; | 
| -      } | 
| -    }, | 
| -    remove: function(filter) | 
| -    { | 
| -      if (filter instanceof WhitelistFilter) | 
| -      { | 
| -        if (filter.siteKeys) | 
| -        { | 
| -          for (var i = 0; i < filter.siteKeys.length; i++) | 
| -          { | 
| -            delete this.keys[filter.siteKeys[i]]; | 
| -          } | 
| -        } | 
| -        else | 
| -        { | 
| -          this.whitelist.remove(filter); | 
| -        } | 
| -      } | 
| -      else | 
| -      { | 
| -        this.blacklist.remove(filter); | 
| -      } | 
| -      if (this.cacheEntries > 0) | 
| -      { | 
| -        this.resultCache = | 
| -        { | 
| -          __proto__: null | 
| -        }; | 
| -        this.cacheEntries = 0; | 
| -      } | 
| -    }, | 
| -    findKeyword: function(filter) | 
| -    { | 
| -      if (filter instanceof WhitelistFilter) | 
| -      { | 
| -        return this.whitelist.findKeyword(filter); | 
| -      } | 
| -      else | 
| -      { | 
| -        return this.blacklist.findKeyword(filter); | 
| -      } | 
| -    }, | 
| -    hasFilter: function(filter) | 
| -    { | 
| -      if (filter instanceof WhitelistFilter) | 
| -      { | 
| -        return this.whitelist.hasFilter(filter); | 
| -      } | 
| -      else | 
| -      { | 
| -        return this.blacklist.hasFilter(filter); | 
| -      } | 
| -    }, | 
| -    getKeywordForFilter: function(filter) | 
| -    { | 
| -      if (filter instanceof WhitelistFilter) | 
| -      { | 
| -        return this.whitelist.getKeywordForFilter(filter); | 
| -      } | 
| -      else | 
| -      { | 
| -        return this.blacklist.getKeywordForFilter(filter); | 
| -      } | 
| -    }, | 
| -    isSlowFilter: function(filter) | 
| -    { | 
| -      var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; | 
| -      if (matcher.hasFilter(filter)) | 
| -      { | 
| -        return !matcher.getKeywordForFilter(filter); | 
| -      } | 
| -      else | 
| -      { | 
| -        return !matcher.findKeyword(filter); | 
| -      } | 
| -    }, | 
| -    matchesAnyInternal: function(location, contentType, docDomain, thirdParty) | 
| -    { | 
| -      var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); | 
| -      if (candidates === null) | 
| -      { | 
| -        candidates = []; | 
| -      } | 
| -      if (contentType == "DONOTTRACK") | 
| -      { | 
| -        candidates.unshift("donottrack"); | 
| -      } | 
| -      else | 
| -      { | 
| -        candidates.push(""); | 
| -      } | 
| -      var blacklistHit = null; | 
| -      for (var i = 0, l = candidates.length; i < l; i++) | 
| -      { | 
| -        var substr = candidates[i]; | 
| -        if (substr in this.whitelist.filterByKeyword) | 
| -        { | 
| -          var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); | 
| -          if (result) | 
| -          { | 
| -            return result; | 
| -          } | 
| -        } | 
| -        if (substr in this.blacklist.filterByKeyword && blacklistHit === null) | 
| -        { | 
| -          blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty); | 
| -        } | 
| -      } | 
| -      return blacklistHit; | 
| -    }, | 
| -    matchesAny: function(location, contentType, docDomain, thirdParty) | 
| -    { | 
| -      var key = location + " " + contentType + " " + docDomain + " " + thirdParty; | 
| -      if (key in this.resultCache) | 
| -      { | 
| -        return this.resultCache[key]; | 
| -      } | 
| -      var result = this.matchesAnyInternal(location, contentType, docDomain, thirdParty); | 
| -      if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) | 
| -      { | 
| -        this.resultCache = | 
| -        { | 
| -          __proto__: null | 
| -        }; | 
| -        this.cacheEntries = 0; | 
| -      } | 
| -      this.resultCache[key] = result; | 
| -      this.cacheEntries++; | 
| -      return result; | 
| -    }, | 
| -    matchesByKey: function(location, key, docDomain) | 
| -    { | 
| -      key = key.toUpperCase(); | 
| -      if (key in this.keys) | 
| -      { | 
| -        var filter = Filter.knownFilters[this.keys[key]]; | 
| -        if (filter && filter.matches(location, "DOCUMENT", docDomain, false)) | 
| -        { | 
| -          return filter; | 
| -        } | 
| -        else | 
| -        { | 
| -          return null; | 
| -        } | 
| -      } | 
| -      else | 
| -      { | 
| -        return null; | 
| -      } | 
| -    } | 
| -  }; | 
| -  var defaultMatcher = exports.defaultMatcher = new CombinedMatcher(); | 
| -  return exports; | 
| -})(); | 
| -require.scopes["filterListener"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var FilterStorage = require("filterStorage").FilterStorage; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| -  var ElemHide = require("elemHide").ElemHide; | 
| -  var defaultMatcher = require("matcher").defaultMatcher; | 
| -  var _tempVar19 = require("filterClasses"); | 
| -  var ActiveFilter = _tempVar19.ActiveFilter; | 
| -  var RegExpFilter = _tempVar19.RegExpFilter; | 
| -  var ElemHideBase = _tempVar19.ElemHideBase; | 
| -  var Prefs = require("prefs").Prefs; | 
| -  var batchMode = false; | 
| -  var isDirty = 0; | 
| -  var FilterListener = exports.FilterListener = | 
| -  { | 
| -    get batchMode() | 
| -    { | 
| -      return batchMode; | 
| -    }, | 
| -    set batchMode(value) | 
| -    { | 
| -      batchMode = value; | 
| -      flushElemHide(); | 
| -    }, | 
| -    setDirty: function(factor) | 
| -    { | 
| -      if (factor == 0 && isDirty > 0) | 
| -      { | 
| -        isDirty = 1; | 
| -      } | 
| -      else | 
| -      { | 
| -        isDirty += factor; | 
| -      } | 
| -      if (isDirty >= 1) | 
| -      { | 
| -        FilterStorage.saveToDisk(); | 
| -      } | 
| -    } | 
| -  }; | 
| -  var HistoryPurgeObserver = | 
| -  { | 
| -    observe: function(subject, topic, data) | 
| -    { | 
| -      if (topic == "browser:purge-session-history" && Prefs.clearStatsOnHistoryPurge) | 
| -      { | 
| -        FilterStorage.resetHitCounts(); | 
| -        FilterListener.setDirty(0); | 
| -        Prefs.recentReports = []; | 
| -      } | 
| -    }, | 
| -    QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]) | 
| -  }; | 
| - | 
| -  function init() | 
| -  { | 
| -    FilterNotifier.addListener(function(action, item, newValue, oldValue) | 
| -    { | 
| -      var match = /^(\w+)\.(.*)/.exec(action); | 
| -      if (match && match[1] == "filter") | 
| -      { | 
| -        onFilterChange(match[2], item, newValue, oldValue); | 
| -      } | 
| -      else if (match && match[1] == "subscription") | 
| -      { | 
| -        onSubscriptionChange(match[2], item, newValue, oldValue); | 
| -      } | 
| -      else | 
| -      { | 
| -        onGenericChange(action, item); | 
| -      } | 
| -    }); | 
| -    var application = require("info").application; | 
| -    if (application == "chrome") | 
| -    { | 
| -      flushElemHide = function(){}; | 
| -    } | 
| -    else | 
| -    { | 
| -      ElemHide.init(); | 
| -    } | 
| -    FilterStorage.loadFromDisk(); | 
| -    Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history", true); | 
| -    onShutdown.add(function() | 
| -    { | 
| -      Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-history"); | 
| -    }); | 
| -  } | 
| -  init(); | 
| - | 
| -  function flushElemHide() | 
| -  { | 
| -    if (!batchMode && ElemHide.isDirty) | 
| -    { | 
| -      ElemHide.apply(); | 
| -    } | 
| -  } | 
| - | 
| -  function addFilter(filter) | 
| -  { | 
| -    if (!(filter instanceof ActiveFilter) || filter.disabled) | 
| -    { | 
| -      return; | 
| -    } | 
| -    var hasEnabled = false; | 
| -    for (var i = 0; i < filter.subscriptions.length; i++) | 
| -    { | 
| -      if (!filter.subscriptions[i].disabled) | 
| -      { | 
| -        hasEnabled = true; | 
| -      } | 
| -    } | 
| -    if (!hasEnabled) | 
| -    { | 
| -      return; | 
| -    } | 
| -    if (filter instanceof RegExpFilter) | 
| -    { | 
| -      defaultMatcher.add(filter); | 
| -    } | 
| -    else if (filter instanceof ElemHideBase) | 
| -    { | 
| -      ElemHide.add(filter); | 
| -    } | 
| -  } | 
| - | 
| -  function removeFilter(filter) | 
| -  { | 
| -    if (!(filter instanceof ActiveFilter)) | 
| -    { | 
| -      return; | 
| -    } | 
| -    if (!filter.disabled) | 
| -    { | 
| -      var hasEnabled = false; | 
| -      for (var i = 0; i < filter.subscriptions.length; i++) | 
| -      { | 
| -        if (!filter.subscriptions[i].disabled) | 
| -        { | 
| -          hasEnabled = true; | 
| -        } | 
| -      } | 
| -      if (hasEnabled) | 
| -      { | 
| -        return; | 
| -      } | 
| -    } | 
| -    if (filter instanceof RegExpFilter) | 
| -    { | 
| -      defaultMatcher.remove(filter); | 
| -    } | 
| -    else if (filter instanceof ElemHideBase) | 
| -    { | 
| -      ElemHide.remove(filter); | 
| -    } | 
| -  } | 
| - | 
| -  function onSubscriptionChange(action, subscription, newValue, oldValue) | 
| -  { | 
| -    FilterListener.setDirty(1); | 
| -    if (action != "added" && action != "removed" && action != "disabled" && action != "updated") | 
| -    { | 
| -      return; | 
| -    } | 
| -    if (action != "removed" && !(subscription.url in FilterStorage.knownSubscriptions)) | 
| -    { | 
| -      return; | 
| -    } | 
| -    if ((action == "added" || action == "removed" || action == "updated") && subscription.disabled) | 
| -    { | 
| -      return; | 
| -    } | 
| -    if (action == "added" || action == "removed" || action == "disabled") | 
| -    { | 
| -      var method = action == "added" || action == "disabled" && newValue == false ? addFilter : removeFilter; | 
| -      if (subscription.filters) | 
| -      { | 
| -        subscription.filters.forEach(method); | 
| -      } | 
| -    } | 
| -    else if (action == "updated") | 
| -    { | 
| -      subscription.oldFilters.forEach(removeFilter); | 
| -      subscription.filters.forEach(addFilter); | 
| -    } | 
| -    flushElemHide(); | 
| -  } | 
| - | 
| -  function onFilterChange(action, filter, newValue, oldValue) | 
| -  { | 
| -    if (action == "hitCount" || action == "lastHit") | 
| -    { | 
| -      FilterListener.setDirty(0.002); | 
| -    } | 
| -    else | 
| -    { | 
| -      FilterListener.setDirty(1); | 
| -    } | 
| -    if (action != "added" && action != "removed" && action != "disabled") | 
| -    { | 
| -      return; | 
| -    } | 
| -    if ((action == "added" || action == "removed") && filter.disabled) | 
| -    { | 
| -      return; | 
| -    } | 
| -    if (action == "added" || action == "disabled" && newValue == false) | 
| -    { | 
| -      addFilter(filter); | 
| -    } | 
| -    else | 
| -    { | 
| -      removeFilter(filter); | 
| -    } | 
| -    flushElemHide(); | 
| -  } | 
| - | 
| -  function onGenericChange(action) | 
| -  { | 
| -    if (action == "load") | 
| -    { | 
| -      isDirty = 0; | 
| -      defaultMatcher.clear(); | 
| -      ElemHide.clear(); | 
| -      for (var _loopIndex20 = 0; _loopIndex20 < FilterStorage.subscriptions.length; ++_loopIndex20) | 
| -      { | 
| -        var subscription = FilterStorage.subscriptions[_loopIndex20]; | 
| -        if (!subscription.disabled) | 
| -        { | 
| -          subscription.filters.forEach(addFilter); | 
| -        } | 
| -      } | 
| -      flushElemHide(); | 
| -    } | 
| -    else if (action == "save") | 
| -    { | 
| -      isDirty = 0; | 
| -    } | 
| -  } | 
| -  return exports; | 
| -})(); | 
| -require.scopes["synchronizer"] = (function() | 
| -{ | 
| -  var exports = {}; | 
| -  var Utils = require("utils").Utils; | 
| -  var FilterStorage = require("filterStorage").FilterStorage; | 
| -  var FilterNotifier = require("filterNotifier").FilterNotifier; | 
| -  var Prefs = require("prefs").Prefs; | 
| -  var _tempVar21 = require("filterClasses"); | 
| -  var Filter = _tempVar21.Filter; | 
| -  var CommentFilter = _tempVar21.CommentFilter; | 
| -  var _tempVar22 = require("subscriptionClasses"); | 
| -  var Subscription = _tempVar22.Subscription; | 
| -  var DownloadableSubscription = _tempVar22.DownloadableSubscription; | 
| -  var MILLISECONDS_IN_SECOND = 1000; | 
| -  var SECONDS_IN_MINUTE = 60; | 
| -  var SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE; | 
| -  var SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR; | 
| -  var INITIAL_DELAY = 6 * SECONDS_IN_MINUTE; | 
| -  var CHECK_INTERVAL = SECONDS_IN_HOUR; | 
| -  var MIN_EXPIRATION_INTERVAL = 1 * SECONDS_IN_DAY; | 
| -  var MAX_EXPIRATION_INTERVAL = 14 * SECONDS_IN_DAY; | 
| -  var MAX_ABSENSE_INTERVAL = 1 * SECONDS_IN_DAY; | 
| -  var timer = null; | 
| -  var executing = | 
| -  { | 
| -    __proto__: null | 
| -  }; | 
| -  var Synchronizer = exports.Synchronizer = | 
| -  { | 
| -    init: function() | 
| -    { | 
| -      var callback = function() | 
| -      { | 
| -        timer.delay = CHECK_INTERVAL * MILLISECONDS_IN_SECOND; | 
| -        checkSubscriptions(); | 
| -      }; | 
| -      timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 
| -      timer.initWithCallback(callback, INITIAL_DELAY * MILLISECONDS_IN_SECOND, Ci.nsITimer.TYPE_REPEATING_SLACK); | 
| -      onShutdown.add(function() | 
| -      { | 
| -        timer.cancel(); | 
| -      }); | 
| -    }, | 
| -    isExecuting: function(url) | 
| -    { | 
| -      return url in executing; | 
| -    }, | 
| -    execute: function(subscription, manual, forceDownload) | 
| -    { | 
| -      Utils.runAsync(this.executeInternal, this, subscription, manual, forceDownload); | 
| -    }, | 
| -    executeInternal: function(subscription, manual, forceDownload) | 
| -    { | 
| -      var url = subscription.url; | 
| -      if (url in executing) | 
| -      { | 
| -        return; | 
| -      } | 
| -      var newURL = subscription.nextURL; | 
| -      var hadTemporaryRedirect = false; | 
| -      subscription.nextURL = null; | 
| -      var loadFrom = newURL; | 
| -      var isBaseLocation = true; | 
| -      if (!loadFrom) | 
| -      { | 
| -        loadFrom = url; | 
| -      } | 
| -      if (loadFrom == url) | 
| -      { | 
| -        if (subscription.alternativeLocations) | 
| -        { | 
| -          var options = [ | 
| -            [1, url] | 
| -          ]; | 
| -          var totalWeight = 1; | 
| -          for (var _loopIndex23 = 0; _loopIndex23 < subscription.alternativeLocations.split(",").length; ++_loopIndex23) | 
| -          { | 
| -            var alternative = subscription.alternativeLocations.split(",")[_loopIndex23]; | 
| -            if (!/^https?:\/\//.test(alternative)) | 
| -            { | 
| -              continue; | 
| -            } | 
| -            var weight = 1; | 
| -            var match = /;q=([\d\.]+)$/.exec(alternative); | 
| -            if (match) | 
| -            { | 
| -              weight = parseFloat(match[1]); | 
| -              if (isNaN(weight) || !isFinite(weight) || weight < 0) | 
| -              { | 
| -                weight = 1; | 
| -              } | 
| -              if (weight > 10) | 
| -              { | 
| -                weight = 10; | 
| -              } | 
| -              alternative = alternative.substr(0, match.index); | 
| -            } | 
| -            options.push([weight, alternative]); | 
| -            totalWeight += weight; | 
| -          } | 
| -          var choice = Math.random() * totalWeight; | 
| -          for (var _loopIndex24 = 0; _loopIndex24 < options.length; ++_loopIndex24) | 
| -          { | 
| -            var _tempVar25 = options[_loopIndex24]; | 
| -            var weight = _tempVar25[0]; | 
| -            var alternative = _tempVar25[1]; | 
| -            choice -= weight; | 
| -            if (choice < 0) | 
| -            { | 
| -              loadFrom = alternative; | 
| -              break; | 
| -            } | 
| -          } | 
| -          isBaseLocation = loadFrom == url; | 
| -        } | 
| -      } | 
| -      else | 
| -      { | 
| -        forceDownload = true; | 
| -      } | 
| -      var addonVersion = require("info").addonVersion; | 
| -      loadFrom = loadFrom.replace(/%VERSION%/, "ABP" + addonVersion); | 
| -      var request = null; | 
| - | 
| -      function errorCallback(error) | 
| -      { | 
| -        var channelStatus = -1; | 
| -        try | 
| -        { | 
| -          channelStatus = request.channel.status; | 
| -        } | 
| -        catch (e){} | 
| -        var responseStatus = ""; | 
| -        try | 
| -        { | 
| -          responseStatus = request.channel.QueryInterface(Ci.nsIHttpChannel).responseStatus; | 
| -        } | 
| -        catch (e){} | 
| -        setError(subscription, error, channelStatus, responseStatus, loadFrom, isBaseLocation, manual); | 
| -      } | 
| -      try | 
| -      { | 
| -        request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); | 
| -        request.mozBackgroundRequest = true; | 
| -        request.open("GET", loadFrom); | 
| -      } | 
| -      catch (e) | 
| -      { | 
| -        errorCallback("synchronize_invalid_url"); | 
| -        return; | 
| -      } | 
| -      try | 
| -      { | 
| -        request.overrideMimeType("text/plain"); | 
| -        request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | request.channel.VALIDATE_ALWAYS; | 
| -        if (request.channel instanceof Ci.nsIHttpChannel) | 
| -        { | 
| -          request.channel.redirectionLimit = 5; | 
| -        } | 
| -        var oldNotifications = request.channel.notificationCallbacks; | 
| -        var oldEventSink = null; | 
| -        request.channel.notificationCallbacks = | 
| -        { | 
| -          QueryInterface: XPCOMUtils.generateQI([Ci.nsIInterfaceRequestor, Ci.nsIChannelEventSink]), | 
| -          getInterface: function(iid) | 
| -          { | 
| -            if (iid.equals(Ci.nsIChannelEventSink)) | 
| -            { | 
| -              try | 
| -              { | 
| -                oldEventSink = oldNotifications.QueryInterface(iid); | 
| -              } | 
| -              catch (e){} | 
| -              return this; | 
| -            } | 
| -            if (oldNotifications) | 
| -            { | 
| -              return oldNotifications.QueryInterface(iid); | 
| -            } | 
| -            else | 
| -            { | 
| -              throw Cr.NS_ERROR_NO_INTERFACE; | 
| -            } | 
| -          }, | 
| -          asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) | 
| -          { | 
| -            if (isBaseLocation && !hadTemporaryRedirect && oldChannel instanceof Ci.nsIHttpChannel) | 
| -            { | 
| -              try | 
| -              { | 
| -                subscription.alternativeLocations = oldChannel.getResponseHeader("X-Alternative-Locations"); | 
| -              } | 
| -              catch (e) | 
| -              { | 
| -                subscription.alternativeLocations = null; | 
| -              } | 
| -            } | 
| -            if (flags & Ci.nsIChannelEventSink.REDIRECT_TEMPORARY) | 
| -            { | 
| -              hadTemporaryRedirect = true; | 
| -            } | 
| -            else if (!hadTemporaryRedirect) | 
| -            { | 
| -              newURL = newChannel.URI.spec; | 
| -            } | 
| -            if (oldEventSink) | 
| -            { | 
| -              oldEventSink.asyncOnChannelRedirect(oldChannel, newChannel, flags, callback); | 
| -            } | 
| -            else | 
| -            { | 
| -              callback.onRedirectVerifyCallback(Cr.NS_OK); | 
| -            } | 
| -          } | 
| -        }; | 
| -      } | 
| -      catch (e) | 
| -      { | 
| -        Cu.reportError(e); | 
| -      } | 
| -      if (subscription.lastModified && !forceDownload) | 
| -      { | 
| -        request.setRequestHeader("If-Modified-Since", subscription.lastModified); | 
| -      } | 
| -      request.addEventListener("error", function(ev) | 
| -      { | 
| -        if (onShutdown.done) | 
| -        { | 
| -          return; | 
| -        } | 
| -        delete executing[url]; | 
| -        try | 
| -        { | 
| -          request.channel.notificationCallbacks = null; | 
| -        } | 
| -        catch (e){} | 
| -        errorCallback("synchronize_connection_error"); | 
| -      }, false); | 
| -      request.addEventListener("load", function(ev) | 
| -      { | 
| -        if (onShutdown.done) | 
| -        { | 
| -          return; | 
| -        } | 
| -        delete executing[url]; | 
| -        try | 
| -        { | 
| -          request.channel.notificationCallbacks = null; | 
| -        } | 
| -        catch (e){} | 
| -        if (request.status && request.status != 200 && request.status != 304) | 
| -        { | 
| -          errorCallback("synchronize_connection_error"); | 
| -          return; | 
| -        } | 
| -        var newFilters = null; | 
| -        if (request.status != 304) | 
| -        { | 
| -          newFilters = readFilters(subscription, request.responseText, errorCallback); | 
| -          if (!newFilters) | 
| -          { | 
| -            return; | 
| -          } | 
| -          subscription.lastModified = request.getResponseHeader("Last-Modified"); | 
| -        } | 
| -        if (isBaseLocation && !hadTemporaryRedirect) | 
| -        { | 
| -          subscription.alternativeLocations = request.getResponseHeader("X-Alternative-Locations"); | 
| -        } | 
| -        subscription.lastSuccess = subscription.lastDownload = Math.round(Date.now() / MILLISECONDS_IN_SECOND); | 
| -        subscription.downloadStatus = "synchronize_ok"; | 
| -        subscription.errors = 0; | 
| -        var now = Math.round(((new Date(request.getResponseHeader("Date"))).getTime() || Date.now()) / MILLISECONDS_IN_SECOND); | 
| -        var expires = Math.round((new Date(request.getResponseHeader("Expires"))).getTime() / MILLISECONDS_IN_SECOND) || 0; | 
| -        var expirationInterval = expires ? expires - now : 0; | 
| -        for (var _loopIndex26 = 0; _loopIndex26 < (newFilters || subscription.filters).length; ++_loopIndex26) | 
| -        { | 
| -          var filter = (newFilters || subscription.filters)[_loopIndex26]; | 
| -          if (!(filter instanceof CommentFilter)) | 
| -          { | 
| -            continue; | 
| -          } | 
| -          var match = /\bExpires\s*(?::|after)\s*(\d+)\s*(h)?/i.exec(filter.text); | 
| -          if (match) | 
| -          { | 
| -            var interval = parseInt(match[1], 10); | 
| -            if (match[2]) | 
| -            { | 
| -              interval *= SECONDS_IN_HOUR; | 
| -            } | 
| -            else | 
| -            { | 
| -              interval *= SECONDS_IN_DAY; | 
| -            } | 
| -            if (interval > expirationInterval) | 
| -            { | 
| -              expirationInterval = interval; | 
| -            } | 
| -          } | 
| -        } | 
| -        expirationInterval = Math.min(Math.max(expirationInterval, MIN_EXPIRATION_INTERVAL), MAX_EXPIRATION_INTERVAL); | 
| -        subscription.expires = subscription.lastDownload + expirationInterval * 2; | 
| -        subscription.softExpiration = subscription.lastDownload + Math.round(expirationInterval * (Math.random() * 0.4 + 0.8)); | 
| -        if (newFilters) | 
| -        { | 
| -          var fixedTitle = false; | 
| -          for (var i = 0; i < newFilters.length; i++) | 
| -          { | 
| -            var filter = newFilters[i]; | 
| -            if (!(filter instanceof CommentFilter)) | 
| -            { | 
| -              continue; | 
| -            } | 
| -            var match = /^!\s*(\w+)\s*:\s*(.*)/.exec(filter.text); | 
| -            if (match) | 
| -            { | 
| -              var keyword = match[1].toLowerCase(); | 
| -              var value = match[2]; | 
| -              var known = true; | 
| -              if (keyword == "redirect") | 
| -              { | 
| -                if (isBaseLocation && value != url) | 
| -                { | 
| -                  subscription.nextURL = value; | 
| -                } | 
| -              } | 
| -              else if (keyword == "homepage") | 
| -              { | 
| -                var uri = Utils.makeURI(value); | 
| -                if (uri && (uri.scheme == "http" || uri.scheme == "https")) | 
| -                { | 
| -                  subscription.homepage = uri.spec; | 
| -                } | 
| -              } | 
| -              else if (keyword == "title") | 
| -              { | 
| -                if (value) | 
| -                { | 
| -                  subscription.title = value; | 
| -                  fixedTitle = true; | 
| -                } | 
| -              } | 
| -              else | 
| -              { | 
| -                known = false; | 
| -              } | 
| -              if (known) | 
| -              { | 
| -                newFilters.splice(i--, 1); | 
| -              } | 
| -            } | 
| -          } | 
| -          subscription.fixedTitle = fixedTitle; | 
| -        } | 
| -        if (isBaseLocation && newURL && newURL != url) | 
| -        { | 
| -          var listed = subscription.url in FilterStorage.knownSubscriptions; | 
| -          if (listed) | 
| -          { | 
| -            FilterStorage.removeSubscription(subscription); | 
| -          } | 
| -          url = newURL; | 
| -          var newSubscription = Subscription.fromURL(url); | 
| -          for (var key in newSubscription) | 
| -          { | 
| -            delete newSubscription[key]; | 
| -          } | 
| -          for (var key in subscription) | 
| -          { | 
| -            newSubscription[key] = subscription[key]; | 
| -          } | 
| -          delete Subscription.knownSubscriptions[subscription.url]; | 
| -          newSubscription.oldSubscription = subscription; | 
| -          subscription = newSubscription; | 
| -          subscription.url = url; | 
| -          if (!(subscription.url in FilterStorage.knownSubscriptions) && listed) | 
| -          { | 
| -            FilterStorage.addSubscription(subscription); | 
| -          } | 
| -        } | 
| -        if (newFilters) | 
| -        { | 
| -          FilterStorage.updateSubscriptionFilters(subscription, newFilters); | 
| -        } | 
| -        delete subscription.oldSubscription; | 
| -      }, false); | 
| -      executing[url] = true; | 
| -      FilterNotifier.triggerListeners("subscription.downloadStatus", subscription); | 
| -      try | 
| -      { | 
| -        request.send(null); | 
| -      } | 
| -      catch (e) | 
| -      { | 
| -        delete executing[url]; | 
| -        errorCallback("synchronize_connection_error"); | 
| -        return; | 
| -      } | 
| -    } | 
| -  }; | 
| -  Synchronizer.init(); | 
| - | 
| -  function checkSubscriptions() | 
| -  { | 
| -    if (!Prefs.subscriptions_autoupdate) | 
| -    { | 
| -      return; | 
| -    } | 
| -    var time = Math.round(Date.now() / MILLISECONDS_IN_SECOND); | 
| -    for (var _loopIndex27 = 0; _loopIndex27 < FilterStorage.subscriptions.length; ++_loopIndex27) | 
| -    { | 
| -      var subscription = FilterStorage.subscriptions[_loopIndex27]; | 
| -      if (!(subscription instanceof DownloadableSubscription)) | 
| -      { | 
| -        continue; | 
| -      } | 
| -      if (subscription.lastCheck && time - subscription.lastCheck > MAX_ABSENSE_INTERVAL) | 
| -      { | 
| -        subscription.softExpiration += time - subscription.lastCheck; | 
| -      } | 
| -      subscription.lastCheck = time; | 
| -      if (subscription.expires - time > MAX_EXPIRATION_INTERVAL) | 
| -      { | 
| -        subscription.expires = time + MAX_EXPIRATION_INTERVAL; | 
| -      } | 
| -      if (subscription.softExpiration - time > MAX_EXPIRATION_INTERVAL) | 
| -      { | 
| -        subscription.softExpiration = time + MAX_EXPIRATION_INTERVAL; | 
| -      } | 
| -      if (subscription.softExpiration > time && subscription.expires > time) | 
| -      { | 
| -        continue; | 
| -      } | 
| -      if (time - subscription.lastDownload >= MIN_EXPIRATION_INTERVAL) | 
| -      { | 
| -        Synchronizer.execute(subscription, false); | 
| -      } | 
| -    } | 
| -  } | 
| - | 
| -  function readFilters(subscription, text, errorCallback) | 
| -  { | 
| -    var lines = text.split(/[\r\n]+/); | 
| -    var match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(lines[0]); | 
| -    if (!match) | 
| -    { | 
| -      errorCallback("synchronize_invalid_data"); | 
| -      return null; | 
| -    } | 
| -    var minVersion = match[1]; | 
| -    for (var i = 0; i < lines.length; i++) | 
| -    { | 
| -      var match = /!\s*checksum[\s\-:]+([\w\+\/]+)/i.exec(lines[i]); | 
| -      if (match) | 
| -      { | 
| -        lines.splice(i, 1); | 
| -        var checksum = Utils.generateChecksum(lines); | 
| -        if (checksum && checksum != match[1]) | 
| -        { | 
| -          errorCallback("synchronize_checksum_mismatch"); | 
| -          return null; | 
| -        } | 
| -        break; | 
| -      } | 
| -    } | 
| -    delete subscription.requiredVersion; | 
| -    delete subscription.upgradeRequired; | 
| -    if (minVersion) | 
| -    { | 
| -      var addonVersion = require("info").addonVersion; | 
| -      subscription.requiredVersion = minVersion; | 
| -      if (Services.vc.compare(minVersion, addonVersion) > 0) | 
| -      { | 
| -        subscription.upgradeRequired = true; | 
| -      } | 
| -    } | 
| -    lines.shift(); | 
| -    var result = []; | 
| -    for (var _loopIndex28 = 0; _loopIndex28 < lines.length; ++_loopIndex28) | 
| -    { | 
| -      var line = lines[_loopIndex28]; | 
| -      line = Filter.normalize(line); | 
| -      if (line) | 
| -      { | 
| -        result.push(Filter.fromText(line)); | 
| -      } | 
| -    } | 
| -    return result; | 
| -  } | 
| - | 
| -  function setError(subscription, error, channelStatus, responseStatus, downloadURL, isBaseLocation, manual) | 
| -  { | 
| -    if (!isBaseLocation) | 
| -    { | 
| -      subscription.alternativeLocations = null; | 
| -    } | 
| -    try | 
| -    { | 
| -      Cu.reportError("Adblock Plus: Downloading filter subscription " + subscription.title + " failed (" + Utils.getString(error) + ")\n" + "Download address: " + downloadURL + "\n" + "Channel status: " + channelStatus + "\n" + "Server response: " + responseStatus); | 
| -    } | 
| -    catch (e){} | 
| -    subscription.lastDownload = Math.round(Date.now() / MILLISECONDS_IN_SECOND); | 
| -    subscription.downloadStatus = error; | 
| -    if (!manual) | 
| -    { | 
| -      if (error == "synchronize_checksum_mismatch") | 
| -      { | 
| -        subscription.errors = 0; | 
| -      } | 
| -      else | 
| -      { | 
| -        subscription.errors++; | 
| -      } | 
| -      if (subscription.errors >= Prefs.subscriptions_fallbackerrors && /^https?:\/\//i.test(subscription.url)) | 
| -      { | 
| -        subscription.errors = 0; | 
| -        var fallbackURL = Prefs.subscriptions_fallbackurl; | 
| -        var addonVersion = require("info").addonVersion; | 
| -        fallbackURL = fallbackURL.replace(/%VERSION%/g, encodeURIComponent(addonVersion)); | 
| -        fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, encodeURIComponent(subscription.url)); | 
| -        fallbackURL = fallbackURL.replace(/%URL%/g, encodeURIComponent(downloadURL)); | 
| -        fallbackURL = fallbackURL.replace(/%ERROR%/g, encodeURIComponent(error)); | 
| -        fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, encodeURIComponent(channelStatus)); | 
| -        fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, encodeURIComponent(responseStatus)); | 
| -        var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); | 
| -        request.mozBackgroundRequest = true; | 
| -        request.open("GET", fallbackURL); | 
| -        request.overrideMimeType("text/plain"); | 
| -        request.channel.loadFlags = request.channel.loadFlags | request.channel.INHIBIT_CACHING | request.channel.VALIDATE_ALWAYS; | 
| -        request.addEventListener("load", function(ev) | 
| -        { | 
| -          if (onShutdown.done) | 
| -          { | 
| -            return; | 
| -          } | 
| -          if (!(subscription.url in FilterStorage.knownSubscriptions)) | 
| -          { | 
| -            return; | 
| -          } | 
| -          var match = /^(\d+)(?:\s+(\S+))?$/.exec(request.responseText); | 
| -          if (match && match[1] == "301" && match[2]) | 
| -          { | 
| -            subscription.nextURL = match[2]; | 
| -          } | 
| -          else if (match && match[1] == "410") | 
| -          { | 
| -            var data = "[Adblock]\n" + subscription.filters.map(function(f) | 
| -            { | 
| -              return f.text; | 
| -            }).join("\n"); | 
| -            var url = "data:text/plain," + encodeURIComponent(data); | 
| -            var newSubscription = Subscription.fromURL(url); | 
| -            newSubscription.title = subscription.title; | 
| -            newSubscription.disabled = subscription.disabled; | 
| -            FilterStorage.removeSubscription(subscription); | 
| -            FilterStorage.addSubscription(newSubscription); | 
| -            Synchronizer.execute(newSubscription); | 
| -          } | 
| -        }, false); | 
| -        request.send(null); | 
| -      } | 
| -    } | 
| -  } | 
| -  return exports; | 
| -})(); | 
|  |