Version 1.8.0
This commit is contained in:
		
							parent
							
								
									9029781974
								
							
						
					
					
						commit
						d2ec7ce49e
					
				
							
								
								
									
										16
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| 
						 | 
					@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
 | 
				
			||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 | 
					The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 | 
				
			||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 | 
					and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.8.0] - 2019-09-11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Compatibility note
 | 
				
			||||||
 | 
					- Require Firefox >= 55
 | 
				
			||||||
 | 
					- Require Chrome >= 22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					- Added default option to skip URLs with a host in a local range
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					- Fixed [#238](https://gitlab.com/KevinRoebert/ClearUrls/issues/238)
 | 
				
			||||||
 | 
					- Fixed wrong count on cleaning tool (forgot to count also the total amount of elements at cleaning tool)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					- Improvements on check for android systems ([#206](https://gitlab.com/KevinRoebert/ClearUrls/issues/206))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [1.7.4] - 2019-09-06
 | 
					## [1.7.4] - 2019-09-06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Compatibility note
 | 
					### Compatibility note
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -230,5 +230,13 @@
 | 
				
			||||||
    "cleaning_tool_clean_urls_label": {
 | 
					    "cleaning_tool_clean_urls_label": {
 | 
				
			||||||
        "message": "Hier finden Sie die gesäuberten URLs:",
 | 
					        "message": "Hier finden Sie die gesäuberten URLs:",
 | 
				
			||||||
        "description": "Diese Zeichenfolge wird als Titel auf der Bereinigungswerkzeugseite für die bereinigten URLs verwendet."
 | 
					        "description": "Diese Zeichenfolge wird als Titel auf der Bereinigungswerkzeugseite für die bereinigten URLs verwendet."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "local_hosts_skipping": {
 | 
				
			||||||
 | 
					        "message": "Auslassen von lokalen URLs (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
 | 
				
			||||||
 | 
					        "description": "Diese Zeichenkette wird als Beschreibung für das Auslassen von lokalen URLs verwendet."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "local_hosts_skipping_title": {
 | 
				
			||||||
 | 
					        "message": "Auslassen von lokalen URLs",
 | 
				
			||||||
 | 
					        "description": "Diese Zeichenkette wird als Titel für das Auslassen von lokalen URLs verwendet."
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -230,5 +230,13 @@
 | 
				
			||||||
    "cleaning_tool_clean_urls_label": {
 | 
					    "cleaning_tool_clean_urls_label": {
 | 
				
			||||||
        "message": "Here you can find the cleaned URLs:",
 | 
					        "message": "Here you can find the cleaned URLs:",
 | 
				
			||||||
        "description": "This string is used as title on the cleaning tool page for the clean URLs."
 | 
					        "description": "This string is used as title on the cleaning tool page for the clean URLs."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "local_hosts_skipping": {
 | 
				
			||||||
 | 
					        "message": "Skipping URLs on local hosts (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
 | 
				
			||||||
 | 
					        "description": "This string is used as label for the local host skipping switch"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "local_hosts_skipping_title": {
 | 
				
			||||||
 | 
					        "message": "Skipping URLs on local hosts",
 | 
				
			||||||
 | 
					        "description": "This string is used as title for the local host skipping switch"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								clearurls.js
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								clearurls.js
									
									
									
									
									
								
							| 
						 | 
					@ -48,6 +48,14 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
    var cancel = false;
 | 
					    var cancel = false;
 | 
				
			||||||
    var rawRules = provider.getRawRules();
 | 
					    var rawRules = provider.getRawRules();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(storage.localHostsSkipping && checkLocalURL(pureUrl)) {
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            "changes": false,
 | 
				
			||||||
 | 
					            "url": url,
 | 
				
			||||||
 | 
					            "cancel": false
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
    * Apply raw rules to the URL.
 | 
					    * Apply raw rules to the URL.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
| 
						 | 
					@ -66,8 +74,9 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            increaseURLCounter();
 | 
					            increaseURLCounter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(!checkOSAndroid())
 | 
					            checkOSAndroid().then((res) => {
 | 
				
			||||||
            {
 | 
					                if(!res) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if(storage.badgedStatus) {
 | 
					                    if(storage.badgedStatus) {
 | 
				
			||||||
                        browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
					                        browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -76,6 +85,7 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
                        browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
					                        browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            changes = true;
 | 
					            changes = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -144,8 +154,9 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                increaseURLCounter();
 | 
					                increaseURLCounter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if(!checkOSAndroid())
 | 
					                checkOSAndroid().then((res) => {
 | 
				
			||||||
                {
 | 
					                    if(!res) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        if(storage.badgedStatus) {
 | 
					                        if(storage.badgedStatus) {
 | 
				
			||||||
                            browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
					                            browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
| 
						 | 
					@ -154,6 +165,8 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
                            browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
					                            browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
                changes = true;
 | 
					                changes = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
| 
						 | 
					@ -175,8 +188,8 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        increaseURLCounter();
 | 
					        increaseURLCounter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!checkOSAndroid())
 | 
					        checkOSAndroid().then((res) => {
 | 
				
			||||||
        {
 | 
					            if(!res) {
 | 
				
			||||||
                if(storage.badgedStatus) {
 | 
					                if(storage.badgedStatus) {
 | 
				
			||||||
                    browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
					                    browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -185,6 +198,7 @@ function removeFieldsFormURL(provider, pureUrl)
 | 
				
			||||||
                    browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
					                    browser.browserAction.setBadgeText({text: "", tabId: tabid});
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cancel = true;
 | 
					        cancel = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,10 @@
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
function pureCleaning(url) {
 | 
					function pureCleaning(url) {
 | 
				
			||||||
    var cleanURL = url;
 | 
					    var cleanURL = url;
 | 
				
			||||||
 | 
					    var URLbeforeReplaceCount = countFields(url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Add Fields form Request to global url counter
 | 
				
			||||||
 | 
					    increaseGlobalURLCounter(URLbeforeReplaceCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (var i = 0; i < providers.length; i++) {
 | 
					    for (var i = 0; i < providers.length; i++) {
 | 
				
			||||||
        var result = {
 | 
					        var result = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,8 +110,6 @@ function save()
 | 
				
			||||||
        function: "reload",
 | 
					        function: "reload",
 | 
				
			||||||
        params: []
 | 
					        params: []
 | 
				
			||||||
    }).then(handleResponse, handleError);
 | 
					    }).then(handleResponse, handleError);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    //location.reload();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -159,12 +157,17 @@ function getData()
 | 
				
			||||||
            params: ["historyListenerEnabled"]
 | 
					            params: ["historyListenerEnabled"]
 | 
				
			||||||
        }).then((data) => {
 | 
					        }).then((data) => {
 | 
				
			||||||
            handleResponseData(data, "historyListenerEnabled", "historyListenerEnabled");
 | 
					            handleResponseData(data, "historyListenerEnabled", "historyListenerEnabled");
 | 
				
			||||||
 | 
					            browser.runtime.sendMessage({
 | 
				
			||||||
 | 
					                function: "getData",
 | 
				
			||||||
 | 
					                params: ["localHostsSkipping"]
 | 
				
			||||||
 | 
					            }).then((data) => {
 | 
				
			||||||
 | 
					                handleResponseData(data, "localHostsSkipping", "localHostsSkipping");
 | 
				
			||||||
                changeSwitchButton("contextMenuEnabled", "contextMenuEnabled");
 | 
					                changeSwitchButton("contextMenuEnabled", "contextMenuEnabled");
 | 
				
			||||||
                changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
 | 
					                changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
 | 
				
			||||||
 | 
					                changeSwitchButton("localHostsSkipping", "localHostsSkipping");
 | 
				
			||||||
 | 
					            }, handleError);
 | 
				
			||||||
        }, handleError);
 | 
					        }, handleError);
 | 
				
			||||||
    }, handleError);
 | 
					    }, handleError);
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -184,6 +187,7 @@ function setText()
 | 
				
			||||||
    $('#save_settings_btn').prop('title', translate('settings_html_save_button_title'));
 | 
					    $('#save_settings_btn').prop('title', translate('settings_html_save_button_title'));
 | 
				
			||||||
    injectText("context_menu_enabled", "context_menu_enabled");
 | 
					    injectText("context_menu_enabled", "context_menu_enabled");
 | 
				
			||||||
    $('#history_listener_enabled').html(translate('history_listener_enabled'));
 | 
					    $('#history_listener_enabled').html(translate('history_listener_enabled'));
 | 
				
			||||||
 | 
					    injectText("local_hosts_skipping", "local_hosts_skipping");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -160,6 +160,7 @@ function initSettings()
 | 
				
			||||||
    storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json";
 | 
					    storage.ruleURL = "https://gitlab.com/KevinRoebert/ClearUrls/raw/master/data/data.min.json";
 | 
				
			||||||
    storage.contextMenuEnabled = true;
 | 
					    storage.contextMenuEnabled = true;
 | 
				
			||||||
    storage.historyListenerEnabled = true;
 | 
					    storage.historyListenerEnabled = true;
 | 
				
			||||||
 | 
					    storage.localHostsSkipping = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(getBrowser() === "Firefox") {
 | 
					    if(getBrowser() === "Firefox") {
 | 
				
			||||||
        storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"];
 | 
					        storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,10 +67,10 @@ function reload()
 | 
				
			||||||
* Check if it is an android device.
 | 
					* Check if it is an android device.
 | 
				
			||||||
* @return bool
 | 
					* @return bool
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
function checkOSAndroid()
 | 
					async function checkOSAndroid()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(os === undefined || os === null || os === "") {
 | 
					    if(os === undefined || os === null || os === "") {
 | 
				
			||||||
        chrome.runtime.getPlatformInfo(function(info) {
 | 
					        await chrome.runtime.getPlatformInfo(function(info) {
 | 
				
			||||||
            os = info.os;
 | 
					            os = info.os;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -84,6 +84,31 @@ function checkOSAndroid()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Extract the host without port from an url.
 | 
				
			||||||
 | 
					* @param  {String} url URL as String
 | 
				
			||||||
 | 
					* @return {Array}     host as string
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function extractHost(url) {
 | 
				
			||||||
 | 
					    let parsed_url = new URL(url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return parsed_url.hostname;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Returns true if the url has a local host.
 | 
				
			||||||
 | 
					* @param  {String} url URL as String
 | 
				
			||||||
 | 
					* @return {boolean}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					function checkLocalURL(url) {
 | 
				
			||||||
 | 
					    let host = extractHost(url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ipRangeCheck(host, ["10.0.0.0/8", "172.16.0.0/12",
 | 
				
			||||||
 | 
					    "192.168.0.0/16", "100.64.0.0/10",
 | 
				
			||||||
 | 
					    "169.254.0.0/16", "127.0.0.1"])||
 | 
				
			||||||
 | 
					    host === 'localhost';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* Return the number of parameters query strings.
 | 
					* Return the number of parameters query strings.
 | 
				
			||||||
* @param  {String}     url URL as String
 | 
					* @param  {String}     url URL as String
 | 
				
			||||||
| 
						 | 
					@ -225,13 +250,15 @@ function increaseURLCounter()
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
function changeIcon()
 | 
					function changeIcon()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(!checkOSAndroid()) {
 | 
					    checkOSAndroid().then((res) => {
 | 
				
			||||||
 | 
					        if(!res) {
 | 
				
			||||||
            if(storage.globalStatus){
 | 
					            if(storage.globalStatus){
 | 
				
			||||||
                browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
 | 
					                browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
 | 
				
			||||||
            } else{
 | 
					            } else{
 | 
				
			||||||
                browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
 | 
					                browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -241,11 +268,13 @@ function changeIcon()
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
function setBadgedStatus()
 | 
					function setBadgedStatus()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if(!checkOSAndroid() && storage.badgedStatus){
 | 
					    checkOSAndroid().then((res) => {
 | 
				
			||||||
 | 
					        if(!res && storage.badgedStatus) {
 | 
				
			||||||
            browser.browserAction.setBadgeBackgroundColor({
 | 
					            browser.browserAction.setBadgeBackgroundColor({
 | 
				
			||||||
                'color': '#'+storage.badged_color
 | 
					                'color': '#'+storage.badged_color
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										750
									
								
								external_js/ip-range-check.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										750
									
								
								external_js/ip-range-check.js
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,750 @@
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * MIT License
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2018 Daniel Compton
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					 * of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					 * in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					 * copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					 * furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					 * copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					 * SOFTWARE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * https://github.com/danielcompton/ip-range-check
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Build with: Browserify
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					var ipRangeCheck;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
 | 
				
			||||||
 | 
					ipRangeCheck = require("ip-range-check");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					},{"ip-range-check":2}],2:[function(require,module,exports){
 | 
				
			||||||
 | 
					var ipaddr = require("ipaddr.js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = check_many_cidrs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function check_many_cidrs(addr, range) {
 | 
				
			||||||
 | 
					    if (typeof (range) === "string") {
 | 
				
			||||||
 | 
					        return check_single_cidr(addr, range)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (typeof (range) === "object") //list
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var ip_is_in_range = false;
 | 
				
			||||||
 | 
					        for (var i = 0; i < range.length; i++) {
 | 
				
			||||||
 | 
					            if (check_single_cidr(addr, range[i])) {
 | 
				
			||||||
 | 
					                ip_is_in_range = true;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ip_is_in_range;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function check_single_cidr(addr, cidr) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					        var parsed_addr = ipaddr.process(addr);
 | 
				
			||||||
 | 
					        if (cidr.indexOf('/') === -1) {
 | 
				
			||||||
 | 
					            var parsed_cidr_as_ip = ipaddr.process(cidr);
 | 
				
			||||||
 | 
					            if ((parsed_addr.kind() === "ipv6") && (parsed_cidr_as_ip.kind() === "ipv6")){
 | 
				
			||||||
 | 
					                return (parsed_addr.toNormalizedString() === parsed_cidr_as_ip.toNormalizedString())
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return (parsed_addr.toString() == parsed_cidr_as_ip.toString())
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            var parsed_range = ipaddr.parseCIDR(cidr);
 | 
				
			||||||
 | 
					            return parsed_addr.match(parsed_range)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    catch (e) {
 | 
				
			||||||
 | 
					        return false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					},{"ipaddr.js":3}],3:[function(require,module,exports){
 | 
				
			||||||
 | 
					(function() {
 | 
				
			||||||
 | 
					  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  root = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((typeof module !== "undefined" && module !== null) && module.exports) {
 | 
				
			||||||
 | 
					    module.exports = ipaddr;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    root['ipaddr'] = ipaddr;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  matchCIDR = function(first, second, partSize, cidrBits) {
 | 
				
			||||||
 | 
					    var part, shift;
 | 
				
			||||||
 | 
					    if (first.length !== second.length) {
 | 
				
			||||||
 | 
					      throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    part = 0;
 | 
				
			||||||
 | 
					    while (cidrBits > 0) {
 | 
				
			||||||
 | 
					      shift = partSize - cidrBits;
 | 
				
			||||||
 | 
					      if (shift < 0) {
 | 
				
			||||||
 | 
					        shift = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (first[part] >> shift !== second[part] >> shift) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      cidrBits -= partSize;
 | 
				
			||||||
 | 
					      part += 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.subnetMatch = function(address, rangeList, defaultName) {
 | 
				
			||||||
 | 
					    var k, len, rangeName, rangeSubnets, subnet;
 | 
				
			||||||
 | 
					    if (defaultName == null) {
 | 
				
			||||||
 | 
					      defaultName = 'unicast';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    for (rangeName in rangeList) {
 | 
				
			||||||
 | 
					      rangeSubnets = rangeList[rangeName];
 | 
				
			||||||
 | 
					      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
 | 
				
			||||||
 | 
					        rangeSubnets = [rangeSubnets];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      for (k = 0, len = rangeSubnets.length; k < len; k++) {
 | 
				
			||||||
 | 
					        subnet = rangeSubnets[k];
 | 
				
			||||||
 | 
					        if (address.kind() === subnet[0].kind()) {
 | 
				
			||||||
 | 
					          if (address.match.apply(address, subnet)) {
 | 
				
			||||||
 | 
					            return rangeName;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return defaultName;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4 = (function() {
 | 
				
			||||||
 | 
					    function IPv4(octets) {
 | 
				
			||||||
 | 
					      var k, len, octet;
 | 
				
			||||||
 | 
					      if (octets.length !== 4) {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: ipv4 octet count should be 4");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      for (k = 0, len = octets.length; k < len; k++) {
 | 
				
			||||||
 | 
					        octet = octets[k];
 | 
				
			||||||
 | 
					        if (!((0 <= octet && octet <= 255))) {
 | 
				
			||||||
 | 
					          throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      this.octets = octets;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.kind = function() {
 | 
				
			||||||
 | 
					      return 'ipv4';
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.toString = function() {
 | 
				
			||||||
 | 
					      return this.octets.join(".");
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.toNormalizedString = function() {
 | 
				
			||||||
 | 
					      return this.toString();
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.toByteArray = function() {
 | 
				
			||||||
 | 
					      return this.octets.slice(0);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.match = function(other, cidrRange) {
 | 
				
			||||||
 | 
					      var ref;
 | 
				
			||||||
 | 
					      if (cidrRange === void 0) {
 | 
				
			||||||
 | 
					        ref = other, other = ref[0], cidrRange = ref[1];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (other.kind() !== 'ipv4') {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return matchCIDR(this.octets, other.octets, 8, cidrRange);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.SpecialRanges = {
 | 
				
			||||||
 | 
					      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
 | 
				
			||||||
 | 
					      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
 | 
				
			||||||
 | 
					      multicast: [[new IPv4([224, 0, 0, 0]), 4]],
 | 
				
			||||||
 | 
					      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
 | 
				
			||||||
 | 
					      loopback: [[new IPv4([127, 0, 0, 0]), 8]],
 | 
				
			||||||
 | 
					      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
 | 
				
			||||||
 | 
					      "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
 | 
				
			||||||
 | 
					      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.range = function() {
 | 
				
			||||||
 | 
					      return ipaddr.subnetMatch(this, this.SpecialRanges);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.toIPv4MappedAddress = function() {
 | 
				
			||||||
 | 
					      return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv4.prototype.prefixLengthFromSubnetMask = function() {
 | 
				
			||||||
 | 
					      var cidr, i, k, octet, stop, zeros, zerotable;
 | 
				
			||||||
 | 
					      zerotable = {
 | 
				
			||||||
 | 
					        0: 8,
 | 
				
			||||||
 | 
					        128: 7,
 | 
				
			||||||
 | 
					        192: 6,
 | 
				
			||||||
 | 
					        224: 5,
 | 
				
			||||||
 | 
					        240: 4,
 | 
				
			||||||
 | 
					        248: 3,
 | 
				
			||||||
 | 
					        252: 2,
 | 
				
			||||||
 | 
					        254: 1,
 | 
				
			||||||
 | 
					        255: 0
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      cidr = 0;
 | 
				
			||||||
 | 
					      stop = false;
 | 
				
			||||||
 | 
					      for (i = k = 3; k >= 0; i = k += -1) {
 | 
				
			||||||
 | 
					        octet = this.octets[i];
 | 
				
			||||||
 | 
					        if (octet in zerotable) {
 | 
				
			||||||
 | 
					          zeros = zerotable[octet];
 | 
				
			||||||
 | 
					          if (stop && zeros !== 0) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (zeros !== 8) {
 | 
				
			||||||
 | 
					            stop = true;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          cidr += zeros;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return 32 - cidr;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return IPv4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipv4Part = "(0?\\d+|0x[a-f0-9]+)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipv4Regexes = {
 | 
				
			||||||
 | 
					    fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
 | 
				
			||||||
 | 
					    longValue: new RegExp("^" + ipv4Part + "$", 'i')
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.parser = function(string) {
 | 
				
			||||||
 | 
					    var match, parseIntAuto, part, shift, value;
 | 
				
			||||||
 | 
					    parseIntAuto = function(string) {
 | 
				
			||||||
 | 
					      if (string[0] === "0" && string[1] !== "x") {
 | 
				
			||||||
 | 
					        return parseInt(string, 8);
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        return parseInt(string);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    if (match = string.match(ipv4Regexes.fourOctet)) {
 | 
				
			||||||
 | 
					      return (function() {
 | 
				
			||||||
 | 
					        var k, len, ref, results;
 | 
				
			||||||
 | 
					        ref = match.slice(1, 6);
 | 
				
			||||||
 | 
					        results = [];
 | 
				
			||||||
 | 
					        for (k = 0, len = ref.length; k < len; k++) {
 | 
				
			||||||
 | 
					          part = ref[k];
 | 
				
			||||||
 | 
					          results.push(parseIntAuto(part));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return results;
 | 
				
			||||||
 | 
					      })();
 | 
				
			||||||
 | 
					    } else if (match = string.match(ipv4Regexes.longValue)) {
 | 
				
			||||||
 | 
					      value = parseIntAuto(match[1]);
 | 
				
			||||||
 | 
					      if (value > 0xffffffff || value < 0) {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: address outside defined range");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return ((function() {
 | 
				
			||||||
 | 
					        var k, results;
 | 
				
			||||||
 | 
					        results = [];
 | 
				
			||||||
 | 
					        for (shift = k = 0; k <= 24; shift = k += 8) {
 | 
				
			||||||
 | 
					          results.push((value >> shift) & 0xff);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return results;
 | 
				
			||||||
 | 
					      })()).reverse();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv6 = (function() {
 | 
				
			||||||
 | 
					    function IPv6(parts, zoneId) {
 | 
				
			||||||
 | 
					      var i, k, l, len, part, ref;
 | 
				
			||||||
 | 
					      if (parts.length === 16) {
 | 
				
			||||||
 | 
					        this.parts = [];
 | 
				
			||||||
 | 
					        for (i = k = 0; k <= 14; i = k += 2) {
 | 
				
			||||||
 | 
					          this.parts.push((parts[i] << 8) | parts[i + 1]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else if (parts.length === 8) {
 | 
				
			||||||
 | 
					        this.parts = parts;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: ipv6 part count should be 8 or 16");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ref = this.parts;
 | 
				
			||||||
 | 
					      for (l = 0, len = ref.length; l < len; l++) {
 | 
				
			||||||
 | 
					        part = ref[l];
 | 
				
			||||||
 | 
					        if (!((0 <= part && part <= 0xffff))) {
 | 
				
			||||||
 | 
					          throw new Error("ipaddr: ipv6 part should fit in 16 bits");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (zoneId) {
 | 
				
			||||||
 | 
					        this.zoneId = zoneId;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.kind = function() {
 | 
				
			||||||
 | 
					      return 'ipv6';
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toString = function() {
 | 
				
			||||||
 | 
					      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toRFC5952String = function() {
 | 
				
			||||||
 | 
					      var bestMatchIndex, bestMatchLength, match, regex, string;
 | 
				
			||||||
 | 
					      regex = /((^|:)(0(:|$)){2,})/g;
 | 
				
			||||||
 | 
					      string = this.toNormalizedString();
 | 
				
			||||||
 | 
					      bestMatchIndex = 0;
 | 
				
			||||||
 | 
					      bestMatchLength = -1;
 | 
				
			||||||
 | 
					      while ((match = regex.exec(string))) {
 | 
				
			||||||
 | 
					        if (match[0].length > bestMatchLength) {
 | 
				
			||||||
 | 
					          bestMatchIndex = match.index;
 | 
				
			||||||
 | 
					          bestMatchLength = match[0].length;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (bestMatchLength < 0) {
 | 
				
			||||||
 | 
					        return string;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toByteArray = function() {
 | 
				
			||||||
 | 
					      var bytes, k, len, part, ref;
 | 
				
			||||||
 | 
					      bytes = [];
 | 
				
			||||||
 | 
					      ref = this.parts;
 | 
				
			||||||
 | 
					      for (k = 0, len = ref.length; k < len; k++) {
 | 
				
			||||||
 | 
					        part = ref[k];
 | 
				
			||||||
 | 
					        bytes.push(part >> 8);
 | 
				
			||||||
 | 
					        bytes.push(part & 0xff);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return bytes;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toNormalizedString = function() {
 | 
				
			||||||
 | 
					      var addr, part, suffix;
 | 
				
			||||||
 | 
					      addr = ((function() {
 | 
				
			||||||
 | 
					        var k, len, ref, results;
 | 
				
			||||||
 | 
					        ref = this.parts;
 | 
				
			||||||
 | 
					        results = [];
 | 
				
			||||||
 | 
					        for (k = 0, len = ref.length; k < len; k++) {
 | 
				
			||||||
 | 
					          part = ref[k];
 | 
				
			||||||
 | 
					          results.push(part.toString(16));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return results;
 | 
				
			||||||
 | 
					      }).call(this)).join(":");
 | 
				
			||||||
 | 
					      suffix = '';
 | 
				
			||||||
 | 
					      if (this.zoneId) {
 | 
				
			||||||
 | 
					        suffix = '%' + this.zoneId;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return addr + suffix;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toFixedLengthString = function() {
 | 
				
			||||||
 | 
					      var addr, part, suffix;
 | 
				
			||||||
 | 
					      addr = ((function() {
 | 
				
			||||||
 | 
					        var k, len, ref, results;
 | 
				
			||||||
 | 
					        ref = this.parts;
 | 
				
			||||||
 | 
					        results = [];
 | 
				
			||||||
 | 
					        for (k = 0, len = ref.length; k < len; k++) {
 | 
				
			||||||
 | 
					          part = ref[k];
 | 
				
			||||||
 | 
					          results.push(part.toString(16).padStart(4, '0'));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return results;
 | 
				
			||||||
 | 
					      }).call(this)).join(":");
 | 
				
			||||||
 | 
					      suffix = '';
 | 
				
			||||||
 | 
					      if (this.zoneId) {
 | 
				
			||||||
 | 
					        suffix = '%' + this.zoneId;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return addr + suffix;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.match = function(other, cidrRange) {
 | 
				
			||||||
 | 
					      var ref;
 | 
				
			||||||
 | 
					      if (cidrRange === void 0) {
 | 
				
			||||||
 | 
					        ref = other, other = ref[0], cidrRange = ref[1];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (other.kind() !== 'ipv6') {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return matchCIDR(this.parts, other.parts, 16, cidrRange);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.SpecialRanges = {
 | 
				
			||||||
 | 
					      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
 | 
				
			||||||
 | 
					      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
 | 
				
			||||||
 | 
					      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
 | 
				
			||||||
 | 
					      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
 | 
				
			||||||
 | 
					      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
 | 
				
			||||||
 | 
					      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
 | 
				
			||||||
 | 
					      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
 | 
				
			||||||
 | 
					      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
 | 
				
			||||||
 | 
					      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
 | 
				
			||||||
 | 
					      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
 | 
				
			||||||
 | 
					      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.range = function() {
 | 
				
			||||||
 | 
					      return ipaddr.subnetMatch(this, this.SpecialRanges);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.isIPv4MappedAddress = function() {
 | 
				
			||||||
 | 
					      return this.range() === 'ipv4Mapped';
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.toIPv4Address = function() {
 | 
				
			||||||
 | 
					      var high, low, ref;
 | 
				
			||||||
 | 
					      if (!this.isIPv4MappedAddress()) {
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ref = this.parts.slice(-2), high = ref[0], low = ref[1];
 | 
				
			||||||
 | 
					      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    IPv6.prototype.prefixLengthFromSubnetMask = function() {
 | 
				
			||||||
 | 
					      var cidr, i, k, part, stop, zeros, zerotable;
 | 
				
			||||||
 | 
					      zerotable = {
 | 
				
			||||||
 | 
					        0: 16,
 | 
				
			||||||
 | 
					        32768: 15,
 | 
				
			||||||
 | 
					        49152: 14,
 | 
				
			||||||
 | 
					        57344: 13,
 | 
				
			||||||
 | 
					        61440: 12,
 | 
				
			||||||
 | 
					        63488: 11,
 | 
				
			||||||
 | 
					        64512: 10,
 | 
				
			||||||
 | 
					        65024: 9,
 | 
				
			||||||
 | 
					        65280: 8,
 | 
				
			||||||
 | 
					        65408: 7,
 | 
				
			||||||
 | 
					        65472: 6,
 | 
				
			||||||
 | 
					        65504: 5,
 | 
				
			||||||
 | 
					        65520: 4,
 | 
				
			||||||
 | 
					        65528: 3,
 | 
				
			||||||
 | 
					        65532: 2,
 | 
				
			||||||
 | 
					        65534: 1,
 | 
				
			||||||
 | 
					        65535: 0
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      cidr = 0;
 | 
				
			||||||
 | 
					      stop = false;
 | 
				
			||||||
 | 
					      for (i = k = 7; k >= 0; i = k += -1) {
 | 
				
			||||||
 | 
					        part = this.parts[i];
 | 
				
			||||||
 | 
					        if (part in zerotable) {
 | 
				
			||||||
 | 
					          zeros = zerotable[part];
 | 
				
			||||||
 | 
					          if (stop && zeros !== 0) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (zeros !== 16) {
 | 
				
			||||||
 | 
					            stop = true;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          cidr += zeros;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return 128 - cidr;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return IPv6;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipv6Part = "(?:[0-9a-f]+::?)+";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  zoneIndex = "%[0-9a-z]{1,}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipv6Regexes = {
 | 
				
			||||||
 | 
					    zoneIndex: new RegExp(zoneIndex, 'i'),
 | 
				
			||||||
 | 
					    "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
 | 
				
			||||||
 | 
					    transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expandIPv6 = function(string, parts) {
 | 
				
			||||||
 | 
					    var colonCount, lastColon, part, replacement, replacementCount, zoneId;
 | 
				
			||||||
 | 
					    if (string.indexOf('::') !== string.lastIndexOf('::')) {
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
 | 
				
			||||||
 | 
					    if (zoneId) {
 | 
				
			||||||
 | 
					      zoneId = zoneId.substring(1);
 | 
				
			||||||
 | 
					      string = string.replace(/%.+$/, '');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    colonCount = 0;
 | 
				
			||||||
 | 
					    lastColon = -1;
 | 
				
			||||||
 | 
					    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
 | 
				
			||||||
 | 
					      colonCount++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (string.substr(0, 2) === '::') {
 | 
				
			||||||
 | 
					      colonCount--;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (string.substr(-2, 2) === '::') {
 | 
				
			||||||
 | 
					      colonCount--;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (colonCount > parts) {
 | 
				
			||||||
 | 
					      return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    replacementCount = parts - colonCount;
 | 
				
			||||||
 | 
					    replacement = ':';
 | 
				
			||||||
 | 
					    while (replacementCount--) {
 | 
				
			||||||
 | 
					      replacement += '0:';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    string = string.replace('::', replacement);
 | 
				
			||||||
 | 
					    if (string[0] === ':') {
 | 
				
			||||||
 | 
					      string = string.slice(1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (string[string.length - 1] === ':') {
 | 
				
			||||||
 | 
					      string = string.slice(0, -1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    parts = (function() {
 | 
				
			||||||
 | 
					      var k, len, ref, results;
 | 
				
			||||||
 | 
					      ref = string.split(":");
 | 
				
			||||||
 | 
					      results = [];
 | 
				
			||||||
 | 
					      for (k = 0, len = ref.length; k < len; k++) {
 | 
				
			||||||
 | 
					        part = ref[k];
 | 
				
			||||||
 | 
					        results.push(parseInt(part, 16));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return results;
 | 
				
			||||||
 | 
					    })();
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      parts: parts,
 | 
				
			||||||
 | 
					      zoneId: zoneId
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv6.parser = function(string) {
 | 
				
			||||||
 | 
					    var addr, k, len, match, octet, octets, zoneId;
 | 
				
			||||||
 | 
					    if (ipv6Regexes['native'].test(string)) {
 | 
				
			||||||
 | 
					      return expandIPv6(string, 8);
 | 
				
			||||||
 | 
					    } else if (match = string.match(ipv6Regexes['transitional'])) {
 | 
				
			||||||
 | 
					      zoneId = match[6] || '';
 | 
				
			||||||
 | 
					      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
 | 
				
			||||||
 | 
					      if (addr.parts) {
 | 
				
			||||||
 | 
					        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
 | 
				
			||||||
 | 
					        for (k = 0, len = octets.length; k < len; k++) {
 | 
				
			||||||
 | 
					          octet = octets[k];
 | 
				
			||||||
 | 
					          if (!((0 <= octet && octet <= 255))) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        addr.parts.push(octets[0] << 8 | octets[1]);
 | 
				
			||||||
 | 
					        addr.parts.push(octets[2] << 8 | octets[3]);
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          parts: addr.parts,
 | 
				
			||||||
 | 
					          zoneId: addr.zoneId
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return null;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
 | 
				
			||||||
 | 
					    return this.parser(string) !== null;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.isValid = function(string) {
 | 
				
			||||||
 | 
					    var e;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      new this(this.parser(string));
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    } catch (error1) {
 | 
				
			||||||
 | 
					      e = error1;
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.isValidFourPartDecimal = function(string) {
 | 
				
			||||||
 | 
					    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv6.isValid = function(string) {
 | 
				
			||||||
 | 
					    var addr, e;
 | 
				
			||||||
 | 
					    if (typeof string === "string" && string.indexOf(":") === -1) {
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      addr = this.parser(string);
 | 
				
			||||||
 | 
					      new this(addr.parts, addr.zoneId);
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    } catch (error1) {
 | 
				
			||||||
 | 
					      e = error1;
 | 
				
			||||||
 | 
					      return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.parse = function(string) {
 | 
				
			||||||
 | 
					    var parts;
 | 
				
			||||||
 | 
					    parts = this.parser(string);
 | 
				
			||||||
 | 
					    if (parts === null) {
 | 
				
			||||||
 | 
					      throw new Error("ipaddr: string is not formatted like ip address");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return new this(parts);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv6.parse = function(string) {
 | 
				
			||||||
 | 
					    var addr;
 | 
				
			||||||
 | 
					    addr = this.parser(string);
 | 
				
			||||||
 | 
					    if (addr.parts === null) {
 | 
				
			||||||
 | 
					      throw new Error("ipaddr: string is not formatted like ip address");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return new this(addr.parts, addr.zoneId);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.parseCIDR = function(string) {
 | 
				
			||||||
 | 
					    var maskLength, match, parsed;
 | 
				
			||||||
 | 
					    if (match = string.match(/^(.+)\/(\d+)$/)) {
 | 
				
			||||||
 | 
					      maskLength = parseInt(match[2]);
 | 
				
			||||||
 | 
					      if (maskLength >= 0 && maskLength <= 32) {
 | 
				
			||||||
 | 
					        parsed = [this.parse(match[1]), maskLength];
 | 
				
			||||||
 | 
					        Object.defineProperty(parsed, 'toString', {
 | 
				
			||||||
 | 
					          value: function() {
 | 
				
			||||||
 | 
					            return this.join('/');
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return parsed;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
 | 
				
			||||||
 | 
					    var filledOctetCount, j, octets;
 | 
				
			||||||
 | 
					    prefix = parseInt(prefix);
 | 
				
			||||||
 | 
					    if (prefix < 0 || prefix > 32) {
 | 
				
			||||||
 | 
					      throw new Error('ipaddr: invalid IPv4 prefix length');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    octets = [0, 0, 0, 0];
 | 
				
			||||||
 | 
					    j = 0;
 | 
				
			||||||
 | 
					    filledOctetCount = Math.floor(prefix / 8);
 | 
				
			||||||
 | 
					    while (j < filledOctetCount) {
 | 
				
			||||||
 | 
					      octets[j] = 255;
 | 
				
			||||||
 | 
					      j++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (filledOctetCount < 4) {
 | 
				
			||||||
 | 
					      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return new this(octets);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
 | 
				
			||||||
 | 
					    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      cidr = this.parseCIDR(string);
 | 
				
			||||||
 | 
					      ipInterfaceOctets = cidr[0].toByteArray();
 | 
				
			||||||
 | 
					      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
 | 
				
			||||||
 | 
					      octets = [];
 | 
				
			||||||
 | 
					      i = 0;
 | 
				
			||||||
 | 
					      while (i < 4) {
 | 
				
			||||||
 | 
					        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
 | 
				
			||||||
 | 
					        i++;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return new this(octets);
 | 
				
			||||||
 | 
					    } catch (error1) {
 | 
				
			||||||
 | 
					      error = error1;
 | 
				
			||||||
 | 
					      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv4.networkAddressFromCIDR = function(string) {
 | 
				
			||||||
 | 
					    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      cidr = this.parseCIDR(string);
 | 
				
			||||||
 | 
					      ipInterfaceOctets = cidr[0].toByteArray();
 | 
				
			||||||
 | 
					      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
 | 
				
			||||||
 | 
					      octets = [];
 | 
				
			||||||
 | 
					      i = 0;
 | 
				
			||||||
 | 
					      while (i < 4) {
 | 
				
			||||||
 | 
					        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
 | 
				
			||||||
 | 
					        i++;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return new this(octets);
 | 
				
			||||||
 | 
					    } catch (error1) {
 | 
				
			||||||
 | 
					      error = error1;
 | 
				
			||||||
 | 
					      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.IPv6.parseCIDR = function(string) {
 | 
				
			||||||
 | 
					    var maskLength, match, parsed;
 | 
				
			||||||
 | 
					    if (match = string.match(/^(.+)\/(\d+)$/)) {
 | 
				
			||||||
 | 
					      maskLength = parseInt(match[2]);
 | 
				
			||||||
 | 
					      if (maskLength >= 0 && maskLength <= 128) {
 | 
				
			||||||
 | 
					        parsed = [this.parse(match[1]), maskLength];
 | 
				
			||||||
 | 
					        Object.defineProperty(parsed, 'toString', {
 | 
				
			||||||
 | 
					          value: function() {
 | 
				
			||||||
 | 
					            return this.join('/');
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        return parsed;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.isValid = function(string) {
 | 
				
			||||||
 | 
					    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.parse = function(string) {
 | 
				
			||||||
 | 
					    if (ipaddr.IPv6.isValid(string)) {
 | 
				
			||||||
 | 
					      return ipaddr.IPv6.parse(string);
 | 
				
			||||||
 | 
					    } else if (ipaddr.IPv4.isValid(string)) {
 | 
				
			||||||
 | 
					      return ipaddr.IPv4.parse(string);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.parseCIDR = function(string) {
 | 
				
			||||||
 | 
					    var e;
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      return ipaddr.IPv6.parseCIDR(string);
 | 
				
			||||||
 | 
					    } catch (error1) {
 | 
				
			||||||
 | 
					      e = error1;
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        return ipaddr.IPv4.parseCIDR(string);
 | 
				
			||||||
 | 
					      } catch (error1) {
 | 
				
			||||||
 | 
					        e = error1;
 | 
				
			||||||
 | 
					        throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.fromByteArray = function(bytes) {
 | 
				
			||||||
 | 
					    var length;
 | 
				
			||||||
 | 
					    length = bytes.length;
 | 
				
			||||||
 | 
					    if (length === 4) {
 | 
				
			||||||
 | 
					      return new ipaddr.IPv4(bytes);
 | 
				
			||||||
 | 
					    } else if (length === 16) {
 | 
				
			||||||
 | 
					      return new ipaddr.IPv6(bytes);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ipaddr.process = function(string) {
 | 
				
			||||||
 | 
					    var addr;
 | 
				
			||||||
 | 
					    addr = this.parse(string);
 | 
				
			||||||
 | 
					    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
 | 
				
			||||||
 | 
					      return addr.toIPv4Address();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      return addr;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}).call(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					},{}]},{},[1]);
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
                    </label>
 | 
					                    </label>
 | 
				
			||||||
                </p>
 | 
					                </p>
 | 
				
			||||||
                <br />
 | 
					                <br />
 | 
				
			||||||
 | 
					                <p>
 | 
				
			||||||
 | 
					                    <label id="local_hosts_skipping" style="font-weight: bold;"></label><br />
 | 
				
			||||||
 | 
					                    <label class="switch">
 | 
				
			||||||
 | 
					                        <input type="checkbox" id="localHostsSkipping">
 | 
				
			||||||
 | 
					                        <span class="slider round"></span>
 | 
				
			||||||
 | 
					                    </label>
 | 
				
			||||||
 | 
					                </p>
 | 
				
			||||||
 | 
					                <br />
 | 
				
			||||||
                <p>
 | 
					                <p>
 | 
				
			||||||
                    <label id="history_listener_enabled" style="font-weight: bold;"></label><br />
 | 
					                    <label id="history_listener_enabled" style="font-weight: bold;"></label><br />
 | 
				
			||||||
                    <label class="switch">
 | 
					                    <label class="switch">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    "manifest_version": 2,
 | 
					    "manifest_version": 2,
 | 
				
			||||||
    "name": "ClearURLs",
 | 
					    "name": "ClearURLs",
 | 
				
			||||||
    "version": "1.7.4",
 | 
					    "version": "1.8.0",
 | 
				
			||||||
    "author": "Kevin R.",
 | 
					    "author": "Kevin R.",
 | 
				
			||||||
    "description": "Remove tracking elements from URLs.",
 | 
					    "description": "Remove tracking elements from URLs.",
 | 
				
			||||||
    "homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
 | 
					    "homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,8 @@
 | 
				
			||||||
            "clearurls.js",
 | 
					            "clearurls.js",
 | 
				
			||||||
            "core_js/pureCleaning.js",
 | 
					            "core_js/pureCleaning.js",
 | 
				
			||||||
            "core_js/context_menu.js",
 | 
					            "core_js/context_menu.js",
 | 
				
			||||||
            "core_js/historyListener.js"
 | 
					            "core_js/historyListener.js",
 | 
				
			||||||
 | 
					            "external_js/ip-range-check.js"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "content_scripts": [
 | 
					    "content_scripts": [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9473
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										9473
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -22,11 +22,12 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "twbs/bootstrap": "3.3.7",
 | 
					 | 
				
			||||||
    "jquery/jquery": "3.2.1",
 | 
					 | 
				
			||||||
    "orsozed/sha256.jquery.plugin": "1.0",
 | 
					 | 
				
			||||||
    "DataTables/DataTables": "1.10.16",
 | 
					    "DataTables/DataTables": "1.10.16",
 | 
				
			||||||
    "lauren/pick-a-color": "1.2.3"
 | 
					    "ip-range-check": "^0.2.0",
 | 
				
			||||||
 | 
					    "jquery/jquery": "3.2.1",
 | 
				
			||||||
 | 
					    "lauren/pick-a-color": "1.2.3",
 | 
				
			||||||
 | 
					    "orsozed/sha256.jquery.plugin": "1.0",
 | 
				
			||||||
 | 
					    "twbs/bootstrap": "3.3.7"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "bugs": {
 | 
					  "bugs": {
 | 
				
			||||||
    "web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new"
 | 
					    "web": "https://gitlab.com/KevinRoebert/ClearUrls/issues/new"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user