From d16c4322d622515b044390eb19f3401768dc17c3 Mon Sep 17 00:00:00 2001 From: Kroc Camen Date: Sun, 19 May 2013 00:28:38 +0100 Subject: [PATCH] * Stick / Unstick buttons at the bottom of the page for the admin (first name in 'mods.txt') (some finishing off and polishing remains) * Updated the image generation script for the above change as well as a little re-organisation --- HISTORY.txt | 3 + index.php | 17 +- lib/functions.php | 11 + metro-tile.default.png | Bin 103019 -> 103019 bytes start.php | 3 + themes/greyscale/img/generate_imgs.bat | 287 ++++++++++++------------- themes/greyscale/img/sticky.png | Bin 752 -> 336 bytes themes/greyscale/index.html | 2 +- themes/greyscale/lang.example.php | 6 +- themes/greyscale/metro-tile.png | Bin 103019 -> 103019 bytes themes/greyscale/theme.css | 15 +- themes/greyscale/thread.html | 11 +- thread.php | 37 +++- 13 files changed, 215 insertions(+), 177 deletions(-) diff --git a/HISTORY.txt b/HISTORY.txt index 8b0bad5..d1608da 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,4 +1,7 @@ v26 +* Stick and Unstick thread buttons when logged in as the Admin (the admin is now the first person listed in mods.txt) + NOTE: the lock and unlock links have been changed into buttons, make sure to update custom translations / CSS! +* Windows 8 snap-view * Apache version is now verified (1&1 are still using v1.3!) * Updated to DOMTemplate v17, fix for major bug corrupting querystrings and attributes, with thanks to Bruno Héridet for narrowing down and Zegnat for suggesting a fix diff --git a/index.php b/index.php index 4264334..c5a4a3f 100644 --- a/index.php +++ b/index.php @@ -76,18 +76,13 @@ //order by last modified date array_multisort (array_map ('filemtime', $threads), SORT_DESC, $threads); - //get sticky list, trimming any files that no longer exist + //get sticky list (see 'lib/functions.php') //(the use of `array_intersect` will only return filenames in `sticky.txt` that were also in the directory) - if ($stickies = array_intersect ( - //`file` returns NULL on failure, so we can cast it to an array to get an array with one blank item, - //then `array_filter` removes blank items. this way saves having to check if the file exists first - array_filter ((array) @file ('sticky.txt', FILE_IGNORE_NEW_LINES)), $threads - )) { - //order the stickies by reverse date order - array_multisort (array_map ('filemtime', $stickies), SORT_DESC, $stickies); - //remove the stickies from the thread list - $threads = array_diff ($threads, $stickies); - } + $stickies = array_intersect (getStickies (), $threads); + //order the stickies by reverse date order + array_multisort (array_map ('filemtime', $stickies), SORT_DESC, $stickies); + //remove the stickies from the thread list + $threads = array_diff ($threads, $stickies); //handle a rounding problem with working out the number of pages (PHP 5.3 has a fix for this) $PAGES = count ($threads) % FORUM_THREADS == 1 ? floor (count ($threads) / FORUM_THREADS) diff --git a/lib/functions.php b/lib/functions.php index d0ae8bc..f13605c 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -143,6 +143,10 @@ function prepareTemplate ( /* ====================================================================================================================== */ +//the first mod on the list is the site administrator and has extra privileges such as stickying threads +function isAdmin ($name) { + global $MODS; return strtolower ($name) === strtolower ((string) @$MODS['GLOBAL'][0]); +} //check to see if a name is a known moderator function isMod ($name) { global $MODS; return in_array (strtolower ($name), array_map ('strtolower', $MODS['GLOBAL'] + $MODS['LOCAL'])); @@ -152,6 +156,13 @@ function isMember ($name) { global $MEMBERS; return in_array (strtolower ($name), array_map ('strtolower', $MEMBERS)); } +//get the list of sticky threads in the current forum / sub-forum +function getStickies () { + //`file` returns NULL on failure, so we can cast it to an array to get an array with one blank item, + //then `array_filter` removes blank items. this way saves having to check if the file exists first + return array_filter ((array) @file ('sticky.txt', FILE_IGNORE_NEW_LINES)); +} + /* ====================================================================================================================== */ //take the author's message, process markup, and encode it safely for the RSS feed diff --git a/metro-tile.default.png b/metro-tile.default.png index 13b5c3e1afa283d833c77bf4b94aa9d61df7a347..33ee18cfe0d232bc0e51bcea3a31481315300c87 100644 GIT binary patch delta 64 zcmaF8gzfbbwuUW?+PxyCA%+%K2BubqrrHLERt5&`^*55I+xIfcB4o@VGKqT&zilt* IW&F(o0H>@J>i_@% delta 64 zcmaF8gzfbbwuUW?+PxwsA%>P#CWb(yZD43+VDM2U^T%}iUPf7jj1fd; H{$>FHv91-4 diff --git a/start.php b/start.php index c1bfe79..c3952e9 100644 --- a/start.php +++ b/start.php @@ -41,6 +41,7 @@ see section 5 in the README file $MODS array of the names of moderators for the whole forum, and the current sub-forum $MEMBERS array of the names of members for the current sub-forum + IS_ADMIN b if the current viewer is the site admin (first name in 'mods.txt') IS_MOD b if the current viewer is a moderator for the current forum IS_MEMBER b if the current viewer is a member of the current forum @@ -232,6 +233,8 @@ //get the list (if any) of users allowed to access this current forum $MEMBERS = array_filter ((array) @file ('members.txt', FILE_IGNORE_NEW_LINES)); +//is the current user the site admin? (first name in the root 'mods.txt') +define ('IS_ADMIN', AUTH && isAdmin (NAME)); //is the current user a moderator in this forum? define ('IS_MOD', AUTH && isMod (NAME)); //is the current user a member of this forum? diff --git a/themes/greyscale/img/generate_imgs.bat b/themes/greyscale/img/generate_imgs.bat index 701e080..73e13cf 100644 --- a/themes/greyscale/img/generate_imgs.bat +++ b/themes/greyscale/img/generate_imgs.bat @@ -16,8 +16,14 @@ TITLE Generating images... REM Change to the current directory CD /d %~dp0 -:: white 1x +IF NOT EXIST bin\pngout.exe ECHO Please download PNGOut to "bin\pngout.exe" & PAUSE & EXIT +IF NOT EXIST bin\optipng.exe ECHO Please download OptiPNG to "bin\optipng.exe" & PAUSE & EXIT +IF NOT EXIST bin\pngcrush.exe ECHO Please download PNGCrush to "bin\pngcrush.exe" & PAUSE & EXIT + +:: generate spritesheets to work from :: ========================================================================================================================= +:: white 1x +:: ------------------------------------------------------------------------------------------------------------------------- :: convert the vector EPS to PNG, masking the alpha. :: the antialias applied by default is no good, so we do it manually by resizing a very hires image down IF NOT EXIST icons_white_1x.png ( @@ -26,6 +32,40 @@ IF NOT EXIST icons_white_1x.png ( -background "#f4f3f5" -resize 998x702 -alpha Shape -channel a -negate ^ icons_white_1x.png ) +:: white 2x +:: ------------------------------------------------------------------------------------------------------------------------- +:: produce a version double the size for hi-DPI screens +IF NOT EXIST icons_white_2x.png ( + ECHO icons white 2x... + convert +antialias -density 648 refs\brightmixIconset_v02.eps -colorspace RGB ^ + -background "#f4f3f5" -resize 1996x1404 -alpha Shape -channel a -negate ^ + icons_white_2x.png +) +:: black half size +:: ------------------------------------------------------------------------------------------------------------------------- +:: the append icon is only available in large size (default:32x32), create a ½-size image so that we can get a 16x16 icon +IF NOT EXIST icons_black_half.png ( + ECHO icons_black_half.png + convert +antialias -density 144 refs\brightmixIconset_v02.eps -colorspace RGB ^ + -background "#f4f3f5" -resize 499x351 -alpha Shape -channel a -negate ^ + icons_black_half.png + convert icons_black_half.png -negate icons_black_half.png +) +:: black 1x +:: ------------------------------------------------------------------------------------------------------------------------- +:: invert to produce the black set +IF NOT EXIST icons_black_1x.png ( + ECHO icons black 1x... + convert icons_white_1x.png -negate icons_black_1x.png +) +:: black 2x +:: ------------------------------------------------------------------------------------------------------------------------- +:: invert to produce the black 2x set +IF NOT EXIST icons_black_2x.png ( + ECHO icons black 2x... + convert icons_white_2x.png -negate icons_black_2x.png +) +ECHO. :: crop and save the individual icons needed :: ------------------------------------------------------------------------------------------------------------------------- @@ -35,235 +75,183 @@ IF NOT EXIST icons_white_1x.png ( :: `-define png:depth=8` and output as 8-bit too :: `-define png:compression...` don’t compress, we’re going to optimise all the PNGs compression afterwards -ECHO * deletetitle.png -convert icons_white_1x.png -crop "32x32+625+270" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - deletetitle.png - -ECHO * folders.png -convert icons_white_1x.png -crop "32x32+478+54" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - folders.png - -ECHO * help.png -convert icons_white_1x.png -crop "32x32+273+432" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - help.png - -ECHO * new.png -convert icons_white_1x.png -crop "32x32+273+54" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - new.png - -ECHO * replies.png -convert icons_white_1x.png -crop "32x32+273+487" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - replies.png - -ECHO * threads.png -convert icons_white_1x.png -crop "32x32+273+0" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - threads.png - -:: black 1x -:: ========================================================================================================================= -:: invert to produce the black set -IF NOT EXIST icons_black_1x.png ( - ECHO. & ECHO icons black 1x... - convert icons_white_1x.png -negate icons_black_1x.png -) - ECHO * add.png convert icons_black_1x.png -crop "16x16+875+152" ^ -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ add.png - -REM ECHO * delete.png -REM convert icons_black_1x.png -crop "16x16+875+177" ^ -REM -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -REM -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ -REM delete.png - -ECHO * here.png -convert icons_black_1x.png -crop "16x20+979+58" ^ - -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - here.png - -ECHO * rss.png -convert icons_black_1x.png -crop "16x16+182+62" ^ +ECHO * add_2x.png +convert icons_black_2x.png -crop "32x32+1750+304" ^ -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - rss.png - -ECHO * search.png -convert icons_black_1x.png -crop "13x17+536+224" ^ - -background "#ffffff" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - search.png - -:: the append icon is only available in large size (default:32x32), create a ½-size image so that we can get a 16x16 icon -IF NOT EXIST icons_black_half.png ( - ECHO (icons black half-size...) - convert +antialias -density 144 refs\brightmixIconset_v02.eps -colorspace RGB ^ - -background "#f4f3f5" -resize 499x351 -alpha Shape -channel a -negate ^ - icons_black_half.png - convert icons_black_half.png -negate icons_black_half.png -) + add_2x.png ECHO * append.png convert icons_black_half.png -crop "16x16+137+27" ^ -background "#888888" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ append.png +ECHO * append_2x.png +convert icons_black_1x.png -crop "32x32+273+54" ^ + -background "#888888" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + append_2x.png ECHO * delete.png convert icons_black_half.png -crop "16x16+312+135" ^ -background "#888888" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ delete.png +ECHO * delete_2x.png +convert icons_black_1x.png -crop "32x32+625+270" ^ + -background "#888888" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + delete_2x.png -:: white 2x -:: ========================================================================================================================= -:: produce a version double the size for hi-DPI screens -IF NOT EXIST icons_white_2x.png ( - ECHO. & ECHO icons white 2x... - convert +antialias -density 648 refs\brightmixIconset_v02.eps -colorspace RGB ^ - -background "#f4f3f5" -resize 1996x1404 -alpha Shape -channel a -negate ^ - icons_white_2x.png -) - +ECHO * deletetitle.png +convert icons_white_1x.png -crop "32x32+625+270" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + deletetitle.png ECHO * deletetitle_2x.png convert icons_white_2x.png -crop "64x64+1250+540" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ deletetitle_2x.png +ECHO * folders.png +convert icons_white_1x.png -crop "32x32+478+54" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + folders.png ECHO * folders_2x.png convert icons_white_2x.png -crop "64x64+956+108" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ folders_2x.png +ECHO * go.png (2x) +convert icons_black_2x.png -crop "40x40+1352+228" ^ + -background "#ffffff" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + go.png + +ECHO * help.png +convert icons_white_1x.png -crop "32x32+273+432" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + help.png ECHO * help_2x.png convert icons_white_2x.png -crop "64x64+546+864" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ help_2x.png +ECHO * here.png +convert icons_black_1x.png -crop "16x20+979+58" ^ + -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + here.png +ECHO * here_2x.png +convert icons_black_2x.png -crop "32x40+1958+116" ^ + -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + here_2x.png + +ECHO * lang.png (2x) +convert icons_black_2x.png -crop "40x40+1956+234" ^ + -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + lang.png + ECHO * logo.png (2x) convert icons_white_2x.png -crop "64x64+956+0" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ logo.png +ECHO * new.png +convert icons_white_1x.png -crop "32x32+273+54" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + new.png ECHO * new_2x.png convert icons_white_2x.png -crop "64x64+546+108" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ new_2x.png +ECHO * replies.png +convert icons_white_1x.png -crop "32x32+273+487" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + replies.png ECHO * replies_2x.png convert icons_white_2x.png -crop "64x64+546+974" ^ -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ replies_2x.png -ECHO * submit.png (2x) -convert icons_white_2x.png -crop "80x80+1332+208" ^ - -background "#444444" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - submit.png - -ECHO * threads_2x.png -convert icons_white_2x.png -crop "64x64+546+0" ^ - -background "#222222" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - threads_2x.png - -:: black 2x -:: ========================================================================================================================= -:: invert to produce the black 2x set -IF NOT EXIST icons_black_2x.png ( - ECHO. & ECHO icons black 2x... - convert icons_white_2x.png -negate icons_black_2x.png -) - -ECHO * add_2x.png -convert icons_black_2x.png -crop "32x32+1750+304" ^ - -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - add_2x.png - -REM ECHO * delete_2x.png -REM convert icons_black_2x.png -crop "32x32+1750+354" ^ -REM -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -REM -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ -REM delete_2x.png - -ECHO * go.png (2x) -convert icons_black_2x.png -crop "40x40+1352+228" ^ - -background "#ffffff" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - go.png - -ECHO * here_2x.png -convert icons_black_2x.png -crop "32x40+1958+116" ^ - -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ - -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - here_2x.png - -ECHO * lang.png (2x) -convert icons_black_2x.png -crop "40x40+1956+234" ^ +ECHO * rss.png +convert icons_black_1x.png -crop "16x16+182+62" ^ -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - lang.png - + rss.png ECHO * rss_2x.png convert icons_black_2x.png -crop "32x32+364+124" ^ -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ rss_2x.png +ECHO * search.png +convert icons_black_1x.png -crop "13x17+536+224" ^ + -background "#ffffff" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + search.png ECHO * search_2x.png convert icons_black_2x.png -crop "26x34+1072+448" ^ -background "#ffffff" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ search_2x.png -ECHO * sticky.png (2x) -convert icons_black_2x.png -crop "32x32+362+446" ^ +ECHO * sticky.png +convert icons_black_1x.png -crop "16x16+182+223" ^ -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ sticky.png +ECHO * sticky_2x.png +convert icons_black_2x.png -crop "32x32+362+446" ^ + -background "#eeeeee" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + sticky_2x.png -::the 2x append / delete icon (32x32) actually comes from the 1x sheet -ECHO * append_2x.png -convert icons_black_1x.png -crop "32x32+273+54" ^ - -background "#888888" -type Grayscale -depth 8 -alpha On ^ +ECHO * submit.png (2x) +convert icons_white_2x.png -crop "80x80+1332+208" ^ + -background "#444444" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - append_2x.png + submit.png -ECHO * delete_2x.png -convert icons_black_1x.png -crop "32x32+625+270" ^ - -background "#888888" -type Grayscale -depth 8 -alpha On ^ +ECHO * threads.png +convert icons_white_1x.png -crop "32x32+273+0" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ - delete_2x.png + threads.png +ECHO * threads_2x.png +convert icons_white_2x.png -crop "64x64+546+0" ^ + -background "#222222" -type Grayscale -depth 8 -alpha On ^ + -define png:bit-depth=8 -define png:color-type=4 -define png:compression-level=0 ^ + threads_2x.png +ECHO. :: apple-touch-icon -ECHO. & ECHO apple-touch-icon.png +:: ========================================================================================================================= +ECHO apple-touch-icon.png convert +antialias -density 648 refs\brightmixIconset_v02.eps -colorspace RGB ^ -background "#f4f3f5" -resize 2495x1755 -alpha Shape -channel a -negate +channel ^ -crop "76x76+1196+2" -background "#222222" -gravity Center -extent 144x144 ^ -type Grayscale -define png:bit-depth=8 -define png:color-type=0 -define png:compression-level=0 ^ apple-touch-icon.png +ECHO. :: compress PNGs :: ========================================================================================================================= @@ -276,6 +264,7 @@ FOR %%F in (*.png) DO ( bin\optipng.exe -o7 -clobber -quiet "%%F" bin\pngcrush.exe -brute -fix -keep bKGD -l 9 -reduce -q "%%F" IF %ERRORLEVEL% EQU 0 ERASE "%%F" & REN "pngout.png" "%%F" + PAUSE ) DEL ..\..\..\apple-touch-icon.default.png @@ -283,11 +272,13 @@ COPY /Y apple-touch-icon.png ..\..\..\apple-touch-icon.default.png DEL ..\apple-touch-icon.png MOVE /Y apple-touch-icon.png .. +ECHO. -:: windows 8 tile icon +:: windows 8 Metro icon +:: ========================================================================================================================= :: due to a bug in Windows 8 this icon cannot be 8-bit, it must be 24-bit, so we have to render it after the others have :: been optimised as the optimisations usually reduce bit-depth -ECHO. & ECHO metro-tile.png +ECHO metro-tile.png convert +antialias -density 720 refs/brightmixIconset_v02.eps -colorspace RGB ^ -background "#ffffff" -resize 3992x2808 -alpha Shape -channel a -negate +channel ^ -crop "128x128+1912+4" -bordercolor none -border 8 ^ diff --git a/themes/greyscale/img/sticky.png b/themes/greyscale/img/sticky.png index 999fe64523b523222e1322a669d203d98c388758..30a46c358aa8461ae32a8e8ae0afc0724b0f0256 100644 GIT binary patch literal 336 zcmV-W0k8gvP)`edw0SQS&K~yMHUC*&A!~qz_@%ML!;ra{)7MqONjMUi-29oV8N||lSz&~J8q(qUj zDT7QVyOI$_ol+KDcev|kxI2EXcl>^zr{@jPaXDegx_LPvI$@76>C>GrCqk0NiJVYS zwkM4EG?r~hgkg&|JtOpcGoBT4!kLDuIU(%2%WlXEC3RKDLdmR#DIxz?-{(Qqi(VzE zn*C<%FTbTBwXC45;>kcW*v6A8YOaI>UmBK#uI7eB=yvVKt3gHIYA#x%Lo~frWz#Aa z+^TvrniWELv?gr(aH(#iUEdaZy(kdg00002VoOIv0PgKS z>`edw0;x$vK~zY`mDNv()m0P+@bB-vrxW-=vyB*(U`b#tLP!vz2ug@nE^SjpB|#X5 z?LvemS_KgpEuuvP7D2fw5JVvu>5oK+5t@I>|D$8r$k=nHnbTsPG8FUPc;PPYh41%# z@AuquPO{*orIl#3G&fJV9e857t$udQcV4wL(cB(B^pg)u^*K)?ixh!wQ|)-Gs-i)_=^(T zm9lMC&HVD8Q~q(>xUxIZ(dZ=B`b+sc1}6(ymHpc#A16~_NY&k8#c_UoX7jb zhf3E;Q_9Op;uWQgxTfstC%>I|TA6mngz`<2SnY~(+C}ArJLmm{J(mwDypH$ z%5@h^D$fqGZ>RFNQ>K(1Nn(>S?YL{om;KH>>y&~;sW@kWRk)M=N ztNPe?i{Ro-f<&WZ=vMpO)+hUOp75LUL1IWt%TQv28_NC#G;r<2Ze_ybNpF1J>9=5{;rM%SFzW-2cQD)4TGNY8TWx(tINAZNOj44y5?eV|@qt6-P iO=5+o+-J4+VEDgKau>PV4(Bug0000Threads
  1. - 99 Kroc Announcement:Locked: + 99 Kroc Announcement:Locked: The quick brown fox jumps over the lazy dog