From fc9f89157097d5586e96d6e7371675eacb0000d0 Mon Sep 17 00:00:00 2001 From: Nihilazo Date: Fri, 13 Nov 2020 13:31:17 +0000 Subject: [PATCH] initial re-commit --- .gitignore | 8 + calcurse/.config/calcurse/conf | 32 + calcurse/.config/calcurse/keys | 55 + dunst/.config/dunst/battery.sh | 2 + dunst/.config/dunst/dunstrc | 346 + dunst/.config/dunst/music-change.sh | 29 + .../share/fonts/FantasqueSansMono-Bold.otf | Bin 0 -> 131948 bytes .../fonts/FantasqueSansMono-BoldItalic.otf | Bin 0 -> 141080 bytes .../share/fonts/FantasqueSansMono-Italic.otf | Bin 0 -> 138160 bytes .../share/fonts/FantasqueSansMono-Regular.otf | Bin 0 -> 133572 bytes i3/.config/i3/config | 211 + mako/.config/mako/config | 3 + mpd/.config/mpd/mpd.conf | 31 + ncmpcpp/.ncmpcpp/bindings | 560 ++ ncmpcpp/.ncmpcpp/config | 544 ++ nvim/.config/nvim/autoload/plug.vim | 2786 ++++++ nvim/.config/nvim/autoload/plug.vim.old | 2665 ++++++ nvim/.config/nvim/init.vim | 191 + picom/.config/picom.conf | 228 + qutebrowser/.config/qutebrowser/config.py | 10 + .../qutebrowser/greasemonkey/82915.user.js | 7802 +++++++++++++++++ .../greasemonkey/adsbypasser.full.es7.user.js | 5788 ++++++++++++ .../greasemonkey/betterttv.user.js | 22 + .../qutebrowser/greasemonkey/emuparadise.js | 16 + .../greasemonkey/ffz_injector.user.js | 58 + .../.local/share/qutebrowser/userscripts/mpv | 143 + ranger/.config/ranger/commands.py | 62 + ranger/.config/ranger/rc.conf | 656 ++ ranger/.config/ranger/rifle.conf | 228 + ranger/.config/ranger/scope.sh | 178 + rofi/.config/rofi/config.rasi | 5 + .../rofi/themes/base16-tomorrow-night.rasi | 143 + .../.local/share/rofi/themes/sidebar-mod.rasi | 113 + scripts/.local/bin/fragment-vimwiki-header | 5 + scripts/.local/bin/hide-osk | 3 + scripts/.local/bin/jack_setup | 2 + scripts/.local/bin/makedoc | 15 + scripts/.local/bin/mountmenu | 14 + scripts/.local/bin/newdoc | 18 + scripts/.local/bin/osk-status | 12 + scripts/.local/bin/osk-toggle | 10 + scripts/.local/bin/password-menu-wofi | 3 + scripts/.local/bin/pim | 4 + scripts/.local/bin/show-osk | 4 + scripts/.local/bin/unmountmenu | 14 + scripts/.local/bin/workspace-switcher | 19 + scripts/.local/bin/xdg-open | 20 + sike/.config/sike/config.toml | 78 + .../share/squeekboard/keyboards/us_wide.yaml | 108 + sway/.config/sway/config | 169 + termite/.config/termite/config | 99 + tmux/.tmux.conf | 3 + .../.config/waybar/base16-tomorrow-night.css | 23 + waybar/.config/waybar/config-bottom | 31 + waybar/.config/waybar/config-top | 113 + waybar/.config/waybar/style.css | 212 + wofi/.config/wofi/config | 3 + wofi/.config/wofi/style.css | 13 + x11/.xinitrc | 45 + zsh/.zshrc | 18 + 60 files changed, 23973 insertions(+) create mode 100644 .gitignore create mode 100644 calcurse/.config/calcurse/conf create mode 100644 calcurse/.config/calcurse/keys create mode 100644 dunst/.config/dunst/battery.sh create mode 100644 dunst/.config/dunst/dunstrc create mode 100755 dunst/.config/dunst/music-change.sh create mode 100644 fonts/.local/share/fonts/FantasqueSansMono-Bold.otf create mode 100644 fonts/.local/share/fonts/FantasqueSansMono-BoldItalic.otf create mode 100644 fonts/.local/share/fonts/FantasqueSansMono-Italic.otf create mode 100644 fonts/.local/share/fonts/FantasqueSansMono-Regular.otf create mode 100644 i3/.config/i3/config create mode 100644 mako/.config/mako/config create mode 100644 mpd/.config/mpd/mpd.conf create mode 100644 ncmpcpp/.ncmpcpp/bindings create mode 100644 ncmpcpp/.ncmpcpp/config create mode 100644 nvim/.config/nvim/autoload/plug.vim create mode 100644 nvim/.config/nvim/autoload/plug.vim.old create mode 100644 nvim/.config/nvim/init.vim create mode 100644 picom/.config/picom.conf create mode 100644 qutebrowser/.config/qutebrowser/config.py create mode 100644 qutebrowser/.local/share/qutebrowser/greasemonkey/82915.user.js create mode 100644 qutebrowser/.local/share/qutebrowser/greasemonkey/adsbypasser.full.es7.user.js create mode 100644 qutebrowser/.local/share/qutebrowser/greasemonkey/betterttv.user.js create mode 100644 qutebrowser/.local/share/qutebrowser/greasemonkey/emuparadise.js create mode 100644 qutebrowser/.local/share/qutebrowser/greasemonkey/ffz_injector.user.js create mode 100755 qutebrowser/.local/share/qutebrowser/userscripts/mpv create mode 100644 ranger/.config/ranger/commands.py create mode 100644 ranger/.config/ranger/rc.conf create mode 100644 ranger/.config/ranger/rifle.conf create mode 100755 ranger/.config/ranger/scope.sh create mode 100644 rofi/.config/rofi/config.rasi create mode 100644 rofi/.local/share/rofi/themes/base16-tomorrow-night.rasi create mode 100644 rofi/.local/share/rofi/themes/sidebar-mod.rasi create mode 100755 scripts/.local/bin/fragment-vimwiki-header create mode 100755 scripts/.local/bin/hide-osk create mode 100755 scripts/.local/bin/jack_setup create mode 100755 scripts/.local/bin/makedoc create mode 100755 scripts/.local/bin/mountmenu create mode 100755 scripts/.local/bin/newdoc create mode 100755 scripts/.local/bin/osk-status create mode 100755 scripts/.local/bin/osk-toggle create mode 100755 scripts/.local/bin/password-menu-wofi create mode 100755 scripts/.local/bin/pim create mode 100755 scripts/.local/bin/show-osk create mode 100755 scripts/.local/bin/unmountmenu create mode 100755 scripts/.local/bin/workspace-switcher create mode 100755 scripts/.local/bin/xdg-open create mode 100644 sike/.config/sike/config.toml create mode 100644 squeekboard/.local/share/squeekboard/keyboards/us_wide.yaml create mode 100644 sway/.config/sway/config create mode 100644 termite/.config/termite/config create mode 100644 tmux/.tmux.conf create mode 100755 waybar/.config/waybar/base16-tomorrow-night.css create mode 100644 waybar/.config/waybar/config-bottom create mode 100644 waybar/.config/waybar/config-top create mode 100644 waybar/.config/waybar/style.css create mode 100644 wofi/.config/wofi/config create mode 100644 wofi/.config/wofi/style.css create mode 100644 x11/.xinitrc create mode 100644 zsh/.zshrc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..90b7465 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +mpd/.config/mpd/database +mpd/.config/mpd/pid +mpd/.config/mpd/sticker.sql +mpd/.config/mpd/playlists +ncmpcpp/.ncmpcpp/error.log +nvim/.config/nvim/.netrwhist +nvim/.config/nvim/plugged +qutebrowser/.local/share/qutebrowser/greasemonkey/requires diff --git a/calcurse/.config/calcurse/conf b/calcurse/.config/calcurse/conf new file mode 100644 index 0000000..2635414 --- /dev/null +++ b/calcurse/.config/calcurse/conf @@ -0,0 +1,32 @@ +appearance.calendarview=monthly +appearance.compactpanels=no +appearance.defaultpanel=calendar +appearance.layout=1 +appearance.headerline=yes +appearance.eventseparator=yes +appearance.dayseparator=yes +appearance.emptyline=yes +appearance.emptyday=-- +appearance.notifybar=yes +appearance.sidebarwidth=0 +appearance.theme=magenta on default +appearance.todoview=hide-completed +appearance.headingpos=right-justified +daemon.enable=no +daemon.log=no +format.inputdate=1 +format.notifydate=%a %F +format.notifytime=%T +format.outputdate=%D +format.dayheading=%B %e, %Y +general.autogc=no +general.autosave=yes +general.confirmdelete=yes +general.confirmquit=yes +general.firstdayofweek=monday +general.multipledays=yes +general.periodicsave=0 +general.systemevents=yes +notification.command=printf '\a' +notification.notifyall=flagged-only +notification.warning=300 diff --git a/calcurse/.config/calcurse/keys b/calcurse/.config/calcurse/keys new file mode 100644 index 0000000..0f5ee8d --- /dev/null +++ b/calcurse/.config/calcurse/keys @@ -0,0 +1,55 @@ +# +# Calcurse keys configuration file +# +# In this file the keybindings used by Calcurse are defined. +# It is generated automatically by Calcurse and is maintained +# via the key configuration menu of the interactive user +# interface. It should not be edited directly. + +generic-cancel ESC +generic-select SPC +generic-credits @ +generic-help ? +generic-quit q Q +generic-save s S ^S +generic-reload R +generic-copy c +generic-paste p ^V +generic-change-view TAB +generic-import i I +generic-export x X +generic-goto g G +generic-other-cmd o O +generic-config-menu C +generic-redraw ^R +generic-add-appt ^A +generic-add-todo ^T +generic-prev-day T ^H +generic-next-day t ^L +generic-prev-week W ^K +generic-next-week w +generic-prev-month M +generic-next-month m +generic-prev-year Y +generic-next-year y +generic-scroll-down ^N +generic-scroll-up ^P +generic-goto-today ^G +generic-command : +move-right l L RGT +move-left h H LFT +move-down j J DWN +move-up k K UP +start-of-week 0 +end-of-week $ +add-item a A +del-item d D +edit-item e E +view-item v V RET +pipe-item | +flag-item ! +repeat r +edit-note n N +view-note > +raise-priority + +lower-priority - diff --git a/dunst/.config/dunst/battery.sh b/dunst/.config/dunst/battery.sh new file mode 100644 index 0000000..0190852 --- /dev/null +++ b/dunst/.config/dunst/battery.sh @@ -0,0 +1,2 @@ +#!/bin/bash +notify-send Battery "$(acpi)" diff --git a/dunst/.config/dunst/dunstrc b/dunst/.config/dunst/dunstrc new file mode 100644 index 0000000..01f5763 --- /dev/null +++ b/dunst/.config/dunst/dunstrc @@ -0,0 +1,346 @@ +[global] + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = keyboard + + # The geometry of the window: + # [{width}]x{height}[+/-{x}+/-{y}] + # The geometry of the message window. + # The height is measured in number of notifications everything else + # in pixels. If the width is omitted but the height is given + # ("-geometry x2"), the message window expands over the whole screen + # (dmenu-like). If width is 0, the window expands to the longest + # message displayed. A positive x is measured from the left, a + # negative from the right side of the screen. Y is measured from + # the top and down respectively. + # The width can be negative. In this case the actual width is the + # screen width minus the width defined in within the geometry option. + geometry = "300x5-30+20" + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = yes + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = no + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). + transparency = 10 + + # The height of the entire notification. If the height is smaller + # than the font height and padding combined, it will be raised + # to the font height and padding. + notification_height = 0 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 2 + + # Padding between text and separator. + padding = 8 + + # Horizontal padding. + horizontal_padding = 8 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 0 + + # Defines color of the frame around the notification window. + frame_color = "#aaaaaa" + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Sort messages by urgency. + sort = yes + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # Transient notifications ignore this setting. + idle_threshold = 120 + + ### Text ### + + font = FantasqueSansMono 10 + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = full + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = center + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = yes + + # When word_wrap is set to no, specify where to ellipsize long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Merge multiple notifications with the same content + stack_duplicates = true + + # Hide the count of merged notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + ### Icons ### + + # Align icons left/right/off + icon_position = off + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 32 + + # Paths to default icons. + icon_path = /usr/share/icons/Numix/16x16/status/:/usr/share/icons/Numix/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + #dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/qutebrowser + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst + title = Dunst + + # Define the class of the windows spawned by dunst + class = Dunst + + # Print a notification on startupNumix-circle + # This is mainly for error detection, since dbus (re-)starts dunst + # automatically after a crash. + startup_notification = false + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = false + +[shortcuts] + + # Shortcuts are specified as [modifier+][modifier+]...key + # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2", + # "mod3" and "mod4" (windows-key). + # Xev might be helpful to find names for keys. + + # Close notification. + close = mod4+n + + # Close all notifications. + close_all = mod4+shift+n + + # Redisplay last message(s). + # On the US keyboard layout "grave" is normally above TAB and left + # of "1". Make sure this key actually exists on your keyboard layout, + # e.g. check output of 'xmodmap -pke' + history = ctrl+grave + + # Context menu. + context = ctrl+shift+period + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#222222" + foreground = "#888888" + timeout = 10 + # Icon for notifications with low urgency, uncomment to enable + #icon = /path/to/icon + +[urgency_normal] + background = "#285577" + foreground = "#ffffff" + timeout = 10 + # Icon for notifications with normal urgency, uncomment to enable + #icon = /path/to/icon + +[urgency_critical] + background = "#900000" + foreground = "#ffffff" + frame_color = "#ff0000" + timeout = 0 + # Icon for notifications with critical urgency, uncomment to enable + #icon = /path/to/icon + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# Messages can be matched by "appname", "summary", "body", "icon", "category", +# "msg_urgency" and you can override the "timeout", "urgency", "foreground", +# "background", "new_icon" and "format". +# Shell-like globbing will get expanded. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: if you don't want a notification to be displayed, set the format +# to "". +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +#[alarms] +# summary = "Alarm" +# script = ~/.config/dunst/sound.sh + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# format = "" + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +# vim: ft=cfg +frame_color = "#c5c8c6" +separator_color = "#c5c8c6" + +[base16_low] + msg_urgency = low + background = "#282a2e" + foreground = "#969896" + +[base16_normal] + msg_urgency = normal + background = "#373b41" + foreground = "#c5c8c6" + +[base16_critical] + msg_urgency = critical + background = "#cc6666" + foreground = "#e0e0e0" diff --git a/dunst/.config/dunst/music-change.sh b/dunst/.config/dunst/music-change.sh new file mode 100755 index 0000000..a43a401 --- /dev/null +++ b/dunst/.config/dunst/music-change.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Script to display notifcation when song changes +# Requires: +# libnotify or dunstify +# mpd +# mpc + +app_name="MPD Status" +summary="Now Playing" + +if [[ "$MUSIC_NOTIFY" != "true" ]]; then + echo "Not sending notifications, MUSIC_NOTIFY isn't true" +elif command -v dunstify; then + while :; do + dunstify -a "${app_name}" \ + -t 4000 \ + -r 13596705 \ + "${summary}" \ + "$(mpc current --wait)" + done + else + while :; do + notify-send -t 4000 \ + -a "${app_name}" \ + "${summary}" \ + "$(mpc current --wait)" + done + fi diff --git a/fonts/.local/share/fonts/FantasqueSansMono-Bold.otf b/fonts/.local/share/fonts/FantasqueSansMono-Bold.otf new file mode 100644 index 0000000000000000000000000000000000000000..d095cebb9632bd008df14503ffd45d42a6fb714c GIT binary patch literal 131948 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 S_+5EtciH!JrAEi4uKy3~B@pWX literal 0 HcmV?d00001 diff --git a/fonts/.local/share/fonts/FantasqueSansMono-BoldItalic.otf b/fonts/.local/share/fonts/FantasqueSansMono-BoldItalic.otf new file mode 100644 index 0000000000000000000000000000000000000000..22d0a99d373aea694a65bfd7fff84c5644f9d1f0 GIT binary patch literal 141080 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�Hw8|rPfB*+mI8Wa_j8dNK&K~T$}cFd9_=V9Sr zBo1iH;rtOP*Hk;Hqt$#4Q8x*Hi|~ttzmvyM_aKMTpv0h7LBlvCXrl0^3V(+1b9juP zc|lu(P6gc!jtb7?kl+r&?=1W*;rHM%f_n!~4PFy`B>09aghO2M!cP`{y6|hV7>cWo ztCK6+wa~R)gdY+9ap9j7c*U;UA>kqQLPU-sLpVHSxbU+%UdZT>ypZi7XG0$F@CvH% z1w9qQIbMax3Joe`RTx*HK)^Q(f2;7f3%uPG&R2L48XYPm5Go`PDkKn^#qmOWgpLm_ z2;Cd{Esr1itMKm%|AD~!BP=E?Gpu)*ka^fb4i8%*`~r>_wlZvg*tcPSh9~my@Or|3 zQuvu1FT7cJ-|(s7Yr=(ngr61gi^Bg_;9aRmDkfHJS#dBAuQ*Ql!Uif%<#-imR9si_ zaK-DD92{OLTKKWTPvm%&QY*EpG`LbuC1G`y_6qnx;U5-w$1438;fSaaA?!G!H-|^` z7ye+57cneiPQ<2&6A`yW_@CU5l!cE13%ge$gClE3wu>AYnJdEA2p{!5t;HfY3A`TFiwKOI^rUeg==_>s0!tcfLV*18RjVX*d6mw04|0etr;g@o}YNT3XwHDO| zR-4JgtK|!Sx$p}G-nwdst6ht=$ENe}*ha!{D*P4<&mP+di5nA-iO`F}=VjlXcqQ@Aq}U`O!K6+cn$(rY zP3oRBHYqPjNHFP$fF2jnlSwy|)np;TEtC5vPfZpQOcu73%v&6L@}A`L z$-kut38n~*rtq5Io>C{JL(1?JA;FZDJmr)%Jmr)PDTh<8qzVb93M)?KR%}m=No|zc zJyl3Bbqo9xzu=Jet4e3IH>E{LX5_)psM6rEgJ8Aou?Ue0H zge!7mxry9VZX>q?G=$jD|2b_t1Bi`uAiC5CcPcJgiY3IR{Z#JT(Cc*}gi6L2gNE4! zylf0l3e+}jmQ-ke8u_q(G3{N`e9;RIfFs*0F)U6K>SYTKr`JYt7#7!}12_&lEmu62 z!|r7FG*`>L?Tbe^CWmndqm)qJ2APH8XO#iR;4obz9CQZ%!z*Y`6?5@N!rUx%lNEYAcQrYr){WS~;Ql zS~#)Ts{v?vWwZR+iRz?$PCT^^wH=cat4=s4i2*RIoFoCm!ihyEC4l}FC%&b}TPL9b zN|y*5%x77Si$tem6)qijxo1k|^j2#GPf;Ivq+i^FLc)ro&SVZu#L zssp<$op4TSSTF){@;6{uYI}=LXy2oJPRgUy#`y5nnKvgiHZ84>!8JMIbXs*%D*%R7 zC$)iL;ly?iA)I=L?ZTsbzkC=Cfpo&@C|f5c+|Wp>IQ0%2 zZ%=4EzkHZ9Wl-W<4opgI3|cmv$EKV#vE;z%w3ZY4W@XY4$hw{ahLscEzoV%+Y**p> zmUxj5lV%`JIGmRg%BL?UCfwwtIdU=S6ggPRNec@`AWohJhNpK*Q?TBDj*#*>DUZ^? zb(c3Mp1SK99p#kRR9dDb+rbDm3r^Gi@$@=l>PD%b(g<&aXQM@i3vA#(#DcQ zAf2?eVDL1oocx_};!VA`b)5#(S0_9b9x8($-x6(7N_FC2;!QY@P0LC90CakELir+i zv-OrH=hezdM_^cLVecB*_7$KKD-mVsBmwQXwQe#grJVTpyG%Icgti@oJO|e=2TKpK zvju~vcAPl+!N&SO)FzlgL`(#mJOE)g;P%YS#qFHW^aXK^tWKpFmv35=1<4~xK>VfAVgwmJ8X0e&$sUK<)mM^ zob*FVWpPS5p;Qwx2(BqBD<>RdZ~zRePW}OmvN?GlP|lTKK8yw~RV$^O4jN_yj=xS! zxTzC5AMTffrHvnE!AQW9uTEYf~i$Saq@sA)c|O!bkUJK340Z<343kN;&b@iIo#7T|!=gYvy3( zgky}dUv;C*J|;s}qqA8&{)J_2q=axpf8N#Dw$Ml#?+QIs}qw^cS zGB+u;F=*Lv9-Gqnx+RBjJeeh)b280>!Sk?kG94HePP}IvY`l%9@k~zQcs{I+r~FXq z`$B10Aj{)%DU?fskT)!`IfYys6pN6VaINL|3PQ@W6Mvd`s%6n+LOnF)Abpb~f0|}9 zn!GiBJOE8XA8b}g!t4;u-%OQ5IZbqisw^mtN#!ut5}Ss3bWLLttbw9si5SW($fJ_1U}eB@=OE&AiE?c_AQNolf-1V3Q(QB1#htRGKnGOHwb zsx*wgZCKKwRDeo_6T1;uO z)P*Mk&?I<)3@E+6+Tl=4GA`L$scJ6(b&GNSh zLJBN230w7|X&I%-GS2u7qlsdgyjX3#pN~Cx+jx0>UEcR3WQ8T|et5E$yOjvB+W312 zDX-^BVOB}-RJrc_X)>W6nhKG=$*(_6s~Jt+eb5gA&}5a9Z^`nOlYhB0p&lDwYoRFt zPgXgtV>EfcKVD}vQB0E;D@}cT9Lja)FDDb~k<&X!-%OiwZ>4DyLagr+zaoUk_KPR#0^c^6r^;#a?=zWD zPkXl+>6>Yby3ecJQH!?L1$>N*Vw&-Ud|Ch5UrroamYhteM^5zp&rI82PFopG-ft(z z5aKH*Ya3kl8V}m1DjVuqwNYfDNu=#1r)`ubOB;Ng(L^y#UPRl?+I5<;)rvWk%gLW6 z6Y8OfmU1&~f0}kOnw*Rd8rxyxy;CbqyvNViRrvRxeBTGG6q`_wJ?*y8>>S^!xBMrZ_y=XcBxV3(wlH;+>c%p2Gy1=&{H%ohNpmXgb7by2t3CP=}3b+qc|Nd!usVcIWhw6Nhp+Ie}x9q6y{k2|0|EOnyb$ zUNn6QxWi7Zo5%3j6U8*+^}!RRiTc#F=E|X*Cjapm6Y6PO=zF(c+Fmr#+Q|CWK2hXL zd+Wg%M;=JL_e-R+{Sx)qeu-wF6Mte?#D8-yy*yy_2+%|6rW| zux_q1Sw}XJtz;+JOAe7^T)JSS3 zwUXLNou%$lZ)u=3Ov;wVN)x4NQjRoV%ER7=LhK*ejJ+berTy3eaa=kjos}+0SEL`Y z58|#=BK?V-5W#Xdc0-G zGq(qG_b~Sga|@Weh`F1XTSQ&yFuPyE+>e<%nz^f)`zCYOGIuX?d7Auwz5RLQxPiHE zGIuR?r5OswG^8Tt{z_eW0fXi;m&Yn(_p9s%ps%p|Jy1x+!-w74d(V? z?n>tFXV9hW{upz=WG=`5irr6Q?tJEQ{LfgdVaz?l-1nIKDs$gqE|=1m?EXXMa-4na zelbh!D0AOqF6WU`n8QN0F_+Uhf!$AMZV%>ie4ZwU7AfhF#%u=thULO!#U%+FOeU!$ z4f}IykiTJ%&SRt&sZAay8JNv)K%T&UokrNP(*!$qT4B#lTk?0zgLT9lQ)kT1WRY&z zztaOdcwQtqcwg9vJvn!zWm2*9E$rVn@g7;lOLDs z%Z;##^eMR+Y_BD(uf6=7{Jh*vo+59Px623RkL6SHm$qWOX)0`w6k)rg_`WC?EPN{o zWqY9_NM)3=?znp68i;Ecu54UmaZSWE4Ob4X`MC0M72qnwwE@>=Tt&Ec~-Ph+l$~nZ~p>rZ~Fzf@7Ynu$+H!-Tk>2b0&cz%1$UW!1>B)ZB;5Dx6uOzk zt!c;HpR2HP(AG@Y7iY!rHBQrCS4_E{OVZ5Q`F)Y0|P4`@%qup)35Vt+uMb6+Ie zQ2!nVS+S(OyHFZNT4N<-M{w7JyyISr)uY?omto<1-JfF(U|V-FVDpg1X6#q{Cy8>O zagTHFlANfKBN2y?85sSEaDRvWYqv>jX*^2HMp7LuSRYbH`dDgCBBeN~g0#fFflQGG zkZaN?z$Nk$`_%^R=ID6C&xPDOdS8%eEnGc8O%K1TE+pl3LFyH7Jq@b2d0ofo zz58SA`Kt_>s*q|J^tjjO!v1Db)%yakZ696HkaHL`5Jpm%Uj@40S8e9cC*z^p&Da$f z2g%g&yV{}`{~Y!mZgYgdQ{iP?yBguIrH$rI2FO_D>;nH0t{-jOnES zznFx%kHW@BLDp@_3-0^avDp=SHakN$9|I$X#cGS^7|8A=q`w`OwH;+R#(fRF{oqsYao+=ed`YdhS*3`v`pq*e=k02UJ9Y z>MXJgm^IuN-M3M5TyUQ!FT1}77iZkp+!r9%c4QLv+4dwo+;6)Nva;|rWHAG^OIuhW zO1t}WSV}rLu0!5OZ5smYMDm*ZclUShA6V%cg^)?m7Rs0VGW2~1Tt7|fAXWt0%^0*h zQ$R~?)HY*4T^;ruhm?n+c5VaC+mUXd{cTWx5VCk0S32tRr=jm2NGsBP2fwTCtFW$E zsz31aIr5@;4h2_d$P4(bg{>?_D;AIXsyk`Su1uOLR`*wjJoX`_8uWt3--mQ&pg!}I zb!x-)z{zm5D7YTc66`)i>18x?i>poffaHF67sK+zMN@=^av{}3$oCRv1hZ(4w3NAj zbC-f9TKl!Y<#c}qJsn4{bA=Qo9g%{_UH5;aDD2YB!2aFIQU%!2X;|i6@(XO>6WC%k z_XDZDlu0g2GUT@!eP9=Cq7p2rBI>JO-9IA5>O@98SlxZy{TA$pjnCU&2PL=Mx1>YT zLSG+Y2<71d7Vw$kc;ivr|F0jXOR5IHnpBOaTGqXPp3)~YOgaP$yoev=59de#?vl`s9br_3b6Ht{Xq-%SzRf yD80Bevn1-_=--b$2rpUka7jsh`nz|e^n=nD*nI=)@_XZJq_9D9xv$VV?SBDmMy~n* literal 0 HcmV?d00001 diff --git a/fonts/.local/share/fonts/FantasqueSansMono-Italic.otf b/fonts/.local/share/fonts/FantasqueSansMono-Italic.otf new file mode 100644 index 0000000000000000000000000000000000000000..630434858d4338e051ee57815743d46a889a3a1a GIT binary patch literal 138160 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 WxiYvO&qukg_!a-aPH!N_5c)6soXem9 literal 0 HcmV?d00001 diff --git a/fonts/.local/share/fonts/FantasqueSansMono-Regular.otf b/fonts/.local/share/fonts/FantasqueSansMono-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..b6be6c9981a996d66b647b9aa8dfc4879a29729f GIT binary patch literal 133572 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 BBKQCR literal 0 HcmV?d00001 diff --git a/i3/.config/i3/config b/i3/.config/i3/config new file mode 100644 index 0000000..0ef9c0f --- /dev/null +++ b/i3/.config/i3/config @@ -0,0 +1,211 @@ +# This file has been auto-generated by i3-config-wizard(1). +# It will not be overwritten, so edit it as you like. +# +# Should you change your keyboard layout some time, delete +# this file and re-run i3-config-wizard(1). +# + +# i3 config file (v4) +# +# Please see http://i3wm.org/docs/userguide.html for a complete reference! + +set $mod Mod4 +font pango:monospace 8 +floating_modifier $mod + +# start a terminal +bindsym $mod+Return exec termite +bindsym $mod+o exec i3lock -f -c 000000 + +# kill focused window +bindsym $mod+Shift+q kill + +#gaps and borders, window headers: +gaps inner 5 +gaps outer 5 +smart_borders on +new_window 1pixel + +focus_follows_mouse off +# startup programs +exec --no-startup-id dunst +exec --no-startup-id nm-applet +exec --no-startup-id redshift-gtk +exec --no-startup-id unclutter +exec --no-startup-id ~/.fehbg +exec --no-startup-id picom +exec --no-startup-id mpd +exec --no-startup-id ~/.config/dunst/music-change.sh + +#Screenshotting +bindsym Print exec --no-startup-id maim -s /tmp/$(date -Iseconds).png + +# Application menu +bindsym $mod+d exec --no-startup-id rofi -show run +bindsym XF86Search exec --no-startup-id rofi -show run +# And easy access to password management +bindsym $mod+p exec --no-startup-id gopass ls --flat | rofi -dmenu | xargs --no-run-if-empty gopass show -c +# ...And mounting menus +bindsym $mod+m exec --no-startup-id mountmenu +bindsym $mod+shift+m exec --no-startup-id unmountmenu +# notifcations +bindsym $mod+b exec --no-startup-id notify-send Battery "$(acpi)" +# Media Keys +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle +bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle +# focus shortcuts +bindsym $mod+h focus left +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right + +# alternatively, you can use the cursor keys: +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+h move left +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right + +# alternatively, you can use the cursor keys: +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# split in horizontal orientation +bindsym $mod+bar split h + +# split in vertical orientation +bindsym $mod+minus split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+space focus mode_toggle + +# focus the parent container +bindsym $mod+a focus parent + +# focus the child container +#bindsym $mod+d focus child + +# Make PD GEM windows not glitch out and be stupid +for_window [title="GEM"] floating enable + +# Same with SDVX +for_window [title="SOUND VOLTEX IV HEAVENLY HAVEN 1"] fullscreen enable +# Make the currently focused window a scratchpad +bindsym $mod+Shift+grave move scratchpad + +# Show the first scratchpad window +bindsym $mod+grave scratchpad show + +# start scratchpad applications +for_window [instance="music"] floating enable +for_window [instance="music"] move scratchpad +for_window [instance="music"] border none +exec termite --name=music -e ncmpcpp + +for_window [instance="wiki"] floating enable +for_window [instance="wiki"] move scratchpad +for_window [instance="wiki"] border none +exec termite --name=wiki -e "pim" + + +for_window [instance="files"] floating enable +for_window [instance="files"] move scratchpad +for_window [instance="files"] border none +exec termite --name=files -e ranger + +for_window [instance="feeds"] floating enable +for_window [instance="feeds"] move scratchpad +for_window [instance="feeds"] border none +exec termite --name=feeds -e newsboat + + +# application specific scratchpad shortcuts +bindsym $mod+c [instance="music"] scratchpad show +bindsym $mod+x [instance="wiki"] scratchpad show +bindsym $mod+z [instance="files"] scratchpad show +bindsym $mod+v [instance="feeds"] scratchpad show +# switch to workspace +bindsym $mod+1 workspace 1 +bindsym $mod+2 workspace 2 +bindsym $mod+3 workspace 3 +bindsym $mod+4 workspace 4 +bindsym $mod+5 workspace 5 +bindsym $mod+6 workspace 6 +bindsym $mod+7 workspace 7 +bindsym $mod+8 workspace 8 +bindsym $mod+9 workspace 9 +bindsym $mod+0 workspace 10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace 1 +bindsym $mod+Shift+2 move container to workspace 2 +bindsym $mod+Shift+3 move container to workspace 3 +bindsym $mod+Shift+4 move container to workspace 4 +bindsym $mod+Shift+5 move container to workspace 5 +bindsym $mod+Shift+6 move container to workspace 6 +bindsym $mod+Shift+7 move container to workspace 7 +bindsym $mod+Shift+8 move container to workspace 8 +bindsym $mod+Shift+9 move container to workspace 9 +bindsym $mod+Shift+0 move container to workspace 10 + +# reload the configuration file +bindsym $mod+Shift+c reload +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart +# exit i3 (logs you out of your X session) +bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'" + +# resize window (you can also use the mouse for that) +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # Pressing left will shrink the window’s width. + # Pressing right will grow the window’s width. + # Pressing up will shrink the window’s height. + # Pressing down will grow the window’s height. + bindsym h resize shrink width 10 px or 10 ppt + bindsym j resize grow height 10 px or 10 ppt + bindsym k resize shrink height 10 px or 10 ppt + bindsym l resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape + bindsym Return mode "default" + bindsym Escape mode "default" +} + +bindsym $mod+r mode "resize" + +bar { + i3bar_command i3bar -t + mode hide + colors { + background #00000000 + } +} + diff --git a/mako/.config/mako/config b/mako/.config/mako/config new file mode 100644 index 0000000..c1c3eba --- /dev/null +++ b/mako/.config/mako/config @@ -0,0 +1,3 @@ +font=Fantasque Sans Mono 14 +background-color=#1d1f21 +border-size=0 diff --git a/mpd/.config/mpd/mpd.conf b/mpd/.config/mpd/mpd.conf new file mode 100644 index 0000000..4cd841b --- /dev/null +++ b/mpd/.config/mpd/mpd.conf @@ -0,0 +1,31 @@ +# Recommended location for database +db_file "~/.config/mpd/database" + +# Logs to systemd journal +log_file "syslog" + +# The music directory is by default the XDG directory, uncomment to amend and choose a different directory +music_directory "~/Music/library" + +# Uncomment to refresh the database whenever files in the music_directory are changed +auto_update "yes" + +replaygain "auto" +restore_paused "yes" +# Uncomment to enable the functionalities +playlist_directory "~/.config/mpd/playlists" +pid_file "~/.config/mpd/pid" +state_file "~/.config/mpd/state" +sticker_file "~/.config/mpd/sticker.sql" + +audio_output { +type "fifo" +name "toggle_visualizer" +path "/tmp/mpd.fifo" +format "44100:16:2" +} + +audio_output { + type "pulse" + name "pulse audio" +} diff --git a/ncmpcpp/.ncmpcpp/bindings b/ncmpcpp/.ncmpcpp/bindings new file mode 100644 index 0000000..0ad5907 --- /dev/null +++ b/ncmpcpp/.ncmpcpp/bindings @@ -0,0 +1,560 @@ +############################################################## +## This is the example bindings file. Copy it to ## +## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ## +## and set up your preferences ## +############################################################## +## +##### General rules ##### +## +## 1) Because each action has runtime checks whether it's +## ok to run it, a few actions can be bound to one key. +## Actions will be bound in order given in configuration +## file. When a key is pressed, first action in order +## will test itself whether it's possible to run it. If +## test succeeds, action is executed and other actions +## bound to this key are ignored. If it doesn't, next +## action in order tests itself etc. +## +## 2) It's possible to bind more that one action at once +## to a key. It can be done using the following syntax: +## +## def_key "key" +## action1 +## action2 +## ... +## +## This creates a chain of actions. When such chain is +## executed, each action in chain is run until the end of +## chain is reached or one of its actions fails to execute +## due to its requirements not being met. If multiple actions +## and/or chains are bound to the same key, they will be +## consecutively run until one of them gets fully executed. +## +## 3) When ncmpcpp starts, bindings configuration file is +## parsed and then ncmpcpp provides "missing pieces" +## of default keybindings. If you want to disable some +## bindings, there is a special action called 'dummy' +## for that purpose. Eg. if you want to disable ability +## to crop playlists, you need to put the following +## into configuration file: +## +## def_key "C" +## dummy +## +## After that ncmpcpp will not bind any default action +## to this key. +## +## 4) To let you write simple macros, the following special +## actions are provided: +## +## - push_character "character" - pushes given special +## character into input queue, so it will be immediately +## picked by ncmpcpp upon next call to readKey function. +## Accepted values: mouse, up, down, page_up, page_down, +## home, end, space, enter, insert, delete, left, right, +## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\, +## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace. +## In addition, most of these names can be prefixed with +## alt-/ctrl-/shift- to be recognized with the appropriate +## modifier key(s). +## +## - push_characters "string" - pushes given string into +## input queue. +## +## - require_runnable "action" - checks whether given action +## is runnable and fails if it isn't. This is especially +## useful when mixed with previous two functions. Consider +## the following macro definition: +## +## def_key "key" +## push_characters "custom_filter" +## apply_filter +## +## If apply_filter can't be currently run, we end up with +## sequence of characters in input queue which will be +## treated just as we typed them. This may lead to unexpected +## results (in this case 'c' will most likely clear current +## playlist, 'u' will trigger database update, 's' will stop +## playback etc.). To prevent such thing from happening, we +## need to change above definition to this one: +## +## def_key "key" +## require_runnable "apply_filter" +## push_characters "custom_filter" +## apply_filter +## +## Here, first we test whether apply_filter can be actually run +## before we stuff characters into input queue, so if condition +## is not met, whole chain is aborted and we're fine. +## +## - require_screen "screen" - checks whether given screen is +## currently active. accepted values: browser, clock, help, +## media_library, outputs, playlist, playlist_editor, +## search_engine, tag_editor, visualizer, last_fm, lyrics, +## selected_items_adder, server_info, song_info, +## sort_playlist_dialog, tiny_tag_editor. +## +## - run_external_command "command" - runs given command using +## system() function. +## +## 5) In addition to binding to a key, you can also bind actions +## or chains of actions to a command. If it comes to commands, +## syntax is very similar to defining keys. Here goes example +## definition of a command: +## +## def_command "quit" [deferred] +## stop +## quit +## +## If you execute the above command (which can be done by +## invoking action execute_command, typing 'quit' and pressing +## enter), ncmpcpp will stop the player and then quit. Note the +## presence of word 'deferred' enclosed in square brackets. It +## tells ncmpcpp to wait for confirmation (ie. pressing enter) +## after you typed quit. Instead of 'deferred', 'immediate' +## could be used. Then ncmpcpp will not wait for confirmation +## (enter) and will execute the command the moment it sees it. +## +## Note: while command chains are executed, internal environment +## update (which includes current window refresh and mpd status +## update) is not performed for performance reasons. However, it +## may be desirable to do so in some situration. Therefore it's +## possible to invoke by hand by performing 'update enviroment' +## action. +## +## Note: There is a difference between: +## +## def_key "key" +## action1 +## +## def_key "key" +## action2 +## +## and +## +## def_key "key" +## action1 +## action2 +## +## First one binds two single actions to the same key whilst +## second one defines a chain of actions. The behavior of +## these two is different and is described in (1) and (2). +## +## Note: Function def_key accepts non-ascii characters. +## +##### List of unbound actions ##### +## +## The following actions are not bound to any key/command: +## +## - set_volume +## +# +#def_key "mouse" +# mouse_event +# +#def_key "up" +# scroll_up +# +#def_key "shift-up" +# select_item +# scroll_up +# +#def_key "down" +# scroll_down +# +#def_key "shift-down" +# select_item +# scroll_down +# +#def_key "[" +# scroll_up_album +# +#def_key "]" +# scroll_down_album +# +#def_key "{" +# scroll_up_artist +# +#def_key "}" +# scroll_down_artist +# +#def_key "page_up" +# page_up +# +#def_key "page_down" +# page_down +# +#def_key "home" +# move_home +# +#def_key "end" +# move_end +# +#def_key "insert" +# select_item +# +#def_key "enter" +# enter_directory +# +#def_key "enter" +# toggle_output +# +#def_key "enter" +# run_action +# +#def_key "enter" +# play_item +# +#def_key "space" +# add_item_to_playlist +# +#def_key "space" +# toggle_lyrics_update_on_song_change +# +#def_key "space" +# toggle_visualization_type +# +#def_key "delete" +# delete_playlist_items +# +#def_key "delete" +# delete_browser_items +# +#def_key "delete" +# delete_stored_playlist +# +#def_key "right" +# next_column +# +#def_key "right" +# slave_screen +# +#def_key "right" +# volume_up +# +#def_key "+" +# volume_up +# +#def_key "left" +# previous_column +# +#def_key "left" +# master_screen +# +#def_key "left" +# volume_down +# +#def_key "-" +# volume_down +# +#def_key ":" +# execute_command +# +#def_key "tab" +# next_screen +# +#def_key "shift-tab" +# previous_screen +# +#def_key "f1" +# show_help +# +#def_key "1" +# show_playlist +# +#def_key "2" +# show_browser +# +#def_key "2" +# change_browse_mode +# +#def_key "3" +# show_search_engine +# +#def_key "3" +# reset_search_engine +# +#def_key "4" +# show_media_library +# +#def_key "4" +# toggle_media_library_columns_mode +# +#def_key "5" +# show_playlist_editor +# +#def_key "6" +# show_tag_editor +# +#def_key "7" +# show_outputs +# +#def_key "8" +# show_visualizer +# +#def_key "=" +# show_clock +# +#def_key "@" +# show_server_info +# +#def_key "s" +# stop +# +#def_key "p" +# pause +# +#def_key ">" +# next +# +#def_key "<" +# previous +# +#def_key "ctrl-h" +# jump_to_parent_directory +# +#def_key "ctrl-h" +# replay_song +# +#def_key "backspace" +# jump_to_parent_directory +# +#def_key "backspace" +# replay_song +# +#def_key "f" +# seek_forward +# +#def_key "b" +# seek_backward +# +#def_key "r" +# toggle_repeat +# +#def_key "z" +# toggle_random +# +#def_key "y" +# save_tag_changes +# +#def_key "y" +# start_searching +# +#def_key "y" +# toggle_single +# +#def_key "R" +# toggle_consume +# +#def_key "Y" +# toggle_replay_gain_mode +# +#def_key "T" +# toggle_add_mode +# +#def_key "|" +# toggle_mouse +# +#def_key "#" +# toggle_bitrate_visibility +# +#def_key "Z" +# shuffle +# +#def_key "x" +# toggle_crossfade +# +#def_key "X" +# set_crossfade +# +#def_key "u" +# update_database +# +#def_key "ctrl-s" +# sort_playlist +# +#def_key "ctrl-s" +# toggle_browser_sort_mode +# +#def_key "ctrl-s" +# toggle_media_library_sort_mode +# +#def_key "ctrl-r" +# reverse_playlist +# +#def_key "ctrl-f" +# apply_filter +# +#def_key "ctrl-_" +# select_found_items +# +#def_key "/" +# find +# +#def_key "/" +# find_item_forward +# +#def_key "?" +# find +# +#def_key "?" +# find_item_backward +# +#def_key "." +# next_found_item +# +#def_key "," +# previous_found_item +# +#def_key "w" +# toggle_find_mode +# +#def_key "e" +# edit_song +# +#def_key "e" +# edit_library_tag +# +#def_key "e" +# edit_library_album +# +#def_key "e" +# edit_directory_name +# +#def_key "e" +# edit_playlist_name +# +#def_key "e" +# edit_lyrics +# +#def_key "i" +# show_song_info +# +#def_key "I" +# show_artist_info +# +#def_key "g" +# jump_to_position_in_song +# +#def_key "l" +# show_lyrics +# +#def_key "ctrl-v" +# select_range +# +#def_key "v" +# reverse_selection +# +#def_key "V" +# remove_selection +# +#def_key "B" +# select_album +# +#def_key "a" +# add_selected_items +# +#def_key "c" +# clear_playlist +# +#def_key "c" +# clear_main_playlist +# +#def_key "C" +# crop_playlist +# +#def_key "C" +# crop_main_playlist +# +#def_key "m" +# move_sort_order_up +# +#def_key "m" +# move_selected_items_up +# +#def_key "n" +# move_sort_order_down +# +#def_key "n" +# move_selected_items_down +# +#def_key "M" +# move_selected_items_to +# +#def_key "A" +# add +# +#def_key "S" +# save_playlist +# +#def_key "o" +# jump_to_playing_song +# +#def_key "G" +# jump_to_browser +# +#def_key "G" +# jump_to_playlist_editor +# +#def_key "~" +# jump_to_media_library +# +#def_key "E" +# jump_to_tag_editor +# +#def_key "U" +# toggle_playing_song_centering +# +#def_key "P" +# toggle_display_mode +# +#def_key "\\" +# toggle_interface +# +#def_key "!" +# toggle_separators_between_albums +# +#def_key "L" +# toggle_lyrics_fetcher +# +#def_key "F" +# fetch_lyrics_in_background +# +#def_key "alt-l" +# toggle_fetching_lyrics_in_background +# +#def_key "ctrl-l" +# toggle_screen_lock +# +#def_key "`" +# toggle_library_tag_type +# +#def_key "`" +# refetch_lyrics +# +#def_key "`" +# add_random_items +# +#def_key "ctrl-p" +# set_selected_items_priority +# +#def_key "q" +# quit +# +#def_key "f" +# find +#def_key "f" +# find_item_forward +def_key "j" + scroll_down +def_key "k" + scroll_up +def_key "h" + previous_column +def_key "l" + next_column +def_key "n" + next_found_item +def_key "N" + previous_found_item + diff --git a/ncmpcpp/.ncmpcpp/config b/ncmpcpp/.ncmpcpp/config new file mode 100644 index 0000000..30433e5 --- /dev/null +++ b/ncmpcpp/.ncmpcpp/config @@ -0,0 +1,544 @@ +############################################################################## +## This is the example configuration file. Copy it to $HOME/.ncmpcpp/config ## +## or $XDG_CONFIG_HOME/ncmpcpp/config and set up your preferences. ## +############################################################################## +# +##### directories ###### +## +## Directory for storing ncmpcpp related files. Changing it is useful if you +## want to store everything somewhere else and provide command line setting for +## alternative location to config file which defines that while launching +## ncmpcpp. +## +# +#ncmpcpp_directory = ~/.ncmpcpp +# +## +## Directory for storing downloaded lyrics. It defaults to ~/.lyrics since other +## MPD clients (eg. ncmpc) also use that location. +## +# +#lyrics_directory = ~/.lyrics +# +##### connection settings ##### +# +#mpd_host = localhost +# +#mpd_port = 6600 +# +#mpd_connection_timeout = 5 +# +## Needed for tag editor and file operations to work. +## +mpd_music_dir = ~/Music/library +# +#mpd_crossfade_time = 5 +# +##### music visualizer ##### +## +## Note: In order to make music visualizer work you'll need to use mpd fifo +## output, whose format parameter has to be set to 44100:16:1 for mono +## visualization or 44100:16:2 for stereo visualization. Example configuration +## (it has to be put into mpd.conf): +## +## audio_output { +## type "fifo" +## name "Visualizer feed" +## path "/tmp/mpd.fifo" +## format "44100:16:2" +## } +## +# +#visualizer_fifo_path = /tmp/mpd.fifo +# +## +## Note: Below parameter is needed for ncmpcpp to determine which output +## provides data for visualizer and thus allow syncing between visualization and +## sound as currently there are some problems with it. +## +# +#visualizer_output_name = Visualizer feed +# +## +## If you set format to 44100:16:2, make it 'yes'. +## +visualizer_in_stereo = yes +# +## +## Note: Below parameter defines how often ncmpcpp has to "synchronize" +## visualizer and audio outputs. 30 seconds is optimal value, but if you +## experience synchronization problems, set it to lower value. Keep in mind +## that sane values start with >=10. +## +# +#visualizer_sync_interval = 30 +# +## +## Note: To enable spectrum frequency visualization you need to compile ncmpcpp +## with fftw3 support. +## +# +## Available values: spectrum, wave, wave_filled, ellipse. +## +#visualizer_type = wave +# +#visualizer_look = ●▮ +# +#visualizer_color = blue, cyan, green, yellow, magenta, red +# +## Alternative subset of 256 colors for terminals that support it. +## +#visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161 +# +##### system encoding ##### +## +## ncmpcpp should detect your charset encoding but if it failed to do so, you +## can specify charset encoding you are using here. +## +## Note: You can see whether your ncmpcpp build supports charset detection by +## checking output of `ncmpcpp --version`. +## +## Note: Since MPD uses UTF-8 by default, setting this option makes sense only +## if your encoding is different. +## +# +#system_encoding = "" +# +##### delays ##### +# +## Time of inactivity (in seconds) after playlist highlighting will be disabled +## (0 = always on). +## +#playlist_disable_highlight_delay = 5 +# +## Defines how long messages are supposed to be visible. +## +#message_delay_time = 5 +# +##### song format ##### +## +## For a song format you can use: +## +## %l - length +## %f - filename +## %D - directory +## %a - artist +## %A - album artist +## %t - title +## %b - album +## %y - date +## %n - track number (01/12 -> 01) +## %N - full track info (01/12 -> 01/12) +## %g - genre +## %c - composer +## %p - performer +## %d - disc +## %C - comment +## %P - priority +## $R - begin right alignment +## +## If you want to make sure that a part of the format is displayed only when +## certain tags are present, you can archieve it by grouping them with brackets, +## e.g. '{%a - %t}' will be evaluated to 'ARTIST - TITLE' if both tags are +## present or '' otherwise. It is also possible to define a list of +## alternatives by providing several groups and separating them with '|', +## e.g. '{%t}|{%f}' will be evaluated to 'TITLE' or 'FILENAME' if the former is +## not present. +## +## Note: If you want to set limit on maximal length of a tag, just put the +## appropriate number between % and character that defines tag type, e.g. to +## make album take max. 20 terminal cells, use '%20b'. +## +## In addition, formats support markers used for text attributes. They are +## followed by character '$'. After that you can put: +## +## - 0 - default window color (discards all other colors) +## - 1 - black +## - 2 - red +## - 3 - green +## - 4 - yellow +## - 5 - blue +## - 6 - magenta +## - 7 - cyan +## - 8 - white +## - 9 - end of current color +## - b - bold text +## - u - underline text +## - r - reverse colors +## - a - use alternative character set +## +## If you don't want to use a non-color attribute anymore, just put it again, +## but this time insert character '/' between '$' and attribute character, +## e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag or filename with +## reversed colors. +## +## If you want to use 256 colors and/or background colors in formats (the naming +## scheme is described below in section about color definitions), it can be done +## with the syntax $(COLOR), e.g. to set the artist tag to one of the +## non-standard colors and make it have yellow background, you need to write +## $(197_yellow)%a$(end). Note that for standard colors this is interchangable +## with attributes listed above. +## +## Note: colors can be nested. +## +# +#song_list_format = {%a - }{%t}|{$8%f$9}$R{$3(%l)$9} +# +#song_status_format = {{%a{ "%b"{ (%y)}} - }{%t}}|{%f} +# +#song_library_format = {%n - }{%t}|{%f} +# +#alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b +# +#alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D} +# +#current_item_prefix = $(yellow)$r +# +#current_item_suffix = $/r$(end) +# +#current_item_inactive_column_prefix = $(white)$r +# +#current_item_inactive_column_suffix = $/r$(end) +# +#now_playing_prefix = $b +# +#now_playing_suffix = $/b +# +#browser_playlist_prefix = "$2playlist$9 " +# +#selected_item_prefix = $6 +# +#selected_item_suffix = $9 +# +#modified_item_prefix = $3> $9 +# +## +## Note: attributes are not supported for the following variables. +## +#song_window_title_format = {%a - }{%t}|{%f} +## +## Note: Below variables are used for sorting songs in browser. The sort mode +## determines how songs are sorted, and can be used in combination with a sort +## format to specify a custom sorting format. Available values for +## browser_sort_mode are "name", "mtime", "format" and "noop". +## +# +#browser_sort_mode = name +# +#browser_sort_format = {%a - }{%t}|{%f} {(%l)} +# +##### columns settings ##### +## +## syntax of song columns list format is "column column etc." +## +## - syntax for each column is: +## +## (width of the column)[color of the column]{displayed tag} +## +## Note: Width is by default in %, if you want a column to have fixed size, add +## 'f' after the value, e.g. (10)[white]{a} will be the column that take 10% of +## screen (so the real width will depend on actual screen size), whereas +## (10f)[white]{a} will take 10 terminal cells, no matter how wide the screen +## is. +## +## - color is optional (if you want the default one, leave the field empty). +## +## Note: You can give a column additional attributes by putting appropriate +## character after displayed tag character. Available attributes are: +## +## - r - column will be right aligned +## - E - if tag is empty, empty tag marker won't be displayed +## +## You can also: +## +## - give a column custom name by putting it after attributes, separated with +## character ':', e.g. {lr:Length} gives you right aligned column of lengths +## named "Length". +## +## - define sequence of tags, that have to be displayed in case predecessor is +## empty in a way similar to the one in classic song format, i.e. using '|' +## character, e.g. {a|c|p:Owner} creates column named "Owner" that tries to +## display artist tag and then composer and performer if previous ones are not +## available. +## +# +#song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l} +# +##### various settings ##### +# +## +## Note: Custom command that will be executed each time song changes. Useful for +## notifications etc. +## +#execute_on_song_change = "" +# +## +## Note: Custom command that will be executed each time player state +## changes. The environment variable MPD_PLAYER_STATE is set to the current +## state (either unknown, play, pause, or stop) for its duration. +## +# +#execute_on_player_state_change = "" +# +#playlist_show_mpd_host = no +# +#playlist_show_remaining_time = no +# +#playlist_shorten_total_times = no +# +#playlist_separate_albums = no +# +## +## Note: Possible display modes: classic, columns. +## +#playlist_display_mode = columns +# +#browser_display_mode = classic +# +#search_engine_display_mode = classic +# +#playlist_editor_display_mode = classic +# +#discard_colors_if_item_is_selected = yes +# +#show_duplicate_tags = yes +# +#incremental_seeking = yes +# +#seek_time = 1 +# +#volume_change_step = 2 +# +#autocenter_mode = no +# +#centered_cursor = no +# +## +## Note: You can specify third character which will be used to build 'empty' +## part of progressbar. +## +#progressbar_look = => +# +## Available values: database, playlist. +## +#default_place_to_search_in = database +# +## Available values: classic, alternative. +## +user_interface = alternative +# +#data_fetching_delay = yes +# +## Available values: artist, album_artist, date, genre, composer, performer. +## +media_library_primary_tag = album_artist +# +#media_library_albums_split_by_date = yes +# +## Available values: wrapped, normal. +## +#default_find_mode = wrapped +# +#default_tag_editor_pattern = %n - %t +# +#header_visibility = yes +# +#statusbar_visibility = yes +# +#titles_visibility = yes +# +#header_text_scrolling = yes +# +#cyclic_scrolling = no +# +#lines_scrolled = 2 +# +#lyrics_fetchers = lyricwiki, azlyrics, genius, sing365, lyricsmania, metrolyrics, justsomelyrics, jahlyrics, plyrics, tekstowo, internet +# +#follow_now_playing_lyrics = no +# +#fetch_lyrics_for_current_song_in_background = no +# +#store_lyrics_in_song_dir = no +# +#generate_win32_compatible_filenames = yes +# +#allow_for_physical_item_deletion = no +# +## +## Note: If you set this variable, ncmpcpp will try to get info from last.fm in +## language you set and if it fails, it will fall back to english. Otherwise it +## will use english the first time. +## +## Note: Language has to be expressed as an ISO 639 alpha-2 code. +## +#lastfm_preferred_language = en +# +#space_add_mode = add_remove +# +#show_hidden_files_in_local_browser = no +# +## +## How shall screen switcher work? +## +## - "previous" - switch between the current and previous screen. +## - "screen1,...,screenN" - switch between given sequence of screens. +## +## Screens available for use: help, playlist, browser, search_engine, +## media_library, playlist_editor, tag_editor, outputs, visualizer, clock, +## lyrics, last_fm. +## +#screen_switcher_mode = playlist, browser +# +## +## Note: You can define startup screen by choosing screen from the list above. +## +#startup_screen = playlist +# +## +## Note: You can define startup slave screen by choosing screen from the list +## above or an empty value for no slave screen. +## +#startup_slave_screen = "" +# +#startup_slave_screen_focus = no +# +## +## Default width of locked screen (in %). Acceptable values are from 20 to 80. +## +# +#locked_screen_width_part = 50 +# +#ask_for_locked_screen_width_part = yes +# +#jump_to_now_playing_song_at_start = yes +# +#ask_before_clearing_playlists = yes +# +#clock_display_seconds = no +# +#display_volume_level = yes +# +#display_bitrate = no +# +#display_remaining_time = no +# +## Available values: none, basic, extended, perl. +## +#regular_expressions = perl +# +## +## Note: if below is enabled, ncmpcpp will ignore leading "The" word while +## sorting items in browser, tags in media library, etc. +## +#ignore_leading_the = no +# +## +## Note: if below is enabled, ncmpcpp will ignore diacritics while searching and +## filtering lists. This takes an effect only if boost was compiled with ICU +## support. +## +#ignore_diacritics = no +# +#block_search_constraints_change_if_items_found = yes +# +#mouse_support = yes +# +#mouse_list_scroll_whole_page = yes +# +#empty_tag_marker = +# +#tags_separator = " | " +# +#tag_editor_extended_numeration = no +# +#media_library_sort_by_mtime = no +# +#enable_window_title = yes +# +## +## Note: You can choose default search mode for search engine. Available modes +## are: +## +## - 1 - use mpd built-in searching (no regexes, pattern matching) +## +## - 2 - use ncmpcpp searching (pattern matching with support for regexes, but +## if your mpd is on a remote machine, downloading big database to process +## it can take a while +## +## - 3 - match only exact values (this mode uses mpd function for searching in +## database and local one for searching in current playlist) +## +# +#search_engine_default_search_mode = 1 +# +#external_editor = nano +# +## Note: set to yes if external editor is a console application. +## +#use_console_editor = yes +# +##### colors definitions ##### +## +## It is possible to set a background color by setting a color value +## "_", e.g. red_black will set foregound color to red +## and background color to black. +## +## In addition, for terminals that support 256 colors it is possible to set one +## of them by using a number in range [1, 256] instead of color name, +## e.g. numerical value corresponding to red_black is 2_1. To find out if the +## terminal supports 256 colors, run ncmpcpp and check out the bottom of the +## help screen for list of available colors and their numerical values. +## +## What is more, there are two special values for the background color: +## "transparent" and "current". The first one explicitly sets the background to +## be transparent, while the second one allows you to preserve current +## background color and change only the foreground one. It's used implicitly +## when background color is not specified. +## +## Moreover, it is possible to attach format information to selected color +## variables by appending to their end a colon followed by one or more format +## flags, e.g. black:b or red:ur. The following variables support this syntax: +## visualizer_color, color1, color2, empty_tag_color, volume_color, +## state_line_color, state_flags_color, progressbar_color, +## progressbar_elapsed_color, player_state_color, statusbar_time_color, +## alternative_ui_separator_color. +## +## Note: due to technical limitations of older ncurses version, if 256 colors +## are used there is a possibility that you'll be able to use only colors with +## transparent background. +# +#colors_enabled = yes +# +#empty_tag_color = cyan +# +#header_window_color = default +# +#volume_color = default +# +#state_line_color = default +# +#state_flags_color = default:b +# +main_window_color = blue +# +color1 = white +# +color2 = green +# +#progressbar_color = black:b +# +#progressbar_elapsed_color = green:b +# +#statusbar_color = default +# +#statusbar_time_color = default:b +# +#player_state_color = default:b +# +#alternative_ui_separator_color = black:b +# +#window_border_color = green +# +#active_window_border = red +# diff --git a/nvim/.config/nvim/autoload/plug.vim b/nvim/.config/nvim/autoload/plug.vim new file mode 100644 index 0000000..9262208 --- /dev/null +++ b/nvim/.config/nvim/autoload/plug.vim @@ -0,0 +1,2786 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-default branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" 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. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': '', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\(\.exe\)\?$' || &shell =~# 'powershell\(\.exe\)\?$') + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if &shell =~# 'powershell\(\.exe\)\?$' + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(repo . ' ' . v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' + if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif + let opts.tag = a:arg + elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if &shell =~# 'powershell\(\.exe\)\?$' || &shell =~# 'pwsh$' + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + call s:load_plugin(spec) + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = [] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif + + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = s:git_origin_branch(spec) + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return (a:event == 'stdout' || a:event == 'stderr') ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + + if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let cmd = ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt').join(' ') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\(\.exe\)\?$' + return s:shellesc_cmd(a:arg, script) + elseif shell =~# 'powershell\(\.exe\)\?$' || shell =~# 'pwsh$' + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if &shell =~# 'powershell\(\.exe\)\?$' + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] + let remote = result[-1] + if empty(remote) + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let sha = s:git_revision(a:spec.dir) + if empty(sha) + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let current_branch = result[0] + " Check tag + let origin_branch = s:git_origin_branch(a:spec) + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif origin_branch !=# current_branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ current_branch, origin_branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ origin_branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + let err_count = 0 + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + let err = s:rm_rf(line[2:]) + setlocal modifiable + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:git_revision(g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@`-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" 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. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if &shell =~# 'powershell\.exe' + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if &shell =~# 'powershell\.exe' || &shell =~# 'pwsh$' + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\.exe' + set shellredir=>%s\ 2>&1 + endif + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + call s:load_plugin(spec) + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system(['git', 'rev-parse', 'HEAD'], a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = [] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif + + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = get(spec, 'branch', 'master') + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return (a:event == 'stdout' || a:event == 'stderr') ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + + if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let cmd = ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt').join(' ') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\.exe' + return s:shellesc_cmd(a:arg, script) + elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if &shell =~# 'powershell\.exe' + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', a:spec.branch) + \ ], a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp(['git', 'rev-parse', '--short', 'HEAD'], g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@" + if v:statusmsg == "--No lines in buffer--" + let b:wordcount = 0 + else + let s:split_wc = split(v:statusmsg) + if index(s:split_wc, "Selected") < 0 + let b:wordcount = str2nr(s:split_wc[11]) + else + let b:wordcount = str2nr(s:split_wc[5]) + endif + let v:statusmsg = l:old_status + endif + call setpos('.', l:old_position) + return b:wordcount + else + return b:wordcount + endif +endfunction + +function! LightlineWordCount() + return &filetype =~# '\v^(markdown|txt|vimwiki)' ? WordCount() . ' Words' : '' +endfunction + +" Plugins + +call plug#begin("~/.config/nvim/plugged") + +Plug 'vimwiki/vimwiki', { 'branch': 'dev' } +Plug 'chriskempson/base16-vim' +Plug 'tpope/vim-fugitive' +Plug 'Olical/conjure' +"Plug 'dhruvasagar/vim-table-mode' +Plug 'cespare/vim-toml' +Plug 'luochen1990/rainbow' +Plug 'skywind3000/asyncrun.vim' +Plug 'guns/vim-sexp' +Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' } +Plug 'deoplete-plugins/deoplete-jedi' +Plug 'tidalcycles/vim-tidal' +Plug 'ledger/vim-ledger' +Plug 'junegunn/fzf' +Plug 'junegunn/goyo.vim' +Plug 'https://tildegit.org/sloum/gemini-vim-syntax' +Plug 'itchyny/lightline.vim' +Plug 'junegunn/fzf.vim' +Plug '~/projects/improviz-vim' +Plug 'davidgranstrom/scnvim' + +call plug#end() + +au BufNewFile *vimwiki/*.wiki :0r !fragment-vimwiki-header '%' +au BufNewFile *gmi :set includeexpr=substitute(v:fname,'^/','','') +au BufRead *gmi :set includeexpr=substitute(v:fname,'^/','','') + +" function! VimwikiLinkHandler(link) +" let link = a:link +" if link =~# '^file' +" let cmd = 'rifle ' . strcharpart(link, 5) +" echo cmd +" call system(cmd) +" return 0 +" endif +" endfunction + +let g:limelight_conceal_ctermfg = 'grey' +let g:vimwiki_global_ext = 0 +let g:vimwiki_folding = '' +let g:vimwiki_markdown_link_ext = 1 +let g:table_mode_corner = '|' +let g:rainbow_active = 0 +let g:ledger_bin="hledger" +let g:sexp_filetypes= 'clojure,scheme,lisp,timl,janet' +let g:deoplete#enable_at_startup = 1 +let mapleader = "," +let maplocalleader = "," +let g:taskwiki_markup_syntax = "markdown" + +let g:tidal_target = "terminal" + +let g:vimwiki_list = [{'path': '~/vimwiki', 'syntax': 'markdown', 'ext': '.wiki', 'links_space_char': '_' }, + \ {'path': '~/website/wiki/vimwiki', 'syntax': 'markdown', 'ext': '.md', 'links_space_char': '_' , 'diary_rel_path' : 'blog', 'diary_index' : 'index', 'diary_header': 'Blog' }] + +let g:lightline = { + \ 'colorscheme': 'Tomorrow_Night', + \ 'active': { + \ 'left': [ [ 'mode', 'paste' ], + \ [ 'gitbranch', 'readonly', 'filename', 'modified' ] ], + \ + \ 'right': [ [ 'lineinfo' ], + \ [ 'percent' ], + \ [ 'wordcount', 'fileformat', 'fileencoding', 'filetype'] ] + \ }, + \ 'mode_map': { + \ 'n' : 'N', + \ 'i' : 'I', + \ 'R' : 'R', + \ 'v' : 'V', + \ 'V' : 'VL', + \ "\": 'VB', + \ 'c' : 'C', + \ 's' : 'S', + \ 'S' : 'SL', + \ "\": 'SB', + \ 't': 'T', + \ }, + \ 'component_function': { + \ 'gitbranch': 'FugitiveHead', + \ 'wordcount': 'LightlineWordCount' + \ }, + \ } + +set modelines=0 + +" Map semicolon for quicker command access +nnoremap ; : + +"Pandoc Simple Build +nnoremap ps :AsyncRun pandoc --pdf-engine xelatex % -o %.pdf +"Pandoc w/ Citations +nnoremap pc :AsyncRun pandoc --csl ~/Documents/08-Bibliography/ieee.csl --filter pandoc-citeproc --pdf-engine xelatex % -o %.pdf +"Using makedoc script +nnoremap pd :AsyncRun makedoc % + +" Remind +" nnoremap r :!remind ~/vimwiki/calendar.rem + +set number relativenumber +set ruler + +set visualbell + +set encoding=utf-8 + +set tabstop=4 +set softtabstop=0 +set shiftwidth=4 +set expandtab + + +set scrolloff=3 +set backspace=indent,eol,start +set matchpairs+=<:> + + +set hidden + +set ttyfast + +set laststatus=2 + +set noshowmode +set showcmd + +set hlsearch +set incsearch +set ignorecase +set smartcase +set showmatch + +colors base16-tomorrow +hi Normal ctermbg=Black +hi LineNr ctermbg=Black +hi CursorLineNr ctermbg=Black ctermfg=Grey diff --git a/picom/.config/picom.conf b/picom/.config/picom.conf new file mode 100644 index 0000000..66cca37 --- /dev/null +++ b/picom/.config/picom.conf @@ -0,0 +1,228 @@ +# Thank you code_nomad: http://9m.no/ꪯ鵞 +# and Arch Wiki contributors: https://wiki.archlinux.org/index.php/Compton + +################################# +# +# Backend +# +################################# + +# Backend to use: "xrender" or "glx". +# GLX backend is typically much faster but depends on a sane driver. +backend = "glx"; + +################################# +# +# GLX backend +# +################################# + +glx-no-stencil = true; + +# GLX backend: Copy unmodified regions from front buffer instead of redrawing them all. +# My tests with nvidia-drivers show a 10% decrease in performance when the whole screen is modified, +# but a 20% increase when only 1/4 is. +# My tests on nouveau show terrible slowdown. +glx-copy-from-front = false; + +# GLX backend: Use MESA_copy_sub_buffer to do partial screen update. +# My tests on nouveau shows a 200% performance boost when only 1/4 of the screen is updated. +# May break VSync and is not available on some drivers. +# Overrides --glx-copy-from-front. +# glx-use-copysubbuffermesa = true; + +# GLX backend: Avoid rebinding pixmap on window damage. +# Probably could improve performance on rapid window content changes, but is known to break things on some drivers (LLVMpipe). +# Recommended if it works. +# glx-no-rebind-pixmap = true; + +# GLX backend: GLX buffer swap method we assume. +# Could be undefined (0), copy (1), exchange (2), 3-6, or buffer-age (-1). +# undefined is the slowest and the safest, and the default value. +# copy is fastest, but may fail on some drivers, +# 2-6 are gradually slower but safer (6 is still faster than 0). +# Usually, double buffer means 2, triple buffer means 3. +# buffer-age means auto-detect using GLX_EXT_buffer_age, supported by some drivers. +# Useless with --glx-use-copysubbuffermesa. +# Partially breaks --resize-damage. +# Defaults to undefined. +#glx-swap-method = "undefined"; + +################################# +# +# Shadows +# +################################# + +# Enabled client-side shadows on windows. +shadow = true; +# The blur radius for shadows. (default 12) +shadow-radius = 5; +# The left offset for shadows. (default -15) +shadow-offset-x = -5; +# The top offset for shadows. (default -15) +shadow-offset-y = -5; +# The translucency for shadows. (default .75) +shadow-opacity = 0.5; + +# Set if you want different colour shadows +# shadow-red = 0.0; +# shadow-green = 0.0; +# shadow-blue = 0.0; + +# The shadow exclude options are helpful if you have shadows enabled. Due to the way picom draws its shadows, certain applications will have visual glitches +# (most applications are fine, only apps that do weird things with xshapes or argb are affected). +# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher. +shadow-exclude = [ + "! name~=''", + "name = 'Notification'", + "name = 'Plank'", + "name = 'Docky'", + "name = 'Kupfer'", + "name = 'xfce4-notifyd'", + "name = 'cpt_frame_window'", + "name *= 'VLC'", + "name *= 'compton'", + "name *= 'picom'", + "name *= 'Chromium'", + "name *= 'Chrome'", + "class_g = 'Firefox' && argb", + "class_g = 'Conky'", + "class_g = 'Kupfer'", + "class_g = 'Synapse'", + "class_g ?= 'Notify-osd'", + "class_g ?= 'Cairo-dock'", + "class_g ?= 'Xfce4-notifyd'", + "class_g ?= 'Xfce4-power-manager'", + "_GTK_FRAME_EXTENTS@:c", + "_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'" +]; +# Avoid drawing shadow on all shaped windows (see also: --detect-rounded-corners) +shadow-ignore-shaped = false; + +################################# +# +# Opacity +# +################################# + +inactive-opacity = 1; +active-opacity = 1; +frame-opacity = 1; +inactive-opacity-override = false; + +# Dim inactive windows. (0.0 - 1.0) +# inactive-dim = 0.2; +# Do not let dimness adjust based on window opacity. +# inactive-dim-fixed = true; +# Blur background of transparent windows. Bad performance with X Render backend. GLX backend is preferred. +# blur-background = true; +# Blur background of opaque windows with transparent frames as well. +# blur-background-frame = true; +# Do not let blur radius adjust based on window opacity. +blur-background-fixed = false; +blur-background-exclude = [ + "window_type = 'dock'", + "window_type = 'desktop'" +]; + +################################# +# +# Fading +# +################################# + +# Fade windows during opacity changes. +fading = true; +# The time between steps in a fade in milliseconds. (default 10). +fade-delta = 4; +# Opacity change between steps while fading in. (default 0.028). +fade-in-step = 0.03; +# Opacity change between steps while fading out. (default 0.03). +fade-out-step = 0.03; +# Fade windows in/out when opening/closing +# no-fading-openclose = true; + +# Specify a list of conditions of windows that should not be faded. +fade-exclude = [ ]; + +################################# +# +# Other +# +################################# + +# Try to detect WM windows and mark them as active. +mark-wmwin-focused = true; +# Mark all non-WM but override-redirect windows active (e.g. menus). +mark-ovredir-focused = true; +# Use EWMH _NET_WM_ACTIVE_WINDOW to determine which window is focused instead of using FocusIn/Out events. +# Usually more reliable but depends on a EWMH-compliant WM. +use-ewmh-active-win = true; +# Detect rounded corners and treat them as rectangular when --shadow-ignore-shaped is on. +detect-rounded-corners = true; + +# Detect _NET_WM_OPACITY on client windows, useful for window managers not passing _NET_WM_OPACITY of client windows to frame windows. +# This prevents opacity being ignored for some apps. +# For example without this enabled my xfce4-notifyd is 100% opacity no matter what. +detect-client-opacity = true; + +# Specify refresh rate of the screen. +# If not specified or 0, picom will try detecting this with X RandR extension. +refresh-rate = 0; + +# Vertical synchronization: match the refresh rate of the monitor +vsync = true; + +# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing. +# Reported to have no effect, though. +dbe = false; + +# Limit picom to repaint at most once every 1 / refresh_rate second to boost performance. +# This should not be used with --vsync drm/opengl/opengl-oml as they essentially does --sw-opti's job already, +# unless you wish to specify a lower refresh rate than the actual value. +#sw-opti = true; + +# Unredirect all windows if a full-screen opaque window is detected, to maximize performance for full-screen windows, like games. +# Known to cause flickering when redirecting/unredirecting windows. +unredir-if-possible = true; + +# Specify a list of conditions of windows that should always be considered focused. +focus-exclude = [ ]; + +# Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused at the same time. +detect-transient = true; +# Use WM_CLIENT_LEADER to group windows, and consider windows in the same group focused at the same time. +# WM_TRANSIENT_FOR has higher priority if --detect-transient is enabled, too. +detect-client-leader = true; + +################################# +# +# Window type settings +# +################################# + +wintypes: +{ + tooltip = + { + # fade: Fade the particular type of windows. + fade = true; + # shadow: Give those windows shadow + shadow = false; + # opacity: Default opacity for the type of windows. + opacity = 0.85; + # focus: Whether to always consider windows of this type focused. + focus = true; + }; +}; + +###################### +# +# XSync +# See: https://github.com/yshui/picom/commit/b18d46bcbdc35a3b5620d817dd46fbc76485c20d +# +###################### + +# Use X Sync fence to sync clients' draw calls. Needed on nvidia-drivers with GLX backend for some users. +xrender-sync-fence = true; diff --git a/qutebrowser/.config/qutebrowser/config.py b/qutebrowser/.config/qutebrowser/config.py new file mode 100644 index 0000000..674d10d --- /dev/null +++ b/qutebrowser/.config/qutebrowser/config.py @@ -0,0 +1,10 @@ +config.load_autoconfig() + +config.bind(',x', 'hint links spawn termite -e "aria2c {hint-url}"') +config.bind(',m', 'spawn --userscript mpv') +config.set("content.headers.user_agent","Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)","https://*.youtube.com/*") + +config.set("content.webrtc_ip_handling_policy","default-public-interface-only") +config.set("content.cookies.store",False) + +config.source("block.py") diff --git a/qutebrowser/.local/share/qutebrowser/greasemonkey/82915.user.js b/qutebrowser/.local/share/qutebrowser/greasemonkey/82915.user.js new file mode 100644 index 0000000..6258d9a --- /dev/null +++ b/qutebrowser/.local/share/qutebrowser/greasemonkey/82915.user.js @@ -0,0 +1,7802 @@ +// ==UserScript== +// @name Reddit Enhancement Suite +// @namespace http://reddit.honestbleeps.com/ +// @description A suite of tools to enhance reddit... +// @author honestbleeps +// @include http://reddit.honestbleeps.com/* +// @include http://reddit.com/* +// @include https://reddit.com/* +// @include http://*.reddit.com/* +// @include https://*.reddit.com/* +// ==/UserScript== + +var RESVersion = 2.1; + +// array compare utility function for keyCode arrays +function keyArrayCompare(fromArr, toArr) { + // if we've passed in a number, fix that and make it an array with alt, shift and ctrl set to false. + if (typeof(toArr) == 'number') { + toArr = Array(toArr,false,false,false); + } else if (toArr.length == 4) { + toArr.push(false); + } + if (fromArr.length != toArr.length) return false; + for (var i = 0; i < toArr.length; i++) { + if (fromArr[i].compare) { + if (!fromArr[i].compare(toArr[i])) return false; + } + if (fromArr[i] !== toArr[i]) return false; + } + return true; +} + +function operaUpdateCallback(obj) { + RESUtils.compareVersion(obj); +} +function operaForcedUpdateCallback(obj) { + RESUtils.compareVersion(obj, true); +} + +function hasClass(ele,cls) { + if ((typeof(ele) == 'undefined') || (ele == null)) { + console.log(arguments.callee.caller); + return false; + } + return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)')); +} +function addClass(ele,cls) { + if (!hasClass(ele,cls)) ele.className += " "+cls; +} +function removeClass(ele,cls) { + if (hasClass(ele,cls)) { + var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)'); + ele.className=ele.className.replace(reg,' '); + } +} + +function post_to_url(path, params, method) { + method = method || "post"; // Set method to post by default, if not specified. + + // The rest of this code assumes you are not using a library. + // It can be made less wordy if you use one. + var form = document.createElement("form"); + form.setAttribute("method", method); + form.setAttribute("action", path); + + for(var key in params) { + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", key); + hiddenField.setAttribute("value", params[key]); + + form.appendChild(hiddenField); + } + + document.body.appendChild(form); + form.submit(); +} + +function safariMessageHandler(msgEvent) { + switch (msgEvent.name) { + case 'compareVersion': + var forceUpdate = false; + if (typeof(msgEvent.message.forceUpdate) != 'undefined') forceUpdate = true; + RESUtils.compareVersion(msgEvent.message, forceUpdate); + break; + default: + // console.log('unknown event type in safariMessageHandler'); + break; + } +} + +if (typeof(safari) != 'undefined') { + safari.self.addEventListener("message", safariMessageHandler, false); +} + +// GreaseMonkey API compatibility for Chrome +// @copyright 2009, 2010 James Campos +// @modified 2010 Steve Sobel - added some missing gm_* functions +// @license cc-by-3.0; http://creativecommons.org/licenses/by/3.0/ +if (typeof GM_deleteValue == 'undefined') { + GM_addStyle = function(css) { + var style = document.createElement('style'); + style.textContent = css; + var head = document.getElementsByTagName('head')[0]; + if (head) { + head.appendChild(style); + } + } + + GM_deleteValue = function(name) { + localStorage.removeItem(name); + } + + GM_getValue = function(name, defaultValue) { + var value = localStorage.getItem(name); + if (!value) + return defaultValue; + var type = value[0]; + value = value.substring(1); + switch (type) { + case 'b': + return value == 'true'; + case 'n': + return Number(value); + default: + return value; + } + } + + GM_log = function(message) { + console.log(message); + } + + GM_registerMenuCommand = function(name, funk) { + //todo + } + + GM_setValue = function(name, value) { + value = (typeof value)[0] + value; + localStorage.setItem(name, value); + } + + GM_xmlhttpRequest=function(obj) { + var request=new XMLHttpRequest(); + request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } } + request.onerror=function() { if(obj.onerror) { obj.onerror(request); } } + try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; } + if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } } + request.send(obj.data); return request; + } + +} + + +var RESConsoleContainer = ''; +var modalOverlay = ''; +var RESMenuItems = new Array(); +var RESConsolePanels = new Array(); +var modules = new Array(); + +// define common RESUtils +var RESUtils = { + // imgur API key + imgurAPIKey: 'fe266bc9466fe69aa1cf0904e7298eda', + // A cache variable to store CSS that will be applied at the end of execution... + css: '', + addCSS: function(css) { + this.css += css; + }, + // checks if script should run on current URL using exclude / include. + isMatchURL: function (moduleID) { + var currURL = location.href; + // get includes and excludes... + var excludes = modules[moduleID].exclude; + var includes = modules[moduleID].include; + // first check excludes... + if (typeof(excludes) != 'undefined') { + for (i=0, len = excludes.length; i span.user > a'); + if (userLink != null) { + return userLink.innerHTML + } else { + return null; + } + }, + pageType: function() { + var pageType = ''; + var currURL = location.href; + var commentsRegex = new RegExp(/http:\/\/www.reddit.com\/[-\w\.\/]*comments\/[-\w\.\/]*/i); + var inboxRegex = new RegExp(/http:\/\/www.reddit.com\/message\/[-\w\.\/]*/i); + var submitRegex = new RegExp(/http:\/\/www.reddit.com\/[-\w\.\/]*\/submit\/?/i); + if (commentsRegex.test(currURL)) { + pageType = 'comments' + } else if (inboxRegex.test(currURL)) { + pageType = 'inbox'; + } else if (submitRegex.test(currURL)) { + pageType = 'submit'; + } else { + pageType = 'linklist'; + } + return pageType; + }, + currentSubReddit: function() { + var match = location.href.match(/http:\/\/www.reddit.com\/r\/([\w]+).*/i); + if (match != null) { + return match[1]; + } else { + return null; + } + }, + getXYpos: function (obj) { + var topValue= 0,leftValue= 0; + while(obj){ + leftValue+= obj.offsetLeft; + topValue+= obj.offsetTop; + obj= obj.offsetParent; + } + finalvalue = { 'x': leftValue, 'y': topValue }; + return finalvalue; + }, + elementInViewport: function (obj) { + var top = obj.offsetTop; + var left = obj.offsetLeft; + var width = obj.offsetWidth; + var height = obj.offsetHeight; + while(obj.offsetParent) { + obj = obj.offsetParent; + top += obj.offsetTop; + left += obj.offsetLeft; + } + return ( + top >= window.pageYOffset && + left >= window.pageXOffset && + (top + height) <= (window.pageYOffset + window.innerHeight) && + (left + width) <= (window.pageXOffset + window.innerWidth) + ); + }, + setSelectValue: function(obj, value) { + for (var i=0, len=obj.length; i < len; i++) { + if (obj[i].value == value) { + obj[i].selected = true; + } + } + }, + stripHTML: function(str) { + var regExp = /<\/?[^>]+>/gi; + str = str.replace(regExp,""); + return str; + }, + fadeElementOut: function(obj, speed) { + if (obj.getAttribute('isfading') == 'in') { + return false; + } + obj.setAttribute('isfading','out'); + speed = speed || 0.1; + if (obj.style.opacity <= 0) { + obj.style.display = 'none'; + obj.setAttribute('isfading',false); + return true; + } else { + var newOpacity = parseFloat(obj.style.opacity) - parseFloat(speed); + if (newOpacity < 0) newOpacity = 0; + obj.style.opacity = newOpacity; + setTimeout(function() { RESUtils.fadeElementOut(obj, speed) }, 100); + } + }, + fadeElementIn: function(obj, speed) { + if (obj.getAttribute('isfading') == 'out') { + return false; + } + obj.setAttribute('isfading','in'); + speed = speed || 0.1; + if ((obj.style.display == 'none') || (obj.style.display == '')) { + obj.style.opacity = 0; + obj.style.display = 'block'; + } + if (obj.style.opacity >= 1) { + obj.setAttribute('isfading',false); + return true; + } else { + var newOpacity = parseFloat(obj.style.opacity) + parseFloat(speed); + if (newOpacity > 1) newOpacity = 1; + obj.style.opacity = newOpacity; + setTimeout(function() { RESUtils.fadeElementIn(obj, speed) }, 100); + } + }, + checkForUpdate: function(forceUpdate) { + var now = new Date(); + var lastCheck = parseInt(localStorage.getItem('RESLastUpdateCheck')) || 0; + // if we haven't checked for an update in 24 hours, check for one now! + if (((now.getTime() - lastCheck) > 86400000) || (RESVersion > localStorage.getItem('RESlatestVersion')) || ((localStorage.getItem('RESoutdated') == 'true') && (RESVersion == localStorage.getItem('RESlatestVersion')))|| forceUpdate) { + var jsonURL = 'http://reddit.honestbleeps.com/update.json?v=' + RESVersion; + // mark off that we've checked for an update... + localStorage.setItem('RESLastUpdateCheck',now.getTime()); + var outdated = false; + if (typeof(chrome) != 'undefined') { + // we've got chrome, so we need to hit up the background page to do cross domain XHR + thisJSON = { + requestType: 'compareVersion', + url: jsonURL + } + chrome.extension.sendRequest(thisJSON, function(response) { + // send message to background.html to open new tabs... + outdated = RESUtils.compareVersion(response, forceUpdate); + }); + } else if (typeof(safari) != 'undefined') { + // we've got safari, so we need to hit up the background page to do cross domain XHR + thisJSON = { + requestType: 'compareVersion', + url: jsonURL, + forceUpdate: forceUpdate + } + safari.self.tab.dispatchMessage("compareVersion", thisJSON); + } else if (typeof(opera) != 'undefined') { + var jsonScript = createElementWithID('script','updateJSON'); + var callback = forceUpdate ? 'operaForcedUpdateCallback' : 'operaUpdateCallback'; + // This will call operaUpdateCallback(), or -- if this is + // an update check initiated by the user -- operaForcedUpdateCallback(). + jsonScript.setAttribute('src',jsonURL.replace('json','php') + '&callback=' + callback); + document.body.appendChild(jsonScript); + // it will call jsonCallback(); + } else { + // we've got greasemonkey, so we can do cross domain XHR. + GM_xmlhttpRequest({ + method: "GET", + url: jsonURL, + onload: function(response) { + outdated = RESUtils.compareVersion(JSON.parse(response.responseText), forceUpdate); + } + }); + } + } + }, + compareVersion: function(response, forceUpdate) { + if (RESVersion < response.latestVersion) { + localStorage.setItem('RESoutdated','true'); + localStorage.setItem('RESlatestVersion',response.latestVersion); + localStorage.setItem('RESmessage',response.message); + if (forceUpdate) { + RESConsole.RESCheckUpdateButton.innerHTML = 'You are out of date! [click to update]'; + } + return true; + } else { + localStorage.setItem('RESlatestVersion',response.latestVersion); + localStorage.setItem('RESoutdated','false'); + if (forceUpdate) { + RESConsole.RESCheckUpdateButton.innerHTML = 'You are up to date!'; + } + return false; + } + }, + niceKeyCode: function(charCode) { + keyComboString = ''; + if (typeof(charCode) == 'string') { + var tempArray = charCode.split(','); + if (tempArray.length) { + if (tempArray[1] == 'true') keyComboString += 'alt-'; + if (tempArray[2] == 'true') keyComboString += 'ctrl-'; + if (tempArray[3] == 'true') keyComboString += 'shift-'; + if (tempArray[4] == 'true') keyComboString += 'command-'; + } + testCode = parseInt(charCode); + } else if (typeof(charCode) == 'object') { + testCode = parseInt(charCode[0]); + if (charCode[1]) keyComboString += 'alt-'; + if (charCode[2]) keyComboString += 'ctrl-'; + if (charCode[3]) keyComboString += 'shift-'; + if (charCode[4]) keyComboString += 'command-'; + } + switch(testCode) { + case 8: + niceString = "backspace"; // backspace + break; + case 9: + niceString = "tab"; // tab + break; + case 13: + niceString = "enter"; // enter + break; + case 16: + niceString = "shift"; // shift + break; + case 17: + niceString = "ctrl"; // ctrl + break; + case 18: + niceString = "alt"; // alt + break; + case 19: + niceString = "pause/break"; // pause/break + break; + case 20: + niceString = "caps lock"; // caps lock + break; + case 27: + niceString = "escape"; // escape + break; + case 33: + niceString = "page up"; // page up, to avoid displaying alternate character and confusing people + break; + case 34: + niceString = "page down"; // page down + break; + case 35: + niceString = "end"; // end + break; + case 36: + niceString = "home"; // home + break; + case 37: + niceString = "left arrow"; // left arrow + break; + case 38: + niceString = "up arrow"; // up arrow + break; + case 39: + niceString = "right arrow"; // right arrow + break; + case 40: + niceString = "down arrow"; // down arrow + break; + case 45: + niceString = "insert"; // insert + break; + case 46: + niceString = "delete"; // delete + break; + case 91: + niceString = "left window"; // left window + break; + case 92: + niceString = "right window"; // right window + break; + case 93: + niceString = "select key"; // select key + break; + case 96: + niceString = "numpad 0"; // numpad 0 + break; + case 97: + niceString = "numpad 1"; // numpad 1 + break; + case 98: + niceString = "numpad 2"; // numpad 2 + break; + case 99: + niceString = "numpad 3"; // numpad 3 + break; + case 100: + niceString = "numpad 4"; // numpad 4 + break; + case 101: + niceString = "numpad 5"; // numpad 5 + break; + case 102: + niceString = "numpad 6"; // numpad 6 + break; + case 103: + niceString = "numpad 7"; // numpad 7 + break; + case 104: + niceString = "numpad 8"; // numpad 8 + break; + case 105: + niceString = "numpad 9"; // numpad 9 + break; + case 106: + niceString = "multiply"; // multiply + break; + case 107: + niceString = "add"; // add + break; + case 109: + niceString = "subtract"; // subtract + break; + case 110: + niceString = "decimal point"; // decimal point + break; + case 111: + niceString = "divide"; // divide + break; + case 112: + niceString = "F1"; // F1 + break; + case 113: + niceString = "F2"; // F2 + break; + case 114: + niceString = "F3"; // F3 + break; + case 115: + niceString = "F4"; // F4 + break; + case 116: + niceString = "F5"; // F5 + break; + case 117: + niceString = "F6"; // F6 + break; + case 118: + niceString = "F7"; // F7 + break; + case 119: + niceString = "F8"; // F8 + break; + case 120: + niceString = "F9"; // F9 + break; + case 121: + niceString = "F10"; // F10 + break; + case 122: + niceString = "F11"; // F11 + break; + case 123: + niceString = "F12"; // F12 + break; + case 144: + niceString = "num lock"; // num lock + break; + case 145: + niceString = "scroll lock"; // scroll lock + break; + case 186: + niceString = ";"; // semi-colon + break; + case 187: + niceString = "="; // equal-sign + break; + case 188: + niceString = ","; // comma + break; + case 189: + niceString = "-"; // dash + break; + case 190: + niceString = "."; // period + break; + case 191: + niceString = "/"; // forward slash + break; + case 192: + niceString = "`"; // grave accent + break; + case 219: + niceString = "["; // open bracket + break; + case 220: + niceString = "\\"; // back slash + break; + case 221: + niceString = "]"; // close bracket + break; + case 222: + niceString = "'"; // single quote + break; + default: + niceString = String.fromCharCode(testCode); + break; + } + return keyComboString + niceString; + }, + niceDate: function(d, usformat) { + var year = d.getFullYear(); + var month = (d.getMonth() + 1); + (month < 10) ? month = '0'+month : month=month; + var day = d.getDate(); + (day < 10) ? day = '0'+day : day=day; + var fullString = year+'-'+month+'-'+day; + if (usformat) { + fullString = month+'-'+day+'-'+year; + } + return fullString; + }, + niceDateDiff: function(origdate, newdate) { + // Enter the month, day, and year below you want to use as + // the starting point for the date calculation + var amonth = origdate.getMonth()+1; + var aday = origdate.getDate(); + var ayear = origdate.getFullYear(); + + if (newdate == null) newdate = new Date(); + var dyear; + var dmonth; + var dday; + var tyear = newdate.getFullYear(); + var tmonth = newdate.getMonth()+1; + var tday = newdate.getDate(); + var y=1; + var mm=1; + var d=1; + var a2=0; + var a1=0; + var f=28; + + if ((tyear/4)-parseInt(tyear/4)==0) { + f=29; + } + + m = new Array(31, f, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + + dyear = tyear-(ayear); + + dmonth = tmonth-amonth; + if (dmonth<0) { + dmonth = dmonth+12; + dyear--; + } + + dday = tday-aday + if (dday<0) { + var ma = amonth+tmonth; + // console.log('amonth: ' + amonth + ' -- tmonth: ' +tmonth); + if (ma>12) {ma = ma-12} + if (ma=0) {ma = ma+12} + dday = dday+m[ma]; + dmonth--; + if (dmonth < 0) { + dyear--; + dmonth = dmonth+12; + } + } + + var returnString = ''; + + if (dyear==0) {y=0} + if (dmonth==0) {mm=0} + if (dday==0) {d=0} + if ((y==1) && (mm==1)) {a1=1} + if ((y==1) && (d==1)) {a1=1} + if ((mm==1) && (d==1)) {a2=1} + if (y==1){ + if (dyear == 1) { + returnString += dyear + " year"; + } else { + returnString += dyear + " years"; + } + } + if ((a1==1) && (a2==0)) { returnString += " and "; } + if ((a1==1) && (a2==1)) { returnString += ", "; } + if (mm==1){ + if (dmonth == 1) { + returnString += dmonth + " month"; + } else { + returnString += dmonth + " months"; + } + } + if (a2==1) { returnString += " and "; } + if (d==1){ + if (dday == 1) { + returnString += dday + " day"; + } else { + returnString += dday + " days"; + } + } + return returnString; + }, + checkIfSubmitting: function() { + this.checkedIfSubmitting = true; + if ((location.href.match(/\/r\/[\w]+\/submit\/?/i)) || (location.href.match(/reddit.com\/submit\/?/i))) { + var thisSubRedditInput = document.getElementById('sr-autocomplete'); + if (thisSubRedditInput) { + var thisSubReddit = thisSubRedditInput.value; + var title = document.querySelector('textarea[name=title]'); + if (typeof(this.thisSubRedditInputListener) == 'undefined') { + this.thisSubRedditInputListener = true; + thisSubRedditInput.addEventListener('change', function(e) { + RESUtils.checkIfSubmitting(); + }, false); + } + if (thisSubReddit.toLowerCase() == 'enhancement') { + var textDesc = document.getElementById('text-desc'); + this.submittingToEnhancement = createElementWithID('div','submittingToEnhancement'); + this.submittingToEnhancement.innerHTML = "Hey there!

It looks like you are submitting to /r/Enhancement. Are you submitting a bug report? \ + If so, please consider the following:
\ +
    \ +
  1. Have you searched /r/Enhancement to see if someone else has reported it?
  2. \ +
  3. Have you checked the FAQ yet?
  4. \ +
  5. Are you sure it's a bug with RES specifically? Do you have any other Reddit-related userscripts/extensions running?
  6. \ +
  7. Okay - if you've answered \"yes\" to all of the above, go ahead and report it. Please be sure to specify your browser, operating system, anything showing up in your Javascript error console, and any special settings you may have that might help debug.
  8. \ +
\ + "; + insertAfter(textDesc, this.submittingToEnhancement); + if (title.value == '') title.value = 'Submitting a bug? Please read the box above...'; + RESUtils.addCSS('#submittingToEnhancement { font-size: 12px; border: 1px solid blue; padding: 5px; margin-top: 10px; } #submittingToEnhancement ol { margin-left: 10px; margin-top: 15px; list-style-type: decimal; } #submittingToEnhancement li { margin-left: 25px; }'); + } else if (typeof(this.submittingToEnhancement) != 'undefined') { + this.submittingToEnhancement.parentNode.removeChild(this.submittingToEnhancement); + if (title.value == 'Submitting a bug? Please read the box above...') { + title.value = ''; + } + } + } + } + + } +} + +RESUtils.addCSS(' \ +#RESConsole { \ + display: none; \ + font-size: 12px; \ + z-index: 1000; \ + position: absolute; \ + top: 50px; \ + left: 50px; \ + width: 740px; \ + height: 500px; \ + border-radius: 10px 10px 10px 10px; \ + -moz-border-radius: 10px 10px 10px 10px; \ + -webkit-border-radius: 10px 10px 10px 10px; \ + padding: 10px; \ + border: 4px solid #CCCCCC; \ + background-color: #ffffff; \ +} \ +#modalOverlay { \ + display: none; \ + z-index: 999; \ + position: absolute; \ + top: 0px; \ + left: 0px; \ + width: 100%; \ + background-color: #333333; \ + opacity: 0.6; \ +} \ +#RESConsoleHeader { \ + width: 100%; \ +} \ +#RESLogo { \ + margin-right: 5px; \ + float: left; \ +} \ +#RESConsoleTopBar { \ + width: 100%; \ + height: 35px; \ + margin-bottom: 10px; \ + padding: 3px; \ + background-color: #F0F3FC; \ + float: left; \ +} \ +#RESConsoleTopBar h1 { \ + float: left; \ + margin-top: 5px; \ + padding: 0px; \ + font-size: 14px; \ + font-weight: bold; \ +} \ +#RESConsoleSubredditLink { \ + margin-left: 15px; \ + font-size: 11px; \ +} \ +#RESClose { \ + background-image: url("http://thumbs.reddit.com/t5_2s10b_0.png"); \ + background-position: 0px -120px; \ + width: 16px; \ + height: 16px; \ + float: right; \ + cursor: pointer; \ +} \ +#RESHelp { \ + background-image: url("http://thumbs.reddit.com/t5_2s10b_0.png"); \ + background-position: -16px -120px; \ + margin-right: 8px; \ + width: 16px; \ + height: 16px; \ + float: right; \ + cursor: pointer; \ +} \ +#RESMenu li { \ + float: left; \ + text-align: center; \ + min-width: 80px; \ + margin-right: 15px; \ + border: 1px solid black; \ + border-radius: 5px 5px 5px 5px; \ + -moz-border-radius: 5px 5px 5px 5px; \ + -webkit-border-radius: 5px 5px 5px 5px; \ + padding: 3px; \ + cursor: pointer; \ +} \ +#RSSConsoleContent { \ + clear: both; \ + margin-top: 40px; \ + padding: 6px; \ + height: 410px; \ + border: 1px solid #DDDDDD; \ + overflow: auto; \ +} \ +#RESConfigPanelOptions { \ + margin-top: 15px; \ + display: block; \ + width: 100%; \ +} \ +.RESPanel { \ + display: none; \ +} \ +.clear { \ + clear: both; \ +} \ +#keyCodeModal { \ + display: none; \ + width: 200px; \ + height: 40px; \ + position: absolute; \ + z-index: 1000; \ + background-color: #FFFFFF; \ + padding: 4px; \ + border: 2px solid #CCCCCC; \ +} \ +p.moduleListing { \ + padding-left: 5px; \ + padding-right: 5px; \ + padding-top: 5px; \ + padding-bottom: 15px; \ + border: 1px solid #BBBBBB; \ + -moz-box-shadow: 3px 3px 3px #BBB; \ + -webkit-box-shadow: 3px 3px 3px #BBB; \ +} \ +#RESConsoleModulesPanel label { \ + float: left; \ + width: 140px; \ + padding-top: 6px; \ +} \ +#RESConsoleModulesPanel input[type=checkbox] { \ + float: left; \ + margin-left: 10px; \ +} \ +#RESConsoleModulesPanel input[type=button] { \ + float: right; \ + padding: 3px; \ + margin-left: 20px; \ + font-size: 12px; \ + border: 1px solid #DDDDDD; \ + -moz-box-shadow: 3px 3px 3px #BBB; \ + -webkit-box-shadow: 3px 3px 3px #BBB; \ + background-color: #F0F3FC; \ + margin-bottom: 10px; \ +} \ +#RESConsoleModulesPanel p { \ + overflow: auto; \ + clear: both; \ + margin-bottom: 10px; \ +} \ +.moduleDescription { \ + float: left; \ + width: 500px; \ + margin-left: 10px; \ + padding-top: 6px; \ +} \ +.optionContainer { \ + width: 700px; \ + overflow: auto; \ + padding: 5px; \ + border: 1px dashed #AAAAAA; \ +} \ +.optionContainer table { \ + width: 650px; \ + margin-top: 20px; \ +} \ +.optionContainer label { \ + float: left; \ + width: 140px; \ +} \ +.optionContainer input[type=text] { \ + float: left; \ + width: 100px; \ +} \ +.optionDescription { \ + float: left; \ + width: 430px; \ + margin-left: 10px; \ +} \ +#RESCheckForUpdate { \ + float: left; \ + font-size: 10px; \ + cursor: pointer; \ + color: f0f3fc; \ + margin-left: 10px; \ +} \ +#moduleOptionsSave { \ + float: right; \ + padding: 3px; \ + margin-top: 6px; \ + margin-left: 20px; \ + font-size: 12px; \ + border: 1px solid #DDDDDD; \ + -moz-box-shadow: 3px 3px 3px #BBB; \ + -webkit-box-shadow: 3px 3px 3px #BBB; \ + background-color: #F0F3FC; \ + margin-bottom: 10px; \ +} \ +#moduleOptionsSaveStatus { \ + display: none; \ + margin-top: 10px; \ + padding: 5px; \ + text-align: center; \ + background-color: #FFFACD; \ +} \ +#RESConsoleAboutPanel p { \ + margin-bottom: 10px; \ +} \ +#RESConsoleAboutPanel ul { \ + margin-bottom: 10px; \ + margin-top: 10px; \ +} \ +#RESConsoleAboutPanel li { \ + list-style-type: disc; \ + margin-left: 15px; \ +} \ +.outdated { \ + float: right; \ + font-size: 11px; \ + margin-right: 15px; \ + margin-top: 5px; \ +} \ +'); + + +// define the RESConsole class +var RESConsole = { + // make the modules panel accessible to this class for updating (i.e. when preferences change, so we can redraw it) + RESConsoleModulesPanel: createElementWithID('div', 'RESConsoleModulesPanel', 'RESPanel'), + RESConsoleConfigPanel: createElementWithID('div', 'RESConsoleConfigPanel', 'RESPanel'), + addConsoleLink: function() { + var userMenu = document.querySelector('#header-bottom-right'); + if (userMenu) { + var preferencesUL = userMenu.querySelector('UL'); + var separator = document.createElement('span'); + separator.setAttribute('class','separator'); + separator.innerHTML = '|'; + this.RESPrefsLink = document.createElement('a'); + this.RESPrefsLink.setAttribute('id','openRESPrefs'); + this.RESPrefsLink.setAttribute('href','javascript:void(0)'); + if (localStorage.getItem('RESoutdated') == 'true') { + this.RESPrefsLink.innerHTML = '[RES](u)'; + } else { + this.RESPrefsLink.innerHTML = '[RES]'; + } + this.RESPrefsLink.addEventListener('click', function(e) { + e.preventDefault(); + RESConsole.open(); + }, true); + insertAfter(preferencesUL, this.RESPrefsLink); + insertAfter(preferencesUL, separator); + } + }, + resetModulePrefs: function() { + prefs = { + 'userTagger': true, + 'commentsLinker': true, + 'singleClick': true, + 'subRedditTagger': true, + 'uppersAndDowners': true, + 'keyboardNav': true, + 'commentPreview': true, + 'showImages': true, + 'showKarma': true, + 'usernameHider': false, + 'accountSwitcher': true, + 'styleTweaks': true + }; + this.setModulePrefs(prefs); + return prefs; + }, + getAllModulePrefs: function() { + // get the stored preferences out first. + if (localStorage.getItem('RES.modulePrefs') != null) { + var storedPrefs = JSON.parse(localStorage.getItem('RES.modulePrefs')); + } else if (localStorage.getItem('modulePrefs') != null) { + // Clean up old moduleprefs. + var storedPrefs = JSON.parse(localStorage.getItem('modulePrefs')); + localStorage.removeItem('modulePrefs'); + this.setModulePrefs(storedPrefs); + } else { + // looks like this is the first time RES has been run - set prefs to defaults... + storedPrefs = this.resetModulePrefs(); + } + if (storedPrefs == null) { + storedPrefs = {}; + } + // create a new JSON object that we'll use to return all preferences. This is just in case we add a module, and there's no pref stored for it. + var prefs = {}; + // for any stored prefs, drop them in our prefs JSON object. + for (i in modules) { + if (storedPrefs[i]) { + prefs[i] = storedPrefs[i]; + } else if (storedPrefs[i] == null) { + // looks like a new module, or no preferences. We'll default it to on. + prefs[i] = true; + } else { + prefs[i] = false; + } + } + if ((typeof(prefs) != 'undefined') && (prefs != 'undefined') && (prefs)) { + return prefs; + } + }, + getModulePrefs: function(moduleID) { + if (moduleID) { + var prefs = this.getAllModulePrefs(); + return prefs[moduleID]; + } else { + alert('no module name specified for getModulePrefs'); + } + }, + setModulePrefs: function(prefs) { + if (prefs != null) { + localStorage.setItem('RES.modulePrefs', JSON.stringify(prefs)); + this.drawModulesPanel(); + return prefs; + } else { + alert('error - no prefs specified'); + } + }, + container: RESConsoleContainer, + create: function() { + // create the console container + RESConsoleContainer = createElementWithID('div', 'RESConsole'); + // create a modal overlay + modalOverlay = createElementWithID('div', 'modalOverlay'); + modalOverlay.addEventListener('click',function(e) { + e.preventDefault(); + return false; + }, true); + document.body.appendChild(modalOverlay); + // create the header + RESConsoleHeader = createElementWithID('div', 'RESConsoleHeader'); + // create the top bar and place it in the header + RESConsoleTopBar = createElementWithID('div', 'RESConsoleTopBar'); + this.logo = 'data:image/gif;base64,R0lGODlhPAAeAPcAADo6OlxcXSQkJDExMQ8PDwkJCRISEhwcHCgoKBAQEBYWFgQEBAcHBxQVFAICAtDT2pCSlyAgIvDz+2BhZf7//5KTlSIiIvPz87y8vJGRkf7+/jU1NRkZGScnJ6enp/79/WNjY+nr8rW2ulBQUB8fH0xMTBgYGD4+PvX19S8vL42OkN7e3uXl5f7//tXX3Pb29v9PAOvr69fX18XFxe3v98LCwmVlZZmanf9UAOfq8P9YAJKSkrGxseTk5FpaWoWGiP39/f5LACAgIENDQ0dHR56fokhISC0tLXp6ep2eoDk5Of9NALe4u1JSUnZ2dpOUltrc4aurq/adcYeHh9DS15SUl76+vv328u3w+PiVY1lZWvZxLsLDx0VFRfa1kcfIzXx8fGFiY/rYxZSUlP9VAPaVYfhcC5qbmurs9PxJAHFyc+zs7Pvq3/3//+/x+ezv9jg4OF9fX+/v7/tNAOLk6uDg4ODi6IqKimRkZLKysqqrrv369uPj4+jo6CkpKnBxcm1tbUZGRmprbBgYGfnJrjs7PPekdvhbBxcXGPZ9Pvh1NpaXmdLT2Pvr4flfFfzv5u/y+omKjI2Njebo76+vsUdHSPvn3NXV1fZtJoODg/r6+mtra9zc3MrKysnLz/jRuF5fYOrs8+zu9bi4uLu7u2BgYPeMU3h4eHh5e/ehc/nGrPLy8svM0eTm7dja346PkU9PT39/f3R1dmRkZZ6enpiYmLW1tfz8/LO0t/T09Ovu9erq6v///jk6Off39/i4ls7Q1PZ/Qfd/RS4tLtbW1lhYWP36+O7x+Pa1j+7x+YSFh8TExPlZCaOjo5CQkPz18be3t+7u7jc3N3R0dFZXV+Pl697g5uHh4aOkptvd4mxtboiJi29vcUBBQ5GSlPvp3qGipbOzs/nYxKmqrcXGypWVlf369/i8mU9PUBUWFvWWYejp6Ofn55mbnSoqKnV1df359WxsbE1NTbe4vP1IAP5IAP9JAGZmaGdnaDQ0NA0NDf9MAPpNAAAAAP////Dz/CH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzBCMDk1MzM5NkZGMTFERjgyQTZGNzE3MzdDRTMxNzUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzBCMDk1MzQ5NkZGMTFERjgyQTZGNzE3MzdDRTMxNzUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozMEIwOTUzMTk2RkYxMURGODJBNkY3MTczN0NFMzE3NSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozMEIwOTUzMjk2RkYxMURGODJBNkY3MTczN0NFMzE3NSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAA8AB4AAAj/AP8JHEiwoMGDCBMqXMhwoIRjBnNU+QGlocWLBr316/WDC41/LvqlONEPHMaTFo+g0qOkQIEUBPD48+dsARaUOBHSYfBGoIRJT/qRmtnDAaOcSAmq8GOQxKaZtPrpSkr1QBKDX/oVMtJPBdWkIfpVO2jnnhZPX5PesJC27UBR2UQsOtBhnis0bpECk0WinwN9FjYMSOCg3yBB5CTkRQipyKx2bv5hQ9RPSYYaK1Zp8NcCRZ0ZtYYsMFBBMRN8ykLktUOAg5EOBhoQiMVipu3bt2PcUZBACAcifvqJcCugxC1/p/rZWHO7Be6ZFG5feNfPx8xM/XIYjPCg4AQICq05/+DkD0y/Zs/T+4uO29YCEP40CCmyvTvB7wpdLEARpZ+H2xoQkooqHzwnhiG/XHGbFf3s4M8wr9TnHXgJ0bBABkcEgNs5/OwzBzLszSQOM0HQU0aI/iBhAgYLsDIQBP3EGGM3D8goY0I39FOADLe1IQwMOsCgCIpSBKEDDo48chs7lFFzEHcTMsRNPs9lUQ8Z9piCmxdp4LDEFnvgNkQhCEF5H4UKRSLPc98Ec0giluAGjzpmYPLJcyCAUqZ9A+G3UBIApGcMG+b4wwtuHzTyTHqBqLEYFQvUpt6k6V1gACWLSZCOE5R2etsOCySz2D+49LMMbi8Ug0F6KzRxCW4yFJlQwagC/UHADLcBMUI/I2RAySh5nGFDAQL0cBsxJqBD60Bh9FNOrjycYAADCyxAwBFjXHCbBwxUotiyAo3TjzvhvHCbL7vw0Ucut2mCARz9zAouQaFoswAC0/AQQ3pyQIPEAAsE0Mq8B23TTwMMEBBYFyUQIY0ABiygQD+wEHxQBQYY0Ek0NUgCSCk+xBHPFBisc80BBghCa0AAOw=='; + this.loader = 'data:image/gif;base64,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'; + RESConsoleTopBar.innerHTML = '

Reddit Enhancement Suite Console

'; + RESConsoleHeader.appendChild(RESConsoleTopBar); + this.RESCheckUpdateButton = createElementWithID('div','RESCheckForUpdate'); + this.RESCheckUpdateButton.innerHTML = 'v' + RESVersion + ' [check for update]'; + this.RESCheckUpdateButton.addEventListener('click',function(e) { + RESUtils.checkForUpdate(true); + }, true); + RESConsoleTopBar.appendChild(this.RESCheckUpdateButton); + RESSubredditLink = createElementWithID('a','RESConsoleSubredditLink'); + RESSubredditLink.innerHTML = '/r/Enhancement'; + RESSubredditLink.setAttribute('href','http://reddit.com/r/Enhancement'); + RESSubredditLink.setAttribute('alt','The RES Subreddit'); + RESConsoleTopBar.appendChild(RESSubredditLink); + // create the close button and place it in the header + RESClose = createElementWithID('span', 'RESClose'); + RESClose.innerHTML = ' '; + RESClose.addEventListener('click',function(e) { + e.preventDefault(); + RESConsole.close(); + }, true); + RESConsoleTopBar.appendChild(RESClose); + // create the help button and place it in the header + RESHelp = createElementWithID('span', 'RESHelp'); + RESHelp.innerHTML = ' '; + RESHelp.addEventListener('click',function(e) { + e.preventDefault(); + modules['RESTips'].randomTip(); + }, true); + RESConsoleTopBar.appendChild(RESHelp); + if (localStorage.getItem('RESoutdated') == 'true') { + var RESOutdated = document.createElement('div'); + RESOutdated.setAttribute('class','outdated'); + RESOutdated.innerHTML = 'There is a new version of RES! click to grab it'; + RESConsoleTopBar.appendChild(RESOutdated); + } + // create the menu + var menuItems = new Array('Enable Modules','Configure Modules','About RES'); + if (localStorage.getItem('RESPro')) { + menuItems[menuItems.length] = 'RES Pro'; + } + RESMenu = createElementWithID('ul', 'RESMenu'); + for (i in menuItems) { + thisMenuItem = document.createElement('li'); + thisMenuItem.innerHTML = menuItems[i]; + thisMenuItem.setAttribute('id', 'Menu-' + menuItems[i]); + thisMenuItem.addEventListener('click', function(e) { + e.preventDefault(); + RESConsole.menuClick(this); + }, true); + RESMenu.appendChild(thisMenuItem); + } + RESConsoleHeader.appendChild(RESMenu); + RESConsoleContainer.appendChild(RESConsoleHeader); + // Store the menu items in a global variable for easy access by the menu selector function. + RESMenuItems = RESMenu.querySelectorAll('li'); + // Create a container for each management panel + RESConsoleContent = createElementWithID('div', 'RSSConsoleContent'); + RESConsoleContainer.appendChild(RESConsoleContent); + this.drawModulesPanel(); + // Draw the config panel + this.drawConfigPanel(); + // Draw the about panel + this.drawAboutPanel(); + if (localStorage.getItem('RESPro')) { + // Draw the Pro panel + this.drawProPanel(); + } + // Set an easily accessible array of the panels so we can show/hide them as necessary. + RESConsolePanels = RESConsoleContent.querySelectorAll('div'); + // Okay, the console is done. Add it to the document body. + document.body.appendChild(RESConsoleContainer); + }, + drawModulesPanel: function() { + // Create the module management panel (toggle modules on/off) + RESConsoleModulesPanel = this.RESConsoleModulesPanel; + RESConsoleModulesPanel.innerHTML = ''; + var prefs = this.getAllModulePrefs(); + var modulesPanelHTML = ''; + for (i in modules) { + (prefs[i]) ? thisChecked = 'CHECKED' : thisChecked = ''; + if (typeof(modules[i]) != 'undefined') { + thisDesc = modules[i].description; + modulesPanelHTML += '

'+thisDesc+'

'; + } + } + RESConsoleModulesPanel.innerHTML = modulesPanelHTML; + var RESConsoleModulesPanelButtons = createElementWithID('span','RESConsoleModulesPanelButtons'); + var RESSavePrefsButton = createElementWithID('input','savePrefs'); + RESSavePrefsButton.setAttribute('type','button'); + RESSavePrefsButton.setAttribute('name','savePrefs'); + RESSavePrefsButton.setAttribute('value','save'); + RESSavePrefsButton.addEventListener('click', function(e) { + e.preventDefault(); + var modulePrefsCheckboxes = RESConsole.RESConsoleModulesPanel.querySelectorAll('input[type=checkbox]'); + var prefs = {}; + for (i=0, len=modulePrefsCheckboxes.length;i 0) { + this.keyCodeModal = createElementWithID('div','keyCodeModal'); + this.keyCodeModal.innerHTML = 'Press a key (or combination with shift, alt and/or ctrl) to assign this action.'; + document.body.appendChild(this.keyCodeModal); + for (var i=0, len=keyCodeInputs.length;i= 0)) { + var tempArray = inputs[i].value.split(','); + // convert the internal values of this array into their respective types (int, bool, bool, bool) + var optionValue = Array(parseInt(tempArray[0]), (tempArray[1] == 'true'), (tempArray[2] == 'true'), (tempArray[3] == 'true'), (tempArray[4] == 'true')); + } else { + var optionValue = inputs[i].value; + } + } + if (typeof(optionValue) != 'undefined') { + RESUtils.setOption(moduleID, optionName, optionValue); + } + } + } + // Check if there are any tables of options on this panel... + var optionsTables = panelOptionsDiv.querySelectorAll('.optionsTable'); + if (typeof(optionsTables) != 'undefined') { + // For each table, we need to go through each row in the tbody, and then go through each option and make a multidimensional array. + // For example, something like: [['foo','bar','baz'],['pants','warez','cats']] + for (i=0, len=optionsTables.length;i= 0)) { + var tempArray = inputs[k].value.split(','); + // convert the internal values of this array into their respective types (int, bool, bool, bool) + var optionValue = Array(parseInt(tempArray[0]), (tempArray[1] == 'true'), (tempArray[2] == 'true'), (tempArray[3] == 'true')); + } else { + var optionValue = inputs[k].value; + } + } + if (optionValue != '') { + notAllBlank = true; + } + optionRow[k] = optionValue; + } + if (notAllBlank) { + optionMulti[j] = optionRow; + } + } + if (optionMulti == null) { + optionMulti = []; + } + // ok, we've got all the rows... set the option. + if (typeof(optionValue) != 'undefined') { + RESUtils.setOption(moduleID, optionName, optionMulti); + } + } + } + } + + var statusEle = document.getElementById('moduleOptionsSaveStatus'); + statusEle.innerHTML = 'Options have been saved...'; + statusEle.setAttribute('style','display: block; opacity: 1'); + RESUtils.fadeElementOut(statusEle, 0.1) + }, true); + RESConfigPanelOptions.appendChild(thisSaveButton); + var thisSaveStatus = createElementWithID('div','moduleOptionsSaveStatus','saveStatus'); + RESConfigPanelOptions.appendChild(thisSaveStatus); + if (optCount == 0) { + RESConfigPanelOptions.innerHTML = 'There are no configurable options for this module'; + } + }, + drawAboutPanel: function() { + RESConsoleAboutPanel = createElementWithID('div', 'RESConsoleAboutPanel', 'RESPanel'); + var AboutPanelHTML = ' \ +

Author: honestbleeps

\ +

Description: Reddit Enhancement Suite is a collection of modules that make browsing reddit a bit nicer.

\ +

It\'s built with an API that allows you to contribute and include your own modules!

\ +

If you\'ve got bug reports, you\'d like to discuss RES, or you\'d like to converse with other users, please see the Enhancement subreddit.

\ +

If you want to contact me directly with suggestions, bug reports or just want to say you appreciate the work, an email would be great.

\ +

If you really, really like the work, a donation would be much appreciated.

\ +

\ +

\ +

\ +

Note: Reddit Enhancement Suite will check, at most once a day, to see if a new version is available. No data about you is sent to me nor is it stored.

\ + ' + RESConsoleAboutPanel.innerHTML = AboutPanelHTML; + RESConsoleContent.appendChild(RESConsoleAboutPanel); + }, + drawProPanel: function() { + RESConsoleProPanel = createElementWithID('div', 'RESConsoleProPanel', 'RESPanel'); + var ProPanelHTML = ' \ + Pro stuff will go here. \ + '; + RESConsoleProPanel.innerHTML = ProPanelHTML; + RESConsoleContent.appendChild(RESConsoleProPanel); + }, + open: function() { + // hide the ad-frame div in case it's flash, because then it covers up the settings console and makes it impossible to see the save button! + var adFrame = document.getElementById('ad-frame'); + if ((typeof(adFrame) != 'undefined') && (adFrame != null)) { + adFrame.style.display = 'none'; + } + var leftCentered = Math.floor((window.innerWidth - 720) / 2); + modalOverlay.setAttribute('style','display: block; height: ' + document.documentElement.scrollHeight + 'px'); + RESConsoleContainer.setAttribute('style','display: block; left: ' + leftCentered + 'px'); + RESConsole.menuClick(RESMenuItems[0]); + }, + close: function() { + // Let's be nice to reddit and put their ad frame back now... + var adFrame = document.getElementById('ad-frame'); + if ((typeof(adFrame) != 'undefined') && (adFrame != null)) { + adFrame.style.display = 'block'; + } + modalOverlay.setAttribute('style','display: none;'); + RESConsoleContainer.setAttribute('style','display: none;'); + // just in case the user was in the middle of setting a key and decided to close the dialog, clean that up. + if (typeof(RESConsole.keyCodeModal) != 'undefined') { + RESConsole.keyCodeModal.style.display = 'none'; + RESConsole.captureKey = false; + } + }, + menuClick: function(obj) { + objID = obj.getAttribute('id') + // make all menu items look unselected + for (i in RESMenuItems) { + if (i == 'length') break; + RESMenuItems[i].setAttribute('style', 'background-color: #ffffff'); + } + // make selected menu item look selected + obj.setAttribute('style', 'background-color: #dddddd'); + // hide all console panels + for (i in RESConsolePanels) { + // bug in chrome, barfs on for i in loops with queryselectorall... + if (i == 'length') break; + RESConsolePanels[i].setAttribute('style', 'display: none'); + } + switch(objID) { + case 'Menu-Enable Modules': + // show the modules panel + RESConsoleModulesPanel.setAttribute('style', 'display: block'); + break; + case 'Menu-Configure Modules': + // show the config panel + this.RESConfigPanelSelector.selectedIndex = 0; + RESConsoleConfigPanel.setAttribute('style', 'display: block'); + break; + case 'Menu-About RES': + // show the about panel + RESConsoleAboutPanel.setAttribute('style', 'display: block'); + break; + case 'Menu-RES Pro': + // show the pro panel + RESConsoleProPanel.setAttribute('style', 'display: block'); + break; + default: + alert('err, what just happened here? I do not recognize that menu item.'); + break; + } + }, +}; + +// DOM utility functions +function insertAfter( referenceNode, newNode ) { + if ((typeof(referenceNode) == 'undefined') || (referenceNode == null)) { + console.log(arguments.callee.caller); + } else if ((typeof(referenceNode.parentNode) != 'undefined') && (typeof(referenceNode.nextSibling) != 'undefined')) { + referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling ); + } +}; +function createElementWithID(elementType, id, classname) { + obj = document.createElement(elementType); + if (id != null) { + obj.setAttribute('id', id); + } + if ((typeof(classname) != 'undefined') && (classname != '')) { + obj.setAttribute('class', classname); + } + return obj; +}; + +/************************************************************************************************************ + +Creating your own module: + +Modules must have the following format, with required functions: +- moduleID - the name of the module, i.e. myModule +- moduleName - a "nice name" for your module... +- description - for the config panel, explains what the module is +- isEnabled - should always return RESConsole.getModulePrefs('moduleID') - where moduleID is your module name. +- isMatchURL - should always return RESUtils.isMatchURL('moduleID') - checks your include and exclude URL matches. +- include - an array of regexes to match against location.href (basically like include in GM) +- exclude (optional) - an array of regexes to exclude against location.href +- go - always checks both if isEnabled() and if RESUtils.isMatchURL(), and if so, runs your main code. + +modules['myModule'] = { + moduleID: 'myModule', + moduleName: 'my module', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + defaultMessage: { + type: 'text', + value: 'this is default text', + description: 'explanation of what this option is for' + }, + doSpecialStuff: { + type: 'boolean', + value: false, + description: 'explanation of what this option is for' + } + }, + description: 'This is my module!', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/user\/[-\w\.]+/i, + /http:\/\/www.reddit.com\/message\/comments\/[-\w\.]+/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + } + } +}; // note: you NEED this semicolon at the end! + +************************************************************************************************************/ + + +modules['subRedditTagger'] = { + moduleID: 'subRedditTagger', + moduleName: 'Subreddit Tagger', + options: { + subReddits: { + type: 'table', + fields: [ + { name: 'subreddit', type: 'text' }, + { name: 'doesntContain', type: 'text' }, + { name: 'tag', type: 'text' } + ], + value: [ + /* + ['somebodymakethis','SMT','[SMT]'], + ['pics','pic','[pic]'] + */ + ], + description: 'Set your subreddits below. For that subreddit, if the title of the post doesn\'t contain what you place in the "doesn\'t contain" field, the subreddit will be tagged with whatever you specify.' + } + }, + description: 'Adds tags to posts on subreddits (i.e. [SMT] on SomebodyMakeThis when the user leaves it out)', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: new Array( + /http:\/\/www.reddit.com\/[\?]*/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + this.checkForOldSettings(); + this.SRTDoesntContain = new Array(); + this.SRTTagWith = new Array(); + this.loadSRTRules(); + + document.body.addEventListener('DOMNodeInserted', function(event) { + if ((event.target.tagName == 'DIV') && (event.target.getAttribute('id') == 'siteTable')) { + modules['subRedditTagger'].scanTitles(); + } + }, true); + this.scanTitles(); + + } + }, + loadSRTRules: function () { + var subReddits = this.options.subReddits.value; + for (var i=0, len=subReddits.length; i .thing > DIV.entry'); + for (var i=0, len=entries.length; i 0) { + RESUtils.setOption('subRedditTagger', 'subReddits', settingsCopy); + } + } + +}; + + +modules['uppersAndDowners'] = { + moduleID: 'uppersAndDowners', + moduleName: 'Uppers and Downers Enhanced', + options: { + showSigns: { + type: 'boolean', + value: false, + description: 'Show +/- signs next to upvote/downvote tallies.' + } + }, + description: 'Displays up/down vote counts on comments.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/user\/[-\w\.]+/i, + /http:\/\/www.reddit.com\/[-\w\.\/]+\/comments\/[-\w\.]+/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + this.commentsWithMoos = Array(); + this.moreCommentsIDs = Array(); + this.applyUppersAndDowners(); + /* having trouble figuring out what to do with top level comments. this will have to wait. + var moreComments = document.querySelectorAll('.morecomments'); + for (var i=0, len=moreComments.length; i 0) { + this.activeIndex = localStorage.getItem('RESmodules.keyboardNavLastIndex.'+location.href); + } else { + this.activeIndex = 0; + } + if (localStorage.getItem('RESmodules.keyboardNavLastIndex.'+location.href) >= this.keyboardLinks.length) { + this.activeIndex = 0; + } + this.keyFocus(this.keyboardLinks[this.activeIndex]); + } + } + break; + case 'comments': + // get all links into an array... + this.keyboardLinks = document.body.querySelectorAll('#siteTable .entry, div.content > div.commentarea .entry'); + this.activeIndex = 0; + this.keyFocus(this.keyboardLinks[0]); + break; + case 'inbox': + var siteTable = document.querySelector('#siteTable'); + if (siteTable) { + this.keyboardLinks = siteTable.querySelectorAll('.entry'); + this.activeIndex = 0; + this.keyFocus(this.keyboardLinks[this.activeIndex]); + } + break; + } + // wire up keyboard links for mouse clicky selecty goodness... + if ((typeof(this.keyboardLinks) != 'undefined') && (this.options.clickFocus.value)) { + for (var i=0, len=this.keyboardLinks.length;i span > a'); + RESUtils.click(hideLink); + }, + followSubreddit: function() { + // find the subreddit link and click it... + var srLink = this.keyboardLinks[this.activeIndex].querySelector('A.subreddit'); + var thisHREF = srLink.getAttribute('href'); + location.href = thisHREF; + }, + moveUp: function() { + if (this.activeIndex > 0) { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + this.activeIndex--; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + // skip over hidden elements... + while ((thisXY.x == 0) && (thisXY.y == 0) && (this.activeIndex > 0)) { + this.activeIndex--; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + } + this.keyFocus(this.keyboardLinks[this.activeIndex]); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + } + }, + moveDown: function() { + if (this.activeIndex < this.keyboardLinks.length-1) { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + this.activeIndex++; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + // skip over hidden elements... + while ((thisXY.x == 0) && (thisXY.y == 0) && (this.activeIndex < this.keyboardLinks.length-1)) { + this.activeIndex++; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + } + this.keyFocus(this.keyboardLinks[this.activeIndex]); + // console.log('xy: ' + RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]).toSource()); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + } + }, + moveTop: function() { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + this.activeIndex = 0; + this.keyFocus(this.keyboardLinks[this.activeIndex]); + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + }, + moveBottom: function() { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + this.activeIndex = this.keyboardLinks.length-1; + this.keyFocus(this.keyboardLinks[this.activeIndex]); + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + }, + moveDownSibling: function() { + if (this.activeIndex < this.keyboardLinks.length-1) { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + var thisParent = this.keyboardLinks[this.activeIndex].parentNode; + var childCount = thisParent.querySelectorAll('.entry').length; + this.activeIndex += childCount; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + // skip over hidden elements... + while ((thisXY.x == 0) && (thisXY.y == 0) && (this.activeIndex < this.keyboardLinks.length-1)) { + this.activeIndex++; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + } + if (this.pageType == 'linklist') localStorage.setItem('RESmodules.keyboardNavLastIndex.'+location.href, this.activeIndex); + this.keyFocus(this.keyboardLinks[this.activeIndex]); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + } + }, + moveUpSibling: function() { + if (this.activeIndex < this.keyboardLinks.length-1) { + this.keyUnfocus(this.keyboardLinks[this.activeIndex]); + var thisParent = this.keyboardLinks[this.activeIndex].parentNode; + if (thisParent.previousSibling != null) { + var childCount = thisParent.previousSibling.previousSibling.querySelectorAll('.entry').length; + } else { + var childCount = 1; + } + this.activeIndex -= childCount; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + while ((thisXY.x == 0) && (thisXY.y == 0) && (this.activeIndex < this.keyboardLinks.length-1)) { + this.activeIndex++; + thisXY=RESUtils.getXYpos(this.keyboardLinks[this.activeIndex]); + } + if (this.pageType == 'linklist') localStorage.setItem('RESmodules.keyboardNavLastIndex.'+location.href, this.activeIndex); + this.keyFocus(this.keyboardLinks[this.activeIndex]); + if (!(RESUtils.elementInViewport(this.keyboardLinks[this.activeIndex]))) { + window.scrollTo(0,thisXY.y); + } + } + }, + toggleChildren: function() { + if (this.activeIndex == 0) { + // Ahh, we're not in a comment, but in the main story... that key should follow the link. + this.followLink(); + } else { + // find out if this is a collapsed or uncollapsed view... + var thisCollapsed = this.keyboardLinks[this.activeIndex].querySelector('div.collapsed'); + var thisNonCollapsed = this.keyboardLinks[this.activeIndex].querySelector('div.noncollapsed'); + if (thisCollapsed.style.display != 'none') { + thisToggle = thisCollapsed.querySelector('a.expand'); + } else { + // check if this is a "show more comments" box, or just contracted content... + moreComments = thisNonCollapsed.querySelector('span.morecomments > a'); + if (moreComments) { + thisToggle = moreComments; + } else { + thisToggle = thisNonCollapsed.querySelector('a.expand'); + } + } + RESUtils.click(thisToggle); + } + }, + followLink: function(newWindow) { + var thisA = this.keyboardLinks[this.activeIndex].querySelector('a.title'); + var thisHREF = thisA.getAttribute('href'); + // console.log(thisA); + if (newWindow) { + if (typeof(chrome) != 'undefined') { + thisJSON = { + requestType: 'keyboardNav', + linkURL: thisHREF + } + chrome.extension.sendRequest(thisJSON, function(response) { + // send message to background.html to open new tabs... + return true; + }); + } else if (typeof(safari) != 'undefined') { + thisJSON = { + requestType: 'keyboardNav', + linkURL: thisHREF + } + safari.self.tab.dispatchMessage("keyboardNav", thisJSON); + } else { + window.open(thisHREF); + } + } else { + location.href = thisHREF; + } + }, + followComments: function(newWindow) { + var thisA = this.keyboardLinks[this.activeIndex].querySelector('a.comments'); + var thisHREF = thisA.getAttribute('href'); + if (newWindow) { + if (typeof(chrome) != 'undefined') { + thisJSON = { + requestType: 'keyboardNav', + linkURL: thisHREF + } + chrome.extension.sendRequest(thisJSON, function(response) { + // send message to background.html to open new tabs... + return true; + }); + } else if (typeof(safari) != 'undefined') { + thisJSON = { + requestType: 'keyboardNav', + linkURL: thisHREF + } + safari.self.tab.dispatchMessage("keyboardNav", thisJSON); + } else { + window.open(thisHREF); + } + } else { + location.href = thisHREF; + } + }, + followLinkAndComments: function(background) { + // find the [l+c] link and click it... + var lcLink = this.keyboardLinks[this.activeIndex].querySelector('.redditSingleClick'); + RESUtils.click(lcLink, background); + }, + upVote: function() { + if (this.keyboardLinks[this.activeIndex].previousSibling.tagName == 'A') { + var upVoteButton = this.keyboardLinks[this.activeIndex].previousSibling.previousSibling.querySelector('div.up') || this.keyboardLinks[this.activeIndex].previousSibling.previousSibling.querySelector('div.upmod'); + } else { + var upVoteButton = this.keyboardLinks[this.activeIndex].previousSibling.querySelector('div.up') || this.keyboardLinks[this.activeIndex].previousSibling.querySelector('div.upmod'); + } + RESUtils.click(upVoteButton); + }, + downVote: function() { + if (this.keyboardLinks[this.activeIndex].previousSibling.tagName == 'A') { + var downVoteButton = this.keyboardLinks[this.activeIndex].previousSibling.previousSibling.querySelector('div.down') || this.keyboardLinks[this.activeIndex].previousSibling.previousSibling.querySelector('div.downmod'); + } else { + var downVoteButton = this.keyboardLinks[this.activeIndex].previousSibling.querySelector('div.down') || this.keyboardLinks[this.activeIndex].previousSibling.querySelector('div.downmod'); + } + RESUtils.click(downVoteButton); + }, + saveLink: function() { + var saveLink = this.keyboardLinks[this.activeIndex].querySelector('form.save-button > span > a'); + RESUtils.click(saveLink); + }, + reply: function() { + // activeIndex = 0 means we're at the original post, not a comment + if ((this.activeIndex > 0) || (RESUtils.pageType() != 'comments')) { + var commentButtons = this.keyboardLinks[this.activeIndex].querySelectorAll('ul.buttons > li > a'); + for (var i=0, len=commentButtons.length;i li > a.comments'); + location.href = commentButton.getAttribute('href'); + } else { + var firstCommentBox = document.querySelector('.commentarea textarea[name=text]'); + firstCommentBox.focus(); + } + } + }, + inbox: function() { + location.href = 'http://www.reddit.com/message/inbox/'; + }, + frontPage: function() { + location.href = 'http://www.reddit.com/'; + }, + nextPage: function() { + // if Never Ending Reddit is enabled, just scroll to the bottom. Otherwise, click the 'next' link. + if (modules['neverEndingReddit'].isEnabled()) { + this.moveBottom(); + } else { + // get the first link to the next page of reddit... + var nextPrevLinks = document.body.querySelectorAll('.content .nextprev a'); + if (nextPrevLinks.length > 0) { + var nextLink = nextPrevLinks[nextPrevLinks.length-1]; + // RESUtils.click(nextLink); + location.href = nextLink.getAttribute('href'); + } + } + }, + prevPage: function() { + // if Never Ending Reddit is enabled, do nothing. Otherwise, click the 'prev' link. + if (modules['neverEndingReddit'].isEnabled()) { + return false; + } else { + // get the first link to the next page of reddit... + var nextPrevLinks = document.body.querySelectorAll('.content .nextprev a'); + if (nextPrevLinks.length > 0) { + var prevLink = nextPrevLinks[0]; + // RESUtils.click(prevLink); + location.href = prevLink.getAttribute('href'); + } + } + }, + commentLink: function(num) { + if (this.options.commentsLinkNumbers.value) { + var links = this.keyboardLinks[this.activeIndex].querySelectorAll('div.md a'); + if (typeof(links[num]) != 'undefined') { + RESUtils.click(links[num]); + } + } + } +}; + +// user tagger functions +modules['userTagger'] = { + moduleID: 'userTagger', + moduleName: 'User Tagger', + options: { + defaultMark: { + type: 'text', + value: '_', + description: 'clickable mark for users with no tag' + }, + hardIgnore: { + type: 'boolean', + value: false, + description: 'If "hard ignore" is off, only post titles and comment text is hidden. If it is on, the entire block is hidden - note that this would make it difficult/impossible for you to unignore a person.' + }, + colorUser: { + type: 'boolean', + value: true, + description: 'Color users based on cumulative upvotes / downvotes' + }, + hoverInfo: { + type: 'boolean', + value: true, + description: 'Show information on user (karma, how long they\'ve been a redditor) on hover.' + }, + hoverDelay: { + type: 'text', + value: 400, + description: 'Delay, in milliseconds, before hover tooltip loads. Default is 400.' + }, + fadeDelay: { + type: 'text', + value: 200, + description: 'Delay, in milliseconds, before hover tooltip fades away. Default is 200.' + }, + USDateFormat: { + type: 'boolean', + value: false, + description: 'Show date (redditor since...) in US format (i.e. 08-31-2010)' + } + }, + description: 'Adds a great deal of customization around users - tagging them, ignoring them, and more.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + include: new Array( + /^https?:\/\/([-\w\.]+\.)?reddit\.com\/[-\w\.]*/i + ), + exclude: new Array( + /^http:\/\/www\.reddit\.com\/prefs\//i + ), + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // set up an array to cache user data + this.authorInfoCache = Array(); + if (this.options.colorUser.value) { + // add an event listener to vote buttons... + var voteButtons = document.body.querySelectorAll('.arrow'); + for (var i=0, len=voteButtons.length;i'+color+''; + } + thisHTML += '
'; + thisHTML += ' '; + this.userTaggerToolTip.innerHTML = thisHTML; + userTaggerSave = createElementWithID('input', 'userTaggerSave'); + userTaggerSave.setAttribute('type','button'); + userTaggerSave.setAttribute('value','Save'); + this.userTaggerToolTip.appendChild(userTaggerSave); + userTaggerSave.addEventListener('click',function(e) { + var thisName = document.getElementById('userTaggerName').value; + var thisTag = document.getElementById('userTaggerTag').value; + var thisColor = document.getElementById('userTaggerColor').value; + var thisIgnore = document.getElementById('userTaggerIgnore').checked; + modules['userTagger'].setUserTag(thisName, thisTag, thisColor, thisIgnore); + }, true); + document.body.appendChild(this.userTaggerToolTip); + if (this.options.hoverInfo.value) { + this.authorInfoToolTip = createElementWithID('div','authorInfoToolTip'); + this.authorInfoToolTip.addEventListener('mouseover', function(e) { + if (typeof(modules['userTagger'].hideTimer) != 'undefined') { + clearTimeout(modules['userTagger'].hideTimer); + } + }, false); + this.authorInfoToolTip.addEventListener('mouseout', function(e) { + if (e.target.getAttribute('class') != 'hoverAuthor') { + modules['userTagger'].hideTimer = setTimeout(function() { + modules['userTagger'].hideAuthorInfo(); + }, modules['userTagger'].options.fadeDelay.value); + } + }, false); + document.body.appendChild(this.authorInfoToolTip); + } + document.getElementById('userTaggerTag').addEventListener('keydown', function(e) { + if (e.keyCode == 27) { + // close prompt. + modules['userTagger'].closeUserTagPrompt(); + } + }, true); + //console.log('before applytags: ' + Date()); + this.applyTags(); + //console.log('after applytags: ' + Date()); + // listen for new DOM nodes so that modules like autopager, river of reddit, etc still get user tags + document.body.addEventListener('DOMNodeInserted', function(event) { + if ((event.target.tagName == 'DIV') && (event.target.getAttribute('id') == 'siteTable')) { + modules['userTagger'].applyTags(); + } + }, true); + var userpagere = new RegExp(/http:\/\/www.reddit.com\/user\/[-\w\.]+\/?/i); + if (userpagere.test(location.href)) { + var friendButton = document.querySelector('.titlebox .fancy-toggle-button'); + if ((typeof(friendButton) != 'undefined') && (friendButton != null)) { + var firstAuthor = document.querySelector('a.author'); + if (typeof(firstAuthor) != 'undefined') { + var thisFriendComment = firstAuthor.getAttribute('title'); + (thisFriendComment != null) ? thisFriendComment = thisFriendComment.substring(8,thisFriendComment.length-1) : thisFriendComment = ''; + } else { + var thisFriendComment = ''; + } + var benefitsForm = document.createElement('div'); + var thisUser = document.querySelector('.titlebox > h1').innerHTML; + benefitsForm.innerHTML = '
'; + insertAfter( friendButton, benefitsForm ); + } + } + } + }, + bgToTextColorMap: { + 'none':'black', + 'aqua':'black', + 'black':'white', + 'blue':'white', + 'fuchsia':'white', + 'gray':'white', + 'green':'white', + 'lime':'black', + 'maroon':'white', + 'navy':'white', + 'olive':'black', + 'orange':'black', + 'purple':'white', + 'red':'black', + 'silver':'black', + 'teal':'white', + 'white':'black', + 'yellow':'black' + }, + openUserTagPrompt: function(obj, username) { + thisXY=RESUtils.getXYpos(obj); + this.clickedTag = obj; + document.getElementById('userTaggerName').value = username; + document.getElementById('userTaggerTag').value = localStorage.getItem('reddituser.tag.'+username); + if (localStorage.getItem('reddituser.ignore.'+username)) { + document.getElementById('userTaggerIgnore').checked = true; + } + RESUtils.setSelectValue(document.getElementById('userTaggerColor'), localStorage.getItem('reddituser.color.'+username)); + this.userTaggerToolTip.setAttribute('style', 'display: block; top: ' + thisXY.y + 'px; left: ' + thisXY.x + 'px;'); + document.getElementById('userTaggerTag').focus(); + return false; + }, + closeUserTagPrompt: function() { + this.userTaggerToolTip.setAttribute('style','display: none'); + }, + setUserTag: function(username, tag, color, ignore) { + if ((tag != null) && (tag != '')) { + localStorage.setItem('reddituser.tag.'+username, tag); + localStorage.setItem('reddituser.color.'+username, color); + this.clickedTag.setAttribute('style', 'background-color: '+color+'; color: ' + this.bgToTextColorMap[color]); + this.clickedTag.innerHTML = tag; + } else { + localStorage.removeItem('reddituser.tag.'+username); + localStorage.removeItem('reddituser.color.'+username); + this.clickedTag.setAttribute('style', 'background-color: none'); + this.clickedTag.innerHTML = this.options.defaultMark.value; + } + if (ignore) { + localStorage.setItem('reddituser.ignore.'+username, true); + } else { + localStorage.removeItem('reddituser.ignore.'+username, true); + } + this.closeUserTagPrompt(); + }, + applyTags: function() { + this.authors = document.querySelectorAll('.noncollapsed a.author, p.tagline a.author'); + this.authorCount = this.authors.length; + this.authori = 0; + (function(){ + modules['userTagger'].authorCount; + var chunkLength = Math.min((modules['userTagger'].authorCount - modules['userTagger'].authori), 15); + for (var i=0;i 0) { + red = Math.max(0, (255-(8*votes))); + green = 255; + blue = Math.max(0, (255-(8*votes))); + } else if (votes < 0) { + red = 255; + green = Math.max(0, (255-Math.abs(8*votes))); + blue = Math.max(0, (255-Math.abs(8*votes))); + voteString = ''; + } + voteString = voteString + votes; + var rgb='rgb('+red+','+green+','+blue+')'; + if (obj != null) { + if (votes == 0) { + obj.style.display = 'none'; + } else { + obj.style.display = 'inline'; + obj.style.backgroundColor = rgb; + obj.setAttribute('title','your votes for '+author+': '+voteString); + } + } + } + }, + showAuthorInfo: function(obj) { + thisXY=RESUtils.getXYpos(obj); + this.authorInfoToolTip.innerHTML = ''+obj.text+':
loading...'; + this.authorInfoToolTip.setAttribute('style', 'top: ' + (thisXY.y - 10) + 'px; left: ' + (thisXY.x - 10) + 'px;'); + RESUtils.fadeElementIn(this.authorInfoToolTip, 0.3); + var thisUserName = obj.text; + if (typeof(this.authorInfoCache[thisUserName]) != 'undefined') { + this.writeAuthorInfo(this.authorInfoCache[thisUserName]); + } else { + GM_xmlhttpRequest({ + method: "GET", + url: "http://www.reddit.com/user/" + thisUserName + "/about.json", + onload: function(response) { + var thisResponse = JSON.parse(response.responseText); + modules['userTagger'].authorInfoCache[thisUserName] = thisResponse; + modules['userTagger'].writeAuthorInfo(thisResponse); + } + }); + } + }, + writeAuthorInfo: function(jsonData) { + var utctime = jsonData.data.created; + var d = new Date(utctime*1000); + var userHTML = ''+jsonData.data.name+':'; + userHTML += '
Link Karma: ' + jsonData.data.link_karma; + userHTML += '
Comment Karma: ' + jsonData.data.comment_karma; + userHTML += '
Redditor since: ' + RESUtils.niceDate(d, this.options.USDateFormat.value) + '
('+RESUtils.niceDateDiff(d)+')'; + this.authorInfoToolTip.innerHTML = userHTML; + }, + hideAuthorInfo: function(obj) { + // this.authorInfoToolTip.setAttribute('style', 'display: none'); + RESUtils.fadeElementOut(this.authorInfoToolTip, 0.3); + } +}; +// full comments linker +modules['commentsLinker'] = { + moduleID: 'commentsLinker', + moduleName: 'Full Comments Linker', + options: { + fullCommentsText: { + type: 'text', + value: 'full comments', + description: 'text of full comments link' + } + }, + description: 'Adds a link to a post\'s full comments page beyond just \'context\', etc.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/user\/[-\w\.]+\/?/i, + /http:\/\/www.reddit.com\/message\/[-\w\.]*\/?/i, + /http:\/\/www.reddit.com\/message\/comments\/[-\w\.]+/i + ), + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + var entries = document.querySelectorAll('#siteTable .entry'); + + for (var i=0, len=entries.length; i'+ this.options.fullCommentsText.value +''; + linkList.appendChild(fullCommentsLink); + } + } + } + } +}; + +modules['singleClick'] = { + moduleID: 'singleClick', + moduleName: 'Single Click Opener', + options: { + openOrder: { + type: 'enum', + values: [ + { name: 'open comments then link', value: 'commentsfirst' }, + { name: 'open link then comments', value: 'linkfirst' } + ], + value: 'commentsfirst', + description: 'What order to open the link/comments in.' + }, + hideLEC: { + type: 'boolean', + value: false, + description: 'Hide the [l=c] when the link is the same as the comments page' + } + }, + description: 'Adds an [l+c] link that opens a link and the comments page in new tabs for you in one click.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + isURLMatch: function() { + + }, + include: new Array( + /http:\/\/www.reddit.com\/[\?]*/i, + /http:\/\/www.reddit.com\/r\/[-\w\._]*\//i + ), + exclude: new Array( + /http:\/\/www.reddit.com\/r\/[-\w\._\/\?]*\/comments[-\w\._\/\?=]*/i + ), + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff here! + this.applyLinks(); + // listen for new DOM nodes so that modules like autopager, river of reddit, etc still get l+c links... + document.body.addEventListener('DOMNodeInserted', function(event) { + if ((event.target.tagName == 'DIV') && (event.target.getAttribute('id') == 'siteTable')) { + modules['singleClick'].applyLinks(); + } + }, true); + } + }, + applyLinks: function() { + var entries = document.querySelectorAll('#siteTable .entry'); + for (var i=0, len=entries.length; i + // + // Redistributable under a BSD-style open source license. + // See license.txt for more information. + // + // The full source distribution is at: + // + // A A L + // T C A + // T K B + // + // + // + + // + // Wherever possible, Showdown is a straight, line-by-line port + // of the Perl version of Markdown. + // + // This is not a normal parser design; it's basically just a + // series of string substitutions. It's hard to read and + // maintain this way, but keeping Showdown close to the original + // design makes it easier to port new features. + // + // More importantly, Showdown behaves like markdown.pl in most + // edge cases. So web applications can do client-side preview + // in Javascript, and then build identical HTML on the server. + // + // This port needs the new RegExp functionality of ECMA 262, + // 3rd Edition (i.e. Javascript 1.5). Most modern web browsers + // should do fine. Even with the new regular expression features, + // We do a lot of work to emulate Perl's regex functionality. + // The tricky changes in this file mostly have the "attacklab:" + // label. Major or self-explanatory changes don't. + // + // Smart diff tools like Araxis Merge will be able to match up + // this file with markdown.pl in a useful way. A little tweaking + // helps: in a copy of markdown.pl, replace "#" with "//" and + // replace "$text" with "text". Be sure to ignore whitespace + // and line endings. + // + + + // + // Showdown usage: + // + // var text = "Markdown *rocks*."; + // + // var converter = new Showdown.converter(); + // var html = converter.makeHtml(text); + // + // alert(html); + // + // Note: move the sample code to the bottom of this + // file before uncommenting it. + // + + + // + // Showdown namespace + // + var Showdown = {}; + + // + // converter + // + // Wraps all "globals" so that the only thing + // exposed is makeHtml(). + // + Showdown.converter = function() { + + // + // Globals: + // + + // Global hashes, used by various utility routines + var g_urls; + var g_titles; + var g_html_blocks; + + // Used to track when we're inside an ordered or unordered list + // (see _ProcessListItems() for details): + var g_list_level = 0; + + + this.makeHtml = function(text) { + // + // Main function. The order in which other subs are called here is + // essential. Link and image substitutions need to happen before + // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the + // and tags get encoded. + // + + // Clear the global hashes. If we don't clear these, you get conflicts + // from other articles when generating a page which contains more than + // one article (e.g. an index page that shows the N most recent + // articles): + g_urls = new Array(); + g_titles = new Array(); + g_html_blocks = new Array(); + + // Replace < with < and > with > + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(//g,">"); + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g,"~T"); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g,"~D"); + + // Standardize line endings + text = text.replace(/\r\n/g,"\n"); // DOS to Unix + text = text.replace(/\r/g,"\n"); // Mac to Unix + + // Make sure text begins and ends with a couple of newlines: + text = "\n\n" + text + "\n\n"; + + // Convert all tabs to spaces. + text = _Detab(text); + + // Strip any lines consisting only of spaces and tabs. + // This makes subsequent regexen easier to write, because we can + // match consecutive blank lines with /\n+/ instead of something + // contorted like /[ \t]*\n+/ . + text = text.replace(/^[ \t]+$/mg,""); + + // Turn block-level HTML blocks into hash entries + text = _HashHTMLBlocks(text); + + // Strip link definitions, store in hashes. + text = _StripLinkDefinitions(text); + + text = _RunBlockGamut(text); + + text = _UnescapeSpecialChars(text); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g,"$$"); + + // attacklab: Restore tildes + text = text.replace(/~T/g,"~"); + + return text; + } + + + var _StripLinkDefinitions = function(text) { + // + // Strips link definitions from text, stores the URLs and titles in + // hash references. + // + + // Link defs are in the form: ^[id]: url "optional title" + + /* + var text = text.replace(/ + ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 + [ \t]* + \n? // maybe *one* newline + [ \t]* + ? // url = $2 + [ \t]* + \n? // maybe one newline + [ \t]* + (?: + (\n*) // any lines skipped = $3 attacklab: lookbehind removed + ["(] + (.+?) // title = $4 + [")] + [ \t]* + )? // title is optional + (?:\n+|$) + /gm, + function(){...}); + */ + var text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm, + function (wholeMatch,m1,m2,m3,m4) { + m1 = m1.toLowerCase(); + g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive + if (m3) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return m3+m4; + } else if (m4) { + g_titles[m1] = m4.replace(/"/g,"""); + } + + // Completely remove the definition from the text + return ""; + } + ); + + return text; + } + + + var _HashHTMLBlocks = function(text) { + // attacklab: Double up blank lines to reduce lookaround + text = text.replace(/\n/g,"\n\n"); + + // Hashify HTML blocks: + // We only want to do this for block-level HTML tags, such as headers, + // lists, and tables. That's because we still want to wrap

s around + // "paragraphs" that are wrapped in non-block-level tags, such as anchors, + // phrase emphasis, and spans. The list of tags we're looking for is + // hard-coded: + var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" + var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" + + // First, look for nested blocks, e.g.: + //

+ //
+ // tags for inner block must be indented. + //
+ //
+ // + // The outermost tags must start at the left margin for this to match, and + // the inner nested divs must be indented. + // We need to do this before the next, more liberal match, because the next + // match will start at the first `
` and stop at the first `
`. + + // attacklab: This regex can be expensive when it fails. + /* + var text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_a) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*?\n // any number of lines, minimally matching + // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement); + + // + // Now match more liberally, simply from `\n` to `\n` + // + + /* + var text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_b) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*? // any number of lines, minimally matching + .* // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement); + + // Special case just for
. It was easier to make a special case than + // to make the other regex more complicated. + + /* + text = text.replace(/ + ( // save in $1 + \n\n // Starting after a blank line + [ ]{0,3} + (<(hr) // start tag = $2 + \b // word break + ([^<>])*? // + \/?>) // the matching end tag + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement); + + // Special case for standalone HTML comments: + + /* + text = text.replace(/ + ( // save in $1 + \n\n // Starting after a blank line + [ ]{0,3} // attacklab: g_tab_width - 1 + + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g,hashElement); + + // PHP and ASP-style processor instructions ( and <%...%>) + + /* + text = text.replace(/ + (?: + \n\n // Starting after a blank line + ) + ( // save in $1 + [ ]{0,3} // attacklab: g_tab_width - 1 + (?: + <([?%]) // $2 + [^\r]*? + \2> + ) + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement); + + // attacklab: Undo double lines (see comment at top of this function) + text = text.replace(/\n\n/g,"\n"); + return text; + } + + var hashElement = function(wholeMatch,m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/\n\n/g,"\n"); + blockText = blockText.replace(/^\n/,""); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g,""); + + // Replace the element text with a marker ("~KxK" where x is its key) + blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n"; + + return blockText; + }; + + var _RunBlockGamut = function(text) { + // + // These are all the transformations that form block-level + // tags like paragraphs, headers, and list items. + // + text = _DoHeaders(text); + + // Do Horizontal Rules: + var key = hashBlock("
"); + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key); + text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key); + text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key); + + text = _DoLists(text); + text = _DoCodeBlocks(text); + text = _DoBlockQuotes(text); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

tags around block-level tags. + text = _HashHTMLBlocks(text); + text = _FormParagraphs(text); + + return text; + } + + + var _RunSpanGamut = function(text) { + // + // These are all the transformations that occur *within* block-level + // tags like paragraphs, headers, and list items. + // + + text = _DoCodeSpans(text); + text = _EscapeSpecialCharsWithinTagAttributes(text); + text = _EncodeBackslashEscapes(text); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = _DoImages(text); + text = _DoAnchors(text); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = _DoAutoLinks(text); + text = _EncodeAmpsAndAngles(text); + text = _DoItalicsAndBold(text); + + // Do hard breaks: + text = text.replace(/ +\n/g,"
\n"); + + return text; + } + + var _EscapeSpecialCharsWithinTagAttributes = function(text) { + // + // Within tags -- meaning between < and > -- encode [\ ` * _] so they + // don't conflict with their use in Markdown for code, italics and strong. + // + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; + + text = text.replace(regex, function(wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`"); + tag = escapeCharacters(tag,"\\`*_"); + return tag; + }); + + return text; + } + + var _DoAnchors = function(text) { + // + // Turn Markdown link shortcuts into XHTML
tags. + // + // + // First, handle reference-style links: [link text] [id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + )()()()() // pad remaining backreferences + /g,_DoAnchors_callback); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + ) + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // href = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g,writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + )()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); + + return text; + } + + var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) { + if (m7 == undefined) m7 = ""; + var whole_match = m1; + var link_text = m2; + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = link_text.toLowerCase().replace(/ ?\n/g," "); + } + url = "#"+link_id; + + if (g_urls[link_id] != undefined) { + url = g_urls[link_id]; + if (g_titles[link_id] != undefined) { + title = g_titles[link_id]; + } + } + else { + if (whole_match.search(/\(\s*\)$/m)>-1) { + // Special case for explicit empty url + url = ""; + } else { + return whole_match; + } + } + } + + url = escapeCharacters(url,"*_"); + var result = ""; + + return result; + } + + + var _DoImages = function(text) { + // + // Turn Markdown image shortcuts into tags. + // + + // + // First, handle reference-style labeled images: ![alt text][id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + )()()()() // pad rest of backreferences + /g,writeImageTag); + */ + text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag); + + // + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + \s? // One optional whitespace character + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // src url = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // title = $7 + \6 // matching quote + [ \t]* + )? // title is optional + \) + ) + /g,writeImageTag); + */ + text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag); + + return text; + } + + var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) { + var whole_match = m1; + var alt_text = m2; + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (!title) title = ""; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = alt_text.toLowerCase().replace(/ ?\n/g," "); + } + url = "#"+link_id; + + if (g_urls[link_id] != undefined) { + url = g_urls[link_id]; + if (g_titles[link_id] != undefined) { + title = g_titles[link_id]; + } + } + else { + return whole_match; + } + } + + alt_text = alt_text.replace(/"/g,"""); + url = escapeCharacters(url,"*_"); + var result = "\""" + _RunSpanGamut(m1) + "");}); + + text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, + function(matchFound,m1){return hashBlock("

" + _RunSpanGamut(m1) + "

");}); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + + /* + text = text.replace(/ + ^(\#{1,6}) // $1 = string of #'s + [ \t]* + (.+?) // $2 = Header text + [ \t]* + \#* // optional closing #'s (not counted) + \n+ + /gm, function() {...}); + */ + + text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, + function(wholeMatch,m1,m2) { + var h_level = m1.length; + return hashBlock("" + _RunSpanGamut(m2) + ""); + }); + + return text; + } + + // This declaration keeps Dojo compressor from outputting garbage: + var _ProcessListItems; + + var _DoLists = function(text) { + // + // Form HTML ordered (numbered) and unordered (bulleted) lists. + // + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += "~0"; + + // Re-usable pattern to match any entirel ul or ol list: + + /* + var whole_list = / + ( // $1 = whole list + ( // $2 + [ ]{0,3} // attacklab: g_tab_width - 1 + ([*+-]|\d+[.]) // $3 = first list item marker + [ \t]+ + ) + [^\r]+? + ( // $4 + ~0 // sentinel for workaround; should be $ + | + \n{2,} + (?=\S) + (?! // Negative lookahead for another list item marker + [ \t]* + (?:[*+-]|\d+[.])[ \t]+ + ) + ) + )/g + */ + var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + if (g_list_level) { + text = text.replace(whole_list,function(wholeMatch,m1,m2) { + var list = m1; + var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol"; + + // Turn double returns into triple returns, so that we can make a + // paragraph for the last item in a list, if necessary: + list = list.replace(/\n{2,}/g,"\n\n\n");; + var result = _ProcessListItems(list); + + // Trim any trailing whitespace, to put the closing `` + // up on the preceding line, to get it past the current stupid + // HTML block parser. This is a hack to work around the terrible + // hack that is the HTML block parser. + result = result.replace(/\s+$/,""); + result = "<"+list_type+">" + result + "\n"; + return result; + }); + } else { + whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; + text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) { + var runup = m1; + var list = m2; + + var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol"; + // Turn double returns into triple returns, so that we can make a + // paragraph for the last item in a list, if necessary: + var list = list.replace(/\n{2,}/g,"\n\n\n");; + var result = _ProcessListItems(list); + result = runup + "<"+list_type+">\n" + result + "\n"; + return result; + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/,""); + + return text; + } + + _ProcessListItems = function(list_str) { + // + // Process the contents of a single ordered or unordered list, splitting it + // into individual list items. + // + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + + g_list_level++; + + // trim trailing blank lines: + list_str = list_str.replace(/\n{2,}$/,"\n"); + + // attacklab: add sentinel to emulate \z + list_str += "~0"; + + /* + list_str = list_str.replace(/ + (\n)? // leading line = $1 + (^[ \t]*) // leading whitespace = $2 + ([*+-]|\d+[.]) [ \t]+ // list marker = $3 + ([^\r]+? // list item text = $4 + (\n{1,2})) + (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+)) + /gm, function(){...}); + */ + list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm, + function(wholeMatch,m1,m2,m3,m4){ + var item = m4; + var leading_line = m1; + var leading_space = m2; + + if (leading_line || (item.search(/\n{2,}/)>-1)) { + item = _RunBlockGamut(_Outdent(item)); + } + else { + // Recursion for sub-lists: + item = _DoLists(_Outdent(item)); + item = item.replace(/\n$/,""); // chomp(item) + item = _RunSpanGamut(item); + } + + return "
  • " + item + "
  • \n"; + } + ); + + // attacklab: strip sentinel + list_str = list_str.replace(/~0/g,""); + + g_list_level--; + return list_str; + } + + + var _DoCodeBlocks = function(text) { + // + // Process Markdown `
    ` blocks.
    +			//  
    +
    +				/*
    +					text = text.replace(text,
    +						/(?:\n\n|^)
    +						(								// $1 = the code block -- one or more lines, starting with a space/tab
    +							(?:
    +								(?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
    +								.*\n+
    +							)+
    +						)
    +						(\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
    +					/g,function(){...});
    +				*/
    +
    +				// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
    +				text += "~0";
    +				
    +				text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
    +					function(wholeMatch,m1,m2) {
    +						var codeblock = m1;
    +						var nextChar = m2;
    +					
    +						codeblock = _EncodeCode( _Outdent(codeblock));
    +						codeblock = _Detab(codeblock);
    +						codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
    +						codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
    +
    +						codeblock = "
    " + codeblock + "\n
    "; + + return hashBlock(codeblock) + nextChar; + } + ); + + // attacklab: strip sentinel + text = text.replace(/~0/,""); + + return text; + } + + var hashBlock = function(text) { + text = text.replace(/(^\n+|\n+$)/g,""); + return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n"; + } + + + var _DoCodeSpans = function(text) { + // + // * Backtick quotes are used for spans. + // + // * You can use multiple backticks as the delimiters if you want to + // include literal backticks in the code span. So, this input: + // + // Just type ``foo `bar` baz`` at the prompt. + // + // Will translate to: + // + //

    Just type foo `bar` baz at the prompt.

    + // + // There's no arbitrary limit to the number of backticks you + // can use as delimters. If you need three consecutive backticks + // in your code, use four for delimiters, etc. + // + // * You can use spaces to get literal backticks at the edges: + // + // ... type `` `bar` `` ... + // + // Turns to: + // + // ... type `bar` ... + // + + /* + text = text.replace(/ + (^|[^\\]) // Character before opening ` can't be a backslash + (`+) // $2 = Opening run of ` + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function(wholeMatch,m1,m2,m3,m4) { + var c = m3; + c = c.replace(/^([ \t]*)/g,""); // leading whitespace + c = c.replace(/[ \t]*$/g,""); // trailing whitespace + c = _EncodeCode(c); + return m1+""+c+""; + }); + + return text; + } + + + var _EncodeCode = function(text) { + // + // Encode/escape certain characters inside Markdown code runs. + // The point is that in code, these characters are literals, + // and lose their special Markdown meanings. + // + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g,"&"); + + // Do the angle bracket song and dance: + text = text.replace(//g,">"); + + // Now, escape characters that are magic in Markdown: + text = escapeCharacters(text,"\*_{}[]\\",false); + + // jj the line above breaks this: + //--- + + //* Item + + // 1. Subitem + + // special char: * + //--- + + return text; + } + + + var _DoItalicsAndBold = function(text) { + + // must go first: + text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, + "$2"); + + text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, + "$2"); + + return text; + } + + + var _DoBlockQuotes = function(text) { + + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, + function(wholeMatch,m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0"); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g,""); + + bq = bq.replace(/^[ \t]+$/gm,""); // trim whitespace-only lines + bq = _RunBlockGamut(bq); // recurse + + bq = bq.replace(/(^|\n)/g,"$1 "); + // These leading spaces screw with
     content, so we need to fix that:
    +						bq = bq.replace(
    +								/(\s*
    [^\r]+?<\/pre>)/gm,
    +							function(wholeMatch,m1) {
    +								var pre = m1;
    +								// attacklab: hack around Konqueror 3.5.4 bug:
    +								pre = pre.replace(/^  /mg,"~0");
    +								pre = pre.replace(/~0/g,"");
    +								return pre;
    +							});
    +						
    +						return hashBlock("
    \n" + bq + "\n
    "); + }); + return text; + } + + + var _FormParagraphs = function(text) { + // + // Params: + // $text - string to process with html

    tags + // + + // Strip leading and trailing lines: + text = text.replace(/^\n+/g,""); + text = text.replace(/\n+$/g,""); + + var grafs = text.split(/\n{2,}/g); + var grafsOut = new Array(); + + // + // Wrap

    tags. + // + var end = grafs.length; + for (var i=0; i= 0) { + grafsOut.push(str); + } + else if (str.search(/\S/) >= 0) { + str = _RunSpanGamut(str); + str = str.replace(/^([ \t]*)/g,"

    "); + str += "

    " + grafsOut.push(str); + } + + } + + // + // Unhashify HTML blocks + // + end = grafsOut.length; + for (var i=0; i= 0) { + var blockText = g_html_blocks[RegExp.$1]; + blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs + grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText); + } + } + + return grafsOut.join("\n\n"); + } + + + var _EncodeAmpsAndAngles = function(text) { + // Smart processing for ampersands and angle brackets that need to be encoded. + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&"); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?\$!])/gi,"<"); + + return text; + } + + + var _EncodeBackslashEscapes = function(text) { + // + // Parameter: String. + // Returns: The string, with after processing the following backslash + // escape sequences. + // + + // attacklab: The polite way to do this is with the new + // escapeCharacters() function: + // + // text = escapeCharacters(text,"\\",true); + // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + // + // ...but we're sidestepping its use of the (slow) RegExp constructor + // as an optimization for Firefox. This function gets called a LOT. + + text = text.replace(/\\(\\)/g,escapeCharacters_callback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback); + return text; + } + + + var _DoAutoLinks = function(text) { + + text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"
    $1"); + + // Email addresses: + + /* + text = text.replace(/ + < + (?:mailto:)? + ( + [-.\w]+ + \@ + [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ + ) + > + /gi, _DoAutoLinks_callback()); + */ + + text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + function(wholeMatch,m1) { + return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); + } + ); + + return text; + } + + + var _EncodeEmailAddress = function(addr) { + // + // Input: an email address, e.g. "foo@example.com" + // + // Output: the email address as a mailto link, with each character + // of the address encoded as either a decimal or hex entity, in + // the hopes of foiling most address harvesting spam bots. E.g.: + // + // foo + // @example.com + // + // Based on a filter by Matthew Wickline, posted to the BBEdit-Talk + // mailing list: + // + + // attacklab: why can't javascript speak hex? + function char2hex(ch) { + var hexDigits = '0123456789ABCDEF'; + var dec = ch.charCodeAt(0); + return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15)); + } + + var encode = [ + function(ch){return "&#"+ch.charCodeAt(0)+";";}, + function(ch){return "&#x"+char2hex(ch)+";";}, + function(ch){return ch;} + ]; + + addr = "mailto:" + addr; + + addr = addr.replace(/./g, function(ch) { + if (ch == "@") { + // this *must* be encoded. I insist. + ch = encode[Math.floor(Math.random()*2)](ch); + } else if (ch !=":") { + // leave ':' alone (to spot mailto: later) + var r = Math.random(); + // roughly 10% raw, 45% hex, 45% dec + ch = ( + r > .9 ? encode[2](ch) : + r > .45 ? encode[1](ch) : + encode[0](ch) + ); + } + return ch; + }); + + addr = "" + addr + ""; + addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part" + + return addr; + } + + + var _UnescapeSpecialChars = function(text) { + // + // Swap back in all the special characters we've hidden. + // + text = text.replace(/~E(\d+)E/g, + function(wholeMatch,m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + } + ); + return text; + } + + + var _Outdent = function(text) { + // + // Remove one level of line-leading tabs or spaces + // + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g,"") + + return text; + } + + var _Detab = function(text) { + // attacklab: Detab's completely rewritten for speed. + // In perl we could fix it by anchoring the regexp with \G. + // In javascript we're less fortunate. + + // expand first n-1 tabs + text = text.replace(/\t(?=\t)/g," "); // attacklab: g_tab_width + + // replace the nth with two sentinels + text = text.replace(/\t/g,"~A~B"); + + // use the sentinel to anchor our regex so it doesn't explode + text = text.replace(/~B(.+?)~A/g, + function(wholeMatch,m1,m2) { + var leadingText = m1; + var numSpaces = 4 - leadingText.length % 4; // attacklab: g_tab_width + + // there *must* be a better way to do this: + for (var i=0; iBold', + function() + { + tagSelection( targetTextArea, '**', '**' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var italics = new EditControl( + 'Italic', + function() + { + tagSelection( targetTextArea, '*', '*' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var link = new EditControl( + 'Link', + function() + { + linkSelection( targetTextArea ); + refreshPreview( preview, targetTextArea ); + } + ); + + var quote = new EditControl( + '|Quote', + function() + { + prefixSelectionLines( targetTextArea, '>' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var code = new EditControl( + 'Code', + function() + { + prefixSelectionLines( targetTextArea, ' ' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var bullets = new EditControl( + '•Bullets', + function() + { + prefixSelectionLines( targetTextArea, '* ' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var numbers = new EditControl( + '1.Numbers', + function() + { + prefixSelectionLines( targetTextArea, '1. ' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var disapproval = new EditControl( + 'ಠ\_ಠ', + function() { + prefixSelectionLines( targetTextArea, 'ಠ_ಠ' ); + refreshPreview( preview, targetTextArea ); + } + ); + + var promoteRES = new EditControl( + '[Promote]', + function() { + prefixSelectionLines( targetTextArea, '[Reddit Enhancement Suite](http://reddit.honestbleeps.com?referral='+RESUtils.loggedInUser()+')' ); + refreshPreview( preview, targetTextArea ); + } + ); + + controlBox.appendChild( bold.create() ); + controlBox.appendChild( italics.create() ); + controlBox.appendChild( link.create() ); + controlBox.appendChild( quote.create() ); + controlBox.appendChild( code.create() ); + controlBox.appendChild( bullets.create() ); + controlBox.appendChild( numbers.create() ); + controlBox.appendChild( disapproval.create() ); + controlBox.appendChild( promoteRES.create() ); + + } + + function EditControl( label, editFunction ) + { + this.create = function() + { + var link = document.createElement('a'); + + link.innerHTML = label; + link.href = 'javascript:;'; + link.setAttribute('style','Margin-Right: 15px; text-decoration: none;'); + + link.execute = editFunction; + + addEvent( link, 'click', 'execute' ); + + return link; + } + } + + function tagSelection( targetTextArea, tagOpen, tagClose, textEscapeFunction ) + { + //record scroll top to restore it later. + var scrollTop = targetTextArea.scrollTop; + + //We will restore the selection later, so record the current selection. + var selectionStart = targetTextArea.selectionStart; + var selectionEnd = targetTextArea.selectionEnd; + + var selectedText = targetTextArea.value.substring( selectionStart, selectionEnd ); + + //Markdown doesn't like it when you tag a word like **this **. The space messes it up. So we'll account for that because Firefox selects the word, and the followign space when you double click a word. + var potentialTrailingSpace = ''; + + if( selectedText[ selectedText.length - 1 ] == ' ' ) + { + potentialTrailingSpace = ' '; + selectedText = selectedText.substring( 0, selectedText.length - 1 ); + } + + if ( textEscapeFunction ) + { + selectedText = textEscapeFunction( selectedText ); + } + + targetTextArea.value = + targetTextArea.value.substring( 0, selectionStart ) + //text leading up to the selection start + tagOpen + + selectedText + + tagClose + + potentialTrailingSpace + + targetTextArea.value.substring( selectionEnd ); //text after the selection end + + targetTextArea.selectionStart = selectionStart + tagOpen.length; + targetTextArea.selectionEnd = selectionEnd + tagOpen.length; + + targetTextArea.scrollTop = scrollTop; + } + + function linkSelection( targetTextArea ) + { + var url = prompt( "Enter the URL:", "" ); + + if ( url != null ) + { + tagSelection( + targetTextArea, + '[', + '](' + url.replace( /\(/, '\\(' ).replace( /\)/, '\\)' ) + ')', //escape parens in url + function( text ) + { + return text.replace( /\[/, '\\[' ).replace( /\]/, '\\]' ).replace( /\(/, '\\(' ).replace( /\)/, '\\)' ); //escape brackets and parens in text + } + ); + } + } + + function prefixSelectionLines( targetTextArea, prefix ) + { + var scrollTop = targetTextArea.scrollTop; + var selectionStart = targetTextArea.selectionStart; + var selectionEnd = targetTextArea.selectionEnd; + + var selectedText = targetTextArea.value.substring( selectionStart, selectionEnd ); + + var lines = selectedText.split( '\n' ); + + var newValue = ''; + + for( var i = 0; i < lines.length; i++ ) + { + newValue += prefix + lines[i] + '\n'; + } + + targetTextArea.value = + targetTextArea.value.substring( 0, selectionStart ) + //text leading up to the selection start + newValue + + targetTextArea.value.substring( selectionEnd ); //text after the selection end + + targetTextArea.scrollTop = scrollTop; + } + + //Delegated event wire-up utitlity. Using this allows you to use the "this" keyword in a delegated function. + function addEvent( target, eventName, handlerName ) + { + target.addEventListener(eventName, function(e){target[handlerName](e);}, false); + } + + // Make the stuff we add look pretty! + RESUtils.addCSS('fieldset.liveComment, fieldset.liveComment legend { border: 1px solid black; border-radius: 1em; -moz-border-radius: 1em; -webkit-border-radius: 1em; }'+ + 'fieldset.liveComment { padding: 1ex; margin: 1em 0; }'+ + 'fieldset.liveComment legend { padding: 0 1ex; background-color: #E9E9E9; }'); + + // Bootstrap with the top-level comment always in the page, and editors for your existing comments. + wireupExistingCommentEditors(); + + // Watch for any future 'reply' forms. + document.body.addEventListener( + 'DOMNodeInserted', + function( event ) + { + wireupNewCommentEditors( event.target ); + }, + false + ); + } + } +}; + +modules['usernameHider'] = { + moduleID: 'usernameHider', + moduleName: 'Username Hider', + options: { + displayText: { + type: 'text', + value: '~anonymous~', + description: 'What to replace your username with, default is ~anonymous~' + } + }, + description: 'This module hides your real username when you\'re logged in to reddit.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]*/i, + /http:\/\/reddit.com\/[-\w\.\/]*/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + var userNameEle = document.querySelector('#header-bottom-right > span > a'); + var thisUserName = userNameEle.text; + userNameEle.textContent = this.options.displayText.value; + var authors = document.querySelectorAll('.author'); + for (var i=0, len=authors.length; i=0)){ + var li = document.createElement('li'); + var a = document.createElement('a'); + var text = document.createTextNode('[m]'); + a.setAttribute('href','javascript:void(0);'); + a.addEventListener('click', function(e) { + e.preventDefault(); + modules['showImages'].gw = 'm'; + modules['showImages'].showImages('m'); + }, true); + a.appendChild(text); + li.appendChild(a); + mainmenuUL.appendChild(li); + + var li = document.createElement('li'); + var a = document.createElement('a'); + var text = document.createTextNode('[f]'); + a.setAttribute('href','javascript:void(0);'); + a.addEventListener('click', function(e) { + e.preventDefault(); + modules['showImages'].gw = 'f'; + modules['showImages'].showImages('f'); + }, true); + a.appendChild(text); + li.appendChild(a); + mainmenuUL.appendChild(li); + } + } + + }, + updateImageButtons: function(imgCount) { + if ((typeof(this.viewButton) != 'undefined')) { + if (this.imagesVisible) { + this.viewButton.innerHTML = 'hide images ('+imgCount+')'; + } else { + this.viewButton.innerHTML = 'view images ('+imgCount+')'; + } + } + }, + findImages: function(gonewild, showmore) { + switch (gonewild) { + case 'f': + re = new RegExp(/[\[\{\<\(](f|fem|female)[\]\}\>\)]/i); + break; + case 'm': + re = new RegExp(/[\[\{\<\(](m|man|male)[\]\}\>\)]/i); + break; + } + if (this.options.hideNSFW.value) { + re = new RegExp(/nsfw/i); + } + for(var i=0, len=this.imageList.length;i=0 || href.indexOf('.jpeg')>=0 || href.indexOf('.jpg')>=0 || href.indexOf('.gif')>=0)) { + if (hasClass(this.imageList[i].parentNode,'title')) { + var targetImage = this.imageList[i].parentNode.nextSibling + } else { + var targetImage = this.imageList[i].nextSibling + } + this.revealImage(targetImage, showmore); + } + } + }, + imgurType: function(url) { + // Detect the type of imgur link + // Direct image link? http://i.imgur.com/0ZxQF.jpg + // imgur "page" link? http://imgur.com/0ZxQF + // imgur "gallery"? ?????????? + var urlPieces = url.split('?'); + var cleanURL = urlPieces[0]; + var directImg = /i.imgur.com\/[\w]+\.[\w]+/gi; + var imgPage = /imgur.com\.[\w+]$/gi; + }, + findAllImages: function(ele) { + this.scanningForImages = true; + if (ele == null) { + ele = document.body; + } + // get elements common across all pages first... + // if we're on a comments page, get those elements too... + var commentsre = new RegExp(/comments\/[-\w\.\/]/i); + var userre = new RegExp(/user\/[-\w\.\/]/i); + if ((commentsre.test(location.href)) || (userre.test(location.href))) { + this.allElements = ele.querySelectorAll('#siteTable A.title, .usertext-body > div.md a'); + } else { + this.allElements = ele.querySelectorAll('#siteTable A.title'); + } + // make an array to store any links we've made calls to for the imgur API so we don't do any multiple hits to it. + this.imgurCalls = new Array(); + // this.allElements contains all link elements on the page - now let's filter it for images... + this.hashRe = /^http:\/\/[i.]*imgur.com\/([\w]+)(\..+)?$/i; + var groups = Array(); + this.allElementsCount=this.allElements.length; + this.allElementsi = 0; + (function(){ + // scan 15 links at a time... + var chunkLength = Math.min((modules['showImages'].allElementsCount - modules['showImages'].allElementsi), 10); + for (var i=0;i=0); + //isFlickr = (href.indexOf('flickr.com')>=0); + if (!(ele.getAttribute('scanned') == 'true') && (isImgur || href.indexOf('.jpeg')>=0 || href.indexOf('.jpg')>=0 || href.indexOf('.gif')>=0)) { + if (isImgur) { + // if it's not a full (direct) imgur link, get the relevant data and append it... otherwise, go now! + // first, kill any URL parameters that screw with the parser, like ?full. + var splithref = href.split('?'); + href = splithref[0]; + if (this.options.useSmallImages.value) { + splithref = href.split('.'); + if ((splithref[splithref.length-1] == 'jpg') || (splithref[splithref.length-1] == 'jpeg') || (splithref[splithref.length-1] == 'png') || (splithref[splithref.length-1] == 'gif')) { + splithref[splithref.length-2] += 'h'; + href = splithref.join('.'); + } + } + ele.setAttribute('href',href); + // now, strip the hash off of it so we can make an API call if need be + groups = this.hashRe.exec(href); + // opera doesn't support cross domain XHR, so this part won't work in opera. boo. + // if we got a match, but we don't have a file extension, hit the imgur API for that info + if ((groups && !groups[2]) && (typeof(opera) == 'undefined')) { + var apiURL = 'http://api.imgur.com/2/image/'+groups[1]+'.xml'; + // avoid making duplicate calls from the same page... want to minimize hits to imgur API + if (typeof(this.imgurCalls[apiURL]) == 'undefined') { + // store the object we want to modify when the xml request is finished... + this.imgurCalls[apiURL] = ele; + GM_xmlhttpRequest({ + method: 'GET', + url: apiURL, + onload: function(response) { + var parser = new DOMParser(); + var xml = parser.parseFromString(response.responseText, "application/xml"); + if (xml.getElementsByTagName('original')[0]) { + modules['showImages'].imgurCalls[apiURL].setAttribute('href',xml.getElementsByTagName('original')[0].textContent); + } + } + }); + } + } + if (groups) this.createImageExpando(ele, true); + } else { + this.createImageExpando(ele); + } + } + } else if (!(hasClass(ele,'imgFound'))) { + if (!(ele.getAttribute('scanned') == 'true') && (href.indexOf('imgur.')>=0 || href.indexOf('.jpeg')>=0 || href.indexOf('.jpg')>=0 || href.indexOf('.gif')>=0)) { + var textFrag = document.createTextNode(' [duplicate image ignored.]'); + insertAfter(ele, textFrag); + } + } + }, + createImageExpando: function(obj, asynch) { + addClass(obj,'imgFound'); + obj.setAttribute('scanned','true'); + this.imageList.push(obj); + var thisExpandLink = document.createElement('a'); + thisExpandLink.setAttribute('class','toggleImage expando-button image'); + // thisExpandLink.innerHTML = '[show img]'; + thisExpandLink.innerHTML = ' '; + removeClass(thisExpandLink, 'expanded'); + addClass(thisExpandLink, 'collapsed'); + thisExpandLink.addEventListener('click', function(e) { + e.preventDefault(); + modules['showImages'].revealImage(e.target); + }, true); + if (hasClass(obj.parentNode,'title')) { + var nodeToInsertAfter = obj.parentNode; + addClass(thisExpandLink, 'linkImg'); + } else { + var nodeToInsertAfter = obj; + addClass(thisExpandLink, 'commentImg'); + } + insertAfter(nodeToInsertAfter, thisExpandLink); + }, + revealImage: function(showLink, showhide) { + // showhide = false means hide, true means show! + if (hasClass(showLink, 'commentImg')) { + var thisImageLink = showLink.previousSibling; + } else { + var thisImageLink = showLink.previousSibling.firstChild; + } + var imageCheck = showLink.nextSibling; + // Check if the next sibling is an image. If so, we've already revealed that image. + if ((typeof(imageCheck) != 'undefined') && (imageCheck != null) && (typeof(imageCheck.tagName) != 'undefined') && (hasClass(imageCheck, 'madeVisible'))) { + if ((showhide != true) && (imageCheck.style.display != 'none')) { + imageCheck.style.display = 'none'; + // showLink.innerHTML = '[show img]'; + removeClass(showLink, 'expanded'); + addClass(showLink, 'collapsed'); + } else { + imageCheck.style.display = 'block'; + // showLink.innerHTML = '[hide img]'; + removeClass(showLink, 'collapsed'); + addClass(showLink, 'expanded'); + } + } else { + // we haven't revealed this image before. Load it in. + var href = thisImageLink.getAttribute('href'); + var ext = (href.indexOf('imgur.')>=0 && href.indexOf('.jpg')<0 && href.indexOf('.png')<0 && href.indexOf('.gif')<0) ? '.jpg' :''; + var img = document.createElement('a'); + if (this.options.openInNewWindow.value) { + img.setAttribute('target','_blank'); + } + img.setAttribute('href',href); + img.setAttribute('class','madeVisible'); + img.setAttribute('style','display: block;max-width:'+this.options.maxWidth.value+'px;max-height:'+this.options.maxHeight.value+'px; clear: both;'); + /* Chrome doesn't seem happy with cross domain XHR to flickr... tabling this idea for now. + if (href.indexOf('flickr.com') >= 0) { + this.flickrImages[href] = img; + GM_xmlhttpRequest({ + method: "GET", + url: href, + onload: function(response) { + console.log('response: '); + console.log(response); + var tempDiv = document.createElement(tempDiv); + tempDiv.innerHTML = thisHTML.replace(//g, ''); + // check for new mail + var flickrImg = tempDiv.querySelector('#photo > .photo-div > IMG'); + modules['showImages'].flickrImages[this.url].innerHTML = flickrImg.getAttribute('src'); + } + }); + // img.innerHTML = flickrImg; + } else { + img.innerHTML = ''; + } + */ + img.innerHTML = ''; + insertAfter(showLink, img); + // showLink.innerHTML = '[hide img]'; + removeClass(showLink, 'collapsed'); + addClass(showLink, 'expanded'); + } + }, + showImages: function(gonewild, showmore) { + if ((this.imagesVisible) && (!(showmore))) { + this.imagesVisible = false; + // images are already visible. Hide them. + var imageList = document.body.querySelectorAll('.madeVisible'); + for (var i=0, len=this.imageList.length;i .user b"); + if ((typeof(karmaDiv) != 'undefined') && (karmaDiv != null)) { + karmaDiv.innerHTML += " " + modules['showKarma'].options.separator.value + " " + thisResponse.data.comment_karma; + } + } + }); + } + } +}; + +modules['hideChildComments'] = { + moduleID: 'hideChildComments', + moduleName: 'Hide All Child Comments', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + automatic: { + type: 'boolean', + value: false, + description: 'Automatically hide all but parent comments, or provide a link to hide them all?' + } + }, + description: 'Allows you to hide all comments except for replies to the OP for easier reading.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]+\/comments\/[-\w\.]+/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + var toggleButton = document.createElement('li'); + this.toggleAllLink = document.createElement('a'); + this.toggleAllLink.innerHTML = 'hide all child comments'; + this.toggleAllLink.setAttribute('action','hide'); + this.toggleAllLink.setAttribute('href','javascript:void(0);'); + this.toggleAllLink.setAttribute('title','Show only replies to original poster.'); + this.toggleAllLink.addEventListener('click', function() { + modules['hideChildComments'].toggleComments(this.getAttribute('action')); + if (this.getAttribute('action') == 'hide') { + this.setAttribute('action','show'); + this.setAttribute('title','Show all comments.'); + this.innerHTML = 'show all child comments'; + } else { + this.setAttribute('action','hide'); + this.setAttribute('title','Show only replies to original poster.'); + this.innerHTML = 'hide all child comments'; + } + }, true); + toggleButton.appendChild(this.toggleAllLink); + var commentMenu = document.querySelector('ul.buttons'); + if (commentMenu) { + commentMenu.appendChild(toggleButton); + var rootComments = document.querySelectorAll('div.commentarea > div.sitetable > div.thing > div.child > div.listing'); + for (var i=0, len=rootComments.length; i div.sitetable > div.thing'); + for (var i=0, len=commentContainers.length; i div.sitetable'); + var thisToggleLink = commentContainers[i].querySelector('a.toggleChildren'); + if (thisToggleLink != null) { + if (action == 'hide') { + if (thisChildren != null) { + thisChildren.style.display = 'none' + } + thisToggleLink.innerHTML = 'show child comments'; + thisToggleLink.setAttribute('title','show child comments'); + thisToggleLink.setAttribute('action','show'); + } else { + if (thisChildren != null) { + thisChildren.style.display = 'block'; + } + thisToggleLink.innerHTML = 'hide child comments'; + thisToggleLink.setAttribute('title','hide child comments'); + thisToggleLink.setAttribute('action','hide'); + } + } + } + } + } +}; + +modules['showParent'] = { + moduleID: 'showParent', + moduleName: 'Show Parent on Hover', + options: { + }, + description: 'Shows parent comment when hovering over the "parent" link of a comment.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]+\/comments\/[-\w\.]+/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + + // code included from https://userscripts-mirror.org/scripts/show/34362 + // author: lazyttrick - https://userscripts-mirror.org/users/20871 + + function show(evt) + { + var id = evt.target.getAttribute('href').replace(/\#/,""); + var top = parseInt(evt.pageY,10)+10, + left = parseInt(evt.pageX,10)+10; + try{ + var div = createElement('div', {id:"parentComment"+id, style:"padding:5px; border: 1px solid #666666; overflow:auto; background:#F8F8F8; position:absolute; top:"+top+"px; left:"+left+"px;"}, null ); + var query = "//div[contains(@class, 'id-t1_"+id+"')]/div[starts-with(@class,'entry')]"; + div.innerHTML = xp(query)[0].innerHTML.replace(/\/,"").replace(/\]+>\[-\]\<\/a\>/,''); + getTag('body')[0].appendChild(div); + }catch(e){ + } + } + + + function hide(evt) + { + var id = evt.target.getAttribute('href').replace(/\#/,""); + try{ + var div = getId("parentComment"+id); + div.parentNode.removeChild(div); + }catch(e){ + } + } + + + function xp(p, context) { + if (!context) + context = document; + var i, arr = [], xpr = document.evaluate(p, context, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); + for (i = 0; item = xpr.snapshotItem(i); i++) + arr.push(item); + return arr; + } + + + function createElement(type, attrArray, evtListener, html) + { + var node = document.createElement(type); + + for (var attr in attrArray) if (attrArray.hasOwnProperty(attr)){ + node.setAttribute(attr, attrArray[attr]); + } + + if(evtListener){ + var a = evtListener.split(' '); + node.addEventListener(a[0], eval(a[1]), eval(a[2])); + } + + if(html) + node.innerHTML = html; + + return node; + } + + function getId(id, parent){ + if(!parent) + return document.getElementById(id); + return parent.getElementById(id); + } + + function getTag(name, parent){ + if(!parent) + return document.getElementsByTagName(name); + return parent.getElementsByTagName(name); + } + + + //TODO: print debugObj with added variables + function debug(str) + { + var d = document.getElementById('debuggg'); + if(!d) { + d = document.createElement('textarea'); + d.setAttribute('id','debuggg'); + d.setAttribute('style',"height:200px; width:50%; position:fixed; bottom:0px; right:0px;"); + document.body.appendChild(d); + } + d.innerHTML += '\n' + str; + d.scrollTop = d.scrollHeight; + } + + /* + xp('//div[starts-with(@class,"entry")]//ul[@class="flat-list buttons"]/li[2]/a').forEach(function(a){ + a.addEventListener('mouseover', show, false); + a.addEventListener('mouseout', hide, false); + }); + */ + this.parentLinks = document.querySelectorAll('.child ul.flat-list > li:nth-child(2) > a'); + this.parentLinksCount = this.parentLinks.length; + this.parentLinksi = 0; + (function(){ + // add 15 event listeners at a time... + var chunkLength = Math.min((modules['showParent'].parentLinksCount - modules['showParent'].parentLinksi), 15); + for (var i=0;i 0) { + var nextLink = nextPrevLinks[nextPrevLinks.length-1]; + if (nextLink) { + this.nextPageURL = nextLink.getAttribute('href'); + var nextXY=RESUtils.getXYpos(nextLink); + this.nextPageScrollY = nextXY.y; + } + this.attachLoaderWidget(); + this.attachModalWidget(); + // Set the current page to page 1... + this.currPage = 1; + // If there's a page=# value in location.hash, then update the currPage... + var currPageRe = /#page=([0-9]+)/i; + var backButtonPageNumber = currPageRe.exec(location.href); + if (backButtonPageNumber) { + this.currPage = backButtonPageNumber[1]; + this.loadNewPage(true); + } + + // watch for the user scrolling to the bottom of the page. If they do it, load a new page. + window.addEventListener('scroll', function(e) { + if ((RESUtils.elementInViewport(modules['neverEndingReddit'].progressIndicator)) && (modules['neverEndingReddit'].fromBackButton != true)) { + modules['neverEndingReddit'].loadNewPage(); + } + if ((typeof(modules['neverEndingReddit'].navMail) != 'undefined') && (modules['neverEndingReddit'].navMail != null) && (!(RESUtils.elementInViewport(modules['neverEndingReddit'].navMail)))) { + modules['neverEndingReddit'].showNewMail(true); + } else { + modules['neverEndingReddit'].showNewMail(false); + } + }, false); + } + // hide any next/prev page indicators + var nextprev = document.body.querySelectorAll('.content .nextprev'); + for (var i=0, len=nextprev.length;i'; + document.body.appendChild(this.modalWidget); + document.body.appendChild(this.modalContent); + }, + attachLoaderWidget: function() { + // add a widget at the bottom that will be used to detect that we've scrolled to the bottom, and will also serve as a "loading" bar... + this.progressIndicator = document.createElement('p'); + this.progressIndicator.innerHTML = 'Never Ending Reddit...'; + this.progressIndicator.id = 'progressIndicator'; + this.progressIndicator.className = 'neverEndingReddit'; + insertAfter(this.siteTable, this.progressIndicator); + }, + loadNewPage: function(fromBackButton) { + if (fromBackButton) { + window.scrollTo(0,0) + this.fromBackButton = true; + this.nextPageURL = localStorage.getItem('RESmodules.neverEndingReddit.lastPage'); + var leftCentered = Math.floor((window.innerWidth - 720) / 2); + this.modalWidget.style.display = 'block'; + this.modalContent.style.display = 'block'; + this.modalContent.style.left = leftCentered + 'px'; + // remove the progress indicator early, as we don't want the user to scroll past it on accident, loading more content. + this.progressIndicator.parentNode.removeChild(modules['neverEndingReddit'].progressIndicator); + } else { + this.fromBackButton = false; + } + if (this.isLoading != true) { + this.progressIndicator.innerHTML = ' Loading next page...'; + this.isLoading = true; + GM_xmlhttpRequest({ + method: "GET", + url: this.nextPageURL, + onload: function(response) { + if (!(modules['neverEndingReddit'].fromBackButton)) { + modules['neverEndingReddit'].currPage++; + localStorage.setItem('RESmodules.neverEndingReddit.lastPage', modules['neverEndingReddit'].nextPageURL); + location.hash = 'page='+modules['neverEndingReddit'].currPage; + } + if ((typeof(modules['neverEndingReddit'].progressIndicator.parentNode) != 'undefined') && (modules['neverEndingReddit'].progressIndicator.parentNode != null)) { + modules['neverEndingReddit'].progressIndicator.parentNode.removeChild(modules['neverEndingReddit'].progressIndicator); + } + // drop the HTML we got back into a div... + var thisHTML = response.responseText; + var tempDiv = document.createElement('div'); + // clear out any javascript so we don't render it again... + tempDiv.innerHTML = thisHTML.replace(//g, ''); + // check for new mail + var hasNewMail = tempDiv.querySelector('#mail'); + if ((typeof('hasNewMail') != 'undefined') && (hasClass(hasNewMail,'havemail'))) { + modules['neverEndingReddit'].setMailIcon(true); + } else { + modules['neverEndingReddit'].setMailIcon(false); + } + // grab the siteTable out of there... + var newHTML = tempDiv.querySelector('#siteTable'); + var stMultiCheck = tempDiv.querySelectorAll('#siteTable'); + // stupid sponsored links create a second div with ID of sitetable (bad reddit! you should never have 2 IDs with the same name! naughty, naughty reddit!) + if (stMultiCheck.length == 2) { + // console.log('skipped first sitetable, stupid reddit.'); + newHTML = stMultiCheck[1]; + } + // load up uppers and downers, if enabled... + if (modules['uppersAndDowners'].isEnabled()) { + modules['uppersAndDowners'].applyUppersAndDowners(modules['neverEndingReddit'].nextPageURL); + } + // get the new nextLink value for the next page... + var nextPrevLinks = tempDiv.querySelectorAll('.content .nextprev a'); + var nextLink = nextPrevLinks[nextPrevLinks.length-1]; + modules['neverEndingReddit'].siteTable.appendChild(newHTML); + modules['neverEndingReddit'].isLoading = false; + if (nextLink) { + modules['neverEndingReddit'].nextPageURL = nextLink.getAttribute('href'); + modules['neverEndingReddit'].attachLoaderWidget(); + } + if (fromBackButton) { + modules['neverEndingReddit'].modalWidget.style.display = 'none'; + modules['neverEndingReddit'].modalContent.style.display = 'none'; + // window.scrollTo(0,0) + window.scrollTo(0,modules['neverEndingReddit'].nextPageScrollY); + modules['neverEndingReddit'].fromBackButton = false; + } + } + }); + } else { + // console.log('load new page ignored'); + } + }, + showNewMail: function(show) { + if (show) { + this.NREMail.style.display = 'block'; + } else { + this.NREMail.style.display = 'none'; + } + } +}; + +modules['saveComments'] = { + moduleID: 'saveComments', + moduleName: 'Save Comments', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + }, + description: 'Save Comments allows you to save comments, since reddit doesn\'t!', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]*/i, + /https:\/\/www.reddit.com\/[-\w\.\/]*/i + ), + exclude: Array( + /http:\/\/www.reddit.com\/user\/[-\w\.\/]*\/?/i, + /http:\/\/www.reddit.com\/[-\w\.\/]*\/submit\/?/i, + /http:\/\/www.reddit.com\/submit\/?/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + var currURL = location.href; + var commentsRegex = new RegExp(/http:\/\/www.reddit.com\/[-\w\.\/]*comments\/[-\w\.\/]*/i); + var savedRegex = new RegExp(/http:\/\/www.reddit.com\/saved\/?/i); + if (commentsRegex.test(currURL)) { + // load already-saved comments into memory... + this.loadSavedComments(); + this.addSaveLinks(); + } else if (savedRegex.test(currURL)) { + // load already-saved comments into memory... + this.loadSavedComments(); + this.addSavedCommentsTab(); + this.drawSavedComments(); + if (location.hash == '#comments') { + this.showSavedTab('comments'); + } + } else { + this.addSavedCommentsTab(); + } + } + }, + addSaveLinks: function() { + this.allComments = document.querySelectorAll('div.commentarea > div.sitetable > div.thing div.entry div.noncollapsed'); + this.allCommentsCount = this.allComments.length; + this.allCommentsi = 0; + (function(){ + // add 15 save links at a time... + var chunkLength = Math.min((modules['saveComments'].allCommentsCount - modules['saveComments'].allCommentsi), 15); + for (var i=0;i div.md'); + if (comment != null) { + commentHTML = comment.innerHTML; + var savedComment = { + href: href, + username: username, + comment: commentHTML, + timeSaved: Date() + }; + this.storedComments.push(savedComment); + obj.innerHTML = 'saved'; + } + } + localStorage.setItem('RESmodules.saveComments.savedComments', JSON.stringify(this.storedComments)); + }, + addSavedCommentsTab: function() { + var mainmenuUL = document.body.querySelector('#header-bottom-left ul.tabmenu'); + if (mainmenuUL) { + var menuItems = mainmenuUL.querySelectorAll('li'); + for (var i=0, len=menuItems.length;i
    ' + this.storedComments[i].comment + '
    '; + thisComment.innerHTML += ''; + var unsaveLink = thisComment.querySelector('.unsaveComment'); + unsaveLink.setAttribute('unsaveLink', this.storedComments[i].href); + unsaveLink.addEventListener('click', function(e) { + e.preventDefault(); + modules['saveComments'].unsaveComment(this.getAttribute('unsaveLink')); + }, true); + this.savedCommentsContent.appendChild(thisComment); + } + if (this.storedComments.length == 0) { + this.savedCommentsContent.innerHTML = '
  • You have not yet saved any comments.
  • '; + } + insertAfter(this.savedLinksContent, this.savedCommentsContent); + }, + unsaveComment: function(href) { + var newStoredComments = Array(); + for (var i=0, len=this.storedComments.length;i 0) { + var node = document.createElement("style"); + node.type = "text/css"; + node.appendChild(document.createTextNode(css)); + heads[0].appendChild(node); + } + },*/ + getStyle: function(oElm, strCssRule){ + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle){ + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } + else if(oElm.currentStyle){ + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; + } +}; + +modules['styleTweaks'] = { + moduleID: 'styleTweaks', + moduleName: 'Style Tweaks', + description: 'Provides a number of style tweaks to the Reddit interface', + options: { + navTop: { + type: 'boolean', + value: true, + description: 'Moves the username navbar to the top (great on netbooks!)' + }, + commentBoxes: { + type: 'boolean', + value: true, + description: 'Highlights comment boxes for easier reading / placefinding in large threads.' + }, + commentBoxShadows: { + type: 'boolean', + value: false, + description: 'Drop shadows on comment boxes (turn off for faster performance)' + }, + commentRounded: { + type: 'boolean', + value: true, + description: 'Round corners of comment boxes' + }, + commentBoxHover: { + type: 'boolean', + value: true, + description: 'Highlight comment box hierarchy on hover (turn off for faster performance)' + }, + commentIndent: { + type: 'text', + value: 10, + description: 'Indent comments by [x] pixels (only enter the number, no \'px\')' + }, + continuity: { + type: 'boolean', + value: false, + description: 'Show comment continuity lines' + }, + lightSwitch: { + type: 'boolean', + value: true, + description: 'Enable lightswitch (toggle between light / dark reddit)' + }, + lightOrDark: { + type: 'enum', + values: [ + { name: 'Light', value: 'light' }, + { name: 'Dark', value: 'dark' } + ], + value: 'light', + description: 'Light, or dark?' + }, + showExpandos: { + type: 'boolean', + value: true, + description: 'Bring back video and text expando buttons for users with compressed link display' + } + }, + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]*/i, + /https:\/\/www.reddit.com\/[-\w\.\/]*/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + if (this.options.navTop.value) { + this.navTop(); + } + var commentsRegex = new RegExp(/http:\/\/www.reddit.com\/[-\w\.\/]*comments\/[-\w\.\/]*/i); + if ((this.options.commentBoxes.value) && (commentsRegex.test(location.href))) { + this.commentBoxes(); + } + if (this.options.lightSwitch.value) { + this.lightSwitch(); + } + if (this.options.lightOrDark.value == 'dark') { + this.redditDark(); + } + if (this.options.showExpandos.value) { + RESUtils.addCSS('.compressed .expando-button { display: block !important; }'); + //GM_addStyle(css); + } + this.userbarHider(); + this.subredditStyles(); + } + }, + navTop: function() { + RESUtils.addCSS('#header-bottom-right { top: 20px; border-radius: 0px 0px 0px 7px; -moz-border-radius: 0px 0px 0px 7px; -webkit-border-radius: 0px 0px 0px 7px; bottom: auto; }'); + //GM_addStyle(css); + }, + userbarHider: function() { + RESUtils.addCSS("#userbarToggle { width: 7px; height: 11px; display: inline-block; background-image: url('http://thumbs.reddit.com/t5_2s10b_0.png'); cursor: pointer; margin-right: 4px; background-repeat: no-repeat; }"); + RESUtils.addCSS(".userbarHide { background-position: 0px -137px; }"); + RESUtils.addCSS(".userbarShow { background-position: -8px -137px; }"); + //GM_addStyle(css); + var userbar = document.getElementById('header-bottom-right'); + if (userbar) { + this.userbarToggle = createElementWithID('div','userbarToggle'); + this.userbarToggle.setAttribute('title','Toggle Userbar'); + addClass(this.userbarToggle, 'userbarHide'); + this.userbarToggle.addEventListener('click', function(e) { + modules['styleTweaks'].toggleUserBar(); + }, false); + userbar.insertBefore(this.userbarToggle, userbar.firstChild); + if (localStorage.getItem('RESModules.styleTweaks.userbarState') == 'hidden') { + this.toggleUserBar(); + } + } + }, + toggleUserBar: function() { + var nextEle = this.userbarToggle.nextSibling; + if (hasClass(this.userbarToggle,'userbarHide')) { + removeClass(this.userbarToggle,'userbarHide'); + addClass(this.userbarToggle,'userbarShow'); + localStorage.setItem('RESModules.styleTweaks.userbarState', 'hidden'); + while ((typeof(nextEle) != 'undefined') && (nextEle != null)) { + nextEle.style.display = 'none'; + nextEle = nextEle.nextSibling; + } + } else { + removeClass(this.userbarToggle,'userbarShow'); + addClass(this.userbarToggle,'userbarHide'); + localStorage.setItem('RESModules.styleTweaks.userbarState', 'visible'); + while ((typeof(nextEle) != 'undefined') && (nextEle != null)) { + nextEle.style.display = 'inline-block'; + nextEle = nextEle.nextSibling; + } + } + }, + commentBoxes: function() { + // replaced with a less intensive method... adapted from Reddit Comment Boxes via: + // @description Updated version of Tiby312's Reddit Comment Boxes script (https://userscripts-mirror.org/scripts/show/63628) + // @author flatluigi + + + RESUtils.addCSS(".comment{"); + if (this.options.commentRounded.value) { + RESUtils.addCSS(" -moz-border-radius:7px !important;"+ + " -webkit-border-radius:7px !important;"+ + " border-radius:7px !important;"); + } + RESUtils.addCSS(" margin-left:"+this.options.commentIndent.value+"px !important;"+ + " margin-right:8px!important;"+ + " margin-top:0px!important;"+ + " margin-bottom:8px!important;"+ + + " background-color:#ffffff !important;"+ + " border:1px solid #bbbcbf !important;"+ + " padding-left:5px!important;"+ + " padding-top:5px!important;"+ + " padding-right:8px!important;"+ + " padding-bottom:0px!important;"+ + "}"); + if (this.options.commentBoxShadows.value) { + RESUtils.addCSS('.comment {-webkit-box-shadow: #BBB 2px 2px 0px inset; -moz-box-shadow: #BBB 2px 2px 0px inset; box-shadow: #BBB 2px 2px 0px inset; border:1px solid #DDD; padding-bottom:0px; padding: 4px 5px 4px 4px; margin: 0px 0px 3px; }'); + } + if (this.options.continuity.value) { + RESUtils.addCSS('.comment div.child { border-left: 1px dotted #555555 !important; } '); + } else { + RESUtils.addCSS('.comment div.child { border-left: none !important; } '); + } + RESUtils.addCSS(".comment .comment{"+ + " margin-right:0px!important;"+ + " background-color:#F7F7F8 !important;"+ + "}"+ + ".comment .comment .comment{"+ + " background-color:#ffffff !important;"+ + "}"+ + ".comment .comment .comment .comment{"+ + " background-color:#F7F7F8 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment{"+ + " background-color:#ffffff !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment{"+ + " background-color:#F7F7F8 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#ffffff !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#F7F7F8 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#ffffff !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#F7F7F8 !important;"+ + "}"+ + ".commentarea, .link, .comment {"+ + " overflow:hidden; !important;"+ + "}"+ + "body > .content {"+ + " padding-right:0px; !important;"+ + "}"); + if (this.options.commentBoxHover.value) { + RESUtils.addCSS(" .comment:hover {border: 1px solid #99AAEE !important; }"); + } + //GM_addStyle(css); + }, + lightSwitch: function() { + RESUtils.addCSS("#lightSwitch { width: 24px; height: 11px; display: inline-block; background-image: url('http://thumbs.reddit.com/t5_2s10b_0.png'); cursor: pointer; }"); + RESUtils.addCSS(".lightOn { background-position: 0px -96px; } "); + RESUtils.addCSS(".lightOff { background-position: 0px -108px; } "); + //GM_addStyle(css); + var thisFrag = document.createDocumentFragment(); + var separator = document.createElement('span'); + addClass(separator,'separator'); + separator.innerHTML = '|'; + this.lightSwitch = document.createElement('span'); + this.lightSwitch.setAttribute('title',"Toggle night and day"); + this.lightSwitch.addEventListener('click',function(e) { + e.preventDefault(); + if (hasClass(modules['styleTweaks'].lightSwitch, 'lightOn')) { + removeClass(modules['styleTweaks'].lightSwitch, 'lightOn'); + addClass(modules['styleTweaks'].lightSwitch, 'lightOff'); + RESUtils.setOption('styleTweaks','lightOrDark','dark'); + modules['styleTweaks'].redditDark(); + } else { + removeClass(modules['styleTweaks'].lightSwitch, 'lightOff'); + addClass(modules['styleTweaks'].lightSwitch, 'lightOn'); + RESUtils.setOption('styleTweaks','lightOrDark','light'); + modules['styleTweaks'].redditDark(true); + } + }, true); + this.lightSwitch.setAttribute('id','lightSwitch'); + this.lightSwitch.innerHTML = ' '; + (this.options.lightOrDark.value == 'dark') ? addClass(this.lightSwitch, 'lightOff') : addClass(this.lightSwitch, 'lightOn'); + thisFrag.appendChild(separator); + thisFrag.appendChild(this.lightSwitch); + insertAfter(RESConsole.RESPrefsLink, thisFrag); + }, + subredditStyles: function() { + this.ignoredSubReddits = JSON.parse(localStorage.getItem('RESmodules.styleTweaks.ignoredSubredditStyles')); + if (this.ignoredSubReddits == null) { + this.ignoredSubReddits = Array(); + } + this.head = document.getElementsByTagName("head")[0]; + var subredditTitle = document.querySelector('.titlebox h1'); + var styleToggle = document.createElement('div'); + var thisLabel = document.createElement('label'); + addClass(styleToggle,'styleToggle'); + thisLabel.setAttribute('for','subRedditStyleCheckbox'); + thisLabel.innerHTML = 'Use subreddit style '; + styleToggle.appendChild(thisLabel); + this.styleToggleCheckbox = document.createElement('input'); + this.styleToggleCheckbox.setAttribute('type','checkbox'); + this.styleToggleCheckbox.setAttribute('name','subRedditStyleCheckbox'); + this.curSubReddit = RESUtils.currentSubReddit(); + if ((this.curSubReddit != null) && (subredditTitle != null)) { + var idx = this.ignoredSubReddits.indexOf(this.curSubReddit); + if (idx == -1) { + this.styleToggleCheckbox.checked = true; + } else { + this.toggleSubredditStyle(false); + } + this.styleToggleCheckbox.addEventListener('change', function(e) { + modules['styleTweaks'].toggleSubredditStyle(this.checked); + }, false); + styleToggle.appendChild(this.styleToggleCheckbox); + insertAfter(subredditTitle, styleToggle); + } + }, + toggleSubredditStyle: function(toggle) { + if (toggle) { + var idx = this.ignoredSubReddits.indexOf(this.curSubReddit); + if (idx != -1) this.ignoredSubReddits.splice(idx, 1); // Remove it if found... + var subredditStyleSheet = document.createElement('link'); + subredditStyleSheet.setAttribute('title','applied_subreddit_stylesheet'); + subredditStyleSheet.setAttribute('rel','stylesheet'); + subredditStyleSheet.setAttribute('href','http://www.reddit.com/r/'+this.curSubReddit+'/stylesheet.css'); + this.head.appendChild(subredditStyleSheet); + } else { + var idx = this.ignoredSubReddits.indexOf(this.curSubReddit); // Find the index + if (idx==-1) this.ignoredSubReddits[this.ignoredSubReddits.length] = this.curSubReddit; + var subredditStyleSheet = this.head.querySelector('link[title=applied_subreddit_stylesheet]'); + if (subredditStyleSheet) { + subredditStyleSheet.parentNode.removeChild(subredditStyleSheet); + } + } + localStorage.setItem('RESmodules.styleTweaks.ignoredSubredditStyles',JSON.stringify(this.ignoredSubReddits)); + }, + redditDark: function(off) { + if (off) { + if (typeof(this.darkStyle) != 'undefined') { + this.darkStyle.parentNode.removeChild(this.darkStyle); + } + } else { + var css = "div[class=\"organic-listing\"] ul[class=\"tabmenu \"], div[id=\"header-bottom-left\"]] {background-color: #666 !important; } ::-moz-selection { background:orangered; }"; + css += "body { background-color: #222 !important; } .infobar { background-color:#222 !important; color:black !important; }"; + css += ".side { background:none !important; } h2, .tagline a, .content a, .footer a, .wired a, .side a, .subredditbox li a { color:#8AD !important; }"; + css += ".rank .star { color:orangered !important; } .content { color:#CCC !important; } .thing .title.loggedin, .link .title { color:#DFDFDF !important; }"; + css += ".link .midcol, .linkcompressed .midcol, .comment .midcol { background:none !important; margin-right:6px !important; margin-top:4px !important; }"; + css += ".link .midcol { width:29px !important; } .link .midcol .arrow { margin-left:7px !important; margin-right:7px !important; }"; + css += ".arrow { height:14px !important; margin-top:0 !important; width:15px !important; }"; + css += ".arrow.up { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=zs9q49wxah08x4kpv2tu5x4nbda7kmcpgkbj) -15px 0 no-repeat !important; }"; + css += ".arrow.down { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=10999ad3mtco31oaf6rrggme3t9jdztmxtg6) -15px -14px no-repeat !important; }"; + css += ".arrow.up:hover { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=9oeida688vtqjpb4k0uy93oongrzuv5j7vcj) -30px 0 no-repeat !important; }"; + css += ".arrow.down:hover { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=cmsw4qrin2rivequ0x1wnmn8ltd7ke328yqs) -30px -14px no-repeat !important; }"; + css += ".arrow.upmod { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=8oarqkcswl255wrw3q1kyd74xrty50a7wr3z) 0 0 no-repeat !important; }"; + css += ".arrow.downmod { background:url(http://thumbs.reddit.com/t5_2qlyl_0.png?v=90eauq018nf41z3vr0u249gv2q6651xyzrkh) 0 -14px no-repeat !important; }"; + css += ".link .score.likes, .linkcompressed .score.likes { color:orangered !important; }"; + css += ".link .score.dislikes, .linkcompressed .score.dislikes { color:#8AD !important; }"; + css += ".linkcompressed .entry .buttons li a, .link .usertext .md, .thing .compressed, organic-listing .link, .organic-listing .link.promotedlink, .link.promotedlink.promoted { background:none !important; }"; + css += ".subredditbox li a:before { content:\"#\" !important; } .subredditbox li { font-weight:bold !important; text-transform:lowercase !important; }"; + css += ".side h3:after { content:\" (#reddit on freenode)\" !important; font-size:85% !important; font-weight:normal !important; }"; + css += "#subscribe a { color:#8AD !important; } .dropdown.lightdrop .drop-choices { background-color:#333 !important; }"; + css += ".dropdown.lightdrop a.choice:hover { background-color:#111 !important; } .side { background:none !important; color:#fff !important; margin-left:10px !important; }"; + css += ".side h4, .side h3 { color:#ddd !important; } .side h5 { color:#aaa !important; margin-top:5px !important; } .side p { margin-top:5px !important; }"; + css += ".sidebox, .subredditbox, .subreddit-info, .raisedbox, .login-form-side { background-color:#393939 !important; border:2px solid #151515 !important; color:#aaa !important; border-radius:8px !important; -moz-border-radius:8px !important; -webkit-border-radius:8px !important; }"; + css += ".login-form-side { background:#e8690a !important; border-bottom:0 !important; border-color:#e8690a !important; padding-bottom:1px !important; position:relative !important; }"; + css += ".login-form-side input { width:125px !important; } .login-form-side label { color:#111 !important; } .login-form-side a { color:#FFFFFF !important; font-size:11px !important; }"; + css += ".login-form-side .error { color:#660000 !important; } .subreddit-info .label { color:#aaa !important; } .subreddit-info { padding:10px !important; }"; + css += ".subreddit-info .spacer a { background-color:#222; border:none !important; margin-right:3px !important; }"; + css += ".subredditbox ul { padding:10px 0px 10px 3px !important; width:140px !important; } .subredditbox ul a:hover { text-decoration:underline !important; } .morelink { background:none !important; border:0 !important; border-radius-bottomleft:6px !important; -moz-border-radius-bottomleft:6px !important; -webkit-border-radius-bottomleft:6px !important; -moz-border-radius-topright:6px !important; -webkit-border-radius-bottom-left-radius:6px !important; -webkit-border-radius-top-right-radius:6px !important; }"; + css += ".morelink.blah:hover { background:none !important; color:#369 !important; } .morelink.blah { background:none !important; border:0 !important; color:#369 !important; }"; + css += ".morelink:hover { border:0 !important; color:white !important; } .sidebox { padding-left:60px !important; }"; + css += ".sidebox.submit { background:#393939 url(http://thumbs.reddit.com/t5_2qlyl_2.png?v=0s1s9iul2umpm0bx46cioc7yjwbkprt7r2qr) no-repeat 6px 50% !important; }"; + css += ".sidebox .spacer, .linkinfo {background-color:#393939 !important; } .nub {background-color: transparent !important;}"; + css += ".sidebox.create { background:#393939 url(http://thumbs.reddit.com/t5_2qlyl_1.png?v=gl82ywfldj630zod4iaq56cidjud4n79wqw8) no-repeat 6px 50% !important; }"; + css += ".sidebox .subtitle { color:#aaa !important; } h1 { border-bottom:1px solid #444 !important; }"; + css += "button.btn { background:none !important; border:2px solid black !important; color:black !important; position:relative !important; width:auto !important; }"; + css += ".commentreply .buttons button { margin-left:0 !important; margin-top:5px !important; } .commentreply .textarea { color:black !important; }"; + css += ".menuarea { margin-right:315px !important; } .permamessage { background-image:url(http://thumbs.reddit.com/t5_2qlyl_3.png?v=uza2aq80cb2x2e90ojhdqooj1wazax4jjzfc) !important; border-color:#369 !important; }"; + css += ".commentbody.border { background-color:#369 !important; } .commentreply .help tr { background:none !important; } .commentreply table.help { margin:2px !important; }"; + css += "#newlink th { padding-top:5px !important; vertical-align:top !important; } .pretty-form.long-text input[type=\"text\"], .pretty-form.long-text textarea, .pretty-form.long-text input[type=\"password\"], .commentreply textarea { background-color:#333 !important; border:2px solid black !important; color:#CCC !important; padding:4px !important; }"; + css += "input#title { height:5em !important; } .spam, .reported { background:none !important; border:2px dotted !important; padding:4px !important; }"; + css += ".spam { border-color:orangered !important; } .reported { border-color:goldenrod !important; } .organic-listing .linkcompressed { background:none !important; }"; + css += ".organic-listing .nextprev img { opacity:.7 !important; } .organic-listing .nextprev img:hover { opacity:.85 !important; }"; + css += "#search input[type=\"text\"] { background-color:#222 !important; color:gray !important; } #search input[type=\"text\"]:focus { color:white !important; }"; + css += "#sr-header-area, #sr-more-link { background:#c2d2e2 !important; } #sr-header-area { border-bottom:none !important; }"; + css += "#header-bottom-left .tabmenu .selected a { border-bottom:none !important; padding-bottom:0 !important; } #ad-frame { opacity:.8 !important; }"; + css += ".comment.unread { background-color:#4A473B !important; } .raisedbox .flat-list a { background-color:#222 !important; -moz-border-radius:2px !important; -webkit-border-radius:2px !important; }"; + css += ".raisedbox .flat-list a:hover { background-color:#336699 !important; color:white !important; } .instructions { background:white !important; padding:10px !important; }"; + css += ".instructions .preftable th, .instructions .pretty-form { color:black !important; } #feedback { padding:10px !important; } span[class=\"hover pagename redditname\"] a {font-size: 1.7em !important;}"; + css += ".thing .title.loggedin:visited, .link .title:visited {color: #666666 !important;} legend {background-color: black !important;}"; + css += "a.author.moderator, a.moderator {color:#3F4 !important; } a.author.friend, a.friend {color:rgb(255, 139, 36) !important; } a.submitter {color: #36F !important; }"; + css += "a.author.admin, a.admin{color: #f22 !important; } a.author.submitter { } table[class=\"markhelp md\"] tr td { background-color: #555 !important; }"; + css += "div.infobar { color: #ccc !important; } table[class=\"markhelp md\"] tr[style=\"background-color: rgb(255, 255, 153); text-align: center;\"] td { background-color: #36c !important; }"; + css += "form[class=\"usertext border\"] div.usertext-body { background-color: transparent !important; border-width: 2px !important; border-style: solid !important; border-color: #999 !important; }"; + css += "div[class=\"midcol likes\"], div[class=\"midcol dislikes\"], div[class=\"midcol unvoted\"] {padding: 0px 7px 0px 0px !important;}"; + css += "form[class=\"usertext border\"] div.usertext-body div.md { background-color: transparent !important; } form#form-t1_c0b71p54yc div {color: black !important;}"; + css += "a[rel=\"tag\"], a.dsq-help {color: #8AD !important; } div[class=\"post-body entry-content\"], div.dsq-auth-header { color: #ccc !important; }"; + css += "div#siteTable div[onclick=\"click_thing(this)\"] {background-color: #222 !important;} .md p {color: #ddd !important; } .mail .havemail img, .mail .nohavemail img { visibility: hidden; }"; + css += ".havemail { background: url('http://i.imgur.com/2Anoz.gif') bottom left no-repeat; } .mail .nohavemail { background: url('http://imgur.com/6WV6Il.gif') bottom left no-repeat; }"; + css += "#header-bottom-right { background-color: #BBBBBB !important; }"; + css += '.expando-button.image {background: none !important; background-image: url(http://thumbs.reddit.com/t5_2s10b_2.png) !important;}'; + css += '.expando-button.image.collapsed {background-position: 0px 0px !important;}'; + css += '.expando-button.image.collapsed:hover {background-position: 0px -24px !important;}'; + css += '.expando-button.image.expanded, .eb-se { margin-bottom:5px; background-position: 0px -48px !important;}'; + css += '.expando-button.image.expanded:hover, .eb-seh {background-position: 0px -72px !important;}'; + css += '.expando-button.selftext {background: none !important; background-image: url(http://thumbs.reddit.com/t5_2s10b_2.png) !important;}'; + css += '.expando-button.selftext.collapsed {background-position: 0px -96px !important;}'; + css += '.expando-button.selftext.collapsed:hover {background-position: 0px -120px !important;}'; + css += '.expando-button.selftext.expanded, .eb-se { margin-bottom:5px; background-position: 0px -144px !important;}'; + css += '.expando-button.selftext.expanded:hover, .eb-seh {background-position: 0px -168px !important;}'; + css += '.expando-button.video {background: none !important; background-image: url(http://thumbs.reddit.com/t5_2s10b_2.png) !important;}'; + css += '.expando-button.video.collapsed {background-position: 0px -192px !important;}'; + css += '.expando-button.video.collapsed:hover {background-position: 0px -216px !important;}'; + css += '.expando-button.video.expanded, .eb-se { margin-bottom:5px; background-position: 0px -240px !important;}'; + css += '.expando-button.video.expanded:hover, .eb-seh {background-position: 0px -264px !important;}'; + css += '.expando-button { background-color:transparent!important; }'; + css += ".keyHighlight, .keyHighlight div.md { background-color: #666666 !important; } .keyHighlight .title.loggedin:visited { color: #dfdfdf !important; } .nub {background: none !important;}"; + css += ".comment{"+ + " background-color:#444444 !important;"+ + "}"+ + ".comment .comment{"+ + " background-color:#111111 !important;"+ + "}"+ + ".comment .comment .comment{"+ + " background-color:#444444 !important;"+ + "}"+ + ".comment .comment .comment .comment{"+ + " background-color:#111111 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment{"+ + " background-color:#444444 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment{"+ + " background-color:#111111 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#444444 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#111111 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#444444 !important;"+ + "}"+ + ".comment .comment .comment .comment .comment .comment .comment .comment .comment .comment{"+ + " background-color:#111111 !important;"+ + "}"; + css += '.organic-listing .link { background-color: #333333 !important; } .sidecontentbox { background-color: #111111; } .side { background: none !important; background-color: #000000 !important; }'; + if (this.options.continuity.value) { + css += '.comment div.child { border-left: 1px dotted #555555 !important; } '; + } else { + css += '.comment div.child { border-left: none !important; } '; + } + css += '.roundfield {background-color: #111111 !important;}'; + css += '#authorInfoToolTip { background-color: #666666 !important; color: #cccccc !important; border-color: #888888 !important; } #authorInfoToolTip a { color: #88AADD !important; } '; + css += '.new-comment .usertext-body { background-color: #444444 !important; border: none !important; margin:-1px 0; }'; + css += '.thing { border: 1px solid #666666 !important; } '; + css += '.usertext-edit textarea { background-color: #666666 !important; color: #CCCCCC !important; } '; + this.darkStyle = createElementWithID('style', 'darkStyle'); + this.darkStyle.innerHTML = css; + document.body.appendChild(this.darkStyle); + } + // GM_addStyle(css); + } +}; + +modules['accountSwitcher'] = { + moduleID: 'accountSwitcher', + moduleName: 'Account Switcher', + options: { + accounts: { + type: 'table', + fields: [ + { name: 'username', type: 'text' }, + { name: 'password', type: 'password' } + ], + value: [ + /* + ['somebodymakethis','SMT','[SMT]'], + ['pics','pic','[pic]'] + */ + ], + description: 'Set your usernames and passwords below. They are only stored in RES preferences.' + } + }, + description: 'Store username/password pairs and switch accounts instantly while browsing Reddit!', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/[-\w\.\/]*/i, + /https:\/\/www.reddit.com\/[-\w\.\/]*/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + this.userLink = document.querySelector('#header-bottom-right > span.user > a'); + // this.loggedInUser = userLink.innerHTML; + this.loggedInUser = RESUtils.loggedInUser(); + var downArrowIMG = 'data:image/gif;base64,R0lGODlhBwAEALMAAAcHBwgICAoKChERETs7Ozo6OkJCQg0NDRoaGhAQEAwMDDIyMv///wAAAAAAAAAAACH5BAEAAAwALAAAAAAHAAQAAAQQ0BSykADsDAUwY4kQfOT4RQA7'; + var downArrow = document.createElement('img'); + downArrow.setAttribute('src', downArrowIMG); + downArrow.style.cursor = 'pointer'; + downArrow.style.marginLeft = '3px'; + downArrow.addEventListener('click',function(e) { + e.preventDefault(); + modules['accountSwitcher'].toggleAccountMenu(); + }, true); + insertAfter(this.userLink, downArrow); + + this.accountMenu = createElementWithID('UL','accountSwitcherMenu'); + this.accountMenu.style.display = 'none'; + RESUtils.addCSS('#accountSwitcherMenu { position: absolute; z-index: 999; display: none; padding: 3px; background-color: #ffffff; }'); + RESUtils.addCSS('.accountName { padding: 2px; border-bottom: 1px solid #AAAAAA; border-left: 1px solid #AAAAAA; border-right: 1px solid #AAAAAA; }'); + RESUtils.addCSS('.accountName:first-child { padding: 2px; border-top: 1px solid #AAAAAA; }'); + RESUtils.addCSS('.accountName:hover { background-color: #F3FAFF; }'); + // GM_addStyle(css); + var accounts = this.options.accounts.value; + if (accounts != null) { + var accountCount = 0; + for (var i=0, len=accounts.length; i 86400000) { + // mark off that we've displayed a new tooltip + localStorage.setItem('RESLastToolTip',now.getTime()); + if (lastCheck == 0) { + var thisTip = 'Welcome to RES. You can turn modules on and off, and configure settings for the modules using the [RES] link above. For feature requests, bug reports, etc - head over to /r/Enhancement.
    Do you keep seeing this message? see the FAQ about BetterPrivacy and similar addons.'; + this.showTip(thisTip); + } else { + this.randomTip(); + } + } + }, + randomTip: function() { + this.currTip = Math.floor(Math.random()*this.tips.length); + var thisTip = this.tips[this.currTip]; + this.showTip(thisTip); + }, + nextPrevTip: function(idx) { + if (typeof(this.currTip) == 'undefined') this.currTip = 0; + this.currTip += idx; + if (this.currTip < 0) { + this.currTip = this.tips.length; + } else if (this.currTip >= this.tips.length) { + this.currTip = 0; + } + var thisTip = this.tips[this.currTip]; + this.showTip(thisTip); + }, + tips: Array( + "Don't forget to subscribe to /r/Enhancement to keep up to date on the latest versions of RES, report bugs, or suggest features!", + "Don't want to see posts containing certain keywords? Want to filter out certain subreddits from /r/all? Try the filteReddit module!", + "RES checks for new versions every 24 hours, but if you want to check manually, open up the RES console and click [check for update]", + "Did you know you can configure the appearance of a number of things in RES? For example: Keyboard navigation lets you configure the look of the 'selected' box, and commentBoxes lets you configure the borders / shadows.", + "Do you subscribe to a ton of reddits? Give the subreddit tagger a try, it makes your homepage a bit more readable.", + "If you haven't tried it yet, Keyboard Navigation is great. Just hit ? while browsing for instructions.", + "Click the (_) next to a user to tag that user with any name you like - you can also color code the tag.", + "Roll over a user's name to get information about them such as their karma, and how long they've been a reddit user.", + "Hover over the 'parent' link in comments pages to see the text of the parent being referred to.", + "You can configure the color and style of MrDerk's User Highlighter module if you want to change how the highlights look.", + "Not a fan of how comments pages look? You can change the appearance in the Style Tweaks module", + "Sick of seeing these tips? They only show up once every 24 hours, but you can disable that in the RES Tips and Tricks preferences.", + "Don't like the night/day icon for switching between light/dark styles? Just disable the 'lightSwitch' option under Style Tweaks", + "See that little [vw] next to users you've voted on? That's their vote weight - it moves up and down as you vote the same user up / down." + ), + showTip: function(message) { + this.toolTipText.innerHTML = message; + RESUtils.fadeElementIn(this.toolTip, 0.2); + } +}; + +modules['filteReddit'] = { + moduleID: 'filteReddit', + moduleName: 'filteReddit', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + NSFWfilter: { + type: 'boolean', + value: false, + description: 'Filters all links labelled NSFW' + }, + keywords: { + type: 'table', + fields: [ + { name: 'keyword', type: 'text' } + ], + value: [ + ], + description: 'Type in title keywords you want to ignore if they show up in a title' + }, + subreddits: { + type: 'table', + fields: [ + { name: 'subreddit', type: 'text' } + ], + value: [ + ], + description: 'Type in a subreddit you want to ignore (only applies to /r/all)' + }, + domains: { + type: 'table', + fields: [ + { name: 'domain', type: 'text' } + ], + value: [ + ], + description: 'Type in domain keywords you want to ignore. Note that "reddit" would ignore "reddit.com" and "fooredditbar.com"' + } + }, + description: 'Filter out NSFW content, or links by keyword, domain (use User Tagger to ignore by user) or subreddit (for /r/all).', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: new Array( + /http:\/\/www.reddit.com\/?/i, + /http:\/\/www.reddit.com\/r\/[\w]+\/?$/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + if (this.options.NSFWfilter.value) { + this.filterNSFW(); + } + document.body.addEventListener('DOMNodeInserted', function(event) { + if ((event.target.tagName == 'DIV') && (event.target.getAttribute('id') == 'siteTable')) { + modules['filteReddit'].scanEntries(event.target); + } + }, true); + this.scanEntries(); + } + }, + scanEntries: function(ele) { + if (ele == null) { + var entries = document.querySelectorAll('#siteTable div.thing.link'); + } else { + var entries = ele.querySelectorAll('div.thing.link'); + } + var RALLre = /\/r\/all\/?$/i; + var onRALL = RALLre.exec(location.href); + for (var i=0, len=entries.length; i a').innerHTML; + var thisSubreddit = entries[i].querySelector('.entry a.subreddit'); + if (thisSubreddit != null) { + var postSubreddit = thisSubreddit.innerHTML; + } else { + var postSubreddit = false; + } + var filtered = false; + filtered = this.filterTitle(postTitle); + if (!filtered) filtered = this.filterDomain(postDomain); + if ((!filtered) && (onRALL) && (postSubreddit)) { + filtered = this.filterSubreddit(postSubreddit); + } + if (filtered) { + // console.log('filtered this entry: ' + postTitle); + entries[i].style.display = 'none'; + } + } + }, + filterNSFW: function() { + RESUtils.addCSS('.over18 { display: none; !important }'); + //GM_addStyle(css); + }, + filterTitle: function(title) { + return this.arrayContainsSubstring(this.options.keywords.value, title.toLowerCase()); + }, + filterDomain: function(domain) { + return this.arrayContainsSubstring(this.options.domains.value, domain.toLowerCase()); + }, + filterSubreddit: function(subreddit) { + return this.arrayContainsSubstring(this.options.subreddits.value, subreddit.toLowerCase()); + }, + arrayContainsSubstring: function(obj, substring) { + var i = obj.length; + while (i--) { + if ((obj[i] != null) && (substring.indexOf(obj[i].toString().toLowerCase()) != -1)) { + return true; + } + } + return false; + } +}; + +modules['newCommentCount'] = { + moduleID: 'newCommentCount', + moduleName: 'New Comment Count', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + cleanComments: { + type: 'text', + value: 7, + description: 'Clean out cached comment counts of pages you haven\t visited in [x] days - enter a number here only!' + } + }, + description: 'Shows how many new comments there are since your last visit.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( + /http:\/\/www.reddit.com\/?/i, + /http:\/\/www.reddit.com\/r\/[\w]+\/?$/i, + /http:\/\/www.reddit.com\/[-\w\.\/]+\/comments\/[-\w\.]+/i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // go! + var counts = localStorage.getItem('RESmodules.newCommentCount.counts'); + if (counts == null) { + counts = '{}'; + } + this.commentCounts = JSON.parse(counts); + if (RESUtils.pageType() == 'comments') { + this.updateCommentCount(); + document.body.addEventListener('DOMNodeInserted', function(event) { + if ((event.target.tagName == 'DIV') && (hasClass(event.target,'thing'))) { + modules['newCommentCount'].updateCommentCount(); + } + }, true); + } else { + this.processCommentCounts(); + } + RESUtils.addCSS('.newComments { display: inline; color: #aaaadd; }'); + } + }, + processCommentCounts: function() { + var lastClean = localStorage.getItem('RESmodules.newCommentCount.lastClean'); + var now = new Date(); + if (lastClean == null) { + localStorage.setItem('RESmodules.newCommentCount.lastClean', now.getTime()); + } + //if ((now.getTime() - lastClean) > 86400000) { + if ((now.getTime() - lastClean) > 5) { + this.cleanCache(); + } + var IDre = /\/r\/[\w]+\/comments\/([\w]+)\//i; + var commentsLinks = document.querySelectorAll('#siteTable div.thing.link a.comments'); + for (var i=0, len=commentsLinks.length; i 0) { + commentsLinks[i].innerHTML += ' ('+diff+' new)'; + } + } + } + } + }, + updateCommentCount: function() { + var IDre = /\/r\/[\w]+\/comments\/([\w]+)\//i; + var matches = IDre.exec(location.href); + if (matches) { + if (!this.currentCommentCount) { + this.currentCommentID = matches[1]; + var thisCountText = document.querySelector('#siteTable a.comments').innerHTML; + var split = thisCountText.split(' '); + this.currentCommentCount = split[0]; + } else { + this.currentCommentCount++; + } + } + var now = new Date(); + if (typeof(this.commentCounts) == 'undefined') { + this.commentCounts = {}; + } + this.commentCounts[this.currentCommentID] = { + count: this.currentCommentCount, + updateTime: now.getTime() + } + localStorage.setItem('RESmodules.newCommentCount.counts', JSON.stringify(this.commentCounts)); + }, + cleanCache: function() { + var now = new Date(); + for(i in this.commentCounts) { + if ((now.getTime() - this.commentCounts[i].updateTime) > (86400000 * this.options.cleanComments.value)) { + this.commentCounts[i] = null; + } + } + localStorage.setItem('RESmodules.newCommentCount.lastClean', now.getTime()); + } +}; + +/* eh, not for now... +modules['tweetit'] = { + moduleID: 'tweetit', + moduleName: 'tweetit', + options: { + // any configurable options you have go here... + // options must have a type and a value.. + // valid types are: text, boolean (if boolean, value must be true or false) + // for example: + defaultMessage: { + type: 'text', + value: 'this is default text', + description: 'explanation of what this option is for' + }, + doSpecialStuff: { + type: 'boolean', + value: false, + description: 'explanation of what this option is for' + } + }, + description: 'Adds twitter functionality to let you tweet comments and posts.', + isEnabled: function() { + return RESConsole.getModulePrefs(this.moduleID); + }, + include: Array( +// NEED TO FIX * / when uncommenting +// /http:\/\/www.reddit.com\/[-\w\.\/]* /i, +// /https:\/\/www.reddit.com\/[-\w\.\/]* /i + ), + isMatchURL: function() { + return RESUtils.isMatchURL(this.moduleID); + }, + go: function() { + if ((this.isEnabled()) && (this.isMatchURL())) { + // get this module's options... + RESUtils.getOptions(this.moduleID); + // do stuff now! + // this is where your code goes... + var css = '#tweetBoxContainer { position: absolute; width: 520px; height: 170px; left: 0px; top: 0px; z-index: 1010; background-color: #FAFAFA; padding: 4px; }'; + css += '#tweetBoxContainerClose { float: right; width: 16px; height: 16px; background-position: 0px -120px; background-image: url("http://thumbs.reddit.com/t5_2s10b_0.png"); cursor: pointer; } #tweetBox { z-index: 1011; }'; + css += '.tweetButton { cursor: pointer; }'; + GM_addStyle(css); + this.injectAnywhere(); + // TODO: this will need to be adjusted for comments vs. links pages... + var allTaglines = document.body.querySelectorAll('.tagline'); + for (var i=0; i konami.pattern.length) konami.input = konami.input.substr((konami.input.length - konami.pattern.length)); + if (konami.input == konami.pattern) { + konami.code(link); + konami.input=""; + return; + } + },this); + this.iphone.load(link) + + }, + code: function(link) { window.location=link}, + iphone:{ + start_x:0, + start_y:0, + stop_x:0, + stop_y:0, + tap:false, + capture:false, + orig_keys:"", + keys:["UP","UP","DOWN","DOWN","LEFT","RIGHT","LEFT","RIGHT","TAP","TAP","TAP"], + code: function(link) { konami.code(link);}, + load: function(link){ + orig_keys = this.keys; + konami.addEvent(document,"touchmove",function(e){ + if(e.touches.length == 1 && konami.iphone.capture==true){ + var touch = e.touches[0]; + konami.iphone.stop_x = touch.pageX; + konami.iphone.stop_y = touch.pageY; + konami.iphone.tap = false; + konami.iphone.capture=false; + konami.iphone.check_direction(); + } + }); + konami.addEvent(document,"touchend",function(evt){ + if (konami.iphone.tap==true) konami.iphone.check_direction(link); + },false); + konami.addEvent(document,"touchstart", function(evt){ + konami.iphone.start_x = evt.changedTouches[0].pageX + konami.iphone.start_y = evt.changedTouches[0].pageY + konami.iphone.tap = true + konami.iphone.capture = true + }); + }, + check_direction: function(link){ + x_magnitude = Math.abs(this.start_x-this.stop_x) + y_magnitude = Math.abs(this.start_y-this.stop_y) + x = ((this.start_x-this.stop_x) < 0) ? "RIGHT" : "LEFT"; + y = ((this.start_y-this.stop_y) < 0) ? "DOWN" : "UP"; + result = (x_magnitude > y_magnitude) ? x : y; + result = (this.tap==true) ? "TAP" : result; + + if (result==this.keys[0]) this.keys = this.keys.slice(1,this.keys.length) + if (this.keys.length==0) { + this.keys=this.orig_keys; + this.code(link) + } + } + } + } + return konami; +}; + +(function(u) { + // Don't fire the script on the iframe. This annoyingly fires this whole thing twice. Yuck. + // Also don't fire it on static.reddit or thumbs.reddit, as those are just images. + if ((location.href.match(/comscore-iframe/i)) || (location.href.match(/static\.reddit/i)) || (location.href.match(/thumbs\.reddit/i))) { + // do nothing. + return false; + } + // added this if statement because some people's Greasemonkey "include" lines are getting borked or ignored, so they're calling RES on non-reddit pages. + if (location.href.match(/reddit\.com/i)) { + RESUtils.checkForUpdate(); + // add the config console link... + RESConsole.create(); + RESConsole.addConsoleLink(); + var userNameEle = document.querySelector('#header-bottom-right span a'); + if ((typeof(userNameEle) != 'undefined') && (userNameEle != null)) { + RESUtils.userName = userNameEle.text; + } + RESUtils.checkIfSubmitting(); + // go through each module and run it + for (i in modules) { + thisModuleID = i; + if (typeof(modules[thisModuleID]) == 'object') { + //console.log(thisModuleID + ' start: ' + Date()); + //perfTest(thisModuleID+' start'); + modules[thisModuleID].go(); + //perfTest(thisModuleID+' end'); + //console.log(thisModuleID + ' end: ' + Date()); + } + } + /* + for (var i = 0; i < localStorage.length; i++){ + console.log('key: ' + localStorage.key(i)); + console.log('value: ' + localStorage.getItem(localStorage.key(i))); + } + */ + GM_addStyle(RESUtils.css); + // console.log('end: ' + Date()); + } + if (location.href.match(/reddit.honestbleeps.com\/download/)) { + var installLinks = document.body.querySelectorAll('.install'); + for (var i=0, len=installLinks.length;i 0; +function disableWindowOpen () { + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].open = function () { + return { + closed: false, + }; + }; + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].alert = util_core__WEBPACK_IMPORTED_MODULE_0__["nop"]; + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].confirm = util_core__WEBPACK_IMPORTED_MODULE_0__["nop"]; +} +function disableLeavePrompt (element) { + if (!element) { + return; + } + const seal = { + set: function () { + Object(util_logger__WEBPACK_IMPORTED_MODULE_4__["info"])('blocked onbeforeunload'); + }, + }; + element.onbeforeunload = undefined; + if (isSafari) { + element.__defineSetter__('onbeforeunload', seal.set); + } else { + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].Object.defineProperty(element, 'onbeforeunload', { + configurable: true, + enumerable: false, + get: undefined, + set: seal.set, + }); + } + const oael = element.addEventListener; + const nael = function (type) { + if (type === 'beforeunload') { + Object(util_logger__WEBPACK_IMPORTED_MODULE_4__["info"])('blocked addEventListener onbeforeunload'); + return; + } + return oael.apply(this, arguments); + }; + element.addEventListener = nael; +} +function changeTitle () { + document.title += ' - AdsBypasser'; +} +async function beforeDOMReady (handler) { + const config = await Object(util_config__WEBPACK_IMPORTED_MODULE_3__["dumpConfig"])(); + Object(util_logger__WEBPACK_IMPORTED_MODULE_4__["info"])('working on\n%s \nwith\n%s', window.location.toString(), JSON.stringify(config)); + disableLeavePrompt(util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"]); + disableWindowOpen(); + await handler.start(); +} +async function afterDOMReady (handler) { + disableLeavePrompt(util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].document.body); + changeTitle(); + await handler.ready(); +} +function waitDOM () { + return new Promise((resolve) => { + if (document.readyState !== 'loading') { + resolve(); + return; + } + document.addEventListener('DOMContentLoaded', () => { + resolve(); + }); + }); +} +async function main () { + if (util_platform__WEBPACK_IMPORTED_MODULE_2__["rawUSW"].top !== util_platform__WEBPACK_IMPORTED_MODULE_2__["rawUSW"].self) { + return; + } + util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].registerMenuCommand('AdsBypasser - Configure', () => { + util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].openInTab('https://adsbypasser.github.io/configure.html'); + }); + await Object(util_config__WEBPACK_IMPORTED_MODULE_3__["loadConfig"])(); + const handler = Object(util_dispatcher__WEBPACK_IMPORTED_MODULE_1__["findHandler"])(); + if (handler) { + await beforeDOMReady(handler); + await waitDOM(); + await afterDOMReady(handler); + return; + } +} +main().catch((e) => { + Object(util_logger__WEBPACK_IMPORTED_MODULE_4__["warn"])(e); +}); + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "AdsBypasserError", function() { return AdsBypasserError; }); + __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); + __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); + __webpack_require__.d(__webpack_exports__, "forEach", function() { return forEach; }); + __webpack_require__.d(__webpack_exports__, "isString", function() { return isString; }); + __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); + __webpack_require__.d(__webpack_exports__, "none", function() { return none; }); + __webpack_require__.d(__webpack_exports__, "nop", function() { return nop; }); + __webpack_require__.d(__webpack_exports__, "partial", function() { return partial; }); + __webpack_require__.d(__webpack_exports__, "tryEvery", function() { return tryEvery; }); + __webpack_require__.d(__webpack_exports__, "wait", function() { return wait; }); +class AdsBypasserError extends Error { + constructor (message) { + super(message); + } + get name () { + return 'AdsBypasserError'; + } +} +function forEach (collection, fn) { + if (isArrayLike(collection)) { + return Array.prototype.forEach.call(collection, fn); + } + return Object.keys(collection).forEach((k) => { + return fn(collection[k], k, collection); + }); +} +function every (collection, fn) { + if (isArrayLike(collection)) { + return Array.prototype.every.call(collection, fn); + } + return Object.keys(collection).every((k) => { + return fn(collection[k], k, collection); + }); +} +function map (collection, fn) { + if (isArrayLike(collection)) { + return Array.prototype.map.call(collection, fn); + } + const mapped = Object.assign({}, collection); + Object.getOwnPropertyNames(mapped).forEach((k) => { + mapped[k] = fn(collection[k], k, collection); + }); + return mapped; +} +function find (collection, fn) { + for (const [k, v] of enumerate(collection)) { + const r = fn(v, k, collection); + if (r !== none) { + return [k, v, r]; + } + } + return [none, none, none]; +} +function * enumerate (collection) { + if (isArrayLike(collection)) { + yield * Array.prototype.entries.call(collection); + return; + } + const keys = Object.getOwnPropertyNames(collection); + for (const k of keys) { + yield [k, collection[k]]; + } +} +function isArrayLike (collection) { + return Array.isArray(collection) || isNodeList(collection); +} +function isNodeList (collection) { + return collection.constructor.name === 'NodeList'; +} +function partial (fn, ...args) { + if (typeof fn !== 'function') { + throw new AdsBypasserError('must give a function'); + } + return (...innerArgs) => { + return fn(...args.concat(innerArgs)); + }; +} +function isString (value) { + return (typeof value === 'string') || (value instanceof String); +} +function nop () { +} +const none = nop; +function wait (msDelay) { + return new Promise((resolve) => { + setTimeout(resolve, msDelay); + }); +} +function tryEvery (msInterval, fn) { + return new Promise((resolve) => { + const handle = setInterval(function () { + const result = fn(); + if (result !== none) { + clearInterval(handle); + resolve(result); + } + }, msInterval); + }); +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "register", function() { return register; }); + __webpack_require__.d(__webpack_exports__, "findHandler", function() { return findHandler; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +const patterns = []; +function register (pattern) { + patterns.push(pattern); +} +function dispatchByObject (rule, url_6) { + const matched = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["map"])(rule, (pattern, part) => { + if (pattern instanceof RegExp) { + return url_6[part].match(pattern); + } + if (Array.isArray(pattern)) { + const [, , r] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(pattern, (sp) => { + const m = url_6[part].match(sp); + return m || util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + }); + return r !== util_core__WEBPACK_IMPORTED_MODULE_0__["none"] ? r : null; + } + throw new util_core__WEBPACK_IMPORTED_MODULE_0__["AdsBypasserError"]('invalid rule'); + }); + const passed = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["every"])(matched, (v) => { + return !!v; + }); + return passed ? matched : null; +} +function dispatchByRegExp (rule, url_1) { + return url_1.match(rule); +} +function dispatchByArray (rules, url_1, url_3, url_6) { + const [, , r] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(rules, (rule) => { + const m = dispatch(rule, url_1, url_3, url_6); + return m ? m : util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + }); + return r !== util_core__WEBPACK_IMPORTED_MODULE_0__["none"] ? r : null; +} +function dispatchByString (rule, url_3) { + let scheme = /\*|https?|file|ftp|chrome-extension/; + let host = /\*|(\*\.)?([^/*]+)/; + let path = /\/.*/; + let tmp = `^(${scheme.source})://(${host.source})?(${path.source})$`; + let up = new RegExp(tmp); + const matched = rule.match(up); + if (!matched) { + return null; + } + scheme = matched[1]; + host = matched[2]; + const wc = matched[3]; + const sd = matched[4]; + path = matched[5]; + if (scheme === '*' && !/https?/.test(url_3.scheme)) { + return null; + } + if (scheme !== url_3.scheme) { + return null; + } + if (scheme !== 'file' && host !== '*') { + if (wc) { + up = url_3.host.indexOf(sd); + if (up < 0 || up + sd.length !== url_3.host.length) { + return null; + } + } else if (host !== url_3.host) { + return null; + } + } + tmp = path.replace(/[*.[\]?+#]/g, (c) => { + if (c === '*') { + return '.*'; + } + return '\\' + c; + }); + path = new RegExp(`^${tmp}$`); + if (!path.test(url_3.path)) { + return null; + } + return url_3; +} +function dispatchByFunction (rule, url_1, url_3, url_6) { + return rule(url_1, url_3, url_6); +} +function dispatch (rule, url_1, url_3, url_6) { + if (Array.isArray(rule)) { + return dispatchByArray(rule, url_1, url_3, url_6); + } + if (typeof rule === 'function') { + return dispatchByFunction(rule, url_1, url_3, url_6); + } + if (rule instanceof RegExp) { + return dispatchByRegExp(rule, url_1); + } + if (Object(util_core__WEBPACK_IMPORTED_MODULE_0__["isString"])(rule)) { + return dispatchByString(rule, url_3); + } + return dispatchByObject(rule, url_6); +} +function findHandler () { + const url_1 = window.location.toString(); + const url_3 = { + scheme: window.location.protocol.slice(0, -1), + host: window.location.host, + path: window.location.pathname + window.location.search + window.location.hash, + }; + const url_6 = { + scheme: window.location.protocol, + host: window.location.hostname, + port: window.location.port, + path: window.location.pathname, + query: window.location.search, + hash: window.location.hash, + }; + const [i, pattern, matched] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(patterns, (pattern) => { + const m = dispatch(pattern.rule, url_1, url_3, url_6); + return m ? m : util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + }); + if (i === util_core__WEBPACK_IMPORTED_MODULE_0__["none"]) { + return null; + } + if (!pattern.start && !pattern.ready) { + return null; + } + return { + start: pattern.start ? Object(util_core__WEBPACK_IMPORTED_MODULE_0__["partial"])(pattern.start, matched) : util_core__WEBPACK_IMPORTED_MODULE_0__["nop"], + ready: pattern.ready ? Object(util_core__WEBPACK_IMPORTED_MODULE_0__["partial"])(pattern.ready, matched) : util_core__WEBPACK_IMPORTED_MODULE_0__["nop"], + }; +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "rawUSW", function() { return rawUSW; }); + __webpack_require__.d(__webpack_exports__, "usw", function() { return usw; }); + __webpack_require__.d(__webpack_exports__, "GMAPI", function() { return GMAPI; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +const rawUSW = getUnsafeWindow(); +const usw = getUnsafeWindowProxy(); +const GMAPI = getGreaseMonkeyAPI(); +function getUnsafeWindow () { + let w = null; + try { + w = unsafeWindow; + } catch (e) { + try { + w = (0, eval)('this').global; + } catch (e) { + } + } + return w ? w : (0, eval)('this').window; +} +function getGreaseMonkeyAPI () { + if (rawUSW.global) { + return null; + } + const gm = {}; + if (typeof GM_openInTab === 'function') { + gm.openInTab = GM_openInTab; + } else { + gm.openInTab = GM.openInTab; + } + if (typeof GM_getValue === 'function') { + gm.getValue = (name, default_) => { + return Promise.resolve(GM_getValue(name, default_)); + }; + } else { + gm.getValue = GM.getValue; + } + if (typeof GM_setValue === 'function') { + gm.setValue = (name, value) => { + return Promise.resolve(GM_setValue(name, value)); + }; + } else { + gm.setValue = GM.setValue; + } + if (typeof GM_deleteValue === 'function') { + gm.deleteValue = (name) => { + return Promise.resolve(GM_deleteValue(name)); + }; + } else { + gm.deleteValue = GM.deleteValue; + } + if (typeof GM_xmlhttpRequest === 'function') { + gm.xmlHttpRequest = GM_xmlhttpRequest; + } else { + gm.xmlHttpRequest = GM.xmlHttpRequest; + } + if (typeof GM_registerMenuCommand === 'function') { + gm.registerMenuCommand = GM_registerMenuCommand; + } else { + gm.registerMenuCommand = util_core__WEBPACK_IMPORTED_MODULE_0__["nop"]; + } + if (typeof GM_getResourceURL === 'function') { + gm.getResourceUrl = (resourceName) => { + return Promise.resolve(GM_getResourceURL(resourceName)); + }; + } else if (typeof GM === 'object' && GM && GM.getResourceUrl) { + gm.getResourceUrl = GM.getResourceUrl; + } + return gm; +} +const MAGIC_KEY = '__adsbypasser_reverse_proxy__'; +function getUnsafeWindowProxy () { + const isFirefox = typeof InstallTrigger !== 'undefined'; + const isWebExtension = typeof cloneInto === 'undefined' || typeof exportFunction === 'undefined'; + if (!isFirefox || isWebExtension) { + return rawUSW; + } + const decorator = { + set (target, key, value) { + if (key === MAGIC_KEY) { + return false; + } + if (target === unsafeWindow && key === 'open') { + const d = Object.getOwnPropertyDescriptor(target, key); + d.value = clone(function () { + const rv = value(); + return cloneInto(rv, unsafeWindow); + }); + Object.defineProperty(target, key, d); + } else { + target[key] = clone(value); + } + return true; + }, + get (target, key) { + if (key === MAGIC_KEY) { + return target; + } + const value = target[key]; + const type = typeof value; + if (value === null || (type !== 'function' && type !== 'object')) { + return value; + } + return new Proxy(value, decorator); + }, + apply (target, self, args) { + args = Array.prototype.slice.call(args); + if (target === unsafeWindow.Object.defineProperty) { + args[0] = args[0][MAGIC_KEY]; + } + if (target === unsafeWindow.Function.apply) { + self = self[MAGIC_KEY]; + args[1] = Array.prototype.slice.call(args[1]); + } + if (target === unsafeWindow.document.querySelector) { + self = self[MAGIC_KEY]; + } + if (target === unsafeWindow.document.write) { + self = self[MAGIC_KEY]; + } + const usargs = clone(args); + return target.apply(self, usargs); + }, + construct (target, args) { + args = Array.prototype.slice.call(args); + args.unshift(undefined); + const usargs = clone(args); + const bind = unsafeWindow.Function.prototype.bind; + return new (bind.apply(target, usargs)); + }, + }; + return new Proxy(unsafeWindow, decorator); +} +function clone (safe) { + if (safe === null || !(safe instanceof Object)) { + return safe; + } + if (safe === unsafeWindow) { + return safe; + } + if (safe instanceof String) { + return safe.toString(); + } + if (safe instanceof Function) { + return exportFunction(safe, unsafeWindow, { + allowCrossOriginArguments: true, + }); + } + if (safe instanceof Array) { + const unsafe = new unsafeWindow.Array(); + for (let i = 0; i < safe.length; ++i) { + unsafe.push(clone(safe[i])); + } + return unsafe; + } + const unsafe = new unsafeWindow.Object(); + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(safe, (v, k) => { + unsafe[k] = clone(v); + }); + return unsafe; +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "dumpConfig", function() { return dumpConfig; }); + __webpack_require__.d(__webpack_exports__, "loadConfig", function() { return loadConfig; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + var util_dispatcher__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); + var util_platform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3); +const MANIFEST = [ + { + key: 'version', + default_: 0, + verify (v) { + return typeof v === 'number' && v >= 0; + }, + normalize: toNumber, + }, + { + key: 'align_center', + default_: true, + verify: isBoolean, + normalize: toBoolean, + }, + { + key: 'change_background', + default_: true, + verify: isBoolean, + normalize: toBoolean, + }, + { + key: 'redirect_image', + default_: true, + verify: isBoolean, + normalize: toBoolean, + }, + { + key: 'scale_image', + default_: true, + verify: isBoolean, + normalize: toBoolean, + }, + { + key: 'log_level', + default_: 1, + verify (v) { + return typeof v === 'number' && v >= 0 && v <= 2; + }, + normalize: toNumber, + }, +]; +const PATCHES = [ + async () => { + const alignCenter = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('align_center'); + const changeBackground = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('change_background'); + const scaleImage = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('scale_image'); + const redirectImage = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('redirect_image'); + const ac = typeof alignCenter === 'boolean'; + if (typeof changeBackground !== 'boolean') { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('change_background', ac ? alignCenter : true); + } + if (typeof scaleImage !== 'boolean') { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('scale_image', ac ? alignCenter : true); + } + if (!ac) { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('align_center', true); + } + if (typeof redirectImage !== 'boolean') { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('redirect_image', true); + } + }, + async () => { + const externalServerSupport = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('external_server_support'); + if (typeof externalServerSupport !== 'boolean') { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('external_server_support', false); + } + }, + async () => { + const logLevel = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('log_level'); + if (typeof logLevel !== 'number') { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('log_level', 1); + } + }, + async () => { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].deleteValue('external_server_support'); + }, +]; +function isBoolean (v) { + return typeof v === 'boolean'; +} +function toBoolean (v) { + return !!v; +} +function toNumber (v) { + return parseInt(v, 10); +} +async function senityCheck () { + let verifyResults = MANIFEST.map(async (descriptor) => { + const rv = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue(descriptor.key); + return descriptor.verify(rv); + }); + verifyResults = await Promise.all(verifyResults); + const ok = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["every"])(verifyResults, v => v); + if (!ok) { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('version', 0); + } +} +async function migrate () { + let currentVersion = await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('version'); + if (currentVersion !== 0 && !currentVersion) { + throw new util_core__WEBPACK_IMPORTED_MODULE_0__["AdsBypasserError"]('invalid version'); + } + while (currentVersion < PATCHES.length) { + PATCHES[currentVersion](); + ++currentVersion; + } + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue('version', currentVersion); +} +async function loadConfig () { + await senityCheck(); + await migrate(); + Object(util_dispatcher__WEBPACK_IMPORTED_MODULE_1__["register"])({ + rule: { + host: /^adsbypasser\.github\.io$/, + path: /^\/configure\.html$/, + }, + async ready () { + await waitForPage(); + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].commit = async (data) => { + for (const [k, v] of Object.entries(data)) { + await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].setValue(k, v); + } + }; + util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].render({ + version: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('version'), + options: { + align_center: { + type: 'checkbox', + value: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('align_center'), + label: 'Align Center', + help: 'Align image to the center if possible. (default: enabled)', + }, + change_background: { + type: 'checkbox', + value: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('change_background'), + label: 'Change Background', + help: 'Use Firefox-like image background if possible. (default: enabled)', + }, + redirect_image: { + type: 'checkbox', + value: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('redirect_image'), + label: 'Redirect Image', + help: [ + 'Directly open image link if possible. (default: enabled)', + 'If disabled, redirection will only works on link shortener sites.', + ].join('
    \n'), + }, + scale_image: { + type: 'checkbox', + value: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('scale_image'), + label: 'Scale Image', + help: 'When image loaded, scale it to fit window if possible. (default: enabled)', + }, + log_level: { + type: 'select', + value: await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue('log_level'), + menu: [ + [0, '0 (quiet)'], + [1, '1 (default)'], + [2, '2 (verbose)'], + ], + label: 'Log Level', + help: [ + 'Log level in developer console. (default: 1)', + '0 will not print anything in console.', + '1 will only print logs on affected sites.', + '2 will print on any sites.', + ].join('
    \n'), + }, + }, + }); + }, + }); +} +function waitForPage () { + return new Promise((resolve) => { + const i = setInterval(() => { + if (util_platform__WEBPACK_IMPORTED_MODULE_2__["usw"].render) { + clearInterval(i); + resolve(); + } + }, 50); + }); +} +async function dumpConfig () { + let rv = MANIFEST.map(async (descriptor) => { + return [descriptor.key, await util_platform__WEBPACK_IMPORTED_MODULE_2__["GMAPI"].getValue(descriptor.key)]; + }); + rv = await Promise.all(rv); + const o = {}; + for (const [k, v] of rv) { + o[k] = v; + } + return o; +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "debug", function() { return debug; }); + __webpack_require__.d(__webpack_exports__, "info", function() { return info; }); + __webpack_require__.d(__webpack_exports__, "warn", function() { return warn; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +const quiet = false; +function log (method, args) { + if (quiet) { + return; + } + args = Array.prototype.slice.call(args); + if (Object(util_core__WEBPACK_IMPORTED_MODULE_0__["isString"])(args[0])) { + args[0] = 'AdsBypasser: ' + args[0]; + } else { + args.unshift('AdsBypasser:'); + } + const f = console[method]; + if (typeof f === 'function') { + f.apply(console, args); + } +} +function debug () { + log('debug', arguments); +} +function info () { + log('info', arguments); +} +function warn () { + log('warn', arguments); +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + var _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^akoam\.com$/, + path: /^\/download\//, + }, + async start () { + const locationLink = location.hash; + let data = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(locationLink); + try { + data = JSON.parse(data); + } catch (e) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('JSON error:', e); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(data.direct_link); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?coolrom\.com$/, + path: /^\/dlpop\.php$/, + }, + async ready () { + const matches = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/
    /); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(matches[1]); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?dl-protect\.com$/, + path: /\/[A-Z0-9]+/, + }, + async ready () { + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#captcha')) { + return; + } + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('form[name=ccerure]'); + if (f) { + const iIn = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[id=in]'); + if (iIn.value) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(600); + f.submit(); + } else { + const [, , p] = await waitDOM(iIn, { + attributes: true, + }, (mutation) => { + if (!mutation.target.value || mutation.attributeName !== 'value') { + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none; + } + iIn.value = 'Tracking too much hurts users\' privacy'; + if (!canFastRedirect()) { + return; + } + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(600); + }); + if (p) { + await p; + f.submit(); + } + } + return; + } + const l = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('#slinks > a'); + if (l.length === 1) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l[0].href); + } + }, + }); + function canFastRedirect () { + return !_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('form[name=ccerure]').onsubmit && !_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('form[name=ccerure] input[name=pwd]'); + } + function waitDOM (element, config, fn) { + return new Promise((resolve) => { + const observer = new MutationObserver((mutations) => { + const [k, v, r] = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].find(mutations, fn); + if (k !== _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none) { + observer.disconnect(); + resolve([k, v, r]); + return; + } + }); + observer.observe(element, config); + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?embedupload\.com$/, + path: /^\/$/, + query: /^\?\w{2}=\w+$/, + }, + async ready () { + const downloadPage = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.categories a[target=_blank]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(downloadPage); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.fileproject\.com\.br$/, + path: /^\/files\/+/, + }, + async ready () { + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(//); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?jheberg\.net$/, + path: /^\/captcha\//, + }, + async ready () { + Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.dl-button').click(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?jheberg\.net$/, + path: /^\/redirect\//, + }, + async ready () { + 'use strict'; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].removeAllTimer(); + const matches = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/'slug':\s*'([^']+)',\s*'hoster':\s*'([^']+)'/); + const slug = matches[1]; + const hoster = matches[2]; + const response = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post('/get/link/', { + slug, + hoster, + }); + const respJSON = JSON.parse(response); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(respJSON.url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?mirrorcreator\.com$/, + /^(www\.)?mirrored\.to$/, + ], + path: /^\/downlink\//, + }, + async ready () { + let a = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#redirectlink a'); + if (a) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + return; + } + a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#redirectlink > div.redirecturl'); + a = a.innerHTML; + if (!a.match(/^http/)) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('not a valid URL'); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?mirrorcreator\.com$/, + /^(www\.)?mirrored\.to$/, + ], + path: /^\/files\//, + }, + async ready () { + const b = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.downloadarea.downlinks form button'); + b.click(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.multiupfile\.com$/, + path: /^\/f\//, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#yw0'); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^mylinkgen\.com$/, + path: /^\/p\/(.+)$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('/g/' + m.path[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^mylinkgen\.com$/, + path: /^\/g\//, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#main-content a.btn.btn-default'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^openload\.co$/, + /^oload\.(stream|info|site|tv|win|download)$/, + ], + path: /^\/f\/.*/, + }, + async start () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.adblock = false; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.adblock2 = false; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.popAdsLoaded = true; + }, + async ready () { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + const timer = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#downloadTimer'); + timer.style.display = 'none'; + const dlCtn = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#realdl'); + dlCtn.style.display = 'inline-block'; + const dlBtn = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a', dlCtn); + const ePath = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#DtsBlkVFQx'); + dlBtn.href = '/stream/' + ePath.textContent; + const videoCtn = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('.videocontainer'); + if (videoCtn) { + const overlay = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#videooverlay', videoCtn); + overlay.click(); + dlBtn.addEventListener('click', (evt) => { + evt.preventDefault(); + const iframe = document.createElement('iframe'); + iframe.src = dlBtn.href; + iframe.style.display = 'none'; + document.body.appendChild(iframe); + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info(`${window.location} -> ${dlBtn.href}`); + dlBtn.click(); + } else { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(dlBtn.href); + } + } +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?putlocker\.com$/, + path: /^\/file\/[0-9A-F]+$/, + }, + async ready () { + const c = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#confirm_form'); + c.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?upmirror\.info$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].setCookie('user', 'ppp'); + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#countDownText')) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(document.location.toString()); + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?vidto\.me$/, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#btn_download').form; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(6 * 1000); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^01\.nl$/, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('iframe#redirectframe'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^10co\.(biz|xyz|co|me)$/, + }, + async ready () { + const d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.go'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(d.dataset.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?1(be|dl)\.biz$/, + path: /^\/z\.php$/, + query: /^\?(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^1ink\.cc$/, + path: /^\/\w+$/, + }, + async ready () { + let url = document.head.querySelector('[name=keywords]').content; + const urlCheck = url.match(/^https?:\/\//); + if (!urlCheck) { + url = 'http://' + url; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?1tiny\.net$/, + path: /\/\w+/, + }, + async ready () { + const directUrl = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/window\.location='([^']+)';/); + if (!directUrl) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script content changed'); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(directUrl[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?4fun\.tw$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#original_url'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.value); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ad2links\.com$/, + path: /^\/\w-.+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(window.location.toString(), { + post: { + image: 'Skip Ad.', + }, + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ad4\.fr$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const s = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/"src", "([^"]+)"/); + if (!s) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('changed'); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(s[1]); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ad7\.biz$/, + path: /^\/\d+\/(.*)$/, + }, + async start (m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let redirectLink = m.path[1]; + if (!redirectLink.match(/^https?:\/\//)) { + redirectLink = 'http://' + redirectLink; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(redirectLink); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ad7\.biz$/, + path: /^\/\w+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const script = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('const r_url'); + let url = script.match(/&url=([^&]+)/); + url = url[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, + }); +})(); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?adb\.ug$/, + /^(www\.)?lynk\.my$/, + /^(www\.)?adyou\.(co|me)$/, + ], + path: /^(?!\/(?:privacy|terms|contact(\/.*)?|#.*)?$).*$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/top\.location\.href="([^"]+)"/); + if (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + return; + } + const args = await getArguments(); + tryLink(args); + }, + }); + function getArguments () { + const PATTERN = /\{\s*_args[^}]+\}[^}]+\}/; + return new Promise((resolve) => { + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(PATTERN); + if (m) { + resolve(m); + return; + } + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + mutation.addedNodes.forEach((node) => { + if (node.localName === 'script') { + const m = node.textContent.match(PATTERN); + if (m) { + observer.disconnect(); + resolve(m); + } + } + }); + }); + }); + observer.observe(document.body, { + childList: true, + }); + }).then((m) => { + return eval('(' + m[0] + ')'); + }); + } + function tryLink (args) { + const url = window.location.pathname + '/skip_timer'; + const i = setInterval(() => { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(url, args).then((text) => { + const jj = JSON.parse(text); + if (!jj.errors && jj.messages) { + clearInterval(i); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(jj.messages.url); + } + }); + }, 1000); + } +})(); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^adf\.ly$/, + path: /^\/redirecting\/(.+)$/, + }, + async start (m) { + const url = atob(m.path[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + path: /\/locked$/, + query: /url=([^&]+)/, + }, + async start (m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].resetCookies(); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].setCookie('FLYSESSID', generateRandomSessionCookie(40)); + const url = decodeURIComponent(m.query[1]); + if (url.match(/^http/)) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + } else { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(document.referrer); + } + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule () { + const h = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('html[id="main_html"]'); + if (h) { + return true; + } else { + return null; + } + }, + async start () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.document.write = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].nop; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.btoa = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].nop; + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].setCookie('FLYSESSID', generateRandomSessionCookie(40)); + let rv = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(location.href, '', { + 'Origin': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + 'Referer': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + 'X-Requested-With': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + }); + rv = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].toDOM(rv); + rv = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/var ysmm = '([^']+)'/, rv); + rv = rv[1]; + rv = decodeToken(rv); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(rv); + }, + }); + function generateRandomSessionCookie (length) { + const rv = []; + for (let i = 0; i < length; ++i) { + rv.push(Math.random().toString(36).charAt(2)); + } + return rv.join(''); + } + function decodeToken (token) { + let a = ''; + let b = ''; + for (let i = 0; i < token.length; ++i) { + if (i % 2 === 0) { + a = a + token.charAt(i); + } else { + b = token.charAt(i) + b; + } + } + token = a + b; + a = token.split(''); + for (let i = 0; i < a.length; ++i) { + if (/\d/.test(a[i])) { + for (let j = i + 1; j < a.length; ++j) { + if (/\d/.test(a[j])) { + b = a[i] ^ a[j]; + if (b < 10) { + a[i] = b; + } + i = j; + j = a.length; + } + } + } + } + token = a.join(''); + token = atob(token); + token = token.substring(16); + token = token.substring(0, token.length - 16); + if (location.hash) { + token += location.hash; + } + return token; + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://adfoc.us/*', + async ready () { + const promise = new Promise((resolve) => { + const root = document.body; + const observer = new MutationObserver(() => { + let o = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#showSkip'); + if (o) { + observer.disconnect(); + o = o.querySelector('a'); + resolve(o.href); + } + }); + observer.observe(root, { + childList: true, + subtree: true, + }); + }); + const url = await promise; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?adlot\.us$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const script = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('form'); + const p = /name='([^']+)' value='([^']+)'/g; + const opt = { + image: ' ', + }; + let tmp = null; + while ((tmp = p.exec(script))) { + opt[tmp[1]] = tmp[2]; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('', { + path: opt, + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^admy\.link$/, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('form.edit_link'); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?ah-informatique\.com$/, + path: /^\/ZipUrl/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#zip3 a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ah\.pe$/, + }, + async ready () { + let script = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('eval'); + script = decodeScript(script); + script = decodeScript(script); + script = decodeScript(script); + let path = script.match(/([^;= ]+)=([^+ ;]+)\+"\."\+([^+ ]+)\+"\."\+([^; ]+);/); + if (!path) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + if (typeof _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window[path[2]] === 'undefined') { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('recaptcha'); + return; + } + path = [_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window[path[2]], _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window[path[3]], _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window[path[4]]].join('.'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + }, + }); + function decodeScript (encoded) { + let a = encoded.match(/^\s*;eval\((.+)\);\s*$/); + a = a[1]; + const b = a.match(/^(.+)\('([^']+)','([^']+)','([^']+)','([^']+)'\)$/); + const c = eval('(' + b[1] + ')'); + return c(b[2], b[3], b[4], b[5]); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^aka\.gr$/, + }, + async ready () { + const l = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('iframe#yourls-frame'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^al\.ly$/, + /^ally\.sh$/, + ], + }, + async ready () { + let i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#html_element'); + if (i) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('#messa'); + i.classList.remove('hidden'); + return; + } + i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/"href","([^"]+)" \+ hash\)\.remove/); + if (!i) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('site changed'); + return; + } + i = i[1] + location.hash; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?allkeyshop\.com$/, + /^cshort\.org$/, + ], + }, + async ready () { + let matches = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/window\.location\.href = "([^"]+)"/); + matches = matches[1]; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].nuke(matches); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(matches); + }, +}); +(function () { + const ajaxPattern = /\$.post\('([^']*)'[^{]+(\{\s*opt:\s*'make_log'[^}]+\}\s*\}),/i; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^bc\.vc$/, + path: /^.+(https?:\/\/.+)$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m.path[1] + document.location.search + document.location.hash); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^bc\.vc$/, + path: /^\/.+/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const token = findAJAXToken(); + const time = fakeAJAXToken(); + const url = `/fly/ajax.php?wds=${token.wds}&time=${time}`; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(5000); + let rv = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(url, { + xdf: { + afg: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.tZ, + bfg: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.cW, + cfg: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.cH, + jki: token.jki, + dfg: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.sW, + efg: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.sH, + }, + ojk: token.ojk, + }); + rv = JSON.parse(rv); + if (rv.error) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('auth error'); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(rv.message.url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^mylink\.us$/, + /^xafox\.com$/, + /^zpoz\.net$/, + /^www\.adjet\.eu$/, + ], + path: /^\/.+/, + }, + ready: run, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ysear\.ch$/, + path: /^\/.+/, + }, + async ready () { + const a = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('div.fly_head a.close'); + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('iframe.fly_frame'); + if (a && f) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.src); + } else { + await run(); + } + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ad5\.eu$/, + path: /^\/[^.]+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const s = searchScript(true); + let m = s.script.match(/()<\/form>)/); + if (!m) { + return; + } + m = m[1]; + const tz = -(new Date().getTimezoneOffset() / 60); + m = m.replace('\'+timezone+\'', tz); + const d = document.createElement('div'); + d.setAttribute('id', 'AdsBypasserFTW'); + d.setAttribute('style', 'display:none;'); + d.innerHTML = m; + document.body.appendChild(d); + Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#AdsBypasserFTW > form[name=form1]').submit(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^tr5\.in$/, + path: /^\/.+/, + }, + async ready () { + await run(true); + }, + }); + function decompress (script, unzip) { + if (!unzip) { + return script; + } + let matches = script.match(/eval(.*)/); + if (!matches) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('no script matches /eval(.*)/'); + } + matches = matches[1]; + script = eval(matches); + return script; + } + function searchScript (unzip) { + let content = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('make_log'); + if (content) { + return { + direct: false, + script: decompress(content, unzip), + }; + } + content = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('click_log'); + if (content) { + return { + direct: true, + script: decompress(content, unzip), + }; + } + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + function knockServer (script, dirtyFix) { + const matches = script.match(ajaxPattern); + if (!matches) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('(in knock server) no script matches $.post'); + } + const make_url = matches[1]; + const make_opts = eval('(' + matches[2] + ')'); + const i = setInterval(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(make_url, make_opts).then(function (text) { + if (dirtyFix) { + text = text.match(/\{.+\}/)[0]; + } + const jj = JSON.parse(text); + if (jj.message) { + clearInterval(i); + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(jj.message.url); + } + }); + }, 1000); + } + async function run (dirtyFix) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let result = searchScript(true); + if (!result.direct) { + knockServer(result.script,dirtyFix); + } else { + result = result.script.match(/top\.location\.href='([^']+)'/); + if (!result) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + result = result[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(result); + } + } + function findAJAXToken () { + const rv = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('/fly/ajax.php'); + if (!rv) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + let wds = rv.match(/\?wds=([^&]+)/); + if (!wds) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + wds = wds[1]; + let jki = rv.match(/jki:\s*'([^']+)'/); + if (!jki) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + jki = jki[1]; + let ojk = rv.match(/ojk:\s*'([^']+)'/); + if (!ojk) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script changed'); + } + ojk = ojk[1]; + return { + wds: wds, + jki: jki, + ojk: ojk, + }; + } + function fakeAJAXToken () { + const skipAd = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div.fly_head span#redirectin').parentElement; + const margin = 6; + const fakePageX = skipAd.offsetLeft + margin + 50 + (Math.random() * 10); + const fakePageY = skipAd.offsetTop + margin + 15 + (Math.random() * 1); + const po = fakePageX + ',' + fakePageY; + const posX = jQueryOffset(skipAd).left + margin; + const posY = jQueryOffset(skipAd).top + margin; + const pos = (fakePageX - posX) + ',' + (fakePageY - posY); + const tsta_ = Math.floor((5 + Math.random()) * 1000); + const time = po + ':' + pos + ':' + tsta_; + return time; + } + function jQueryOffset (element) { + const r = element.getBoundingClientRect(); + return { + top: r.top + document.body.scrollTop, + left: r.left + document.body.scrollLeft, + }; + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?biglistofwebsites\.com$/, + path: /^\/go\/(\w+\.\w+)$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('http://' + m.path[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.bild.me/bild.php?file=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#Bild'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://bildr.no/view/*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.bilde'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?([a-zA-Z0-9]+\.)?binbox\.io$/, + path: /\/o\/([a-zA-Z0-9]+)/, + }, + async start (m) { + const direct_link = window.atob(m.path[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(direct_link); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^catcut\.net$/, + }, + async ready () { + let a = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/decodeURIComponent\('([^']+)'\)/); + a = decodeURIComponent(a[1]); + a = new URL(a); + a = a.searchParams.get('a'); + a = atob(a); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?cli\.gs$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.RedirectLink'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^clk\.im$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const matches = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/\$\("\.countdown"\)\.attr\("href","([^"]+)"\)/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(matches[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^cocoleech\.com$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#download'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(coeg|disingkat)\.in$/, + /^www\.(telondasmu|siotong|siherp)\.com$/, + /^www\.greget\.space$/, + ], + path: /^\/\w+$/, + }, + async ready (m) { + const mapper = hostMapper(m.host[0]); + const b64 = mapper().match(/\?r=([\w/]+={0,2})/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(atob(b64[1])); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^sipkur\.net$/, + path: [ + /^\/\w+$/, + /^\/menujulink\//, + ], + }, + async ready () { + let d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#testapk > div'); + d = d.onclick.toString(); + d = d.match(/window\.open\('([^']+)'/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(d[1]); + }, + }); + function hostMapper (host) { + switch (host) { + case 'disingkat.in': + return () => { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.btn-block.redirect'); + return a.href; + }; + case 'coeg.in': + case 'www.telondasmu.com': + case 'www.siotong.com': + case 'www.siherp.com': + case 'www.greget.space': + return () => { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.download-link a'); + return a.href; + }; + default: + return null; + } + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(?:(\w+)\.)?coinurl\.com$/, + /^(?:(\w+)\.)?cur\.lv$/, + ], + path: /^\/([-\w]+)$/, + }, + async ready (m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const host = 'http://cur.lv/redirect_curlv.php'; + const param = m.host[1] === undefined ? { + code: m.path[1], + } : { + zone: m.host[1], + name: m.path[1], + }; + const mainFrameContent = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(host, param); + let docMainFrame = null; + try { + docMainFrame = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].toDOM(mainFrameContent); + } catch (e) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('main frame changed'); + } + const rExtractLink = /onclick="open_url\('([^']+)',\s*'go'\)/; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].forEach(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('iframe', docMainFrame), (currFrame) => { + const currFrameAddr = currFrame.getAttribute('src'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(currFrameAddr).then((currFrameContent) => { + const aRealLink = rExtractLink.exec(currFrameContent); + if (aRealLink === undefined || aRealLink[1] === undefined) { + return; + } + const realLink = aRealLink[1]; + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(realLink); + }); + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^comyonet\.com$/, + }, + async ready () { + const input = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[name="enter"]'); + input.click(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^durl\.me$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a[class="proceedBtn"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^easyurl\.net$/, + /^(atu|clickthru|redirects|readthis)\.ca$/, + /^goshrink\.com$/, + ], + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('frame[name=main]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?shink\.me$/, + /^(shon|likn)\.xyz$/, + /^fas\.li$/, + /^(www\.)?croco\.(me|site)$/, + /^cpmlink\.net$/, + ], + path: /^\/\w+$/, + }, + async ready () { + if (!_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#captcha')) { + let f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#skip'); + if (f) { + f.submit(); + return; + } + f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#btn-main'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.href); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('div[class$=Overlay]'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].block((node) => { + if (node.className.match(/Overlay$/)) { + return true; + } + if (node.localName === 'div') { + return [ + '2147483647', + '2', + ].some((z) => { + return z === node.style.zIndex; + }); + } + return false; + }, document.body); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: /^cpmlink\.net$/, + path: /^\/go\/\w+$/, + }, + { + host: /^(www\.)?croco\.(me|site)$/, + path: /^\/ok\/\w+$/, + }, + ], + async ready () { + let a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#btn-main'); + const i = a.href.lastIndexOf('http'); + a = a.href.substr(i); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^fas\.li$/, + /^(www\.)?shink\.me$/, + ], + path: /^\/go\/\w+$/, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#skip'); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?filoops\.info$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#text > center a, #text > div[align=center] a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?fiuxy\.co$/, + path: /^\/links?\/$/, + }, + async ready () { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.btn.a').href); + } +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^gkurl\.us$/, + }, + async ready () { + const iframe = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#gkurl-frame'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(iframe.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^goto\.loncat\.in$/, + query: /open=(.+)/, + }, + async start (m) { + const url = atob(atob(m.query[1])); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^gsurl\.(me|in)$/, + /^(gsul|getsl|glinks)\.me$/, + /^gsur\.in$/, + /^g5u\.pw$/, + /^gurl\.ly$/, + ], + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('#container'); + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#link'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(`${a.href}&ab=${_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.x}`); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^gunting\.web\.id$/, + path: /^\/\w+$/, + }, + async ready () { + const l = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.btn-block.redirect'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^hotshorturl\.com$/, + }, + async ready () { + const frame = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('frame[scrolling=yes]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(frame.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^iiv\.pl$/, + }, + async ready () { + let d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#counting'); + let rv = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(location.pathname, { + blocker: 0, + salt: d.dataset.salt, + }, { + 'X-OCTOBER-REQUEST-HANDLER': 'onAfterShortcutView', + 'X-OCTOBER-REQUEST-PARTIALS': 'shortcut/link_show', + }); + rv = JSON.parse(rv); + d = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].toDOM(rv['shortcut/link_show']); + rv = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a', d); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(rv.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^itw\.me$/, + path: /^\/r\//, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.go-form'); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ity\.im$/, + }, + async ready () { + let f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#main'); + if (f) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.src); + return; + } + [, , f] = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].find(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('frame'), (frame) => { + if (frame.src.indexOf('interheader.php') < 0) { + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none; + } + return frame.src; + }); + if (f !== _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f); + return; + } + f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/krypted=([^&]+)/); + if (!f) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('site changed'); + } + f = f[1]; + const data = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.des('ksnslmtmk0v4Pdviusajqu', _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.hexToString(f), 0, 0); + if (data) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('http://ity.im/1104_21_50846_' + data); + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?kingofshrink\.com$/, + }, + async ready () { + const l = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#textresult > a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^st\.kurogaze\.net$/, + query: /r=(.+)/, + }, + async start (m) { + const r = atob(m.query[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(r); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^st\.kurogaze\.net$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.redirect'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.lienscash.com/l/*', + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#redir_btn'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?link\.im$/, + path: /^\/\w+$/, + }, + async start () { + const text = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(document.location.href, { + image: 'Continue', + }); + const m = text.match(/window\.location\.replace\('([^']+)'\)/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^link4ad\.com$/, + path: /^\/(.+)$/, + }, + async ready (m) { + let d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div[id^=module_]'); + d = d.id.match(/module_(\d+)/); + d = d[1]; + const url = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post('form.php?block_id=' + d, { + cmd: 'get_source', + act: 'waiting', + id: m.path[1], + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +(function() { + const hostRules = [ + /^(([\w]{8}|www)\.)?(allanalpass|drstickyfingers|whackyvidz)\.com$/, + /^(([\w]{8}|www)\.)?link(babes|bucks)\.com$/, + /^(([\w]{8}|www)\.)?theseblogs\.com$/, + /^warning-this-linkcode-will-cease-working-soon\.www\.linkbucksdns\.com$/, + /^(([\w]{8}|www)\.)?(filesonthe|poontown|seriousdeals|urlbeat|zatnawqy)\.net$/, + /^(([\w]{8}|www)\.)?freean\.us$/, + /^(([\w]{8}|www)\.)?(miniurls|qqc|rqq|tinylinks|yyv)\.co$/, + /^(([\w]{8}|www)\.)?youfap\.me$/, + ]; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRules, + path: /^\/\w+\/url\/(.+)$/, + }, + async ready(m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].removeAllTimer(); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].resetCookies(); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let url = m.path[1] + window.location.search; + const match = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/UrlEncoded: ([^,]+)/); + if (match && match[1] === 'true') { + url = decrypt(url); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + } + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRules, + }, + async start () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.XMLHttpRequest = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].nop; + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].removeAllTimer(); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].resetCookies(); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + if (window.location.pathname.indexOf('verify') >= 0) { + const path = window.location.pathname.replace('/verify', ''); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + return; + } + const token = findToken(document); + const url = await sendRequest(token); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].nuke(url); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + query: /^(.*)[?&]_lbGate=\d+$/, + }, + async start (m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].setCookie('_lbGatePassed', 'true'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(window.location.pathname + m.query[1]); + }, + }); + function findToken (context) { + const script = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(' var f = window[\'init\' + \'Lb\' + \'js\' + \'\']', context); + if (!script) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('pattern changed'); + return null; + } + let adurl = script.match(/AdUrl\s*:\s*'([^']+)'/); + if (!adurl) { + return null; + } + adurl = adurl[1]; + const m1 = script.match(/AdPopUrl\s*:\s*'.+\?[^=]+=([\w\d]+)'/); + const m2 = script.match(/Token\s*:\s*'([\w\d]+)'/); + const token = m1[1] || m2[1]; + let m = script.match(/=\s*(\d+);/); + let ak = parseInt(m[1], 10); + const re = /\+\s*(\d+);/g; + let tmp = null; + while((m = re.exec(script)) !== null) { + tmp = m[1]; + } + ak += parseInt(tmp, 10); + return { + t: token, + aK: ak, + adurl: adurl, + }; + } + async function sendRequest (token) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(token.adurl); + delete token.adurl; + token.a_b = false; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('waiting the interval'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(5000); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('sending token: %o', token); + const text = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get('/intermission/loadTargetUrl', token, { + 'X-Requested-With': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + Origin: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + }); + const data = JSON.parse(text); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('response: %o', data); + if (!data.Success && data.Errors[0] === 'Invalid token') { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('got invalid token'); + return await retry(); + } + if (data.AdBlockSpotted) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('adblock spotted'); + return; + } + if (data.Success && !data.AdBlockSpotted && data.Url) { + return data.Url; + } + } + async function retry () { + const text = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(window.location.toString(), {}, { + 'X-Forwarded-For': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].generateRandomIP(), + }); + const d = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].toDOM(text); + const t = findToken(d); + if (!t) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(1000); + return await retry(); + } + return await sendRequest(t); + } + function decrypt (url) { + url = ConvertFromHex(url); + let unsafe = `(${Encode.toString()})("${url}")`; + unsafe = (0, eval)(unsafe); + return unsafe; + } + function ConvertFromHex (str) { + const result = []; + while (str.length >= 2) { + result.push(String.fromCharCode(parseInt(str.substring(0, 2), 16))); + str = str.substring(2, str.length); + } + return result.join(''); + } + const Encode = function (str) { + var s = [], j = 0, x, res = '', k = arguments.callee.toString().replace(/\s+/g, ''); + for (var i = 0; i < 256; i++) { + s[i] = i; + } + for (i = 0; i < 256; i++) { + j = (j + s[i] + k.charCodeAt(i % k.length)) % 256; + x = s[i]; + s[i] = s[j]; + s[j] = x; + } + i = 0; + j = 0; + for (var y = 0; y < str.length; y++) { + i = (i + 1) % 256; + j = (j + s[i]) % 256; + x = s[i]; + s[i] = s[j]; + s[j] = x; + res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]); + } + return res; + }; +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.linkdecode\.com$/, + path: /^\/$/, + query: /^\?(.+)$/, + }, + async ready (m) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let lnk = m.query[1]; + if (m.query[1].match(/^https?:\/\//)) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(lnk); + return; + } + let b = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#popup'); + if (b && b.href) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(b.href); + return; + } + b = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#m > .Visit_Link'); + b = b.onclick.toString().match(/window\.open\('([^']+)'/); + if (!b) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasser('pattern changed'); + } + lnk = b[1].match(/\?(https?:\/\/.*)$/); + if (lnk) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(lnk[1]); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(b[1]); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^ulshare\.net$/, + /^adurl\.id$/, + /^(cutwin|earn-guide)\.com$/, + /^(cutwi|cut-w|cutl|dmus)\.in$/, + /^(www\.)?jurl\.io$/, + /^mitly\.us$/, + /^tui\.click$/, + /^met\.bz$/, + ], + }, + async ready () { + const handler = new NoRecaptchaHandler(); + await handler.call(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(dz4link|gocitlink|3rabcut|short2win)\.com$/, + /^(tmearn|payshorturl|urltips|shrinkearn)\.com$/, + /^(earn-url|bit-url|cut-win|link-zero|cut-earn)\.com$/, + /^(vy\.)?adsvy\.com$/, + /^(linkexa|admew|shrtfly|kuylink|cut4links)\.com$/, + /^(safelinku|tinylinks|licklink|linkrex|zlshorte)\.net$/, + /^(vn|vina|fox)url\.net$/, + /^(www\.)?linkdrop\.net$/, + /^(trlink|wolink|tocdo|megaurl)\.in$/, + /^(petty|tr)\.link$/, + /^idsly\.(com|bid)$/, + /^(adbilty|adpop|payskip|wicr)\.me$/, + /^wi\.cr$/, + /^(oke|cuon)\.io$/, + /^(3bst|coinlink|itiurl)\.co$/, + /^(shink|shrten|gg-l)\.xyz$/, + /^mlink\.club$/, + /^(igram|gram)\.im$/, + /^clk\.press$/, + /^short\.pe$/, + /^urlcloud\.us$/, + /^(123link|clik|tokenfly)\.pw$/, + /^(icutit|earnbig|cutearn)\.ca$/, + /^koylinks\.win$/, + /^lopte\.pro$/, + /^(www\.)?pnd\.tl$/, + /^(tny|tiny)\.ec$/, + /^tl\.tc$/, + ], + }, + async ready () { + const handler = new RecaptchaHandler(); + await handler.call(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?ourl\.io$/, + }, + async ready () { + const handler = new OURLHandler(); + await handler.call(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(cut-urls|linclik|premiumzen|shrt10|itiad|by6dk|mikymoons|man2pro|mykinggo)\.com$/, + /^short\.pastewma\.com$/, + /^linkfly\.gaosmedia\.com$/, + /^ads(horte|rt)\.com$/, + /^(www\.)?viralukk\.com$/, + /^(ot|load)url\.com$/, + /^(cut4|rao)link\.com$/, + /^www\.worldhack\.net$/, + /^(eklink|vivads)\.net$/, + /^(coshink|urle|adshort)\.co$/, + /^(weefy|adbull|zeiz|link4)\.me$/, + /^(adbilty|taive)\.in$/, + /^(psl|twik|adslink)\.pw$/, + /^(curs|crus|4cut|u2s|l2s)\.io$/, + /^dzurl\.ml$/, + /^petty\.link$/, + /^shortad\.cf$/, + /^123link\.(io|co|press)$/, + /^git\.tc$/, + /^adfu\.us$/, + /^shortit\.ca$/, + /^spamlink\.org$/, + /^royurls\.bid$/, + ], + }, + async ready () { + const handler = new StagedHandler(); + await handler.call(); + }, + }); + class AbstractHandler { + constructor () { + this._overlaySelector = [ + '[class$="Overlay"]', + '#__random_class_name__', + '#headlineatas', + ].join(', '); + this._formSelector = [ + '#go-link', + '.go-link', + 'form[action="/links/go"]', + 'form[action="/links/linkdropgo"]', + ].join(', '); + } + removeOverlay () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove(this._overlaySelector); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].block(this._overlaySelector, document.body); + } + removeFrame () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + } + async call () { + const ok = this.prepare(); + if (!ok) { + return; + } + const mw = await this.getMiddleware(); + if (!mw) { + this.withoutMiddleware(); + return; + } + const url = await this.getURL(mw); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + } + } + class NoRecaptchaHandler extends AbstractHandler { + constructor () { + super(); + } + prepare () { + this.removeFrame(); + this.removeOverlay(); + return true; + } + async getMiddleware () { + return await getJQueryForm(this._formSelector); + } + withoutMiddleware () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('no form'); + } + async getURL (jForm) { + return await getURLFromJQueryForm(jForm); + } + } + class RecaptchaHandler extends AbstractHandler { + constructor () { + super(); + } + prepare () { + this.removeOverlay(); + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#captchaShortlink'); + if (!f) { + return true; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('recaptcha detected, stop'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('trying to listen submit button'); + const b = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#invisibleCaptchaShortlink'); + if (!b) { + return false; + } + const o = new MutationObserver(() => { + if (!b.disabled) { + b.click(); + } + }); + o.observe(b, { + attributes: true, + }); + return false; + } + async getMiddleware () { + return await getJQueryForm(this._formSelector); + } + withoutMiddleware () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#link-view'); + f.submit(); + } + async getURL (jForm) { + while (true) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(2000); + try { + const url = await getURLFromJQueryForm(jForm); + if (url) { + return url; + } + } catch (e) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn(e); + } + } + } + } + class OURLHandler extends RecaptchaHandler { + constructor () { + super(); + } + async getMiddleware () { + return { + verify: await getJQueryForm('#get-link'), + go: await getJQueryForm(this._formSelector), + }; + } + async getURL (jFormObject) { + await getURLFromJQueryForm(jFormObject.verify); + return await getURLFromJQueryForm(jFormObject.go); + } + } + class StagedHandler extends AbstractHandler { + constructor () { + super(); + } + prepare () { + this.removeFrame(); + this.removeOverlay(); + return true; + } + async getMiddleware () { + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#link-view'); + if (!f) { + return document; + } + const args = extractArgument(f); + const url = f.getAttribute('action'); + let page = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(url, args); + page = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].toDOM(page); + return page; + } + withoutMiddleware () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('no page'); + } + async getURL (page) { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#go-link', page); + const args = extractArgument(f); + const url = f.getAttribute('action'); + let data = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(url, args); + data = JSON.parse(data); + if (data && data.url) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].nuke(data.url); + return data.url; + } + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('wrong data'); + } + } + function extractArgument (form) { + const args = {}; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].forEach(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('input', form), (v) => { + args[v.name] = v.value; + }); + return args; + } + async function getJQueryForm (selector) { + let jQuery = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.$; + while (!jQuery) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(50); + jQuery = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.$; + } + const f = jQuery(selector); + if (f.length > 0) { + return f; + } + return null; + } + function getURLFromJQueryForm (jForm) { + return new Promise((resolve, reject) => { + const jQuery = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.$; + jQuery.ajax({ + dataType: 'json', + type: 'POST', + url: jForm.attr('action'), + data: jForm.serialize(), + success: (result) => { + if (result.url) { + resolve(result.url); + } else { + reject(new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError(result.message)); + } + }, + error: (xhr, status, error) => { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn(xhr, status, error); + reject(new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('request error')); + }, + }); + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?linkplugapp\.com$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#mc_embed_signup_scroll a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^linksas\.us$/, + path: /^(\/\w+)$/, + }, + async ready (m) { + const recaptcha = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].tryEvery(1000, () => { + const recaptcha = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#g-recaptcha-response'); + if (!recaptcha) { + return null; + } + if (!recaptcha.value) { + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none; + } + return recaptcha.value; + }); + const url = `http://ipinfo.io/${_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].generateRandomIP()}/json`; + let ipinfo = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(url); + ipinfo = JSON.parse(ipinfo); + const payload = { + codeAds: 1, + country: ipinfo.country, + ipAddress: ipinfo.ip, + recaptcha: recaptcha, + }; + const token = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].getCookie('XSRF-TOKEN'); + let data = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post('/go' + m.path[1], payload, { + 'Content-Type': 'application/json', + 'X-XSRF-TOKEN': token, + }); + data = JSON.parse(data); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(data.message); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^linksas\.us$/, + path: /^\/go\//, + }, + async ready () { + const a = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#btnSubmit'); + if (!a) { + return; + } + const url = a.href; + const pattern = /https?:\/\//g; + let lastURL = ''; + while (true) { + const matched = pattern.exec(url); + if (!matched) { + break; + } + lastURL = matched + url.substring(pattern.lastIndex); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(lastURL); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^linkshrink\.net$/, + path: /^\/[a-zA-Z0-9]+$/, + }, + async start () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window._impspcabe = 0; + }, + async ready () { + let l = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/revC\("([^"]+)"\)/); + l = atob(l[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('/' + l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^linkshrink\.net$/, + path: /=(.+)$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m.path[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^dwindly\.io$/, + }, + async ready () { + let l = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/encD\("([^"]+)"\)/); + if (l) { + l = atob(l[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('/' + l); + return; + } + l = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/document\.location\.href = "([^"]+)"/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(rd?)lnk\.co$/, + path: /^\/[^.]+$/, + }, + async ready () { + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('iframe#dest'); + if (f) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(f.src); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let o = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#urlholder'); + if (o) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(o.value); + return; + } + o = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#skipBtn'); + if (o) { + o = o.querySelector('a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(o.href); + return; + } + o = document.title.replace(/(LNK.co|Linkbee)\s*:\s*/, ''); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(o); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.lolinez\.com$/, + query: /\?(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.mije\.net$/, + path: /^\/\w+\/(.+)$/, + }, + async start (m) { + const url = atob(m.path[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^minidroid\.net$/, + /^linkpoi\.in$/, + ], + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.redirect, a[target=_blank][rel=nofollow]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^mirrorfilehost\.com$/, + }, + async ready () { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(3 * 1000); + const frame = frames[0]; + const form = frame.document.createElement('form'); + form.target = '_parent'; + form.action = location.toString(); + const input = frame.document.createElement('input'); + input.value = 'Download'; + input.type = 'submit'; + form.appendChild(input); + frame.document.body.appendChild(form); + input.click(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^moesubs\.com$/, + path: /^\/url\//, + }, + async ready () { + let a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.gotolink > center:nth-child(1) > div:nth-child(1) > i:nth-child(2)'); + a = a.textContent; + const i = a.lastIndexOf('http'); + a = a.substr(i); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://my-link.pro/*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('iframe[scrolling=auto]'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.src); + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?mylink\.zone$/, + path: /^\/[^/]+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const matches = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/ .long_url > a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.ron\.vn$/, + }, + async ready () { + const script = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts('linknexttop'); + const data = script.match(/data:"([^"]+)"/); + let url = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.domain + 'click.html?' + data[1]; + url = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(url, {}, { + 'Content-Type': 'application/json; charset=utf-8', + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?sa\.ae$/, + path: /^\/\w+\/$/, + }, + async ready () { + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/const real_link = '([^']+)';/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?safeurl\.eu$/, + path: /\/\w+/, + }, + async ready () { + let directUrl = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/window\.open\("([^"]+)"\);/); + if (!directUrl) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('script content changed'); + } + directUrl = directUrl[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(directUrl); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^segmentnext\.com$/, + /^(www\.)?videogamesblogger\.com$/, + ], + path: /^\/interstitial\.html$/, + query: /return_url=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(decodeURIComponent(m.query[1])); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?apploadz\.ru$/, + /^(www\.)?seomafia\.net$/, + ], + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('table a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +(function () { + const hostRules = [ + /^(jnw0|cllkme|clkmein|corneey|ceesty)\.com$/, + /^[dfg]estyy\.com$/, + /^sh\.st$/, + /^([vw]iid|clkme)\.me$/, + ]; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRules, + path: /^\/freeze\/.+/, + }, + async ready () { + const promise = new Promise((resolve) => { + const o = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.target.getAttribute('class').match(/active/)) { + o.disconnect(); + resolve(mutation.target.href); + } + }); + }); + o.observe(Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#skip_button'), { + attributes: true, + attributeFilter: ['class'], + }); + }); + const url = await promise; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRules, + path: /https?:\/\//, + }, + async start () { + let url = window.location.pathname + window.location.search + window.location.hash; + url = url.match(/(https?:\/\/.*)$/); + url = url[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRules, + path: /^\/[\d\w]+/, + }, + async start () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window._impspcabe = 0; + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].removeAllTimer(); + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/sessionId: "([\d\w]+)",/); + if (m) { + afterGotSessionId(m[1]); + return; + } + const o = new MutationObserver((mutations) => { + mutations.forEach(() => { + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/sessionId: "([\d\w]+)",/); + if (m) { + o.disconnect(); + afterGotSessionId(m[1]); + } + }); + }); + o.observe(document.body, { + childList: true, + }); + }, + }); + function afterGotSessionId (sessionId) { + const X_NewRelic_ID = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/xpid:"([^"]+)"/); + const data = { + adSessionId: sessionId, + }; + const header = { + Accept: 'application/json, text/javascript', + }; + if (X_NewRelic_ID) { + header['X-NewRelic-ID'] = X_NewRelic_ID; + } + const i = setInterval(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get('/shortest-url/end-adsession', data, header).then(function (text) { + const r = JSON.parse(text); + if (r.status == 'ok' && r.destinationUrl) { + clearInterval(i); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].removeAllTimer(); + const url = decodeURIComponent(r.destinationUrl); + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + } + }); + }, 1000); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(short|srt)\.am$/, + }, + async ready () { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(5000); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('', { + post: { + _image: 'Continue', + }, + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?shorti\.ga$/, + path: [ + /^\/\w+$/, + /^\/url_redirector\.html$/, + ], + }, + async ready () { + const f = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('frame'); + const [, v,] = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].find(f, (value) => { + if (value.getAttribute('class')) { + return _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none; + } + return 'Target frame found'; + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(v.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^get\.shrink-service\.it$/, + path: /^\/(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(`//www.shrink-service.it/shrinked/${m.path[1]}`); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.shrink-service\.it$/, + path: /^\/shrinked\//, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[id][name]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.value); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.shrink-service\.it$/, + path: /^\/[se]\//, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('body > input[id][name]'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(i.value); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^sht\.io$/, + path: /^\/\d+\/(.+)$/, + }, + async start (m) { + let url = atob(m.path[1]); + url = url.match(/\{sht-io\}(.+)\{sht-io\}.*\{sht-io\}/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?similarsites\.com$/, + path: /^\/goto\/([^?]+)/ + }, + async start (m) { + let l = m.path[1]; + if (!/^https?:\/\//.test(l)) { + l = 'http://' + l; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.spaste\.com$/, + path: /^\/go\/\w+$/, + }, + async ready () { + const id = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/\{id:'(\d+)'\}/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(3000); + const url = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post('/site/getRedirectLink', { + id: id[1], + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.spaste\.com$/, + path: /^\/(s|site)\/\w+$/, + }, + async ready () { + const captcha = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#globalCaptchaConfirm'); + captcha.click(); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(1000); + for (let i = 0; i < 3; ++i) { + const word = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#currentCapQue').textContent; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(100); + Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])(`[data-id='${word}']`).click(); + } + Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#template-contactform-submit').click(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?supercheats\.com$/, + path: /^\/interstitial\.html$/, + query: /(?:\?|&)oldurl=([^&]+)(?:$|&)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: /^(www\.)?sylnk\.net$/, + query: /link=([^&]+)/, + }, + { + host: /^(www\.)?compul\.in$/, + path: /^\/[np]\.php$/, + query: /v=([^&]+)/, + }, + { + host: [ + /^(sports14|motosport)\.pw$/, + /^lindung\.in$/, + /^motonews\.club$/, + /^ww[23]\.picnictrans\.com$/, + /^(azhie|skinnycat)\.net$/, + /^ww2\.awsubs\.co$/, + /^plantaheim\.web\.id$/, + ], + query: /^\?d=([a-zA-Z0-9/=]+)$/, + }, + { + host: /^i\.gtaind\.com$/, + query: /^\?([a-zA-Z0-9/=]+)$/, + }, + { + host: [ + /\.blogspot\.com?/, + /^(www\.)?designmyhomee\.com$/, + /^(www\.)?losstor\.com$/, + /^kurosafe\.menantisenja\.com$/, + /^(simaholina|autech)\.xyz$/, + /^(www\.)?id-securelink\.xyz$/, + /^(www\.)?tojros\.tk$/, + /^(www\.)?anjay\.info$/, + /^(www\.)?kakkoiisafe\.us$/, + /^(www\.)?kurosafe\.(website|online)$/, + ], + query: [ + /^\?url=([a-zA-Z0-9/=]+)$/, + /^\?id=([a-zA-Z0-9/=]+)$/, + /^\?site=([a-zA-Z0-9/=]+)$/, + ], + }, + { + host: [ + /^sehatlega\.com$/, + /^businessforyouand\.me$/, + /^plantaheim\.web\.id$/, + ], + query: /^\?r=([a-zA-Z0-9/=]+)$/, + }, + { + host: /^www\.compartiendofull\.net$/, + path: /^\/go2/, + query: /^\?p=([a-zA-Z0-9/=]+)$/, + }, + { + host: /^animeforce\.stream$/, + query: /^\?l=([a-zA-Z0-9/=]+)$/, + }, + ], + async start (m) { + const rawLink = atob(m.query[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(rawLink); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: [ + /(^|\.)safelinkconverter2?\.com$/, + /^safelink(s?review(er)?)\.com?$/, + ], + query: /id=([\w\\]+=*)/, + }, + { + host: [ + /^(naisho|filmku|henpoi)\.lompat\.in$/, + /^edogawa\.lon\.pw$/, + ], + query: /go=([\w\\]+=*)/, + }, + ], + async start (m) { + let l = atob(m.query[1]); + const table = { + '!': 'a', + ')': 'e', + '_': 'i', + '(': 'o', + '*': 'u', + }; + l = l.replace(/[!)_(*]/g, function (m) { + return table[m]; + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?safelinkreview\.com$/, + path: /^\/\w+\/cost\/([\w.]+)\/?$/, + }, + async start (m) { + const l = 'http://' + m.path[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(gameinfo|apasih)\.pw$/, + /^(www\.)?lifesurance\.info$/, + /^(intercelestial|sweetlantern)\.com$/, + ], + query: /^\?id=([a-zA-Z0-9/=]+)$/, + }, + async ready () { + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('form'); + f.submit(); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: [ + /^motonews\.club$/, + /^(www\.)?bolaoke\.club$/, + /^(ani-share|autolinkach)\.com$/, + /^sehatsegar\.net$/, + /^(autofans|landscapenature)\.pw$/, + /^(www\.)?lifesurance\.info$/, + ], + query: /get=([^&]+)/, + }, + { + host: [ + /^(gameinfo|apasih)\.pw$/, + /^(www\.)?lifesurance\.info$/, + /^(intercelestial|sweetlantern)\.com$/, + ], + }, + ], + async ready (m) { + let s = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/(const|var) a='([^']+)'/); + if (s) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(s[2]); + return; + } + s = atob(m.query[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(s); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^kombatch\.loncat\.pw$/, + }, + async ready () { + let s = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/\.open\("([^"]+)",/); + s = s[1].match(/go=([^&]+)/); + s = atob(s[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(s); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^ww[23]\.picnictrans\.com$/, + /^short\.awsubs\.(co|me)$/, + ], + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div.kiri > center > a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^susutinv2\.com$/, + }, + async ready () { + const s = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/="([^"]+)",/); + if (!s) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].warn('site changed'); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(s[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?anjay\.info$/, + /^(www\.)?tetew\.info$/, + /^www\.njiir\.com$/, + ], + }, + async ready () { + let a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div.download-link > a'); + a = a.href.match(/r=(.*)$/); + a = atob(a[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^techfunda\.net$/, + path: [ + /^\/link\//, + /^\/safe\//, + ], + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.hide a.btn'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^thinfi\.com$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div p a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^tinyarrows\.com$/, + path: /^\/preview\.php$/, + query: /^\?page=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(decodeURIComponent(m.query[1])); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?totaldebrid\.org$/, + path:/\/l\/(l\.php)?$/, + query: /\?ads=([a-zA-Z0-9=]+)$/, + }, + async start (m) { + const l = atob(m.query[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /turkdown\.com$/, + path: /^\/link/, + query: /^\?id=(.+)/, + }, + async ready (m) { + let html = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(`?ajax=${m.query[1]}`); + html = JSON.parse(html); + const res = /stepone=(.+)/.exec(html.url); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(atob(res[1])); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^unfake\.it$/, + }, + async ready () { + const frame = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('frame'); + const i = frame.src.lastIndexOf('http://'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(frame.src.substr(i)); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^ur\.ly$/, + /^urly\.mobi$/, + ], + path: /^\/x(.+)/, + }, + async ready () { + const path = window.location.href.replace('/x', '/goii/'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + } +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^url\.fm$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#clickbtn a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^url\.ie$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a[title="Link to original URL"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /(^|\.)urlcash\.(com|net|org)$/, + /^(bat5|detonating|celebclk|eightteen|smilinglinks|peekatmygirlfriend|pornyhost|clb1|urlgalleries)\.com$/, + /^looble\.net$/, + /^xxxs\.org$/, + ], + }, + async ready () { + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window && _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.linkDestUrl) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.linkDestUrl); + return; + } + const matches = document.body.innerHTML.match(/linkDestUrl = '(.+)'/); + if (matches) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(matches[1]); + return; + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^urlinn\.com$/, + }, + async ready () { + const m = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('META[HTTP-EQUIV=refresh]').getAttribute('CONTENT').match(/url='([^']+)'/); + if (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^urlms\.com$/, + }, + async ready () { + const iframe = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#content'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(iframe.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?urlv2\.com$/, + }, + async ready () { + if (window.location.pathname.indexOf('locked') >= 0) { + const path = window.location.pathname.replace('/locked', ''); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + return; + } + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/jeton=([\w]+)/); + const l = 'http://urlv2.com/algo.php?action=passer&px=0&so=1&jeton=' + m[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(5 * 1000); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?uskip\.me$/, + path: /^\/go\/\w+$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#btn-main'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^vavi\.co$/, + }, + async ready () { + const l = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#goLink'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(l.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.viidii\.info$/, + query: /url=([^&]+)/, + }, + async start (m) { + const url = decodeURIComponent(m.query[1]); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.viidii\.info$/, + }, + async ready () { + const o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.bglink'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(o.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?vir\.al$/, + }, + async ready () { + const m = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].searchFromScripts(/const target_url = '([^']+)';/); + if (!m) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('site changed'); + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(m[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?vzturl\.com$/, + }, + async ready () { + const frame = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('frame[scrolling=yes]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(frame.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^st\.wardhanime\.net$/, + path: /^\/i\/\d+$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#wrapper > [class^="tombo"] > a[target="_blank"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://yep.it/preview.php?p=*', + async ready () { + const link = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('font[color="grey"]').innerHTML; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(link); + }, +}); +(() => { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.yooclick.com/l/*', + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const uniq = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.uniq || _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.uniqi; + if (!uniq) { + return; + } + const path = window.location.pathname; + const url = `${path}?ajax=true&adblock=false&old=false&framed=false&uniq=${uniq}`; + await getURL(url); + }, + }); + async function getURL (url) { + const text = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(url); + const goodURL = /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!$&'()*+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!$&'()*+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!$&'()*+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!$&'()*+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!$&'()*+,;=]|:|@)|\/|\?)*)?$/i.test(text); + if (goodURL) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(text); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + await getURL(url); + } +})(); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?([a-zA-Z0-9]+\.)?binbox\.io$/, + path: /\/([a-zA-Z0-9]+)/, + hash: /(?:#([a-zA-Z0-9]+))?/, + }, + async ready (m) { + const sjcl = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.sjcl; + const paste_id = m.path[1]; + const paste_salt = m.hash[1]; + const API_URL = `https://binbox.io/${paste_id}.json`; + let pasteInfo = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].get(API_URL, false, { + Origin: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + Referer: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + Cookie: 'referrer=1', + 'X-Requested-With': _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none, + }); + pasteInfo = JSON.parse(pasteInfo); + if (!pasteInfo.ok) { + throw new _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].AdsBypasserError('error when getting paste information'); + } + if (pasteInfo.paste.url) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(pasteInfo.paste.url); + return; + } + const raw_paste = sjcl.decrypt(paste_salt, pasteInfo.paste.text); + if (isLink(raw_paste)) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(raw_paste); + return; + } + const elm = document.createElement('pre'); + elm.id = 'paste-text'; + elm.innerHTML = linkify(raw_paste); + const frame = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#paste-frame, #captcha-page'); + frame.parentNode.replaceChild(elm, frame); + }, + }); + const sUrl = '(\\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])'; + function isLink (text) { + const rUrl = new RegExp(`^${sUrl}$`, 'i'); + return rUrl.test(text); + } + function linkify (text) { + const rUrl = new RegExp(sUrl, 'ig'); + return text.replace(rUrl, (match) => { + return `${match}`; + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?pasted\.co$/, + path: /^\/\w+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('#captcha_overlay'); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.2i\.(sk|cz)$/, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#wrap3 img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://*.abload.de/image.php?img=*', + 'http://www.imageup.ru/*/*/*.html', + ], + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^all-poster\.ru$/, + query: /^\?v=/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#imagen img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^bunnyforum\.org$/, + query: /^\?v=/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img[title^=Click]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^bayimg\.com$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#mainImage'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^beeimg\.com$/, + path: /\/view\/.*/, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.img-responsive'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.bilder-upload.eu/show.php?file=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[type=image]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.casimages.com/img.php?*', + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('td a img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://cubeupload.com/im/*', + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.galleryBigImg'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^dailyss\.net$/, + /^i\.hentai-ddl\.org$/, + /^imghost\.top$/, + ], + path: /^\/image\/.+$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#image-viewer-container img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^depic\.me$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#pic'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^img(dino|tiger|zap)\.com$/, + path: /^\/viewer\.php$/, + query: /^\?file=/, + }, + async ready () { + const o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#cursor_lupa'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://*.directupload.net/file/*.htm', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#ImgFrame'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ewa\.ac$/, + path: /^\/(.*)$/, + }, + async ready (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(5000); + const url = await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post('/site/get-new-redirect-link', { + code: m.path[1], + ads_blocked: false, + }); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^fastpic\.ru$/, + path: /^\/view\//, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#picContainer #image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src, { + referer: true, + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.fotolink.su/v.php?id=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#content img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.fotosik.pl/pokaz_obrazek/pelny/*.html', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('a.noborder img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^freakimage\.com$/, + /^www\.hostpic\.org$/, + ], + path: /^\/view\.php$/, + query: /^\?filename=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/images/' + m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?freeimgup\.com$/, + path: /^\/xxx\//, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#mainimage'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^fullimg\.com$/, + query: /^\?v=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/images/' + m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imagep2p\.com$/, + query: /^\?v=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/images/' + m.query[1] + '.jpeg'); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://funkyimg.com/viewer.php?img=*', + 'http://funkyimg.com/view/*', + ], + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#viewer img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +(function () { + const hostRule = /^goimagehost\.com$/; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRule, + path: /^\/xxx\/images\//, + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRule, + path: /^\/xxx\/(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/xxx/images/' + m.path[1]); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: hostRule, + query: /^\?v=(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/xxx/images/' + m.query[1]); + }, + }); +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.hostingpics.net/viewer.php?id=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#img_viewer'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://ifotos.pl/zobacz/*', + async ready () { + const m = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('meta[property="og:image"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(m.content); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^ima\.so$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#image_block a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imadul\.com$/, + query: /\?p[mt]=(.+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/?di=' + m.query[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^image2you\.ru$/, + path: /^\/\d+\/\d+/, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('div.t_tips2 div > img'); + if (!i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('', { + post: { + _confirm: '', + }, + }); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.imagebam.com/image/*', + async ready () { + let o = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('.image-container img[id]'); + if (o) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src, { + replace: true, + }); + return; + } + o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('body > div > div > a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(o.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.imagehousing.com/image/*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('td.text_item img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://imageno.com/*.html', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#image_div img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?imageporter\.com$/, + path: /^\/\w{12}\/.*\.html$/, + }, + ready: run, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?image(carry|dunk|porter|switch)\.com$/, + /^(www\.)?pic(leet|turedip|tureturn)\.com$/, + /^(www\.)?imgspice\.com$/, + /^(www\.)?(piclambo|yankoimages)\.net$/, + ], + }, + ready: run, + }); + async function run () { + const o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#download_box img[id]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src); + } +})(); +(function () { + const host = /^imageshack\.us$/; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: host, + path: /^\/photo\/.+\/(.+)\/([^/]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(`/f/${m.path[1]}/${m.path[2]}/`); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: host, + path: /^\/f\/.+\/[^/]+/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#fullimg'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, + }); +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://imageshost.ru/photo/*/id*.html', + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#bphoto a'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(a.href); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: [ + /^www\.(freebunker|imgcarry|imgshots)\.com$/, + /^www\.imagesnake\.(com|org)$/, + ], + path: /^\/show\.php$/, + query: /^\?/, + }, + { + host: /^www\.(freebunker|imgshots)\.com$/, + path: /^\/show\//, + }, + { + host: [ + /^www\.imagesnake\.(com|org)$/, + /^www\.imagefruit\.com$/, + ], + path: /^\/(img|show)\/.+/, + }, + { + host: /^imageban\.(ru|net)$/, + path: /^\/show\/\d{4}\/\d{2}\/\d{2}\/.+/, + }, + 'http://fotoo.pl/show.php?img=*.html', + { + host: /^www\.imagestime\.com$/, + path: /^\/show\.php\/.*\.html$/, + }, + ], + ready: run, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.imgcarry\.com$/, + path: /^\/show\//, + }, + ready: run2, + }); + async function run () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#img_obj'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, { + referer: true, + }); + } + async function run2 () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#img_obj'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, { + replace: true, + }); + } +})(); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: /^imagenpic\.com$/, + path: /^\/.*\/.+\.html?$/, + }, + { + host: /^imagetwist\.com$/, + }, + ], + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(run, true), + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^image(xport|shimage)\.com$/, + }, + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(run, false), + }); + async function run (rp) { + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.jQuery) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.jQuery.prototype.append = undefined; + } + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.pic'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, { + replace: rp, + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://imageupper.com/i/?*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://*.imagevenue.com/img.php?*', + 'http://hotchyx.com/d/adult-image-hosting-view-08.php?id=*', + ], + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#thepic'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imagezilla\.net$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#photo'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, { + referer: true, + }); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://img.3ezy.net/*.htm', + async ready () { + const l = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('link[rel="image_src"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(l.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://img1.imagilive.com/*/*', + async ready () { + const a = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#page a.button'); + if (a) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + return; + } + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#page > img:not([id])'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.img(babes|flare)\.com$/, + }, + async ready () { + let i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('input[onclick]'); + if (i) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.Decode(); + return; + } + i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#this_image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgbar\.net$/, + path: /^\/img_show\.php$/, + query: /^\?view_id=/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('center img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgbar\.net$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div.panel.top form input[name=sid]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('/img_show.php?view_id=' + i.value); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgbox\.com$/, + path: /^\/[\d\w]+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^img(fantasy|nemo|curl)\.com$/, + /^imagedomino\.com$/, + /^0img\.net$/, + /^bunnyforum\.org$/, + ], + query: /^\?[pv]=/, + }, + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(helper, false), + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgsay\.com$/, + query: /^\?[pv]=/, + }, + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(helper, true), + }); + async function helper (doReplace) { + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.confirmAge) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.confirmAge(1); + return; + } + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#container-home img[onclick]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, { + replace: doReplace, + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgmass\.com$/, + path: /^\/image\/[\d\w]+$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('#loading2'); + const d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.box'); + d.style.display = 'initial'; + d.style.opacity = 'initial'; + }, +}); +(function () { + const PATH_RULE = /^\/([0-9a-zA-Z-_]+)(\.|\/|$)/; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^img(monkey|trex|ve|dew)\.com$/, + /^(www\.)?imgsee\.me$/, + /^imgclick\.net$/, + /^(uploadrr|imageeer|www\.uimgshare|pic-maniac|hulkimge)\.com$/, + ], + path: PATH_RULE, + }, + async ready (m) { + await helper(m.path[1], getNext1); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^imgview\.net$/, + /^img(maze|outlet)\.com$/, + ], + path: PATH_RULE, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.pic'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + const d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div[id^="imageviewi"]'); + const node = await waitDOM(d, (node) => { + return node.nodeName === 'FORM' && _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('input[name="id"]', node); + }); + node.submit(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^imgtown\.net$/, + /^imgrock\.info$/, + ], + path: PATH_RULE, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.picview'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window._0x337c4b = null; + const node = await getAmbiguousForm('div[id] + div[id] > style', (node) => { + return node.parentElement; + }); + node.click(); + node.click(); + node.click(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgoutlet\.pw$/, + path: PATH_RULE, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.picview'); + if (i) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window._0x2cd123 = null; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window._0x337c4b = null; + const node = await getAmbiguousForm('div[id] + div[id] > style', (node) => { + return node.parentElement; + }); + node.click(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgfiles\.org$/, + path: PATH_RULE, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.pic'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('form'); + f.submit(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://imgview.net/tpind.php', + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.pic'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src, {replace: true}); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + let d = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('div[id^="imageviewi"] input[type="submit"][style=""]'); + d = d.parentNode; + d.submit(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: /^http:\/\/imgdragon\.com\/(getfil\.php|dl)$/, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.pic'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + const f = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#ContinueFRM'); + f.submit(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgrock\.pw$/, + path: PATH_RULE, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.picview'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + const node = await getAmbiguousForm( + 'div[id] + div[id] > input:not([style])', + (node) => { + const d = node.parentElement; + node.click(); + return d; + }); + node.click(); + }, + }); + function waitDOM (element, fn) { + return new Promise((resolve) => { + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.type !== 'childList') { + return; + } + const [k, , r] = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].find(mutation.addedNodes, (child) => { + return fn(child) ? child : _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none; + }); + if (k === _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].none) { + return; + } + observer.disconnect(); + resolve(r); + }); + }); + observer.observe(element, { + childList: true, + }); + }); + } + async function getAmbiguousForm (selector, shellNormalizer) { + const d = await waitFormShell(selector, shellNormalizer); + const style = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('style', d); + const visibleClasses = parseStyle(style); + const forms = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$$('form', d); + for (const form of forms) { + const isVisible = visibleClasses.some((class_) => { + return form.classList.contains(class_); + }); + if (!isVisible) { + continue; + } + const button = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('input[type="button"], button[type="button"]', form); + if (button) { + return button; + } + } + return null; + } + function waitFormShell (selector, normalizer) { + return new Promise((resolve) => { + const handle = setInterval(() => { + let shell = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$(selector); + if (!shell) { + return; + } + clearInterval(handle); + shell = normalizer(shell); + resolve(shell); + }, 500); + }); + } + function parseStyle (style) { + style = style.textContent; + const pattern = /\.(\w+)\{visibility:initial;\}/g; + let rv = null; + const classes = []; + while ((rv = pattern.exec(style)) !== null) { + classes.push(rv[1]); + } + return classes; + } + function getNext1 (i) { + return i.value; + } + async function helper (id, getNext) { + const recaptcha = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#recaptcha_widget, #captcha'); + if (recaptcha) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('stop because recaptcha'); + return; + } + let i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('input[name="next"]'); + if (i) { + const next = getNext(i); + await go(id, Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[name="pre"]').value, next); + return; + } + i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img.picview'); + if (i) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].info('do nothing'); + } + async function go (id, pre, next) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink('', { + post: { + op: 'view', + id: id, + pre: pre, + next: next, + adb: '0', + }, + }); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgtorrnt\.in$/, + path: /^\/view\.php$/, + query: /^\?id=.*/, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('center div table.tg tbody tr td center img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgvault\.pw$/, + path: /^\/view-image\//, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('article div.span7 a[target="_blank"]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://ipic.su/?page=img&pic=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#fz'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^keptarolo\.hu$/, + path: /^(\/[^/]+\/[^/]+\.jpg)$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('http://www.keptarolo.hu/kep' + m.path[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^lostpic\.net$/, + query: /^\?photo=\d+$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.notinline.circle'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +(function () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(miragepics|funextra\.hostzi)\.com$/, + /^bilder\.nixhelp\.de$/, + /^imagecurl\.(com|org)$/, + ], + path: /^\/viewer\.php$/, + query: /file=([^&]+)/, + }, + start: helper, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgsin\.com$/, + path: /^\/viewer\.php$/, + query: /file=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/files/' + m.query[1]); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^img(nip|central|cream)\.com$/, + path: /^\/viewerr.*\.php$/, + query: /file=([^&]+)/, + }, + start: helper, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://www.overpic.net/viewer.php?file=*', + ], + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#main_img'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^xxxhost\.me$/, + path: /^\/viewer\d+\.php$/, + query: /file=([^&]+)/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('files/' + m.query[1]); + }, + }); + async function helper (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/images/' + m.query[1]); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.mrjh\.org$/, + path: /^\/gallery\.php$/, + query: /^\?entry=(.+)$/, + }, + async ready (m) { + const url = m.query[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage('/' + url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.noelshack\.com$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#elt_to_aff'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^overdream\.cz$/, + path: /^\/image\//, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#full_image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://pic-money.ru/*.html', + async ready () { + const f = document.forms[0]; + const sig = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[name="sig"]', f).value; + const pic_id = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[name="pic_id"]', f).value; + const referer = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('input[name="referer"]', f).value; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(`/pic.jpeg?pic_id=${pic_id}&sig=${sig}&referer=${referer}`); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.pic-upload.de/view-*.html', + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('.advert'); + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.preview_picture_2b, img.original_picture_2b'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^pic(4|5)you\.ru$/, + }, + async ready () { + if (_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#d1 > img') != null) { + const URLparams = location.href.split('/', 5); + let next = URLparams.join('/'); + next = next + '/1/'; + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].setCookie('p4yclick', '1'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(next); + } else { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#d1 img').src; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i); + } + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?piccash\.net$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.container > img'); + const m = i.onclick.toString().match(/mshow\('([^']+)'\);/); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(m[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(picexposed|croea)\.com$/, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img.pic'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://amateurfreak.org/share-*.html', + 'http://amateurfreak.org/share.php?id=*', + 'http://picfox.org/*', + 'http://www.euro-pic.eu/share.php?id=*', + 'http://xxx.freeimage.us/share.php?id=*', + 'http://www.pixsor.com/share.php?id=*', + 'http://www.pixsor.com/share-*.html', + 'http://pixsor.com/XXX/share-*.html', + 'http://holdthemoan.net/x/share-*.html', + 'http://www.imgz.pw/share-*.html', + ], + async ready () { + const o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#iimg'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://pics-money.ru/allpicfree/*', + 'http://www.pics-money.ru/allimage/*', + ], +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^pics-money\.ru$/, + path: /^\/v\.php$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('center img:not([id])'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^www\.pics-money\.ru$/, + /^(picker-click|p0xpicmoney)\.ru$/, + ], + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#d1 img, #pay_thumb_img > img'); + i = i.onclick.toString(); + i = i.match(/mshow\('(.+)'\)/); + i = i[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://picshare.geenza.com/pics/*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#picShare_image_container'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^picstream\.tv$/, + path: /^\/.*\/.*\.html$/, + }, + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#view1 > div:nth-child(1) > img:nth-child(1)'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?pimpandhost\.com$/, + path: /^\/image\//, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#image_original'); + const el = document.createElement('div'); + el.innerHTML = a.value; + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img', el); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?pixhost\.to$/, + path: /^\/show\//, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe, #ad'); + let o = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#all'); + if (o) { + o.style.display = ''; + } + o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#show_image, #image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?pixroute\.com$/, + }, + async ready () { + const o = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('.fr4me > div:nth-child(20) > a:nth-child(1) > img:nth-child(1)'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(o.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^www\.pixsense\.net$/, + /^www\.imagespicy\.site$/, + /^www\.img(sky|file)\.net$/, + ], + path: /^\/site\/v\/\d+$/, + }, + async ready () { + const a = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#myUniqueImg').parentNode; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(a.href); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^pixxxels\.cc$/, + }, + async ready () { + const img = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#main-image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.dataset.full); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^prntscr\.com$/, + /^prnt\.sc$/, + ], + path: /\.html$/, + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^prntscr\.com$/, + /^prnt\.sc$/, + ], + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#screenshot-image'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^pronpic\.org$/, + }, + async ready () { + const urlBaseImg = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('table.new_table2:nth-child(1) img.link'); + const baseUrl = urlBaseImg.src.split('th_')[0]; + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('table.new_table2:nth-child(2) img.link'); + const url = baseUrl + img.src.split('th_')[1]; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(url); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^qrrro\.com$/, + path: /^(\/images\/.+)\.html$/, + }, + async start (m) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(m.path[1]); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^radikal\.ru$/, + path: /^\/big\//, + }, + async ready () { + const i = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('.base-page_center > div:nth-child(2) > img:nth-child(1)'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +(function () { + const defaultAction = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(action, '#continuetoimage > form input', 'img[class^=centred]'); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: [ + /^image(corn|decode|ko)\.com$/, + /^(hostur|greasy|dam)image\.com$/, + /^img(icy|savvy|tzar|tornado|kicks|2share|hit|main|trial|reputa|fapper|part|balana)\.com$/, + /^(i\.)?imgseeds?\.com$/, + /^img-(planet|pay)\.com$/, + /^www\.imglemon\.com$/, + /^xxxscreens\.com$/, + /^(wpc8|dimtus|tinizo|erimge|nimzshare)\.com$/, + /^(i|xxx)\.hentaiyoutube\.com$/, + /^(xxxwebdlxxx|teenshot)\.org$/, + /^image(on|team)\.org$/, + /^(voyeur|teen|mega)image\.org$/, + /^img(studio|spot)\.org$/, + /^img(serve|project|python|pix)\.net$/, + /^img-view\.net$/, + /^(naughtygate|gallerycloud)\.net$/, + /^(fun|xx)img\.net$/, + /^hotimages\.eu$/, + /(^|\.)55888\.eu$/, + /^picz\.site$/, + /^pic\.hotimg\.site$/, + /^www\.hotimage\.uk$/, + /^imgcloud\.co$/, + /^pixup\.us$/, + /^(pop-img|ads-img)\.info$/, + /^(domaink|porno-pirat)\.ru$/, + /^xxx\.pornscreen\.xyz$/, + /^darpix\.ga$/, + /^ipicture\.su$/, + /^acidimg\.cc$/, + /^s\.imghost\.top$/, + ], + path: /^\/img-.*\.html/, + }, + { + host: [ + /^hentai-pop\.com$/, + /^star-hentai\.com$/, + ], + path: /^\/[ti]\/img-.*\.html/, + }, + { + host: /^imgking\.co$/, + path: /^\/img4?-.*\.html/, + }, + { + host: /^ima\.gy$/, + path: /^\/i\/.+$/, + }, + ], + ready: defaultAction, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgrat\.com$/, + path: /^\/img-.*\.html/, + }, + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(action, '#close', '#main_image img.center-block.img-responsive'), + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^(www\.)?imgfresh\.info$/, + path: /^\/img-.*\.html$/, + }, + async ready () { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe'); + let node = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('#continuetoimage > form input'); + if (node) { + node.click(); + node.click(); + return; + } + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].resetCookies(); + node = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$('img[class^=centred]'); + if (node) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(node.src); + return; + } + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].post(window.location.href.toString(), { + cti: 1, + ref: '', + rc: 1, + rp: 1, + bt: 0, + bw: 'edge', + }); + window.location.reload(); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: /^imgking\.co$/, + path: /^\/imgs-.*\.html/, + }, + { + host: [ + /^img(kings|prime)\.com$/, + /^imagerar\.com$/, + ], + path: /^\/img-.*\.html/, + }, + ], + async ready () { + const url = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].window.linkid; + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(url); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgkings\.com$/, + path: /^\/img2-.*\.html/, + }, + ready: defaultAction, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imgprime\.com$/, + path: /^\/imga-u\/(.+)\.jpeg\.html/, + }, + async ready () { + const path = window.location.href.replace('/imga-u', '/u').replace('.html', ''); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^22pixx\.xyz$/, + path: /^\/ia-i\/(.+)\.jpeg\.html/, + }, + async ready () { + const path = window.location.href.replace('/ia-i', '/i').replace('.html', ''); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openLink(path); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + { + host: /^imagerar\.com$/, + path: /^\/img2-/, + }, + { + host: /^imgking\.co$/, + path: /^\/img[v3]-.*\.html/, + }, + { + host: /^imgprime\.com$/, + path: /^\/img.*\.html$/, + }, + ], + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('img[alt]'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^imx\.to$/, + path: [ + /^\/img-.*\.html/, + /^\/i\/.*/, + ], + }, + ready: _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].partial(action, '#continuebutton, #continuetoimage input[type="submit"]', 'img[class^=centred]'), + }); + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: [ + /^(www\.)?imgdrive\.net$/, + /^(www\.)?img(taxi|wallet|adult)\.com$/, + ], + path: /^\/img-.*\.html$/, + }, + async ready () { + let m = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('meta[property="og:image"]'); + m = m.content.replace('small', 'big'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(m); + }, + }); + async function action (firstSelector, secondSelector) { + _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].remove('iframe, #adblock_detect, .popupOverlay'); + const node = _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].$(firstSelector); + if (node) { + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + node.removeAttribute('disabled'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].wait(500); + node.focus(); + node.click(); + node.click(); + node.click(); + return; + } + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])(secondSelector); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + } +})(); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: [ + 'http://screenlist.ru/details.php?image_id=*', + 'http://www.imagenetz.de/*/*.html', + ], + async ready () { + const img = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#picture'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(img.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://www.subirimagenes.com/*.html', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#ImagenVisualizada'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: 'http://tinypic.com/view.php?pic=*', + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#imgElement'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); +_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["_"].register({ + rule: { + host: /^www\.turboimagehost\.com$/, + path: /^\/p\//, + }, + async ready () { + const i = Object(_ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"])('#imageid'); + await _ADSBYPASSER_NAMESPACE___WEBPACK_IMPORTED_MODULE_0__["$"].openImage(i.src); + }, +}); + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "_", function() { return _; }); + __webpack_require__.d(__webpack_exports__, "$", function() { return $; }); + var util_ajax__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); + var util_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); + var util_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1); + var util_dispatcher__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2); + var util_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10); + var util_image__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11); + var util_link__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12); + var util_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5); + var util_misc__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(13); + var util_platform__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(3); +const _ = { + AdsBypasserError: util_core__WEBPACK_IMPORTED_MODULE_2__["AdsBypasserError"], + find: util_core__WEBPACK_IMPORTED_MODULE_2__["find"], + forEach: util_core__WEBPACK_IMPORTED_MODULE_2__["forEach"], + generateRandomIP: util_misc__WEBPACK_IMPORTED_MODULE_8__["generateRandomIP"], + info: util_logger__WEBPACK_IMPORTED_MODULE_7__["info"], + none: util_core__WEBPACK_IMPORTED_MODULE_2__["none"], + partial: util_core__WEBPACK_IMPORTED_MODULE_2__["partial"], + register: util_dispatcher__WEBPACK_IMPORTED_MODULE_3__["register"], + tryEvery: util_core__WEBPACK_IMPORTED_MODULE_2__["tryEvery"], + wait: util_core__WEBPACK_IMPORTED_MODULE_2__["wait"], + warn: util_logger__WEBPACK_IMPORTED_MODULE_7__["warn"], +}; +function $ (selector, context) { + return Object(util_dom__WEBPACK_IMPORTED_MODULE_4__["querySelector"])(selector, context); +} +$.$ = util_dom__WEBPACK_IMPORTED_MODULE_4__["querySelectorOrNull"]; +$.$$ = util_dom__WEBPACK_IMPORTED_MODULE_4__["querySelectorAll"]; +$.block = util_dom__WEBPACK_IMPORTED_MODULE_4__["block"]; +$.get = util_ajax__WEBPACK_IMPORTED_MODULE_0__["get"]; +$.getCookie = util_cookie__WEBPACK_IMPORTED_MODULE_1__["getCookie"]; +$.nuke = util_misc__WEBPACK_IMPORTED_MODULE_8__["nuke"]; +$.openImage = util_image__WEBPACK_IMPORTED_MODULE_5__["openImage"]; +$.openLink = util_link__WEBPACK_IMPORTED_MODULE_6__["openLink"]; +$.post = util_ajax__WEBPACK_IMPORTED_MODULE_0__["post"]; +$.remove = util_dom__WEBPACK_IMPORTED_MODULE_4__["remove"]; +$.removeAllTimer = util_misc__WEBPACK_IMPORTED_MODULE_8__["removeAllTimer"]; +$.resetCookies = util_cookie__WEBPACK_IMPORTED_MODULE_1__["resetCookies"]; +$.searchFromScripts = util_dom__WEBPACK_IMPORTED_MODULE_4__["searchFromScripts"]; +$.setCookie = util_cookie__WEBPACK_IMPORTED_MODULE_1__["setCookie"]; +$.toDOM = util_dom__WEBPACK_IMPORTED_MODULE_4__["toDOM"]; +$.window = util_platform__WEBPACK_IMPORTED_MODULE_9__["usw"]; + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "get", function() { return get; }); + __webpack_require__.d(__webpack_exports__, "post", function() { return post; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + var util_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); + var util_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5); +class AjaxError extends util_core__WEBPACK_IMPORTED_MODULE_0__["AdsBypasserError"] { + constructor (method, url, data, headers, status, response) { + super(`${method} ${url} got ${status}`); + this._method = method; + this._url = url; + this._data = data; + this._headers = headers; + this._status = status; + this._response = response; + } + get name () { + return 'AjaxError'; + } + get method () { + return this._method; + } + get url () { + return this._url; + } + get data () { + return this._data; + } + get headers () { + return this._headers; + } + get status () { + return this._status; + } + get response () { + return this._response; + } +} +function deepJoin (prefix, object) { + const keys = Object.getOwnPropertyNames(object); + const mapped = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["map"])(keys, (k) => { + const v = object[k]; + const key = `${prefix}[${k}]`; + if (typeof v === 'object') { + return deepJoin(key, v); + } + const tmp = [key, v].map(encodeURIComponent); + return tmp.join('='); + }); + return mapped.join('&'); +} +function toQuery (data) { + const type = typeof data; + if (data === null || (type !== 'string' && type !== 'object')) { + return ''; + } + if (type === 'string') { + return data; + } + if (data instanceof String) { + return data.toString(); + } + const keys = Object.getOwnPropertyNames(data); + return Object(util_core__WEBPACK_IMPORTED_MODULE_0__["map"])(keys, (k) => { + const v = data[k]; + if (typeof v === 'object') { + return deepJoin(k, v); + } + const tmp = [k, v].map(encodeURIComponent); + return tmp.join('='); + }).join('&'); +} +function ajax (method, url, data, headers) { + Object(util_logger__WEBPACK_IMPORTED_MODULE_2__["debug"])('ajax', method, url, data, headers); + const l = document.createElement('a'); + l.href = url; + const reqHost = l.hostname; + const overrideHeaders = { + Host: reqHost || window.location.host, + Origin: window.location.origin, + Referer: window.location.href, + 'X-Requested-With': 'XMLHttpRequest', + }; + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(overrideHeaders, (v, k) => { + if (headers[k] === util_core__WEBPACK_IMPORTED_MODULE_0__["none"]) { + delete headers[k]; + } else { + headers[k] = v; + } + }); + if (data) { + if (headers['Content-Type'].indexOf('json') >= 0) { + data = JSON.stringify(data); + } else { + data = toQuery(data); + } + headers['Content-Length'] = data.length; + } + return new Promise((resolve, reject) => { + util_platform__WEBPACK_IMPORTED_MODULE_1__["GMAPI"].xmlHttpRequest({ + method: method, + url: url, + data: data, + headers: headers, + onload (response) { + response = (typeof response.responseText !== 'undefined') ? response : this; + if (response.status !== 200) { + reject(new AjaxError(method, url, data, headers, response.status, response.responseText)); + } else { + resolve(response.responseText); + } + }, + onerror (response) { + response = (typeof response.responseText !== 'undefined') ? response : this; + reject(new AjaxError(method, url, data, headers, response.status, response.responseText)); + }, + }); + }); +} +function get (url, data, headers) { + data = toQuery(data); + data = data ? '?' + data : ''; + headers = headers || {}; + return ajax('GET', url + data, '', headers); +} +function post (url, data, headers) { + const h = { + 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', + }; + if (headers) { + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(headers, (v, k) => { + h[k] = v; + }); + } + return ajax('POST', url, data, h); +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "setCookie", function() { return setCookie; }); + __webpack_require__.d(__webpack_exports__, "getCookie", function() { return getCookie; }); + __webpack_require__.d(__webpack_exports__, "resetCookies", function() { return resetCookies; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +function setCookie (key, value) { + document.cookie = `${key}=${value};path=${location.pathname};`; +} +function getCookie (key) { + let [, c,] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(document.cookie.split(';'), (v) => { + const k = v.replace(/^\s*([a-zA-Z0-9-_]+)=.+$/, '$1'); + if (k !== key) { + return util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + } + }); + if (c === util_core__WEBPACK_IMPORTED_MODULE_0__["none"]) { + return null; + } + c = c.replace(/^\s*[a-zA-Z0-9-_]+=([^;]+).?$/, '$1'); + if (!c) { + return null; + } + return c; +} +function resetCookies () { + const a = document.domain; + const b = document.domain.replace(/^www\./, ''); + const c = document.domain.replace(/^(\w+\.)+?(\w+\.\w+)$/, '$2'); + const d = (new Date(1e3)).toUTCString(); + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(document.cookie.split(';'), (v) => { + const k = v.replace(/^\s*(\w+)=.+$/, '$1'); + document.cookie = `${k}=;expires=${d};`; + document.cookie = `${k}=;path=/;expires=${d};`; + const e = (a, b, c) => `${a}=;path=/;domain=${b};expires=${c};`; + document.cookie = e(k, a, d); + document.cookie = e(k, b, d); + document.cookie = e(k, c, d); + }); +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "block", function() { return block; }); + __webpack_require__.d(__webpack_exports__, "querySelector", function() { return querySelector; }); + __webpack_require__.d(__webpack_exports__, "querySelectorAll", function() { return querySelectorAll; }); + __webpack_require__.d(__webpack_exports__, "querySelectorOrNull", function() { return querySelectorOrNull; }); + __webpack_require__.d(__webpack_exports__, "remove", function() { return remove; }); + __webpack_require__.d(__webpack_exports__, "searchFromScripts", function() { return searchFromScripts; }); + __webpack_require__.d(__webpack_exports__, "toDOM", function() { return toDOM; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + var util_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +class DomNotFoundError extends util_core__WEBPACK_IMPORTED_MODULE_0__["AdsBypasserError"] { + constructor (selector) { + super(`\`${selector}\` not found`); + } + get name () { + return 'DomNotFoundError'; + } +} +function querySelector (selector, context) { + if (!context || !context.querySelector) { + context = document; + } + const n = context.querySelector(selector); + if (!n) { + throw new DomNotFoundError(selector); + } + return n; +} +function querySelectorOrNull (selector, context) { + try { + return querySelector(selector, context); + } catch (e) { + return null; + } +} +function querySelectorAll (selector, context) { + if (!context || !context.querySelectorAll) { + context = document; + } + const ns = context.querySelectorAll(selector); + return ns; +} +function toDOM (rawHTML) { + try { + const parser = new DOMParser(); + const DOMHTML = parser.parseFromString(rawHTML, 'text/html'); + return DOMHTML; + } catch (e) { + throw new util_core__WEBPACK_IMPORTED_MODULE_0__["AdsBypasserError"]('could not parse HTML to DOM'); + } +} +function remove (selector, context) { + const nodes = querySelectorAll(selector, context); + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(nodes, (e) => { + Object(util_logger__WEBPACK_IMPORTED_MODULE_1__["debug"])('removed', e); + e.remove(); + }); +} +function block (selector, context=null) { + if (!context) { + context = document; + } + let fn = null; + if (Object(util_core__WEBPACK_IMPORTED_MODULE_0__["isString"])(selector)) { + fn = () => { + remove(selector, context); + }; + } else if (typeof selector === 'function') { + fn = (mutation) => { + mutation.addedNodes.forEach((node) => { + if (selector(node)) { + node.parentNode.removeChild(node); + } + }); + }; + } else { + throw new TypeError('wrong selector'); + } + const o = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + fn(mutation); + }); + }); + o.observe(context, { + childList: true, + subtree: true, + }); +} +function searchFromScriptsByRegExp (pattern, context) { + const scripts = querySelectorAll('script', context); + const [, , m] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(scripts, (s) => { + const m = s.textContent.match(pattern); + if (!m) { + return util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + } + return m; + }); + if (m === util_core__WEBPACK_IMPORTED_MODULE_0__["none"]) { + return null; + } + return m; +} +function searchFromScriptsByString (pattern, context) { + const scripts = querySelectorAll('script', context); + const [, m,] = Object(util_core__WEBPACK_IMPORTED_MODULE_0__["find"])(scripts, (s) => { + const m = s.textContent.indexOf(pattern); + if (m < 0) { + return util_core__WEBPACK_IMPORTED_MODULE_0__["none"]; + } + return m; + }); + if (m === util_core__WEBPACK_IMPORTED_MODULE_0__["none"]) { + return null; + } + return m.textContent; +} +function searchFromScripts (pattern, context) { + if (pattern instanceof RegExp) { + return searchFromScriptsByRegExp(pattern, context); + } else if (Object(util_core__WEBPACK_IMPORTED_MODULE_0__["isString"])(pattern)) { + return searchFromScriptsByString(pattern, context); + } else { + return null; + } +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "openImage", function() { return openImage; }); + var util_link__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); + var util_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); + var util_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5); + var util_misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13); + var util_platform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3); +async function openImage (imgSrc, options) { + options = options || {}; + const replace = !!options.replace; + const referer = !!options.referer; + if (replace) { + await replaceBody(imgSrc); + return; + } + const redirectImage = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getValue('redirect_image'); + if (redirectImage) { + await Object(util_link__WEBPACK_IMPORTED_MODULE_0__["openLink"])(imgSrc, { + referer: referer, + }); + } +} +function enableScrolling () { + const o = document.compatMode === 'CSS1Compat' ? document.documentElement : document.body; + o.style.overflow = ''; +} +function toggleShrinking () { + this.classList.toggle('adsbypasser-shrinked'); +} +function checkScaling () { + const nw = this.naturalWidth; + const nh = this.naturalHeight; + const cw = document.documentElement.clientWidth; + const ch = document.documentElement.clientHeight; + if ((nw > cw || nh > ch) && !this.classList.contains('adsbypasser-resizable')) { + this.classList.add('adsbypasser-resizable'); + this.classList.add('adsbypasser-shrinked'); + this.addEventListener('click', toggleShrinking); + } else { + this.removeEventListener('click', toggleShrinking); + this.classList.remove('adsbypasser-shrinked'); + this.classList.remove('adsbypasser-resizable'); + } +} +async function scaleImage (i) { + const siURL = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getResourceUrl('scaleImage'); + appendStyleURL(siURL); + if (i.naturalWidth && i.naturalHeight) { + checkScaling.call(i); + } else { + i.addEventListener('load', checkScaling); + } + let h = 0; + window.addEventListener('resize', () => { + window.clearTimeout(h); + h = window.setTimeout(checkScaling.bind(i), 100); + }); +} +async function changeBackground () { + const bgImage = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getResourceUrl('bgImage'); + document.body.style.backgroundColor = '#222222'; + document.body.style.backgroundImage = `url('${bgImage}')`; +} +async function alignCenter () { + const acURL = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getResourceUrl('alignCenter'); + appendStyleURL(acURL); +} +function injectStyle (d, i) { + Object(util_dom__WEBPACK_IMPORTED_MODULE_1__["remove"])('style, link[rel=stylesheet]'); + d.id = 'adsbypasser-wrapper'; + i.id = 'adsbypasser-image'; +} +function appendStyleURL (url) { + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = url; + document.head.appendChild(link); +} +async function replaceBody (imgSrc) { + const redirectImage = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getValue('redirect_image'); + if (!redirectImage) { + return; + } + if (!imgSrc) { + Object(util_logger__WEBPACK_IMPORTED_MODULE_2__["warn"])('false url'); + return; + } + Object(util_logger__WEBPACK_IMPORTED_MODULE_2__["info"])(`replacing body with \`${imgSrc}\` ...`); + Object(util_misc__WEBPACK_IMPORTED_MODULE_3__["removeAllTimer"])(); + enableScrolling(); + document.body = document.createElement('body'); + const d = document.createElement('div'); + document.body.appendChild(d); + const i = document.createElement('img'); + i.src = imgSrc; + d.appendChild(i); + const ac = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getValue('align_center'); + const si = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getValue('scale_image'); + if (ac || si) { + injectStyle(d, i); + } + if (ac) { + await alignCenter(); + } + const cb = await util_platform__WEBPACK_IMPORTED_MODULE_4__["GMAPI"].getValue('change_background'); + if (cb) { + await changeBackground(); + } + if (si) { + await scaleImage(i); + } +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "openLink", function() { return openLink; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + var util_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5); +function prepare (e) { + if (!document.body) { + document.body = document.createElement('body'); + } + document.body.appendChild(e); + return Object(util_core__WEBPACK_IMPORTED_MODULE_0__["wait"])(0); +} +async function get (url) { + const a = document.createElement('a'); + a.href = url; + let clicked = false; + a.addEventListener('click', (event) => { + event.stopPropagation(); + clicked = true; + }, true); + await prepare(a); + a.click(); + const tick = setInterval(() => { + if (clicked) { + Object(util_logger__WEBPACK_IMPORTED_MODULE_1__["info"])('already clicked'); + clearInterval(tick); + return; + } + Object(util_logger__WEBPACK_IMPORTED_MODULE_1__["info"])('try again'); + a.click(); + }, 500); +} +async function post (path, params) { + params = params || {}; + const form = document.createElement('form'); + form.method = 'post'; + form.action = path; + Object(util_core__WEBPACK_IMPORTED_MODULE_0__["forEach"])(params, (value, key) => { + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = key; + input.value = value; + form.appendChild(input); + }); + await prepare(form); + form.submit(); +} +async function openLink (to, options) { + if (!Object(util_core__WEBPACK_IMPORTED_MODULE_0__["isString"])(to) && !to) { + Object(util_logger__WEBPACK_IMPORTED_MODULE_1__["warn"])('false URL'); + return; + } + options = options || {}; + const withReferer = typeof options.referer === 'undefined' ? true : options.referer; + const postData = options.post; + const from = window.location.toString(); + Object(util_logger__WEBPACK_IMPORTED_MODULE_1__["info"])(`${from} -> ${to}`); + if (postData) { + await post(to, postData); + return; + } + if (withReferer) { + await get(to); + return; + } + window.top.location.replace(to); +} + }), + (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); + __webpack_require__.d(__webpack_exports__, "removeAllTimer", function() { return removeAllTimer; }); + __webpack_require__.d(__webpack_exports__, "nuke", function() { return nuke; }); + __webpack_require__.d(__webpack_exports__, "generateRandomIP", function() { return generateRandomIP; }); + var util_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); + var util_platform__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); + var util_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5); +function removeAllTimer () { + let handle = window.setInterval(util_core__WEBPACK_IMPORTED_MODULE_0__["nop"], 10); + while (handle > 0) { + window.clearInterval(handle--); + } + handle = window.setTimeout(util_core__WEBPACK_IMPORTED_MODULE_0__["nop"], 10); + while (handle > 0) { + window.clearTimeout(handle--); + } +} +function nuke (url) { + try { + util_platform__WEBPACK_IMPORTED_MODULE_1__["usw"].document.write('nuked by AdsBypasser, leading to ...
    '); + } catch (e) { + Object(util_logger__WEBPACK_IMPORTED_MODULE_2__["warn"])('nuke failed', e); + } + const a = document.createElement('a'); + a.href = url; + a.textContent = url; + document.body.appendChild(a); +} +function generateRandomIP () { + return [0, 0, 0, 0].map(() => { + return Math.floor(Math.random() * 256); + }).join('.'); +} + }) + ]); \ No newline at end of file diff --git a/qutebrowser/.local/share/qutebrowser/greasemonkey/betterttv.user.js b/qutebrowser/.local/share/qutebrowser/greasemonkey/betterttv.user.js new file mode 100644 index 0000000..2a05201 --- /dev/null +++ b/qutebrowser/.local/share/qutebrowser/greasemonkey/betterttv.user.js @@ -0,0 +1,22 @@ +// ==UserScript== +// @name BetterTTV +// @namespace BTTV +// @description Enhances Twitch with new features, emotes, and more. +// @copyright NightDev, LLC +// @icon https://cdn.betterttv.net/assets/logos/bttv_logo.png +// +// @grant none +// +// @include *://*.twitch.tv/* +// +// @version 0.0.2 +// ==/UserScript== + +(function betterttv() { + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = 'https://cdn.betterttv.net/betterttv.js'; + var head = document.getElementsByTagName('head')[0]; + if (!head) return; + head.appendChild(script); +})() diff --git a/qutebrowser/.local/share/qutebrowser/greasemonkey/emuparadise.js b/qutebrowser/.local/share/qutebrowser/greasemonkey/emuparadise.js new file mode 100644 index 0000000..4f25533 --- /dev/null +++ b/qutebrowser/.local/share/qutebrowser/greasemonkey/emuparadise.js @@ -0,0 +1,16 @@ +// ==UserScript== +// @name EmuParadise Download Workaround - 1.1.1 +// @version 1.1.2 +// @description Replaces the download button link with a working one +// @author Eptun +// @match https://www.emuparadise.me/*/*/* +// @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js +// @grant none +// ==/UserScript== + +(function() { + 'use strict'; + + var id = ((document.URL).split("/"))[5]; + $(".download-link").prepend(`Download using the workaround script

    `); +})(); diff --git a/qutebrowser/.local/share/qutebrowser/greasemonkey/ffz_injector.user.js b/qutebrowser/.local/share/qutebrowser/greasemonkey/ffz_injector.user.js new file mode 100644 index 0000000..05d3c7d --- /dev/null +++ b/qutebrowser/.local/share/qutebrowser/greasemonkey/ffz_injector.user.js @@ -0,0 +1,58 @@ +// ==UserScript== +// @id frankerfacez +// @name FrankerFaceZ +// @namespace FrankerFaceZ +// +// @version 1.58 +// @updateURL https://cdn.frankerfacez.com/script/ffz_injector.user.js +// +// @description FrankerFaceZ gives Twitch users custom chat emotes and introduces new features to improve the viewing experience. +// @homepage https://www.frankerfacez.com/ +// @icon https://cdn.frankerfacez.com/script/icon32.png +// @icon64 https://cdn.frankerfacez.com/script/icon64.png +// @icon128 https://cdn.frankerfacez.com/script/icon128.png +// +// @include http://twitch.tv/* +// @include https://twitch.tv/* +// @include http://*.twitch.tv/* +// @include https://*.twitch.tv/* +// +// @exclude http://api.twitch.tv/* +// @exclude https://api.twitch.tv/* +// +// @grant none +// @run-at document-end +// ==/UserScript== + +function ffz_init() +{ + var script = document.createElement('script'); + + script.id = 'ffz_script'; + script.type = 'text/javascript'; + script.src = '//cdn.frankerfacez.com/script/script.min.js?_=' + Date.now(); + + if ( localStorage.ffzDebugMode == "true" ) { + // Developer Mode is enabled. But is the server running? Check before + // we include the script, otherwise someone could break their + // experience and not be able to recover. + var xhr = new XMLHttpRequest(); + xhr.open("GET", "//localhost:8000/dev_server", true); + xhr.onload = function(e) { + var resp = JSON.parse(xhr.responseText); + console.log("FFZ: Development Server is present. Version " + resp.version + " running from: " + resp.path); + script.src = "//localhost:8000/script/script.js?_=" + Date.now(); + document.body.classList.add("ffz-dev"); + document.head.appendChild(script); + }; + xhr.onerror = function(e) { + console.log("FFZ: Development Server is not present. Using CDN."); + document.head.appendChild(script); + }; + return xhr.send(null); + } + + document.head.appendChild(script); +} + +ffz_init(); \ No newline at end of file diff --git a/qutebrowser/.local/share/qutebrowser/userscripts/mpv b/qutebrowser/.local/share/qutebrowser/userscripts/mpv new file mode 100755 index 0000000..2195b06 --- /dev/null +++ b/qutebrowser/.local/share/qutebrowser/userscripts/mpv @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +# +# Behavior: +# Userscript for qutebrowser which views the current web page in mpv using +# sensible mpv-flags. While viewing the page in MPV, all