Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.22 KB | None | 0 0
  1. #.bashrc
  2. ## OVERALL CONDITIONALS {{{
  3. _islinux=false
  4. [[ "$(uname -s)" =~ Linux|GNU|GNU/* ]] && _islinux=true
  5.  
  6. _isarch=false
  7. [[ -f /etc/os-release ]] && _isarch=true
  8.  
  9. _isxrunning=false
  10. [[ -n "$DISPLAY" ]] && _isxrunning=true
  11.  
  12. _isroot=false
  13. [[ $UID -eq 0 ]] && _isroot=true
  14. # }}}
  15. ## PS1 CONFIG {{{
  16. [[ -f $HOME/.dircolors ]] && eval $(dircolors -b $HOME/.dircolors)
  17. if $_isxrunning; then
  18.  
  19. [[ -f $HOME/.dircolors_256 ]] && eval $(dircolors -b $HOME/.dircolors_256)
  20.  
  21. export TERM='xterm-256color'
  22.  
  23. B='\[\e[1;38;5;33m\]'
  24. LB='\[\e[1;38;5;81m\]'
  25. GY='\[\e[1;38;5;242m\]'
  26. G='\[\e[1;38;5;82m\]'
  27. P='\[\e[1;38;5;161m\]'
  28. PP='\[\e[1;38;5;93m\]'
  29. R='\[\e[1;38;5;196m\]'
  30. Y='\[\e[1;38;5;214m\]'
  31. W='\[\e[0m\]'
  32.  
  33. get_prompt_symbol() {
  34. [[ $UID == 0 ]] && echo "#" || echo "\$"
  35. }
  36.  
  37. if [[ $PS1 && -f /usr/share/git/git-prompt.sh ]]; then
  38. source /usr/share/bash-completion/bash_completion
  39. source /usr/share/git/git-prompt.sh
  40.  
  41. export GIT_PS1_SHOWDIRTYSTATE=1
  42. export GIT_PS1_SHOWSTASHSTATE=1
  43. export GIT_PS1_SHOWUNTRACKEDFILES=0
  44.  
  45. export PS1="$GY[$Y\u$GY@$P\h$GY:$B\W\$(__git_ps1 \"$GY|$LB%s\")$GY]$W\$(get_prompt_symbol) "
  46. else
  47. export PS1="$GY[$Y\u$GY@$P\h$GY:$B\W$GY]$W\$(get_prompt_symbol) "
  48. fi
  49. else
  50. export TERM='xterm-color'
  51. fi
  52. #}}}
  53. ## BASH OPTIONS {{{
  54. shopt -s cdspell # Correct cd typos
  55. shopt -s checkwinsize # Update windows size on command
  56. shopt -s histappend # Append History instead of overwriting file
  57. shopt -s cmdhist # Bash attempts to save all lines of a multiple-line command in the same history entry
  58. shopt -s extglob # Extended pattern
  59. shopt -s no_empty_cmd_completion # No empty completion
  60. ## COMPLETION #{{{
  61. complete -cf sudo
  62. if [[ -f /etc/profile.d/bash_completion.sh ]]; then
  63. . /etc/profile.d/bash_completion.sh
  64. fi
  65. #}}}
  66. #}}}
  67. ## EXPORTS {{{
  68. export PATH=/usr/local/bin:$PATH
  69. #Ruby support
  70. if which ruby &>/dev/null; then
  71. GEM_DIR=$(ruby -rubygems -e 'puts Gem.user_dir')/bin
  72. if [[ -d "$GEM_DIR" ]]; then
  73. export PATH=$GEM_DIR:$PATH
  74. fi
  75. fi
  76. if [[ -d "$HOME/bin" ]] ; then
  77. PATH="$HOME/bin:$PATH"
  78. fi
  79. if which google-chrome-stable &>/dev/null; then
  80. export CHROME_BIN=/usr/bin/google-chrome-stable
  81. fi
  82. ## EDITOR #{{{
  83. if which vim &>/dev/null; then
  84. export EDITOR="vim"
  85. elif which emacs &>/dev/null; then
  86. export EDITOR="emacs -nw"
  87. else
  88. export EDITOR="nano"
  89. fi
  90. #}}}
  91. ## BASH HISTORY #{{{
  92. # make multiple shells share the same history file
  93. export HISTSIZE=1000 # bash history will save N commands
  94. export HISTFILESIZE=${HISTSIZE} # bash will remember N commands
  95. export HISTCONTROL=ignoreboth # ingore duplicates and spaces
  96. export HISTIGNORE='&:ls:ll:la:cd:exit:clear:history'
  97. #}}}
  98. ## COLORED MANUAL PAGES #{{{
  99. # @see http://www.tuxarena.com/?p=508
  100. # For colourful man pages (CLUG-Wiki style)
  101. if $_isxrunning; then
  102. export PAGER=less
  103. export LESS_TERMCAP_mb=$'\E[01;31m' # begin blinking
  104. export LESS_TERMCAP_md=$'\E[01;38;5;74m' # begin bold
  105. export LESS_TERMCAP_me=$'\E[0m' # end mode
  106. export LESS_TERMCAP_se=$'\E[0m' # end standout-mode
  107. export LESS_TERMCAP_so=$'\E[38;5;246m' # begin standout-mode - info box
  108. export LESS_TERMCAP_ue=$'\E[0m' # end underline
  109. export LESS_TERMCAP_us=$'\E[04;38;5;146m' # begin underline
  110. fi
  111. #}}}
  112. #}}}
  113. ## ALIAS {{{
  114. alias freemem='sudo /sbin/sysctl -w vm.drop_caches=3'
  115. alias enter_matrix='echo -e "\e[32m"; while :; do for i in {1..16}; do r="$(($RANDOM % 2))"; if [[ $(($RANDOM % 5)) == 1 ]]; then if [[ $(($RANDOM % 4)) == 1 ]]; then v+="\e[1m $r "; else v+="\e[2m $r "; fi; else v+=" "; fi; done; echo -e "$v"; v=""; done'
  116. # GIT_OR_HUB {{{
  117. if which hub &>/dev/null; then
  118. alias git=hub
  119. fi
  120. #}}}
  121. # AUTOCOLOR {{{
  122. alias ls='ls --color=auto'
  123. alias dir='dir --color=auto'
  124. alias vdir='vdir --color=auto'
  125. alias grep='grep --color=auto'
  126. alias fgrep='fgrep --color=auto'
  127. alias egrep='egrep --color=auto'
  128. #}}}
  129. # MODIFIED COMMANDS {{{
  130. alias ..="cd .."
  131. alias df="df -h"
  132. alias diff="colordiff" # requires colordiff package
  133. alias du="du -c -h"
  134. alias free="free -m" # show sizes in MB
  135. alias grep="grep --color=auto"
  136. alias grep="grep --color=tty -d skip"
  137. alias mkdir="mkdir -p -v"
  138. alias more="less"
  139. alias nano="nano -w"
  140. alias ping="ping -c 5"
  141. alias git-clone="git clone"
  142. alias suprimer="sudo rm -r"
  143. #}}}
  144. # PRIVILEGED ACCESS {{{
  145. alias sudo="sudo "
  146. alias scat="sudo cat"
  147. alias svim="sudo vim"
  148. alias snano="sudo nano"
  149. alias spluma="sudo pluma"
  150. alias scaja="sudo caja"
  151. alias root="sudo su"
  152. alias reboot="sudo reboot"
  153. alias halt="sudo halt"
  154. #}}}
  155. # XBPS ALIASES {{{
  156. alias xbps-install="sudo xbps-install"
  157. alias xupgrade="xbps-install -Syu" # Synchronize with repositories and then upgrade packages that are out of date on the local system.
  158. alias xupdate="xbps-install -Sy" # Refresh of all package lists after updating /etc/pacman.d/mirrorlist
  159. alias xinstall="xbps-install -y" # Install specific package(s) from the repositories and assume yes to all questions
  160. alias xinstaller="xbps-install -R" # Install specific local package(s)
  161. alias xremove="xbps-remove -R" # Remove the specified package(s), retaining its configuration(s) and required dependencies
  162. alias xautoremove="xbps-remove -RyvF" # Remove the specified package(s), its configuration(s) and unneeded dependencies
  163. alias xinfo="xbps-query --show" # Display information about a given package in the repositories
  164. alias xsearch="xbps-query -Rs" # Search for package(s) in the repositories
  165. #}}}
  166. # XBPS SRC {{{
  167. alias void-packages="cd $HOME/void-packages"
  168. alias xbps-src="bash ./xbps-src -f pkg"
  169. #}}}
  170. # MULTIMEDIA {{{
  171. if which get_flash_videos &>/dev/null; then
  172. alias gfv='get_flash_videos -r 720p --subtitles'
  173. fi
  174. #}}}
  175. # LS {{{
  176. alias ls='ls -hF --color=auto'
  177. alias lr='ls -R' # recursive ls
  178. alias ll='ls -alh'
  179. alias la='ll -A'
  180. alias lm='la | less'
  181. #}}}
  182. #}}}
  183. ## FUNCTIONS {{{
  184. # BETTER GIT COMMANDS {{{
  185. bit() {
  186. # By helmuthdu
  187. usage(){
  188. echo "Usage: $0 [options]"
  189. echo " --init # Autoconfigure git options"
  190. echo " a, [add] <files> [--all] # Add git files"
  191. echo " c, [commit] <text> [--undo] # Add git files"
  192. echo " C, [cherry-pick] <number> <url> [branch] # Cherry-pick commit"
  193. echo " b, [branch] feature|hotfix|<name> # Add/Change Branch"
  194. echo " d, [delete] <branch> # Delete Branch"
  195. echo " l, [log] # Display Log"
  196. echo " m, [merge] feature|hotfix|<name> <commit>|<version> # Merge branches"
  197. echo " p, [push] <branch> # Push files"
  198. echo " P, [pull] <branch> [--foce] # Pull files"
  199. echo " r, [release] # Merge unstable branch on master"
  200. return 1
  201. }
  202. case $1 in
  203. --init)
  204. local NAME=`git config --global user.name`
  205. local EMAIL=`git config --global user.email`
  206. local USER=`git config --global github.user`
  207. local EDITOR=`git config --global core.editor`
  208.  
  209. [[ -z $NAME ]] && read -p "Nome: " NAME
  210. [[ -z $EMAIL ]] && read -p "Email: " EMAIL
  211. [[ -z $USER ]] && read -p "Username: " USER
  212. [[ -z $EDITOR ]] && read -p "Editor: " EDITOR
  213.  
  214. git config --global user.name $NAME
  215. git config --global user.email $EMAIL
  216. git config --global github.user $USER
  217. git config --global color.ui true
  218. git config --global color.status auto
  219. git config --global color.branch auto
  220. git config --global color.diff auto
  221. git config --global diff.color true
  222. git config --global core.filemode true
  223. git config --global push.default matching
  224. git config --global core.editor $EDITOR
  225. git config --global format.signoff true
  226. git config --global alias.reset 'reset --soft HEAD^'
  227. git config --global alias.graph 'log --graph --oneline --decorate'
  228. if which meld &>/dev/null; then
  229. git config --global diff.guitool meld
  230. git config --global merge.tool meld
  231. elif which kdiff3 &>/dev/null; then
  232. git config --global diff.guitool kdiff3
  233. git config --global merge.tool kdiff3
  234. fi
  235. git config --global --list
  236. ;;
  237. a | add)
  238. if [[ $2 == --all ]]; then
  239. git add -A
  240. else
  241. git add $2
  242. fi
  243. ;;
  244. b | branch )
  245. check_branch=`git branch | grep $2`
  246. case $2 in
  247. feature)
  248. check_unstable_branch=`git branch | grep unstable`
  249. if [[ -z $check_unstable_branch ]]; then
  250. echo "creating unstable branch..."
  251. git branch unstable
  252. git push origin unstable
  253. fi
  254. git checkout -b feature --track origin/unstable
  255. ;;
  256. hotfix)
  257. git checkout -b hotfix master
  258. ;;
  259. master)
  260. git checkout master
  261. ;;
  262. *)
  263. check_branch=`git branch | grep $2`
  264. if [[ -z $check_unstable_branch ]]; then
  265. echo "creating $2 branch..."
  266. git branch $2
  267. git push origin $2
  268. fi
  269. git checkout $2
  270. ;;
  271. esac
  272. ;;
  273. c | commit )
  274. if [[ $2 == --undo ]]; then
  275. git reset --soft HEAD^
  276. else
  277. git commit -am "$2"
  278. fi
  279. ;;
  280. C | cherry-pick )
  281. git checkout -b patch master
  282. git pull $2 $3
  283. git checkout master
  284. git cherry-pick $1
  285. git log
  286. git branch -D patch
  287. ;;
  288. d | delete)
  289. check_branch=`git branch | grep $2`
  290. if [[ -z $check_branch ]]; then
  291. echo "No branch founded."
  292. else
  293. git branch -D $2
  294. git push origin --delete $2
  295. fi
  296. ;;
  297. l | log )
  298. git log --graph --oneline --decorate
  299. ;;
  300. m | merge )
  301. check_branch=`git branch | grep $2`
  302. case $2 in
  303. --fix)
  304. git mergetool
  305. ;;
  306. feature)
  307. if [[ -n $check_branch ]]; then
  308. git checkout unstable
  309. git difftool -g -d unstable..feature
  310. git merge --no-ff feature
  311. git branch -d feature
  312. git commit -am "${3}"
  313. else
  314. echo "No unstable branch founded."
  315. fi
  316. ;;
  317. hotfix)
  318. if [[ -n $check_branch ]]; then
  319. # get upstream branch
  320. git checkout -b unstable origin
  321. git merge --no-ff hotfix
  322. git commit -am "hotfix: v${3}"
  323. # get master branch
  324. git checkout -b master origin
  325. git merge hotfix
  326. git commit -am "Hotfix: v${3}"
  327. git branch -d hotfix
  328. git tag -a $3 -m "Release: v${3}"
  329. git push --tags
  330. else
  331. echo "No hotfix branch founded."
  332. fi
  333. ;;
  334. *)
  335. if [[ -n $check_branch ]]; then
  336. git checkout -b master origin
  337. git difftool -g -d master..$2
  338. git merge --no-ff $2
  339. git branch -d $2
  340. git commit -am "${3}"
  341. else
  342. echo "No unstable branch founded."
  343. fi
  344. ;;
  345. esac
  346. ;;
  347. p | push )
  348. git push origin $2
  349. ;;
  350. P | pull )
  351. if [[ $2 == --force ]]; then
  352. git fetch --all
  353. git reset --hard origin/master
  354. else
  355. git pull origin $2
  356. fi
  357. ;;
  358. r | release )
  359. git checkout origin/master
  360. git merge --no-ff origin/unstable
  361. git branch -d unstable
  362. git tag -a $2 -m "Release: v${2}"
  363. git push --tags
  364. ;;
  365. *)
  366. usage
  367. esac
  368. }
  369. #}}}
  370. # TOP 10 COMMANDS {{{
  371. # copyright 2007 - 2010 Christopher Bratusek
  372. top10() { history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' | sort -rn | head; }
  373. #}}}
  374. # UP {{{
  375. # Goes up many dirs as the number passed as argument, if none goes up by 1 by default
  376. up() {
  377. local d=""
  378. limit=$1
  379. for ((i=1 ; i <= limit ; i++)); do
  380. d=$d/..
  381. done
  382. d=$(echo $d | sed 's/^\///')
  383. if [[ -z "$d" ]]; then
  384. d=..
  385. fi
  386. cd $d
  387. }
  388. #}}}
  389. # ARCHIVE EXTRACTOR {{{
  390. extract() {
  391. clrstart="\033[1;34m" #color codes
  392. clrend="\033[0m"
  393.  
  394. if [[ "$#" -lt 1 ]]; then
  395. echo -e "${clrstart}Pass a filename. Optionally a destination folder. You can also append a v for verbose output.${clrend}"
  396. exit 1 #not enough args
  397. fi
  398.  
  399. if [[ ! -e "$1" ]]; then
  400. echo -e "${clrstart}File does not exist!${clrend}"
  401. exit 2 #file not found
  402. fi
  403.  
  404. if [[ -z "$2" ]]; then
  405. DESTDIR="." #set destdir to current dir
  406. elif [[ ! -d "$2" ]]; then
  407. echo -e -n "${clrstart}Destination folder doesn't exist or isnt a directory. Create? (y/n): ${clrend}"
  408. read response
  409. #echo -e "\n"
  410. if [[ $response == y || $response == Y ]]; then
  411. mkdir -p "$2"
  412. if [ $? -eq 0 ]; then
  413. DESTDIR="$2"
  414. else
  415. exit 6 #Write perms error
  416. fi
  417. else
  418. echo -e "${clrstart}Closing.${clrend}"; exit 3 # n/wrong response
  419. fi
  420. else
  421. DESTDIR="$2"
  422. fi
  423.  
  424. if [[ ! -z "$3" ]]; then
  425. if [[ "$3" != "v" ]]; then
  426. echo -e "${clrstart}Wrong argument $3 !${clrend}"
  427. exit 4 #wrong arg 3
  428. fi
  429. fi
  430.  
  431. filename=`basename "$1"`
  432.  
  433. #echo "${filename##*.}" debug
  434.  
  435. case "${filename##*.}" in
  436. tar)
  437. echo -e "${clrstart}Extracting $1 to $DESTDIR: (uncompressed tar)${clrend}"
  438. tar x${3}f "$1" -C "$DESTDIR"
  439. ;;
  440. gz)
  441. echo -e "${clrstart}Extracting $1 to $DESTDIR: (gip compressed tar)${clrend}"
  442. tar x${3}fz "$1" -C "$DESTDIR"
  443. ;;
  444. tgz)
  445. echo -e "${clrstart}Extracting $1 to $DESTDIR: (gip compressed tar)${clrend}"
  446. tar x${3}fz "$1" -C "$DESTDIR"
  447. ;;
  448. xz)
  449. echo -e "${clrstart}Extracting $1 to $DESTDIR: (gip compressed tar)${clrend}"
  450. tar x${3}f -J "$1" -C "$DESTDIR"
  451. ;;
  452. bz2)
  453. echo -e "${clrstart}Extracting $1 to $DESTDIR: (bzip compressed tar)${clrend}"
  454. tar x${3}fj "$1" -C "$DESTDIR"
  455. ;;
  456. zip)
  457. echo -e "${clrstart}Extracting $1 to $DESTDIR: (zipp compressed file)${clrend}"
  458. unzip "$1" -d "$DESTDIR"
  459. ;;
  460. rar)
  461. echo -e "${clrstart}Extracting $1 to $DESTDIR: (rar compressed file)${clrend}"
  462. unrar x "$1" "$DESTDIR"
  463. ;;
  464. 7z)
  465. echo -e "${clrstart}Extracting $1 to $DESTDIR: (7zip compressed file)${clrend}"
  466. 7za e "$1" -o"$DESTDIR"
  467. ;;
  468. *)
  469. echo -e "${clrstart}Unknown archieve format!"
  470. exit 5
  471. ;;
  472. esac
  473. }
  474. #}}}
  475. # ARCHIVE COMPRESS {{{
  476. compress() {
  477. if [[ -n "$1" ]]; then
  478. FILE=$1
  479. case $FILE in
  480. *.tar ) shift && tar cf $FILE $* ;;
  481. *.tar.bz2 ) shift && tar cjf $FILE $* ;;
  482. *.tar.gz ) shift && tar czf $FILE $* ;;
  483. *.tgz ) shift && tar czf $FILE $* ;;
  484. *.zip ) shift && zip $FILE $* ;;
  485. *.rar ) shift && rar $FILE $* ;;
  486. esac
  487. else
  488. echo "usage: compress <foo.tar.gz> ./foo ./bar"
  489. fi
  490. }
  491. #}}}
  492. # CONVERT TO ISO {{{
  493. to_iso () {
  494. if [[ $# == 0 || $1 == "--help" || $1 == "-h" ]]; then
  495. echo -e "Converts raw, bin, cue, ccd, img, mdf, nrg cd/dvd image files to ISO image file.\nUsage: to_iso file1 file2..."
  496. fi
  497. for i in $*; do
  498. if [[ ! -f "$i" ]]; then
  499. echo "'$i' is not a valid file; jumping it"
  500. else
  501. echo -n "converting $i..."
  502. OUT=`echo $i | cut -d '.' -f 1`
  503. case $i in
  504. *.raw ) bchunk -v $i $OUT.iso;; #raw=bin #*.cue #*.bin
  505. *.bin|*.cue ) bin2iso $i $OUT.iso;;
  506. *.ccd|*.img ) ccd2iso $i $OUT.iso;; #Clone CD images
  507. *.mdf ) mdf2iso $i $OUT.iso;; #Alcohol images
  508. *.nrg ) nrg2iso $i $OUT.iso;; #nero images
  509. * ) echo "to_iso don't know de extension of '$i'";;
  510. esac
  511. if [[ $? != 0 ]]; then
  512. echo -e "${R}ERROR!${W}"
  513. else
  514. echo -e "${G}done!${W}"
  515. fi
  516. fi
  517. done
  518. }
  519. #}}}
  520. # REMIND ME, ITS IMPORTANT! {{{
  521. # usage: remindme <time> <text>
  522. # e.g.: remindme 10m "omg, the pizza"
  523. remindme() { sleep $1 && zenity --info --text "$2" & }
  524. #}}}
  525. # SIMPLE CALCULATOR #{{{
  526. # usage: calc <equation>
  527. calc() {
  528. if which bc &>/dev/null; then
  529. echo "scale=3; $*" | bc -l
  530. else
  531. awk "BEGIN { print $* }"
  532. fi
  533. }
  534. #}}}
  535. # FILE & STRINGS RELATED FUNCTIONS {{{
  536. ## FIND A FILE WITH A PATTERN IN NAME {{{
  537. ff() { find . -type f -iname '*'$*'*' -ls ; }
  538. #}}}
  539. ## FIND A FILE WITH PATTERN $1 IN NAME AND EXECUTE $2 ON IT {{{
  540. fe() { find . -type f -iname '*'$1'*' -exec "${2:-file}" {} \; ; }
  541. #}}}
  542. ## MOVE FILENAMES TO LOWERCASE {{{
  543. lowercase() {
  544. for file ; do
  545. filename=${file##*/}
  546. case "$filename" in
  547. */* ) dirname==${file%/*} ;;
  548. * ) dirname=.;;
  549. esac
  550. nf=$(echo $filename | tr A-Z a-z)
  551. newname="${dirname}/${nf}"
  552. if [[ "$nf" != "$filename" ]]; then
  553. mv "$file" "$newname"
  554. echo "lowercase: $file --> $newname"
  555. else
  556. echo "lowercase: $file not changed."
  557. fi
  558. done
  559. }
  560. #}}}
  561. ## SWAP 2 FILENAMES AROUND, IF THEY EXIST {{{
  562. #(from Uzi's bashrc).
  563. swap() {
  564. local TMPFILE=tmp.$$
  565.  
  566. [[ $# -ne 2 ]] && echo "swap: 2 arguments needed" && return 1
  567. [[ ! -e $1 ]] && echo "swap: $1 does not exist" && return 1
  568. [[ ! -e $2 ]] && echo "swap: $2 does not exist" && return 1
  569.  
  570. mv "$1" $TMPFILE
  571. mv "$2" "$1"
  572. mv $TMPFILE "$2"
  573. }
  574. #}}}
  575. ## FINDS DIRECTORY SIZES AND LISTS THEM FOR THE CURRENT DIRECTORY {{{
  576. dirsize () {
  577. du -shx * .[a-zA-Z0-9_]* 2> /dev/null | egrep '^ *[0-9.]*[MG]' | sort -n > /tmp/list
  578. egrep '^ *[0-9.]*M' /tmp/list
  579. egrep '^ *[0-9.]*G' /tmp/list
  580. rm -rf /tmp/list
  581. }
  582. #}}}
  583. ## FIND AND REMOVED EMPTY DIRECTORIES {{{
  584. fared() {
  585. read -p "Delete all empty folders recursively [y/N]: " OPT
  586. [[ $OPT == y ]] && find . -type d -empty -exec rm -fr {} \; &> /dev/null
  587. }
  588. #}}}
  589. ## FIND AND REMOVED ALL DOTFILES {{{
  590. farad () {
  591. read -p "Delete all dotfiles recursively [y/N]: " OPT
  592. [[ $OPT == y ]] && find . -name '.*' -type f -exec rm -rf {} \;
  593. }
  594. #}}}
  595.  
  596. #}}}
  597. # ENTER AND LIST DIRECTORY{{{
  598. function cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
  599. #}}}
  600. #}}}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement