From 48ba40e29b447e99b0ca2ce903cd1992fecf8051 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 16 Jun 2009 03:08:55 +0000 Subject: [PATCH] Initial --- README | 1 + __init__.py | 0 apps/__init__.py | 0 apps/analyzer/__init__.py | 0 apps/analyzer/models.py | 6 + apps/analyzer/views.py | 1 + apps/opml_import/__init__.py | 0 apps/opml_import/models.py | 5 + apps/opml_import/urls.py | 6 + apps/opml_import/views.py | 44 + apps/profile/__init__.py | 0 apps/profile/models.py | 5 + apps/profile/views.py | 1 + apps/reader/__init__.py | 0 apps/reader/admin.py | 6 + apps/reader/models.py | 113 + apps/reader/urls.py | 12 + apps/reader/views.py | 200 + apps/registration/__init__.py | 0 apps/registration/admin.py | 11 + apps/registration/docs/forms.txt | 82 + apps/registration/docs/models.txt | 174 + apps/registration/docs/overview.txt | 337 + apps/registration/docs/views.txt | 120 + apps/registration/forms.py | 142 + apps/registration/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../commands/cleanupregistration.py | 19 + apps/registration/models.py | 250 + apps/registration/tests.py | 318 + apps/registration/urls.py | 72 + apps/registration/views.py | 164 + apps/rss_feeds/__init__.py | 0 apps/rss_feeds/admin.py | 6 + apps/rss_feeds/models.py | 244 + apps/rss_feeds/tests.py | 0 apps/rss_feeds/views.py | 1 + manage.py | 11 + media/css/reader.css | 509 ++ media/img/icons/actions/add-user.gif | Bin 0 -> 907 bytes media/img/icons/actions/add-user.png | Bin 0 -> 318 bytes media/img/icons/actions/add.gif | Bin 0 -> 864 bytes media/img/icons/actions/add.png | Bin 0 -> 228 bytes media/img/icons/actions/arrow-down.gif | Bin 0 -> 888 bytes media/img/icons/actions/arrow-down.png | Bin 0 -> 273 bytes media/img/icons/actions/arrow-left.gif | Bin 0 -> 887 bytes media/img/icons/actions/arrow-left.png | Bin 0 -> 279 bytes media/img/icons/actions/arrow-right.gif | Bin 0 -> 886 bytes media/img/icons/actions/arrow-right.png | Bin 0 -> 255 bytes media/img/icons/actions/arrow-up.gif | Bin 0 -> 891 bytes media/img/icons/actions/arrow-up.png | Bin 0 -> 281 bytes media/img/icons/actions/button-bold.gif | Bin 0 -> 934 bytes media/img/icons/actions/button-bold.png | Bin 0 -> 316 bytes media/img/icons/actions/button-italic.gif | Bin 0 -> 933 bytes media/img/icons/actions/button-italic.png | Bin 0 -> 294 bytes media/img/icons/actions/button-underline.gif | Bin 0 -> 936 bytes media/img/icons/actions/button-underline.png | Bin 0 -> 298 bytes media/img/icons/actions/button.gif | Bin 0 -> 925 bytes media/img/icons/actions/button.png | Bin 0 -> 225 bytes media/img/icons/actions/cancel.gif | Bin 0 -> 934 bytes media/img/icons/actions/cancel.png | Bin 0 -> 322 bytes media/img/icons/actions/clipboard.gif | Bin 0 -> 960 bytes media/img/icons/actions/clipboard.png | Bin 0 -> 386 bytes media/img/icons/actions/copy.gif | Bin 0 -> 915 bytes media/img/icons/actions/copy.png | Bin 0 -> 346 bytes media/img/icons/actions/cut.gif | Bin 0 -> 879 bytes media/img/icons/actions/cut.png | Bin 0 -> 281 bytes media/img/icons/actions/delete-user.gif | Bin 0 -> 896 bytes media/img/icons/actions/delete-user.png | Bin 0 -> 282 bytes media/img/icons/actions/forbidden-alt.gif | Bin 0 -> 943 bytes media/img/icons/actions/forbidden-alt.png | Bin 0 -> 358 bytes media/img/icons/actions/forbidden.gif | Bin 0 -> 944 bytes media/img/icons/actions/forbidden.png | Bin 0 -> 303 bytes media/img/icons/actions/info.gif | Bin 0 -> 944 bytes media/img/icons/actions/info.png | Bin 0 -> 362 bytes media/img/icons/actions/lock.gif | Bin 0 -> 916 bytes media/img/icons/actions/lock.png | Bin 0 -> 304 bytes media/img/icons/actions/mail-new.gif | Bin 0 -> 943 bytes media/img/icons/actions/mail-new.png | Bin 0 -> 367 bytes media/img/icons/actions/ok.gif | Bin 0 -> 896 bytes media/img/icons/actions/ok.png | Bin 0 -> 324 bytes media/img/icons/actions/paste.gif | Bin 0 -> 971 bytes media/img/icons/actions/paste.png | Bin 0 -> 388 bytes media/img/icons/actions/refresh.gif | Bin 0 -> 912 bytes media/img/icons/actions/refresh.png | Bin 0 -> 362 bytes media/img/icons/actions/search.gif | Bin 0 -> 915 bytes media/img/icons/actions/search.png | Bin 0 -> 361 bytes media/img/icons/actions/splitwindow.gif | Bin 0 -> 917 bytes media/img/icons/actions/splitwindow.png | Bin 0 -> 236 bytes media/img/icons/actions/stop.gif | Bin 0 -> 930 bytes media/img/icons/actions/stop.png | Bin 0 -> 342 bytes media/img/icons/actions/subtract.gif | Bin 0 -> 850 bytes media/img/icons/actions/subtract.png | Bin 0 -> 175 bytes media/img/icons/actions/tab-new.gif | Bin 0 -> 905 bytes media/img/icons/actions/tab-new.png | Bin 0 -> 283 bytes media/img/icons/actions/tab.gif | Bin 0 -> 887 bytes media/img/icons/actions/tab.png | Bin 0 -> 233 bytes media/img/icons/actions/tabs-new.gif | Bin 0 -> 922 bytes media/img/icons/actions/tabs-new.png | Bin 0 -> 308 bytes media/img/icons/actions/tabs.gif | Bin 0 -> 906 bytes media/img/icons/actions/tabs.png | Bin 0 -> 266 bytes media/img/icons/actions/unlock.gif | Bin 0 -> 923 bytes media/img/icons/actions/unlock.png | Bin 0 -> 305 bytes media/img/icons/actions/window-new.gif | Bin 0 -> 914 bytes media/img/icons/actions/window-new.png | Bin 0 -> 259 bytes media/img/icons/actions/window-resize.gif | Bin 0 -> 921 bytes media/img/icons/actions/window-resize.png | Bin 0 -> 294 bytes media/img/icons/actions/window.gif | Bin 0 -> 905 bytes media/img/icons/actions/window.png | Bin 0 -> 221 bytes media/img/icons/actions/windows.gif | Bin 0 -> 913 bytes media/img/icons/actions/windows.png | Bin 0 -> 284 bytes media/img/icons/actions/wrench.gif | Bin 0 -> 894 bytes media/img/icons/actions/wrench.png | Bin 0 -> 278 bytes media/img/icons/actions/zoom-in.gif | Bin 0 -> 940 bytes media/img/icons/actions/zoom-in.png | Bin 0 -> 399 bytes media/img/icons/actions/zoom-out.gif | Bin 0 -> 932 bytes media/img/icons/actions/zoom-out.png | Bin 0 -> 373 bytes media/img/icons/flags/flag-austria.gif | Bin 0 -> 906 bytes media/img/icons/flags/flag-austria.png | Bin 0 -> 243 bytes media/img/icons/flags/flag-belgium.gif | Bin 0 -> 944 bytes media/img/icons/flags/flag-belgium.png | Bin 0 -> 249 bytes media/img/icons/flags/flag-bulgaria.gif | Bin 0 -> 924 bytes media/img/icons/flags/flag-bulgaria.png | Bin 0 -> 242 bytes media/img/icons/flags/flag-czech-republic.gif | Bin 0 -> 923 bytes media/img/icons/flags/flag-czech-republic.png | Bin 0 -> 315 bytes media/img/icons/flags/flag-denmark.gif | Bin 0 -> 924 bytes media/img/icons/flags/flag-denmark.png | Bin 0 -> 296 bytes media/img/icons/flags/flag-estonia.gif | Bin 0 -> 913 bytes media/img/icons/flags/flag-estonia.png | Bin 0 -> 264 bytes media/img/icons/flags/flag-france.gif | Bin 0 -> 942 bytes media/img/icons/flags/flag-france.png | Bin 0 -> 253 bytes media/img/icons/flags/flag-germany.gif | Bin 0 -> 908 bytes media/img/icons/flags/flag-germany.png | Bin 0 -> 237 bytes media/img/icons/flags/flag-greece.gif | Bin 0 -> 118 bytes media/img/icons/flags/flag-greece.png | Bin 0 -> 1035 bytes media/img/icons/flags/flag-holland.gif | Bin 0 -> 916 bytes media/img/icons/flags/flag-holland.png | Bin 0 -> 263 bytes media/img/icons/flags/flag-hungary.gif | Bin 0 -> 921 bytes media/img/icons/flags/flag-hungary.png | Bin 0 -> 246 bytes media/img/icons/flags/flag-ireland.gif | Bin 0 -> 940 bytes media/img/icons/flags/flag-ireland.png | Bin 0 -> 252 bytes media/img/icons/flags/flag-italy.gif | Bin 0 -> 941 bytes media/img/icons/flags/flag-italy.png | Bin 0 -> 255 bytes media/img/icons/flags/flag-luxemburg.gif | Bin 0 -> 923 bytes media/img/icons/flags/flag-luxemburg.png | Bin 0 -> 245 bytes media/img/icons/flags/flag-rumania.gif | Bin 0 -> 947 bytes media/img/icons/flags/flag-rumania.png | Bin 0 -> 249 bytes media/img/icons/flags/flag-spain.gif | Bin 0 -> 154 bytes media/img/icons/flags/flag-spain.png | Bin 0 -> 241 bytes media/img/icons/flags/flag-turkey.gif | Bin 0 -> 899 bytes media/img/icons/flags/flag-turkey.png | Bin 0 -> 301 bytes media/img/icons/media-devices/camera.gif | Bin 0 -> 924 bytes media/img/icons/media-devices/camera.png | Bin 0 -> 320 bytes media/img/icons/media-devices/cellphone.gif | Bin 0 -> 922 bytes media/img/icons/media-devices/cellphone.png | Bin 0 -> 317 bytes media/img/icons/media-devices/floppy.gif | Bin 0 -> 940 bytes media/img/icons/media-devices/floppy.png | Bin 0 -> 256 bytes media/img/icons/media-devices/headphones.gif | Bin 0 -> 889 bytes media/img/icons/media-devices/headphones.png | Bin 0 -> 254 bytes media/img/icons/media-devices/imac.gif | Bin 0 -> 900 bytes media/img/icons/media-devices/imac.png | Bin 0 -> 279 bytes media/img/icons/media-devices/ipod.gif | Bin 0 -> 935 bytes media/img/icons/media-devices/ipod.png | Bin 0 -> 361 bytes media/img/icons/media-devices/joystick.gif | Bin 0 -> 893 bytes media/img/icons/media-devices/joystick.png | Bin 0 -> 279 bytes .../media-devices/microphone-vintage.gif | Bin 0 -> 926 bytes .../media-devices/microphone-vintage.png | Bin 0 -> 338 bytes media/img/icons/media-devices/microphone.gif | Bin 0 -> 895 bytes media/img/icons/media-devices/microphone.png | Bin 0 -> 289 bytes media/img/icons/media-devices/mobile.gif | Bin 0 -> 931 bytes media/img/icons/media-devices/mobile.png | Bin 0 -> 311 bytes media/img/icons/media-devices/movie.gif | Bin 0 -> 939 bytes media/img/icons/media-devices/movie.png | Bin 0 -> 270 bytes media/img/icons/media-devices/pc.gif | Bin 0 -> 929 bytes media/img/icons/media-devices/pc.png | Bin 0 -> 329 bytes media/img/icons/media-devices/printer.gif | Bin 0 -> 915 bytes media/img/icons/media-devices/printer.png | Bin 0 -> 267 bytes media/img/icons/media-devices/rom.gif | Bin 0 -> 921 bytes media/img/icons/media-devices/rom.png | Bin 0 -> 368 bytes media/img/icons/media-devices/screen.gif | Bin 0 -> 922 bytes media/img/icons/media-devices/screen.png | Bin 0 -> 290 bytes media/img/icons/media-devices/signal.gif | Bin 0 -> 908 bytes media/img/icons/media-devices/signal.png | Bin 0 -> 301 bytes media/img/icons/media-devices/tv.gif | Bin 0 -> 921 bytes media/img/icons/media-devices/tv.png | Bin 0 -> 309 bytes .../icons/media-devices/usb-stick-blue.gif | Bin 0 -> 903 bytes .../icons/media-devices/usb-stick-blue.png | Bin 0 -> 253 bytes .../icons/media-devices/usb-stick-green.gif | Bin 0 -> 903 bytes .../icons/media-devices/usb-stick-green.png | Bin 0 -> 242 bytes .../icons/media-devices/usb-stick-light.gif | Bin 0 -> 899 bytes .../icons/media-devices/usb-stick-light.png | Bin 0 -> 245 bytes .../icons/media-devices/usb-stick-orange.gif | Bin 0 -> 902 bytes .../icons/media-devices/usb-stick-orange.png | Bin 0 -> 255 bytes .../img/icons/media-devices/usb-stick-red.gif | Bin 0 -> 903 bytes .../img/icons/media-devices/usb-stick-red.png | Bin 0 -> 238 bytes media/img/icons/media-devices/webcam.gif | Bin 0 -> 907 bytes media/img/icons/media-devices/webcam.png | Bin 0 -> 378 bytes media/img/icons/mini/action_back.gif | Bin 0 -> 266 bytes media/img/icons/mini/action_forward.gif | Bin 0 -> 265 bytes media/img/icons/mini/action_go.gif | Bin 0 -> 268 bytes media/img/icons/mini/action_paste.gif | Bin 0 -> 274 bytes media/img/icons/mini/action_print.gif | Bin 0 -> 280 bytes media/img/icons/mini/action_refresh.gif | Bin 0 -> 248 bytes media/img/icons/mini/action_refresh_blue.gif | Bin 0 -> 256 bytes media/img/icons/mini/action_save.gif | Bin 0 -> 279 bytes media/img/icons/mini/action_stop.gif | Bin 0 -> 258 bytes .../icons/mini/application_dreamweaver.gif | Bin 0 -> 197 bytes media/img/icons/mini/application_firefox.gif | Bin 0 -> 262 bytes media/img/icons/mini/application_flash.gif | Bin 0 -> 198 bytes media/img/icons/mini/arrow_down.gif | Bin 0 -> 131 bytes media/img/icons/mini/arrow_left.gif | Bin 0 -> 131 bytes media/img/icons/mini/arrow_right.gif | Bin 0 -> 130 bytes media/img/icons/mini/arrow_up.gif | Bin 0 -> 130 bytes media/img/icons/mini/box.gif | Bin 0 -> 274 bytes media/img/icons/mini/calendar.gif | Bin 0 -> 268 bytes media/img/icons/mini/comment.gif | Bin 0 -> 257 bytes media/img/icons/mini/comment_blue.gif | Bin 0 -> 257 bytes media/img/icons/mini/comment_delete.gif | Bin 0 -> 267 bytes media/img/icons/mini/comment_new.gif | Bin 0 -> 367 bytes media/img/icons/mini/comment_yellow.gif | Bin 0 -> 257 bytes media/img/icons/mini/copy.gif | Bin 0 -> 278 bytes media/img/icons/mini/cut.gif | Bin 0 -> 271 bytes media/img/icons/mini/date.gif | Bin 0 -> 280 bytes media/img/icons/mini/date_delete.gif | Bin 0 -> 283 bytes media/img/icons/mini/date_new.gif | Bin 0 -> 384 bytes media/img/icons/mini/file_acrobat.gif | Bin 0 -> 291 bytes media/img/icons/mini/file_font.gif | Bin 0 -> 653 bytes media/img/icons/mini/file_font_truetype.gif | Bin 0 -> 648 bytes media/img/icons/mini/flag_blue.gif | Bin 0 -> 248 bytes media/img/icons/mini/flag_green.gif | Bin 0 -> 245 bytes media/img/icons/mini/flag_orange.gif | Bin 0 -> 244 bytes media/img/icons/mini/flag_red.gif | Bin 0 -> 244 bytes media/img/icons/mini/flag_white.gif | Bin 0 -> 245 bytes media/img/icons/mini/folder.gif | Bin 0 -> 249 bytes media/img/icons/mini/folder_delete.gif | Bin 0 -> 261 bytes media/img/icons/mini/folder_images.gif | Bin 0 -> 366 bytes media/img/icons/mini/folder_lock.gif | Bin 0 -> 271 bytes media/img/icons/mini/folder_new.gif | Bin 0 -> 360 bytes media/img/icons/mini/folder_page.gif | Bin 0 -> 260 bytes media/img/icons/mini/icon_accept.gif | Bin 0 -> 263 bytes media/img/icons/mini/icon_airmail.gif | Bin 0 -> 256 bytes media/img/icons/mini/icon_alert.gif | Bin 0 -> 246 bytes media/img/icons/mini/icon_attachment.gif | Bin 0 -> 235 bytes media/img/icons/mini/icon_clock.gif | Bin 0 -> 207 bytes media/img/icons/mini/icon_component.gif | Bin 0 -> 597 bytes media/img/icons/mini/icon_download.gif | Bin 0 -> 290 bytes media/img/icons/mini/icon_email.gif | Bin 0 -> 260 bytes media/img/icons/mini/icon_extension.gif | Bin 0 -> 267 bytes media/img/icons/mini/icon_favourites.gif | Bin 0 -> 243 bytes media/img/icons/mini/icon_get_world.gif | Bin 0 -> 189 bytes media/img/icons/mini/icon_history.gif | Bin 0 -> 205 bytes media/img/icons/mini/icon_home.gif | Bin 0 -> 179 bytes media/img/icons/mini/icon_info.gif | Bin 0 -> 266 bytes media/img/icons/mini/icon_key.gif | Bin 0 -> 230 bytes media/img/icons/mini/icon_link.gif | Bin 0 -> 329 bytes media/img/icons/mini/icon_mail.gif | Bin 0 -> 257 bytes media/img/icons/mini/icon_monitor_mac.gif | Bin 0 -> 274 bytes media/img/icons/mini/icon_monitor_pc.gif | Bin 0 -> 274 bytes media/img/icons/mini/icon_network.gif | Bin 0 -> 265 bytes media/img/icons/mini/icon_package.gif | Bin 0 -> 624 bytes media/img/icons/mini/icon_package_get.gif | Bin 0 -> 616 bytes media/img/icons/mini/icon_package_open.gif | Bin 0 -> 613 bytes media/img/icons/mini/icon_padlock.gif | Bin 0 -> 249 bytes media/img/icons/mini/icon_security.gif | Bin 0 -> 266 bytes media/img/icons/mini/icon_settings.gif | Bin 0 -> 251 bytes media/img/icons/mini/icon_user.gif | Bin 0 -> 246 bytes media/img/icons/mini/icon_wand.gif | Bin 0 -> 205 bytes media/img/icons/mini/icon_world.gif | Bin 0 -> 184 bytes media/img/icons/mini/icon_world_dynamic.gif | Bin 0 -> 367 bytes media/img/icons/mini/image.gif | Bin 0 -> 621 bytes media/img/icons/mini/image_new.gif | Bin 0 -> 609 bytes media/img/icons/mini/interface_browser.gif | Bin 0 -> 240 bytes media/img/icons/mini/interface_dialog.gif | Bin 0 -> 238 bytes media/img/icons/mini/interface_installer.gif | Bin 0 -> 242 bytes media/img/icons/mini/list_comments.gif | Bin 0 -> 364 bytes media/img/icons/mini/list_components.gif | Bin 0 -> 242 bytes media/img/icons/mini/list_errors.gif | Bin 0 -> 242 bytes media/img/icons/mini/list_extensions.gif | Bin 0 -> 251 bytes media/img/icons/mini/list_images.gif | Bin 0 -> 565 bytes media/img/icons/mini/list_keys.gif | Bin 0 -> 239 bytes media/img/icons/mini/list_links.gif | Bin 0 -> 355 bytes media/img/icons/mini/list_packages.gif | Bin 0 -> 365 bytes media/img/icons/mini/list_security.gif | Bin 0 -> 246 bytes media/img/icons/mini/list_settings.gif | Bin 0 -> 366 bytes media/img/icons/mini/list_users.gif | Bin 0 -> 246 bytes media/img/icons/mini/list_world.gif | Bin 0 -> 369 bytes media/img/icons/mini/note.gif | Bin 0 -> 270 bytes media/img/icons/mini/note_delete.gif | Bin 0 -> 271 bytes media/img/icons/mini/note_new.gif | Bin 0 -> 379 bytes media/img/icons/mini/page.gif | Bin 0 -> 274 bytes media/img/icons/mini/page_alert.gif | Bin 0 -> 285 bytes media/img/icons/mini/page_attachment.gif | Bin 0 -> 289 bytes media/img/icons/mini/page_bookmark.gif | Bin 0 -> 291 bytes media/img/icons/mini/page_boy.gif | Bin 0 -> 290 bytes media/img/icons/mini/page_code.gif | Bin 0 -> 278 bytes media/img/icons/mini/page_colors.gif | Bin 0 -> 271 bytes media/img/icons/mini/page_component.gif | Bin 0 -> 646 bytes media/img/icons/mini/page_cross.gif | Bin 0 -> 385 bytes media/img/icons/mini/page_delete.gif | Bin 0 -> 277 bytes media/img/icons/mini/page_deny.gif | Bin 0 -> 298 bytes media/img/icons/mini/page_down.gif | Bin 0 -> 281 bytes media/img/icons/mini/page_dynamic.gif | Bin 0 -> 271 bytes media/img/icons/mini/page_edit.gif | Bin 0 -> 280 bytes media/img/icons/mini/page_extension.gif | Bin 0 -> 279 bytes media/img/icons/mini/page_favourites.gif | Bin 0 -> 290 bytes media/img/icons/mini/page_find.gif | Bin 0 -> 273 bytes media/img/icons/mini/page_flash.gif | Bin 0 -> 279 bytes media/img/icons/mini/page_girl.gif | Bin 0 -> 291 bytes media/img/icons/mini/page_html.gif | Bin 0 -> 285 bytes media/img/icons/mini/page_java.gif | Bin 0 -> 650 bytes media/img/icons/mini/page_key.gif | Bin 0 -> 281 bytes media/img/icons/mini/page_left.gif | Bin 0 -> 285 bytes media/img/icons/mini/page_link.gif | Bin 0 -> 644 bytes media/img/icons/mini/page_lock.gif | Bin 0 -> 283 bytes media/img/icons/mini/page_new.gif | Bin 0 -> 378 bytes media/img/icons/mini/page_next.gif | Bin 0 -> 283 bytes media/img/icons/mini/page_package.gif | Bin 0 -> 640 bytes media/img/icons/mini/page_php.gif | Bin 0 -> 296 bytes media/img/icons/mini/page_prev.gif | Bin 0 -> 279 bytes media/img/icons/mini/page_refresh.gif | Bin 0 -> 286 bytes media/img/icons/mini/page_right.gif | Bin 0 -> 283 bytes media/img/icons/mini/page_script.gif | Bin 0 -> 277 bytes media/img/icons/mini/page_security.gif | Bin 0 -> 280 bytes media/img/icons/mini/page_settings.gif | Bin 0 -> 298 bytes media/img/icons/mini/page_sound.gif | Bin 0 -> 407 bytes media/img/icons/mini/page_tag_blue.gif | Bin 0 -> 288 bytes media/img/icons/mini/page_tag_red.gif | Bin 0 -> 289 bytes media/img/icons/mini/page_text.gif | Bin 0 -> 276 bytes media/img/icons/mini/page_text_delete.gif | Bin 0 -> 277 bytes media/img/icons/mini/page_tick.gif | Bin 0 -> 385 bytes media/img/icons/mini/page_tree.gif | Bin 0 -> 287 bytes media/img/icons/mini/page_up.gif | Bin 0 -> 283 bytes media/img/icons/mini/page_url.gif | Bin 0 -> 298 bytes media/img/icons/mini/page_user.gif | Bin 0 -> 290 bytes media/img/icons/mini/page_user_dark.gif | Bin 0 -> 283 bytes media/img/icons/mini/page_user_light.gif | Bin 0 -> 287 bytes media/img/icons/mini/page_video.gif | Bin 0 -> 384 bytes media/img/icons/mini/page_wizard.gif | Bin 0 -> 286 bytes media/img/icons/mini/readme.txt | 2 + media/img/icons/mini/table.gif | Bin 0 -> 270 bytes media/img/icons/mini/table_delete.gif | Bin 0 -> 274 bytes media/img/icons/mini/tables.gif | Bin 0 -> 276 bytes media/img/icons/silk/accept.png | Bin 0 -> 781 bytes media/img/icons/silk/add.png | Bin 0 -> 733 bytes media/img/icons/silk/anchor.png | Bin 0 -> 523 bytes media/img/icons/silk/application.png | Bin 0 -> 464 bytes media/img/icons/silk/application_add.png | Bin 0 -> 619 bytes media/img/icons/silk/application_cascade.png | Bin 0 -> 524 bytes media/img/icons/silk/application_delete.png | Bin 0 -> 610 bytes media/img/icons/silk/application_double.png | Bin 0 -> 533 bytes media/img/icons/silk/application_edit.png | Bin 0 -> 703 bytes media/img/icons/silk/application_error.png | Bin 0 -> 656 bytes media/img/icons/silk/application_form.png | Bin 0 -> 467 bytes media/img/icons/silk/application_form_add.png | Bin 0 -> 592 bytes .../icons/silk/application_form_delete.png | Bin 0 -> 605 bytes .../img/icons/silk/application_form_edit.png | Bin 0 -> 714 bytes .../icons/silk/application_form_magnify.png | Bin 0 -> 612 bytes media/img/icons/silk/application_get.png | Bin 0 -> 581 bytes media/img/icons/silk/application_go.png | Bin 0 -> 634 bytes media/img/icons/silk/application_home.png | Bin 0 -> 685 bytes media/img/icons/silk/application_key.png | Bin 0 -> 670 bytes .../img/icons/silk/application_lightning.png | Bin 0 -> 656 bytes media/img/icons/silk/application_link.png | Bin 0 -> 701 bytes media/img/icons/silk/application_osx.png | Bin 0 -> 487 bytes .../icons/silk/application_osx_terminal.png | Bin 0 -> 525 bytes media/img/icons/silk/application_put.png | Bin 0 -> 585 bytes .../img/icons/silk/application_side_boxes.png | Bin 0 -> 478 bytes .../icons/silk/application_side_contract.png | Bin 0 -> 547 bytes .../icons/silk/application_side_expand.png | Bin 0 -> 581 bytes .../img/icons/silk/application_side_list.png | Bin 0 -> 510 bytes .../img/icons/silk/application_side_tree.png | Bin 0 -> 483 bytes media/img/icons/silk/application_split.png | Bin 0 -> 520 bytes .../silk/application_tile_horizontal.png | Bin 0 -> 432 bytes .../icons/silk/application_tile_vertical.png | Bin 0 -> 492 bytes .../icons/silk/application_view_columns.png | Bin 0 -> 493 bytes .../icons/silk/application_view_detail.png | Bin 0 -> 576 bytes .../icons/silk/application_view_gallery.png | Bin 0 -> 555 bytes .../img/icons/silk/application_view_icons.png | Bin 0 -> 476 bytes .../img/icons/silk/application_view_list.png | Bin 0 -> 473 bytes .../img/icons/silk/application_view_tile.png | Bin 0 -> 465 bytes media/img/icons/silk/application_xp.png | Bin 0 -> 426 bytes .../icons/silk/application_xp_terminal.png | Bin 0 -> 507 bytes media/img/icons/silk/arrow_branch.png | Bin 0 -> 582 bytes media/img/icons/silk/arrow_divide.png | Bin 0 -> 677 bytes media/img/icons/silk/arrow_down.png | Bin 0 -> 379 bytes media/img/icons/silk/arrow_in.png | Bin 0 -> 600 bytes media/img/icons/silk/arrow_inout.png | Bin 0 -> 551 bytes media/img/icons/silk/arrow_join.png | Bin 0 -> 626 bytes media/img/icons/silk/arrow_left.png | Bin 0 -> 345 bytes media/img/icons/silk/arrow_merge.png | Bin 0 -> 484 bytes media/img/icons/silk/arrow_out.png | Bin 0 -> 594 bytes media/img/icons/silk/arrow_redo.png | Bin 0 -> 625 bytes media/img/icons/silk/arrow_refresh.png | Bin 0 -> 685 bytes media/img/icons/silk/arrow_refresh_small.png | Bin 0 -> 506 bytes media/img/icons/silk/arrow_right.png | Bin 0 -> 349 bytes .../icons/silk/arrow_rotate_anticlockwise.png | Bin 0 -> 608 bytes .../img/icons/silk/arrow_rotate_clockwise.png | Bin 0 -> 602 bytes media/img/icons/silk/arrow_switch.png | Bin 0 -> 683 bytes media/img/icons/silk/arrow_turn_left.png | Bin 0 -> 516 bytes media/img/icons/silk/arrow_turn_right.png | Bin 0 -> 489 bytes media/img/icons/silk/arrow_undo.png | Bin 0 -> 631 bytes media/img/icons/silk/arrow_up.png | Bin 0 -> 372 bytes media/img/icons/silk/asterisk_orange.png | Bin 0 -> 760 bytes media/img/icons/silk/asterisk_yellow.png | Bin 0 -> 743 bytes media/img/icons/silk/attach.png | Bin 0 -> 391 bytes media/img/icons/silk/award_star_add.png | Bin 0 -> 853 bytes media/img/icons/silk/award_star_bronze_1.png | Bin 0 -> 733 bytes media/img/icons/silk/award_star_bronze_2.png | Bin 0 -> 755 bytes media/img/icons/silk/award_star_bronze_3.png | Bin 0 -> 754 bytes media/img/icons/silk/award_star_delete.png | Bin 0 -> 849 bytes media/img/icons/silk/award_star_gold_1.png | Bin 0 -> 753 bytes media/img/icons/silk/award_star_gold_2.png | Bin 0 -> 770 bytes media/img/icons/silk/award_star_gold_3.png | Bin 0 -> 781 bytes media/img/icons/silk/award_star_silver_1.png | Bin 0 -> 714 bytes media/img/icons/silk/award_star_silver_2.png | Bin 0 -> 734 bytes media/img/icons/silk/award_star_silver_3.png | Bin 0 -> 738 bytes media/img/icons/silk/basket.png | Bin 0 -> 669 bytes media/img/icons/silk/basket_add.png | Bin 0 -> 752 bytes media/img/icons/silk/basket_delete.png | Bin 0 -> 773 bytes media/img/icons/silk/basket_edit.png | Bin 0 -> 811 bytes media/img/icons/silk/basket_error.png | Bin 0 -> 794 bytes media/img/icons/silk/basket_go.png | Bin 0 -> 777 bytes media/img/icons/silk/basket_put.png | Bin 0 -> 733 bytes media/img/icons/silk/basket_remove.png | Bin 0 -> 738 bytes media/img/icons/silk/bell.png | Bin 0 -> 789 bytes media/img/icons/silk/bell_add.png | Bin 0 -> 816 bytes media/img/icons/silk/bell_delete.png | Bin 0 -> 824 bytes media/img/icons/silk/bell_error.png | Bin 0 -> 813 bytes media/img/icons/silk/bell_go.png | Bin 0 -> 836 bytes media/img/icons/silk/bell_link.png | Bin 0 -> 850 bytes media/img/icons/silk/bin.png | Bin 0 -> 476 bytes media/img/icons/silk/bin_closed.png | Bin 0 -> 363 bytes media/img/icons/silk/bin_empty.png | Bin 0 -> 475 bytes media/img/icons/silk/bomb.png | Bin 0 -> 793 bytes media/img/icons/silk/book.png | Bin 0 -> 593 bytes media/img/icons/silk/book_add.png | Bin 0 -> 714 bytes media/img/icons/silk/book_addresses.png | Bin 0 -> 770 bytes media/img/icons/silk/book_delete.png | Bin 0 -> 719 bytes media/img/icons/silk/book_edit.png | Bin 0 -> 813 bytes media/img/icons/silk/book_error.png | Bin 0 -> 734 bytes media/img/icons/silk/book_go.png | Bin 0 -> 745 bytes media/img/icons/silk/book_key.png | Bin 0 -> 779 bytes media/img/icons/silk/book_link.png | Bin 0 -> 789 bytes media/img/icons/silk/book_next.png | Bin 0 -> 702 bytes media/img/icons/silk/book_open.png | Bin 0 -> 622 bytes media/img/icons/silk/book_previous.png | Bin 0 -> 680 bytes media/img/icons/silk/box.png | Bin 0 -> 555 bytes media/img/icons/silk/brick.png | Bin 0 -> 452 bytes media/img/icons/silk/brick_add.png | Bin 0 -> 729 bytes media/img/icons/silk/brick_delete.png | Bin 0 -> 745 bytes media/img/icons/silk/brick_edit.png | Bin 0 -> 775 bytes media/img/icons/silk/brick_error.png | Bin 0 -> 798 bytes media/img/icons/silk/brick_go.png | Bin 0 -> 790 bytes media/img/icons/silk/brick_link.png | Bin 0 -> 764 bytes media/img/icons/silk/bricks.png | Bin 0 -> 825 bytes media/img/icons/silk/briefcase.png | Bin 0 -> 793 bytes media/img/icons/silk/bug.png | Bin 0 -> 774 bytes media/img/icons/silk/bug_add.png | Bin 0 -> 806 bytes media/img/icons/silk/bug_delete.png | Bin 0 -> 836 bytes media/img/icons/silk/bug_edit.png | Bin 0 -> 873 bytes media/img/icons/silk/bug_error.png | Bin 0 -> 841 bytes media/img/icons/silk/bug_go.png | Bin 0 -> 831 bytes media/img/icons/silk/bug_link.png | Bin 0 -> 847 bytes media/img/icons/silk/building.png | Bin 0 -> 556 bytes media/img/icons/silk/building_add.png | Bin 0 -> 631 bytes media/img/icons/silk/building_delete.png | Bin 0 -> 633 bytes media/img/icons/silk/building_edit.png | Bin 0 -> 731 bytes media/img/icons/silk/building_error.png | Bin 0 -> 653 bytes media/img/icons/silk/building_go.png | Bin 0 -> 665 bytes media/img/icons/silk/building_key.png | Bin 0 -> 705 bytes media/img/icons/silk/building_link.png | Bin 0 -> 668 bytes media/img/icons/silk/bullet_add.png | Bin 0 -> 286 bytes media/img/icons/silk/bullet_arrow_bottom.png | Bin 0 -> 229 bytes media/img/icons/silk/bullet_arrow_down.png | Bin 0 -> 201 bytes media/img/icons/silk/bullet_arrow_top.png | Bin 0 -> 230 bytes media/img/icons/silk/bullet_arrow_up.png | Bin 0 -> 201 bytes media/img/icons/silk/bullet_black.png | Bin 0 -> 211 bytes media/img/icons/silk/bullet_blue.png | Bin 0 -> 289 bytes media/img/icons/silk/bullet_delete.png | Bin 0 -> 308 bytes media/img/icons/silk/bullet_disk.png | Bin 0 -> 483 bytes media/img/icons/silk/bullet_error.png | Bin 0 -> 454 bytes media/img/icons/silk/bullet_feed.png | Bin 0 -> 262 bytes media/img/icons/silk/bullet_go.png | Bin 0 -> 410 bytes media/img/icons/silk/bullet_green.png | Bin 0 -> 295 bytes media/img/icons/silk/bullet_key.png | Bin 0 -> 436 bytes media/img/icons/silk/bullet_orange.png | Bin 0 -> 283 bytes media/img/icons/silk/bullet_picture.png | Bin 0 -> 470 bytes media/img/icons/silk/bullet_pink.png | Bin 0 -> 286 bytes media/img/icons/silk/bullet_purple.png | Bin 0 -> 294 bytes media/img/icons/silk/bullet_red.png | Bin 0 -> 287 bytes media/img/icons/silk/bullet_star.png | Bin 0 -> 331 bytes media/img/icons/silk/bullet_toggle_minus.png | Bin 0 -> 207 bytes media/img/icons/silk/bullet_toggle_plus.png | Bin 0 -> 209 bytes media/img/icons/silk/bullet_white.png | Bin 0 -> 201 bytes media/img/icons/silk/bullet_wrench.png | Bin 0 -> 448 bytes media/img/icons/silk/bullet_yellow.png | Bin 0 -> 287 bytes media/img/icons/silk/cake.png | Bin 0 -> 676 bytes media/img/icons/silk/calculator.png | Bin 0 -> 543 bytes media/img/icons/silk/calculator_add.png | Bin 0 -> 660 bytes media/img/icons/silk/calculator_delete.png | Bin 0 -> 692 bytes media/img/icons/silk/calculator_edit.png | Bin 0 -> 767 bytes media/img/icons/silk/calculator_error.png | Bin 0 -> 731 bytes media/img/icons/silk/calculator_link.png | Bin 0 -> 723 bytes media/img/icons/silk/calendar.png | Bin 0 -> 675 bytes media/img/icons/silk/calendar_add.png | Bin 0 -> 723 bytes media/img/icons/silk/calendar_delete.png | Bin 0 -> 742 bytes media/img/icons/silk/calendar_edit.png | Bin 0 -> 777 bytes media/img/icons/silk/calendar_link.png | Bin 0 -> 795 bytes media/img/icons/silk/calendar_view_day.png | Bin 0 -> 572 bytes media/img/icons/silk/calendar_view_month.png | Bin 0 -> 595 bytes media/img/icons/silk/calendar_view_week.png | Bin 0 -> 480 bytes media/img/icons/silk/camera.png | Bin 0 -> 665 bytes media/img/icons/silk/camera_add.png | Bin 0 -> 800 bytes media/img/icons/silk/camera_delete.png | Bin 0 -> 797 bytes media/img/icons/silk/camera_edit.png | Bin 0 -> 872 bytes media/img/icons/silk/camera_error.png | Bin 0 -> 835 bytes media/img/icons/silk/camera_go.png | Bin 0 -> 809 bytes media/img/icons/silk/camera_link.png | Bin 0 -> 839 bytes media/img/icons/silk/camera_small.png | Bin 0 -> 489 bytes media/img/icons/silk/cancel.png | Bin 0 -> 587 bytes media/img/icons/silk/car.png | Bin 0 -> 610 bytes media/img/icons/silk/car_add.png | Bin 0 -> 677 bytes media/img/icons/silk/car_delete.png | Bin 0 -> 689 bytes media/img/icons/silk/cart.png | Bin 0 -> 421 bytes media/img/icons/silk/cart_add.png | Bin 0 -> 711 bytes media/img/icons/silk/cart_delete.png | Bin 0 -> 742 bytes media/img/icons/silk/cart_edit.png | Bin 0 -> 789 bytes media/img/icons/silk/cart_error.png | Bin 0 -> 790 bytes media/img/icons/silk/cart_go.png | Bin 0 -> 763 bytes media/img/icons/silk/cart_put.png | Bin 0 -> 763 bytes media/img/icons/silk/cart_remove.png | Bin 0 -> 769 bytes media/img/icons/silk/cd.png | Bin 0 -> 673 bytes media/img/icons/silk/cd_add.png | Bin 0 -> 758 bytes media/img/icons/silk/cd_burn.png | Bin 0 -> 756 bytes media/img/icons/silk/cd_delete.png | Bin 0 -> 767 bytes media/img/icons/silk/cd_edit.png | Bin 0 -> 790 bytes media/img/icons/silk/cd_eject.png | Bin 0 -> 786 bytes media/img/icons/silk/cd_go.png | Bin 0 -> 793 bytes media/img/icons/silk/chart_bar.png | Bin 0 -> 541 bytes media/img/icons/silk/chart_bar_add.png | Bin 0 -> 626 bytes media/img/icons/silk/chart_bar_delete.png | Bin 0 -> 636 bytes media/img/icons/silk/chart_bar_edit.png | Bin 0 -> 754 bytes media/img/icons/silk/chart_bar_error.png | Bin 0 -> 671 bytes media/img/icons/silk/chart_bar_link.png | Bin 0 -> 712 bytes media/img/icons/silk/chart_curve.png | Bin 0 -> 710 bytes media/img/icons/silk/chart_curve_add.png | Bin 0 -> 761 bytes media/img/icons/silk/chart_curve_delete.png | Bin 0 -> 782 bytes media/img/icons/silk/chart_curve_edit.png | Bin 0 -> 822 bytes media/img/icons/silk/chart_curve_error.png | Bin 0 -> 837 bytes media/img/icons/silk/chart_curve_go.png | Bin 0 -> 823 bytes media/img/icons/silk/chart_curve_link.png | Bin 0 -> 829 bytes media/img/icons/silk/chart_line.png | Bin 0 -> 526 bytes media/img/icons/silk/chart_line_add.png | Bin 0 -> 655 bytes media/img/icons/silk/chart_line_delete.png | Bin 0 -> 675 bytes media/img/icons/silk/chart_line_edit.png | Bin 0 -> 718 bytes media/img/icons/silk/chart_line_error.png | Bin 0 -> 741 bytes media/img/icons/silk/chart_line_link.png | Bin 0 -> 749 bytes media/img/icons/silk/chart_organisation.png | Bin 0 -> 444 bytes .../img/icons/silk/chart_organisation_add.png | Bin 0 -> 551 bytes .../icons/silk/chart_organisation_delete.png | Bin 0 -> 563 bytes media/img/icons/silk/chart_pie.png | Bin 0 -> 918 bytes media/img/icons/silk/chart_pie_add.png | Bin 0 -> 975 bytes media/img/icons/silk/chart_pie_delete.png | Bin 0 -> 983 bytes media/img/icons/silk/chart_pie_edit.png | Bin 0 -> 986 bytes media/img/icons/silk/chart_pie_error.png | Bin 0 -> 989 bytes media/img/icons/silk/chart_pie_link.png | Bin 0 -> 1021 bytes media/img/icons/silk/clock.png | Bin 0 -> 882 bytes media/img/icons/silk/clock_add.png | Bin 0 -> 925 bytes media/img/icons/silk/clock_delete.png | Bin 0 -> 952 bytes media/img/icons/silk/clock_edit.png | Bin 0 -> 967 bytes media/img/icons/silk/clock_error.png | Bin 0 -> 953 bytes media/img/icons/silk/clock_go.png | Bin 0 -> 959 bytes media/img/icons/silk/clock_link.png | Bin 0 -> 961 bytes media/img/icons/silk/clock_pause.png | Bin 0 -> 927 bytes media/img/icons/silk/clock_play.png | Bin 0 -> 943 bytes media/img/icons/silk/clock_red.png | Bin 0 -> 889 bytes media/img/icons/silk/clock_stop.png | Bin 0 -> 922 bytes media/img/icons/silk/cog.png | Bin 0 -> 512 bytes media/img/icons/silk/cog_add.png | Bin 0 -> 814 bytes media/img/icons/silk/cog_delete.png | Bin 0 -> 847 bytes media/img/icons/silk/cog_edit.png | Bin 0 -> 865 bytes media/img/icons/silk/cog_error.png | Bin 0 -> 869 bytes media/img/icons/silk/cog_go.png | Bin 0 -> 859 bytes media/img/icons/silk/coins.png | Bin 0 -> 732 bytes media/img/icons/silk/coins_add.png | Bin 0 -> 789 bytes media/img/icons/silk/coins_delete.png | Bin 0 -> 775 bytes media/img/icons/silk/color_swatch.png | Bin 0 -> 209 bytes media/img/icons/silk/color_wheel.png | Bin 0 -> 892 bytes media/img/icons/silk/comment.png | Bin 0 -> 413 bytes media/img/icons/silk/comment_add.png | Bin 0 -> 530 bytes media/img/icons/silk/comment_delete.png | Bin 0 -> 548 bytes media/img/icons/silk/comment_edit.png | Bin 0 -> 644 bytes media/img/icons/silk/comments.png | Bin 0 -> 557 bytes media/img/icons/silk/comments_add.png | Bin 0 -> 648 bytes media/img/icons/silk/comments_delete.png | Bin 0 -> 670 bytes media/img/icons/silk/compress.png | Bin 0 -> 766 bytes media/img/icons/silk/computer.png | Bin 0 -> 667 bytes media/img/icons/silk/computer_add.png | Bin 0 -> 781 bytes media/img/icons/silk/computer_delete.png | Bin 0 -> 775 bytes media/img/icons/silk/computer_edit.png | Bin 0 -> 792 bytes media/img/icons/silk/computer_error.png | Bin 0 -> 784 bytes media/img/icons/silk/computer_go.png | Bin 0 -> 777 bytes media/img/icons/silk/computer_key.png | Bin 0 -> 771 bytes media/img/icons/silk/computer_link.png | Bin 0 -> 792 bytes media/img/icons/silk/connect.png | Bin 0 -> 748 bytes media/img/icons/silk/contrast.png | Bin 0 -> 434 bytes media/img/icons/silk/contrast_decrease.png | Bin 0 -> 695 bytes media/img/icons/silk/contrast_high.png | Bin 0 -> 435 bytes media/img/icons/silk/contrast_increase.png | Bin 0 -> 717 bytes media/img/icons/silk/contrast_low.png | Bin 0 -> 421 bytes media/img/icons/silk/control_eject.png | Bin 0 -> 603 bytes media/img/icons/silk/control_eject_blue.png | Bin 0 -> 727 bytes media/img/icons/silk/control_end.png | Bin 0 -> 621 bytes media/img/icons/silk/control_end_blue.png | Bin 0 -> 737 bytes media/img/icons/silk/control_equalizer.png | Bin 0 -> 432 bytes .../img/icons/silk/control_equalizer_blue.png | Bin 0 -> 764 bytes media/img/icons/silk/control_fastforward.png | Bin 0 -> 607 bytes .../icons/silk/control_fastforward_blue.png | Bin 0 -> 736 bytes media/img/icons/silk/control_pause.png | Bin 0 -> 598 bytes media/img/icons/silk/control_pause_blue.png | Bin 0 -> 721 bytes media/img/icons/silk/control_play.png | Bin 0 -> 592 bytes media/img/icons/silk/control_play_blue.png | Bin 0 -> 717 bytes media/img/icons/silk/control_repeat.png | Bin 0 -> 422 bytes media/img/icons/silk/control_repeat_blue.png | Bin 0 -> 750 bytes media/img/icons/silk/control_rewind.png | Bin 0 -> 614 bytes media/img/icons/silk/control_rewind_blue.png | Bin 0 -> 745 bytes media/img/icons/silk/control_start.png | Bin 0 -> 604 bytes media/img/icons/silk/control_start_blue.png | Bin 0 -> 720 bytes media/img/icons/silk/control_stop.png | Bin 0 -> 403 bytes media/img/icons/silk/control_stop_blue.png | Bin 0 -> 695 bytes media/img/icons/silk/controller.png | Bin 0 -> 666 bytes media/img/icons/silk/controller_add.png | Bin 0 -> 759 bytes media/img/icons/silk/controller_delete.png | Bin 0 -> 770 bytes media/img/icons/silk/controller_error.png | Bin 0 -> 815 bytes media/img/icons/silk/creditcards.png | Bin 0 -> 693 bytes media/img/icons/silk/cross.png | Bin 0 -> 655 bytes media/img/icons/silk/css.png | Bin 0 -> 524 bytes media/img/icons/silk/css_add.png | Bin 0 -> 666 bytes media/img/icons/silk/css_delete.png | Bin 0 -> 654 bytes media/img/icons/silk/css_go.png | Bin 0 -> 655 bytes media/img/icons/silk/css_valid.png | Bin 0 -> 661 bytes media/img/icons/silk/cup.png | Bin 0 -> 633 bytes media/img/icons/silk/cup_add.png | Bin 0 -> 715 bytes media/img/icons/silk/cup_delete.png | Bin 0 -> 731 bytes media/img/icons/silk/cup_edit.png | Bin 0 -> 778 bytes media/img/icons/silk/cup_error.png | Bin 0 -> 790 bytes media/img/icons/silk/cup_go.png | Bin 0 -> 780 bytes media/img/icons/silk/cup_key.png | Bin 0 -> 776 bytes media/img/icons/silk/cup_link.png | Bin 0 -> 760 bytes media/img/icons/silk/cursor.png | Bin 0 -> 354 bytes media/img/icons/silk/cut.png | Bin 0 -> 648 bytes media/img/icons/silk/cut_red.png | Bin 0 -> 650 bytes media/img/icons/silk/database.png | Bin 0 -> 390 bytes media/img/icons/silk/database_add.png | Bin 0 -> 658 bytes media/img/icons/silk/database_connect.png | Bin 0 -> 763 bytes media/img/icons/silk/database_delete.png | Bin 0 -> 659 bytes media/img/icons/silk/database_edit.png | Bin 0 -> 767 bytes media/img/icons/silk/database_error.png | Bin 0 -> 682 bytes media/img/icons/silk/database_gear.png | Bin 0 -> 468 bytes media/img/icons/silk/database_go.png | Bin 0 -> 698 bytes media/img/icons/silk/database_key.png | Bin 0 -> 764 bytes media/img/icons/silk/database_lightning.png | Bin 0 -> 775 bytes media/img/icons/silk/database_link.png | Bin 0 -> 679 bytes media/img/icons/silk/database_refresh.png | Bin 0 -> 770 bytes media/img/icons/silk/database_save.png | Bin 0 -> 755 bytes media/img/icons/silk/database_table.png | Bin 0 -> 726 bytes media/img/icons/silk/date.png | Bin 0 -> 626 bytes media/img/icons/silk/date_add.png | Bin 0 -> 703 bytes media/img/icons/silk/date_delete.png | Bin 0 -> 716 bytes media/img/icons/silk/date_edit.png | Bin 0 -> 799 bytes media/img/icons/silk/date_error.png | Bin 0 -> 753 bytes media/img/icons/silk/date_go.png | Bin 0 -> 753 bytes media/img/icons/silk/date_link.png | Bin 0 -> 764 bytes media/img/icons/silk/date_magnify.png | Bin 0 -> 711 bytes media/img/icons/silk/date_next.png | Bin 0 -> 688 bytes media/img/icons/silk/date_previous.png | Bin 0 -> 720 bytes media/img/icons/silk/delete.png | Bin 0 -> 715 bytes media/img/icons/silk/disconnect.png | Bin 0 -> 796 bytes media/img/icons/silk/disk.png | Bin 0 -> 620 bytes media/img/icons/silk/disk_multiple.png | Bin 0 -> 691 bytes media/img/icons/silk/door.png | Bin 0 -> 412 bytes media/img/icons/silk/door_in.png | Bin 0 -> 693 bytes media/img/icons/silk/door_open.png | Bin 0 -> 508 bytes media/img/icons/silk/door_out.png | Bin 0 -> 688 bytes media/img/icons/silk/drink.png | Bin 0 -> 692 bytes media/img/icons/silk/drink_empty.png | Bin 0 -> 433 bytes media/img/icons/silk/drive.png | Bin 0 -> 346 bytes media/img/icons/silk/drive_add.png | Bin 0 -> 623 bytes media/img/icons/silk/drive_burn.png | Bin 0 -> 608 bytes media/img/icons/silk/drive_cd.png | Bin 0 -> 734 bytes media/img/icons/silk/drive_cd_empty.png | Bin 0 -> 341 bytes media/img/icons/silk/drive_delete.png | Bin 0 -> 628 bytes media/img/icons/silk/drive_disk.png | Bin 0 -> 695 bytes media/img/icons/silk/drive_edit.png | Bin 0 -> 714 bytes media/img/icons/silk/drive_error.png | Bin 0 -> 705 bytes media/img/icons/silk/drive_go.png | Bin 0 -> 661 bytes media/img/icons/silk/drive_key.png | Bin 0 -> 681 bytes media/img/icons/silk/drive_link.png | Bin 0 -> 679 bytes media/img/icons/silk/drive_magnify.png | Bin 0 -> 641 bytes media/img/icons/silk/drive_network.png | Bin 0 -> 585 bytes media/img/icons/silk/drive_rename.png | Bin 0 -> 494 bytes media/img/icons/silk/drive_user.png | Bin 0 -> 712 bytes media/img/icons/silk/drive_web.png | Bin 0 -> 686 bytes media/img/icons/silk/dvd.png | Bin 0 -> 764 bytes media/img/icons/silk/dvd_add.png | Bin 0 -> 788 bytes media/img/icons/silk/dvd_delete.png | Bin 0 -> 800 bytes media/img/icons/silk/dvd_edit.png | Bin 0 -> 844 bytes media/img/icons/silk/dvd_error.png | Bin 0 -> 854 bytes media/img/icons/silk/dvd_go.png | Bin 0 -> 854 bytes media/img/icons/silk/dvd_key.png | Bin 0 -> 816 bytes media/img/icons/silk/dvd_link.png | Bin 0 -> 819 bytes media/img/icons/silk/email.png | Bin 0 -> 641 bytes media/img/icons/silk/email_add.png | Bin 0 -> 761 bytes media/img/icons/silk/email_attach.png | Bin 0 -> 793 bytes media/img/icons/silk/email_delete.png | Bin 0 -> 756 bytes media/img/icons/silk/email_edit.png | Bin 0 -> 756 bytes media/img/icons/silk/email_error.png | Bin 0 -> 792 bytes media/img/icons/silk/email_go.png | Bin 0 -> 754 bytes media/img/icons/silk/email_link.png | Bin 0 -> 821 bytes media/img/icons/silk/email_open.png | Bin 0 -> 783 bytes media/img/icons/silk/email_open_image.png | Bin 0 -> 811 bytes media/img/icons/silk/emoticon_evilgrin.png | Bin 0 -> 727 bytes media/img/icons/silk/emoticon_grin.png | Bin 0 -> 714 bytes media/img/icons/silk/emoticon_happy.png | Bin 0 -> 731 bytes media/img/icons/silk/emoticon_smile.png | Bin 0 -> 725 bytes media/img/icons/silk/emoticon_surprised.png | Bin 0 -> 741 bytes media/img/icons/silk/emoticon_tongue.png | Bin 0 -> 727 bytes media/img/icons/silk/emoticon_unhappy.png | Bin 0 -> 723 bytes media/img/icons/silk/emoticon_waii.png | Bin 0 -> 737 bytes media/img/icons/silk/emoticon_wink.png | Bin 0 -> 712 bytes media/img/icons/silk/error.png | Bin 0 -> 666 bytes media/img/icons/silk/error_add.png | Bin 0 -> 710 bytes media/img/icons/silk/error_delete.png | Bin 0 -> 729 bytes media/img/icons/silk/error_go.png | Bin 0 -> 734 bytes media/img/icons/silk/exclamation.png | Bin 0 -> 701 bytes media/img/icons/silk/eye.png | Bin 0 -> 750 bytes media/img/icons/silk/feed.png | Bin 0 -> 691 bytes media/img/icons/silk/feed_add.png | Bin 0 -> 763 bytes media/img/icons/silk/feed_delete.png | Bin 0 -> 746 bytes media/img/icons/silk/feed_disk.png | Bin 0 -> 738 bytes media/img/icons/silk/feed_edit.png | Bin 0 -> 801 bytes media/img/icons/silk/feed_error.png | Bin 0 -> 770 bytes media/img/icons/silk/feed_go.png | Bin 0 -> 761 bytes media/img/icons/silk/feed_key.png | Bin 0 -> 771 bytes media/img/icons/silk/feed_link.png | Bin 0 -> 806 bytes media/img/icons/silk/feed_magnify.png | Bin 0 -> 737 bytes media/img/icons/silk/female.png | Bin 0 -> 590 bytes media/img/icons/silk/film.png | Bin 0 -> 653 bytes media/img/icons/silk/film_add.png | Bin 0 -> 739 bytes media/img/icons/silk/film_delete.png | Bin 0 -> 730 bytes media/img/icons/silk/film_edit.png | Bin 0 -> 855 bytes media/img/icons/silk/film_error.png | Bin 0 -> 800 bytes media/img/icons/silk/film_go.png | Bin 0 -> 813 bytes media/img/icons/silk/film_key.png | Bin 0 -> 835 bytes media/img/icons/silk/film_link.png | Bin 0 -> 830 bytes media/img/icons/silk/film_save.png | Bin 0 -> 806 bytes media/img/icons/silk/find.png | Bin 0 -> 659 bytes media/img/icons/silk/flag_blue.png | Bin 0 -> 671 bytes media/img/icons/silk/flag_green.png | Bin 0 -> 672 bytes media/img/icons/silk/flag_orange.png | Bin 0 -> 669 bytes media/img/icons/silk/flag_pink.png | Bin 0 -> 651 bytes media/img/icons/silk/flag_purple.png | Bin 0 -> 656 bytes media/img/icons/silk/flag_red.png | Bin 0 -> 665 bytes media/img/icons/silk/flag_yellow.png | Bin 0 -> 671 bytes media/img/icons/silk/folder.png | Bin 0 -> 537 bytes media/img/icons/silk/folder_add.png | Bin 0 -> 668 bytes media/img/icons/silk/folder_bell.png | Bin 0 -> 781 bytes media/img/icons/silk/folder_brick.png | Bin 0 -> 735 bytes media/img/icons/silk/folder_bug.png | Bin 0 -> 829 bytes media/img/icons/silk/folder_camera.png | Bin 0 -> 729 bytes media/img/icons/silk/folder_database.png | Bin 0 -> 687 bytes media/img/icons/silk/folder_delete.png | Bin 0 -> 666 bytes media/img/icons/silk/folder_edit.png | Bin 0 -> 733 bytes media/img/icons/silk/folder_error.png | Bin 0 -> 727 bytes media/img/icons/silk/folder_explore.png | Bin 0 -> 679 bytes media/img/icons/silk/folder_feed.png | Bin 0 -> 691 bytes media/img/icons/silk/folder_find.png | Bin 0 -> 795 bytes media/img/icons/silk/folder_go.png | Bin 0 -> 694 bytes media/img/icons/silk/folder_heart.png | Bin 0 -> 741 bytes media/img/icons/silk/folder_image.png | Bin 0 -> 677 bytes media/img/icons/silk/folder_key.png | Bin 0 -> 720 bytes media/img/icons/silk/folder_lightbulb.png | Bin 0 -> 741 bytes media/img/icons/silk/folder_link.png | Bin 0 -> 785 bytes media/img/icons/silk/folder_magnify.png | Bin 0 -> 686 bytes media/img/icons/silk/folder_page.png | Bin 0 -> 688 bytes media/img/icons/silk/folder_page_white.png | Bin 0 -> 639 bytes media/img/icons/silk/folder_palette.png | Bin 0 -> 822 bytes media/img/icons/silk/folder_picture.png | Bin 0 -> 713 bytes media/img/icons/silk/folder_star.png | Bin 0 -> 755 bytes media/img/icons/silk/folder_table.png | Bin 0 -> 675 bytes media/img/icons/silk/folder_user.png | Bin 0 -> 730 bytes media/img/icons/silk/folder_wrench.png | Bin 0 -> 740 bytes media/img/icons/silk/font.png | Bin 0 -> 567 bytes media/img/icons/silk/font_add.png | Bin 0 -> 634 bytes media/img/icons/silk/font_delete.png | Bin 0 -> 661 bytes media/img/icons/silk/font_go.png | Bin 0 -> 700 bytes media/img/icons/silk/group.png | Bin 0 -> 753 bytes media/img/icons/silk/group_add.png | Bin 0 -> 807 bytes media/img/icons/silk/group_delete.png | Bin 0 -> 827 bytes media/img/icons/silk/group_edit.png | Bin 0 -> 785 bytes media/img/icons/silk/group_error.png | Bin 0 -> 842 bytes media/img/icons/silk/group_gear.png | Bin 0 -> 824 bytes media/img/icons/silk/group_go.png | Bin 0 -> 842 bytes media/img/icons/silk/group_key.png | Bin 0 -> 813 bytes media/img/icons/silk/group_link.png | Bin 0 -> 858 bytes media/img/icons/silk/heart.png | Bin 0 -> 749 bytes media/img/icons/silk/heart_add.png | Bin 0 -> 820 bytes media/img/icons/silk/heart_delete.png | Bin 0 -> 823 bytes media/img/icons/silk/help.png | Bin 0 -> 786 bytes media/img/icons/silk/hourglass.png | Bin 0 -> 744 bytes media/img/icons/silk/hourglass_add.png | Bin 0 -> 814 bytes media/img/icons/silk/hourglass_delete.png | Bin 0 -> 829 bytes media/img/icons/silk/hourglass_go.png | Bin 0 -> 866 bytes media/img/icons/silk/hourglass_link.png | Bin 0 -> 871 bytes media/img/icons/silk/house.png | Bin 0 -> 806 bytes media/img/icons/silk/house_go.png | Bin 0 -> 861 bytes media/img/icons/silk/house_link.png | Bin 0 -> 868 bytes media/img/icons/silk/html.png | Bin 0 -> 578 bytes media/img/icons/silk/html_add.png | Bin 0 -> 698 bytes media/img/icons/silk/html_delete.png | Bin 0 -> 688 bytes media/img/icons/silk/html_go.png | Bin 0 -> 692 bytes media/img/icons/silk/html_valid.png | Bin 0 -> 704 bytes media/img/icons/silk/image.png | Bin 0 -> 516 bytes media/img/icons/silk/image_add.png | Bin 0 -> 653 bytes media/img/icons/silk/image_delete.png | Bin 0 -> 653 bytes media/img/icons/silk/image_edit.png | Bin 0 -> 783 bytes media/img/icons/silk/image_link.png | Bin 0 -> 773 bytes media/img/icons/silk/images.png | Bin 0 -> 661 bytes media/img/icons/silk/information.png | Bin 0 -> 778 bytes media/img/icons/silk/ipod.png | Bin 0 -> 463 bytes media/img/icons/silk/ipod_cast.png | Bin 0 -> 711 bytes media/img/icons/silk/ipod_cast_add.png | Bin 0 -> 796 bytes media/img/icons/silk/ipod_cast_delete.png | Bin 0 -> 809 bytes media/img/icons/silk/ipod_sound.png | Bin 0 -> 678 bytes media/img/icons/silk/joystick.png | Bin 0 -> 559 bytes media/img/icons/silk/joystick_add.png | Bin 0 -> 669 bytes media/img/icons/silk/joystick_delete.png | Bin 0 -> 671 bytes media/img/icons/silk/joystick_error.png | Bin 0 -> 711 bytes media/img/icons/silk/key.png | Bin 0 -> 612 bytes media/img/icons/silk/key_add.png | Bin 0 -> 703 bytes media/img/icons/silk/key_delete.png | Bin 0 -> 724 bytes media/img/icons/silk/key_go.png | Bin 0 -> 744 bytes media/img/icons/silk/keyboard.png | Bin 0 -> 570 bytes media/img/icons/silk/keyboard_add.png | Bin 0 -> 683 bytes media/img/icons/silk/keyboard_delete.png | Bin 0 -> 681 bytes media/img/icons/silk/keyboard_magnify.png | Bin 0 -> 651 bytes media/img/icons/silk/layers.png | Bin 0 -> 597 bytes media/img/icons/silk/layout.png | Bin 0 -> 480 bytes media/img/icons/silk/layout_add.png | Bin 0 -> 577 bytes media/img/icons/silk/layout_content.png | Bin 0 -> 519 bytes media/img/icons/silk/layout_delete.png | Bin 0 -> 608 bytes media/img/icons/silk/layout_edit.png | Bin 0 -> 716 bytes media/img/icons/silk/layout_error.png | Bin 0 -> 666 bytes media/img/icons/silk/layout_header.png | Bin 0 -> 500 bytes media/img/icons/silk/layout_link.png | Bin 0 -> 660 bytes media/img/icons/silk/layout_sidebar.png | Bin 0 -> 479 bytes media/img/icons/silk/lightbulb.png | Bin 0 -> 782 bytes media/img/icons/silk/lightbulb_add.png | Bin 0 -> 839 bytes media/img/icons/silk/lightbulb_delete.png | Bin 0 -> 857 bytes media/img/icons/silk/lightbulb_off.png | Bin 0 -> 700 bytes media/img/icons/silk/lightning.png | Bin 0 -> 634 bytes media/img/icons/silk/lightning_add.png | Bin 0 -> 746 bytes media/img/icons/silk/lightning_delete.png | Bin 0 -> 745 bytes media/img/icons/silk/lightning_go.png | Bin 0 -> 739 bytes media/img/icons/silk/link.png | Bin 0 -> 343 bytes media/img/icons/silk/link_add.png | Bin 0 -> 570 bytes media/img/icons/silk/link_break.png | Bin 0 -> 657 bytes media/img/icons/silk/link_delete.png | Bin 0 -> 600 bytes media/img/icons/silk/link_edit.png | Bin 0 -> 703 bytes media/img/icons/silk/link_error.png | Bin 0 -> 698 bytes media/img/icons/silk/link_go.png | Bin 0 -> 655 bytes media/img/icons/silk/lock.png | Bin 0 -> 749 bytes media/img/icons/silk/lock_add.png | Bin 0 -> 824 bytes media/img/icons/silk/lock_break.png | Bin 0 -> 771 bytes media/img/icons/silk/lock_delete.png | Bin 0 -> 815 bytes media/img/icons/silk/lock_edit.png | Bin 0 -> 861 bytes media/img/icons/silk/lock_go.png | Bin 0 -> 829 bytes media/img/icons/silk/lock_open.png | Bin 0 -> 727 bytes media/img/icons/silk/lorry.png | Bin 0 -> 582 bytes media/img/icons/silk/lorry_add.png | Bin 0 -> 689 bytes media/img/icons/silk/lorry_delete.png | Bin 0 -> 683 bytes media/img/icons/silk/lorry_error.png | Bin 0 -> 739 bytes media/img/icons/silk/lorry_flatbed.png | Bin 0 -> 450 bytes media/img/icons/silk/lorry_go.png | Bin 0 -> 699 bytes media/img/icons/silk/lorry_link.png | Bin 0 -> 775 bytes media/img/icons/silk/magifier_zoom_out.png | Bin 0 -> 657 bytes media/img/icons/silk/magnifier.png | Bin 0 -> 615 bytes media/img/icons/silk/magnifier_zoom_in.png | Bin 0 -> 680 bytes media/img/icons/silk/male.png | Bin 0 -> 629 bytes media/img/icons/silk/map.png | Bin 0 -> 804 bytes media/img/icons/silk/map_add.png | Bin 0 -> 836 bytes media/img/icons/silk/map_delete.png | Bin 0 -> 835 bytes media/img/icons/silk/map_edit.png | Bin 0 -> 876 bytes media/img/icons/silk/map_go.png | Bin 0 -> 842 bytes media/img/icons/silk/map_magnify.png | Bin 0 -> 797 bytes media/img/icons/silk/medal_bronze_1.png | Bin 0 -> 640 bytes media/img/icons/silk/medal_bronze_2.png | Bin 0 -> 654 bytes media/img/icons/silk/medal_bronze_3.png | Bin 0 -> 646 bytes media/img/icons/silk/medal_bronze_add.png | Bin 0 -> 747 bytes media/img/icons/silk/medal_bronze_delete.png | Bin 0 -> 730 bytes media/img/icons/silk/medal_gold_1.png | Bin 0 -> 629 bytes media/img/icons/silk/medal_gold_2.png | Bin 0 -> 641 bytes media/img/icons/silk/medal_gold_3.png | Bin 0 -> 634 bytes media/img/icons/silk/medal_gold_add.png | Bin 0 -> 733 bytes media/img/icons/silk/medal_gold_delete.png | Bin 0 -> 724 bytes media/img/icons/silk/medal_silver_1.png | Bin 0 -> 589 bytes media/img/icons/silk/medal_silver_2.png | Bin 0 -> 600 bytes media/img/icons/silk/medal_silver_3.png | Bin 0 -> 597 bytes media/img/icons/silk/medal_silver_add.png | Bin 0 -> 727 bytes media/img/icons/silk/medal_silver_delete.png | Bin 0 -> 714 bytes media/img/icons/silk/money.png | Bin 0 -> 738 bytes media/img/icons/silk/money_add.png | Bin 0 -> 784 bytes media/img/icons/silk/money_delete.png | Bin 0 -> 806 bytes media/img/icons/silk/money_dollar.png | Bin 0 -> 630 bytes media/img/icons/silk/money_euro.png | Bin 0 -> 605 bytes media/img/icons/silk/money_pound.png | Bin 0 -> 565 bytes media/img/icons/silk/money_yen.png | Bin 0 -> 562 bytes media/img/icons/silk/monitor.png | Bin 0 -> 612 bytes media/img/icons/silk/monitor_add.png | Bin 0 -> 692 bytes media/img/icons/silk/monitor_delete.png | Bin 0 -> 691 bytes media/img/icons/silk/monitor_edit.png | Bin 0 -> 769 bytes media/img/icons/silk/monitor_error.png | Bin 0 -> 714 bytes media/img/icons/silk/monitor_go.png | Bin 0 -> 696 bytes media/img/icons/silk/monitor_lightning.png | Bin 0 -> 768 bytes media/img/icons/silk/monitor_link.png | Bin 0 -> 736 bytes media/img/icons/silk/mouse.png | Bin 0 -> 634 bytes media/img/icons/silk/mouse_add.png | Bin 0 -> 729 bytes media/img/icons/silk/mouse_delete.png | Bin 0 -> 741 bytes media/img/icons/silk/mouse_error.png | Bin 0 -> 790 bytes media/img/icons/silk/music.png | Bin 0 -> 385 bytes media/img/icons/silk/new.png | Bin 0 -> 378 bytes media/img/icons/silk/newspaper.png | Bin 0 -> 658 bytes media/img/icons/silk/newspaper_add.png | Bin 0 -> 750 bytes media/img/icons/silk/newspaper_delete.png | Bin 0 -> 775 bytes media/img/icons/silk/newspaper_go.png | Bin 0 -> 779 bytes media/img/icons/silk/newspaper_link.png | Bin 0 -> 787 bytes media/img/icons/silk/note.png | Bin 0 -> 500 bytes media/img/icons/silk/note_add.png | Bin 0 -> 641 bytes media/img/icons/silk/note_delete.png | Bin 0 -> 631 bytes media/img/icons/silk/note_edit.png | Bin 0 -> 731 bytes media/img/icons/silk/note_error.png | Bin 0 -> 680 bytes media/img/icons/silk/note_go.png | Bin 0 -> 661 bytes media/img/icons/silk/overlays.png | Bin 0 -> 716 bytes media/img/icons/silk/package.png | Bin 0 -> 853 bytes media/img/icons/silk/package_add.png | Bin 0 -> 899 bytes media/img/icons/silk/package_delete.png | Bin 0 -> 891 bytes media/img/icons/silk/package_go.png | Bin 0 -> 898 bytes media/img/icons/silk/package_green.png | Bin 0 -> 896 bytes media/img/icons/silk/package_link.png | Bin 0 -> 939 bytes media/img/icons/silk/page.png | Bin 0 -> 635 bytes media/img/icons/silk/page_add.png | Bin 0 -> 739 bytes media/img/icons/silk/page_attach.png | Bin 0 -> 794 bytes media/img/icons/silk/page_code.png | Bin 0 -> 818 bytes media/img/icons/silk/page_copy.png | Bin 0 -> 663 bytes media/img/icons/silk/page_delete.png | Bin 0 -> 740 bytes media/img/icons/silk/page_edit.png | Bin 0 -> 807 bytes media/img/icons/silk/page_error.png | Bin 0 -> 793 bytes media/img/icons/silk/page_excel.png | Bin 0 -> 817 bytes media/img/icons/silk/page_find.png | Bin 0 -> 879 bytes media/img/icons/silk/page_gear.png | Bin 0 -> 833 bytes media/img/icons/silk/page_go.png | Bin 0 -> 779 bytes media/img/icons/silk/page_green.png | Bin 0 -> 621 bytes media/img/icons/silk/page_key.png | Bin 0 -> 801 bytes media/img/icons/silk/page_lightning.png | Bin 0 -> 839 bytes media/img/icons/silk/page_link.png | Bin 0 -> 830 bytes media/img/icons/silk/page_paintbrush.png | Bin 0 -> 813 bytes media/img/icons/silk/page_paste.png | Bin 0 -> 703 bytes media/img/icons/silk/page_red.png | Bin 0 -> 641 bytes media/img/icons/silk/page_refresh.png | Bin 0 -> 858 bytes media/img/icons/silk/page_save.png | Bin 0 -> 774 bytes media/img/icons/silk/page_white.png | Bin 0 -> 294 bytes media/img/icons/silk/page_white_acrobat.png | Bin 0 -> 591 bytes .../icons/silk/page_white_actionscript.png | Bin 0 -> 664 bytes media/img/icons/silk/page_white_add.png | Bin 0 -> 512 bytes media/img/icons/silk/page_white_c.png | Bin 0 -> 587 bytes media/img/icons/silk/page_white_camera.png | Bin 0 -> 656 bytes media/img/icons/silk/page_white_cd.png | Bin 0 -> 666 bytes media/img/icons/silk/page_white_code.png | Bin 0 -> 603 bytes media/img/icons/silk/page_white_code_red.png | Bin 0 -> 587 bytes .../img/icons/silk/page_white_coldfusion.png | Bin 0 -> 592 bytes .../img/icons/silk/page_white_compressed.png | Bin 0 -> 724 bytes media/img/icons/silk/page_white_copy.png | Bin 0 -> 309 bytes media/img/icons/silk/page_white_cplusplus.png | Bin 0 -> 621 bytes media/img/icons/silk/page_white_csharp.png | Bin 0 -> 700 bytes media/img/icons/silk/page_white_cup.png | Bin 0 -> 639 bytes media/img/icons/silk/page_white_database.png | Bin 0 -> 579 bytes media/img/icons/silk/page_white_delete.png | Bin 0 -> 536 bytes media/img/icons/silk/page_white_dvd.png | Bin 0 -> 638 bytes media/img/icons/silk/page_white_edit.png | Bin 0 -> 618 bytes media/img/icons/silk/page_white_error.png | Bin 0 -> 623 bytes media/img/icons/silk/page_white_excel.png | Bin 0 -> 663 bytes media/img/icons/silk/page_white_find.png | Bin 0 -> 676 bytes media/img/icons/silk/page_white_flash.png | Bin 0 -> 582 bytes media/img/icons/silk/page_white_freehand.png | Bin 0 -> 639 bytes media/img/icons/silk/page_white_gear.png | Bin 0 -> 402 bytes media/img/icons/silk/page_white_get.png | Bin 0 -> 516 bytes media/img/icons/silk/page_white_go.png | Bin 0 -> 612 bytes media/img/icons/silk/page_white_h.png | Bin 0 -> 603 bytes .../img/icons/silk/page_white_horizontal.png | Bin 0 -> 296 bytes media/img/icons/silk/page_white_key.png | Bin 0 -> 616 bytes media/img/icons/silk/page_white_lightning.png | Bin 0 -> 669 bytes media/img/icons/silk/page_white_link.png | Bin 0 -> 614 bytes media/img/icons/silk/page_white_magnify.png | Bin 0 -> 554 bytes media/img/icons/silk/page_white_medal.png | Bin 0 -> 706 bytes media/img/icons/silk/page_white_office.png | Bin 0 -> 779 bytes media/img/icons/silk/page_white_paint.png | Bin 0 -> 688 bytes .../img/icons/silk/page_white_paintbrush.png | Bin 0 -> 618 bytes media/img/icons/silk/page_white_paste.png | Bin 0 -> 620 bytes media/img/icons/silk/page_white_php.png | Bin 0 -> 538 bytes media/img/icons/silk/page_white_picture.png | Bin 0 -> 650 bytes .../img/icons/silk/page_white_powerpoint.png | Bin 0 -> 588 bytes media/img/icons/silk/page_white_put.png | Bin 0 -> 523 bytes media/img/icons/silk/page_white_ruby.png | Bin 0 -> 626 bytes media/img/icons/silk/page_white_stack.png | Bin 0 -> 317 bytes media/img/icons/silk/page_white_star.png | Bin 0 -> 565 bytes media/img/icons/silk/page_white_swoosh.png | Bin 0 -> 634 bytes media/img/icons/silk/page_white_text.png | Bin 0 -> 342 bytes .../img/icons/silk/page_white_text_width.png | Bin 0 -> 315 bytes media/img/icons/silk/page_white_tux.png | Bin 0 -> 668 bytes media/img/icons/silk/page_white_vector.png | Bin 0 -> 644 bytes .../icons/silk/page_white_visualstudio.png | Bin 0 -> 702 bytes media/img/icons/silk/page_white_width.png | Bin 0 -> 309 bytes media/img/icons/silk/page_white_word.png | Bin 0 -> 651 bytes media/img/icons/silk/page_white_world.png | Bin 0 -> 734 bytes media/img/icons/silk/page_white_wrench.png | Bin 0 -> 613 bytes media/img/icons/silk/page_white_zip.png | Bin 0 -> 386 bytes media/img/icons/silk/page_word.png | Bin 0 -> 777 bytes media/img/icons/silk/page_world.png | Bin 0 -> 903 bytes media/img/icons/silk/paintbrush.png | Bin 0 -> 548 bytes media/img/icons/silk/paintcan.png | Bin 0 -> 707 bytes media/img/icons/silk/palette.png | Bin 0 -> 856 bytes media/img/icons/silk/paste_plain.png | Bin 0 -> 605 bytes media/img/icons/silk/paste_word.png | Bin 0 -> 701 bytes media/img/icons/silk/pencil.png | Bin 0 -> 450 bytes media/img/icons/silk/pencil_add.png | Bin 0 -> 589 bytes media/img/icons/silk/pencil_delete.png | Bin 0 -> 603 bytes media/img/icons/silk/pencil_go.png | Bin 0 -> 666 bytes media/img/icons/silk/phone.png | Bin 0 -> 488 bytes media/img/icons/silk/phone_add.png | Bin 0 -> 621 bytes media/img/icons/silk/phone_delete.png | Bin 0 -> 615 bytes media/img/icons/silk/phone_sound.png | Bin 0 -> 703 bytes media/img/icons/silk/photo.png | Bin 0 -> 589 bytes media/img/icons/silk/photo_add.png | Bin 0 -> 707 bytes media/img/icons/silk/photo_delete.png | Bin 0 -> 703 bytes media/img/icons/silk/photo_link.png | Bin 0 -> 784 bytes media/img/icons/silk/photos.png | Bin 0 -> 647 bytes media/img/icons/silk/picture.png | Bin 0 -> 606 bytes media/img/icons/silk/picture_add.png | Bin 0 -> 745 bytes media/img/icons/silk/picture_delete.png | Bin 0 -> 744 bytes media/img/icons/silk/picture_edit.png | Bin 0 -> 826 bytes media/img/icons/silk/picture_empty.png | Bin 0 -> 463 bytes media/img/icons/silk/picture_error.png | Bin 0 -> 755 bytes media/img/icons/silk/picture_go.png | Bin 0 -> 758 bytes media/img/icons/silk/picture_key.png | Bin 0 -> 794 bytes media/img/icons/silk/picture_link.png | Bin 0 -> 835 bytes media/img/icons/silk/picture_save.png | Bin 0 -> 755 bytes media/img/icons/silk/pictures.png | Bin 0 -> 704 bytes media/img/icons/silk/pilcrow.png | Bin 0 -> 361 bytes media/img/icons/silk/pill.png | Bin 0 -> 719 bytes media/img/icons/silk/pill_add.png | Bin 0 -> 797 bytes media/img/icons/silk/pill_delete.png | Bin 0 -> 805 bytes media/img/icons/silk/pill_go.png | Bin 0 -> 817 bytes media/img/icons/silk/plugin.png | Bin 0 -> 591 bytes media/img/icons/silk/plugin_add.png | Bin 0 -> 691 bytes media/img/icons/silk/plugin_delete.png | Bin 0 -> 692 bytes media/img/icons/silk/plugin_disabled.png | Bin 0 -> 347 bytes media/img/icons/silk/plugin_edit.png | Bin 0 -> 746 bytes media/img/icons/silk/plugin_error.png | Bin 0 -> 702 bytes media/img/icons/silk/plugin_go.png | Bin 0 -> 694 bytes media/img/icons/silk/plugin_link.png | Bin 0 -> 759 bytes media/img/icons/silk/printer.png | Bin 0 -> 731 bytes media/img/icons/silk/printer_add.png | Bin 0 -> 782 bytes media/img/icons/silk/printer_delete.png | Bin 0 -> 792 bytes media/img/icons/silk/printer_empty.png | Bin 0 -> 350 bytes media/img/icons/silk/printer_error.png | Bin 0 -> 854 bytes media/img/icons/silk/rainbow.png | Bin 0 -> 655 bytes media/img/icons/silk/report.png | Bin 0 -> 649 bytes media/img/icons/silk/report_add.png | Bin 0 -> 714 bytes media/img/icons/silk/report_delete.png | Bin 0 -> 729 bytes media/img/icons/silk/report_disk.png | Bin 0 -> 760 bytes media/img/icons/silk/report_edit.png | Bin 0 -> 762 bytes media/img/icons/silk/report_go.png | Bin 0 -> 756 bytes media/img/icons/silk/report_key.png | Bin 0 -> 760 bytes media/img/icons/silk/report_link.png | Bin 0 -> 754 bytes media/img/icons/silk/report_magnify.png | Bin 0 -> 738 bytes media/img/icons/silk/report_picture.png | Bin 0 -> 733 bytes media/img/icons/silk/report_user.png | Bin 0 -> 785 bytes media/img/icons/silk/report_word.png | Bin 0 -> 731 bytes media/img/icons/silk/resultset_first.png | Bin 0 -> 522 bytes media/img/icons/silk/resultset_last.png | Bin 0 -> 524 bytes media/img/icons/silk/resultset_next.png | Bin 0 -> 395 bytes media/img/icons/silk/resultset_previous.png | Bin 0 -> 389 bytes media/img/icons/silk/rosette.png | Bin 0 -> 673 bytes media/img/icons/silk/rss.png | Bin 0 -> 530 bytes media/img/icons/silk/rss_add.png | Bin 0 -> 649 bytes media/img/icons/silk/rss_delete.png | Bin 0 -> 633 bytes media/img/icons/silk/rss_go.png | Bin 0 -> 635 bytes media/img/icons/silk/rss_valid.png | Bin 0 -> 660 bytes media/img/icons/silk/ruby.png | Bin 0 -> 592 bytes media/img/icons/silk/ruby_add.png | Bin 0 -> 691 bytes media/img/icons/silk/ruby_delete.png | Bin 0 -> 704 bytes media/img/icons/silk/ruby_gear.png | Bin 0 -> 716 bytes media/img/icons/silk/ruby_get.png | Bin 0 -> 692 bytes media/img/icons/silk/ruby_go.png | Bin 0 -> 720 bytes media/img/icons/silk/ruby_key.png | Bin 0 -> 732 bytes media/img/icons/silk/ruby_link.png | Bin 0 -> 767 bytes media/img/icons/silk/ruby_put.png | Bin 0 -> 694 bytes media/img/icons/silk/script.png | Bin 0 -> 748 bytes media/img/icons/silk/script_add.png | Bin 0 -> 811 bytes media/img/icons/silk/script_code.png | Bin 0 -> 859 bytes media/img/icons/silk/script_code_red.png | Bin 0 -> 868 bytes media/img/icons/silk/script_delete.png | Bin 0 -> 811 bytes media/img/icons/silk/script_edit.png | Bin 0 -> 880 bytes media/img/icons/silk/script_error.png | Bin 0 -> 861 bytes media/img/icons/silk/script_gear.png | Bin 0 -> 861 bytes media/img/icons/silk/script_go.png | Bin 0 -> 839 bytes media/img/icons/silk/script_key.png | Bin 0 -> 853 bytes media/img/icons/silk/script_lightning.png | Bin 0 -> 879 bytes media/img/icons/silk/script_link.png | Bin 0 -> 876 bytes media/img/icons/silk/script_palette.png | Bin 0 -> 917 bytes media/img/icons/silk/script_save.png | Bin 0 -> 804 bytes media/img/icons/silk/server.png | Bin 0 -> 530 bytes media/img/icons/silk/server_add.png | Bin 0 -> 676 bytes media/img/icons/silk/server_chart.png | Bin 0 -> 673 bytes media/img/icons/silk/server_compressed.png | Bin 0 -> 721 bytes media/img/icons/silk/server_connect.png | Bin 0 -> 755 bytes media/img/icons/silk/server_database.png | Bin 0 -> 666 bytes media/img/icons/silk/server_delete.png | Bin 0 -> 668 bytes media/img/icons/silk/server_edit.png | Bin 0 -> 749 bytes media/img/icons/silk/server_error.png | Bin 0 -> 678 bytes media/img/icons/silk/server_go.png | Bin 0 -> 706 bytes media/img/icons/silk/server_key.png | Bin 0 -> 746 bytes media/img/icons/silk/server_lightning.png | Bin 0 -> 729 bytes media/img/icons/silk/server_link.png | Bin 0 -> 706 bytes media/img/icons/silk/server_uncompressed.png | Bin 0 -> 669 bytes media/img/icons/silk/shading.png | Bin 0 -> 225 bytes media/img/icons/silk/shape_align_bottom.png | Bin 0 -> 398 bytes media/img/icons/silk/shape_align_center.png | Bin 0 -> 384 bytes media/img/icons/silk/shape_align_left.png | Bin 0 -> 402 bytes media/img/icons/silk/shape_align_middle.png | Bin 0 -> 414 bytes media/img/icons/silk/shape_align_right.png | Bin 0 -> 401 bytes media/img/icons/silk/shape_align_top.png | Bin 0 -> 406 bytes .../img/icons/silk/shape_flip_horizontal.png | Bin 0 -> 403 bytes media/img/icons/silk/shape_flip_vertical.png | Bin 0 -> 418 bytes media/img/icons/silk/shape_group.png | Bin 0 -> 553 bytes media/img/icons/silk/shape_handles.png | Bin 0 -> 538 bytes media/img/icons/silk/shape_move_back.png | Bin 0 -> 395 bytes media/img/icons/silk/shape_move_backwards.png | Bin 0 -> 358 bytes media/img/icons/silk/shape_move_forwards.png | Bin 0 -> 381 bytes media/img/icons/silk/shape_move_front.png | Bin 0 -> 435 bytes .../icons/silk/shape_rotate_anticlockwise.png | Bin 0 -> 657 bytes .../img/icons/silk/shape_rotate_clockwise.png | Bin 0 -> 673 bytes media/img/icons/silk/shape_square.png | Bin 0 -> 353 bytes media/img/icons/silk/shape_square_add.png | Bin 0 -> 539 bytes media/img/icons/silk/shape_square_delete.png | Bin 0 -> 537 bytes media/img/icons/silk/shape_square_edit.png | Bin 0 -> 660 bytes media/img/icons/silk/shape_square_error.png | Bin 0 -> 570 bytes media/img/icons/silk/shape_square_go.png | Bin 0 -> 566 bytes media/img/icons/silk/shape_square_key.png | Bin 0 -> 607 bytes media/img/icons/silk/shape_square_link.png | Bin 0 -> 642 bytes media/img/icons/silk/shape_ungroup.png | Bin 0 -> 666 bytes media/img/icons/silk/shield.png | Bin 0 -> 702 bytes media/img/icons/silk/shield_add.png | Bin 0 -> 758 bytes media/img/icons/silk/shield_delete.png | Bin 0 -> 768 bytes media/img/icons/silk/shield_go.png | Bin 0 -> 775 bytes media/img/icons/silk/sitemap.png | Bin 0 -> 278 bytes media/img/icons/silk/sitemap_color.png | Bin 0 -> 406 bytes media/img/icons/silk/sound.png | Bin 0 -> 610 bytes media/img/icons/silk/sound_add.png | Bin 0 -> 684 bytes media/img/icons/silk/sound_delete.png | Bin 0 -> 711 bytes media/img/icons/silk/sound_low.png | Bin 0 -> 524 bytes media/img/icons/silk/sound_mute.png | Bin 0 -> 474 bytes media/img/icons/silk/sound_none.png | Bin 0 -> 417 bytes media/img/icons/silk/spellcheck.png | Bin 0 -> 603 bytes media/img/icons/silk/sport_8ball.png | Bin 0 -> 490 bytes media/img/icons/silk/sport_basketball.png | Bin 0 -> 977 bytes media/img/icons/silk/sport_football.png | Bin 0 -> 875 bytes media/img/icons/silk/sport_golf.png | Bin 0 -> 504 bytes media/img/icons/silk/sport_raquet.png | Bin 0 -> 719 bytes media/img/icons/silk/sport_shuttlecock.png | Bin 0 -> 683 bytes media/img/icons/silk/sport_soccer.png | Bin 0 -> 517 bytes media/img/icons/silk/sport_tennis.png | Bin 0 -> 884 bytes media/img/icons/silk/star.png | Bin 0 -> 670 bytes media/img/icons/silk/status_away.png | Bin 0 -> 794 bytes media/img/icons/silk/status_busy.png | Bin 0 -> 751 bytes media/img/icons/silk/status_offline.png | Bin 0 -> 422 bytes media/img/icons/silk/status_online.png | Bin 0 -> 722 bytes media/img/icons/silk/stop.png | Bin 0 -> 700 bytes media/img/icons/silk/style.png | Bin 0 -> 813 bytes media/img/icons/silk/style_add.png | Bin 0 -> 844 bytes media/img/icons/silk/style_delete.png | Bin 0 -> 865 bytes media/img/icons/silk/style_edit.png | Bin 0 -> 927 bytes media/img/icons/silk/style_go.png | Bin 0 -> 862 bytes media/img/icons/silk/sum.png | Bin 0 -> 289 bytes media/img/icons/silk/tab.png | Bin 0 -> 323 bytes media/img/icons/silk/tab_add.png | Bin 0 -> 488 bytes media/img/icons/silk/tab_delete.png | Bin 0 -> 493 bytes media/img/icons/silk/tab_edit.png | Bin 0 -> 580 bytes media/img/icons/silk/tab_go.png | Bin 0 -> 552 bytes media/img/icons/silk/table.png | Bin 0 -> 566 bytes media/img/icons/silk/table_add.png | Bin 0 -> 663 bytes media/img/icons/silk/table_delete.png | Bin 0 -> 660 bytes media/img/icons/silk/table_edit.png | Bin 0 -> 744 bytes media/img/icons/silk/table_error.png | Bin 0 -> 687 bytes media/img/icons/silk/table_gear.png | Bin 0 -> 714 bytes media/img/icons/silk/table_go.png | Bin 0 -> 683 bytes media/img/icons/silk/table_key.png | Bin 0 -> 746 bytes media/img/icons/silk/table_lightning.png | Bin 0 -> 736 bytes media/img/icons/silk/table_link.png | Bin 0 -> 728 bytes media/img/icons/silk/table_multiple.png | Bin 0 -> 612 bytes media/img/icons/silk/table_refresh.png | Bin 0 -> 795 bytes media/img/icons/silk/table_relationship.png | Bin 0 -> 663 bytes media/img/icons/silk/table_row_delete.png | Bin 0 -> 629 bytes media/img/icons/silk/table_row_insert.png | Bin 0 -> 641 bytes media/img/icons/silk/table_save.png | Bin 0 -> 723 bytes media/img/icons/silk/table_sort.png | Bin 0 -> 678 bytes media/img/icons/silk/tag.png | Bin 0 -> 389 bytes media/img/icons/silk/tag_blue.png | Bin 0 -> 586 bytes media/img/icons/silk/tag_blue_add.png | Bin 0 -> 671 bytes media/img/icons/silk/tag_blue_delete.png | Bin 0 -> 701 bytes media/img/icons/silk/tag_blue_edit.png | Bin 0 -> 748 bytes media/img/icons/silk/tag_green.png | Bin 0 -> 613 bytes media/img/icons/silk/tag_orange.png | Bin 0 -> 586 bytes media/img/icons/silk/tag_pink.png | Bin 0 -> 579 bytes media/img/icons/silk/tag_purple.png | Bin 0 -> 599 bytes media/img/icons/silk/tag_red.png | Bin 0 -> 592 bytes media/img/icons/silk/tag_yellow.png | Bin 0 -> 586 bytes media/img/icons/silk/telephone.png | Bin 0 -> 791 bytes media/img/icons/silk/telephone_add.png | Bin 0 -> 860 bytes media/img/icons/silk/telephone_delete.png | Bin 0 -> 856 bytes media/img/icons/silk/telephone_edit.png | Bin 0 -> 893 bytes media/img/icons/silk/telephone_error.png | Bin 0 -> 884 bytes media/img/icons/silk/telephone_go.png | Bin 0 -> 865 bytes media/img/icons/silk/telephone_key.png | Bin 0 -> 881 bytes media/img/icons/silk/telephone_link.png | Bin 0 -> 909 bytes media/img/icons/silk/television.png | Bin 0 -> 696 bytes media/img/icons/silk/television_add.png | Bin 0 -> 809 bytes media/img/icons/silk/television_delete.png | Bin 0 -> 810 bytes media/img/icons/silk/text_align_center.png | Bin 0 -> 234 bytes media/img/icons/silk/text_align_justify.png | Bin 0 -> 209 bytes media/img/icons/silk/text_align_left.png | Bin 0 -> 209 bytes media/img/icons/silk/text_align_right.png | Bin 0 -> 209 bytes media/img/icons/silk/text_allcaps.png | Bin 0 -> 284 bytes media/img/icons/silk/text_bold.png | Bin 0 -> 304 bytes media/img/icons/silk/text_columns.png | Bin 0 -> 246 bytes media/img/icons/silk/text_dropcaps.png | Bin 0 -> 314 bytes media/img/icons/silk/text_heading_1.png | Bin 0 -> 276 bytes media/img/icons/silk/text_heading_2.png | Bin 0 -> 304 bytes media/img/icons/silk/text_heading_3.png | Bin 0 -> 306 bytes media/img/icons/silk/text_heading_4.png | Bin 0 -> 293 bytes media/img/icons/silk/text_heading_5.png | Bin 0 -> 304 bytes media/img/icons/silk/text_heading_6.png | Bin 0 -> 310 bytes media/img/icons/silk/text_horizontalrule.png | Bin 0 -> 317 bytes media/img/icons/silk/text_indent.png | Bin 0 -> 353 bytes media/img/icons/silk/text_indent_remove.png | Bin 0 -> 351 bytes media/img/icons/silk/text_italic.png | Bin 0 -> 223 bytes media/img/icons/silk/text_kerning.png | Bin 0 -> 495 bytes media/img/icons/silk/text_letter_omega.png | Bin 0 -> 541 bytes media/img/icons/silk/text_letterspacing.png | Bin 0 -> 503 bytes media/img/icons/silk/text_linespacing.png | Bin 0 -> 363 bytes media/img/icons/silk/text_list_bullets.png | Bin 0 -> 344 bytes media/img/icons/silk/text_list_numbers.png | Bin 0 -> 357 bytes media/img/icons/silk/text_lowercase.png | Bin 0 -> 709 bytes media/img/icons/silk/text_padding_bottom.png | Bin 0 -> 237 bytes media/img/icons/silk/text_padding_left.png | Bin 0 -> 271 bytes media/img/icons/silk/text_padding_right.png | Bin 0 -> 271 bytes media/img/icons/silk/text_padding_top.png | Bin 0 -> 236 bytes media/img/icons/silk/text_replace.png | Bin 0 -> 691 bytes media/img/icons/silk/text_signature.png | Bin 0 -> 524 bytes media/img/icons/silk/text_smallcaps.png | Bin 0 -> 260 bytes media/img/icons/silk/text_strikethrough.png | Bin 0 -> 269 bytes media/img/icons/silk/text_subscript.png | Bin 0 -> 422 bytes media/img/icons/silk/text_superscript.png | Bin 0 -> 421 bytes media/img/icons/silk/text_underline.png | Bin 0 -> 273 bytes media/img/icons/silk/text_uppercase.png | Bin 0 -> 747 bytes media/img/icons/silk/textfield.png | Bin 0 -> 153 bytes media/img/icons/silk/textfield_add.png | Bin 0 -> 321 bytes media/img/icons/silk/textfield_delete.png | Bin 0 -> 335 bytes media/img/icons/silk/textfield_key.png | Bin 0 -> 455 bytes media/img/icons/silk/textfield_rename.png | Bin 0 -> 273 bytes media/img/icons/silk/thumb_down.png | Bin 0 -> 601 bytes media/img/icons/silk/thumb_up.png | Bin 0 -> 619 bytes media/img/icons/silk/tick.png | Bin 0 -> 537 bytes media/img/icons/silk/time.png | Bin 0 -> 793 bytes media/img/icons/silk/time_add.png | Bin 0 -> 827 bytes media/img/icons/silk/time_delete.png | Bin 0 -> 853 bytes media/img/icons/silk/time_go.png | Bin 0 -> 882 bytes media/img/icons/silk/timeline_marker.png | Bin 0 -> 327 bytes media/img/icons/silk/transmit.png | Bin 0 -> 749 bytes media/img/icons/silk/transmit_add.png | Bin 0 -> 803 bytes media/img/icons/silk/transmit_blue.png | Bin 0 -> 814 bytes media/img/icons/silk/transmit_delete.png | Bin 0 -> 827 bytes media/img/icons/silk/transmit_edit.png | Bin 0 -> 848 bytes media/img/icons/silk/transmit_error.png | Bin 0 -> 883 bytes media/img/icons/silk/transmit_go.png | Bin 0 -> 842 bytes media/img/icons/silk/tux.png | Bin 0 -> 696 bytes media/img/icons/silk/user.png | Bin 0 -> 741 bytes media/img/icons/silk/user_add.png | Bin 0 -> 746 bytes media/img/icons/silk/user_comment.png | Bin 0 -> 743 bytes media/img/icons/silk/user_delete.png | Bin 0 -> 767 bytes media/img/icons/silk/user_edit.png | Bin 0 -> 833 bytes media/img/icons/silk/user_female.png | Bin 0 -> 663 bytes media/img/icons/silk/user_go.png | Bin 0 -> 793 bytes media/img/icons/silk/user_gray.png | Bin 0 -> 706 bytes media/img/icons/silk/user_green.png | Bin 0 -> 722 bytes media/img/icons/silk/user_orange.png | Bin 0 -> 723 bytes media/img/icons/silk/user_red.png | Bin 0 -> 717 bytes media/img/icons/silk/user_suit.png | Bin 0 -> 748 bytes media/img/icons/silk/vcard.png | Bin 0 -> 533 bytes media/img/icons/silk/vcard_add.png | Bin 0 -> 661 bytes media/img/icons/silk/vcard_delete.png | Bin 0 -> 651 bytes media/img/icons/silk/vcard_edit.png | Bin 0 -> 775 bytes media/img/icons/silk/vector.png | Bin 0 -> 481 bytes media/img/icons/silk/vector_add.png | Bin 0 -> 616 bytes media/img/icons/silk/vector_delete.png | Bin 0 -> 635 bytes media/img/icons/silk/wand.png | Bin 0 -> 570 bytes media/img/icons/silk/weather_clouds.png | Bin 0 -> 581 bytes media/img/icons/silk/weather_cloudy.png | Bin 0 -> 694 bytes media/img/icons/silk/weather_lightning.png | Bin 0 -> 641 bytes media/img/icons/silk/weather_rain.png | Bin 0 -> 626 bytes media/img/icons/silk/weather_snow.png | Bin 0 -> 341 bytes media/img/icons/silk/weather_sun.png | Bin 0 -> 623 bytes media/img/icons/silk/webcam.png | Bin 0 -> 728 bytes media/img/icons/silk/webcam_add.png | Bin 0 -> 786 bytes media/img/icons/silk/webcam_delete.png | Bin 0 -> 805 bytes media/img/icons/silk/webcam_error.png | Bin 0 -> 821 bytes media/img/icons/silk/world.png | Bin 0 -> 923 bytes media/img/icons/silk/world_add.png | Bin 0 -> 940 bytes media/img/icons/silk/world_delete.png | Bin 0 -> 945 bytes media/img/icons/silk/world_edit.png | Bin 0 -> 945 bytes media/img/icons/silk/world_go.png | Bin 0 -> 944 bytes media/img/icons/silk/world_link.png | Bin 0 -> 957 bytes media/img/icons/silk/wrench.png | Bin 0 -> 610 bytes media/img/icons/silk/wrench_orange.png | Bin 0 -> 584 bytes media/img/icons/silk/xhtml.png | Bin 0 -> 595 bytes media/img/icons/silk/xhtml_add.png | Bin 0 -> 703 bytes media/img/icons/silk/xhtml_delete.png | Bin 0 -> 696 bytes media/img/icons/silk/xhtml_go.png | Bin 0 -> 697 bytes media/img/icons/silk/xhtml_valid.png | Bin 0 -> 718 bytes media/img/icons/silk/zoom.png | Bin 0 -> 692 bytes media/img/icons/silk/zoom_in.png | Bin 0 -> 725 bytes media/img/icons/silk/zoom_out.png | Bin 0 -> 708 bytes media/img/icons/things/bars.gif | Bin 0 -> 961 bytes media/img/icons/things/bars.png | Bin 0 -> 249 bytes media/img/icons/things/bomb.gif | Bin 0 -> 913 bytes media/img/icons/things/bomb.png | Bin 0 -> 353 bytes media/img/icons/things/briefcase.gif | Bin 0 -> 915 bytes media/img/icons/things/briefcase.png | Bin 0 -> 268 bytes media/img/icons/things/calendar.gif | Bin 0 -> 927 bytes media/img/icons/things/calendar.png | Bin 0 -> 259 bytes media/img/icons/things/cart.gif | Bin 0 -> 905 bytes media/img/icons/things/cart.png | Bin 0 -> 294 bytes media/img/icons/things/caution.gif | Bin 0 -> 912 bytes media/img/icons/things/caution.png | Bin 0 -> 290 bytes media/img/icons/things/clock.gif | Bin 0 -> 934 bytes media/img/icons/things/clock.png | Bin 0 -> 332 bytes media/img/icons/things/comment.gif | Bin 0 -> 915 bytes media/img/icons/things/comment.png | Bin 0 -> 337 bytes media/img/icons/things/detour.gif | Bin 0 -> 906 bytes media/img/icons/things/detour.png | Bin 0 -> 258 bytes media/img/icons/things/document-new.gif | Bin 0 -> 929 bytes media/img/icons/things/document-new.png | Bin 0 -> 278 bytes media/img/icons/things/document-txt-new.gif | Bin 0 -> 925 bytes media/img/icons/things/document-txt-new.png | Bin 0 -> 356 bytes media/img/icons/things/document-txt.gif | Bin 0 -> 916 bytes media/img/icons/things/document-txt.png | Bin 0 -> 289 bytes media/img/icons/things/document.gif | Bin 0 -> 916 bytes media/img/icons/things/document.png | Bin 0 -> 198 bytes media/img/icons/things/documents.gif | Bin 0 -> 923 bytes media/img/icons/things/documents.png | Bin 0 -> 330 bytes media/img/icons/things/folder.gif | Bin 0 -> 931 bytes media/img/icons/things/folder.png | Bin 0 -> 242 bytes media/img/icons/things/gear.gif | Bin 0 -> 925 bytes media/img/icons/things/gear.png | Bin 0 -> 360 bytes media/img/icons/things/heart.gif | Bin 0 -> 902 bytes media/img/icons/things/heart.png | Bin 0 -> 272 bytes media/img/icons/things/house.gif | Bin 0 -> 943 bytes media/img/icons/things/house.png | Bin 0 -> 406 bytes media/img/icons/things/icons.gif | Bin 0 -> 943 bytes media/img/icons/things/icons.png | Bin 0 -> 354 bytes media/img/icons/things/key-yellow.gif | Bin 0 -> 900 bytes media/img/icons/things/key-yellow.png | Bin 0 -> 324 bytes media/img/icons/things/lightbulb.gif | Bin 0 -> 915 bytes media/img/icons/things/lightbulb.png | Bin 0 -> 314 bytes media/img/icons/things/mail.gif | Bin 0 -> 933 bytes media/img/icons/things/mail.png | Bin 0 -> 320 bytes media/img/icons/things/musicnote.gif | Bin 0 -> 889 bytes media/img/icons/things/musicnote.png | Bin 0 -> 280 bytes media/img/icons/things/people.gif | Bin 0 -> 907 bytes media/img/icons/things/people.png | Bin 0 -> 316 bytes media/img/icons/things/person.gif | Bin 0 -> 907 bytes media/img/icons/things/person.png | Bin 0 -> 285 bytes media/img/icons/things/picture.gif | Bin 0 -> 902 bytes media/img/icons/things/picture.png | Bin 0 -> 245 bytes media/img/icons/things/polaroid.gif | Bin 0 -> 924 bytes media/img/icons/things/polaroid.png | Bin 0 -> 278 bytes media/img/icons/things/popcorn.gif | Bin 0 -> 952 bytes media/img/icons/things/popcorn.png | Bin 0 -> 328 bytes media/img/icons/things/rss.gif | Bin 0 -> 933 bytes media/img/icons/things/rss.png | Bin 0 -> 325 bytes media/img/icons/things/write.gif | Bin 0 -> 930 bytes media/img/icons/things/write.png | Bin 0 -> 359 bytes media/img/icons/weather/clouded.gif | Bin 0 -> 902 bytes media/img/icons/weather/clouded.png | Bin 0 -> 303 bytes media/img/icons/weather/cloudy.gif | Bin 0 -> 936 bytes media/img/icons/weather/cloudy.png | Bin 0 -> 423 bytes media/img/icons/weather/extreme-weather.gif | Bin 0 -> 945 bytes media/img/icons/weather/extreme-weather.png | Bin 0 -> 427 bytes media/img/icons/weather/lightning.gif | Bin 0 -> 882 bytes media/img/icons/weather/lightning.png | Bin 0 -> 252 bytes media/img/icons/weather/raining.gif | Bin 0 -> 920 bytes media/img/icons/weather/raining.png | Bin 0 -> 360 bytes media/img/icons/weather/star.gif | Bin 0 -> 898 bytes media/img/icons/weather/star.png | Bin 0 -> 278 bytes media/img/icons/weather/stormy.gif | Bin 0 -> 934 bytes media/img/icons/weather/stormy.png | Bin 0 -> 405 bytes media/img/icons/weather/sunny.gif | Bin 0 -> 913 bytes media/img/icons/weather/sunny.png | Bin 0 -> 348 bytes media/img/reader/resize_north.png | Bin 0 -> 328 bytes media/img/reader/resize_west.png | Bin 0 -> 389 bytes media/img/reader/resize_west_small.png | Bin 0 -> 214 bytes media/img/reader/taskbar_background.png | Bin 0 -> 378 bytes media/img/reader/user.png | Bin 0 -> 513 bytes media/js/facebox/README.txt | 4 + media/js/facebox/b.png | Bin 0 -> 84 bytes media/js/facebox/bl.png | Bin 0 -> 124 bytes media/js/facebox/br.png | Bin 0 -> 124 bytes media/js/facebox/closelabel.gif | Bin 0 -> 979 bytes media/js/facebox/facebox.css | 95 + media/js/facebox/facebox.js | 319 + media/js/facebox/loading.gif | Bin 0 -> 2767 bytes media/js/facebox/tl.png | Bin 0 -> 132 bytes media/js/facebox/tr.png | Bin 0 -> 125 bytes media/js/jquery-1.3.2.min.js | 19 + media/js/jquery-ui-personalized-1.6rc6.js | 2736 ++++++ media/js/jquery-ui-personalized-1.6rc6.min.js | 50 + media/js/jquery.corners.js | 405 + media/js/jquery.hotkeys.js | 244 + media/js/jquery.js | 4241 +++++++++ media/js/jquery.layout.js | 2507 ++++++ media/js/jquery.layout.min.js | 80 + media/js/jquery.newsblur.js | 264 + media/js/jquery.scrollTo.js | 207 + media/js/jquery.timers.js | 147 + media/js/jquery.ui.all.js | 7600 +++++++++++++++++ media/js/newsblur/assetmodel.js | 165 + media/js/newsblur/reader.js | 517 ++ .../222222_11x11_icon_arrows_leftright.gif | Bin 0 -> 58 bytes .../222222_11x11_icon_arrows_updown.gif | Bin 0 -> 56 bytes media/theme/images/222222_11x11_icon_doc.gif | Bin 0 -> 64 bytes .../theme/images/222222_11x11_icon_minus.gif | Bin 0 -> 56 bytes media/theme/images/222222_11x11_icon_plus.gif | Bin 0 -> 61 bytes .../images/222222_11x11_icon_resize_se.gif | Bin 0 -> 61 bytes media/theme/images/222222_7x7_arrow_down.gif | Bin 0 -> 52 bytes media/theme/images/222222_7x7_arrow_left.gif | Bin 0 -> 53 bytes media/theme/images/222222_7x7_arrow_right.gif | Bin 0 -> 53 bytes media/theme/images/222222_7x7_arrow_up.gif | Bin 0 -> 52 bytes .../454545_11x11_icon_arrows_leftright.gif | Bin 0 -> 58 bytes .../454545_11x11_icon_arrows_updown.gif | Bin 0 -> 56 bytes .../theme/images/454545_11x11_icon_close.gif | Bin 0 -> 62 bytes media/theme/images/454545_11x11_icon_doc.gif | Bin 0 -> 64 bytes .../454545_11x11_icon_folder_closed.gif | Bin 0 -> 61 bytes .../images/454545_11x11_icon_folder_open.gif | Bin 0 -> 61 bytes .../theme/images/454545_11x11_icon_minus.gif | Bin 0 -> 56 bytes media/theme/images/454545_11x11_icon_plus.gif | Bin 0 -> 61 bytes media/theme/images/454545_7x7_arrow_down.gif | Bin 0 -> 52 bytes media/theme/images/454545_7x7_arrow_left.gif | Bin 0 -> 53 bytes media/theme/images/454545_7x7_arrow_right.gif | Bin 0 -> 53 bytes media/theme/images/454545_7x7_arrow_up.gif | Bin 0 -> 52 bytes .../888888_11x11_icon_arrows_leftright.gif | Bin 0 -> 58 bytes .../888888_11x11_icon_arrows_updown.gif | Bin 0 -> 56 bytes .../theme/images/888888_11x11_icon_close.gif | Bin 0 -> 62 bytes media/theme/images/888888_11x11_icon_doc.gif | Bin 0 -> 64 bytes .../888888_11x11_icon_folder_closed.gif | Bin 0 -> 61 bytes .../images/888888_11x11_icon_folder_open.gif | Bin 0 -> 61 bytes .../theme/images/888888_11x11_icon_minus.gif | Bin 0 -> 56 bytes media/theme/images/888888_11x11_icon_plus.gif | Bin 0 -> 61 bytes media/theme/images/888888_7x7_arrow_down.gif | Bin 0 -> 52 bytes media/theme/images/888888_7x7_arrow_left.gif | Bin 0 -> 53 bytes media/theme/images/888888_7x7_arrow_right.gif | Bin 0 -> 53 bytes media/theme/images/888888_7x7_arrow_up.gif | Bin 0 -> 52 bytes ...a_40x100_textures_03_highlight_soft_75.png | Bin 0 -> 210 bytes ...6_40x100_textures_03_highlight_soft_75.png | Bin 0 -> 211 bytes .../ffffff_40x100_textures_01_flat_75.png | Bin 0 -> 178 bytes ...f_40x100_textures_03_highlight_soft_65.png | Bin 0 -> 215 bytes .../ui-bg_highlight-hard_35_f6a828_1x100.png | Bin 0 -> 116 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 129 bytes media/theme/ui.theme.css | 607 ++ settings.py | 122 + templates/base.html | 48 + templates/globals.html | 7 + templates/opml_import/import.xhtml | 23 + templates/reader/feeds.xhtml | 46 + templates/registration/activate.html | 13 + templates/registration/activation_email.txt | 3 + .../registration/activation_email_subject.txt | 1 + templates/registration/login.html | 19 + .../registration/registration_complete.html | 13 + templates/registration/registration_form.html | 56 + urls.py | 26 + utils/__init__.py | 0 utils/cache/__init__.py | 2 + utils/cache/base.py | 166 + utils/cache/exceptions.py | 19 + utils/cache/manager.py | 28 + utils/cache/query.py | 303 + utils/cache/utils.py | 2 + utils/dateutil/__init__.py | 9 + utils/dateutil/easter.py | 92 + utils/dateutil/parser.py | 886 ++ utils/dateutil/relativedelta.py | 432 + utils/dateutil/rrule.py | 1097 +++ utils/dateutil/tz.py | 951 +++ utils/dateutil/tzwin.py | 180 + utils/dateutil/zoneinfo/__init__.py | 87 + utils/dateutil/zoneinfo/zoneinfo-2008e.tar.gz | Bin 0 -> 163209 bytes utils/diff.py | 145 + utils/django_command_extensions/LICENSE | 19 + utils/django_command_extensions/MANIFEST.in | 3 + utils/django_command_extensions/__init__.py | 0 .../build/lib/django_extensions/__init__.py | 10 + .../lib/django_extensions/admin/__init__.py | 122 + .../lib/django_extensions/admin/widgets.py | 76 + .../lib/django_extensions/db/__init__.py | 0 .../django_extensions/db/fields/__init__.py | 199 + .../build/lib/django_extensions/db/models.py | 17 + .../lib/django_extensions/jobs/__init__.py | 0 .../django_extensions/jobs/daily/__init__.py | 0 .../jobs/daily/cache_cleanup.py | 23 + .../jobs/daily/daily_cleanup.py | 22 + .../django_extensions/jobs/hourly/__init__.py | 0 .../jobs/monthly/__init__.py | 0 .../django_extensions/jobs/weekly/__init__.py | 0 .../django_extensions/management/__init__.py | 0 .../lib/django_extensions/management/color.py | 13 + .../management/commands/__init__.py | 0 .../management/commands/clean_pyc.py | 41 + .../management/commands/compile_pyc.py | 40 + .../management/commands/create_app.py | 72 + .../management/commands/create_command.py | 78 + .../management/commands/create_jobs.py | 54 + .../management/commands/describe_form.py | 64 + .../management/commands/dumpscript.py | 515 ++ .../management/commands/export_emails.py | 114 + .../commands/generate_secret_key.py | 10 + .../management/commands/graph_models.py | 60 + .../management/commands/mail_debug.py | 41 + .../management/commands/passwd.py | 37 + .../commands/print_user_for_session.py | 49 + .../management/commands/reset_db.py | 117 + .../management/commands/runjob.py | 59 + .../management/commands/runjobs.py | 90 + .../management/commands/runprofileserver.py | 213 + .../management/commands/runscript.py | 95 + .../management/commands/runserver_plus.py | 75 + .../management/commands/set_fake_emails.py | 76 + .../management/commands/set_fake_passwords.py | 44 + .../management/commands/shell_plus.py | 77 + .../management/commands/show_urls.py | 45 + .../management/commands/sqldiff.py | 276 + .../management/commands/sync_media_s3.py | 249 + .../management/commands/syncdata.py | 221 + .../lib/django_extensions/management/jobs.py | 154 + .../django_extensions/management/modelviz.py | 287 + .../django_extensions/management/signals.py | 9 + .../lib/django_extensions/management/utils.py | 7 + .../templatetags/__init__.py | 0 .../templatetags/syntax_color.py | 77 + .../templatetags/truncate_letters.py | 21 + .../lib/django_extensions/utils/__init__.py | 0 .../build/lib/django_extensions/utils/text.py | 13 + .../build/lib/django_extensions/utils/uuid.py | 541 ++ .../django_extensions/__init__.py | 10 + .../django_extensions/admin/__init__.py | 122 + .../django_extensions/admin/widgets.py | 76 + .../conf/app_template/__init__.py.tmpl | 0 .../conf/app_template/forms.py.tmpl | 3 + .../conf/app_template/models.py.tmpl | 3 + .../conf/app_template/urls.py.tmpl | 3 + .../conf/app_template/views.py.tmpl | 1 + .../management/__init__.py.tmpl | 0 .../management/commands/__init__.py.tmpl | 0 .../management/commands/sample.py.tmpl | 7 + .../conf/jobs_template/jobs/__init__.py.tmpl | 0 .../jobs_template/jobs/daily/__init__.py.tmpl | 0 .../jobs/hourly/__init__.py.tmpl | 0 .../jobs/monthly/__init__.py.tmpl | 0 .../conf/jobs_template/jobs/sample.py.tmpl | 8 + .../jobs/weekly/__init__.py.tmpl | 0 .../django_extensions/db/__init__.py | 0 .../django_extensions/db/fields/__init__.py | 199 + .../django_extensions/db/models.py | 17 + .../django_extensions/jobs/__init__.py | 0 .../django_extensions/jobs/daily/__init__.py | 0 .../jobs/daily/cache_cleanup.py | 23 + .../jobs/daily/daily_cleanup.py | 22 + .../django_extensions/jobs/hourly/__init__.py | 0 .../jobs/monthly/__init__.py | 0 .../django_extensions/jobs/weekly/__init__.py | 0 .../django_extensions/management/__init__.py | 0 .../django_extensions/management/color.py | 13 + .../management/commands/__init__.py | 0 .../management/commands/clean_pyc.py | 41 + .../management/commands/compile_pyc.py | 40 + .../management/commands/create_app.py | 72 + .../management/commands/create_command.py | 78 + .../management/commands/create_jobs.py | 54 + .../management/commands/describe_form.py | 64 + .../management/commands/dumpscript.py | 515 ++ .../management/commands/export_emails.py | 114 + .../commands/generate_secret_key.py | 10 + .../management/commands/graph_models.py | 60 + .../management/commands/mail_debug.py | 41 + .../management/commands/passwd.py | 37 + .../commands/print_user_for_session.py | 49 + .../management/commands/reset_db.py | 117 + .../management/commands/runjob.py | 59 + .../management/commands/runjobs.py | 90 + .../management/commands/runprofileserver.py | 213 + .../management/commands/runscript.py | 95 + .../management/commands/runserver_plus.py | 75 + .../management/commands/set_fake_emails.py | 76 + .../management/commands/set_fake_passwords.py | 44 + .../management/commands/shell_plus.py | 77 + .../management/commands/show_urls.py | 45 + .../management/commands/sqldiff.py | 276 + .../management/commands/sync_media_s3.py | 249 + .../management/commands/syncdata.py | 221 + .../django_extensions/management/jobs.py | 154 + .../django_extensions/management/modelviz.py | 287 + .../django_extensions/management/signals.py | 9 + .../django_extensions/management/utils.py | 7 + .../css/jquery.autocomplete.css | 43 + .../media/django_extensions/img/indicator.gif | Bin 0 -> 1553 bytes .../django_extensions/js/jquery.ajaxQueue.js | 116 + .../js/jquery.autocomplete.js | 759 ++ .../js/jquery.bgiframe.min.js | 10 + .../media/django_extensions/js/jquery.js | 3558 ++++++++ .../widgets/foreignkey_searchinput.html | 60 + .../templatetags/__init__.py | 0 .../templatetags/syntax_color.py | 77 + .../templatetags/truncate_letters.py | 21 + .../django_extensions/utils/__init__.py | 0 .../django_extensions/utils/text.py | 13 + .../django_extensions/utils/uuid.py | 541 ++ utils/django_command_extensions/docs/AUTHORS | 13 + utils/django_command_extensions/setup.py | 76 + utils/feed_functions.py | 26 + utils/feedcache/.feedcache | Bin 0 -> 12288 bytes utils/feedcache/__init__.py | 44 + utils/feedcache/cache.py | 198 + utils/feedcache/cachestoragelock.py | 69 + utils/feedcache/example.py | 63 + utils/feedcache/example_threads.py | 144 + utils/feedcache/test_cache.py | 325 + utils/feedcache/test_cachestoragelock.py | 90 + utils/feedcache/test_server.py | 236 + utils/feedcache/test_shovefilesystem.py | 89 + utils/feedcache/threading_model.py | 102 + utils/feedparser.py | 3612 ++++++++ utils/feeds.py | 78 + utils/json.py | 70 + utils/object_manager.py | 26 + utils/opml/README | 78 + utils/opml/__init__.py | 70 + utils/opml/tests.py | 29 + utils/story_functions.py | 29 + utils/user_functions.py | 8 + 1668 files changed, 46719 insertions(+) create mode 100644 README create mode 100644 __init__.py create mode 100644 apps/__init__.py create mode 100644 apps/analyzer/__init__.py create mode 100644 apps/analyzer/models.py create mode 100644 apps/analyzer/views.py create mode 100644 apps/opml_import/__init__.py create mode 100644 apps/opml_import/models.py create mode 100644 apps/opml_import/urls.py create mode 100644 apps/opml_import/views.py create mode 100644 apps/profile/__init__.py create mode 100644 apps/profile/models.py create mode 100644 apps/profile/views.py create mode 100644 apps/reader/__init__.py create mode 100644 apps/reader/admin.py create mode 100644 apps/reader/models.py create mode 100644 apps/reader/urls.py create mode 100644 apps/reader/views.py create mode 100644 apps/registration/__init__.py create mode 100644 apps/registration/admin.py create mode 100644 apps/registration/docs/forms.txt create mode 100644 apps/registration/docs/models.txt create mode 100644 apps/registration/docs/overview.txt create mode 100644 apps/registration/docs/views.txt create mode 100644 apps/registration/forms.py create mode 100644 apps/registration/management/__init__.py create mode 100644 apps/registration/management/commands/__init__.py create mode 100644 apps/registration/management/commands/cleanupregistration.py create mode 100644 apps/registration/models.py create mode 100644 apps/registration/tests.py create mode 100644 apps/registration/urls.py create mode 100644 apps/registration/views.py create mode 100644 apps/rss_feeds/__init__.py create mode 100644 apps/rss_feeds/admin.py create mode 100644 apps/rss_feeds/models.py create mode 100644 apps/rss_feeds/tests.py create mode 100644 apps/rss_feeds/views.py create mode 100755 manage.py create mode 100644 media/css/reader.css create mode 100755 media/img/icons/actions/add-user.gif create mode 100755 media/img/icons/actions/add-user.png create mode 100755 media/img/icons/actions/add.gif create mode 100755 media/img/icons/actions/add.png create mode 100755 media/img/icons/actions/arrow-down.gif create mode 100755 media/img/icons/actions/arrow-down.png create mode 100755 media/img/icons/actions/arrow-left.gif create mode 100755 media/img/icons/actions/arrow-left.png create mode 100755 media/img/icons/actions/arrow-right.gif create mode 100755 media/img/icons/actions/arrow-right.png create mode 100755 media/img/icons/actions/arrow-up.gif create mode 100755 media/img/icons/actions/arrow-up.png create mode 100755 media/img/icons/actions/button-bold.gif create mode 100755 media/img/icons/actions/button-bold.png create mode 100755 media/img/icons/actions/button-italic.gif create mode 100755 media/img/icons/actions/button-italic.png create mode 100755 media/img/icons/actions/button-underline.gif create mode 100755 media/img/icons/actions/button-underline.png create mode 100755 media/img/icons/actions/button.gif create mode 100755 media/img/icons/actions/button.png create mode 100755 media/img/icons/actions/cancel.gif create mode 100755 media/img/icons/actions/cancel.png create mode 100755 media/img/icons/actions/clipboard.gif create mode 100755 media/img/icons/actions/clipboard.png create mode 100755 media/img/icons/actions/copy.gif create mode 100755 media/img/icons/actions/copy.png create mode 100755 media/img/icons/actions/cut.gif create mode 100755 media/img/icons/actions/cut.png create mode 100755 media/img/icons/actions/delete-user.gif create mode 100755 media/img/icons/actions/delete-user.png create mode 100755 media/img/icons/actions/forbidden-alt.gif create mode 100755 media/img/icons/actions/forbidden-alt.png create mode 100755 media/img/icons/actions/forbidden.gif create mode 100755 media/img/icons/actions/forbidden.png create mode 100755 media/img/icons/actions/info.gif create mode 100755 media/img/icons/actions/info.png create mode 100755 media/img/icons/actions/lock.gif create mode 100755 media/img/icons/actions/lock.png create mode 100755 media/img/icons/actions/mail-new.gif create mode 100755 media/img/icons/actions/mail-new.png create mode 100755 media/img/icons/actions/ok.gif create mode 100755 media/img/icons/actions/ok.png create mode 100755 media/img/icons/actions/paste.gif create mode 100755 media/img/icons/actions/paste.png create mode 100755 media/img/icons/actions/refresh.gif create mode 100755 media/img/icons/actions/refresh.png create mode 100755 media/img/icons/actions/search.gif create mode 100755 media/img/icons/actions/search.png create mode 100755 media/img/icons/actions/splitwindow.gif create mode 100755 media/img/icons/actions/splitwindow.png create mode 100755 media/img/icons/actions/stop.gif create mode 100755 media/img/icons/actions/stop.png create mode 100755 media/img/icons/actions/subtract.gif create mode 100755 media/img/icons/actions/subtract.png create mode 100755 media/img/icons/actions/tab-new.gif create mode 100755 media/img/icons/actions/tab-new.png create mode 100755 media/img/icons/actions/tab.gif create mode 100755 media/img/icons/actions/tab.png create mode 100755 media/img/icons/actions/tabs-new.gif create mode 100755 media/img/icons/actions/tabs-new.png create mode 100755 media/img/icons/actions/tabs.gif create mode 100755 media/img/icons/actions/tabs.png create mode 100755 media/img/icons/actions/unlock.gif create mode 100755 media/img/icons/actions/unlock.png create mode 100755 media/img/icons/actions/window-new.gif create mode 100755 media/img/icons/actions/window-new.png create mode 100755 media/img/icons/actions/window-resize.gif create mode 100755 media/img/icons/actions/window-resize.png create mode 100755 media/img/icons/actions/window.gif create mode 100755 media/img/icons/actions/window.png create mode 100755 media/img/icons/actions/windows.gif create mode 100755 media/img/icons/actions/windows.png create mode 100755 media/img/icons/actions/wrench.gif create mode 100755 media/img/icons/actions/wrench.png create mode 100755 media/img/icons/actions/zoom-in.gif create mode 100755 media/img/icons/actions/zoom-in.png create mode 100755 media/img/icons/actions/zoom-out.gif create mode 100755 media/img/icons/actions/zoom-out.png create mode 100755 media/img/icons/flags/flag-austria.gif create mode 100755 media/img/icons/flags/flag-austria.png create mode 100755 media/img/icons/flags/flag-belgium.gif create mode 100755 media/img/icons/flags/flag-belgium.png create mode 100755 media/img/icons/flags/flag-bulgaria.gif create mode 100755 media/img/icons/flags/flag-bulgaria.png create mode 100755 media/img/icons/flags/flag-czech-republic.gif create mode 100755 media/img/icons/flags/flag-czech-republic.png create mode 100755 media/img/icons/flags/flag-denmark.gif create mode 100755 media/img/icons/flags/flag-denmark.png create mode 100755 media/img/icons/flags/flag-estonia.gif create mode 100755 media/img/icons/flags/flag-estonia.png create mode 100755 media/img/icons/flags/flag-france.gif create mode 100755 media/img/icons/flags/flag-france.png create mode 100755 media/img/icons/flags/flag-germany.gif create mode 100755 media/img/icons/flags/flag-germany.png create mode 100755 media/img/icons/flags/flag-greece.gif create mode 100755 media/img/icons/flags/flag-greece.png create mode 100755 media/img/icons/flags/flag-holland.gif create mode 100755 media/img/icons/flags/flag-holland.png create mode 100755 media/img/icons/flags/flag-hungary.gif create mode 100755 media/img/icons/flags/flag-hungary.png create mode 100755 media/img/icons/flags/flag-ireland.gif create mode 100755 media/img/icons/flags/flag-ireland.png create mode 100755 media/img/icons/flags/flag-italy.gif create mode 100755 media/img/icons/flags/flag-italy.png create mode 100755 media/img/icons/flags/flag-luxemburg.gif create mode 100755 media/img/icons/flags/flag-luxemburg.png create mode 100755 media/img/icons/flags/flag-rumania.gif create mode 100755 media/img/icons/flags/flag-rumania.png create mode 100755 media/img/icons/flags/flag-spain.gif create mode 100755 media/img/icons/flags/flag-spain.png create mode 100755 media/img/icons/flags/flag-turkey.gif create mode 100755 media/img/icons/flags/flag-turkey.png create mode 100755 media/img/icons/media-devices/camera.gif create mode 100755 media/img/icons/media-devices/camera.png create mode 100755 media/img/icons/media-devices/cellphone.gif create mode 100755 media/img/icons/media-devices/cellphone.png create mode 100755 media/img/icons/media-devices/floppy.gif create mode 100755 media/img/icons/media-devices/floppy.png create mode 100755 media/img/icons/media-devices/headphones.gif create mode 100755 media/img/icons/media-devices/headphones.png create mode 100755 media/img/icons/media-devices/imac.gif create mode 100755 media/img/icons/media-devices/imac.png create mode 100755 media/img/icons/media-devices/ipod.gif create mode 100755 media/img/icons/media-devices/ipod.png create mode 100755 media/img/icons/media-devices/joystick.gif create mode 100755 media/img/icons/media-devices/joystick.png create mode 100755 media/img/icons/media-devices/microphone-vintage.gif create mode 100755 media/img/icons/media-devices/microphone-vintage.png create mode 100755 media/img/icons/media-devices/microphone.gif create mode 100755 media/img/icons/media-devices/microphone.png create mode 100755 media/img/icons/media-devices/mobile.gif create mode 100755 media/img/icons/media-devices/mobile.png create mode 100755 media/img/icons/media-devices/movie.gif create mode 100755 media/img/icons/media-devices/movie.png create mode 100755 media/img/icons/media-devices/pc.gif create mode 100755 media/img/icons/media-devices/pc.png create mode 100755 media/img/icons/media-devices/printer.gif create mode 100755 media/img/icons/media-devices/printer.png create mode 100755 media/img/icons/media-devices/rom.gif create mode 100755 media/img/icons/media-devices/rom.png create mode 100755 media/img/icons/media-devices/screen.gif create mode 100755 media/img/icons/media-devices/screen.png create mode 100755 media/img/icons/media-devices/signal.gif create mode 100755 media/img/icons/media-devices/signal.png create mode 100755 media/img/icons/media-devices/tv.gif create mode 100755 media/img/icons/media-devices/tv.png create mode 100755 media/img/icons/media-devices/usb-stick-blue.gif create mode 100755 media/img/icons/media-devices/usb-stick-blue.png create mode 100755 media/img/icons/media-devices/usb-stick-green.gif create mode 100755 media/img/icons/media-devices/usb-stick-green.png create mode 100755 media/img/icons/media-devices/usb-stick-light.gif create mode 100755 media/img/icons/media-devices/usb-stick-light.png create mode 100755 media/img/icons/media-devices/usb-stick-orange.gif create mode 100755 media/img/icons/media-devices/usb-stick-orange.png create mode 100755 media/img/icons/media-devices/usb-stick-red.gif create mode 100755 media/img/icons/media-devices/usb-stick-red.png create mode 100755 media/img/icons/media-devices/webcam.gif create mode 100755 media/img/icons/media-devices/webcam.png create mode 100755 media/img/icons/mini/action_back.gif create mode 100755 media/img/icons/mini/action_forward.gif create mode 100755 media/img/icons/mini/action_go.gif create mode 100755 media/img/icons/mini/action_paste.gif create mode 100755 media/img/icons/mini/action_print.gif create mode 100755 media/img/icons/mini/action_refresh.gif create mode 100755 media/img/icons/mini/action_refresh_blue.gif create mode 100755 media/img/icons/mini/action_save.gif create mode 100755 media/img/icons/mini/action_stop.gif create mode 100755 media/img/icons/mini/application_dreamweaver.gif create mode 100755 media/img/icons/mini/application_firefox.gif create mode 100755 media/img/icons/mini/application_flash.gif create mode 100755 media/img/icons/mini/arrow_down.gif create mode 100755 media/img/icons/mini/arrow_left.gif create mode 100755 media/img/icons/mini/arrow_right.gif create mode 100755 media/img/icons/mini/arrow_up.gif create mode 100755 media/img/icons/mini/box.gif create mode 100755 media/img/icons/mini/calendar.gif create mode 100755 media/img/icons/mini/comment.gif create mode 100755 media/img/icons/mini/comment_blue.gif create mode 100755 media/img/icons/mini/comment_delete.gif create mode 100755 media/img/icons/mini/comment_new.gif create mode 100755 media/img/icons/mini/comment_yellow.gif create mode 100755 media/img/icons/mini/copy.gif create mode 100755 media/img/icons/mini/cut.gif create mode 100755 media/img/icons/mini/date.gif create mode 100755 media/img/icons/mini/date_delete.gif create mode 100755 media/img/icons/mini/date_new.gif create mode 100755 media/img/icons/mini/file_acrobat.gif create mode 100755 media/img/icons/mini/file_font.gif create mode 100755 media/img/icons/mini/file_font_truetype.gif create mode 100755 media/img/icons/mini/flag_blue.gif create mode 100755 media/img/icons/mini/flag_green.gif create mode 100755 media/img/icons/mini/flag_orange.gif create mode 100755 media/img/icons/mini/flag_red.gif create mode 100755 media/img/icons/mini/flag_white.gif create mode 100755 media/img/icons/mini/folder.gif create mode 100755 media/img/icons/mini/folder_delete.gif create mode 100755 media/img/icons/mini/folder_images.gif create mode 100755 media/img/icons/mini/folder_lock.gif create mode 100755 media/img/icons/mini/folder_new.gif create mode 100755 media/img/icons/mini/folder_page.gif create mode 100755 media/img/icons/mini/icon_accept.gif create mode 100755 media/img/icons/mini/icon_airmail.gif create mode 100755 media/img/icons/mini/icon_alert.gif create mode 100755 media/img/icons/mini/icon_attachment.gif create mode 100755 media/img/icons/mini/icon_clock.gif create mode 100755 media/img/icons/mini/icon_component.gif create mode 100755 media/img/icons/mini/icon_download.gif create mode 100755 media/img/icons/mini/icon_email.gif create mode 100755 media/img/icons/mini/icon_extension.gif create mode 100755 media/img/icons/mini/icon_favourites.gif create mode 100755 media/img/icons/mini/icon_get_world.gif create mode 100755 media/img/icons/mini/icon_history.gif create mode 100755 media/img/icons/mini/icon_home.gif create mode 100755 media/img/icons/mini/icon_info.gif create mode 100755 media/img/icons/mini/icon_key.gif create mode 100755 media/img/icons/mini/icon_link.gif create mode 100755 media/img/icons/mini/icon_mail.gif create mode 100755 media/img/icons/mini/icon_monitor_mac.gif create mode 100755 media/img/icons/mini/icon_monitor_pc.gif create mode 100755 media/img/icons/mini/icon_network.gif create mode 100755 media/img/icons/mini/icon_package.gif create mode 100755 media/img/icons/mini/icon_package_get.gif create mode 100755 media/img/icons/mini/icon_package_open.gif create mode 100755 media/img/icons/mini/icon_padlock.gif create mode 100755 media/img/icons/mini/icon_security.gif create mode 100755 media/img/icons/mini/icon_settings.gif create mode 100755 media/img/icons/mini/icon_user.gif create mode 100755 media/img/icons/mini/icon_wand.gif create mode 100755 media/img/icons/mini/icon_world.gif create mode 100755 media/img/icons/mini/icon_world_dynamic.gif create mode 100755 media/img/icons/mini/image.gif create mode 100755 media/img/icons/mini/image_new.gif create mode 100755 media/img/icons/mini/interface_browser.gif create mode 100755 media/img/icons/mini/interface_dialog.gif create mode 100755 media/img/icons/mini/interface_installer.gif create mode 100755 media/img/icons/mini/list_comments.gif create mode 100755 media/img/icons/mini/list_components.gif create mode 100755 media/img/icons/mini/list_errors.gif create mode 100755 media/img/icons/mini/list_extensions.gif create mode 100755 media/img/icons/mini/list_images.gif create mode 100755 media/img/icons/mini/list_keys.gif create mode 100755 media/img/icons/mini/list_links.gif create mode 100755 media/img/icons/mini/list_packages.gif create mode 100755 media/img/icons/mini/list_security.gif create mode 100755 media/img/icons/mini/list_settings.gif create mode 100755 media/img/icons/mini/list_users.gif create mode 100755 media/img/icons/mini/list_world.gif create mode 100755 media/img/icons/mini/note.gif create mode 100755 media/img/icons/mini/note_delete.gif create mode 100755 media/img/icons/mini/note_new.gif create mode 100755 media/img/icons/mini/page.gif create mode 100755 media/img/icons/mini/page_alert.gif create mode 100755 media/img/icons/mini/page_attachment.gif create mode 100755 media/img/icons/mini/page_bookmark.gif create mode 100755 media/img/icons/mini/page_boy.gif create mode 100755 media/img/icons/mini/page_code.gif create mode 100755 media/img/icons/mini/page_colors.gif create mode 100755 media/img/icons/mini/page_component.gif create mode 100755 media/img/icons/mini/page_cross.gif create mode 100755 media/img/icons/mini/page_delete.gif create mode 100755 media/img/icons/mini/page_deny.gif create mode 100755 media/img/icons/mini/page_down.gif create mode 100755 media/img/icons/mini/page_dynamic.gif create mode 100755 media/img/icons/mini/page_edit.gif create mode 100755 media/img/icons/mini/page_extension.gif create mode 100755 media/img/icons/mini/page_favourites.gif create mode 100755 media/img/icons/mini/page_find.gif create mode 100755 media/img/icons/mini/page_flash.gif create mode 100755 media/img/icons/mini/page_girl.gif create mode 100755 media/img/icons/mini/page_html.gif create mode 100755 media/img/icons/mini/page_java.gif create mode 100755 media/img/icons/mini/page_key.gif create mode 100755 media/img/icons/mini/page_left.gif create mode 100755 media/img/icons/mini/page_link.gif create mode 100755 media/img/icons/mini/page_lock.gif create mode 100755 media/img/icons/mini/page_new.gif create mode 100755 media/img/icons/mini/page_next.gif create mode 100755 media/img/icons/mini/page_package.gif create mode 100755 media/img/icons/mini/page_php.gif create mode 100755 media/img/icons/mini/page_prev.gif create mode 100755 media/img/icons/mini/page_refresh.gif create mode 100755 media/img/icons/mini/page_right.gif create mode 100755 media/img/icons/mini/page_script.gif create mode 100755 media/img/icons/mini/page_security.gif create mode 100755 media/img/icons/mini/page_settings.gif create mode 100755 media/img/icons/mini/page_sound.gif create mode 100755 media/img/icons/mini/page_tag_blue.gif create mode 100755 media/img/icons/mini/page_tag_red.gif create mode 100755 media/img/icons/mini/page_text.gif create mode 100755 media/img/icons/mini/page_text_delete.gif create mode 100755 media/img/icons/mini/page_tick.gif create mode 100755 media/img/icons/mini/page_tree.gif create mode 100755 media/img/icons/mini/page_up.gif create mode 100755 media/img/icons/mini/page_url.gif create mode 100755 media/img/icons/mini/page_user.gif create mode 100755 media/img/icons/mini/page_user_dark.gif create mode 100755 media/img/icons/mini/page_user_light.gif create mode 100755 media/img/icons/mini/page_video.gif create mode 100755 media/img/icons/mini/page_wizard.gif create mode 100755 media/img/icons/mini/readme.txt create mode 100755 media/img/icons/mini/table.gif create mode 100755 media/img/icons/mini/table_delete.gif create mode 100755 media/img/icons/mini/tables.gif create mode 100755 media/img/icons/silk/accept.png create mode 100755 media/img/icons/silk/add.png create mode 100755 media/img/icons/silk/anchor.png create mode 100755 media/img/icons/silk/application.png create mode 100755 media/img/icons/silk/application_add.png create mode 100755 media/img/icons/silk/application_cascade.png create mode 100755 media/img/icons/silk/application_delete.png create mode 100755 media/img/icons/silk/application_double.png create mode 100755 media/img/icons/silk/application_edit.png create mode 100755 media/img/icons/silk/application_error.png create mode 100755 media/img/icons/silk/application_form.png create mode 100755 media/img/icons/silk/application_form_add.png create mode 100755 media/img/icons/silk/application_form_delete.png create mode 100755 media/img/icons/silk/application_form_edit.png create mode 100755 media/img/icons/silk/application_form_magnify.png create mode 100755 media/img/icons/silk/application_get.png create mode 100755 media/img/icons/silk/application_go.png create mode 100755 media/img/icons/silk/application_home.png create mode 100755 media/img/icons/silk/application_key.png create mode 100755 media/img/icons/silk/application_lightning.png create mode 100755 media/img/icons/silk/application_link.png create mode 100755 media/img/icons/silk/application_osx.png create mode 100755 media/img/icons/silk/application_osx_terminal.png create mode 100755 media/img/icons/silk/application_put.png create mode 100755 media/img/icons/silk/application_side_boxes.png create mode 100755 media/img/icons/silk/application_side_contract.png create mode 100755 media/img/icons/silk/application_side_expand.png create mode 100755 media/img/icons/silk/application_side_list.png create mode 100755 media/img/icons/silk/application_side_tree.png create mode 100755 media/img/icons/silk/application_split.png create mode 100755 media/img/icons/silk/application_tile_horizontal.png create mode 100755 media/img/icons/silk/application_tile_vertical.png create mode 100755 media/img/icons/silk/application_view_columns.png create mode 100755 media/img/icons/silk/application_view_detail.png create mode 100755 media/img/icons/silk/application_view_gallery.png create mode 100755 media/img/icons/silk/application_view_icons.png create mode 100755 media/img/icons/silk/application_view_list.png create mode 100755 media/img/icons/silk/application_view_tile.png create mode 100755 media/img/icons/silk/application_xp.png create mode 100755 media/img/icons/silk/application_xp_terminal.png create mode 100755 media/img/icons/silk/arrow_branch.png create mode 100755 media/img/icons/silk/arrow_divide.png create mode 100755 media/img/icons/silk/arrow_down.png create mode 100755 media/img/icons/silk/arrow_in.png create mode 100755 media/img/icons/silk/arrow_inout.png create mode 100755 media/img/icons/silk/arrow_join.png create mode 100755 media/img/icons/silk/arrow_left.png create mode 100755 media/img/icons/silk/arrow_merge.png create mode 100755 media/img/icons/silk/arrow_out.png create mode 100755 media/img/icons/silk/arrow_redo.png create mode 100755 media/img/icons/silk/arrow_refresh.png create mode 100755 media/img/icons/silk/arrow_refresh_small.png create mode 100755 media/img/icons/silk/arrow_right.png create mode 100755 media/img/icons/silk/arrow_rotate_anticlockwise.png create mode 100755 media/img/icons/silk/arrow_rotate_clockwise.png create mode 100755 media/img/icons/silk/arrow_switch.png create mode 100755 media/img/icons/silk/arrow_turn_left.png create mode 100755 media/img/icons/silk/arrow_turn_right.png create mode 100755 media/img/icons/silk/arrow_undo.png create mode 100755 media/img/icons/silk/arrow_up.png create mode 100755 media/img/icons/silk/asterisk_orange.png create mode 100755 media/img/icons/silk/asterisk_yellow.png create mode 100755 media/img/icons/silk/attach.png create mode 100755 media/img/icons/silk/award_star_add.png create mode 100755 media/img/icons/silk/award_star_bronze_1.png create mode 100755 media/img/icons/silk/award_star_bronze_2.png create mode 100755 media/img/icons/silk/award_star_bronze_3.png create mode 100755 media/img/icons/silk/award_star_delete.png create mode 100755 media/img/icons/silk/award_star_gold_1.png create mode 100755 media/img/icons/silk/award_star_gold_2.png create mode 100755 media/img/icons/silk/award_star_gold_3.png create mode 100755 media/img/icons/silk/award_star_silver_1.png create mode 100755 media/img/icons/silk/award_star_silver_2.png create mode 100755 media/img/icons/silk/award_star_silver_3.png create mode 100755 media/img/icons/silk/basket.png create mode 100755 media/img/icons/silk/basket_add.png create mode 100755 media/img/icons/silk/basket_delete.png create mode 100755 media/img/icons/silk/basket_edit.png create mode 100755 media/img/icons/silk/basket_error.png create mode 100755 media/img/icons/silk/basket_go.png create mode 100755 media/img/icons/silk/basket_put.png create mode 100755 media/img/icons/silk/basket_remove.png create mode 100755 media/img/icons/silk/bell.png create mode 100755 media/img/icons/silk/bell_add.png create mode 100755 media/img/icons/silk/bell_delete.png create mode 100755 media/img/icons/silk/bell_error.png create mode 100755 media/img/icons/silk/bell_go.png create mode 100755 media/img/icons/silk/bell_link.png create mode 100755 media/img/icons/silk/bin.png create mode 100755 media/img/icons/silk/bin_closed.png create mode 100755 media/img/icons/silk/bin_empty.png create mode 100755 media/img/icons/silk/bomb.png create mode 100755 media/img/icons/silk/book.png create mode 100755 media/img/icons/silk/book_add.png create mode 100755 media/img/icons/silk/book_addresses.png create mode 100755 media/img/icons/silk/book_delete.png create mode 100755 media/img/icons/silk/book_edit.png create mode 100755 media/img/icons/silk/book_error.png create mode 100755 media/img/icons/silk/book_go.png create mode 100755 media/img/icons/silk/book_key.png create mode 100755 media/img/icons/silk/book_link.png create mode 100755 media/img/icons/silk/book_next.png create mode 100755 media/img/icons/silk/book_open.png create mode 100755 media/img/icons/silk/book_previous.png create mode 100755 media/img/icons/silk/box.png create mode 100755 media/img/icons/silk/brick.png create mode 100755 media/img/icons/silk/brick_add.png create mode 100755 media/img/icons/silk/brick_delete.png create mode 100755 media/img/icons/silk/brick_edit.png create mode 100755 media/img/icons/silk/brick_error.png create mode 100755 media/img/icons/silk/brick_go.png create mode 100755 media/img/icons/silk/brick_link.png create mode 100755 media/img/icons/silk/bricks.png create mode 100755 media/img/icons/silk/briefcase.png create mode 100755 media/img/icons/silk/bug.png create mode 100755 media/img/icons/silk/bug_add.png create mode 100755 media/img/icons/silk/bug_delete.png create mode 100755 media/img/icons/silk/bug_edit.png create mode 100755 media/img/icons/silk/bug_error.png create mode 100755 media/img/icons/silk/bug_go.png create mode 100755 media/img/icons/silk/bug_link.png create mode 100755 media/img/icons/silk/building.png create mode 100755 media/img/icons/silk/building_add.png create mode 100755 media/img/icons/silk/building_delete.png create mode 100755 media/img/icons/silk/building_edit.png create mode 100755 media/img/icons/silk/building_error.png create mode 100755 media/img/icons/silk/building_go.png create mode 100755 media/img/icons/silk/building_key.png create mode 100755 media/img/icons/silk/building_link.png create mode 100755 media/img/icons/silk/bullet_add.png create mode 100755 media/img/icons/silk/bullet_arrow_bottom.png create mode 100755 media/img/icons/silk/bullet_arrow_down.png create mode 100755 media/img/icons/silk/bullet_arrow_top.png create mode 100755 media/img/icons/silk/bullet_arrow_up.png create mode 100755 media/img/icons/silk/bullet_black.png create mode 100755 media/img/icons/silk/bullet_blue.png create mode 100755 media/img/icons/silk/bullet_delete.png create mode 100755 media/img/icons/silk/bullet_disk.png create mode 100755 media/img/icons/silk/bullet_error.png create mode 100755 media/img/icons/silk/bullet_feed.png create mode 100755 media/img/icons/silk/bullet_go.png create mode 100755 media/img/icons/silk/bullet_green.png create mode 100755 media/img/icons/silk/bullet_key.png create mode 100755 media/img/icons/silk/bullet_orange.png create mode 100755 media/img/icons/silk/bullet_picture.png create mode 100755 media/img/icons/silk/bullet_pink.png create mode 100755 media/img/icons/silk/bullet_purple.png create mode 100755 media/img/icons/silk/bullet_red.png create mode 100755 media/img/icons/silk/bullet_star.png create mode 100755 media/img/icons/silk/bullet_toggle_minus.png create mode 100755 media/img/icons/silk/bullet_toggle_plus.png create mode 100755 media/img/icons/silk/bullet_white.png create mode 100755 media/img/icons/silk/bullet_wrench.png create mode 100755 media/img/icons/silk/bullet_yellow.png create mode 100755 media/img/icons/silk/cake.png create mode 100755 media/img/icons/silk/calculator.png create mode 100755 media/img/icons/silk/calculator_add.png create mode 100755 media/img/icons/silk/calculator_delete.png create mode 100755 media/img/icons/silk/calculator_edit.png create mode 100755 media/img/icons/silk/calculator_error.png create mode 100755 media/img/icons/silk/calculator_link.png create mode 100755 media/img/icons/silk/calendar.png create mode 100755 media/img/icons/silk/calendar_add.png create mode 100755 media/img/icons/silk/calendar_delete.png create mode 100755 media/img/icons/silk/calendar_edit.png create mode 100755 media/img/icons/silk/calendar_link.png create mode 100755 media/img/icons/silk/calendar_view_day.png create mode 100755 media/img/icons/silk/calendar_view_month.png create mode 100755 media/img/icons/silk/calendar_view_week.png create mode 100755 media/img/icons/silk/camera.png create mode 100755 media/img/icons/silk/camera_add.png create mode 100755 media/img/icons/silk/camera_delete.png create mode 100755 media/img/icons/silk/camera_edit.png create mode 100755 media/img/icons/silk/camera_error.png create mode 100755 media/img/icons/silk/camera_go.png create mode 100755 media/img/icons/silk/camera_link.png create mode 100755 media/img/icons/silk/camera_small.png create mode 100755 media/img/icons/silk/cancel.png create mode 100755 media/img/icons/silk/car.png create mode 100755 media/img/icons/silk/car_add.png create mode 100755 media/img/icons/silk/car_delete.png create mode 100755 media/img/icons/silk/cart.png create mode 100755 media/img/icons/silk/cart_add.png create mode 100755 media/img/icons/silk/cart_delete.png create mode 100755 media/img/icons/silk/cart_edit.png create mode 100755 media/img/icons/silk/cart_error.png create mode 100755 media/img/icons/silk/cart_go.png create mode 100755 media/img/icons/silk/cart_put.png create mode 100755 media/img/icons/silk/cart_remove.png create mode 100755 media/img/icons/silk/cd.png create mode 100755 media/img/icons/silk/cd_add.png create mode 100755 media/img/icons/silk/cd_burn.png create mode 100755 media/img/icons/silk/cd_delete.png create mode 100755 media/img/icons/silk/cd_edit.png create mode 100755 media/img/icons/silk/cd_eject.png create mode 100755 media/img/icons/silk/cd_go.png create mode 100755 media/img/icons/silk/chart_bar.png create mode 100755 media/img/icons/silk/chart_bar_add.png create mode 100755 media/img/icons/silk/chart_bar_delete.png create mode 100755 media/img/icons/silk/chart_bar_edit.png create mode 100755 media/img/icons/silk/chart_bar_error.png create mode 100755 media/img/icons/silk/chart_bar_link.png create mode 100755 media/img/icons/silk/chart_curve.png create mode 100755 media/img/icons/silk/chart_curve_add.png create mode 100755 media/img/icons/silk/chart_curve_delete.png create mode 100755 media/img/icons/silk/chart_curve_edit.png create mode 100755 media/img/icons/silk/chart_curve_error.png create mode 100755 media/img/icons/silk/chart_curve_go.png create mode 100755 media/img/icons/silk/chart_curve_link.png create mode 100755 media/img/icons/silk/chart_line.png create mode 100755 media/img/icons/silk/chart_line_add.png create mode 100755 media/img/icons/silk/chart_line_delete.png create mode 100755 media/img/icons/silk/chart_line_edit.png create mode 100755 media/img/icons/silk/chart_line_error.png create mode 100755 media/img/icons/silk/chart_line_link.png create mode 100755 media/img/icons/silk/chart_organisation.png create mode 100755 media/img/icons/silk/chart_organisation_add.png create mode 100755 media/img/icons/silk/chart_organisation_delete.png create mode 100755 media/img/icons/silk/chart_pie.png create mode 100755 media/img/icons/silk/chart_pie_add.png create mode 100755 media/img/icons/silk/chart_pie_delete.png create mode 100755 media/img/icons/silk/chart_pie_edit.png create mode 100755 media/img/icons/silk/chart_pie_error.png create mode 100755 media/img/icons/silk/chart_pie_link.png create mode 100755 media/img/icons/silk/clock.png create mode 100755 media/img/icons/silk/clock_add.png create mode 100755 media/img/icons/silk/clock_delete.png create mode 100755 media/img/icons/silk/clock_edit.png create mode 100755 media/img/icons/silk/clock_error.png create mode 100755 media/img/icons/silk/clock_go.png create mode 100755 media/img/icons/silk/clock_link.png create mode 100755 media/img/icons/silk/clock_pause.png create mode 100755 media/img/icons/silk/clock_play.png create mode 100755 media/img/icons/silk/clock_red.png create mode 100755 media/img/icons/silk/clock_stop.png create mode 100755 media/img/icons/silk/cog.png create mode 100755 media/img/icons/silk/cog_add.png create mode 100755 media/img/icons/silk/cog_delete.png create mode 100755 media/img/icons/silk/cog_edit.png create mode 100755 media/img/icons/silk/cog_error.png create mode 100755 media/img/icons/silk/cog_go.png create mode 100755 media/img/icons/silk/coins.png create mode 100755 media/img/icons/silk/coins_add.png create mode 100755 media/img/icons/silk/coins_delete.png create mode 100755 media/img/icons/silk/color_swatch.png create mode 100755 media/img/icons/silk/color_wheel.png create mode 100755 media/img/icons/silk/comment.png create mode 100755 media/img/icons/silk/comment_add.png create mode 100755 media/img/icons/silk/comment_delete.png create mode 100755 media/img/icons/silk/comment_edit.png create mode 100755 media/img/icons/silk/comments.png create mode 100755 media/img/icons/silk/comments_add.png create mode 100755 media/img/icons/silk/comments_delete.png create mode 100755 media/img/icons/silk/compress.png create mode 100755 media/img/icons/silk/computer.png create mode 100755 media/img/icons/silk/computer_add.png create mode 100755 media/img/icons/silk/computer_delete.png create mode 100755 media/img/icons/silk/computer_edit.png create mode 100755 media/img/icons/silk/computer_error.png create mode 100755 media/img/icons/silk/computer_go.png create mode 100755 media/img/icons/silk/computer_key.png create mode 100755 media/img/icons/silk/computer_link.png create mode 100755 media/img/icons/silk/connect.png create mode 100755 media/img/icons/silk/contrast.png create mode 100755 media/img/icons/silk/contrast_decrease.png create mode 100755 media/img/icons/silk/contrast_high.png create mode 100755 media/img/icons/silk/contrast_increase.png create mode 100755 media/img/icons/silk/contrast_low.png create mode 100755 media/img/icons/silk/control_eject.png create mode 100755 media/img/icons/silk/control_eject_blue.png create mode 100755 media/img/icons/silk/control_end.png create mode 100755 media/img/icons/silk/control_end_blue.png create mode 100755 media/img/icons/silk/control_equalizer.png create mode 100755 media/img/icons/silk/control_equalizer_blue.png create mode 100755 media/img/icons/silk/control_fastforward.png create mode 100755 media/img/icons/silk/control_fastforward_blue.png create mode 100755 media/img/icons/silk/control_pause.png create mode 100755 media/img/icons/silk/control_pause_blue.png create mode 100755 media/img/icons/silk/control_play.png create mode 100755 media/img/icons/silk/control_play_blue.png create mode 100755 media/img/icons/silk/control_repeat.png create mode 100755 media/img/icons/silk/control_repeat_blue.png create mode 100755 media/img/icons/silk/control_rewind.png create mode 100755 media/img/icons/silk/control_rewind_blue.png create mode 100755 media/img/icons/silk/control_start.png create mode 100755 media/img/icons/silk/control_start_blue.png create mode 100755 media/img/icons/silk/control_stop.png create mode 100755 media/img/icons/silk/control_stop_blue.png create mode 100755 media/img/icons/silk/controller.png create mode 100755 media/img/icons/silk/controller_add.png create mode 100755 media/img/icons/silk/controller_delete.png create mode 100755 media/img/icons/silk/controller_error.png create mode 100755 media/img/icons/silk/creditcards.png create mode 100755 media/img/icons/silk/cross.png create mode 100755 media/img/icons/silk/css.png create mode 100755 media/img/icons/silk/css_add.png create mode 100755 media/img/icons/silk/css_delete.png create mode 100755 media/img/icons/silk/css_go.png create mode 100755 media/img/icons/silk/css_valid.png create mode 100755 media/img/icons/silk/cup.png create mode 100755 media/img/icons/silk/cup_add.png create mode 100755 media/img/icons/silk/cup_delete.png create mode 100755 media/img/icons/silk/cup_edit.png create mode 100755 media/img/icons/silk/cup_error.png create mode 100755 media/img/icons/silk/cup_go.png create mode 100755 media/img/icons/silk/cup_key.png create mode 100755 media/img/icons/silk/cup_link.png create mode 100755 media/img/icons/silk/cursor.png create mode 100755 media/img/icons/silk/cut.png create mode 100755 media/img/icons/silk/cut_red.png create mode 100755 media/img/icons/silk/database.png create mode 100755 media/img/icons/silk/database_add.png create mode 100755 media/img/icons/silk/database_connect.png create mode 100755 media/img/icons/silk/database_delete.png create mode 100755 media/img/icons/silk/database_edit.png create mode 100755 media/img/icons/silk/database_error.png create mode 100755 media/img/icons/silk/database_gear.png create mode 100755 media/img/icons/silk/database_go.png create mode 100755 media/img/icons/silk/database_key.png create mode 100755 media/img/icons/silk/database_lightning.png create mode 100755 media/img/icons/silk/database_link.png create mode 100755 media/img/icons/silk/database_refresh.png create mode 100755 media/img/icons/silk/database_save.png create mode 100755 media/img/icons/silk/database_table.png create mode 100755 media/img/icons/silk/date.png create mode 100755 media/img/icons/silk/date_add.png create mode 100755 media/img/icons/silk/date_delete.png create mode 100755 media/img/icons/silk/date_edit.png create mode 100755 media/img/icons/silk/date_error.png create mode 100755 media/img/icons/silk/date_go.png create mode 100755 media/img/icons/silk/date_link.png create mode 100755 media/img/icons/silk/date_magnify.png create mode 100755 media/img/icons/silk/date_next.png create mode 100755 media/img/icons/silk/date_previous.png create mode 100755 media/img/icons/silk/delete.png create mode 100755 media/img/icons/silk/disconnect.png create mode 100755 media/img/icons/silk/disk.png create mode 100755 media/img/icons/silk/disk_multiple.png create mode 100755 media/img/icons/silk/door.png create mode 100755 media/img/icons/silk/door_in.png create mode 100755 media/img/icons/silk/door_open.png create mode 100755 media/img/icons/silk/door_out.png create mode 100755 media/img/icons/silk/drink.png create mode 100755 media/img/icons/silk/drink_empty.png create mode 100755 media/img/icons/silk/drive.png create mode 100755 media/img/icons/silk/drive_add.png create mode 100755 media/img/icons/silk/drive_burn.png create mode 100755 media/img/icons/silk/drive_cd.png create mode 100755 media/img/icons/silk/drive_cd_empty.png create mode 100755 media/img/icons/silk/drive_delete.png create mode 100755 media/img/icons/silk/drive_disk.png create mode 100755 media/img/icons/silk/drive_edit.png create mode 100755 media/img/icons/silk/drive_error.png create mode 100755 media/img/icons/silk/drive_go.png create mode 100755 media/img/icons/silk/drive_key.png create mode 100755 media/img/icons/silk/drive_link.png create mode 100755 media/img/icons/silk/drive_magnify.png create mode 100755 media/img/icons/silk/drive_network.png create mode 100755 media/img/icons/silk/drive_rename.png create mode 100755 media/img/icons/silk/drive_user.png create mode 100755 media/img/icons/silk/drive_web.png create mode 100755 media/img/icons/silk/dvd.png create mode 100755 media/img/icons/silk/dvd_add.png create mode 100755 media/img/icons/silk/dvd_delete.png create mode 100755 media/img/icons/silk/dvd_edit.png create mode 100755 media/img/icons/silk/dvd_error.png create mode 100755 media/img/icons/silk/dvd_go.png create mode 100755 media/img/icons/silk/dvd_key.png create mode 100755 media/img/icons/silk/dvd_link.png create mode 100755 media/img/icons/silk/email.png create mode 100755 media/img/icons/silk/email_add.png create mode 100755 media/img/icons/silk/email_attach.png create mode 100755 media/img/icons/silk/email_delete.png create mode 100755 media/img/icons/silk/email_edit.png create mode 100755 media/img/icons/silk/email_error.png create mode 100755 media/img/icons/silk/email_go.png create mode 100755 media/img/icons/silk/email_link.png create mode 100755 media/img/icons/silk/email_open.png create mode 100755 media/img/icons/silk/email_open_image.png create mode 100755 media/img/icons/silk/emoticon_evilgrin.png create mode 100755 media/img/icons/silk/emoticon_grin.png create mode 100755 media/img/icons/silk/emoticon_happy.png create mode 100755 media/img/icons/silk/emoticon_smile.png create mode 100755 media/img/icons/silk/emoticon_surprised.png create mode 100755 media/img/icons/silk/emoticon_tongue.png create mode 100755 media/img/icons/silk/emoticon_unhappy.png create mode 100755 media/img/icons/silk/emoticon_waii.png create mode 100755 media/img/icons/silk/emoticon_wink.png create mode 100755 media/img/icons/silk/error.png create mode 100755 media/img/icons/silk/error_add.png create mode 100755 media/img/icons/silk/error_delete.png create mode 100755 media/img/icons/silk/error_go.png create mode 100755 media/img/icons/silk/exclamation.png create mode 100755 media/img/icons/silk/eye.png create mode 100755 media/img/icons/silk/feed.png create mode 100755 media/img/icons/silk/feed_add.png create mode 100755 media/img/icons/silk/feed_delete.png create mode 100755 media/img/icons/silk/feed_disk.png create mode 100755 media/img/icons/silk/feed_edit.png create mode 100755 media/img/icons/silk/feed_error.png create mode 100755 media/img/icons/silk/feed_go.png create mode 100755 media/img/icons/silk/feed_key.png create mode 100755 media/img/icons/silk/feed_link.png create mode 100755 media/img/icons/silk/feed_magnify.png create mode 100755 media/img/icons/silk/female.png create mode 100755 media/img/icons/silk/film.png create mode 100755 media/img/icons/silk/film_add.png create mode 100755 media/img/icons/silk/film_delete.png create mode 100755 media/img/icons/silk/film_edit.png create mode 100755 media/img/icons/silk/film_error.png create mode 100755 media/img/icons/silk/film_go.png create mode 100755 media/img/icons/silk/film_key.png create mode 100755 media/img/icons/silk/film_link.png create mode 100755 media/img/icons/silk/film_save.png create mode 100755 media/img/icons/silk/find.png create mode 100755 media/img/icons/silk/flag_blue.png create mode 100755 media/img/icons/silk/flag_green.png create mode 100755 media/img/icons/silk/flag_orange.png create mode 100755 media/img/icons/silk/flag_pink.png create mode 100755 media/img/icons/silk/flag_purple.png create mode 100755 media/img/icons/silk/flag_red.png create mode 100755 media/img/icons/silk/flag_yellow.png create mode 100755 media/img/icons/silk/folder.png create mode 100755 media/img/icons/silk/folder_add.png create mode 100755 media/img/icons/silk/folder_bell.png create mode 100755 media/img/icons/silk/folder_brick.png create mode 100755 media/img/icons/silk/folder_bug.png create mode 100755 media/img/icons/silk/folder_camera.png create mode 100755 media/img/icons/silk/folder_database.png create mode 100755 media/img/icons/silk/folder_delete.png create mode 100755 media/img/icons/silk/folder_edit.png create mode 100755 media/img/icons/silk/folder_error.png create mode 100755 media/img/icons/silk/folder_explore.png create mode 100755 media/img/icons/silk/folder_feed.png create mode 100755 media/img/icons/silk/folder_find.png create mode 100755 media/img/icons/silk/folder_go.png create mode 100755 media/img/icons/silk/folder_heart.png create mode 100755 media/img/icons/silk/folder_image.png create mode 100755 media/img/icons/silk/folder_key.png create mode 100755 media/img/icons/silk/folder_lightbulb.png create mode 100755 media/img/icons/silk/folder_link.png create mode 100755 media/img/icons/silk/folder_magnify.png create mode 100755 media/img/icons/silk/folder_page.png create mode 100755 media/img/icons/silk/folder_page_white.png create mode 100755 media/img/icons/silk/folder_palette.png create mode 100755 media/img/icons/silk/folder_picture.png create mode 100755 media/img/icons/silk/folder_star.png create mode 100755 media/img/icons/silk/folder_table.png create mode 100755 media/img/icons/silk/folder_user.png create mode 100755 media/img/icons/silk/folder_wrench.png create mode 100755 media/img/icons/silk/font.png create mode 100755 media/img/icons/silk/font_add.png create mode 100755 media/img/icons/silk/font_delete.png create mode 100755 media/img/icons/silk/font_go.png create mode 100755 media/img/icons/silk/group.png create mode 100755 media/img/icons/silk/group_add.png create mode 100755 media/img/icons/silk/group_delete.png create mode 100755 media/img/icons/silk/group_edit.png create mode 100755 media/img/icons/silk/group_error.png create mode 100755 media/img/icons/silk/group_gear.png create mode 100755 media/img/icons/silk/group_go.png create mode 100755 media/img/icons/silk/group_key.png create mode 100755 media/img/icons/silk/group_link.png create mode 100755 media/img/icons/silk/heart.png create mode 100755 media/img/icons/silk/heart_add.png create mode 100755 media/img/icons/silk/heart_delete.png create mode 100755 media/img/icons/silk/help.png create mode 100755 media/img/icons/silk/hourglass.png create mode 100755 media/img/icons/silk/hourglass_add.png create mode 100755 media/img/icons/silk/hourglass_delete.png create mode 100755 media/img/icons/silk/hourglass_go.png create mode 100755 media/img/icons/silk/hourglass_link.png create mode 100755 media/img/icons/silk/house.png create mode 100755 media/img/icons/silk/house_go.png create mode 100755 media/img/icons/silk/house_link.png create mode 100755 media/img/icons/silk/html.png create mode 100755 media/img/icons/silk/html_add.png create mode 100755 media/img/icons/silk/html_delete.png create mode 100755 media/img/icons/silk/html_go.png create mode 100755 media/img/icons/silk/html_valid.png create mode 100755 media/img/icons/silk/image.png create mode 100755 media/img/icons/silk/image_add.png create mode 100755 media/img/icons/silk/image_delete.png create mode 100755 media/img/icons/silk/image_edit.png create mode 100755 media/img/icons/silk/image_link.png create mode 100755 media/img/icons/silk/images.png create mode 100755 media/img/icons/silk/information.png create mode 100755 media/img/icons/silk/ipod.png create mode 100755 media/img/icons/silk/ipod_cast.png create mode 100755 media/img/icons/silk/ipod_cast_add.png create mode 100755 media/img/icons/silk/ipod_cast_delete.png create mode 100755 media/img/icons/silk/ipod_sound.png create mode 100755 media/img/icons/silk/joystick.png create mode 100755 media/img/icons/silk/joystick_add.png create mode 100755 media/img/icons/silk/joystick_delete.png create mode 100755 media/img/icons/silk/joystick_error.png create mode 100755 media/img/icons/silk/key.png create mode 100755 media/img/icons/silk/key_add.png create mode 100755 media/img/icons/silk/key_delete.png create mode 100755 media/img/icons/silk/key_go.png create mode 100755 media/img/icons/silk/keyboard.png create mode 100755 media/img/icons/silk/keyboard_add.png create mode 100755 media/img/icons/silk/keyboard_delete.png create mode 100755 media/img/icons/silk/keyboard_magnify.png create mode 100755 media/img/icons/silk/layers.png create mode 100755 media/img/icons/silk/layout.png create mode 100755 media/img/icons/silk/layout_add.png create mode 100755 media/img/icons/silk/layout_content.png create mode 100755 media/img/icons/silk/layout_delete.png create mode 100755 media/img/icons/silk/layout_edit.png create mode 100755 media/img/icons/silk/layout_error.png create mode 100755 media/img/icons/silk/layout_header.png create mode 100755 media/img/icons/silk/layout_link.png create mode 100755 media/img/icons/silk/layout_sidebar.png create mode 100755 media/img/icons/silk/lightbulb.png create mode 100755 media/img/icons/silk/lightbulb_add.png create mode 100755 media/img/icons/silk/lightbulb_delete.png create mode 100755 media/img/icons/silk/lightbulb_off.png create mode 100755 media/img/icons/silk/lightning.png create mode 100755 media/img/icons/silk/lightning_add.png create mode 100755 media/img/icons/silk/lightning_delete.png create mode 100755 media/img/icons/silk/lightning_go.png create mode 100755 media/img/icons/silk/link.png create mode 100755 media/img/icons/silk/link_add.png create mode 100755 media/img/icons/silk/link_break.png create mode 100755 media/img/icons/silk/link_delete.png create mode 100755 media/img/icons/silk/link_edit.png create mode 100755 media/img/icons/silk/link_error.png create mode 100755 media/img/icons/silk/link_go.png create mode 100755 media/img/icons/silk/lock.png create mode 100755 media/img/icons/silk/lock_add.png create mode 100755 media/img/icons/silk/lock_break.png create mode 100755 media/img/icons/silk/lock_delete.png create mode 100755 media/img/icons/silk/lock_edit.png create mode 100755 media/img/icons/silk/lock_go.png create mode 100755 media/img/icons/silk/lock_open.png create mode 100755 media/img/icons/silk/lorry.png create mode 100755 media/img/icons/silk/lorry_add.png create mode 100755 media/img/icons/silk/lorry_delete.png create mode 100755 media/img/icons/silk/lorry_error.png create mode 100755 media/img/icons/silk/lorry_flatbed.png create mode 100755 media/img/icons/silk/lorry_go.png create mode 100755 media/img/icons/silk/lorry_link.png create mode 100755 media/img/icons/silk/magifier_zoom_out.png create mode 100755 media/img/icons/silk/magnifier.png create mode 100755 media/img/icons/silk/magnifier_zoom_in.png create mode 100755 media/img/icons/silk/male.png create mode 100755 media/img/icons/silk/map.png create mode 100755 media/img/icons/silk/map_add.png create mode 100755 media/img/icons/silk/map_delete.png create mode 100755 media/img/icons/silk/map_edit.png create mode 100755 media/img/icons/silk/map_go.png create mode 100755 media/img/icons/silk/map_magnify.png create mode 100755 media/img/icons/silk/medal_bronze_1.png create mode 100755 media/img/icons/silk/medal_bronze_2.png create mode 100755 media/img/icons/silk/medal_bronze_3.png create mode 100755 media/img/icons/silk/medal_bronze_add.png create mode 100755 media/img/icons/silk/medal_bronze_delete.png create mode 100755 media/img/icons/silk/medal_gold_1.png create mode 100755 media/img/icons/silk/medal_gold_2.png create mode 100755 media/img/icons/silk/medal_gold_3.png create mode 100755 media/img/icons/silk/medal_gold_add.png create mode 100755 media/img/icons/silk/medal_gold_delete.png create mode 100755 media/img/icons/silk/medal_silver_1.png create mode 100755 media/img/icons/silk/medal_silver_2.png create mode 100755 media/img/icons/silk/medal_silver_3.png create mode 100755 media/img/icons/silk/medal_silver_add.png create mode 100755 media/img/icons/silk/medal_silver_delete.png create mode 100755 media/img/icons/silk/money.png create mode 100755 media/img/icons/silk/money_add.png create mode 100755 media/img/icons/silk/money_delete.png create mode 100755 media/img/icons/silk/money_dollar.png create mode 100755 media/img/icons/silk/money_euro.png create mode 100755 media/img/icons/silk/money_pound.png create mode 100755 media/img/icons/silk/money_yen.png create mode 100755 media/img/icons/silk/monitor.png create mode 100755 media/img/icons/silk/monitor_add.png create mode 100755 media/img/icons/silk/monitor_delete.png create mode 100755 media/img/icons/silk/monitor_edit.png create mode 100755 media/img/icons/silk/monitor_error.png create mode 100755 media/img/icons/silk/monitor_go.png create mode 100755 media/img/icons/silk/monitor_lightning.png create mode 100755 media/img/icons/silk/monitor_link.png create mode 100755 media/img/icons/silk/mouse.png create mode 100755 media/img/icons/silk/mouse_add.png create mode 100755 media/img/icons/silk/mouse_delete.png create mode 100755 media/img/icons/silk/mouse_error.png create mode 100755 media/img/icons/silk/music.png create mode 100755 media/img/icons/silk/new.png create mode 100755 media/img/icons/silk/newspaper.png create mode 100755 media/img/icons/silk/newspaper_add.png create mode 100755 media/img/icons/silk/newspaper_delete.png create mode 100755 media/img/icons/silk/newspaper_go.png create mode 100755 media/img/icons/silk/newspaper_link.png create mode 100755 media/img/icons/silk/note.png create mode 100755 media/img/icons/silk/note_add.png create mode 100755 media/img/icons/silk/note_delete.png create mode 100755 media/img/icons/silk/note_edit.png create mode 100755 media/img/icons/silk/note_error.png create mode 100755 media/img/icons/silk/note_go.png create mode 100755 media/img/icons/silk/overlays.png create mode 100755 media/img/icons/silk/package.png create mode 100755 media/img/icons/silk/package_add.png create mode 100755 media/img/icons/silk/package_delete.png create mode 100755 media/img/icons/silk/package_go.png create mode 100755 media/img/icons/silk/package_green.png create mode 100755 media/img/icons/silk/package_link.png create mode 100755 media/img/icons/silk/page.png create mode 100755 media/img/icons/silk/page_add.png create mode 100755 media/img/icons/silk/page_attach.png create mode 100755 media/img/icons/silk/page_code.png create mode 100755 media/img/icons/silk/page_copy.png create mode 100755 media/img/icons/silk/page_delete.png create mode 100755 media/img/icons/silk/page_edit.png create mode 100755 media/img/icons/silk/page_error.png create mode 100755 media/img/icons/silk/page_excel.png create mode 100755 media/img/icons/silk/page_find.png create mode 100755 media/img/icons/silk/page_gear.png create mode 100755 media/img/icons/silk/page_go.png create mode 100755 media/img/icons/silk/page_green.png create mode 100755 media/img/icons/silk/page_key.png create mode 100755 media/img/icons/silk/page_lightning.png create mode 100755 media/img/icons/silk/page_link.png create mode 100755 media/img/icons/silk/page_paintbrush.png create mode 100755 media/img/icons/silk/page_paste.png create mode 100755 media/img/icons/silk/page_red.png create mode 100755 media/img/icons/silk/page_refresh.png create mode 100755 media/img/icons/silk/page_save.png create mode 100755 media/img/icons/silk/page_white.png create mode 100755 media/img/icons/silk/page_white_acrobat.png create mode 100755 media/img/icons/silk/page_white_actionscript.png create mode 100755 media/img/icons/silk/page_white_add.png create mode 100755 media/img/icons/silk/page_white_c.png create mode 100755 media/img/icons/silk/page_white_camera.png create mode 100755 media/img/icons/silk/page_white_cd.png create mode 100755 media/img/icons/silk/page_white_code.png create mode 100755 media/img/icons/silk/page_white_code_red.png create mode 100755 media/img/icons/silk/page_white_coldfusion.png create mode 100755 media/img/icons/silk/page_white_compressed.png create mode 100755 media/img/icons/silk/page_white_copy.png create mode 100755 media/img/icons/silk/page_white_cplusplus.png create mode 100755 media/img/icons/silk/page_white_csharp.png create mode 100755 media/img/icons/silk/page_white_cup.png create mode 100755 media/img/icons/silk/page_white_database.png create mode 100755 media/img/icons/silk/page_white_delete.png create mode 100755 media/img/icons/silk/page_white_dvd.png create mode 100755 media/img/icons/silk/page_white_edit.png create mode 100755 media/img/icons/silk/page_white_error.png create mode 100755 media/img/icons/silk/page_white_excel.png create mode 100755 media/img/icons/silk/page_white_find.png create mode 100755 media/img/icons/silk/page_white_flash.png create mode 100755 media/img/icons/silk/page_white_freehand.png create mode 100755 media/img/icons/silk/page_white_gear.png create mode 100755 media/img/icons/silk/page_white_get.png create mode 100755 media/img/icons/silk/page_white_go.png create mode 100755 media/img/icons/silk/page_white_h.png create mode 100755 media/img/icons/silk/page_white_horizontal.png create mode 100755 media/img/icons/silk/page_white_key.png create mode 100755 media/img/icons/silk/page_white_lightning.png create mode 100755 media/img/icons/silk/page_white_link.png create mode 100755 media/img/icons/silk/page_white_magnify.png create mode 100755 media/img/icons/silk/page_white_medal.png create mode 100755 media/img/icons/silk/page_white_office.png create mode 100755 media/img/icons/silk/page_white_paint.png create mode 100755 media/img/icons/silk/page_white_paintbrush.png create mode 100755 media/img/icons/silk/page_white_paste.png create mode 100755 media/img/icons/silk/page_white_php.png create mode 100755 media/img/icons/silk/page_white_picture.png create mode 100755 media/img/icons/silk/page_white_powerpoint.png create mode 100755 media/img/icons/silk/page_white_put.png create mode 100755 media/img/icons/silk/page_white_ruby.png create mode 100755 media/img/icons/silk/page_white_stack.png create mode 100755 media/img/icons/silk/page_white_star.png create mode 100755 media/img/icons/silk/page_white_swoosh.png create mode 100755 media/img/icons/silk/page_white_text.png create mode 100755 media/img/icons/silk/page_white_text_width.png create mode 100755 media/img/icons/silk/page_white_tux.png create mode 100755 media/img/icons/silk/page_white_vector.png create mode 100755 media/img/icons/silk/page_white_visualstudio.png create mode 100755 media/img/icons/silk/page_white_width.png create mode 100755 media/img/icons/silk/page_white_word.png create mode 100755 media/img/icons/silk/page_white_world.png create mode 100755 media/img/icons/silk/page_white_wrench.png create mode 100755 media/img/icons/silk/page_white_zip.png create mode 100755 media/img/icons/silk/page_word.png create mode 100755 media/img/icons/silk/page_world.png create mode 100755 media/img/icons/silk/paintbrush.png create mode 100755 media/img/icons/silk/paintcan.png create mode 100755 media/img/icons/silk/palette.png create mode 100755 media/img/icons/silk/paste_plain.png create mode 100755 media/img/icons/silk/paste_word.png create mode 100755 media/img/icons/silk/pencil.png create mode 100755 media/img/icons/silk/pencil_add.png create mode 100755 media/img/icons/silk/pencil_delete.png create mode 100755 media/img/icons/silk/pencil_go.png create mode 100755 media/img/icons/silk/phone.png create mode 100755 media/img/icons/silk/phone_add.png create mode 100755 media/img/icons/silk/phone_delete.png create mode 100755 media/img/icons/silk/phone_sound.png create mode 100755 media/img/icons/silk/photo.png create mode 100755 media/img/icons/silk/photo_add.png create mode 100755 media/img/icons/silk/photo_delete.png create mode 100755 media/img/icons/silk/photo_link.png create mode 100755 media/img/icons/silk/photos.png create mode 100755 media/img/icons/silk/picture.png create mode 100755 media/img/icons/silk/picture_add.png create mode 100755 media/img/icons/silk/picture_delete.png create mode 100755 media/img/icons/silk/picture_edit.png create mode 100755 media/img/icons/silk/picture_empty.png create mode 100755 media/img/icons/silk/picture_error.png create mode 100755 media/img/icons/silk/picture_go.png create mode 100755 media/img/icons/silk/picture_key.png create mode 100755 media/img/icons/silk/picture_link.png create mode 100755 media/img/icons/silk/picture_save.png create mode 100755 media/img/icons/silk/pictures.png create mode 100755 media/img/icons/silk/pilcrow.png create mode 100755 media/img/icons/silk/pill.png create mode 100755 media/img/icons/silk/pill_add.png create mode 100755 media/img/icons/silk/pill_delete.png create mode 100755 media/img/icons/silk/pill_go.png create mode 100755 media/img/icons/silk/plugin.png create mode 100755 media/img/icons/silk/plugin_add.png create mode 100755 media/img/icons/silk/plugin_delete.png create mode 100755 media/img/icons/silk/plugin_disabled.png create mode 100755 media/img/icons/silk/plugin_edit.png create mode 100755 media/img/icons/silk/plugin_error.png create mode 100755 media/img/icons/silk/plugin_go.png create mode 100755 media/img/icons/silk/plugin_link.png create mode 100755 media/img/icons/silk/printer.png create mode 100755 media/img/icons/silk/printer_add.png create mode 100755 media/img/icons/silk/printer_delete.png create mode 100755 media/img/icons/silk/printer_empty.png create mode 100755 media/img/icons/silk/printer_error.png create mode 100755 media/img/icons/silk/rainbow.png create mode 100755 media/img/icons/silk/report.png create mode 100755 media/img/icons/silk/report_add.png create mode 100755 media/img/icons/silk/report_delete.png create mode 100755 media/img/icons/silk/report_disk.png create mode 100755 media/img/icons/silk/report_edit.png create mode 100755 media/img/icons/silk/report_go.png create mode 100755 media/img/icons/silk/report_key.png create mode 100755 media/img/icons/silk/report_link.png create mode 100755 media/img/icons/silk/report_magnify.png create mode 100755 media/img/icons/silk/report_picture.png create mode 100755 media/img/icons/silk/report_user.png create mode 100755 media/img/icons/silk/report_word.png create mode 100755 media/img/icons/silk/resultset_first.png create mode 100755 media/img/icons/silk/resultset_last.png create mode 100755 media/img/icons/silk/resultset_next.png create mode 100755 media/img/icons/silk/resultset_previous.png create mode 100755 media/img/icons/silk/rosette.png create mode 100755 media/img/icons/silk/rss.png create mode 100755 media/img/icons/silk/rss_add.png create mode 100755 media/img/icons/silk/rss_delete.png create mode 100755 media/img/icons/silk/rss_go.png create mode 100755 media/img/icons/silk/rss_valid.png create mode 100755 media/img/icons/silk/ruby.png create mode 100755 media/img/icons/silk/ruby_add.png create mode 100755 media/img/icons/silk/ruby_delete.png create mode 100755 media/img/icons/silk/ruby_gear.png create mode 100755 media/img/icons/silk/ruby_get.png create mode 100755 media/img/icons/silk/ruby_go.png create mode 100755 media/img/icons/silk/ruby_key.png create mode 100755 media/img/icons/silk/ruby_link.png create mode 100755 media/img/icons/silk/ruby_put.png create mode 100755 media/img/icons/silk/script.png create mode 100755 media/img/icons/silk/script_add.png create mode 100755 media/img/icons/silk/script_code.png create mode 100755 media/img/icons/silk/script_code_red.png create mode 100755 media/img/icons/silk/script_delete.png create mode 100755 media/img/icons/silk/script_edit.png create mode 100755 media/img/icons/silk/script_error.png create mode 100755 media/img/icons/silk/script_gear.png create mode 100755 media/img/icons/silk/script_go.png create mode 100755 media/img/icons/silk/script_key.png create mode 100755 media/img/icons/silk/script_lightning.png create mode 100755 media/img/icons/silk/script_link.png create mode 100755 media/img/icons/silk/script_palette.png create mode 100755 media/img/icons/silk/script_save.png create mode 100755 media/img/icons/silk/server.png create mode 100755 media/img/icons/silk/server_add.png create mode 100755 media/img/icons/silk/server_chart.png create mode 100755 media/img/icons/silk/server_compressed.png create mode 100755 media/img/icons/silk/server_connect.png create mode 100755 media/img/icons/silk/server_database.png create mode 100755 media/img/icons/silk/server_delete.png create mode 100755 media/img/icons/silk/server_edit.png create mode 100755 media/img/icons/silk/server_error.png create mode 100755 media/img/icons/silk/server_go.png create mode 100755 media/img/icons/silk/server_key.png create mode 100755 media/img/icons/silk/server_lightning.png create mode 100755 media/img/icons/silk/server_link.png create mode 100755 media/img/icons/silk/server_uncompressed.png create mode 100755 media/img/icons/silk/shading.png create mode 100755 media/img/icons/silk/shape_align_bottom.png create mode 100755 media/img/icons/silk/shape_align_center.png create mode 100755 media/img/icons/silk/shape_align_left.png create mode 100755 media/img/icons/silk/shape_align_middle.png create mode 100755 media/img/icons/silk/shape_align_right.png create mode 100755 media/img/icons/silk/shape_align_top.png create mode 100755 media/img/icons/silk/shape_flip_horizontal.png create mode 100755 media/img/icons/silk/shape_flip_vertical.png create mode 100755 media/img/icons/silk/shape_group.png create mode 100755 media/img/icons/silk/shape_handles.png create mode 100755 media/img/icons/silk/shape_move_back.png create mode 100755 media/img/icons/silk/shape_move_backwards.png create mode 100755 media/img/icons/silk/shape_move_forwards.png create mode 100755 media/img/icons/silk/shape_move_front.png create mode 100755 media/img/icons/silk/shape_rotate_anticlockwise.png create mode 100755 media/img/icons/silk/shape_rotate_clockwise.png create mode 100755 media/img/icons/silk/shape_square.png create mode 100755 media/img/icons/silk/shape_square_add.png create mode 100755 media/img/icons/silk/shape_square_delete.png create mode 100755 media/img/icons/silk/shape_square_edit.png create mode 100755 media/img/icons/silk/shape_square_error.png create mode 100755 media/img/icons/silk/shape_square_go.png create mode 100755 media/img/icons/silk/shape_square_key.png create mode 100755 media/img/icons/silk/shape_square_link.png create mode 100755 media/img/icons/silk/shape_ungroup.png create mode 100755 media/img/icons/silk/shield.png create mode 100755 media/img/icons/silk/shield_add.png create mode 100755 media/img/icons/silk/shield_delete.png create mode 100755 media/img/icons/silk/shield_go.png create mode 100755 media/img/icons/silk/sitemap.png create mode 100755 media/img/icons/silk/sitemap_color.png create mode 100755 media/img/icons/silk/sound.png create mode 100755 media/img/icons/silk/sound_add.png create mode 100755 media/img/icons/silk/sound_delete.png create mode 100755 media/img/icons/silk/sound_low.png create mode 100755 media/img/icons/silk/sound_mute.png create mode 100755 media/img/icons/silk/sound_none.png create mode 100755 media/img/icons/silk/spellcheck.png create mode 100755 media/img/icons/silk/sport_8ball.png create mode 100755 media/img/icons/silk/sport_basketball.png create mode 100755 media/img/icons/silk/sport_football.png create mode 100755 media/img/icons/silk/sport_golf.png create mode 100755 media/img/icons/silk/sport_raquet.png create mode 100755 media/img/icons/silk/sport_shuttlecock.png create mode 100755 media/img/icons/silk/sport_soccer.png create mode 100755 media/img/icons/silk/sport_tennis.png create mode 100755 media/img/icons/silk/star.png create mode 100755 media/img/icons/silk/status_away.png create mode 100755 media/img/icons/silk/status_busy.png create mode 100755 media/img/icons/silk/status_offline.png create mode 100755 media/img/icons/silk/status_online.png create mode 100755 media/img/icons/silk/stop.png create mode 100755 media/img/icons/silk/style.png create mode 100755 media/img/icons/silk/style_add.png create mode 100755 media/img/icons/silk/style_delete.png create mode 100755 media/img/icons/silk/style_edit.png create mode 100755 media/img/icons/silk/style_go.png create mode 100755 media/img/icons/silk/sum.png create mode 100755 media/img/icons/silk/tab.png create mode 100755 media/img/icons/silk/tab_add.png create mode 100755 media/img/icons/silk/tab_delete.png create mode 100755 media/img/icons/silk/tab_edit.png create mode 100755 media/img/icons/silk/tab_go.png create mode 100755 media/img/icons/silk/table.png create mode 100755 media/img/icons/silk/table_add.png create mode 100755 media/img/icons/silk/table_delete.png create mode 100755 media/img/icons/silk/table_edit.png create mode 100755 media/img/icons/silk/table_error.png create mode 100755 media/img/icons/silk/table_gear.png create mode 100755 media/img/icons/silk/table_go.png create mode 100755 media/img/icons/silk/table_key.png create mode 100755 media/img/icons/silk/table_lightning.png create mode 100755 media/img/icons/silk/table_link.png create mode 100755 media/img/icons/silk/table_multiple.png create mode 100755 media/img/icons/silk/table_refresh.png create mode 100755 media/img/icons/silk/table_relationship.png create mode 100755 media/img/icons/silk/table_row_delete.png create mode 100755 media/img/icons/silk/table_row_insert.png create mode 100755 media/img/icons/silk/table_save.png create mode 100755 media/img/icons/silk/table_sort.png create mode 100755 media/img/icons/silk/tag.png create mode 100755 media/img/icons/silk/tag_blue.png create mode 100755 media/img/icons/silk/tag_blue_add.png create mode 100755 media/img/icons/silk/tag_blue_delete.png create mode 100755 media/img/icons/silk/tag_blue_edit.png create mode 100755 media/img/icons/silk/tag_green.png create mode 100755 media/img/icons/silk/tag_orange.png create mode 100755 media/img/icons/silk/tag_pink.png create mode 100755 media/img/icons/silk/tag_purple.png create mode 100755 media/img/icons/silk/tag_red.png create mode 100755 media/img/icons/silk/tag_yellow.png create mode 100755 media/img/icons/silk/telephone.png create mode 100755 media/img/icons/silk/telephone_add.png create mode 100755 media/img/icons/silk/telephone_delete.png create mode 100755 media/img/icons/silk/telephone_edit.png create mode 100755 media/img/icons/silk/telephone_error.png create mode 100755 media/img/icons/silk/telephone_go.png create mode 100755 media/img/icons/silk/telephone_key.png create mode 100755 media/img/icons/silk/telephone_link.png create mode 100755 media/img/icons/silk/television.png create mode 100755 media/img/icons/silk/television_add.png create mode 100755 media/img/icons/silk/television_delete.png create mode 100755 media/img/icons/silk/text_align_center.png create mode 100755 media/img/icons/silk/text_align_justify.png create mode 100755 media/img/icons/silk/text_align_left.png create mode 100755 media/img/icons/silk/text_align_right.png create mode 100755 media/img/icons/silk/text_allcaps.png create mode 100755 media/img/icons/silk/text_bold.png create mode 100755 media/img/icons/silk/text_columns.png create mode 100755 media/img/icons/silk/text_dropcaps.png create mode 100755 media/img/icons/silk/text_heading_1.png create mode 100755 media/img/icons/silk/text_heading_2.png create mode 100755 media/img/icons/silk/text_heading_3.png create mode 100755 media/img/icons/silk/text_heading_4.png create mode 100755 media/img/icons/silk/text_heading_5.png create mode 100755 media/img/icons/silk/text_heading_6.png create mode 100755 media/img/icons/silk/text_horizontalrule.png create mode 100755 media/img/icons/silk/text_indent.png create mode 100755 media/img/icons/silk/text_indent_remove.png create mode 100755 media/img/icons/silk/text_italic.png create mode 100755 media/img/icons/silk/text_kerning.png create mode 100755 media/img/icons/silk/text_letter_omega.png create mode 100755 media/img/icons/silk/text_letterspacing.png create mode 100755 media/img/icons/silk/text_linespacing.png create mode 100755 media/img/icons/silk/text_list_bullets.png create mode 100755 media/img/icons/silk/text_list_numbers.png create mode 100755 media/img/icons/silk/text_lowercase.png create mode 100755 media/img/icons/silk/text_padding_bottom.png create mode 100755 media/img/icons/silk/text_padding_left.png create mode 100755 media/img/icons/silk/text_padding_right.png create mode 100755 media/img/icons/silk/text_padding_top.png create mode 100755 media/img/icons/silk/text_replace.png create mode 100755 media/img/icons/silk/text_signature.png create mode 100755 media/img/icons/silk/text_smallcaps.png create mode 100755 media/img/icons/silk/text_strikethrough.png create mode 100755 media/img/icons/silk/text_subscript.png create mode 100755 media/img/icons/silk/text_superscript.png create mode 100755 media/img/icons/silk/text_underline.png create mode 100755 media/img/icons/silk/text_uppercase.png create mode 100755 media/img/icons/silk/textfield.png create mode 100755 media/img/icons/silk/textfield_add.png create mode 100755 media/img/icons/silk/textfield_delete.png create mode 100755 media/img/icons/silk/textfield_key.png create mode 100755 media/img/icons/silk/textfield_rename.png create mode 100755 media/img/icons/silk/thumb_down.png create mode 100755 media/img/icons/silk/thumb_up.png create mode 100755 media/img/icons/silk/tick.png create mode 100755 media/img/icons/silk/time.png create mode 100755 media/img/icons/silk/time_add.png create mode 100755 media/img/icons/silk/time_delete.png create mode 100755 media/img/icons/silk/time_go.png create mode 100755 media/img/icons/silk/timeline_marker.png create mode 100755 media/img/icons/silk/transmit.png create mode 100755 media/img/icons/silk/transmit_add.png create mode 100755 media/img/icons/silk/transmit_blue.png create mode 100755 media/img/icons/silk/transmit_delete.png create mode 100755 media/img/icons/silk/transmit_edit.png create mode 100755 media/img/icons/silk/transmit_error.png create mode 100755 media/img/icons/silk/transmit_go.png create mode 100755 media/img/icons/silk/tux.png create mode 100755 media/img/icons/silk/user.png create mode 100755 media/img/icons/silk/user_add.png create mode 100755 media/img/icons/silk/user_comment.png create mode 100755 media/img/icons/silk/user_delete.png create mode 100755 media/img/icons/silk/user_edit.png create mode 100755 media/img/icons/silk/user_female.png create mode 100755 media/img/icons/silk/user_go.png create mode 100755 media/img/icons/silk/user_gray.png create mode 100755 media/img/icons/silk/user_green.png create mode 100755 media/img/icons/silk/user_orange.png create mode 100755 media/img/icons/silk/user_red.png create mode 100755 media/img/icons/silk/user_suit.png create mode 100755 media/img/icons/silk/vcard.png create mode 100755 media/img/icons/silk/vcard_add.png create mode 100755 media/img/icons/silk/vcard_delete.png create mode 100755 media/img/icons/silk/vcard_edit.png create mode 100755 media/img/icons/silk/vector.png create mode 100755 media/img/icons/silk/vector_add.png create mode 100755 media/img/icons/silk/vector_delete.png create mode 100755 media/img/icons/silk/wand.png create mode 100755 media/img/icons/silk/weather_clouds.png create mode 100755 media/img/icons/silk/weather_cloudy.png create mode 100755 media/img/icons/silk/weather_lightning.png create mode 100755 media/img/icons/silk/weather_rain.png create mode 100755 media/img/icons/silk/weather_snow.png create mode 100755 media/img/icons/silk/weather_sun.png create mode 100755 media/img/icons/silk/webcam.png create mode 100755 media/img/icons/silk/webcam_add.png create mode 100755 media/img/icons/silk/webcam_delete.png create mode 100755 media/img/icons/silk/webcam_error.png create mode 100755 media/img/icons/silk/world.png create mode 100755 media/img/icons/silk/world_add.png create mode 100755 media/img/icons/silk/world_delete.png create mode 100755 media/img/icons/silk/world_edit.png create mode 100755 media/img/icons/silk/world_go.png create mode 100755 media/img/icons/silk/world_link.png create mode 100755 media/img/icons/silk/wrench.png create mode 100755 media/img/icons/silk/wrench_orange.png create mode 100755 media/img/icons/silk/xhtml.png create mode 100755 media/img/icons/silk/xhtml_add.png create mode 100755 media/img/icons/silk/xhtml_delete.png create mode 100755 media/img/icons/silk/xhtml_go.png create mode 100755 media/img/icons/silk/xhtml_valid.png create mode 100755 media/img/icons/silk/zoom.png create mode 100755 media/img/icons/silk/zoom_in.png create mode 100755 media/img/icons/silk/zoom_out.png create mode 100755 media/img/icons/things/bars.gif create mode 100755 media/img/icons/things/bars.png create mode 100755 media/img/icons/things/bomb.gif create mode 100755 media/img/icons/things/bomb.png create mode 100755 media/img/icons/things/briefcase.gif create mode 100755 media/img/icons/things/briefcase.png create mode 100755 media/img/icons/things/calendar.gif create mode 100755 media/img/icons/things/calendar.png create mode 100755 media/img/icons/things/cart.gif create mode 100755 media/img/icons/things/cart.png create mode 100755 media/img/icons/things/caution.gif create mode 100755 media/img/icons/things/caution.png create mode 100755 media/img/icons/things/clock.gif create mode 100755 media/img/icons/things/clock.png create mode 100755 media/img/icons/things/comment.gif create mode 100755 media/img/icons/things/comment.png create mode 100755 media/img/icons/things/detour.gif create mode 100755 media/img/icons/things/detour.png create mode 100755 media/img/icons/things/document-new.gif create mode 100755 media/img/icons/things/document-new.png create mode 100755 media/img/icons/things/document-txt-new.gif create mode 100755 media/img/icons/things/document-txt-new.png create mode 100755 media/img/icons/things/document-txt.gif create mode 100755 media/img/icons/things/document-txt.png create mode 100755 media/img/icons/things/document.gif create mode 100755 media/img/icons/things/document.png create mode 100755 media/img/icons/things/documents.gif create mode 100755 media/img/icons/things/documents.png create mode 100755 media/img/icons/things/folder.gif create mode 100755 media/img/icons/things/folder.png create mode 100755 media/img/icons/things/gear.gif create mode 100755 media/img/icons/things/gear.png create mode 100755 media/img/icons/things/heart.gif create mode 100755 media/img/icons/things/heart.png create mode 100755 media/img/icons/things/house.gif create mode 100755 media/img/icons/things/house.png create mode 100755 media/img/icons/things/icons.gif create mode 100755 media/img/icons/things/icons.png create mode 100755 media/img/icons/things/key-yellow.gif create mode 100755 media/img/icons/things/key-yellow.png create mode 100755 media/img/icons/things/lightbulb.gif create mode 100755 media/img/icons/things/lightbulb.png create mode 100755 media/img/icons/things/mail.gif create mode 100755 media/img/icons/things/mail.png create mode 100755 media/img/icons/things/musicnote.gif create mode 100755 media/img/icons/things/musicnote.png create mode 100755 media/img/icons/things/people.gif create mode 100755 media/img/icons/things/people.png create mode 100755 media/img/icons/things/person.gif create mode 100755 media/img/icons/things/person.png create mode 100755 media/img/icons/things/picture.gif create mode 100755 media/img/icons/things/picture.png create mode 100755 media/img/icons/things/polaroid.gif create mode 100755 media/img/icons/things/polaroid.png create mode 100755 media/img/icons/things/popcorn.gif create mode 100755 media/img/icons/things/popcorn.png create mode 100755 media/img/icons/things/rss.gif create mode 100755 media/img/icons/things/rss.png create mode 100755 media/img/icons/things/write.gif create mode 100755 media/img/icons/things/write.png create mode 100755 media/img/icons/weather/clouded.gif create mode 100755 media/img/icons/weather/clouded.png create mode 100755 media/img/icons/weather/cloudy.gif create mode 100755 media/img/icons/weather/cloudy.png create mode 100755 media/img/icons/weather/extreme-weather.gif create mode 100755 media/img/icons/weather/extreme-weather.png create mode 100755 media/img/icons/weather/lightning.gif create mode 100755 media/img/icons/weather/lightning.png create mode 100755 media/img/icons/weather/raining.gif create mode 100755 media/img/icons/weather/raining.png create mode 100755 media/img/icons/weather/star.gif create mode 100755 media/img/icons/weather/star.png create mode 100755 media/img/icons/weather/stormy.gif create mode 100755 media/img/icons/weather/stormy.png create mode 100755 media/img/icons/weather/sunny.gif create mode 100755 media/img/icons/weather/sunny.png create mode 100644 media/img/reader/resize_north.png create mode 100644 media/img/reader/resize_west.png create mode 100644 media/img/reader/resize_west_small.png create mode 100644 media/img/reader/taskbar_background.png create mode 100644 media/img/reader/user.png create mode 100644 media/js/facebox/README.txt create mode 100644 media/js/facebox/b.png create mode 100644 media/js/facebox/bl.png create mode 100644 media/js/facebox/br.png create mode 100755 media/js/facebox/closelabel.gif create mode 100644 media/js/facebox/facebox.css create mode 100644 media/js/facebox/facebox.js create mode 100755 media/js/facebox/loading.gif create mode 100644 media/js/facebox/tl.png create mode 100644 media/js/facebox/tr.png create mode 100644 media/js/jquery-1.3.2.min.js create mode 100755 media/js/jquery-ui-personalized-1.6rc6.js create mode 100755 media/js/jquery-ui-personalized-1.6rc6.min.js create mode 100644 media/js/jquery.corners.js create mode 100644 media/js/jquery.hotkeys.js create mode 100644 media/js/jquery.js create mode 100755 media/js/jquery.layout.js create mode 100755 media/js/jquery.layout.min.js create mode 100644 media/js/jquery.newsblur.js create mode 100644 media/js/jquery.scrollTo.js create mode 100644 media/js/jquery.timers.js create mode 100755 media/js/jquery.ui.all.js create mode 100644 media/js/newsblur/assetmodel.js create mode 100644 media/js/newsblur/reader.js create mode 100755 media/theme/images/222222_11x11_icon_arrows_leftright.gif create mode 100755 media/theme/images/222222_11x11_icon_arrows_updown.gif create mode 100755 media/theme/images/222222_11x11_icon_doc.gif create mode 100755 media/theme/images/222222_11x11_icon_minus.gif create mode 100755 media/theme/images/222222_11x11_icon_plus.gif create mode 100755 media/theme/images/222222_11x11_icon_resize_se.gif create mode 100755 media/theme/images/222222_7x7_arrow_down.gif create mode 100755 media/theme/images/222222_7x7_arrow_left.gif create mode 100755 media/theme/images/222222_7x7_arrow_right.gif create mode 100755 media/theme/images/222222_7x7_arrow_up.gif create mode 100755 media/theme/images/454545_11x11_icon_arrows_leftright.gif create mode 100755 media/theme/images/454545_11x11_icon_arrows_updown.gif create mode 100755 media/theme/images/454545_11x11_icon_close.gif create mode 100755 media/theme/images/454545_11x11_icon_doc.gif create mode 100755 media/theme/images/454545_11x11_icon_folder_closed.gif create mode 100755 media/theme/images/454545_11x11_icon_folder_open.gif create mode 100755 media/theme/images/454545_11x11_icon_minus.gif create mode 100755 media/theme/images/454545_11x11_icon_plus.gif create mode 100755 media/theme/images/454545_7x7_arrow_down.gif create mode 100755 media/theme/images/454545_7x7_arrow_left.gif create mode 100755 media/theme/images/454545_7x7_arrow_right.gif create mode 100755 media/theme/images/454545_7x7_arrow_up.gif create mode 100755 media/theme/images/888888_11x11_icon_arrows_leftright.gif create mode 100755 media/theme/images/888888_11x11_icon_arrows_updown.gif create mode 100755 media/theme/images/888888_11x11_icon_close.gif create mode 100755 media/theme/images/888888_11x11_icon_doc.gif create mode 100755 media/theme/images/888888_11x11_icon_folder_closed.gif create mode 100755 media/theme/images/888888_11x11_icon_folder_open.gif create mode 100755 media/theme/images/888888_11x11_icon_minus.gif create mode 100755 media/theme/images/888888_11x11_icon_plus.gif create mode 100755 media/theme/images/888888_7x7_arrow_down.gif create mode 100755 media/theme/images/888888_7x7_arrow_left.gif create mode 100755 media/theme/images/888888_7x7_arrow_right.gif create mode 100755 media/theme/images/888888_7x7_arrow_up.gif create mode 100755 media/theme/images/dadada_40x100_textures_03_highlight_soft_75.png create mode 100755 media/theme/images/e6e6e6_40x100_textures_03_highlight_soft_75.png create mode 100755 media/theme/images/ffffff_40x100_textures_01_flat_75.png create mode 100755 media/theme/images/ffffff_40x100_textures_03_highlight_soft_65.png create mode 100644 media/theme/images/ui-bg_highlight-hard_35_f6a828_1x100.png create mode 100644 media/theme/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100755 media/theme/ui.theme.css create mode 100644 settings.py create mode 100644 templates/base.html create mode 100644 templates/globals.html create mode 100644 templates/opml_import/import.xhtml create mode 100644 templates/reader/feeds.xhtml create mode 100644 templates/registration/activate.html create mode 100644 templates/registration/activation_email.txt create mode 100644 templates/registration/activation_email_subject.txt create mode 100644 templates/registration/login.html create mode 100644 templates/registration/registration_complete.html create mode 100644 templates/registration/registration_form.html create mode 100644 urls.py create mode 100644 utils/__init__.py create mode 100644 utils/cache/__init__.py create mode 100644 utils/cache/base.py create mode 100644 utils/cache/exceptions.py create mode 100644 utils/cache/manager.py create mode 100644 utils/cache/query.py create mode 100644 utils/cache/utils.py create mode 100644 utils/dateutil/__init__.py create mode 100644 utils/dateutil/easter.py create mode 100644 utils/dateutil/parser.py create mode 100644 utils/dateutil/relativedelta.py create mode 100644 utils/dateutil/rrule.py create mode 100644 utils/dateutil/tz.py create mode 100644 utils/dateutil/tzwin.py create mode 100644 utils/dateutil/zoneinfo/__init__.py create mode 100644 utils/dateutil/zoneinfo/zoneinfo-2008e.tar.gz create mode 100644 utils/diff.py create mode 100644 utils/django_command_extensions/LICENSE create mode 100644 utils/django_command_extensions/MANIFEST.in create mode 100644 utils/django_command_extensions/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/admin/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/admin/widgets.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/db/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/db/fields/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/db/models.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/daily/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/daily/cache_cleanup.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/daily/daily_cleanup.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/hourly/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/monthly/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/jobs/weekly/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/color.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/clean_pyc.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/compile_pyc.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/create_app.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/create_command.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/create_jobs.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/describe_form.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/dumpscript.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/export_emails.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/generate_secret_key.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/graph_models.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/mail_debug.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/passwd.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/print_user_for_session.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/reset_db.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/runjob.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/runjobs.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/runprofileserver.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/runscript.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/runserver_plus.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/set_fake_emails.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/set_fake_passwords.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/shell_plus.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/show_urls.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/sqldiff.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/sync_media_s3.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/commands/syncdata.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/jobs.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/modelviz.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/signals.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/management/utils.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/templatetags/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/templatetags/syntax_color.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/templatetags/truncate_letters.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/utils/__init__.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/utils/text.py create mode 100644 utils/django_command_extensions/build/lib/django_extensions/utils/uuid.py create mode 100644 utils/django_command_extensions/django_extensions/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/admin/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/admin/widgets.py create mode 100644 utils/django_command_extensions/django_extensions/conf/app_template/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/app_template/forms.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/app_template/models.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/app_template/urls.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/app_template/views.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/command_template/management/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/command_template/management/commands/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/command_template/management/commands/sample.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/sample.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl create mode 100644 utils/django_command_extensions/django_extensions/db/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/db/fields/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/db/models.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/daily/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/daily/cache_cleanup.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/daily/daily_cleanup.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/hourly/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/monthly/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/jobs/weekly/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/management/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/management/color.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/clean_pyc.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/compile_pyc.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/create_app.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/create_command.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/create_jobs.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/describe_form.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/dumpscript.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/export_emails.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/generate_secret_key.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/graph_models.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/mail_debug.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/passwd.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/print_user_for_session.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/reset_db.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/runjob.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/runjobs.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/runprofileserver.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/runscript.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/runserver_plus.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/set_fake_emails.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/set_fake_passwords.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/shell_plus.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/show_urls.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/sqldiff.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/sync_media_s3.py create mode 100644 utils/django_command_extensions/django_extensions/management/commands/syncdata.py create mode 100644 utils/django_command_extensions/django_extensions/management/jobs.py create mode 100644 utils/django_command_extensions/django_extensions/management/modelviz.py create mode 100644 utils/django_command_extensions/django_extensions/management/signals.py create mode 100644 utils/django_command_extensions/django_extensions/management/utils.py create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/css/jquery.autocomplete.css create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/img/indicator.gif create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.ajaxQueue.js create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.autocomplete.js create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.bgiframe.min.js create mode 100644 utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.js create mode 100644 utils/django_command_extensions/django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html create mode 100644 utils/django_command_extensions/django_extensions/templatetags/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/templatetags/syntax_color.py create mode 100644 utils/django_command_extensions/django_extensions/templatetags/truncate_letters.py create mode 100644 utils/django_command_extensions/django_extensions/utils/__init__.py create mode 100644 utils/django_command_extensions/django_extensions/utils/text.py create mode 100644 utils/django_command_extensions/django_extensions/utils/uuid.py create mode 100644 utils/django_command_extensions/docs/AUTHORS create mode 100644 utils/django_command_extensions/setup.py create mode 100644 utils/feed_functions.py create mode 100644 utils/feedcache/.feedcache create mode 100644 utils/feedcache/__init__.py create mode 100644 utils/feedcache/cache.py create mode 100644 utils/feedcache/cachestoragelock.py create mode 100755 utils/feedcache/example.py create mode 100755 utils/feedcache/example_threads.py create mode 100644 utils/feedcache/test_cache.py create mode 100644 utils/feedcache/test_cachestoragelock.py create mode 100644 utils/feedcache/test_server.py create mode 100644 utils/feedcache/test_shovefilesystem.py create mode 100644 utils/feedcache/threading_model.py create mode 100755 utils/feedparser.py create mode 100644 utils/feeds.py create mode 100644 utils/json.py create mode 100644 utils/object_manager.py create mode 100644 utils/opml/README create mode 100644 utils/opml/__init__.py create mode 100644 utils/opml/tests.py create mode 100644 utils/story_functions.py create mode 100644 utils/user_functions.py diff --git a/README b/README new file mode 100644 index 000000000..5fd1557bd --- /dev/null +++ b/README @@ -0,0 +1 @@ +A News/RSS Reader that controls the amount, relevancy, and interestingness of news subscriptions. \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/__init__.py b/apps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/analyzer/__init__.py b/apps/analyzer/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/analyzer/models.py b/apps/analyzer/models.py new file mode 100644 index 000000000..f59993744 --- /dev/null +++ b/apps/analyzer/models.py @@ -0,0 +1,6 @@ +from django.db import models +from django.contrib.auth.models import User +import datetime +from apps.rss_feeds.models import Feed, Story +from apps.reader.models import UserSubscription, ReadStories +from utils import feedparser, object_manager diff --git a/apps/analyzer/views.py b/apps/analyzer/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/apps/analyzer/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/apps/opml_import/__init__.py b/apps/opml_import/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/opml_import/models.py b/apps/opml_import/models.py new file mode 100644 index 000000000..6b4c247ab --- /dev/null +++ b/apps/opml_import/models.py @@ -0,0 +1,5 @@ +from django.db import models +from django.contrib.auth.models import User +from apps.rss_feeds.models import Feed, Story +import datetime + diff --git a/apps/opml_import/urls.py b/apps/opml_import/urls.py new file mode 100644 index 000000000..bffd84191 --- /dev/null +++ b/apps/opml_import/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('apps.opml_import.views', + (r'^$', 'opml_import'), + (r'^process', 'process'), +) diff --git a/apps/opml_import/views.py b/apps/opml_import/views.py new file mode 100644 index 000000000..ea9dc9595 --- /dev/null +++ b/apps/opml_import/views.py @@ -0,0 +1,44 @@ +from django.shortcuts import render_to_response, get_list_or_404, get_object_or_404 +from django.contrib.auth.decorators import login_required +from django.template import RequestContext +from apps.rss_feeds.models import Feed, Story +from apps.reader.models import UserSubscription, ReadStories, UserSubscriptionFolders +from utils.json import json_encode +import utils.opml as opml +from django.contrib.auth.models import User +from django.http import HttpResponse, HttpRequest +from django.core import serializers +from pprint import pprint +import datetime + + +def opml_import(request): + context = None + return render_to_response('opml_import/import.xhtml', context, + context_instance=RequestContext(request)) + +def process(request): + context = None + outline = opml.from_string(request.POST['opml']) + feeds = [] + for folder in outline: + for feed in folder: + feed_data = dict(feed_address=feed.xmlUrl, feed_link=feed.htmlUrl, feed_title=feed.title) + feeds.append(feed_data) + new_feed = Feed(**feed_data) + try: + new_feed.save() + except: + new_feed = Feed.objects.get(**feed_data) + us = UserSubscription(feed=new_feed, user=request.user) + try: + us.save() + except: + us = UserSubscription.objects.get(feed=new_feed, user=request.user) + user_sub_folder = UserSubscriptionFolders(user=request.user, feed=new_feed, user_sub=us, folder=folder.text) + try: + user_sub_folder.save() + except: + pass + data = json_encode(feeds) + return HttpResponse(data, mimetype='application/json') \ No newline at end of file diff --git a/apps/profile/__init__.py b/apps/profile/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/profile/models.py b/apps/profile/models.py new file mode 100644 index 000000000..4a86bfe72 --- /dev/null +++ b/apps/profile/models.py @@ -0,0 +1,5 @@ +from django.db import models +from django.contrib.auth.models import User + +class UserProfile(models.Model): + user = models.ForeignKey(User, unique=True) \ No newline at end of file diff --git a/apps/profile/views.py b/apps/profile/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/apps/profile/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/apps/reader/__init__.py b/apps/reader/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/reader/admin.py b/apps/reader/admin.py new file mode 100644 index 000000000..e54ee46ab --- /dev/null +++ b/apps/reader/admin.py @@ -0,0 +1,6 @@ +from apps.reader.models import UserSubscription, ReadStories, UserSubscriptionFolders +from django.contrib import admin + +admin.site.register(UserSubscription) +admin.site.register(ReadStories) +admin.site.register(UserSubscriptionFolders) \ No newline at end of file diff --git a/apps/reader/models.py b/apps/reader/models.py new file mode 100644 index 000000000..2c2a7e5d1 --- /dev/null +++ b/apps/reader/models.py @@ -0,0 +1,113 @@ +from django.db import models +from django.contrib.auth.models import User +import datetime +from apps.rss_feeds.models import Feed, Story +from utils import feedparser, object_manager + +class UserSubscription(models.Model): + user = models.ForeignKey(User) + feed = models.ForeignKey(Feed) + last_read_date = models.DateTimeField(default=datetime.datetime(2000,1,1)) + mark_read_date = models.DateTimeField(default=datetime.datetime(2000,1,1)) + unread_count = models.IntegerField(default=0) + unread_count_updated = models.DateTimeField( + default=datetime.datetime(2000,1,1) + ) + + def __unicode__(self): + return self.user.username + ': [' + self.feed.feed_title + '] ' + + def save(self, force_insert=False, force_update=False): + self.unread_count_updated = datetime.datetime.now() + super(UserSubscription, self).save(force_insert, force_update) + + def get_user_feeds(self): + return Feed.objects.get(user=self.user, feed=feeds) + + def count_unread(self): + if self.unread_count_updated > self.feed.last_update: + return self.unread_count + + count = (self.stories_newer_lastread() + + self.stories_between_lastread_allread()) + if count == 0: + self.mark_read_date = datetime.datetime.now() + self.last_read_date = datetime.datetime.now() + self.unread_count_updated = datetime.datetime.now() + self.unread_count = 0 + self.save() + else: + self.unread_count = count + self.unread_count_updated = datetime.datetime.now() + self.save() + return count + + def mark_read(self): + self.last_read_date = datetime.datetime.now() + self.unread_count -= 1 + self.unread_count_updated = datetime.datetime.now() + self.save() + + def mark_feed_read(self): + self.last_read_date = datetime.datetime.now() + self.mark_read_date = datetime.datetime.now() + self.unread_count = 0 + self.unread_count_updated = datetime.datetime.now() + self.save() + readstories = ReadStories.objects.filter(user=self.user, feed=self.feed) + readstories.delete() + + def stories_newer_lastread(self): + return self.feed.new_stories_since_date(self.last_read_date) + + def stories_between_lastread_allread(self): + story_count = Story.objects.filter( + story_date__gte=self.mark_read_date, + story_date__lte=self.last_read_date, + story_feed=self.feed + ).count() + read_count = ReadStories.objects.filter( + feed=self.feed, + read_date__gte=self.mark_read_date, + read_date__lte=self.last_read_date + ).count() + return story_count - read_count + + def subscribe_to_feed(self, feed_id): + feed = Feed.objects.get(id=feed_id) + new_subscription = UserSubscription(user=self.user, feed=feed) + new_subscription.save() + + class Meta: + unique_together = ("user", "feed") + + +class ReadStories(models.Model): + user = models.ForeignKey(User) + feed = models.ForeignKey(Feed) + story = models.ForeignKey(Story) + read_date = models.DateTimeField(auto_now=True) + + def __unicode__(self): + return (self.user.username + ': [' + self.feed.feed_title + '] ' + + self.story.story_title) + + class Meta: + verbose_name_plural = "read stories" + verbose_name = "read story" + unique_together = ("user", "story") + +class UserSubscriptionFolders(models.Model): + user = models.ForeignKey(User) + user_sub = models.ForeignKey(UserSubscription) + feed = models.ForeignKey(Feed) + folder = models.CharField(max_length=255) + + def __unicode__(self): + return (self.user.username + ': [' + self.feed.feed_title + '] ' + + self.folder) + + class Meta: + verbose_name_plural = "folders" + verbose_name = "folder" + unique_together = ("user", "user_sub") \ No newline at end of file diff --git a/apps/reader/urls.py b/apps/reader/urls.py new file mode 100644 index 000000000..29fb95148 --- /dev/null +++ b/apps/reader/urls.py @@ -0,0 +1,12 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('apps.reader.views', + (r'^$', 'index'), + (r'^load_single_feed', 'load_single_feed'), + (r'^load_feeds', 'load_feeds'), + (r'^refresh_all_feeds', 'refresh_all_feeds'), + (r'^refresh_feed', 'refresh_feed'), + (r'^mark_story_as_read', 'mark_story_as_read'), + (r'^mark_feed_as_read', 'mark_feed_as_read'), + (r'^get_read_feed_items', 'get_read_feed_items'), +) diff --git a/apps/reader/views.py b/apps/reader/views.py new file mode 100644 index 000000000..e8bbe0dd7 --- /dev/null +++ b/apps/reader/views.py @@ -0,0 +1,200 @@ +from django.shortcuts import render_to_response, get_list_or_404, get_object_or_404 +from django.contrib.auth.decorators import login_required +from django.template import RequestContext +from apps.rss_feeds.models import Feed, Story +from apps.reader.models import UserSubscription, ReadStories, UserSubscriptionFolders +from utils.json import json_encode +from utils.story_functions import format_story_link_date__short, format_story_link_date__long +from utils.user_functions import get_user +from django.contrib.auth.models import User +from django.http import HttpResponse, HttpRequest +from django.core import serializers +from pprint import pprint +from django.utils.safestring import mark_safe +from utils.feedcache.threading_model import fetch_feeds +import datetime +import threading + +def index(request): + # feeds = Feed.objects.filter(usersubscription__user=request.user) + # for f in feeds: + # f.update() + + # context = feeds + context = {} + + user = request.user + user_info = _parse_user_info(user) + context.update(user_info) + return render_to_response('reader/feeds.xhtml', context, + context_instance=RequestContext(request)) + +def refresh_all_feeds(request): + force_update = False # request.GET.get('force', False) + feeds = Feed.objects.all() + + t = threading.Thread(target=refresh_feeds, + args=[feeds]) + t.setDaemon(True) + t.start() + + # feeds = fetch_feeds(force_update, feeds) + + context = {} + + user = request.user + user_info = _parse_user_info(user) + context.update(user_info) + + return render_to_response('reader/feeds.xhtml', context, + context_instance=RequestContext(request)) + +def refresh_feed(request): + feed_id = request.REQUEST['feed_id'] + force_update = request.GET.get('force', False) + feeds = Feed.objects.filter(id=feed_id) + + feeds = fetch_feeds(force_update, feeds) + + context = {} + + user = request.user + user_info = _parse_user_info(user) + context.update(user_info) + + return render_to_response('reader/feeds.xhtml', context, + context_instance=RequestContext(request)) + +def refresh_feeds(feeds): + for f in feeds: + f.update() + return + +def load_feeds(request): + user = get_user(request) + + us = UserSubscriptionFolders.objects.select_related().filter( + user=user + ) + + feeds = [] + folders = [] + for sub in us: + sub.feed.unread_count = sub.user_sub.count_unread() + if sub.folder not in folders: + folders.append(sub.folder) + feeds.append({'folder': sub.folder, 'feeds': []}) + for folder in feeds: + if folder['folder'] == sub.folder: + folder['feeds'].append(sub.feed) + + # Alphabetize folders, then feeds inside folders + feeds.sort(lambda x, y: cmp(x['folder'].lower(), y['folder'].lower())) + for feed in feeds: + feed['feeds'].sort(lambda x, y: cmp(x.feed_title.lower(), y.feed_title.lower())) + for f in feed['feeds']: + f.feed_address = mark_safe(f.feed_address) + + context = feeds + + data = json_encode(context) + return HttpResponse(data, mimetype='application/json') + +def load_single_feed(request): + user = get_user(request) + + offset = int(request.REQUEST.get('offset', 0)) + limit = int(request.REQUEST.get('limit', 25)) + feed_id = request.REQUEST['feed_id'] + stories=Story.objects.filter(story_feed=feed_id)[offset:offset+limit] + feed = Feed.objects.get(id=feed_id) + force_update = request.GET.get('force', False) + + if force_update: + fetch_feeds(force_update, [feed]) + + us = UserSubscription.objects.select_related("feed").filter(user=user) + for sub in us: + if sub.feed_id == feed.id: + + print "Feed: " + feed.feed_title + user_readstories = ReadStories.objects.filter( + user=user, + feed=feed + ) + for story in stories: + story.short_parsed_date = format_story_link_date__short(story.story_date) + story.long_parsed_date = format_story_link_date__long(story.story_date) + story.story_feed_title = feed.feed_title + story.story_feed_link = mark_safe(feed.feed_link) + story.story_permalink = mark_safe(story.story_permalink) + if story.story_date < sub.mark_read_date: + story.read_status = 1 + elif story.story_date > sub.last_read_date: + story.read_status = 0 + else: + if story.id in [u_rs.story_id for u_rs in user_readstories]: + print "READ: " + story.read_status = 1 + else: + print "unread: " + story.read_status = 0 + + context = stories + data = json_encode(context) + return HttpResponse(data, mimetype='text/plain') + + +@login_required +def mark_story_as_read(request): + story_id = request.REQUEST['story_id'] + story = Story.objects.select_related("story_feed").get(id=story_id) + + read_story = ReadStories.objects.filter(story=story_id, user=request.user, feed=story.story_feed).count() + + print read_story + if read_story: + data = json_encode(dict(code=1)) + else: + us = UserSubscription.objects.get( + feed=story.story_feed, + user=request.user + ) + us.mark_read() + print "Marked Read: " + str(story_id) + ' ' + str(story.id) + m = ReadStories(story=story, user=request.user, feed=story.story_feed) + data = json_encode(dict(code=0)) + try: + m.save() + except: + data = json_encode(dict(code=2)) + return HttpResponse(data) + +@login_required +def mark_feed_as_read(request): + feed_id = int(request.REQUEST['feed_id']) + feed = Feed.objects.get(id=feed_id) + + us = UserSubscription.objects.get(feed=feed, user=request.user) + us.mark_feed_read() + + ReadStories.objects.filter(user=request.user, feed=feed_id).delete() + data = json_encode(dict(code=0)) + try: + m.save() + except: + data = json_encode(dict(code=1)) + return HttpResponse(data) + +@login_required +def get_read_feed_items(request, username): + feeds = get_list_or_404(Feed) + +def _parse_user_info(user): + return { + 'user_info': { + 'is_anonymous': json_encode(user.is_anonymous()), + 'is_authenticated': json_encode(user.is_authenticated()), + 'username': user.username if user.is_authenticated() else 'Anonymous' + } + } \ No newline at end of file diff --git a/apps/registration/__init__.py b/apps/registration/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/registration/admin.py b/apps/registration/admin.py new file mode 100644 index 000000000..eacda3e79 --- /dev/null +++ b/apps/registration/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin + +from apps.registration.models import RegistrationProfile + + +class RegistrationAdmin(admin.ModelAdmin): + list_display = ('__unicode__', 'activation_key_expired') + search_fields = ('user__username', 'user__first_name') + + +admin.site.register(RegistrationProfile, RegistrationAdmin) diff --git a/apps/registration/docs/forms.txt b/apps/registration/docs/forms.txt new file mode 100644 index 000000000..45898b6e2 --- /dev/null +++ b/apps/registration/docs/forms.txt @@ -0,0 +1,82 @@ +===== +Forms +===== + + +To ease and automate the process of validating user information during +registration, several form classes (built using Django's `newforms +library`_) are provided: a base ``RegistrationForm`` and subclasses +which provide specific customized functionality. All of the forms +described below are found in ``registration.forms``. + +.. _newforms library: http://www.djangoproject.com/documentation/newforms/ + + +``RegistrationForm`` +==================== + +Form for registering a new user account. + +Validates that the requested username is not already in use, and +requires the password to be entered twice to catch typos. + +Subclasses should feel free to add any additional validation they +need, but should either preserve the base ``save()`` or implement a +``save()`` which accepts the ``profile_callback`` keyword argument and +passes it through to +``RegistrationProfile.objects.create_inactive_user()``. + +Fields: + +``username`` + The new user's requested username. Will be validated according to + the same regular expression Django's authentication system uses to + validate usernames. + +``email`` + The new user's email address. Must be a well-formed email address. + +``password1`` + The new user's password. + +``password2`` + The password, again, to catch typos. + + +Non-validation methods: + +``save()`` + Creates the new ``User`` and ``RegistrationProfile``, and returns + the ``User``. + + This is essentially a light wrapper around + ``RegistrationProfile.objects.create_inactive_user()``, feeding it + the form data and a profile callback (see the documentation on + ``create_inactive_user()`` for details) if supplied. + + +Subclasses of ``RegistrationForm`` +================================== + +As explained above, subclasses may add any additional validation they +like, but must either preserve the ``save()`` method or implement a +``save()`` method with an identical signature. + +Three subclasses are included as examples, and as ready-made +implementations of useful customizations: + +``RegistrationFormTermsOfService`` + Subclass of ``RegistrationForm`` which adds a required checkbox + for agreeing to a site's Terms of Service. + +``RegistrationFormUniqueEmail`` + Subclass of ``RegistrationForm`` which enforces uniqueness of + email addresses. + +``RegistrationFormNoFreeEmail`` + Subclass of ``RegistrationForm`` which disallows registration with + email addresses from popular free webmail services; moderately + useful for preventing automated spam registrations. + + To change the list of banned domains, subclass this form and + override the attribute ``bad_domains``. diff --git a/apps/registration/docs/models.txt b/apps/registration/docs/models.txt new file mode 100644 index 000000000..7995dfbc8 --- /dev/null +++ b/apps/registration/docs/models.txt @@ -0,0 +1,174 @@ +=================== +Models and managers +=================== + + +Because the two-step process of registration and activation requires +some means of temporarily storing activation key and retrieving it for +verification, a simple model -- +``registration.models.RegistrationProfile`` -- is provided in this +application, and a custom manager -- +``registration.models.RegistrationManager`` -- is included and defines +several useful methods for interacting with ``RegistrationProfile``. + +Both the ``RegistrationProfile`` model and the ``RegistrationManager`` +are found in ``registration.models``. + + +The ``RegistrationProfile`` model +================================= + +A simple profile which stores an activation key for use during user +account registration. + +Generally, you will not want to interact directly with instances of +this model; the provided manager includes methods for creating and +activating new accounts, as well as for cleaning out accounts which +have never been activated. + +While it is possible to use this model as the value of the +``AUTH_PROFILE_MODULE`` setting, it's not recommended that you do +so. This model's sole purpose is to store data temporarily during +account registration and activation, and a mechanism for automatically +creating an instance of a site-specific profile model is provided via +the ``create_inactive_user`` on ``RegistrationManager``. + +``RegistrationProfile`` objects have the following fields: + +``activation_key`` + A SHA1 hash used as an account's activation key. + +``user`` + The ``User`` object for which activation information is being + stored. + +``RegistrationProfile`` also has one custom method defined: + +``activation_key_expired()`` + Determines whether this ``RegistrationProfile``'s activation key + has expired. + + Returns ``True`` if the key has expired, ``False`` otherwise. + + Key expiration is determined by a two-step process: + + 1. If the user has already activated, the key will have been reset + to the string ``ALREADY_ACTIVATED``. Re-activating is not + permitted, and so this method returns ``True`` in this case. + + 2. Otherwise, the date the user signed up is incremented by the + number of days specified in the setting + ``ACCOUNT_ACTIVATION_DAYS`` (which should be the number of days + after signup during which a user is allowed to activate their + account); if the result is less than or equal to the current + date, the key has expired and this method returns ``True``. + + +The ``RegistrationManager`` +=========================== + +Custom manager for the ``RegistrationProfile`` model. + +The methods defined here provide shortcuts for account creation and +activation (including generation and emailing of activation keys), and +for cleaning out expired inactive accounts. + +Methods: + +``activate_user(activation_key)`` + Validates an activation key and activates the corresponding + ``User`` if valid. + + If the key is valid and has not expired, returns the ``User`` + after activating. + + If the key is not valid or has expired, returns ``False``. + + If the key is valid but the ``User`` is already active, returns + ``False``. + + To prevent reactivation of an account which has been deactivated + by site administrators, the activation key is reset to the string + ``ALREADY_ACTIVATED`` after successful activation. + +``create_inactive_user(username, password, email, send_email=True, profile_callback=None)`` + Creates a new, inactive ``User``, generates a + ``RegistrationProfile`` and emails its activation key to the + ``User``. Returns the new ``User``. + + To disable the email, call with ``send_email=False``. + + The activation email will make use of two templates: + + ``registration/activation_email_subject.txt`` + This template will be used for the subject line of the + email. It receives one context variable, ``site``, which is + the currently-active ``django.contrib.sites.models.Site`` + instance. Because it is used as the subject line of an email, + this template's output **must** be only a single line of text; + output longer than one line will be forcibly joined into only + a single line. + + ``registration/activation_email.txt`` + This template will be used for the body of the email. It will + receive three context variables: ``activation_key`` will be + the user's activation key (for use in constructing a URL to + activate the account), ``expiration_days`` will be the number + of days for which the key will be valid and ``site`` will be + the currently-active ``django.contrib.sites.models.Site`` + instance. + + To enable creation of a custom user profile along with the + ``User`` (e.g., the model specified in the ``AUTH_PROFILE_MODULE`` + setting), define a function which knows how to create and save an + instance of that model with appropriate default values, and pass + it as the keyword argument ``profile_callback``. This function + should accept one keyword argument: + + ``user`` + The ``User`` to relate the profile to. + +``create_profile(user)`` + Creates a ``RegistrationProfile`` for a given ``User``. Returns + the ``RegistrationProfile``. + + The activation key for the ``RegistrationProfile`` will be a SHA1 + hash, generated from a combination of the ``User``'s username and + a random salt. + +``deleted_expired_users()`` + Removes expired instances of ``RegistrationProfile`` and their + associated ``User`` objects. + + Accounts to be deleted are identified by searching for instances + of ``RegistrationProfile`` with expired activation keys, and then + checking to see if their associated ``User`` instances have the + field ``is_active`` set to ``False``; any ``User`` who is both + inactive and has an expired activation key will be deleted. + + It is recommended that this method be executed regularly as part + of your routine site maintenance; this application provides a + custom management command which will call this method, accessible + as ``manage.py cleanupregistration``. + + Regularly clearing out accounts which have never been activated + serves two useful purposes: + + 1. It alleviates the ocasional need to reset a + ``RegistrationProfile`` and/or re-send an activation email when + a user does not receive or does not act upon the initial + activation email; since the account will be deleted, the user + will be able to simply re-register and receive a new activation + key. + + 2. It prevents the possibility of a malicious user registering one + or more accounts and never activating them (thus denying the + use of those usernames to anyone else); since those accounts + will be deleted, the usernames will become available for use + again. + + If you have a troublesome ``User`` and wish to disable their + account while keeping it in the database, simply delete the + associated ``RegistrationProfile``; an inactive ``User`` which + does not have an associated ``RegistrationProfile`` will not be + deleted. diff --git a/apps/registration/docs/overview.txt b/apps/registration/docs/overview.txt new file mode 100644 index 000000000..87264d29d --- /dev/null +++ b/apps/registration/docs/overview.txt @@ -0,0 +1,337 @@ +=================== +Django registration +=================== + + +This is a fairly simple user-registration application for Django_, +designed to make allowing user signups as painless as possible. + +.. _Django: http://www.djangoproject.com/ + + +Overview +======== + +This application enables a common user-registration workflow: + +1. User fills out a registration form, selecting a username and + password and entering an email address. + +2. An inactive account is created, and an activation link is sent to + the user's email address. + +3. User clicks the activation link, the account becomes active and the + user is able to log in and begin contributing to your site. + +Various methods of extending and customizing the registration process +are also provided. + + +Installation +============ + +In order to use django-registration, you will need to have a +functioning installation of Django 1.0 or newer; due to changes needed +to stabilize Django's APIs prior to the 1.0 release, +django-registration will not work with older releases of Django. + +There are three basic ways to install django-registration: +automatically installing a package using Python's package-management +tools, manually installing a package, and installing from a Mercurial + + +Using a package-management tool +------------------------------- + +The easiest way by far to install django-registration and most other +interesting Python software is by using an automated +package-management tool, so if you're not already familiar with the +available tools for Python, now's as good a time as any to get +started. + +The most popular option currently is `easy_install`_; refer to its +documentation to see how to get it set up. Once you've got it, you'll +be able to simply type:: + + easy_install django-registration + +And it will handle the rest. + +Another option that's currently gaining steam (and which I personally +prefer for Python package management) is `pip`_. Once again, you'll +want to refer to its documentation to get up and running, but once you +have you'll be able to type:: + + pip install django-registration + +And you'll be done. + + +Manually installing the 0.7 package +----------------------------------- + +If you'd prefer to do things the old-fashioned way, you can manually +download the `django-registration 0.7 package`_ from the Python +Package Index. This will get you a file named +"django-registration-0.7.tar.gz" which you can unpack (double-click on +the file on most operating systems) to create a directory named +"django-registration-0.7". Inside will be a script named "setup.py"; +running:: + + python setup.py install + +will install django-registration (though keep in mind that this +defaults to a system-wide installation, and so may require +administrative privileges on your computer). + + +Installing from a Mercurial checkout +------------------------------------ + +If you have `Mercurial`_ installed on your computer, you can also +obtain a complete copy of django-registration by typing:: + + hg clone http://bitbucket.org/ubernostrum/django-registration/ + +Inside the resulting "django-registration" directory will be a +directory named "registration", which is the actual Python module for +this application; you can symlink it from somewhere on your Python +path. If you prefer, you can use the setup.py script in the +"django-registration" directory to perform a normal installation, but +using a symlink offers easy upgrades: simply running ``hg pull -u`` +inside the django-registration directory will fetch updates from the +main repository and apply them to your local copy. + + +.. _easy_install: http://peak.telecommunity.com/DevCenter/EasyInstall +.. _pip: http://pypi.python.org/pypi/pip/ +.. _django-registration 0.7 package: http://pypi.python.org/pypi/django-registration/0.7 +.. _Mercurial: http://www.selenic.com/mercurial/wiki/ + + +Basic use +========= + +To use the registration system with all its default settings, you'll +need to do the following: + +1. Add ``registration`` to the ``INSTALLED_APPS`` setting of your + Django project. + +2. Add the setting ``ACCOUNT_ACTIVATION_DAYS`` to your settings file; + this should be the number of days activation keys will remain valid + after an account is registered. + +3. Create the necessary templates (see the section on templates below + for details). + +4. Add this line to your site's root URLConf:: + + (r'^accounts/', include('registration.urls')), + +5. Link people to ``/accounts/register/`` so they can start signing + up. Using the default URLConf will also automatically set up the + authentication-oriented views in ``django.contrib.auth`` for you, + so if you use it you can point people to, e.g., + ``/accounts/login/`` to log in. + + +Templates used by django-registration +===================================== + +The views included in django-registration make use of five templates: + +* ``registration/registration_form.html`` displays the registration + form for users to sign up. + +* ``registration/registration_complete.html`` is displayed after the + activation email has been sent, to tell the new user to check + his/her email. + +* ``registration/activation_email_subject.txt`` is used for the + subject of the activation email. + +* ``registration/activation_email.txt`` is used for the body of the + activation email. + +* ``registration/activate.html`` is displayed when a user attempts to + activate his/her account. + +Examples of all of these templates are not provided; you will need to +create them yourself. For views defined in this application, see the +included `views documentation`_ for details on available context +variables, and for details on the templates used by the activation +email see the included `models documentation`_. + +Additionally, the URLConf provided with django-registration includes +URL patterns for useful views in Django's built-in authentication +application -- this means that a single ``include`` in your root +URLConf can wire up registration and the auth application's login, +logout, and password change/reset views. If you choose to use these +views you will need to provide your own templates for them; consult +`the Django authentication documentation`_ for details on the +templates and contexts used by these views. + +.. _views documentation: views.txt +.. _models documentation: models.txt +.. _the Django authentication documentation: http://www.djangoproject.com/documentation/authentication/ + + +How it works +============ + +Using the recommended default configuration, the URL +``/accounts/register/`` will map to the view +``registration.views.register``, which displays a registration form +(an instance of ``registration.forms.RegistrationForm``); this form +asks for a username, email address and password, and verifies that the +username is available and requires the password to be entered twice +(to catch typos). It then does three things: + +1. Creates an instance of ``django.contrib.models.auth.User``, using + the supplied username, email address and password; the + ``is_active`` field on the new ``User`` will be set to ``False``, + meaning that the account is inactive and the user will not be able + to log in yet. + +2. Creates an instance of ``registration.models.RegistrationProfile``, + stores an activation key (a SHA1 hash generated from the new user's + username plus a randomly-generated "salt"), and relates that + ``RegistrationProfile`` to the ``User`` it just created. + +3. Sends an email to the user (at the address they supplied) + containing a link which can be clicked to activate the account. + +For details on customizing this process, including use of alternate +registration form classes and automatic creation of a site-specific +profile, see the sections on customization below. + +After the activation email has been sent, +``registration.views.register`` issues a redirect to the URL +``/accounts/register/complete/``. By default, this is mapped to the +``direct_to_template`` generic view, and displays the template +``registration/registration_complete.html``; this is intended to show +a short message telling the user to check his/her email for the +activation link. + +The activation link will map to the view +``registration.views.activate``, which will attempt to activate the +account by setting the ``is_active`` field on the ``User`` to +``True``. If the activation key for the ``User`` has expired (this is +controlled by the setting ``ACCOUNT_ACTIVATION_DAYS``, as described +above), the account will not be activated (see the section on +maintenance below for instructions on cleaning out expired accounts +which have not been activated). + + +Maintenance +=========== + +Inevitably, a site which uses a two-step process for user signup -- +registration followed by activation -- will accumulate a certain +number of accounts which were registered but never activated. These +accounts clutter up the database and tie up usernames which might +otherwise be actively used, so it's desirable to clean them out +periodically. For this purpose, a script, +``registration/bin/deleted_expired_users.py``, is provided, which is +suitable for use as a regular cron job. See that file for notes on how +to add it to your crontab, and the included models documentation (see +below) for discussion of how it works and some caveats. + + +Where to go from here +===================== + +Full documentation for all included components is bundled in the +packaged release; see the following files for details: + +* `Forms documentation`_ for details on ``RegistrationForm``, + pre-packaged subclasses and available customizations. + +* `Models documentation`_ for details on ``RegistrationProfile`` and + its custom manager. + +* `Views documentation`_ for details on the ``register`` and + ``activate`` views, and methods for customizing them. + +.. _Forms documentation: forms.txt +.. _Models documentation: models.txt +.. _Views documentation: views.txt + + +Development +=========== + +The `latest released version`_ of this application is 0.7, and is +quite stable; it's already been deployed on a number of sites, +including djangoproject.com. You can also obtain the absolute freshest +code from `the development repository_`, but be warned that the +development code may not always be backwards-compatible, and may well +contain bugs that haven't yet been fixed. + +This document covers the 0.7 release of django-registration; new +features introduced in the development trunk will be added to the +documentation at the time of the next packaged release. + +.. _latest released version: http://pypi.python.org/pypi/django-registration/0.7 +.. _the development repository: http://www.bitbucket.org/ubernostrum/django-registration/src/ + + +Changes from previous versions +============================== + +Several new features were added between version 0.2 and version 0.3; +for details, see the CHANGELOG.txt file distributed with the packaged +0.3 release. + +One important change to note before upgrading an installation of +version 0.1 is a change to the ``RegistrationProfile`` model; the +field ``key_generated`` has been removed, since it was redundant with +the field ``date_joined`` on Django's bundled ``User`` model. Since +this field became a ``NOT NULL`` column in the database, you will need +to either drop the ``NOT NULL`` constraint or, preferably, simply drop +the column. Consult your database's documentation for the correct way +to handle this. + +Between version 0.3 and version 0.4, validation of the password fields +was moved from ``clean_password2()`` to ``clean_password()``; this +means that errors from mismatched passwords will now show up in +``non_field_errors()`` instead of ``errors["password2"]``. + +Between version 0.6 and version 0.7, the script +``registration/bin/delete_expired_users.py`` was removed, and replaced +with a custom management command; you can now simply run ``manage.py +cleanupregistration`` from any project which has django-registration +installed. + + +Dependencies +============ + +The only dependencies for this application are a functioning install +of Django 1.0 or newer and, of course, a Django project in which you'd +like to use it. + +Your Django project should have ``django.contrib.admin``, +``django.contrib.auth`` and ``django.contrib.sites`` in its +``INSTALLED_APPS`` setting. + + +What this application does not do +================================= + +This application does not integrate in any way with OpenID, nor should +it; one of the key selling points of OpenID is that users **don't** +have to walk through an explicit registration step for every site or +service they want to use :) + + +If you spot a bug +================= + +Head over to this application's `project page on Bitbucket`_ and +check `the issues list`_ to see if it's already been reported. If not, +open a new issue and I'll do my best to respond quickly. + +.. _project page on Bitbucket: http://www.bitbucket.org/ubernostrum/django-registration/overview/ +.. _the issues list: http://www.bitbucket.org/ubernostrum/django-registration/issues/ diff --git a/apps/registration/docs/views.txt b/apps/registration/docs/views.txt new file mode 100644 index 000000000..017feef14 --- /dev/null +++ b/apps/registration/docs/views.txt @@ -0,0 +1,120 @@ +===== +Views +===== + + +Two views are included which, between them, handle the process of +first registering and then activating new user accounts; both views +are found in ``registration.views``. + + +``activate`` +============ + +Activate a ``User``'s account from an activation key, if their key is +valid and hasn't expired. + +By default, use the template ``registration/activate.html``; to +change this, pass the name of a template as the keyword argument +``template_name``. + +**Required arguments** + +``activation_key`` + The activation key to validate and use for activating the + ``User``. + +**Optional arguments** + +``extra_context`` + A dictionary of variables to add to the template context. Any + callable object in this dictionary will be called to produce the + end result which appears in the context. + +``template_name`` + A custom template to use. + +**Context:** + +``account`` + The ``User`` object corresponding to the account, if the + activation was successful. ``False`` if the activation was not + successful. + +``expiration_days`` + The number of days for which activation keys stay valid after + registration. + +Any extra variables supplied in the ``extra_context`` argument (see +above). + +**Template:** + +registration/activate.html or ``template_name`` keyword argument. + + +``register`` +============ + +Allow a new user to register an account. + +Following successful registration, issue a redirect; by default, this +will be whatever URL corresponds to the named URL pattern +``registration_complete``, which will be +``/accounts/register/complete/`` if using the included URLConf. To +change this, point that named pattern at another URL, or pass your +preferred URL as the keyword argument ``success_url``. + +By default, ``registration.forms.RegistrationForm`` will be used as +the registration form; to change this, pass a different form class as +the ``form_class`` keyword argument. The form class you specify must +have a method ``save`` which will create and return the new ``User``, +and that method must accept the keyword argument ``profile_callback`` +(see below). + +To enable creation of a site-specific user profile object for the new +user, pass a function which will create the profile object as the +keyword argument ``profile_callback``. See +``RegistrationManager.create_inactive_user`` in the file ``models.py`` +for details on how to write this function. + +By default, use the template ``registration/registration_form.html``; +to change this, pass the name of a template as the keyword argument +``template_name``. + +**Required arguments** + +None. + +**Optional arguments** + +``form_class`` + The form class to use for registration. + +``extra_context`` + A dictionary of variables to add to the template context. Any + callable object in this dictionary will be called to produce the + end result which appears in the context. + +``profile_callback`` + A function which will be used to create a site-specific profile + instance for the new ``User``. + +``success_url`` + The URL to redirect to on successful registration. + +``template_name`` + A custom template to use. + +**Context:** + +``form`` + The registration form. + +Any extra variables supplied in the ``extra_context`` argument (see +above). + +**Template:** + +registration/registration_form.html or ``template_name`` keyword +argument. diff --git a/apps/registration/forms.py b/apps/registration/forms.py new file mode 100644 index 000000000..fdcc60d85 --- /dev/null +++ b/apps/registration/forms.py @@ -0,0 +1,142 @@ +""" +Forms and validation code for user registration. + +""" + + +from django import forms +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User + +from apps.registration.models import RegistrationProfile + + +# I put this on all required fields, because it's easier to pick up +# on them with CSS or JavaScript if they have a class of "required" +# in the HTML. Your mileage may vary. If/when Django ticket #3515 +# lands in trunk, this will no longer be necessary. +attrs_dict = { 'class': 'required' } + + +class RegistrationForm(forms.Form): + """ + Form for registering a new user account. + + Validates that the requested username is not already in use, and + requires the password to be entered twice to catch typos. + + Subclasses should feel free to add any additional validation they + need, but should either preserve the base ``save()`` or implement + a ``save()`` which accepts the ``profile_callback`` keyword + argument and passes it through to + ``RegistrationProfile.objects.create_inactive_user()``. + + """ + username = forms.RegexField(regex=r'^\w+$', + max_length=30, + widget=forms.TextInput(attrs=attrs_dict), + label=_(u'username')) + email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, + maxlength=75)), + label=_(u'email address')) + password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), + label=_(u'password')) + password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), + label=_(u'password (again)')) + + def clean_username(self): + """ + Validate that the username is alphanumeric and is not already + in use. + + """ + try: + user = User.objects.get(username__iexact=self.cleaned_data['username']) + except User.DoesNotExist: + return self.cleaned_data['username'] + raise forms.ValidationError(_(u'This username is already taken. Please choose another.')) + + def clean(self): + """ + Verifiy that the values entered into the two password fields + match. Note that an error here will end up in + ``non_field_errors()`` because it doesn't apply to a single + field. + + """ + if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: + if self.cleaned_data['password1'] != self.cleaned_data['password2']: + raise forms.ValidationError(_(u'You must type the same password each time')) + return self.cleaned_data + + def save(self, profile_callback=None): + """ + Create the new ``User`` and ``RegistrationProfile``, and + returns the ``User``. + + This is essentially a light wrapper around + ``RegistrationProfile.objects.create_inactive_user()``, + feeding it the form data and a profile callback (see the + documentation on ``create_inactive_user()`` for details) if + supplied. + + """ + new_user = RegistrationProfile.objects.create_inactive_user(username=self.cleaned_data['username'], + password=self.cleaned_data['password1'], + email=self.cleaned_data['email'], + profile_callback=profile_callback) + return new_user + + +class RegistrationFormTermsOfService(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which adds a required checkbox + for agreeing to a site's Terms of Service. + + """ + tos = forms.BooleanField(widget=forms.CheckboxInput(attrs=attrs_dict), + label=_(u'I have read and agree to the Terms of Service'), + error_messages={ 'required': u"You must agree to the terms to register" }) + + +class RegistrationFormUniqueEmail(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which enforces uniqueness of + email addresses. + + """ + def clean_email(self): + """ + Validate that the supplied email address is unique for the + site. + + """ + if User.objects.filter(email__iexact=self.cleaned_data['email']): + raise forms.ValidationError(_(u'This email address is already in use. Please supply a different email address.')) + return self.cleaned_data['email'] + + +class RegistrationFormNoFreeEmail(RegistrationForm): + """ + Subclass of ``RegistrationForm`` which disallows registration with + email addresses from popular free webmail services; moderately + useful for preventing automated spam registrations. + + To change the list of banned domains, subclass this form and + override the attribute ``bad_domains``. + + """ + bad_domains = ['aim.com', 'aol.com', 'email.com', 'gmail.com', + 'googlemail.com', 'hotmail.com', 'hushmail.com', + 'msn.com', 'mail.ru', 'mailinator.com', 'live.com'] + + def clean_email(self): + """ + Check the supplied email address against a list of known free + webmail domains. + + """ + email_domain = self.cleaned_data['email'].split('@')[1] + if email_domain in self.bad_domains: + raise forms.ValidationError(_(u'Registration using free email addresses is prohibited. Please supply a different email address.')) + return self.cleaned_data['email'] diff --git a/apps/registration/management/__init__.py b/apps/registration/management/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/registration/management/commands/__init__.py b/apps/registration/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/registration/management/commands/cleanupregistration.py b/apps/registration/management/commands/cleanupregistration.py new file mode 100644 index 000000000..33f0ad6a1 --- /dev/null +++ b/apps/registration/management/commands/cleanupregistration.py @@ -0,0 +1,19 @@ +""" +A management command which deletes expired accounts (e.g., +accounts which signed up but never activated) from the database. + +Calls ``RegistrationProfile.objects.delete_expired_users()``, which +contains the actual logic for determining which accounts are deleted. + +""" + +from django.core.management.base import NoArgsCommand + +from apps.registration.models import RegistrationProfile + + +class Command(NoArgsCommand): + help = "Delete expired user registrations from the database" + + def handle_noargs(self, **options): + RegistrationProfile.objects.delete_expired_users() diff --git a/apps/registration/models.py b/apps/registration/models.py new file mode 100644 index 000000000..d13a07aac --- /dev/null +++ b/apps/registration/models.py @@ -0,0 +1,250 @@ +import datetime +import random +import re +import sha + +from django.conf import settings +from django.db import models +from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User +from django.contrib.sites.models import Site + + +SHA1_RE = re.compile('^[a-f0-9]{40}$') + + +class RegistrationManager(models.Manager): + """ + Custom manager for the ``RegistrationProfile`` model. + + The methods defined here provide shortcuts for account creation + and activation (including generation and emailing of activation + keys), and for cleaning out expired inactive accounts. + + """ + def activate_user(self, activation_key): + """ + Validate an activation key and activate the corresponding + ``User`` if valid. + + If the key is valid and has not expired, return the ``User`` + after activating. + + If the key is not valid or has expired, return ``False``. + + If the key is valid but the ``User`` is already active, + return ``False``. + + To prevent reactivation of an account which has been + deactivated by site administrators, the activation key is + reset to the string ``ALREADY_ACTIVATED`` after successful + activation. + + """ + # Make sure the key we're trying conforms to the pattern of a + # SHA1 hash; if it doesn't, no point trying to look it up in + # the database. + if SHA1_RE.search(activation_key): + try: + profile = self.get(activation_key=activation_key) + except self.model.DoesNotExist: + return False + if not profile.activation_key_expired(): + user = profile.user + user.is_active = True + user.save() + profile.activation_key = self.model.ACTIVATED + profile.save() + return user + return False + + def create_inactive_user(self, username, password, email, + send_email=True, profile_callback=None): + """ + Create a new, inactive ``User``, generates a + ``RegistrationProfile`` and email its activation key to the + ``User``, returning the new ``User``. + + To disable the email, call with ``send_email=False``. + + The activation email will make use of two templates: + + ``registration/activation_email_subject.txt`` + This template will be used for the subject line of the + email. It receives one context variable, ``site``, which + is the currently-active + ``django.contrib.sites.models.Site`` instance. Because it + is used as the subject line of an email, this template's + output **must** be only a single line of text; output + longer than one line will be forcibly joined into only a + single line. + + ``registration/activation_email.txt`` + This template will be used for the body of the email. It + will receive three context variables: ``activation_key`` + will be the user's activation key (for use in constructing + a URL to activate the account), ``expiration_days`` will + be the number of days for which the key will be valid and + ``site`` will be the currently-active + ``django.contrib.sites.models.Site`` instance. + + To enable creation of a custom user profile along with the + ``User`` (e.g., the model specified in the + ``AUTH_PROFILE_MODULE`` setting), define a function which + knows how to create and save an instance of that model with + appropriate default values, and pass it as the keyword + argument ``profile_callback``. This function should accept one + keyword argument: + + ``user`` + The ``User`` to relate the profile to. + + """ + new_user = User.objects.create_user(username, email, password) + new_user.is_active = False + new_user.save() + + registration_profile = self.create_profile(new_user) + + if profile_callback is not None: + profile_callback(user=new_user) + + if send_email: + from django.core.mail import send_mail + current_site = Site.objects.get_current() + + subject = render_to_string('registration/activation_email_subject.txt', + { 'site': current_site }) + # Email subject *must not* contain newlines + subject = ''.join(subject.splitlines()) + + message = render_to_string('registration/activation_email.txt', + { 'activation_key': registration_profile.activation_key, + 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS, + 'site': current_site }) + + send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [new_user.email]) + return new_user + + def create_profile(self, user): + """ + Create a ``RegistrationProfile`` for a given + ``User``, and return the ``RegistrationProfile``. + + The activation key for the ``RegistrationProfile`` will be a + SHA1 hash, generated from a combination of the ``User``'s + username and a random salt. + + """ + salt = sha.new(str(random.random())).hexdigest()[:5] + activation_key = sha.new(salt+user.username).hexdigest() + return self.create(user=user, + activation_key=activation_key) + + def delete_expired_users(self): + """ + Remove expired instances of ``RegistrationProfile`` and their + associated ``User``s. + + Accounts to be deleted are identified by searching for + instances of ``RegistrationProfile`` with expired activation + keys, and then checking to see if their associated ``User`` + instances have the field ``is_active`` set to ``False``; any + ``User`` who is both inactive and has an expired activation + key will be deleted. + + It is recommended that this method be executed regularly as + part of your routine site maintenance; this application + provides a custom management command which will call this + method, accessible as ``manage.py cleanupregistration``. + + Regularly clearing out accounts which have never been + activated serves two useful purposes: + + 1. It alleviates the ocasional need to reset a + ``RegistrationProfile`` and/or re-send an activation email + when a user does not receive or does not act upon the + initial activation email; since the account will be + deleted, the user will be able to simply re-register and + receive a new activation key. + + 2. It prevents the possibility of a malicious user registering + one or more accounts and never activating them (thus + denying the use of those usernames to anyone else); since + those accounts will be deleted, the usernames will become + available for use again. + + If you have a troublesome ``User`` and wish to disable their + account while keeping it in the database, simply delete the + associated ``RegistrationProfile``; an inactive ``User`` which + does not have an associated ``RegistrationProfile`` will not + be deleted. + + """ + for profile in self.all(): + if profile.activation_key_expired(): + user = profile.user + if not user.is_active: + user.delete() + + +class RegistrationProfile(models.Model): + """ + A simple profile which stores an activation key for use during + user account registration. + + Generally, you will not want to interact directly with instances + of this model; the provided manager includes methods + for creating and activating new accounts, as well as for cleaning + out accounts which have never been activated. + + While it is possible to use this model as the value of the + ``AUTH_PROFILE_MODULE`` setting, it's not recommended that you do + so. This model's sole purpose is to store data temporarily during + account registration and activation, and a mechanism for + automatically creating an instance of a site-specific profile + model is provided via the ``create_inactive_user`` on + ``RegistrationManager``. + + """ + ACTIVATED = u"ALREADY_ACTIVATED" + + user = models.ForeignKey(User, unique=True, verbose_name=_('user')) + activation_key = models.CharField(_('activation key'), max_length=40) + + objects = RegistrationManager() + + class Meta: + verbose_name = _('registration profile') + verbose_name_plural = _('registration profiles') + + def __unicode__(self): + return u"Registration information for %s" % self.user + + def activation_key_expired(self): + """ + Determine whether this ``RegistrationProfile``'s activation + key has expired, returning a boolean -- ``True`` if the key + has expired. + + Key expiration is determined by a two-step process: + + 1. If the user has already activated, the key will have been + reset to the string ``ALREADY_ACTIVATED``. Re-activating is + not permitted, and so this method returns ``True`` in this + case. + + 2. Otherwise, the date the user signed up is incremented by + the number of days specified in the setting + ``ACCOUNT_ACTIVATION_DAYS`` (which should be the number of + days after signup during which a user is allowed to + activate their account); if the result is less than or + equal to the current date, the key has expired and this + method returns ``True``. + + """ + expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) + return self.activation_key == self.ACTIVATED or \ + (self.user.date_joined + expiration_date <= datetime.datetime.now()) + activation_key_expired.boolean = True diff --git a/apps/registration/tests.py b/apps/registration/tests.py new file mode 100644 index 000000000..57a67dde3 --- /dev/null +++ b/apps/registration/tests.py @@ -0,0 +1,318 @@ +""" +Unit tests for django-registration. + +These tests assume that you've completed all the prerequisites for +getting django-registration running in the default setup, to wit: + +1. You have ``registration`` in your ``INSTALLED_APPS`` setting. + +2. You have created all of the templates mentioned in this + application's documentation. + +3. You have added the setting ``ACCOUNT_ACTIVATION_DAYS`` to your + settings file. + +4. You have URL patterns pointing to the registration and activation + views, with the names ``registration_register`` and + ``registration_activate``, respectively, and a URL pattern named + 'registration_complete'. + +""" + +import datetime +import sha + +from django.conf import settings +from django.contrib.auth.models import User +from django.core import mail +from django.core import management +from django.core.urlresolvers import reverse +from django.test import TestCase + +from apps.registration import forms +from apps.registration.models import RegistrationProfile + + +class RegistrationTestCase(TestCase): + """ + Base class for the test cases; this sets up two users -- one + expired, one not -- which are used to exercise various parts of + the application. + + """ + def setUp(self): + self.sample_user = RegistrationProfile.objects.create_inactive_user(username='alice', + password='secret', + email='alice@example.com') + self.expired_user = RegistrationProfile.objects.create_inactive_user(username='bob', + password='swordfish', + email='bob@example.com') + self.expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1) + self.expired_user.save() + + +class RegistrationModelTests(RegistrationTestCase): + """ + Tests for the model-oriented functionality of django-registration, + including ``RegistrationProfile`` and its custom manager. + + """ + def test_new_user_is_inactive(self): + """ + Test that a newly-created user is inactive. + + """ + self.failIf(self.sample_user.is_active) + + def test_registration_profile_created(self): + """ + Test that a ``RegistrationProfile`` is created for a new user. + + """ + self.assertEqual(RegistrationProfile.objects.count(), 2) + + def test_activation_email(self): + """ + Test that user signup sends an activation email. + + """ + self.assertEqual(len(mail.outbox), 2) + + def test_activation(self): + """ + Test that user activation actually activates the user and + properly resets the activation key, and fails for an + already-active or expired user, or an invalid key. + + """ + # Activating a valid user returns the user. + self.failUnlessEqual(RegistrationProfile.objects.activate_user(RegistrationProfile.objects.get(user=self.sample_user).activation_key).pk, + self.sample_user.pk) + + # The activated user must now be active. + self.failUnless(User.objects.get(pk=self.sample_user.pk).is_active) + + # The activation key must now be reset to the "already activated" constant. + self.failUnlessEqual(RegistrationProfile.objects.get(user=self.sample_user).activation_key, + RegistrationProfile.ACTIVATED) + + # Activating an expired user returns False. + self.failIf(RegistrationProfile.objects.activate_user(RegistrationProfile.objects.get(user=self.expired_user).activation_key)) + + # Activating from a key that isn't a SHA1 hash returns False. + self.failIf(RegistrationProfile.objects.activate_user('foo')) + + # Activating from a key that doesn't exist returns False. + self.failIf(RegistrationProfile.objects.activate_user(sha.new('foo').hexdigest())) + + def test_account_expiration_condition(self): + """ + Test that ``RegistrationProfile.activation_key_expired()`` + returns ``True`` for expired users and for active users, and + ``False`` otherwise. + + """ + # Unexpired user returns False. + self.failIf(RegistrationProfile.objects.get(user=self.sample_user).activation_key_expired()) + + # Expired user returns True. + self.failUnless(RegistrationProfile.objects.get(user=self.expired_user).activation_key_expired()) + + # Activated user returns True. + RegistrationProfile.objects.activate_user(RegistrationProfile.objects.get(user=self.sample_user).activation_key) + self.failUnless(RegistrationProfile.objects.get(user=self.sample_user).activation_key_expired()) + + def test_expired_user_deletion(self): + """ + Test that + ``RegistrationProfile.objects.delete_expired_users()`` deletes + only inactive users whose activation window has expired. + + """ + RegistrationProfile.objects.delete_expired_users() + self.assertEqual(RegistrationProfile.objects.count(), 1) + + def test_management_command(self): + """ + Test that ``manage.py cleanupregistration`` functions + correctly. + + """ + management.call_command('cleanupregistration') + self.assertEqual(RegistrationProfile.objects.count(), 1) + + +class RegistrationFormTests(RegistrationTestCase): + """ + Tests for the forms and custom validation logic included in + django-registration. + + """ + def test_registration_form(self): + """ + Test that ``RegistrationForm`` enforces username constraints + and matching passwords. + + """ + invalid_data_dicts = [ + # Non-alphanumeric username. + { + 'data': + { 'username': 'foo/bar', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }, + 'error': + ('username', [u"Enter a valid value."]) + }, + # Already-existing username. + { + 'data': + { 'username': 'alice', + 'email': 'alice@example.com', + 'password1': 'secret', + 'password2': 'secret' }, + 'error': + ('username', [u"This username is already taken. Please choose another."]) + }, + # Mismatched passwords. + { + 'data': + { 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'bar' }, + 'error': + ('__all__', [u"You must type the same password each time"]) + }, + ] + + for invalid_dict in invalid_data_dicts: + form = forms.RegistrationForm(data=invalid_dict['data']) + self.failIf(form.is_valid()) + self.assertEqual(form.errors[invalid_dict['error'][0]], invalid_dict['error'][1]) + + form = forms.RegistrationForm(data={ 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.failUnless(form.is_valid()) + + def test_registration_form_tos(self): + """ + Test that ``RegistrationFormTermsOfService`` requires + agreement to the terms of service. + + """ + form = forms.RegistrationFormTermsOfService(data={ 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['tos'], [u"You must agree to the terms to register"]) + + form = forms.RegistrationFormTermsOfService(data={ 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo', + 'tos': 'on' }) + self.failUnless(form.is_valid()) + + def test_registration_form_unique_email(self): + """ + Test that ``RegistrationFormUniqueEmail`` validates uniqueness + of email addresses. + + """ + form = forms.RegistrationFormUniqueEmail(data={ 'username': 'foo', + 'email': 'alice@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['email'], [u"This email address is already in use. Please supply a different email address."]) + + form = forms.RegistrationFormUniqueEmail(data={ 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.failUnless(form.is_valid()) + + def test_registration_form_no_free_email(self): + """ + Test that ``RegistrationFormNoFreeEmail`` disallows + registration with free email addresses. + + """ + base_data = { 'username': 'foo', + 'password1': 'foo', + 'password2': 'foo' } + for domain in ('aim.com', 'aol.com', 'email.com', 'gmail.com', + 'googlemail.com', 'hotmail.com', 'hushmail.com', + 'msn.com', 'mail.ru', 'mailinator.com', 'live.com'): + invalid_data = base_data.copy() + invalid_data['email'] = u"foo@%s" % domain + form = forms.RegistrationFormNoFreeEmail(data=invalid_data) + self.failIf(form.is_valid()) + self.assertEqual(form.errors['email'], [u"Registration using free email addresses is prohibited. Please supply a different email address."]) + + base_data['email'] = 'foo@example.com' + form = forms.RegistrationFormNoFreeEmail(data=base_data) + self.failUnless(form.is_valid()) + + +class RegistrationViewTests(RegistrationTestCase): + """ + Tests for the views included in django-registration. + + """ + def test_registration_view(self): + """ + Test that the registration view rejects invalid submissions, + and creates a new user and redirects after a valid submission. + + """ + # Invalid data fails. + response = self.client.post(reverse('registration_register'), + data={ 'username': 'alice', # Will fail on username uniqueness. + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.assertEqual(response.status_code, 200) + self.failUnless(response.context['form']) + self.failUnless(response.context['form'].errors) + + response = self.client.post(reverse('registration_register'), + data={ 'username': 'foo', + 'email': 'foo@example.com', + 'password1': 'foo', + 'password2': 'foo' }) + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], 'http://testserver%s' % reverse('registration_complete')) + self.assertEqual(RegistrationProfile.objects.count(), 3) + + def test_activation_view(self): + """ + Test that the activation view activates the user from a valid + key and fails if the key is invalid or has expired. + + """ + # Valid user puts the user account into the context. + response = self.client.get(reverse('registration_activate', + kwargs={ 'activation_key': RegistrationProfile.objects.get(user=self.sample_user).activation_key })) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['account'].pk, self.sample_user.pk) + + # Expired user sets the account to False. + response = self.client.get(reverse('registration_activate', + kwargs={ 'activation_key': RegistrationProfile.objects.get(user=self.expired_user).activation_key })) + self.failIf(response.context['account']) + + # Invalid key gets to the view, but sets account to False. + response = self.client.get(reverse('registration_activate', + kwargs={ 'activation_key': 'foo' })) + self.failIf(response.context['account']) + + # Nonexistent key sets the account to False. + response = self.client.get(reverse('registration_activate', + kwargs={ 'activation_key': sha.new('foo').hexdigest() })) + self.failIf(response.context['account']) diff --git a/apps/registration/urls.py b/apps/registration/urls.py new file mode 100644 index 000000000..17cd97016 --- /dev/null +++ b/apps/registration/urls.py @@ -0,0 +1,72 @@ +""" +URLConf for Django user registration and authentication. + +If the default behavior of the registration views is acceptable to +you, simply use a line like this in your root URLConf to set up the +default URLs for registration:: + + (r'^accounts/', include('registration.urls')), + +This will also automatically set up the views in +``django.contrib.auth`` at sensible default locations. + +But if you'd like to customize the behavior (e.g., by passing extra +arguments to the various views) or split up the URLs, feel free to set +up your own URL patterns for these views instead. If you do, it's a +good idea to use the names ``registration_activate``, +``registration_complete`` and ``registration_register`` for the +various steps of the user-signup process. + +""" + + +from django.conf.urls.defaults import * +from django.views.generic.simple import direct_to_template +from django.contrib.auth import views as auth_views + +from apps.registration.views import activate +from apps.registration.views import register + + +urlpatterns = patterns('apps.registration.views', + # Activation keys get matched by \w+ instead of the more specific + # [a-fA-F0-9]{40} because a bad activation key should still get to the view; + # that way it can return a sensible "invalid key" message instead of a + # confusing 404. + url(r'^activate/(?P\w+)/$', + 'activate', + name='registration_activate'), + url(r'^login/$', + auth_views.login, + {'template_name': 'registration/login.html'}, + name='auth_login'), + url(r'^logout/$', + auth_views.logout, + {'template_name': 'registration/login.html'}, + name='auth_logout'), + url(r'^password/change/$', + auth_views.password_change, + name='auth_password_change'), + url(r'^password/change/done/$', + auth_views.password_change_done, + name='auth_password_change_done'), + url(r'^password/reset/$', + auth_views.password_reset, + name='auth_password_reset'), + url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', + auth_views.password_reset_confirm, + name='auth_password_reset_confirm'), + url(r'^password/reset/complete/$', + auth_views.password_reset_complete, + name='auth_password_reset_complete'), + url(r'^password/reset/done/$', + auth_views.password_reset_done, + name='auth_password_reset_done'), + url(r'^register/$', + 'register', + name='registration_register'), + url(r'^register/complete/$', + direct_to_template, + {'template': 'registration/registration_complete.html'}, + name='registration_complete'), + ) diff --git a/apps/registration/views.py b/apps/registration/views.py new file mode 100644 index 000000000..945ee8fbb --- /dev/null +++ b/apps/registration/views.py @@ -0,0 +1,164 @@ +""" +Views which allow users to create and activate accounts. + +""" + + +from django.conf import settings +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect +from django.shortcuts import render_to_response +from django.template import RequestContext + +from apps.registration.forms import RegistrationForm +from apps.registration.models import RegistrationProfile + + +def activate(request, activation_key, + template_name='registration/activate.html', + extra_context=None): + """ + Activate a ``User``'s account from an activation key, if their key + is valid and hasn't expired. + + By default, use the template ``registration/activate.html``; to + change this, pass the name of a template as the keyword argument + ``template_name``. + + **Required arguments** + + ``activation_key`` + The activation key to validate and use for activating the + ``User``. + + **Optional arguments** + + ``extra_context`` + A dictionary of variables to add to the template context. Any + callable object in this dictionary will be called to produce + the end result which appears in the context. + + ``template_name`` + A custom template to use. + + **Context:** + + ``account`` + The ``User`` object corresponding to the account, if the + activation was successful. ``False`` if the activation was not + successful. + + ``expiration_days`` + The number of days for which activation keys stay valid after + registration. + + Any extra variables supplied in the ``extra_context`` argument + (see above). + + **Template:** + + registration/activate.html or ``template_name`` keyword argument. + + """ + activation_key = activation_key.lower() # Normalize before trying anything with it. + account = RegistrationProfile.objects.activate_user(activation_key) + if extra_context is None: + extra_context = {} + context = RequestContext(request) + for key, value in extra_context.items(): + context[key] = callable(value) and value() or value + return render_to_response(template_name, + { 'account': account, + 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS }, + context_instance=context) + + +def register(request, success_url=None, + form_class=RegistrationForm, profile_callback=None, + template_name='registration/registration_form.html', + extra_context=None): + """ + Allow a new user to register an account. + + Following successful registration, issue a redirect; by default, + this will be whatever URL corresponds to the named URL pattern + ``registration_complete``, which will be + ``/accounts/register/complete/`` if using the included URLConf. To + change this, point that named pattern at another URL, or pass your + preferred URL as the keyword argument ``success_url``. + + By default, ``registration.forms.RegistrationForm`` will be used + as the registration form; to change this, pass a different form + class as the ``form_class`` keyword argument. The form class you + specify must have a method ``save`` which will create and return + the new ``User``, and that method must accept the keyword argument + ``profile_callback`` (see below). + + To enable creation of a site-specific user profile object for the + new user, pass a function which will create the profile object as + the keyword argument ``profile_callback``. See + ``RegistrationManager.create_inactive_user`` in the file + ``models.py`` for details on how to write this function. + + By default, use the template + ``registration/registration_form.html``; to change this, pass the + name of a template as the keyword argument ``template_name``. + + **Required arguments** + + None. + + **Optional arguments** + + ``form_class`` + The form class to use for registration. + + ``extra_context`` + A dictionary of variables to add to the template context. Any + callable object in this dictionary will be called to produce + the end result which appears in the context. + + ``profile_callback`` + A function which will be used to create a site-specific + profile instance for the new ``User``. + + ``success_url`` + The URL to redirect to on successful registration. + + ``template_name`` + A custom template to use. + + **Context:** + + ``form`` + The registration form. + + Any extra variables supplied in the ``extra_context`` argument + (see above). + + **Template:** + + registration/registration_form.html or ``template_name`` keyword + argument. + + """ + if request.method == 'POST': + form = form_class(data=request.POST, files=request.FILES) + if form.is_valid(): + new_user = form.save(profile_callback=profile_callback) + # success_url needs to be dynamically generated here; setting a + # a default value using reverse() will cause circular-import + # problems with the default URLConf for this application, which + # imports this file. + return HttpResponseRedirect(success_url or reverse('registration_complete')) + else: + form = form_class() + + if extra_context is None: + extra_context = {} + context = RequestContext(request) + for key, value in extra_context.items(): + context[key] = callable(value) and value() or value + return render_to_response(template_name, + { 'form': form }, + context_instance=context) diff --git a/apps/rss_feeds/__init__.py b/apps/rss_feeds/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/rss_feeds/admin.py b/apps/rss_feeds/admin.py new file mode 100644 index 000000000..3a1e3f96e --- /dev/null +++ b/apps/rss_feeds/admin.py @@ -0,0 +1,6 @@ +from apps.rss_feeds.models import Feed, Story, Tag +from django.contrib import admin + +admin.site.register(Feed) +admin.site.register(Story) +admin.site.register(Tag) \ No newline at end of file diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py new file mode 100644 index 000000000..916e9c90c --- /dev/null +++ b/apps/rss_feeds/models.py @@ -0,0 +1,244 @@ +from django.db import models +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from django.core.cache import cache +from utils import feedparser, object_manager +from utils.dateutil.parser import parse as dateutil_parse +from utils.feed_functions import encode, prints, mtime +import time, datetime, random +from pprint import pprint +from django.utils.http import urlquote +from django.db.models import Q +from utils.diff import HTMLDiff + +USER_AGENT = 'NewsBlur v1.0 - newsblur.com' + +class Feed(models.Model): + feed_address = models.URLField(max_length=255, verify_exists=True, unique=True) + feed_link = models.URLField(max_length=200, blank=True) + feed_title = models.CharField(max_length=255, blank=True) + active = models.BooleanField(default=True) + num_subscribers = models.IntegerField(default=0) + last_update = models.DateTimeField(auto_now=True, default=0) + min_to_decay = models.IntegerField(default=15) + days_to_trim = models.IntegerField(default=90) + creation = models.DateField(auto_now_add=True) + etag = models.CharField(max_length=50, blank=True) + last_modified = models.DateTimeField(null=True, blank=True) + + + def __unicode__(self): + return self.feed_title + + def last_updated(self): + return time.time() - time.mktime(self.last_update.timetuple()) + + def new_stories_since_date(self, date): + story_count = Story.objects.filter(story_date__gte=date, + story_feed=self).count() + return story_count + + def add_feed(self, feed_address, feed_link, feed_title): + print locals() + + def update(self, force=False, feed=None): + if (self.last_updated() / 60) < (self.min_to_decay + (random.random()*self.min_to_decay)) and not force: + print 'Feed unchanged: ' + self.feed_title + return + + feed_updated, feed = cache.get("feed:" + self.feed_address, (None, None,)) + if feed and not force: + print 'Feed Cached: ' + self.feed_title + if not feed or force: + last_modified = None + now = datetime.datetime.now() + if self.last_modified: + last_modified = datetime.datetime.timetuple(self.last_modified) + if not feed: + print '[%d] Retrieving Feed: %s %s' % (self.id, self.feed_title, last_modified) + feed = feedparser.parse(self.feed_address, + etag=self.etag, + modified=last_modified, + agent=USER_AGENT) + cache.set("feed:" + self.feed_address, (now, feed), + self.min_to_decay * 60 * 5) + + self.last_update = datetime.datetime.now() + + # check for movement or disappearance + if hasattr(feed, 'status'): + if feed.status == 301: + self.feed_url = feed.href + if feed.status == 410: + self.active = False + if feed.status >= 400: + return + + # Fill in optional fields + if not self.feed_title: + self.feed_title = feed.feed.get('title', + feed.feed.get('link', 'No Title')) + if not self.feed_link: + self.feed_link = feed.feed.get('link', 'null:') + + self.etag = feed.get('etag', '') + if not self.etag: + self.etag = '' + + self.last_modified = mtime(feed.get('modified', datetime.datetime.timetuple(datetime.datetime.now()))) + + self.save() + + for story in feed['entries']: + self.save_story(story) + + self.trim_feed(); + + return + + def trim_feed(self): + date_diff = datetime.datetime.now() - datetime.timedelta(self.days_to_trim) + stories = Story.objects.filter(story_feed=self, story_date__lte=date_diff) + for story in stories: + story.story_past_trim_date = True + story.save() + + def save_story(self, story): + story = self._pre_process_story(story) + + if story.get('title'): + story_contents = story.get('content') + if story_contents is not None: + story_content = story_contents[0]['value'] + else: + story_content = story.get('summary') + existing_story = self._exists_story(story) + if not existing_story: + pub_date = datetime.datetime.timetuple(story.get('published')) + print '- New story: %s %s' % (pub_date, story.get('title')) + + s = Story(story_feed = self, + story_date = story.get('published'), + story_title = story.get('title'), + story_content = story_content, + story_author = story.get('author'), + story_permalink = story.get('link') + ) + try: + s.save() + except: + pass + elif existing_story.story_title != story.get('title') \ + or existing_story.story_content != story_content: + # update story + print '- Updated story in feed (%s): %s / %s' % (self.feed_title, len(existing_story.story_content), len(story_content)) + + original_content = None + if existing_story.story_original_content: + original_content = existing_story.story_original_content + else: + original_content = existing_story.story_content + diff = HTMLDiff(original_content, story_content) + print "\t\tDiff: %s %s %s" % diff.getStats() + print '\tExisting title / New: : \n\t\t- %s\n\t\t- %s' % (existing_story.story_title, story.get('title')) + + s = Story(id = existing_story.id, + story_feed = self, + story_date = story.get('published'), + story_title = story.get('title'), + story_content = diff.getDiff(), + story_original_content = original_content, + story_author = story.get('author'), + story_permalink = story.get('link') + ) + try: + s.save() + except: + pass + # else: + # print "Unchanged story: %s " % story.get('title') + + return + + def _exists_story(self, entry): + pub_date = entry['published'] + start_date = pub_date - datetime.timedelta(hours=12) + end_date = pub_date + datetime.timedelta(hours=12) + # print "Dates: %s %s %s" % (pub_date, start_date, end_date) + existing_story = Story.objects.filter( + ( + Q(story_title__iexact=entry['title']) + & Q(story_date__range=(start_date, end_date)) + ) + | ( + Q(story_permalink__iexact=entry['link']) + & Q(story_date__range=(start_date, end_date)) + ), + story_feed = self + ) + if len(existing_story): + return existing_story[0] + else: + return None + + def _pre_process_story(self, entry): + date_published = entry.get('published', entry.get('updated')) + if not date_published: + date_published = str(datetime.datetime.now()) + date_published = dateutil_parse(date_published) + # Change the date to UTC and remove timezone info since + # MySQL doesn't support it. + timezone_diff = datetime.datetime.utcnow() - datetime.datetime.now() + date_published_offset = date_published.utcoffset() + if date_published_offset: + date_published = (date_published - date_published_offset + - timezone_diff).replace(tzinfo=None) + else: + date_published = date_published.replace(tzinfo=None) + + entry['published'] = date_published + + protocol_index = entry['link'].find("://") + if protocol_index != -1: + entry['link'] = (entry['link'][:protocol_index+3] + + urlquote(entry['link'][protocol_index+3:])) + else: + entry['link'] = urlquote(entry['link']) + return entry + + class Meta: + db_table="feeds" + ordering=["feed_title"] + +class Tag(models.Model): + name = models.CharField(max_length=100) + + def __unicode__(self): + return self.name + + def save(self): + super(Tag, self).save() + +class Story(models.Model): + '''A feed item''' + story_feed = models.ForeignKey(Feed) + story_date = models.DateTimeField() + story_title = models.CharField(max_length=255) + story_content = models.TextField(null=True, blank=True) + story_original_content = models.TextField(null=True, blank=True) + story_content_type = models.CharField(max_length=255, null=True, + blank=True) + story_author = models.CharField(max_length=255, null=True, blank=True) + story_permalink = models.CharField(max_length=1000) + story_past_trim_date = models.BooleanField(default=False) + tags = models.ManyToManyField(Tag) + + def __unicode__(self): + return self.story_title + + class Meta: + verbose_name_plural = "stories" + verbose_name = "story" + db_table="stories" + ordering=["-story_date", "story_feed"] + \ No newline at end of file diff --git a/apps/rss_feeds/tests.py b/apps/rss_feeds/tests.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/rss_feeds/views.py b/apps/rss_feeds/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/apps/rss_feeds/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/manage.py b/manage.py new file mode 100755 index 000000000..5e78ea979 --- /dev/null +++ b/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/media/css/reader.css b/media/css/reader.css new file mode 100644 index 000000000..44a682b0c --- /dev/null +++ b/media/css/reader.css @@ -0,0 +1,509 @@ +/* ========== */ +/* = Global = */ +/* ========== */ + +body { + /*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; + font-family: 'Lucida Grande',Helvetica, Arial; + font-size:62%; +} + +a, a:active, a:hover, a:visited, button { + outline: none; +} + +a img { + border: none; +} + +/* =================== */ +/* = Resize Controls = */ +/* =================== */ + +.ui-layout-resizer-west { + background: #e0e0e0 url(../img/reader/resize_west_small.png) repeat-y 50% 50%; +} + +.ui-layout-resizer-north { + background: #e0e0e0 url(../img/reader/resize_north.png) repeat-x 50% 50%; +} + +/* ============= */ +/* = Feed List = */ +/* ============= */ + +#feed_list { + position: fixed; + left: 0px; + top: 0px; + width: 220px; + background-color: #D7DDE6; + border-right: 1px solid #808080; + z-index: 20; + font-size: 1.05em; + overflow-y: auto; +} + +#feed_list .folder { + margin: 6px 0px 4px; + background: transparent url(../img/icons/silk/folder.png) no-repeat 3px 1px; +} + +#feed_list .folder .folder_title { + padding: 3px 0px 4px 22px; + font-weight: bold; + display: block; + color: #404040; + text-transform: uppercase; +} + +#feed_list .feed { + position: relative; + cursor: pointer; + border-top: 1px solid #D7DDE6; + border-bottom: 1px solid #D7DDE6; +} + +#feed_list .feed_id { + display: none; +} +#feed_list img.feed_favicon { + position: absolute; + top: 2px; + left: 24px; +} +#feed_list .feed_title { + display: block; + font-weight: bold; + padding: 4px 42px 2px 45px; + text-decoration: none; + color: #272727; + line-height: 1.3em; +} + +#feed_list .feed.no_unread_items .feed_title { + font-weight: normal; +} + +#feed_list .feed.selected { + background: #f6a828 url(../theme/images/ui-bg_highlight-hard_35_f6a828_1x100.png) 0 50% repeat-x; + border-top: 1px solid #A8A8A8; + border-bottom: 1px solid #A8A8A8; +} +#feed_list .unread_count { + position: absolute; + top: 3px; + right: 7px; + font-weight: bold; + color: #FFF; + padding: 0 6px; + background-color: #8eb6e8; +} + + +/* ================ */ +/* = Story Titles = */ +/* ================ */ + +#story_titles { + z-index: 10; + position: fixed; + top: 0px; + left: 0px; + height: 200px; + width: 100%; + overflow-y: scroll; + font-size: 1.1em; +} + +#story_titles .wrapper { + margin-left: 220px; +} + +#story_titles .feed_bar { + font-weight: bold; + font-size: 1.3em; + padding: 2px 140px 2px 28px; + background: #dadada url(../theme/images/dadada_40x100_textures_03_highlight_soft_75.png) 0 50% repeat-x; + border-bottom: 2px solid #404040; + position: relative; +} + +#story_titles .feed_bar .feed_heading { + display: block; + text-align: center; +} + +#story_titles .feed_bar .feed_heading .feed_favicon { + margin-right: 8px; + vertical-align: middle; +} + +#story_titles .feed_bar .unread_count { + position: absolute; + right: 4px; + top: 4px; +} + +#story_titles .feed_bar .feed_id { + display: none; +} + +#story_titles .story { + position: relative; + cursor: pointer; + font-weight: bold; + padding: 0px 206px 0px 28px; + border-top: 1px solid #E7EDF6; + text-decoration: none; + color: #272727; + line-height: 1em; + background: transparent url(../img/icons/silk/bullet_orange.png) no-repeat 6px 50%; +} + +#story_titles .story.NB-story-hover { + background-color: #f0f0f0; +} + +#story_titles .story a.story_title { + text-decoration: none; + color: #272727; + display: block; + padding: 4px 0px; +} +#story_titles .story .story_id { + display: none; +} + +#story_titles .story.read { + font-weight: normal; + background: none; +} + +#story_titles .story .story_date { + position: absolute; + right: 4px; + width: 200px; + top: 4px; +} +#story_titles .story.selected { + color: #304080; + border-top: 1px solid #D7DDE6; + background: #dadada url(../theme/images/dadada_40x100_textures_03_highlight_soft_75.png) 0 50% repeat-x; +} +#story_titles .story.after_selected { + border-top: 1px solid #D7DDE6; +} + +/* =================== */ +/* = Story Navigator = */ +/* =================== */ + +#story_pane .story_navigator { + position: absolute; + right: 4px; + top: 6px; +} + +#story_pane a.button { + outline: none; + border: none; + text-decoration: none; + cursor: pointer; + white-space: nowrap; + vertical-align: middle; + display: -moz-inline-box; + display: inline-block; + overflow: visible; + color: #000; + background-color: #acc; + padding: 5px 7px; + margin: 0px 2px; +} + +#story_pane a.button:hover { + background-color: #cee; +} + +#story_pane a.button.next_unread { + float: right; + width: 24px; + height: 16px; + background: #acc url(../img/icons/silk/arrow_down.png) no-repeat 50% 50%; +} + +#story_pane a.button.next_unread:hover { + background: #cee url(../img/icons/silk/arrow_down.png) no-repeat 50% 50%; +} + +#story_pane a.button.previous_unread { + float: right; + width: 16px; + height: 16px; + background: #acc url(../img/icons/silk/arrow_up.png) no-repeat 50% 50%; +} + +#story_pane a.button.previous_unread:hover { + background: #cee url(../img/icons/silk/arrow_up.png) no-repeat 50% 50%; +} + +/* ================= */ +/* = Story Content = */ +/* ================= */ + +#story_pane { + z-index: 10; + position: fixed; + top: 200px; + left: 0px; + width: 100%; + overflow-y: scroll; + font-size: 1.2em; + line-height: 1.5em; + height: 315px; +} + +#story_pane .wrapper { + margin-left: 220px; + position: relative; +} + + +#story_pane .story_title { + font-weight: bold; + font-size: 1.3em; + padding: 12px 140px 12px 28px; + background: #dadada url(../theme/images/dadada_40x100_textures_03_highlight_soft_75.png) 0 50% repeat-x; + border-top: 4px solid #404040; +} + +#story_pane .story_title a { + text-decoration: none; + color: #101050; +} + +#story_pane .story_title a:hover { + color: #1010A0; +} + +#story_pane .story_meta { + color: #606060; + font-weight: bold; + font-size: .8em; + width: 6em; + line-height: 1.9em; + clear: both; + float: left; + text-transform: uppercase; + padding: 0px 4px 0px 0px; +} + +#story_pane .story_feed { + padding: 4px 140px 0px 28px; +} + +#story_pane .story_feed .feed_favicon { + position: absolute; + left: 0px; + top: -1px; +} + +#story_pane .story_feed .data { + padding-left: 20px; + position: relative; +} + +#story_pane .story_author { + padding: 0px 140px 0px 28px; +} + +#story_pane .story_date { + padding: 0px 140px 0px 28px; +} + +#story_pane .story_content { + border-top: 1px solid #909090; + margin: 12px 140px 24px 28px; + padding: 12px 0px; +} + +#story_pane .story_endbar { + height: 8px; + border-top: 1px solid #404040; + background: #dadada url(../theme/images/dadada_40x100_textures_03_highlight_soft_75.png) 0 50% repeat-x; +} +/* ======================= */ +/* = Story Modifications = */ +/* ======================= */ + +#story_pane { + color: #2b2b2b; +} + +#story_pane p { + clear: both; +} + +#story_pane blockquote { + background-color: #F0F0F0; + border-left: 1px solid #9B9B9B; + padding: .5em 2em; + margin: 0px; +} + +/* ============ */ +/* = Task Bar = */ +/* ============ */ + +#task_bar { + height: 29px; + background: #e0e0e0 url(../img/reader/taskbar_background.png) repeat-x top left; +} + +/* ==================== */ +/* = OPML Import Form = */ +/* ==================== */ + +form.opml_import_form { + +} + +form.opml_import_form textarea { + width: 100%; + height: 200px; +} + +form.opml_import_form .section { + clear: both; + margin: 2px 0px; +} + +form.opml_import_form label { + display: block; +} +form.opml_import_form input { + display: block; + clear: both; + float: left; + margin: 0px 4px; +} + +/* ============== */ +/* = Bottom Bar = */ +/* ============== */ + +/*************************/ +/* Recommended for menus */ +/*************************/ + +button.menu { + cursor: pointer; +} + +div.menu { + display: none; + z-index: 99; + position: absolute; +} + +div.menu.active { + z-index: 100; +} + +/***********************/ +/* Completely optional */ +/***********************/ + +.menu_button { + line-height: 1.8; + text-shadow: 1px 1px #ddd; + color: #222; + background: #a8acae; + margin: 3px 2em 0 0.5em; + padding: 0 0.8em; + border: 0; + border-bottom: 1px solid #686c6e; + -webkit-border-radius: 0.5em; + -moz-border-radius: 0.5em; + border-radius: 0.5em; + float: right; + position: relative; + cursor: pointer; +} + + +.menu_button img { + vertical-align: -3px; + margin-right: 0.2em; +} + +.menu_button .menu { + display: none; + right: 0px; + bottom: 20px; + cursor: normal; +} + +.menu_button.hover .menu { + display: block; +} +.menu_button.hover { + -webkit-border-top-left-radius: 0; + -webkit-border-top-right-radius: 0; + -moz-border-radius-topleft: 0; + -moz-border-radius-topright: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top-color: #cacece; +} + +button.menu:hover, +button.menu.active { + background-color: #cacece; + text-shadow: 1px 1px #fff; +} + +div.menu { + font-size: 88%; + color: #444; + background: #cacece; + padding: 1em; + border: 1px solid #cacece; + border-top-width: 3px; + -moz-border-radius: 0.5em; + -moz-border-radius-topleft: 0; + -webkit-border-radius: 0.5em; + -webkit-border-top-left-radius: 0; + border-radius: 0.5em; + border-top-left-radius: 0; +} + +div.menu.active { + background-color: #eaeeee; +} + +div.menu h3 { + font-size: 108%; + font-weight: bold; + color: #444; + margin: 0; +} + +div.menu h4 { + font-size: 100%; + font-weight: normal; + line-height: 1.5; + color: #999; + margin: 0 0 0.5em 0; + white-space: nowrap; +} + +div.menu hr { + border: 0; + border-top: 1px solid #ddd; + border-bottom: 1px solid #fff; +} + +div.menu ul { + padding-left: 1.5em; +} \ No newline at end of file diff --git a/media/img/icons/actions/add-user.gif b/media/img/icons/actions/add-user.gif new file mode 100755 index 0000000000000000000000000000000000000000..fe1ddd7c9d38ee2300b8f2381a4ce444164a6051 GIT binary patch literal 907 zcmZ?wbhEHb6krfw_|Cw7|sFFe};Pu4DT5j{xi&(Gw0m7bN`bW z{-0y`e~;n+bB6!_foK$rhQKfhftfRBD*j|)1SNJIU{(O;2muBLjtqwXoH8C8794Ei z5YVv5_;8@Hm4{VohKJxIMNv2(6Bs!(M84UO2$E!h|NYk91PX~-Yp7| literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/add-user.png b/media/img/icons/actions/add-user.png new file mode 100755 index 0000000000000000000000000000000000000000..fa686a7c1e5c4f462c55213ff892b850dbee92a2 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJic)27@9NS%Lhso-U3d6}OfKo#t&e;MuBec1kAp z@R=z+7qYJ#2!}knAy@qB=2m5|lk80)i8SDFJiPYaeHt*BfLtK}huB_1ba<^LlzVVJm zi5ZdGOiMTFXg~K|vq8t~iE)K?-07$zT047AFmK{#o0*SfZ+PuVf9wFJXCs%$bd!fgWS< MboFyt=akR{0AC_}j{pDw literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/add.gif b/media/img/icons/actions/add.gif new file mode 100755 index 0000000000000000000000000000000000000000..14bbf4901f9fa7b667852d1292be5ffcb3fc37c0 GIT binary patch literal 864 zcmZ?wbhEHb6krfw_|CwCrgG?+u5-}bM51pErS$H}u93DC|GBG8HBor=W iWM*KhsqqkCXy{Y<-|KU7)6&z^4U$jIxoM=pU=0A#83&#K literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/add.png b/media/img/icons/actions/add.png new file mode 100755 index 0000000000000000000000000000000000000000..c5937438294c271db0ac822ce2b0afccaf46d1ad GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$Ld_vL7r0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LgwPZ!6Kid)Hl{{OdUR&C&%dAMTQ zM|+O*vrM})f+GVe>^;gEl}~W@R7-5UW%2o*PurF)CT@rH6b`3}FsIqg=6tqfMTL*DK7*T9qHticiZ!$f00`si*Xdo z%R-golcYtZL@EPR8>dS$pD>a9wDj;yP4QbI0u9SfcUh`3Nj&(R642-VpOuBd8UP0% B6cGRb literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/arrow-down.png b/media/img/icons/actions/arrow-down.png new file mode 100755 index 0000000000000000000000000000000000000000..b4dd4e0c3bffe015f133d15694f8410353d3d2c2 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$McE^j<{7bwJ8 z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O_~y@N{tuskrraQX?;uB9Ciyv9#so zsfl?E%-WUG67C-!F$LW2c4yJCXi(MPx#jPBAtoc^E3JI9m)TbX}mVk3#72o!EHq744S)TaU;oF|?bBd3<_XsA) zaol@2MaZP-PJrhcmheQq|2bS-om_ckH$+lSE|!1C)z|&DwY@1YqLML=!MH3@AVnAG ORt8U3KbLh*2~7YBXc+btyQ9 zu^22^a&oeoGLyi8O-sEQ8I`nn940UJ?KVypyK%BO-I2jcm1~No$npz|J(!sotN|_f B5>5aB literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/arrow-left.png b/media/img/icons/actions/arrow-left.png new file mode 100755 index 0000000000000000000000000000000000000000..c9fe1d9d9025b15f7acb2e3313cb8d9ce5b9b670 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$LkUdwT70);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lgzo-U3d6}OH~zR1h0$kDd2aBpy6n@xOz~}ij9kpw==MH z$aog1G%zu+tcW=o^z>xCL^9iqpP%9zXItbmEr?`zbZ(YiwUdZO$%?=ZMn(o}0GZ|$ AzyJUM literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/arrow-right.png b/media/img/icons/actions/arrow-right.png new file mode 100755 index 0000000000000000000000000000000000000000..0627638d5d5c86633da39442770d8b8d0a326465 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$Mn*BuOx0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;io-U3d6}OHCALMON;91hvduQdE zMaoxZmWa8p5NVpg5cM@tT8L}s<8_(`&OGzxnSUXQso=tNO|f;;91kl7p86G+-+0SQ zVb21F`49JGC7odRd^B0-%?*c5_Bnq=-d^y~=S+Kls##F5#P&ea{*(<Td^?`o!oPi6vL#^CAd=d#Wzp$P!)uU|_5 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/arrow-up.gif b/media/img/icons/actions/arrow-up.gif new file mode 100755 index 0000000000000000000000000000000000000000..d731b3971d54b759621d2d7d26d47b3f88028253 GIT binary patch literal 891 zcmZ?wbhEHb6krfw_|CwS+8&!|bQq*=jVmbNQkvV+j|K98rRtcPD#?NMQuIyJi*m$M*HNS%Lf&o-U3d6}Qe#ddSP9$kRIinc1bO z59%xe(}UCv`X1ymY_0g}l6BJc|Bn;gE!*N7n9|zPT?_;Z&5!f4800;=(Ej77r%k7R zZAbhWt{q+db}5ldraXI8Wy7exb)V6|QY-jfaQxa1kPC~r>xwSE^f Y>lB~*`MZ9e1-hBR)78&qol`;+0Ps6#jsO4v literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/button-bold.gif b/media/img/icons/actions/button-bold.gif new file mode 100755 index 0000000000000000000000000000000000000000..194e82486ad93ccc5d496bbd119fa68f7a40b1ce GIT binary patch literal 934 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDi!~eg`4jUFYGBC36*&Nug@GvunxRiy#Mx~?O9E=h-Dhd`K z?_uLAFp)4yImV>HEnu?2=;=u&mJl%$0pm0`CJRoPmd?*=jf_@|3sgFa9o!Z$_b~nN zG?NMQuIyJi*mx!RXGDwq1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<1JzX3_DsC;Ee2}X}L7=VlWpCAT zmgXisIVM|Gk&+hy4|c2NC2PE!wRWRC&)FB}-}9K9|!yMJ8TLqJFeX6`%qiAw3}yH=BJ%gKJ9eu zTKD=B&#Yx9rH(f~tZ#E&H09r$LmP8v$7}p~ZzlFIQLk<)|GoE0ubKR-eE$Kx#o+1c K=d#Wzp$Pyf^nGan literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/button-italic.gif b/media/img/icons/actions/button-italic.gif new file mode 100755 index 0000000000000000000000000000000000000000..4c730e44badd2888d69ff024ab086883c9efe8e8 GIT binary patch literal 933 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDC!~eg`4jUFYGBC36*&Nug@GvunxRiy#Mx~?O9E=h-c6?Mg z-owV#!V_7r_(TtD&?*&)qErS3O-_*so(9j(^sp4YTC;L8gC7%f(KQ~fE6-0aV4ftz zGRq|6*b*i-k(^s!Rx&WMv&Zb6Rroq|MchU;7J+R!E{*J$)j}i|ti8QG`#&oSgEat% CUoXJ` literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/button-italic.png b/media/img/icons/actions/button-italic.png new file mode 100755 index 0000000000000000000000000000000000000000..1815c0eed53beda7f85dd60966acca4faa5a4ae7 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mxzZu77?w6DY)4 z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`0d^>lFzskpT^*pch7g20tY@;}vC zTYoU~?^Jzou(|P1=*F8O%`0!^Ww5)Xm&>}BWO{WnvxN&s zw-Y=y1m4?z`ylMK^6*Ipm6ia}jJ2z06tC;D-E`phhHG(LjnjYjtZNqfY*U^cz%>8U zf58sJu+Gd`eK#d8pIIzhQ+!<{Vj8P%fNk@@87@w9|fZ!Fx*36=FFLj zKUo+V82&TpfN}yTPcU$_GW`F`?XY3NK?WukK9>U<7CN(Vh|4(`Y*aeh&A}{lBjSUD zdmodD)Po%t8;&t68%srGPD*8%rslj(=fWk2#_49sY#IkXr=6c`@BB&S!DRJ-#fqIm z3Q-#lTv{qQpRd9z;nn38%xnxdPKi2PW0c(ACChD=$gn9{nak#c*+M7Ag2$&yf9oqS GSOWkQ{V&A; literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/button-underline.png b/media/img/icons/actions/button-underline.png new file mode 100755 index 0000000000000000000000000000000000000000..acb8000799fb0567f0fd0f43768cfff4f5294b8a GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mxy0gMAmc1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhWo-U3d6}Qe#w&gmaAkbQRGV#sc zV5VgoHhavxcgX2rb>tHRLG#J3Cx1Ef+s_BaSE0u1~-ZXv7Dfawq?E~SLpC!2hJ;C7V>gTe~DWM4f`{{BQ literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/button.gif b/media/img/icons/actions/button.gif new file mode 100755 index 0000000000000000000000000000000000000000..04126eda0ca428f19031a8e7e483e5686d117e9a GIT binary patch literal 925 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDE!~eg`4jUFYGBC36*&Nug@GvunxRiy#Mx~?O9E=h-PHa>@ z-owV#BBQx!Nn;Od(5je~LaB^Q`pJjp%$(S8cD6?NMQuIyJi*mxyPGz0$L2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-9o-U3d6}R3_cH}ysz{A4(L;3%b zgnNr0#816)HLR-VO90p0;INWp1#hJ!2aZHBt~tfWs{Nf0Ea1M$_}yDmgV%A%lr3k) z&)C!@DQ2y`%_hG8VCIFW-@iE4O9_0FbnG%*CI56z_<|RiQg8nTobD=m&S1Z}%=t%2 RnHkV-22WQ%mvv4FO#q=_O}PL7 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/cancel.gif b/media/img/icons/actions/cancel.gif new file mode 100755 index 0000000000000000000000000000000000000000..9c1a6244c216947e4fcb0e1238322ac46e93496c GIT binary patch literal 934 zcmZ?wbhEHb6krfw_|CvE2Z-j(`Om@dUxMMkBEx@8hX0lf|D72A2QmDQV)&oU@V}Vh ze+$F^9)|yO82*of(GVC$Aux01OvRrpj0_C_8FUzc0F);fIGP#$bFv6HEI3%t!mm^^ z;erA~8!Nlnj2i+6j<9hu8r;}1ae-SOkCC2)r4Yl(NrHk}5ho|5I=6EssRampe(K1; zA*664^YTMR7WO7K)&&9!8=2YqOy6O?NMQuIyJi*mxx*OQ%eD4HV)m z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCijsdb&7ygdg_B z&(8cmk<{`eQ04!57Oew`9D0>4Df&!{wGXME=XkWl)F`1L@~cCVT7a4DT*mn}$|t5o z_VoO}d}@QntE7Yjs(hE`Oq+I$!;C?P!$_sOQDKHD??TBV?a~b9Dt!IVTvyCG$dH}E zo|qJ~vH2xaxsBcpPM*pC|4U9h8gTf)tPTTBYWUENdoKAb$v?8nr&ahZ$Erxgp&J1gjacyNL{@z%iHM|KDPP1C0lpSy?$mUOZrIVc?Uu;b3^!$lS^!Z^FT_K)Hc|S1Kmv z#RA3#F2*3X1q==<#~OJU0#-OArm-^cxEX~gTu%09wPOD?CBV_icN%Atl?Q`ElmBv# zDRLQJj!mJ{*q4~qavf+0VrEeC5XcsFU|h<2$Sq>`wKYLZEHz~^4h}CHc2|66ldagW W-jRWul}msjp&;>){(n{$25SJ^Hy=s> literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/clipboard.png b/media/img/icons/actions/clipboard.png new file mode 100755 index 0000000000000000000000000000000000000000..124828328c7254297d13a703b80da122e8b28189 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mxz_e$1IG2NdEg z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WMyDr6!dg)45_%4{OA9FduEO~bC3S` z|0a@+EjgKO4TD#mTURb=iye z>(>|XR_oO{8afDg&XYWw>cLi%Y*8|O^1_;D^=*+ado;Q(H6+d59A~9Y~Qu${{M+rACxe91hK5C_%!FLMpsd=li{Au!wd^@|4T?1O>zp1{m|bi z!MyL_TpYWwce~0ci;2X2P1r8mzFJ~pu`;tDgRS`{1#bc7 d38u{q49xQLJ}B-Ek^%-6gQu&X%Q~loCIHPEib((f literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/copy.gif b/media/img/icons/actions/copy.gif new file mode 100755 index 0000000000000000000000000000000000000000..466ed6428f04b2a7fd8fd1287d47c42c6d7d7bb2 GIT binary patch literal 915 zcmZ?wbhEHb6krfw_|CwPT--Bf&Yb7(zrX(u0sp`M9|fZ!Fd{-==FFLjKUo+V82&Tp zFaQB4PcU#4F#Knf@DOllsOJ#ovN^EfA!9R_AX7!e1coCW3>+DEetb}H>t=Q4vzbx2 z*tL&ELW;#eLB*ptCS|!SO%P;bVXy`O?NMQuIyJifa(Nio4>vf6yhxK zh%9Dc;1&X5#!GkW{s0A8(j9#r85lP9bN@+X1@d2dx;TbZ+)DoQ|G&L+mFx3*Hkktv zo)Z*xb$bP;+c-y69#^M^gsz17c<`^b%N7IdT}D=uR*% nV2toOlF4vJAg0J5pP9ia|GCVoaDJfVM j6Y**B;fehElUO1*CLNq0BJL;BS-kxGd?NMQuIyJi*m%VaHtZAe019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-lJY5_^DsC+eZsa|zz|-8TUC})M zLGN4Mx<`EHPCQ!asG%V(I_=h~z_%8LUtON~eXvL}X3ASSB~f|llcIBV;SX+Bt4~Pk zxxaervmM_a-KxILs1TcOF1CX+*8llNmu{8E9Em~_zRfimoDDiGZ^b_BPnvR0Cq=K+ z)6sf|!zw!#<`bVeHfX<3+Inr3bdTyR%`?TXiWQqy=xg4w_3-8@KT#iit<8 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/delete-user.gif b/media/img/icons/actions/delete-user.gif new file mode 100755 index 0000000000000000000000000000000000000000..0a1d2d08c72b7ae823772bd41590754960890fc8 GIT binary patch literal 896 zcmZ?wbhEHb6krfw_|CwwkuG|L4q^vzLM49s|RFAWCNVe~#h*J%<0!8UFtV zqERp!0>dx_X3m_c_>+YZl;(ASSpk?M1Q-}NVj2E(%6M#8aIl$!Q!3&_fx{st0c9%} zj|Gd4b~5wJ%&=IHe7uQWMCHbe5Ai2hxdbM-R46ohOqJl5b70uK#G%(vkm&}eLb@XZ cQxn&VmBtMh7c&Tbdh)V(fqOp(GZTX~0KPF1s{jB1 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/delete-user.png b/media/img/icons/actions/delete-user.png new file mode 100755 index 0000000000000000000000000000000000000000..43ac59d522250a640c8cc092b8bd865a3b6f1c7a GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJic)27^dn9Ad0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhOo-U3d6}OfKUF2mlbP0l+XkK*#vA# literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/forbidden-alt.gif b/media/img/icons/actions/forbidden-alt.gif new file mode 100755 index 0000000000000000000000000000000000000000..5460285e2ce7c8dd25ed0a0924667afa234a5e7e GIT binary patch literal 943 zcmZ?wbhEHb6krfw_|CvEhk@bTxpV(H82$?|{Fh+(ugLIUli|N1!+%SL|4t15y%_!n zG5n8W_@B)1e-w;{!0-xznKNf9{$ycfVEE6V!vF-JJi)-x!|D&a6sWG8-svQ%7zCC4Gco!Ay+sY9Ni{yi!3>_BcRc95|_}7o|%FUOw+i9 z6?Sk=QfFY%saLWP5Yg~hap0whmJb_W%F@ literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/forbidden-alt.png b/media/img/icons/actions/forbidden-alt.png new file mode 100755 index 0000000000000000000000000000000000000000..7bdeeb2b81a6691613ed381d9b9f392a9a3ef64f GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%Wdn$jv(1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lhoo-U3d6}MW0wS|}rd2(lpdZ_Sq zx|F0(@Q@Med^0zq)8)~GAL|~7$s`80rkMNADpN3?xvjEN|L@Ub6205b-BNntWN^-M z_2V!ufs56_U1g;URTxt0g<81Jm&SB0V3^b&d}yln#IL#89Lr^dGJ{HfFqx|bv5MID zR9roG?8pvz*=LF^9J`sOOFXnHpSJ4$=go;v?}kJ^FgSHrh4F7so%RX-(%(w^FEXm+ zTU@i%u6GbSQoPoEdU2F^`62_hu$|eP&PLmtEu5Ft*mdKI;Vst0IN8N Ag8%>k literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/forbidden.gif b/media/img/icons/actions/forbidden.gif new file mode 100755 index 0000000000000000000000000000000000000000..f9baa0732041314bff9b809c9136dfadbab292b7 GIT binary patch literal 944 zcmZ?wbhEHb6krfw_|CvEhk@bTxpV(H82$?|{Fh+(ugLIUli|N1!+%SL|4t15y%_!n zG5n8W_@B)1e-w;{!0-xznKNf9{$ycfVEE6V!vF-JJi)-x%kZC5gkwR%K?Y{wf7&+| zBpz<&Vzij^LqPE$8;^!n3c~@V238)i4j#)Q$K$PBVoPF92Bo?)a3)#J@VxAJhDBdk z!6RVuGd~u6evY@6!7m!8v++qpoGMuv#H`LJG9xP?t8rDZzn)4!L&NoTaXYhOEf%b~ g$;iUiqsrlMfPt|XEdT%j literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/forbidden.png b/media/img/icons/actions/forbidden.png new file mode 100755 index 0000000000000000000000000000000000000000..3bd7d3120ffe5f712ce07866d00950595bab0765 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*my-W|NnUJ4HV)m z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCil~dAc};RNR_6c_S~gB9H6F65ms6 zCRoWDFFC`dc~f&r$`l7(6~;+Fx8<*!aGYyqR>?(XGus`~&F_Bgzj*$>mfE-9!pGNf zOFOacnR=hAa!*rylv~5J8a7#-Y}v=2`JePNdv4i%S;Y0?g2l%j^&0vu4M)}AA9B>N wHZR!0J^RT)vt_$)dk6-IB(Leeq&3;@xOiELeEB|GpidY)UHx3vIVCg!0F*CpW&i*H literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/info.gif b/media/img/icons/actions/info.gif new file mode 100755 index 0000000000000000000000000000000000000000..c83d242f409f417da52c15b52a83408b285b99f6 GIT binary patch literal 944 zcmZ?wbhEHb6krfw_|Cwlj|4}d+ z0>d-}X3m_c_>+Z^f#E-c4lpYKbA$i`14l2ze@+pO1qqI<%)?(I5p`2!)gmojtyEx3mev3*w=|(xSGwtn0|TEU5gD0 Yw-^c(wNx?!lyC235`8gOT7bbC0FlHgC;$Ke literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/info.png b/media/img/icons/actions/info.png new file mode 100755 index 0000000000000000000000000000000000000000..cb6c3930a05dd4c76f791f873e3859bba7d6e364 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%V`X6#vW4JgD} z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`2D^mK6yskoK==l_3uW~&6B`K^i- zYG-F0ym4cOptJ5K#)96=Oo=w5GqYOnDokKZaK4oGFWus!G;1@%E(wpjGmX>#9sbf7 z%dpK-kMHQA|JP(Vrpx|qd^O9p`+;6!6ZgNL%}tX0b&VNp7c+`95*f;>A|#kkCS29p zpdImGo3i!&SQg{7vV8}$_=Llr=hrr_l00(!A#Vp`{r{wdW4`{1vm8ytDkToQVijrd z?`ve#l$tv?@UWtf2W(Ee^y7L{qzZdTT1_FbptDnm{r-UW| D#M+4l literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/lock.gif b/media/img/icons/actions/lock.gif new file mode 100755 index 0000000000000000000000000000000000000000..3b332469b3afb18f30abe5a2d30cfa9408a97d32 GIT binary patch literal 916 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDQ!+%a0j|~eP88`&l3@ii=G`90I>ZEWSaB%7t=4MiGaCmgA zPg0t1f`-6>6BAU0SE+bjP&_i7Jz|=P!{#*Kng1C?Zd6W8_n6DVrJ{2{@cA)D7Plgo jtdau^jLLJJOtluQ3SDhcyw0cNQ+&hvgo8pn91PX~idiML literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/lock.png b/media/img/icons/actions/lock.png new file mode 100755 index 0000000000000000000000000000000000000000..c5e1747e6954f763865ffe607c70d9d6eb85b206 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%W^+*iA(0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Liho-U3d6}OfKTk;)N5MViN|H!}W zDVK|@WA6jTXa04(dJB|pdN{`LZL|?ek_A*He~NGEqjC;KJDD?< x_0b1UO!wwzxV_CZruX>!gmvcbE9#$cUw?fu%(e8;chX7yR77p5FwSkJ=3Bk*AA8iqyutSe$qe_M07UFh*5 S*%h1D#m?pWEX2dXU=09*4KA+$ literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/mail-new.png b/media/img/icons/actions/mail-new.png new file mode 100755 index 0000000000000000000000000000000000000000..c1ea0a25de8d7f205a783f73619a41a11160e83c GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%Vh4~w$?1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6=4JY5_^DsCnJ`2XLY+4Bd_;r}y@ z)Bm-9oGH=4nlAbO{4CSg_Ez%+Q@A*mEMNX#J>}S$Es+J^)@(MGymaZ3#KCh6M*oCa z9F{Lmo)A96!Hii_LEPZaufOc(*M9dtlA6Hnz#zw_;9OL^NwSVfH2HAO^oWPE4xBUh zb2nv3^YBcx3lm>*-ix_X^e}70Uw)zLU$1Oslvg*pDMs+f0QJ@V`PJK`?l+dL`M@+j~%R;*upi%m!x*^bfFfvV!OUCWfD8Zh70-kBb6Bg2B_(&t;uc GLK6V$MTi0b literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/ok.gif b/media/img/icons/actions/ok.gif new file mode 100755 index 0000000000000000000000000000000000000000..23b45d574267f7e9b789a5f52d206823d530a082 GIT binary patch literal 896 zcmZ?wbhEHb6krfw_|Cwij(6qFezvDx{VOfX_(n5N6kq~TDU#>k|_&ZKZ)a=PDK<|e)$ YF9RAF7V$AFOw|l}w0{`~GZTX~0H8k%+W-In literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/ok.png b/media/img/icons/actions/ok.png new file mode 100755 index 0000000000000000000000000000000000000000..cc7df71d21dec04f91bd0e125a73ee4cb92b23d6 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%YGNS%Lh^o-U3d6}OfKZR9;{nMG z>xvaGR@`Ggz#!Sc`lhRkXF{LsCN}N>$ImaCa^~FVCd;j_y0$CcSLOp>%Q@y zBV+MV%kNuzg}fF%&!YN1Mc2m*?wN&_@f^?_87ROFqXLoEi?Z6F4=eP$v3gTG!ML+ zrm4BO^m57?Ejt_cy*o@lKY60O@SLx=?XzQ64|-UyT`ww9df@7HGO{uL!~yA*J`;MP T^W`*v-ed4|^>bP0l+XkK!Q+MT literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/paste.gif b/media/img/icons/actions/paste.gif new file mode 100755 index 0000000000000000000000000000000000000000..0fb25fc633138cac4c71905d0e68865734839191 GIT binary patch literal 971 zcmZ?wbhEHb6krfw_|CwPT--A!nPJYHIcs~I*7kU9of5QlPSn;p$$OU;?_FEHcWukD ztv$!~&N;Ss>A5)!=Z>vCcW&$R_ut=thk*az|Br&v5E!Z$Me4GoRnYz#@KSSDOJ$i&JcqQMZbaCs}2n9hZg1)DX_&ty>J32kV2d5%+5En>o| zkOpR!2z~_y1;)%!cJ@PUPo+wmZmwtN>3I68RHKoJ!-RRd!o e`|;MX@W)(u~Tp#UTXlg9?YUicwD1FPhs{T~=` z0b?aWuveg7_>Q4q>5-odGds$08jxPm$uMiytp6-9FJJ;@hQI&*F=SPBW5`TvD}}Q$ z0ucdtfd>3%nA}o=8K^*U6a)U@G~gdYL0un)%!H;QVq5^Rskfn!unTZS5y%B)O%pN1 zyXx}MUGN=;0sk4=Yx2kq1BeT1+NNNLw^Zd2>xKUejTPB=UBC#-jo1vBb+3Z~7eGmg ipd5x>5l;Q^90>pcOPc0$Zy~M#0000`D#04qzv4S@!yP7zK& z5sm{&M|$}L8~&sh9yr0k9yCvd!DwM4Gn*I}PXI%T`z&EeHJt>7w9~Uhbobe8C|csW kNK%k5Vdll8ph^6qY_>lP9(gp2iN+nhwej)61_lOe01=)Xy8r+H literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/refresh.png b/media/img/icons/actions/refresh.png new file mode 100755 index 0000000000000000000000000000000000000000..be23d15c8dcc34639a3a76dfc935e77eb80fb104 GIT binary patch literal 362 zcmV-w0hRuVP)=3 zph7R{p@_g$`6a$eDHHYq{JZlP1 ztL8#6Z&!zR0C{A!IxmH8a4AZhmrG%f7cqj(MAC&IpIhw4$)|vCGEhku?jD~yk?)tS zx_N>C?vOhJf?NMQuIyJi*my;i3JuwtfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&$`PZ!6Kid)Hl{{OdURy;7nj(c6k zGDBwPs3^@nytNkS|KU7Z^O?wk$)OFF8}#@mA7sE`t`;( zc9zmFrp@G-F6o>R5#?aWFguOy@k|Xd1$Ct<1_zc(#xh$aEOIgCFz~j`SBW;3XgI_$ zBkF(t?AcsiTmPq@oAXm%#Z9Np_{7DYEC$J0juH%aq61^})pC9V!+^ol)z4*}Q$iB} D+%tvx literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/splitwindow.gif b/media/img/icons/actions/splitwindow.gif new file mode 100755 index 0000000000000000000000000000000000000000..45710d42cebdb7892e1ed6e3d4a82bb036dd3ac7 GIT binary patch literal 917 zcmZ?wbhEHb6krfw_|Cw4*| z%n-xa|2btmHY_;U%*v<{bD|)zp`KS+jKRRr;Yc@^uGoze6P1qlGUy0t7!;{A zOj6OFr*dG@(^Jz}oR}mW930NhFv-0&#nK_&mw~D3nuvn&iiX85)k?jYf|@}K{5s8g bxvpk?NMQuIyJi*my;GZ#}TO4HV)m z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCil8JzX3_DsCN}e318m0*C9t9f9SC zW~MCnTQbpW)~sdhYo1=Hzaa40-hYvX(u2T)ox2z5&8U!6&S!9GNj$1E^VqyHhBPsj zQ}f#wh#q&pZh-Rf>gD$!ieQMbQo_5z96Q!NZ%jVtFB?db|# eSt(Fa!eC_OI6raenOi_-FnGH9xvXBV@!(=|QxAiXMZtneOTDLQgvxmo9B@24TV0UJ zqTur~-`VT|ViA!Go?TeX+9DQlYD;EN2Ll(+1h3Lp!M)6zvd(e|y=GvH+U;f%A+X4) Sk@36B=az literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/stop.png b/media/img/icons/actions/stop.png new file mode 100755 index 0000000000000000000000000000000000000000..4222e4549d1037288f455063b185fb3a02a217d3 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*my-OANl{+2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-}JzX3_DsCnJ`TyUZ*=WYm6CGL% z%*N?POO`G*T*SS3LAIaw;Z<`J!>X(f>#()`f6-=eD2CzE9FgM<;%A~;UJ7ksR5)9> zkjJIbb#)+b;vCMBuqFD1vl0`2rnM;gC^XvNmz1b5|I417lT%`t!eID-z2)<*X@Y0i zE}nSw;?oQ^2H)DeLnjofB$AlVh~=2<;y!TkhjhlOJE9&rf7~`P9&=l6$ipzR%3sp7 z_rQ-ACRPpZi`4_qO|kVr4>NeW`njxgN@xNAXUl!T literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/subtract.gif b/media/img/icons/actions/subtract.gif new file mode 100755 index 0000000000000000000000000000000000000000..516396ec3f706fa9f6134b77ac35073a059a89bd GIT binary patch literal 850 zcmZ?wbhEHb6krfw_|CvEXU?3x3=H=e82$s%C>RZakrV?NMQuIyJi*my;REx(xk1PXB$ zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;bo-U3d6}OWA{QqyytlH42bhm(6 zLh^s|;mv7hm0sA02^97-i3j8`DC-Dpv^3Y%?VXsxe1bKkt2L0>Z5Jbh|8wybf8(x{ Q15IM^boFyt=akR{0JRG;2><{9 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tab-new.gif b/media/img/icons/actions/tab-new.gif new file mode 100755 index 0000000000000000000000000000000000000000..c7608470e8cc11af2528a0c9b37f7f7648f7b8a4 GIT binary patch literal 905 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^a}57S!Dt8!_Yjyl zbEe`?7Dfh!{|q_|Kmf`U3>;|;|2btm0vS``#CI)K&r(`4P literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tab-new.png b/media/img/icons/actions/tab-new.png new file mode 100755 index 0000000000000000000000000000000000000000..d8487e447e5f076b370dfa59062ceca459d5cd27 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#8v7hipN3n;`{ z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`1I@^ofl1-9@b#!8@0fGQZ#J5tV%~vRw8Pq8Eh9lGbj4RxpsjNSHolH!(N!WHDA4DGGXGg2eSXW{(1jt`j`GI ayxH6_mc{Q>5ooR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrD1!+%a0j|~eBHggDT#aIY59ByY6V6t%7sMOHG$|!N;MB(G3 zJ*-Y`DgvLB9T`}HR{3OZde|^spLI{pPyU96*%rmKYEEok?%c@O#3gGrW#PreT+B=i F)&Q6O9mN0u literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tab.png b/media/img/icons/actions/tab.png new file mode 100755 index 0000000000000000000000000000000000000000..214742639867e28513abec477ee399c9bde5cd6f GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*my-)&nh&p019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-Po-U3d6}OWA{QqyytlH42bhr5s zgIG?}%a<=Bn2+7KF+)*Tw^z_rK&0b@#EJ*@dJL0hTNXd7Px&e_Yk&R!KJmrUO%GWY zD4ja=;CR3M6iJ6w+!BeJf+C-O{`~2ZIm@C@$;Ryf+k-AMCkBZbJqh{^KFZ<-e1Ffd ZFzkQTJCBubqbJY}44$rjF6*2UngCH;PW=D? literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tabs-new.gif b/media/img/icons/actions/tabs-new.gif new file mode 100755 index 0000000000000000000000000000000000000000..3985d5dd5fce9d901c1cf16cd7ad9b8e828458a5 GIT binary patch literal 922 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^a}57S!Dt8!_Yjyl zbEe`?7Dfh!{|q_|Kmf`U3>@VQ|2btmKHP6)U=^0)DfqC!sfk@lsYb(K(a}x@Hl`ap zJ|-Qj=P+V&a1e5IZWHE}U|6te=_zIgCJ}*%1q=oYiIqXXVe6`^Gng#1?(PaqXjq?cxNWJ&wl$HhjEoG{0R2uQaR2}S literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tabs-new.png b/media/img/icons/actions/tabs-new.png new file mode 100755 index 0000000000000000000000000000000000000000..8f33a67f16434931469c41df84ca41b78db72b3d GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#A^gV&a>0}62# zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;sJzX3_DsF8JHsm|3z+)2HzGrd# z1OJpWxAIe3%%@IGFHxO6d$A#tQ0S6S|Dp{SZ{A^bJmYisqr$dpMLWwE%2gaaXKAoR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDp!+%a0j|~eBHggDTg>WP&G_(sabL9MZ@8Hb9Zj{9$z_8eX znT?@A#&XhP#zs~y29J}I9K8BiS%efA5|;VSmf_@(F<@XgKcA_hNJb%mfq~Iuver`z Y!9|ysi!gi4^_u$X(CUbdY%C1c079A^lK=n! literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/tabs.png b/media/img/icons/actions/tabs.png new file mode 100755 index 0000000000000000000000000000000000000000..ffabc2e99063b9d24e6ed9cb30ff06e6a4838240 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#8{rzLnQ0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhSo-U3d6}PSiALKo(z_Vqs&5icC z4^HaXMD~O}cwVrjZ^e`)p+AFR?w?3Kk zn4ec}W9t?swW{;&4r@D89t4f3~XEy4w73K{HC#T tsIUeoth_j%g@b2-MCq$Q24*&n6RS*L2Ts!rUiU|Q!J5d;EX+&{)&N*+BEA3s literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/unlock.png b/media/img/icons/actions/unlock.png new file mode 100755 index 0000000000000000000000000000000000000000..cdd9b31c9afe92ea1e7949fd86f2d32922f18861 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#A+GY*HQ0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lfmo-U3d6}OfK9~5j+;F%(Ay-2;{ z`-E6w7wyE-7JsWjS&pn(z x?|3!FX8%qswG1)vS`0 f!HmB1wZ8tyUmV)?NMQuIyJi*mwoigbdi`1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LgXo-U3d6}PqqadRCu;J7-GdForg zZ$4GazPadDN3(dpsGGQfJt=O{CletCubWN*p)C6Y^uyX_K0LEC?BUMJA514|=H!M7 z38o48s&9AQ6`gRIKc+@u|Hcd5>kpT(T3fy0`YtHX)fInd_y4AEFK6C8Qr);VyXSqN z)1`<;7w-Ro8+bK5))sN^ow&Y;bCRpCok-6E#-HbQh BT@U~O literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/window-resize.gif b/media/img/icons/actions/window-resize.gif new file mode 100755 index 0000000000000000000000000000000000000000..3e9aaea317da482fba0c0154db803af1b5ddcf89 GIT binary patch literal 921 zcmZ?wbhEHb6krfw_|CwfH^{dfq|op;XkL0$A$$5n^_q(Vonr1Y^>*1)?+aE z=y0T)OIPp4iH*wc3}T`>0-i-nJXsYOH6l)KN^N8k(^U&-Xjpc37E8i1pMcHjzKqNq z0vuU_jQ%Vh6PaWU7&0y{3E-FEP;ht^ydr>^rGryY*<;=RHC?j51s2|HU|_HY0Hod+ A&Hw-a literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/window-resize.png b/media/img/icons/actions/window-resize.png new file mode 100755 index 0000000000000000000000000000000000000000..475c31ea6340582370f4fc25887405a3eb655db0 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mwm6?siQE$#52U zL>4nJa0`Jj5jgR3=A9lx&I`x0{L4#T^vIyZYBTu|KFZjwV_k#uEPN) zC5g-F6W{dAJjTP5nVH$+vn1o6y)m!f^7*L=GfcCu)w{KAnVG`QbV5|;gxX}L20izd zgYsNTOi2gqABhylCA3)led80tTqpdxNq$F+!vThc%{>}_N|u(ev8gINzUQN~_XG2G zkwCo}KY1QKFF9Dk@!wX7=YZ$W@AiLgD68@I9Mo&v#WrPvLxbRynH|2p3tE^j^LU@q kIU#g}X-3)(ZVg6;n=^v1B`fI60eXPJ)78&qol`;+0PAvSaR2}S literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/window.gif b/media/img/icons/actions/window.gif new file mode 100755 index 0000000000000000000000000000000000000000..b97888de8dd86dbbba61bd232006601ad89497b1 GIT binary patch literal 905 zcmZ?wbhEHb6krfw_|Cw4*| z%n;|;|2btmHY_;U%*v<{bD|)zp`KS+jKRRr;Yc@^uGoze8MIfVVKNl;fpz`7N|4bfp Py-KwXt^Uu%#9$2oyNx0F literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/window.png b/media/img/icons/actions/window.png new file mode 100755 index 0000000000000000000000000000000000000000..951bf34e1b9f163373e3c20928c5c5800fab8e1d GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#9l-qech019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-zo-U3d6}OH~cH}#tz`=6x$KrpS z_gU&+b?11gF54EqtNk70<3w|2rQOzwS`(^QxIIkExnZhC%<^E z$l_Y7o^EntzNE|n=Q9n$JTD9mzSlj#BCGJ=htCPE>%S+3&Jbr@#GUGFaJ+3=eiYDN N22WQ%mvv4FO#o>2O633m literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/windows.gif b/media/img/icons/actions/windows.gif new file mode 100755 index 0000000000000000000000000000000000000000..77841eb7aeb42a2faa4cf9a8f18979ef978e89f9 GIT binary patch literal 913 zcmZ?wbhEHb6krfw_|Cw4*| z%n>7JUp+NqI|k--`OoMI&s literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/windows.png b/media/img/icons/actions/windows.png new file mode 100755 index 0000000000000000000000000000000000000000..9d21f9bc5492e8b89047437e43523db7273f477f GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mwoZ6K9L-0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Li3o-U3d6}RRFALMN|;3)}ES@uFi zwq3qop)Qu){?}^@9TAn79w~>usmJad51L|qf3A?bi^4;;GyJT})Ezhunu;0uKAdrw zr=jD?lIB@&!^QV)S=o|%(Jr)c$F-^-oF2E|cC5O)?)+TSX_xHsTXx*-6K`v03OZ-9 zwc=jXtwo#>Ue$X(yl9c1bUnm7L8oR-@kwVKMF=eU}S{A%$YM4f3h$# zF#KoGVE_V9o?zgJX86x3t zL1l&ELWYU5o>CeP2?tJ26b|PL;P|}gOe5VgOjXzEK!LQUfi&dM=_D8|X JgAEJ})&M~&AEp2R literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/wrench.png b/media/img/icons/actions/wrench.png new file mode 100755 index 0000000000000000000000000000000000000000..b9599fed46ca915fc04a5c6c0774262b133a48ba GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mwnmwB{eq1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-_JzX3_DsC;E^p>|(fyecAxAaEg zH3y~MurP06U}pHQJt1MiDd&xz!c*pX?>BR4(cgBSsYT!}caPzNIr-1~=Nvo{tPplO zeW}Q$8LB(}{Z*qp0~-)dhk-n6C41ZDE?v^uO%y#sge){xWR( V{KU)9aT>_y44$rjF6*2UngGeDXKw%i literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/zoom-in.gif b/media/img/icons/actions/zoom-in.gif new file mode 100755 index 0000000000000000000000000000000000000000..c26a53ccf86253650c1613f37edfa1580f180b5e GIT binary patch literal 940 zcmZ?wbhEHb6krfw_|Cw}6m$#=vlnfn&}&fu+|J*IqMR zd(Cp|J*Tbry!PIU+Iuhg*z@dT&x_AJZ#nn8=i2ir*WS-bW|#v6_uenP_kQb~Y5FmQA-{O6Rh5NJ5a%_98IIAYO5$5tjr6CFn<7KRos#tsfarXy|r;>LAn8WtXE z;Zzi6T412))WU8MEVPB;fMYWox7Z1pjEBvREDrML{#2y000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0003VNklK3J)DRvQvpis6_5f*jXxFkQh34U|?XPV+V$)V_{+GMnOz< z8QQvWBL9@SF_BJDobT`Kv(Q>2^$02)h$WEcxp4p51T0Z=9h$ICV1R4TY*OyI-ttY=v zrfw6X0tE>z2hYI60#A<S=c9&&D+jGmLfy4qm!)K zG9slH%u?iV>S#(wXI{6EB8wLh9TxszWdCu-@9Cp<2`;)fak6QzXzm1csB!*bzmZ13 tR5kLNnYI0n6-LmeLYx;!kS*pfZVx~jJ6E(T+@}Bl002ovPDHLkV1jFRpz#0z literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/zoom-out.gif b/media/img/icons/actions/zoom-out.gif new file mode 100755 index 0000000000000000000000000000000000000000..0233f553172df25ed19f24ffa17e6cb67bc1b4d4 GIT binary patch literal 932 zcmZ?wbhEHb6krfw_|CwTfz;LjUnU(8=42NU0Bcp@-xhoBgOlO-VDuqm?7G?%5byc+Sy8@9(drM1 literal 0 HcmV?d00001 diff --git a/media/img/icons/actions/zoom-out.png b/media/img/icons/actions/zoom-out.png new file mode 100755 index 0000000000000000000000000000000000000000..40a41f2cacae664cca63e63aa5fb41d9bb4a078c GIT binary patch literal 373 zcmV-*0gC>KP)kkpOLK2i$np%qt*`00bZW89;y7%TqkH_`KbzAyxvI zPlP+#04zdSueQ+cdfGV%>_aTX@%038bcAp}PqUy-=H}nxEf|0*F}P?Llpm2XgF5l2 z;Bz@Yi3zEEEDRBxUz{(t1QZ34kd8O5jco&{Axent&Wy3IYh=9=APW&ivHz#uP#6tz Txv%{600000NkvXXu0mjfAr_C1 literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-austria.gif b/media/img/icons/flags/flag-austria.gif new file mode 100755 index 0000000000000000000000000000000000000000..9af38f514d99c1f0b44a1b82684b46a17ae2e656 GIT binary patch literal 906 zcmZ?wbhEHb6krfw_|CvEXU?2+3=HSaox8`t@E(Z%|Ns8~|9=JsATbI?LtuD^z|5I5 z6@RiY0#iGK4g(N?@&p4%I>UcX8IKJM4mPtgYs8!=SlCd{$mSshn}MU~)t!}>QyV5ZxHesRu~DOOq3~p_ aqcb)x44%Nm>M_@=RO`^{2!1ve25SHl+8&Dl literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-austria.png b/media/img/icons/flags/flag-austria.png new file mode 100755 index 0000000000000000000000000000000000000000..97a7e6e254cc1982fb042432e341a3da1ca94c5d GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m&h-y!L-u3>4xl z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik@JY5_^DsCN}yjQTnfTQ)`<_niZ zV;X%@9{NRD1kO-ZPB_t7KCRJ-D`>BNzrBcH#}R>`>k_7hN&9=}G@z|qU_pHs$T!-9j&9Ku322R=A7wet&lxGZ=O@7yM46t>|5gOhs~53h_tz`~T1 z?6UF=ItMm6cyftq*c3c)SlYzQQY5s%pi!NbowuP$#-Zdu%VKwFja-9}0}PBpi`-Hj zrZS#jU}9pKAketFg_Y+(9IJy_Q{-muOL_}3HYy(J5Z3+|?67^^-CbOtU;PyqV6X-N DIfDx* literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-belgium.png b/media/img/icons/flags/flag-belgium.png new file mode 100755 index 0000000000000000000000000000000000000000..b091f617c53a66391cb4713611ddd8def19deec1 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m&jn&oOSU1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-Xo-U3d6}OHC2l6#2a7?|{yJPY^ zPW>zWbKL4*9e2w%J+##{`e!5a!?(69E4J>MXIv7xpV6R;Q&B@!Zn5W+1+_jW6_pyk z-!o}E!DMkE?~bDxn`QdnT{nKYy_gcJ&=q3hFS3j3^P67} z9%CJwX+T2b#l;@|VhUXgR$gB2H(kuaV5`>E)uFrsx(Bwd4qwOrKU3Cwn$Drk8T@Q4 G4Aua|m>gaJ literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-bulgaria.png b/media/img/icons/flags/flag-bulgaria.png new file mode 100755 index 0000000000000000000000000000000000000000..8f8f45a5856e24183641b7d7250e09b4b3ff4a9c GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m&g`HFwUd0t#^! zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;yo-U3d6}OH~KFHf(z{5Oum2_+B z?TGbP0l+XkKec@3R literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-czech-republic.gif b/media/img/icons/flags/flag-czech-republic.gif new file mode 100755 index 0000000000000000000000000000000000000000..7d1b88a6d1b26b423fad0f1fa003fa9cccfbb531 GIT binary patch literal 923 zcmZ?wbhEHb6krfw_|Cwcqv26R)(IvbLPxB$G~vz+_`%k49_JP-hco8U6JAY z_y7M58UBxg(GVDRAux01OvRrpj0_C_8FYYI0hl8M7#KJz82)q0cx+g3u$h%pBj!ZG z!p3?A29pSbjY_Uvyc`l85*rQ5+<0-ZTYC{p!-AEUmwPEISvZI~GOmtj&%1Kc^!ed>wnJUA+F}cD LZf0j@Vz34P@*f;~ literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-czech-republic.png b/media/img/icons/flags/flag-czech-republic.png new file mode 100755 index 0000000000000000000000000000000000000000..4d9cbc024b0ec6e362ae69304f2d79faeea014bf GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJic)29y6qYXS1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<1JY5_^DsCnJ`TyUZS+${4>8`^8 zCZ)8qvs^bB_w@EU&Y0M0D7)zA|1&0&co?F%t{r0%W{_f8R`27hX3SGjc~HdtTTEO0 z{{I3;ZZHRWart}{)k*pB^SOQ;Pr0S@tuy}%#2XCw`I!%|jZRo-y!q0{-T%)>vWf9H zu6Xu8y>V7=;cMG!F{i~+AKpmL_*J4X_o4B`#twrA#xAEf>%QcP_vm015x*1Tx998! z2bf#oVW>x)7$I^4A;F~7K^SulXyNcLMxqkNneZ}DE>gTe~ HDWM4fB!qKC literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-denmark.gif b/media/img/icons/flags/flag-denmark.gif new file mode 100755 index 0000000000000000000000000000000000000000..492c7e9ff4d02719f2fc1a853297aa8053dac937 GIT binary patch literal 924 zcmZ?wbhEHb6krfw_|CvEXU?2+3=HSaox8`t@E(Z%|Ns8~|9=JsATbI?LtuD^z|5I5 z6@RiY0#iGK4g(N?@&p4%CBuJC8IKJM4mPtgYp@&$Sm@l!^p91-U}J-8yNEiQfIvfo zdp9dvg^XuHasx9vM}x~rp{H&PV!RDKoR=6F7!6XTE}Y!l;5)~<`IAW1XO&Y6bR%cU sNKSd;F`0RhltY5Ts;eucEw$!!Jy>|S<3CG>taq8tq0JfmY%C1c0Q!z3TL1t6 literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-denmark.png b/media/img/icons/flags/flag-denmark.png new file mode 100755 index 0000000000000000000000000000000000000000..38dd116c518778f75b58a23689d4565c99df546d GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJiWOyVDI32Ef1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LiRo-U3d6}OHC2XY-&;PHLK)*RGj zena-n+^S{wPR?;XRmXO_pf^O??2S&Hj)46l{mPTZFZQ-e1&6*k>Q^I>w8-)D6uq++ z&n8}LGGx2RRH6ImZ*q2~U9#BwYbuS6=WH%9{N_yJ{`63%>zk_clX?06^JCUdPM!YI zzkf3qkBHcmTfqz6PA_N@Z2X-a{P5C~m4fnttm=AEjfEd>?-MF1FgfUSnAe#r##{2p n{1c~LT-wdM4kmWg-#=!qAQO;oH#4gV=miE(S3j3^P6cr8QEUPVPkCnu-mqPg&0Jo pN;I10*$ZmKo(jqIpU<|)Yp&GShx?f$HfNpf+OYb1Gb1B|H2}FV9;yHU literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-estonia.png b/media/img/icons/flags/flag-estonia.png new file mode 100755 index 0000000000000000000000000000000000000000..b961dd9737cea4295456869d809886e291aea401 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m&ji-;^x+0u;3=*S<)SS9T^xl_H+M9WCil4d%8G=RNOimyixFo0?*{)m%%B_ zVFh7Tb!rlt?AjZgKYcyUKmW-JUe}lccg49Xr&W|*%v{JlH(iH+@7^f44LoUTQfnqJ zcD3TXcD?B%|2#F*gBx?NGChmbf2g*h!=bBJ@Y70#rAykRl2^6rHSOWDcz%WD-tScp zKIis4P`eS`RlwUSpyKvdtn2HgBa;}P?%#DvobSsI(|-&dH}#+9PUy`AI+4NC)z4*} HQ$iB}b3$T2 literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-france.gif b/media/img/icons/flags/flag-france.gif new file mode 100755 index 0000000000000000000000000000000000000000..0c1bcf3062f00cffe44af0dd0771bbb3122d17d2 GIT binary patch literal 942 zcmZ?wbhEHb6krfw_|5(>h>iz!z|9=JsATbI?LtrR|z|5I56@RiY0@E;q4k#;t z@&p4%H^YBU8IKJM4mNWL3$Yv!XlQEZ7xwVk@Ian{MS?$KgF|C-E2q3BlZC@4hvSpw z)qMmq4>&L~izEeg7%)2dPGl_-n{iT@iG^LjMM%O+q3PmGzDZUBmJ41oEEbe=$#B@( z=)oAlYI8$ssw4AyCFTy^4O?}ZH}hyj?NMQuIyJi*m&g>YEJJ@1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-%o-U3d6}OWA{QqyytlH42boYuu z1FMUH(LC3W$Ir}6Hw<02d~reV`8kOOW@c$ADG3&z=O->R?0WLwL?^6qic(`_fb#*p zgdaVtzVS~h_}hM-n}U+(pcE;|}bm@^(W&1aTlvxxoh-`>D*f$9=n?{h{1 tOdncUPWhytpQmc+-e}UCag6bNFN1)+U0zMUtQ62)44$rjF6*2UngDrTS3>{* literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-germany.gif b/media/img/icons/flags/flag-germany.gif new file mode 100755 index 0000000000000000000000000000000000000000..3462de0800bc2f86e4f77a743d12f5b48e613953 GIT binary patch literal 908 zcmZ?wbhEHb6krfw_|5$gt&Ye4VkAdMm1H=D&4FBIV{QnO`qhK@y zhGz)OoH?NMQuIyJi*m&gxqJ;WS0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lf-PZ!6Kid#p65Aq&R;9$ATx~oZh z$7DTj@AQ%!!RG(sB*$z9}-3SLxM1jYvKu d@PFSi>8(dCKQjFPCku23gQu&X%Q~loCIE1BO(g&T literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-greece.gif b/media/img/icons/flags/flag-greece.gif new file mode 100755 index 0000000000000000000000000000000000000000..9f51ef474fbc8c6df0affefaed8579cacde90a89 GIT binary patch literal 118 zcmZ?wbhEHb6krfwSi}GX=NK58|NsC0^5x5O=g#^2`vciPQN^Duj0_BH3_2hsAhit4 z))~9*{4?0(w0i9k5rrK;6e0vzIp$%GO%_B;o##y=*n_zptKiVcTy>X63V~ SGff2MUC;<|S}P^QU=08qT`m0p literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-greece.png b/media/img/icons/flags/flag-greece.png new file mode 100755 index 0000000000000000000000000000000000000000..69dad621d935faf68bf5fdcfaea9e6d23cd29171 GIT binary patch literal 1035 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxANWRD#shXPwzTFQY_Oacx(YkE#JOl4JQFbH8_5oqITU^rAD;lN0K bfklFW_dWCF10u6|L80&I>gTe~DWM4f#pPBq literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-holland.gif b/media/img/icons/flags/flag-holland.gif new file mode 100755 index 0000000000000000000000000000000000000000..16b94733cf0067af23397e9412a7ff1ca5935ee1 GIT binary patch literal 916 zcmZ?wbhEHb6krfw_|Cwcr8QE-Z^vToMT`(ckbLh28Q=Q^#A|&|Ns9pFaU{B zFd72GG6ZJMoT>Peg%Oy@8FYYI0hl8M7#KJT8UAz1cx+g3u$h%pBj!XwVq-lEkB5ms zVUlYXD~HUD6C0J?nIuI!WIT&hPB3x=t%_M$gu`+?91PX~abg(L literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-holland.png b/media/img/icons/flags/flag-holland.png new file mode 100755 index 0000000000000000000000000000000000000000..5a55fedaf114647ab537b22b954563507339f4a9 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mz~F?>4J?0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lg%o-U3d6}OH~-pza1fXAi3se8#8 zuBgU&8V*|~2c;-D#~hTFXcXrVJ~@A0h@jZ3dmlYyJwq=BFYNwzH9%f*(`^mbGd>{< zdo8W@mrs0lK)0ahfuKdXf~E4k$&yp93)fieDEs3oyrYCeASmoehWc|!)sN2@PCt@g zxay`PDFAdk1tOgQu&X%Q~lo FCIAd~UY`H} literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-hungary.gif b/media/img/icons/flags/flag-hungary.gif new file mode 100755 index 0000000000000000000000000000000000000000..ee474e9d0553e27e639c47e6bfd736e445e9845f GIT binary patch literal 921 zcmZ?wbhEHb6krfw_|Cw|NZ~}|3H~h zFd72GF$8ALoT>Peg%OnYb%0p`m?H!j7&yup{&UKBY*=uxnUz~3=0w55#(Gvh4;z8P zB-buBE`=K>HYy)yk`(Wd@hnpDVB!o~6|-_u1LG8~B(({i!HwQbJVmeWth}t+!06D- z#mjYofq~IuvX*a@h(p72#yNIVrM9jJWQf?Db@bPV`Hkxn4mY`aY?NMQuIyJi*mz~Nwi~nV019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<7o-U3d6}OH~-YD2$z~O2?uXWnG z2V5yi+~r-Z!Uwt5J>bx=-0H8PQogXtem+A=T8E4HqW3TU1}&$#SH&j82f{~@bC}6{6M;1;8cP?NMQuIyJi*mz~7pS@*m0t#^! zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6^*^pG>|kUy-BD!6V6AY;fV_@nE$sj*2yfq5l;HKD7#l$~#--zupmUSFS7|m~={1 zVXjWfnbyGHAH{ZZBwWp(9VoxdiF?C~2Xzvi#hwqC9j&i&NU#K4ZgOQXWx2+)z=D~b t@mXv^?Gl{>XRb<5?UrZi-#Psyi{w^^7q2;PtpPfV!PC{xWt~$(6956^REYop literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-italy.gif b/media/img/icons/flags/flag-italy.gif new file mode 100755 index 0000000000000000000000000000000000000000..e01583338ea8abb460f3cc8b9c8f4fa92b8a366d GIT binary patch literal 941 zcmZ?wbhEHb6krfw_|Cw|NlP&1CSU6qaiSKLty62nTkJI7=bC7K?j%>fH^{dfq|oo z;XkL0$A$$5n>mDqSPlp{GBTIo-#fHy~%8kty?CD|A@Onn``K~&nRr6WPfwUP7Dskz$W3-9j!&&0%F4FINw5(WSO literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-italy.png b/media/img/icons/flags/flag-italy.png new file mode 100755 index 0000000000000000000000000000000000000000..eba4d5e8300febb095211e14d348f00b81d16ede GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mz~Re@BTv0}62# zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;io-U3d6}OHC2XZwi@Z4P_{noE? z*`IeDvd;V|A>PW1W=14k5SBT0`*Cj0i8BGs%d~!TH=4z)2)uIfcX4yjBhO#m*2D*&F)78&qol`;+0Od7U6#xJL literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-luxemburg.gif b/media/img/icons/flags/flag-luxemburg.gif new file mode 100755 index 0000000000000000000000000000000000000000..f6cb0e32327c60da65fa96e418d1cffa095026f0 GIT binary patch literal 923 zcmZ?wbhEHb6krfw_|Cw~U#-(uM#75=gOp@XqGM+^$9!#7;t72A8YG9ngm83SoGq};4iKpn*ot2kW z8yJ}yxOlxv7#NrtSTtf!g=97?W|+q|Ln`#umE~*`m~Ncf`ubY?|4m)8)?y29Zf0j@ HVz34PL~I`i literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-luxemburg.png b/media/img/icons/flags/flag-luxemburg.png new file mode 100755 index 0000000000000000000000000000000000000000..6f8241fa7568cad1e220438cfd9b2492dbc467e6 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mz~k&+0`e0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lf(PZ!6Kid#p6HwrcwaIl5XiXOpQo^H@)E5Xvb!}{CO0=|K2hmp?A*h0aP@-TD_I9!7Z{m+sSb$o mTqGyl@J>TJBL3fBDfxAiG|F;PprW3M4;WH!4Y$fg&IsuJ`e7N{!Y$_BcH3Tw=Oj0X7aHa7CV*tC) z46Ch;SJ{+UGeiv>ovw58NEsw37&Y8v5W2KX)_U5aqiq7pertZ@H{RV{@m}lB>F@Cl H3=Gx)(z+1R literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-rumania.png b/media/img/icons/flags/flag-rumania.png new file mode 100755 index 0000000000000000000000000000000000000000..11fd024074f634653d979250869fb38c3ab7e9e5 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mz}>7JS}w8YskB z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`0lc)B=-RNOime2}+6fhVU|`s&OQ zwU`t9bKUHJtW4->yEa3j<5Rjt5DNV-?r<`X&NmM_wMezr2vSz|edSzq|7lpqm&xUHx3vIVCg!0ImF86#xJL literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-spain.gif b/media/img/icons/flags/flag-spain.gif new file mode 100755 index 0000000000000000000000000000000000000000..d482bdf4ad2d5d06c699086d0993070886566db3 GIT binary patch literal 154 zcmZ?wbhEHb6krfw*v!T7|1QH728RFd816DKe1FdH@j1gg28JCB3}?=q`Tw8cKMJ#=9@Gy61-{<7zsCob0 ts;R(3<`vh8B}SgsJo7GSd@13GSbyU+=hc_6sX8Df1PVt{LH?TY2riM zR<=JsJa@VAr7+hS1|%HtOJ!pVHR7@0>vLPdy)Rg(W5JORM~<{KzL~<&b!Bt<`AKu8 kIL>l3dED^at$~4=;hI{Ijg}x2&@~JUp00i_>zopr0PyKlQ~&?~ literal 0 HcmV?d00001 diff --git a/media/img/icons/flags/flag-turkey.gif b/media/img/icons/flags/flag-turkey.gif new file mode 100755 index 0000000000000000000000000000000000000000..02c7480d294aa0db1d57ef67f87ed6e1fe63a665 GIT binary patch literal 899 zcmchWJ!_Ov5QUGR5(Qxe#RRli{D8$&nITZ zb}F&6u@D5OQWSrISlWnKjnBOL8@$aj%)MuxbLQRU>AA&IS4SG@m;N4;TnZ_r5|x?E zWg$yhb<<7m@{p&z`fixQ6`@E)_0u$^D?^#eLP=#RSA{B76lf!j7LU1IJ*SVGg;|JK=IV`E6hTMC-LzK-pq|@6T3^(%Np_e~k zwS!?2(tHkViSY2mC?fdxG5+75@$a2Gq_3LqvHhRW%oV-db9m*&*4w+g#*<6$Z;el0 z-*@X{j19tXUBKm`0ZoUjfV?2<|muSSJqFQdGKg%_1o)>#hdFF kCYxXK$?NMQuIyJiB{>YmpYHCP3KZfj z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCil~c)B=-RNOimY{++5f#*o*p?jL~ zFD`Zd`Oj*Q`tpiq^>Ura73+&st~*>can==_eEH^_-i32ETPH1dzL+Cx*O{@uM_KIQA79>^W9-xH@~$^wNpa2mhV(G+}!$x_wrH zvG1IvQzC_;@}BoBxmC}tEn@S;+|!0?|z2bdLrIYNMefuoY)Kc|exh6RpIEJ9)y5fctDFmVg2 z&3RF9;Bd!(4xJk(Ha=$RkQCRDuryNioG8Gl;V~g0)pe?_@RF2Hhh?sej2styIv1!j zwOcR>e3<#EA#gDZ6Nhcpf)$O-{=6zJUZN_D%n_TjrglwS6yD0h-688OrhIsF1~(fE GgEat;+93D< literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/camera.png b/media/img/icons/media-devices/camera.png new file mode 100755 index 0000000000000000000000000000000000000000..e54ddbd28dfd542ffbdf0fce97d3dff8aaa30ed2 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mx~?f1OG&0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<%JzX3_DsC+eb`)w>;Nj`Bf8_sA zNqz4RcH5V%`!CwRl>Xx6Yn73)ap~i81`|?~oqVQzmwUJ1jG$z4pGH)+gNx`JCG$%y zdM8(ZV3B+}+t^R-T$9}f>3{MQ?peCK2c+;Ep3sxC_Ni^DfB6(n@xs{a{EnAR(qCP3 zxL$fvA?8T#?M0%N`rJNJGbhh_VeX}L=pE1JKezNtTq~Mla&H%HZ8ko~|7^*#bhgr1 z<}ZH>_nn&byP;~qDy B9?Jj# literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/cellphone.png b/media/img/icons/media-devices/cellphone.png new file mode 100755 index 0000000000000000000000000000000000000000..69e6fa515b259ef06e245b1bf4033d4c17c9a4d1 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJiWOyVw{o`_&fI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%5PZ!6Kid)G){{OdUwn{Vb`)yzR z?9BfgPYkXkUFNywxkS;2C*r{U|2!_tZX4E~U{ZVezkc4llLzu<^#xx(W0KsqWs8ZM z0sGyb@&Es+cTC)Syy;<$!nFNI4t#iivsj_-*oWVmEp3hdmoEogNp4|0@qdR&GPk@8 zTf%jpDU9_E64TRW*cct)VP3$?zq+R27(-y(gmW`nryt8_5V${oPTTZj@@x*$BE{(s zmvZiUaBPXm9+PtpEUJOL*>^l8B4u?nlb^IkZcYfw>$rV{$lWS L^>bP0l+XkKLy~;S literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/floppy.gif b/media/img/icons/media-devices/floppy.gif new file mode 100755 index 0000000000000000000000000000000000000000..7bf0ff79fa25b31c5a59cbc6d3a6fd67464d7092 GIT binary patch literal 940 zcmZ?wbhEHb6krfw_|CwPoSZy|fnm;^Ip@xuyLRo`y?ghbKY#xI{rm6VzyBWvqaiS? zLty62nTkJI7#SG;Gw3h?0Vq!}aC9>KXJimqu)wjI`9G)61cw6+?E>r^2^qX z0gLRpRajSDX*j_Y!0Rw~mB_2$6&Cq+k--`O<#Q|w literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/floppy.png b/media/img/icons/media-devices/floppy.png new file mode 100755 index 0000000000000000000000000000000000000000..2435ba5007be4d8846677e4feaf4da15cff05478 GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%t?v>)!c0Tkja z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCim3JzX3_DsG*fe3A2j0*{OGj)u)C zEan9r7L(sS;>cSPp`811aoCamZw^jR-W76m1#v}WbB8SaZV;@Jb=gwA!i(?v(%34O z166GgB@WJIIJYtU)1;tXzFsS@v+dn(`a}MJzuYI$gr3Hk%Xq`CGFU#hJy6yxC*UM8 yYwNXY-g!0mnO*)%haZve>}c6DEwpgPb4J15ghi`bC$9lIjlt8^&t;ucLK6W0tz9Mn literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/headphones.gif b/media/img/icons/media-devices/headphones.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b20813d2a21b56d33e5c3c79e6fd4fef8fb7459 GIT binary patch literal 889 zcmZ?wbhEHb6krfw_|CwPoSZyo&Yb7ZpZ^~PqaiTDLSW|1nTkJI7#SG;Gw3h?0Vq!} zaD*}Z=ali-u;5@lgOHrc41?NMQuIyJi*m%vA7q%3d0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LgsPZ!6Kid$!c9k~uD@I<%UfAasO z_IL9A57KibUFJmCR75WDxV>eHfNSV_VT;v*$!}%{dnJ8L+1Jo~?{}Q`(wH@^0!LyR z68X*@+4%ouBI6>_t#enMSv#Zh`@|+*`$&hU3(L;kG&wejJuqvnfNQzaBK`*dcm5_8 xjm_uX@4vsW{;{VJ-jw literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/imac.gif b/media/img/icons/media-devices/imac.gif new file mode 100755 index 0000000000000000000000000000000000000000..b5e668f05b3ecadbb9a6a64cd01acf713d11b78c GIT binary patch literal 900 zcmZ?wbhEHb6krfw_|Cw<&~l7n={1I9&l#S7PfkugckbN(Q7{?;BO?T6&YY?ElZBCi z;Xi{8Fe?Caga88rM?NMQuIyJi*m%t}^nGXk1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6_5>z*Dj-Xy07* znN9q2mn>HJ5kut%i$!k0|zOO0FVF=)S|M%abrsBReThn%XFj>}l z$|zoK5tv}9H1n9`72gHl8M1!ss!Vjxz39Uo*i~qI`p)aa^Nz5XY+} WW(7RC){qQzF@vY8pUXO@geCw3YG+FT literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/ipod.gif b/media/img/icons/media-devices/ipod.gif new file mode 100755 index 0000000000000000000000000000000000000000..6ce8a4a149c74f9565667cd9b5f65cb704cfbedf GIT binary patch literal 935 zcmZ?wbhEHb6krfw_|CwK4fMP5UY_9NJ#N)WRaV* zB_i;dcaxF4#f6iTQ;yBBmQ`>NxU$@n-AP)=wQ4d$5DWiwvs$UGjm;~=1Z_GR7BpU6 g7Pgn~>n~Gf$4wd1cVa3oEV$X|{P?NMQuIyJi*m%t(IH#-(1PXB$ zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-(JY5_^DsC+e_U3Cc5SXi_RweTI z5UaT28V>e`WPv_Lb_JPZF0rpn|0Hf%E9p@=YSy;CA(a+JJSz^cJKYnuQ6vQ8d&XED;4qP*)`UroPc~T1-;X&LlYw2h)h_qYE|uH zi?X`a!3)-9|Cu>$dMan2NF-~I>Y|lLIi9?j{BgazL3zTlwX!XVH@4|E%GBDI3a~h; zH{H1^8`#guuX+CSMZ--xm-)K>RQJx)P2{C&}p*KXaqb?@H2$BrF4ckbMO28REmU^E1VdkD;& zIaBc`3nMVKGw3h?0Vq!}a6~cu=ali-u)vXlU5LpbVZwt$%xq$2G8_vUTswvTGb$Vq ze0-#X*(QxeU{a!6BLhpv91ev8r`iO4H?cTuR`Z>y!TaLQ&R~_3j1H^}tXf8kd}mv* Oeu}C3l;Xg^U=08(3m75* literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/joystick.png b/media/img/icons/media-devices/joystick.png new file mode 100755 index 0000000000000000000000000000000000000000..d3038a457fd9e3d44db6b7d0082f642ed9737d66 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m%u2lT|tw1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lgzo-U3d6}Og7PUJfxAkuR4i`%;+ zb7hY3-in`dSoFu&vgMo$Q&-lVcLkoz~Kh!g<`;&t-hM8Pao2zul;k zHgqd{W386Wq}Z}kK;Y5VHCt7dswAJWOuB2;o|UH1^5EpLOWIQ`_Xy26weY#_(+}tE zyQa^rFuTw&KjR!n&ePPKz6(*#Et5R1vful?@j3TRrYhN2{<+p;iBf X$Eu@Q7278QUCiL=>gTe~DWM4fnd58y literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/microphone-vintage.gif b/media/img/icons/media-devices/microphone-vintage.gif new file mode 100755 index 0000000000000000000000000000000000000000..65c617e707374ba4dfe51ebe0039bd6c1a312ad0 GIT binary patch literal 926 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW}S&Rx59?cTk6&!0bk|Ni~=@8AEAg3%Bd?jbO9 z=1j$(EQ|~c{~2@`fB=*y7&xjK{&UK3EJ!%Wz%0zA)4|~2%)lY~k2&DLLRV%1Q6_-^ zhDP^(HjWgP41t4<%xvy@PckkYU}RAY^)ty>kantro4rKmfN+}Y9AoZJBAEg&j`guj xIwX>L?NMQuIyJi*mzCVr`*539w@|F z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O_~?^mK6yskpUt@k_q$RJY1EiKqqc=F7^q(r0n_oh#%tE!p!Z}PKQ*}uPM-{o{+@eA_GR^)N+SmZHd z=lRQtOGRdEd~KC6i%p*QMM0p5PH5z`ZJed@;a%(Q2ZmnV+vw>~ZZ~Dw%j%}ed3QNJ z*_i)7SKU-7bC+Y1N}=+L-~aRv`YXyFb!l~(nBu0Tvbp1i)1~gFY?YvCsbS8X*YmzS haN9DoQoiu)+g}VfE9w>rl>|Q0hPeO$ literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/microphone.gif b/media/img/icons/media-devices/microphone.gif new file mode 100755 index 0000000000000000000000000000000000000000..b53ea810e4581681e104def01c4f2eadcce61c60 GIT binary patch literal 895 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW}S&fU9r@A>oR-@kwVKMF=eU}S{A%$YM4f3h$# zF#KoGVE_V9o?zgJVffD}!bYT JHbzDUYXD$o8P)&* literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/microphone.png b/media/img/icons/media-devices/microphone.png new file mode 100755 index 0000000000000000000000000000000000000000..d623300cc209b92e1c577a322f74823f6080543c GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mzCNJ2Q@-1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-VJY5_^DsC+ey3Ko7L11^tT@CAl zQfnO3PRV>Y`+D}V6)qQqW;HDp7D||Jx%r4hCfoUVaf|1n?WM7uhTHB4F+_4WDzX?I zTe3Iz_ABoSr`3IWftsR>Yku#W-)gL>+V|pOal^T&*IW3`GHl!YRl7v?j$<&xVe5N8 zY&U!tIIS}6eEo!z=PW&pGGqCnys4Kj8?_@PMmyzXJ?UtlO5}( h6Z@ZdCA9QZF|KWy?(KY2OBd*N22WQ%mvv4FO#pLbY$*T$ literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/mobile.gif b/media/img/icons/media-devices/mobile.gif new file mode 100755 index 0000000000000000000000000000000000000000..37f371b00bf7912259b7668b6c1c6660561208f6 GIT binary patch literal 931 zcmZ?wbhEHb6krfw_|Cwd*L Y%kXWbQ#0Gyf6fQC<=$>#WMr@g00JK*mH+?% literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/mobile.png b/media/img/icons/media-devices/mobile.png new file mode 100755 index 0000000000000000000000000000000000000000..ffb9947969bd4d519ee61d56ac0616bed9159bdd GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mzAPly?4_1Qg;d z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik%dAc};RNPAb^Z&m+GtZLc%atuG z4xE{3EE&k+z}8R@6?LmViNQnm!i4_@wK^x-{{H;j-e_7a=Xbl_-}jKfVFQLo=S<*p-a%{KF5_nyj*#7+eJ^i8Q zT=R1g3@3%ZI0Xj_OB}xOB8g>hKv-DYAvba57ftKd=^3+|!0?|zhXDvcd4hqXgW*3XOTht#re+Qv83m0EiVVyG%1$XaKEyM0uqvhP ziTEhrz{Dz`#NfFxv4M$2K*gh>!GW<))P9+ZM}x!3M$=-x6`Yq98|OOIf0MCDXgIOR zS(nRTm(amWv*p-11T-BOLKs4sIWDaFs&$OJ&i-~B6 LzuVuyz+epk&UGUf literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/movie.png b/media/img/icons/media-devices/movie.png new file mode 100755 index 0000000000000000000000000000000000000000..a11e6f8f4753d999e8b35c068bdd8bf2e608c33d GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mzA@9rsW31`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;YJzX3_DsEk!Y{SjCI2=bp3h#ykf4&S%b|GAI5cSO*Ht%+j}`2( zzcD!~J6(6_2HCwlFZSl!#_%m*2|9K1yybmqgQ5d_-RrAanZD<3O>LTTsb5iRsha(< zANc~#9QO@>NGQ2pjq>03{a+nZQiDPG$sa%F&Mh`DdwF_Y%@xLXFLD^w}_EMW`g7K$?~EaF%yIqGxZxV zs?4x_u&9y6(q1WGMS{8;3;QH3TZ1plFV^!cPVzDM!r;iv%cHP$mFVKo6@k1wAwRy} S4_eARSt;i9w*&_U25SHpmm>85 literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/pc.png b/media/img/icons/media-devices/pc.png new file mode 100755 index 0000000000000000000000000000000000000000..96d0989df9f96456c98e35d8db4e246e70ca148e GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mzB}TZ&d41qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-xJY5_^DsCMO_U3C=5Rml|-ko#j zi^3B2m#QDw_IA(n47+P?nz!pMUrA#R)54l4Vewi{rcd{h6WA6_X|mNQTWQMoW992# z=@Pz|1?FczKOhkt-C#4n`|-NhSA-g;2=%3MUf6&Ao5|kB9kF*RWRCyfaN=l~?$LF3 z*Fh8Cjf`##dx7jKwWdRYMvtaAeqABNCRv!#;4X2_xrY7wYt8Hj_Z>?*XPnn9U2vH# z_x7^Q54xDHIbAG%BR-LJsfeZ48K#Z-52HmMvY9EFl(NnFyr%Ky-{$oH6Zh{wCfO=` W_|Qb*cUyseWbkzLb6Mw<&;$VTLxFDq literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/printer.gif b/media/img/icons/media-devices/printer.gif new file mode 100755 index 0000000000000000000000000000000000000000..3f54f34adea7a78e1e8953d172b376c33f45f9ff GIT binary patch literal 915 zcmZ?wbhEHb6krfw_|Cw84IeE^UIoGaTyLa#2^XJdszkmPz`}hB&U^E1VdkD;& zIaBc`3nK%=e+C_3RsiM*0R{$+0*3#bG9DWe4l-~EOUXzuG&;9)i2uvhSn!Ckl}*~N zM#90tjYZTs?n}johm3tHtZFeQjT%n%8km>y6f9VFcD7l%)Qz2+8T^?U7$jyyE?9AK oF)N4249^9bml^#Qn$5Lbu?NMQuIyJi*mzB(uC7`2A1K6G z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`1o@^o{0*~v#0wy>2 z^#|rY@F}oxcMrcYLCDaltKrWQMTgsa{sq0aohhg-KP4!`eXXghHG?CU=F;OV@4w4y zCLf$7l{_!w(pP~!o`*CfIado#;W}EYR;QZ0s3EZUpZEE&sN(H^I+QJ*yD=8=uh|-V zvgY|mo9)K=7rYDBuxoy9=UAnDrs6|&uM@`&h18cuS{iMinQ9GgXTAUB9s+bFgQu&X J%Q~loCIJ6*U(5gi literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/rom.gif b/media/img/icons/media-devices/rom.gif new file mode 100755 index 0000000000000000000000000000000000000000..aa5540a546dfeabff028a28b076145b50971eb3e GIT binary patch literal 921 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW}S&fU9r@A>oR@87@wKMF=eU}S{A%$YM4f3h$# zF#KoGVE_V9o?zf8WBAW0!m%LXU?T@7lf;1u4-d9*OA0AmC}3b{5me8b^P=E^Q!lGi z))tQdrA8(;*RnqqLJf`68Mq4eoDh2I&1{&?mEd_m)n_Ija|+K)p%q6N{#UexRBn0F l(5pP#YHEZaLr{;PwAh|m1}hy`$L!`35l~ojpn-wG8UQbxDLeoG literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/rom.png b/media/img/icons/media-devices/rom.png new file mode 100755 index 0000000000000000000000000000000000000000..b5a34bb2f13478e677be728c2ccd2b0aebe9dfa2 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mzCYx2-y+1{C5f z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCim7d%8G=RNPt`e4Dq$fX92`1_A4X zEF5MGM_71{I@$0)pQ15k(QgayK<%L2o-ubS=ZP#@wd(ls%vmz750a1UTBqqL^tVo? z{h5=Zy66Ljj?7s`k`L!7KT&MB@qO;G!abcE8Yb-hE~AvB%}{yUj8A)!Zi5O_#|EZ1 zjRk4zbiDW3o;Eu5c}_ToiSOd}w!{asua_=OjjWiewS(zpB-0b^%y#eC>vzv_l&Gto zl2V#B|M|}l#+SO^^zMC{exSS~X);Td+s%hOZ)Udl=H7nAkgV6yDv@yidx!{YEStqv zLA&VH_wF%X+aJH^PMz?Nulfxf5ucnDL^d%9Zg>*T_}X|)mmsUWRq6X#{d8T literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/screen.gif b/media/img/icons/media-devices/screen.gif new file mode 100755 index 0000000000000000000000000000000000000000..037d9f2e8606ccf47c6bbc41ca7fe9883e05ec3d GIT binary patch literal 922 zcmZ?wbhEHb6krfw_|Cw<&~l7n&N+sy_ZZGSXL$ad;s5{Szi%2?Yg)hJH4^D3c8vA0MBrC@&R}aNvpO6dgq^gAbdQHO@53 zyyh~~A@%%Ro7z__SqzO{i-ozRT00hKHZil$b86ick`UC)E|BHB;=+Mz>%-;i{+e&q Lxw4j#k--`Oiyk6q literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/screen.png b/media/img/icons/media-devices/screen.png new file mode 100755 index 0000000000000000000000000000000000000000..6fd5d2e2da403ad4c2c74eb1ed020bfb194fa7aa GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#W%%>s{B0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhGo-U3d6}R?I_T^(z#8Q`B>6{@0(C|;UBhweYL)SI1;>BUIg4d zbVaB-mx6=!t^bDW?;jIm@2;9t@N`$J htKqR&hq*pg4EKtk6#LI$?gl!Z!PC{xWt~$(69B!$Yf%6I literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/signal.gif b/media/img/icons/media-devices/signal.gif new file mode 100755 index 0000000000000000000000000000000000000000..cf28a5cbf3c40f747dbf51105149ba128af6c4ca GIT binary patch literal 908 zcmZ?wbhEHb6krfw_|Cw3b5M#vVO)e4w4Auag?i|Sg literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/signal.png b/media/img/icons/media-devices/signal.png new file mode 100755 index 0000000000000000000000000000000000000000..6723593cf53330586f4eef0fa52f282d424a2dad GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m#Y_CPxNS%LgLo-U3d6}MW04+T*?Oot%Ps>d)pBiYJ$!RAlKeJk*z> z^uQ=Od;QzUD4xvE99zRSY90OF8Wkn6x`%7a!+R{Z=4Ep&t9W^K@An9=pVGCbLak#g3%Bdb|Elx=1j$(EQ|~c{~2_ESpk?M1Q-}N${7B0iexk}IyN&4%l!!t zSm?~gDs5%ruyN7RE;eqX8z(kCKGwml*VV#dn9|6^!p6bDuwZH91OZVAkDZ&Ao}Dh3 zdTmQ(u-Xw8whAs&hA-&>3(dQw9127<8?NMQuIyJi*mw=u_S|Cn3KZfj z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik%c)B=-RNR^x?8w)wAi#22zVe}U z+ymdDhZo*w#9v%e>mbZOA;((EydxrEl5fnNnX+bU6qF{mU7NKmbJ1#>K0lF!o`v%p zUi^-G_Ai~)VZ*hq%6TiVI2>ZzHHE9#_kq`=I*%yE_6K(-RJ?C3UN_5zhq-<|lVXc+ zsm%7v*PqMm{`!3G>qrJZuOkvM^+FYU{tM}|-VkEZ5{O^uEt)NGeLd6ZO(vX2zP3vy z99qj)!RECxi~S>y$~K<$t3>}y*~o3`Jvr(AIeq2YmCtTB{*40qhr!d;&t;ucLK6TH C)pZa6 literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-blue.gif b/media/img/icons/media-devices/usb-stick-blue.gif new file mode 100755 index 0000000000000000000000000000000000000000..0c90912153ab240049b3c74072c088ebf5558a93 GIT binary patch literal 903 zcmZ?wbhEHb6krfw_|Cw@h1x-1H*p?9bi@f<_G}>296Yl|C}-z3l=moGYbo;7&tgIG;?u^CA<(| zIMTtUX2z2ssOZ+qXb~4OW8xx@eihR&nVB1&G)$0H{#U$HDAjwadaBf&lbe<@v9gPN h$(gBeu#v@?Q^}!#!7-@OX8u2Ghpnp)H83z(0|1c)7_?NMQuIyJi*mw;T8BVv|2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-%o-U3d6}OWA{QqyyY&K!uygsGG zoSZWgrcFE6v93>WHlxDX%}&-568HAEKi*QkdZW~#meAr`K0MCpoVyI>*j7(VytXFt z|3@hYEeX>E1BnAoz6QBrRv*%$YM4f3h%wQoRl^D*$tZ00RR@3d4U+nT!Ps8kw1eg;We292%OrIK>iP2rwM! zU{f>WNf1t$jn>G`3r?Aj+TI_r+bCuP@(n!@YWNCZDRIZccA)t8RI#wKR2tW!P{ e9yl;9WD!)bXkb|BFqgH`&BkHtszVJ74AuZ=Ocaa& literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-green.png b/media/img/icons/media-devices/usb-stick-green.png new file mode 100755 index 0000000000000000000000000000000000000000..9b18d0467b4cf2aa1d2a6df53ad406d3dd51ca40 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mw;3=*S<)SS9T^xl_H+M9WCijYJzX3_DsCnJ`TyUZ*=)kRd3{QW zIXP!0Oq+JBW1&C_gB6?BpYtF39@-y{Rj^||vRm?B^O3Z3bAHOl>Xw~V=tyHYto5eN zz%YQrjaPz)Z9{^vkGH?_J(d_vLAC{)?CD-92U9=%{{DXBrp`}Hp*%0%ylL5dex9xO kEXDoR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrC`!+%a0js*%049vnpCIJlx8k)H{5FdXS%P&1QB5L9&Q z71h@|<1umZi53;}vYsFMsUH2xjk#Eak4VE2uA>e#wkW-raLJ! RH$OPn!nnvQR6>Bk8USPXAEN*O literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-light.png b/media/img/icons/media-devices/usb-stick-light.png new file mode 100755 index 0000000000000000000000000000000000000000..c748f4ec3d5af2e75f16fdc73d34b782f38ad309 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*mw;Xt(Ptn2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-no-U3d6}R3_Hsm^>z~j2LLizoY z^p6~Jr!HQ+8t8sJzI9uG^ubGfvcD7s9-U`?*v_0VWy`hY?3${^xTrT!i! ngJUv#i{HsDn5(DyYEJlp-nAPaxc*lHx`)Bj)z4*}Q$iB}-YiwD literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-orange.gif b/media/img/icons/media-devices/usb-stick-orange.gif new file mode 100755 index 0000000000000000000000000000000000000000..7157d76f40a2dcc38f40bfbf99ac526853f233ff GIT binary patch literal 902 zcmZ?wbhEHb6krfw_|CwPoSZyo&YXMq?!ABi{(mvY{~m$=b0q$+Rs6qK^Zz-+|D#|u z1cq-2%$zw>@h1x-1H*p?9R?r(x{?5#V1-+%*%Ry=r3ht(zc)0V=1)6vtOC_)e*~}#wG?XzdjiQ dg#!!=HCQ<~6c{ue=lZd-&F~6MbYNhx1^@?NMQuIyJi*m(8js=qI-0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;io-U3d6}OWA{QqyyY&K!uygsGG zoSZWgrcFE6v93>WHlxB>W9NP&gFXNGj@Tb4`L#D-O`AdD)j4HihcC=*>Xtk=&-S!I z_O&(tD|i(|d!!5`coGh(&9FN?qe9q0Q&5&U_;$U-49jA*8El=7H#M>%3nc&i`&+#x xXVD%9QD!S^>xVf3atbFI0@fX7+mM>h@S-$j`3aWP`#_g5c)I$ztaD0e0syiAT1fx^ literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-red.gif b/media/img/icons/media-devices/usb-stick-red.gif new file mode 100755 index 0000000000000000000000000000000000000000..73a8be6b2776b7440798bca55d32bf39129a7bac GIT binary patch literal 903 zcmZ?wbhEHb6krfw_|CwPoSZyo&YZOj40{Peg%Oy}8FUzc0F);fI8qq?bINcmP-tLa78bGzXgJW&%*Cme@FIZWNC$(O znM{J9qFXNuOG(cUeP!1^anV_KEIui_PSg}$w?-oP(aC9Aysy4=1U5D?aAloxX;5Hb bTFAmH!I8kQ(qS%Zr5lgK)>VfZ7#OSpi;fdn literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/usb-stick-red.png b/media/img/icons/media-devices/usb-stick-red.png new file mode 100755 index 0000000000000000000000000000000000000000..f939b92751a7539c7a526d7fe5df4055662adf13 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m(8%(j2x*0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LgoPZ!6Kid)Hl{{OdUHk&YSUY}B8 zPR^ML)21EkSSXOfV8y2O=RcoDsd&eEhL3p)Y@KK4SbnzO6}4uT literal 0 HcmV?d00001 diff --git a/media/img/icons/media-devices/webcam.gif b/media/img/icons/media-devices/webcam.gif new file mode 100755 index 0000000000000000000000000000000000000000..64e1bd9c77ddcb28ed600be11dede47ff0c83fed GIT binary patch literal 907 zcmZ?wbhEHb6krfw_|CwWh=v+a|~ObCnqPLJ9qBdwQKk8-FyE0`TO_p|Br&v z5E#B8FmvWi#h)yU3=IDnbbwg_m?H!j7&tN*{&R|WEKq1 zg-%RDf;<8V2NVyrNSJbQFf3Snw3S_;hb3UsqvIVM0vl`+KB=CX!p^s&#p43Q*||2H mQd>ADE)+ z@6j|3+O{1;W|Qbsvg0^#T^GCK3LigbS(~OQ$t;qlDJcaQe6wxaSZ9Bm2?5kKwuf)o zU&4(5k8K!NvdsVerv!NCuIq5xZ!YBO>r?g@!6pvDPM2j#RaKD?LT0YBEaR75VAq2`o{j;wo@la1n00 z(#@m{mXfBC(b%Z3PSn09gb_E$51BE0S4GkR`84LrNL?j6b2neG9 QnlL4-tS>MsvM3<{JG1F*U;qFB literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/action_forward.gif b/media/img/icons/mini/action_forward.gif new file mode 100755 index 0000000000000000000000000000000000000000..21da43758b585cf2bd006ffb4c2bc45dfbaa484b GIT binary patch literal 265 zcmV+k0rvh!Nk%w1VGsZi0K^{vBu*9H^VdwMEwJI8M3pFX%Up`xSy#R}#p$@S;-X!` zJS$%syymHd*;Z@GMtIRqJcA^o-HeamUC!*oW5hsm&r8|x(9`b8e%4Y^x-~R&AB@y< zZOcb}&Sn4q|NsC0A^8LW0018VEC2ui01yBW000Gs;3tk=>5VAq2`o{j;wl8RMY!oo zGm`2N@d!gd`da3>_I61p}BvBnt}(38Da* PFeR(2FEA>xC?NnlcTQ^v literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/action_go.gif b/media/img/icons/mini/action_go.gif new file mode 100755 index 0000000000000000000000000000000000000000..82ae7ed821f7524c0356e40f79a0379fc634d535 GIT binary patch literal 268 zcmV+n0rUPxNk%w1VGsZi0K^{vM3g9B!ajxBR(;h{C|4L|#z9W1FZTQNam`88@5?V| z96pC8chOCN)>Mw(T#DRUiQ8Fv(@#mEENRI^ZOca`PZo5~OEz>Nz2>iuw1BeWp~dOA zBTNzi%BC{z2#%%nWDQ(& zkP#APQYdIRbsbb52orn(e?S)hq@3`_GZWxsgc6wuY_I|DqoH8bn30I(0O$fBih|XHm}oQ>h<5;KkIUzbx;v;t z-eyB#UUxVk0wQGwdTM=s4S{3}6%_kW_&~h=D$zc)p1Uitoe7-o4 z0*j7*!0$5#b{+s71PB6$hyn?KB!dKx36Tj1lnfe;gpdgy90(N%mW>OK1d^179hV*j e1QQ*70}Qeq2^ozAxDpZvyc)h4Z6?CQApkoP;(?_A literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/action_refresh.gif b/media/img/icons/mini/action_refresh.gif new file mode 100755 index 0000000000000000000000000000000000000000..8268958a19e016741fffb8309b1174e548f5ce19 GIT binary patch literal 248 zcmV51h?dP)!|<#Vc>gJ1)O z9Y&Xm98YHe08|*^ABWwB!5P-ss)n>i+)! zK(N^>Xovs*|NsC0A^8LW0018VEC2ui01yBW000Gj;3tk=>51j2dR0+SrF5!arXUM~ zK$bC+orOTaAzUzr-^bI5bUK3v!O=)4nF^C3&}cBOg_CDsI3yU8pJ~ljPZ)`VVIU5# z7??o7S5kDY2>}iS4+8^De=7$87X%zb0EsIG77z~)000Ua8#Ep=9uzJWN+dIDG^wgI GApko)Zf!&W literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/action_save.gif b/media/img/icons/mini/action_save.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e6f7deccdf9874a143474823c636e00d4c9c175 GIT binary patch literal 279 zcmV+y0qFimNk%w1VGsZi0K@wAcS)na15;&QW1|>h%9aO<&*c|I+9C#o+(>{Qrly=qWKnKSowWg1o59-=EF= zm%Y@k)8(+z=X^4LX1&kj83}_9KiUk=MA_5zAYkvuppCSZt dW($d)85tL$1ho$j1_luk7#J5}Ccz>h06Up5bO`_e literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/action_stop.gif b/media/img/icons/mini/action_stop.gif new file mode 100755 index 0000000000000000000000000000000000000000..c941c19028c479d4a27a7ee04d6e0e66b6bce599 GIT binary patch literal 258 zcmZ?wbhEHb6krfwI3myRx}@ZPMa9G9sPtC-3SYNk)IzaCG{5wQd4hOTmQRpBi`QrZFzZjOw5(w z;B+Ua|6ri_lZBCiL7qW}0SG{LGO*S^P_K*2tV;HB^Xpa+Tva9QCeXgnd6P%76fc9p zOamsHcy;@YDln|Vuw<0nl$s8=rCxw48uw_56lMa6}$ zEFa1XibC1A+uFH>WUA~WrMhG$PUPgWRp}FBoy96PRn(YYfNQZp@O&*5b=4JX)+#bs F0{{l~XioqD literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/application_dreamweaver.gif b/media/img/icons/mini/application_dreamweaver.gif new file mode 100755 index 0000000000000000000000000000000000000000..15fe1071ee8442a5de1a0213b312e9536af8b5f4 GIT binary patch literal 197 zcmZ?wbhEHb6krfw*v!w+f6MQ~j~7cHTbzEeHe-UdYr1;HY5g^ioNs+NzVvqf)@RAd zTV&TivoUs){SO9;KUo+V82A}<7=Qp|1_Mjchm$W?&7NU($n)$aHwI3I0`YAVxejZj zPPB`@wCl_Rg$5ZR&N<$K4k|UPrJWTlL|7Z#QcDtK1UeX%5+c4VV_;5@*5DV5Te&zv wszAJRdxTf=ZsCu`R$KF?3uY7>*CsZqm1yzis0DUNit!xYEWTPN{QUgwia6YNFZ-K6 z`uh62RU`lZ|NsC0A^8LW0018VEC2ui01yBW000Gp;3tk`IbxXTt)BT|UFXG%AgtWk z88Por48fw4dvyi|Lm|ds93ZhA46!K`CY^(%p@Kq3=yWuY+{E4L4j6t z*qb+CABkAnYaMNQVgNQ585%?%34(+%9RVA5B8`KDd5Mdaf|nVZMI#(B8l{SxB^;xW MsxG3cp(7yxJI{4<3jhEB literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/application_flash.gif b/media/img/icons/mini/application_flash.gif new file mode 100755 index 0000000000000000000000000000000000000000..92abbcbe2822c3bd1a5ff512e8af925accbb23de GIT binary patch literal 198 zcmZ?wbhEHb6krfw*v!vxQdKoxMdeOZ)SqwPp62Jj-LmDDi_0b{sRmQa*Or#kY@N2t z$b4{dag$Z}4+e@qSr{1@_!)EVjSNR)cBCW&19!S=)!rzv?q)G9gBVV}0*Qo- wm=g)d8EOP}r!zJ$3|b+7qr8HRwYI*hQG~IwDz`&Ily_pDk%F<9f*^x60HS3}P5=M^ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/arrow_down.gif b/media/img/icons/mini/arrow_down.gif new file mode 100755 index 0000000000000000000000000000000000000000..f0bb6a4ea640d9b2beda344c7485d260f5761779 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^LBUDS)q5?HkM0ihoS_kK#PIl-D%-2j1P>Oa%ti-AnU~WT VI^xvQF6&qvTT*m#iwgsTH2{W9F7W^W literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/arrow_left.gif b/media/img/icons/mini/arrow_left.gif new file mode 100755 index 0000000000000000000000000000000000000000..932ade1601685c41edc2dd9bda214ef64a6c1283 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^LBUDS)q5>oFTFC&>rw8)8@*v1Dr+iMvL^E6%~Eh;Sd$?t WxAs8qPPGtZ@;%yDC2um%9*_%b^H literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/arrow_right.gif b/media/img/icons/mini/arrow_right.gif new file mode 100755 index 0000000000000000000000000000000000000000..780431c2bb9277f136b819bc3f184cc5ac0916f4 GIT binary patch literal 130 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^e!)r4)q5?{mzsonZZAyOp_;)oL)=2bWn-5p2Sa1ShSFIw Ud!#sBtwr7EEh)h($ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/arrow_up.gif b/media/img/icons/mini/arrow_up.gif new file mode 100755 index 0000000000000000000000000000000000000000..e8234178efaea626368f6bb5fffaa716e862b596 GIT binary patch literal 130 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^e!)r4)q5>o$4-6JJxOK08WYFNxvd2&rdbFb+@G{kG9(XN2vcvRcnXD z|LgMis?`2Gn*V3U|D@6XQDJ+s*#585nb^7Z)Y@A~KN^_sxesLS5b*4-&FLq0`S z;OOt3&;PI2|NsC0A^8LV00000EC2ui01yBW000G#;3tk`DH4)|U60}2Wpg&&7dih_=h8-^58ftLyknI8rj6c!c*s2r*b Y85)KLun-Ul2@?|=8yZz6ydoh0J4J7I4FCWD literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/calendar.gif b/media/img/icons/mini/calendar.gif new file mode 100755 index 0000000000000000000000000000000000000000..f78788cbeaabbe793b93fc64b96733b3d4d4b737 GIT binary patch literal 268 zcmV+n0rUPxNk%w1VGsZi0K@p~o|e4RpTyXx%ibw5Lq0`SLDUcD@ArG5z3SYJ zh1zNA^#8ci?EnA&A^8LV00000EC2ui01yBW000Gv;3tk`DFR7SQBwqIhVe*^m;f1| z?|SwTwoYMqC>jqxQDxxiG@s5+@ACn&v01N`33ZV)B10NP54FswP S2mt{L3l|p_UM999ApkqC%W>-f literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/comment.gif b/media/img/icons/mini/comment.gif new file mode 100755 index 0000000000000000000000000000000000000000..897cf2e3e4a796b2aec61150bbe562681032ec94 GIT binary patch literal 257 zcmV+c0sj6+Nk%w1VGsZi0K@i;{JA-wq19XtJM3X(fhR7{QUj?zTW*>aEVA- zaq{)~$mIU9*Zg68n}Mgoy4?N1-~E=n)1SoHx7z&T>h!PB;^y!7sLS1qvdgg2<7bDb zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imY#)8QuaK8uz6#v zddG5Al>yG9@i2~oKqP`dR2B}@#K=f8ArwSoA@oQNNhJbnXb`xl$6|?~lnI1Fp^`ue zI%A4CUH||p9CjUKW^#Uifgc`s9gU3u1&xU!9u5uz2?-pM3OFY_o0BFd9HOH+rl*vi HA0Yrc_GEn{ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/comment_blue.gif b/media/img/icons/mini/comment_blue.gif new file mode 100755 index 0000000000000000000000000000000000000000..897cf2e3e4a796b2aec61150bbe562681032ec94 GIT binary patch literal 257 zcmV+c0sj6+Nk%w1VGsZi0K@i;{JA-wq19XtJM3X(fhR7{QUj?zTW*>aEVA- zaq{)~$mIU9*Zg68n}Mgoy4?N1-~E=n)1SoHx7z&T>h!PB;^y!7sLS1qvdgg2<7bDb zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imY#)8QuaK8uz6#v zddG5Al>yG9@i2~oKqP`dR2B}@#K=f8ArwSoA@oQNNhJbnXb`xl$6|?~lnI1Fp^`ue zI%A4CUH||p9CjUKW^#Uifgc`s9gU3u1&xU!9u5uz2?-pM3OFY_o0BFd9HOH+rl*vi HA0Yrc_GEn{ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/comment_delete.gif b/media/img/icons/mini/comment_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..691b546b373f53eb25f43bfe9aabcb6b68db6382 GIT binary patch literal 267 zcmV+m0rdVyNk%w1VGsZi0K^{v`~3al>hzn<{B@YMU3Zn|6BDb{`=rtP|A>gR+5D`@ z+r{GkzTW*>aEbU@T1Z-Phpor*_4)qy_p#UfV}G8y-2K4c{kPiu^D;7fpu7Ia$n!}_ zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gu;3r9+Se~f36`tluUM!z{miRP9Q)CN-!)3!n3eg7>qy!C@D;3*UE)4i8N)4boi2(7|bz9#L8g1 z4TnRZ5zBNKVt0800s$N`107;*cn5@qhaVn^9hH>=2bGZ}9uyP=4GkQc4?#3CF{7I) RDIOfFtTeE(LZ%-f06WWFehdHr literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/comment_new.gif b/media/img/icons/mini/comment_new.gif new file mode 100755 index 0000000000000000000000000000000000000000..aa7e9d3ff9c1f7d9f25441d695583b094331c51f GIT binary patch literal 367 zcmZ?wbhEHb6krfwxT?jl@%o>#ncKGC`m^iK-%nqE#+FY#aQ|;qLFbFl|F+!x^X}XK z#^r|+Yi8GNGjG{r-G9X8)tCQ&{{EY`=knB(9v)GJla9Nmw=aMG`CsP&`w2%~r=9Y8 z_Wt|NUw;~QSact7sM>5i{j~SKdw*x2{qyM6m(^E(FS+=;XpL@gYW16s-~WRF17$$* zCkrD3gBF7h$QY2H7}$CorfRwRaQ2@_K9!K3AiwXXesnE1c(PY~HM-x_Lt&4-YFlyZR2105AUoJ3T!$)sLU>ICc2! JxxS*iEN$I#V?9xjA@}>Xoga7rz|MtxP@t*(f zd;jyT|Ma^5_}BT?cIUw`|L>9O(^dcLa{u(R|L~Uo`Rwb_Gym_4@6JNjmm=$!66@0} z+@UAy$58+O|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imL3tk1c6!B=8c}C zdO&j^2-_#;K`hXMqF!%&D4OvVzcB@nzGuz*1wA`p)UAtKrY z5DfMEaX1hfA^>*~dVB{R1Ara?1PBmzdxwaM69ohYf^dfm3ltWC3JMX7njM@07bGH; c1UVEG0R|OGH2|Rz4Gk6-6?7=7z#bt0JG+y59smFU literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/cut.gif b/media/img/icons/mini/cut.gif new file mode 100755 index 0000000000000000000000000000000000000000..ffd7f4f7d549c5b7fc110d5d23c4d0f6d7fcf11e GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{vxx35x`TKT|t(3_68zWBd^!cXJ`%6`FS!#;q?Df&p z+h}^5yWIVVw%@ba{8V9ii&(9s;<)Hnx3@5;QgMVx2UVWSYCtQ=jWG6T{EV&;c06UMBb3gz9 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/date.gif b/media/img/icons/mini/date.gif new file mode 100755 index 0000000000000000000000000000000000000000..0cbdf001c1016495d4e04b318b640c27e3e7a3f8 GIT binary patch literal 280 zcmV+z0q6clNk%w1VGsZi0K@IL?DUMY%yq2S^!fi*ZH-A) zYwY#^?eX^H@&Bf_%E{pPQDJ*SOI(1){qXqzDKSGnMOFX!*82Saq{!UM%+Ybi{`SW} z`TYO({QrZ?{r~^}A^8LV00000EC2ui01yBW000G*;3ry}Xny1g1jHs7upqRFAO=n= z06dVpklW&L@JNnFq9Y-~Fg(y`R8wGnFa?g5)9E0-lS1%gU|hIe@FYAgpC8_be6c7f zM24&!@tDvD4R#_21zit(bPa$75h4PGd=n1~4T=Daj*xu|1D!n;juT#flnp%$pdSej e3DHaGVC|NsC0A^8LV00000EC2ui01yBW000G;;73tfMtvw+rc^h46K4d=QXH95 zq{Hxh1cG6PD=1QrK?mh%I%-C6yoXrhEI=??6E$5 z=Hkyk{~LB#6dwCmx6ORQQP--?##2vvOh4`2f5c_dargf}u5}-9n0Csm^ML)q+rN4? zp9xH?e)92uSZ;5{lnq5|bie)i|KZ2~H(&q1{rK(Xs~=x}{(t)B%gF~n{{R2aKrvAK z$pSV*2SkGW#K1Q9z?1?HpGdAFL0l|ex%1}xFM9A(Kz&l;%9a^*7ES`ooKBi>W;8QC zf}gjqVx5{&SCf;pOP$65YuX$H&zwCvk6Y*l1>{sj0WOx8A9!`S|#UhlkqQ z+N4rY<>lquMMK!Ow(9EY;NalY)6?$m?(EFV@YmOqlat@X!{2^=uRT29n3wVC>Ehzz z^Yioj`}_a@|NsC0A^8LW0018VEC2ui01yBW000G`peK&x_?;dTtwCVCMeLyw(%m>7 zRI?X#90X@b?6i13Ady44P;d!Rpd+bP0hi3T) z{fx8B?e_lc@%P5#{+7JczTW+x#MtZd`KZg@@$~uX@%QEJ_T}vJ$>jdX*&VSas~yg^7;;py<>?DypB^`Of0yusZ?Phqst@wnRk%(lwB+4#PXqs(h| z#n$nBqrjKF=TK>ku+rn?>iDqN{M=n&%gyA9z3)|Mh1J{Sve^9Y@bay~A%8#F-(EF0e`W7goT5Dh<<$}a}yB{3kO081a5wbBy>0xYZ46>phY|zmwr?}88H|& zG#VNZ3|V0zgA*RA8CXmjBMJ-*A6kPE1{e+wI|WS&O9EUVL4yw-H8oHvE?)uyRskR? zg9~FcGHhub2mn?vEg&X?2NW_Ia%yBKUM+SrMkj+&4K&nAaistXCpyY-sFGw*f(9cB zAjyLVL5Cw8?hs)yh(LoJF7^a~0msD?G-pKU8T7`00wrL2w3zWj3J^1KRt(y(oVX3~3$oA`k#OTBT)_ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/file_font_truetype.gif b/media/img/icons/mini/file_font_truetype.gif new file mode 100755 index 0000000000000000000000000000000000000000..0569425f16c26b77196b63912475492931ded6f5 GIT binary patch literal 648 zcmV;30(bpKNk%w1VGsZi0Oo%HM_h&L^7)phxTwqC@$~tasJQC!_vP*O=I!&6rMJi9 z{=nb;TY8?J&ig@RsPy;y^Y;1j_4rwCjFhIg-skVV-Tk%M{6Ax;uG8f`VW%lELrht5 zNmOZ0UU@x4RYFT${{H@{)BD2U{j%8ny4?J&)%&;F{FI}yqR{)s;{BV=`=rtP?e_k^ z-~E=#`^4e>xZ3@&(&KuMt59i-gj-2CkI{*R!sK}c78qrl?n@UqwY$>aUL-u-ly zv4g3@xZ3=dywjh=*pQ*I)!XEksJP?o_wMlWZ;r2*%>U@`^;Kzx=kNEg*ZhjT?~cLo zgR|qN(fjrI`SJAohZeV{p9QNyWRbLp}eiu`>)pfRcC~Bm$ml! z`-7{-d7ipbV}QBa{mA70jIzs&w9V}C_sh)D?eX_KVW7-v@oOaTT5phiy&mwquyJYaVz zFAFU_EKX1og98r*xB?Rs6>Kav5O9M+a$yQZ0t+WG2@^Zq z^y!15feJJq2F1}+1Bit;6DKBdL4nL5BvKxZC=p_X6%{V3Z1FIN0TBoW5Fl8SMh6!P iNA_qKBx8nzC3QM%;85lR4i6f#_z`5N>L3t-002AhWM#Gh literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/flag_blue.gif b/media/img/icons/mini/flag_blue.gif new file mode 100755 index 0000000000000000000000000000000000000000..a0924052ff2e5b6aae0246083bde1965362f9091 GIT binary patch literal 248 zcmV=H`lr$QM5FaMWtB#x^Lg(6TX*4^HD zTnM5l218=P>Eu2h24Vt%EHKbP@#vu_AdRfUfr(5{7DKi`emK0w( literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/flag_orange.gif b/media/img/icons/mini/flag_orange.gif new file mode 100755 index 0000000000000000000000000000000000000000..0596070f24b9748044263c2fd09bdb55486f5925 GIT binary patch literal 244 zcmVE5s3uC>Eu410)cjD7#s^?;OI#p4$aDQLE%hKm`!%e^-=|qhL+qlo(>EHc~PEF uD}{^2^5{PT9CjxV5Cet-0Er!eR4Xcrf+i#$kVldyi*A>gIGZOdApkqXNp21R literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/flag_red.gif b/media/img/icons/mini/flag_red.gif new file mode 100755 index 0000000000000000000000000000000000000000..16698e32ea43db2c9bdd46ba32b3aff2d4de5077 GIT binary patch literal 244 zcmViT~sp|^p}_Qva*{+G+;X%$qo+v>gxO8;NK%7`OeOZFCFPMHP{;) zv35mSHW~l_|NsC0A^8LW0018VEC2ui01yBW000GX;3tk`DSBwCs^&l@Ak0KEu2hP3FNAI0Z!GNwRnX01!y@=!sMX*KA^Yx*V{H1OmYzBM0a7n$hMM vxCF=IK%s0V6CHM30|kZ!0f_;EcPA?&8+3^S0~HG5`DX_vDxJ+k@-8M)>Nr>$W}p^Tho3 z==}80>(iM0?yURn!};l<_T#GS&3W#j2G&T01Gjrr=m|M$-S_r>eai|f&h z|Mt`N=CJ?&|NsC0A^8LW0018VEC2ui01yBW000Gc;3tk`X`ZI1s;KBOj21;}?R~F@ z?O6o?f}r4*+hH=uOdyaM;x+>wz(7SHCKTdttLQo$heQ?!7?>4}#)CkxIL00TXPI7G z3WWn4ut=-h1rib+a0Ur=fD#oI5QPZ~3kePv2OSU)7ll@v6P=!LHlZsmC?NnlqS<{& literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/folder_delete.gif b/media/img/icons/mini/folder_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..ce9f4483582f467986929f8e9f7692ae510b1953 GIT binary patch literal 261 zcmV+g0s8(&Nk%w1VGsZi0K^{v>&8+3^R)i>_Uq3v_vDxByhixywe#D9>$W}o^2Pl3 z==}80=MxkB?yUcai2Lrt`RSqd#{fNt}^Y;Y4+fa`Rcv!IXVCL(EiBC z|M$W6=CJ?&|NsC0A^8LW0018VEC2ui01yBW000Go;3o*5Se~euG2S+jDe5uIP52@e2kYT12sHuEG LtU@}kA0YrcmP3GR literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/folder_images.gif b/media/img/icons/mini/folder_images.gif new file mode 100755 index 0000000000000000000000000000000000000000..81a7c3b41e732aa95a3f60b7d7f2ed079ab7c72c GIT binary patch literal 366 zcmZ?wbhEHb6krfwxT?bN?aAt@35(ueF8p+>_3!7SFFtetkIQ^=8XQZ@=`d-2Hl&%j+Y-uh$#>2LlFb1I3>#j0_Aa3_2i#L4IOj>vp)5 z;h{6B@5IIQojfci$|;{7uN32wdl9hei;KY&&u^Y0c6P1aN0~G&HZ685`NAP$^n>T| zTE!EsLX12Wii!&Dva(9Wt-Y?!EZt6uuF~wBGBdd+DJybtaY;{`!OYAyXWqi;GE145 s80ILjELzRHZv93U4h|M>Ha3QX%ZuAPI*%)zEbc#(8g%}GiX($H05G47SO5S3 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/folder_lock.gif b/media/img/icons/mini/folder_lock.gif new file mode 100755 index 0000000000000000000000000000000000000000..b1bfa02055740da54e765f7fd83891c120f39766 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{v>(Z3##Z>7nb*dHnU!`|rluvmE)_cKPI#$;rymofZH0&j0tv;_2`I`NQkVVD;dP z!+#B!n3(_n|NsC0A^8LW0018VEC2ui01yBW000Gy;3tk`IeI8+k{;kXPAYp}>sk1v zDazmvG#k!xxiA<4K?Ya@5O54dVQQ!vf`M#6f#^ay;A<^FC?gh&M#n>;tjCWeTI~UM z+^9g}a7a%&7#$IJYaRs*a}yg89uJNa6)1-Z2@ntm5f2j@1rr>S1y)s=n*|b|Gbs@h V60N5+CLR?P9JRHuC8;SP06YDWe)|9b literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/folder_new.gif b/media/img/icons/mini/folder_new.gif new file mode 100755 index 0000000000000000000000000000000000000000..5f30cfa2ea68ba6483fdccd5a76c31cca74ec4bb GIT binary patch literal 360 zcmZ?wbhEHb6krfwxT?Pe5P&BoJCdA01Z zo^;&3Zku_-4vPs#U0?5Ud%ex}^(OPz#{!Gi=)PWO^yl50|6ssCC7}3|g^__lok0g= z9>`A&Y^?__pL8+d>_4$M)5J(^qU))pKScD5XLl}*d?Vy8*V%SCq{F3Y%YxenMHoLg zF>a94o6T@Bou8@I!!1sUy@ivLkEOv`iMy9wRh5mAk(skgO-Zz9!X#!64!-G1{1YZl u;o#vBm@dyUXE_fS7w;Mtets5CK|TRqUcoiBhZK(-ogQ~0B=oc+gEasNMuxZm literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/folder_page.gif b/media/img/icons/mini/folder_page.gif new file mode 100755 index 0000000000000000000000000000000000000000..a8c53e2f7bb62d0e7a693fc9bed282952b75f39b GIT binary patch literal 260 zcmV+f0sH<(Nk%w1VGsZi0K^{v{Q30n){X11HOS=t_UE^Wv()wCll$|>bCj{~)O72_ zQ|r1!w%Yys_vrZT#J<_+T62`|_51qnujB3Y^5Lqj(c}L1((B4N`01qg=ANI#*udZY zQ)GdRzwrP6|NsC0A^8LW0018VEC2ui01yBW000Gn;P-iCS&FFWJyoR@NbIF*HQmwO zK{M(Fw!vVtiF69Q+0Rpn2#Jv>=b{XFG=L{#8<|!;g~&mnSeO?Afs)K_xE&6OLp@Re z?hT0qlQ9_PYZiKX7=8f(1auw>f`o<%2^5M82ZVhAkdc!IoNxpL6rqVqXJ~1sr%EQP Kt2C~zApkpAqlPU2 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_accept.gif b/media/img/icons/mini/icon_accept.gif new file mode 100755 index 0000000000000000000000000000000000000000..35e949963e4b7a5f04fd1c8932a980901e3d4385 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VGsZi0K^{vcEd+Ya4xgmmXXkDk(iA6{P)e~xr@?RgUwTMzeLpS z#Wqhu{H$s5p4O4v<)^3=A2^0_EulhRp%QGjIf`R%Ru$RUj;1k~O1%3=|$g0$`b{ z1p`T8E1%cF0ssJ7eF+Hu(2Z{06R}5X@39! literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_airmail.gif b/media/img/icons/mini/icon_airmail.gif new file mode 100755 index 0000000000000000000000000000000000000000..2be845745a4de54475d1af9ce5be7616092288a4 GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VGsZi0K^{vRcrC_^7;As$AR^{rvsz!Nr-t)+sSVK1Eg3Qd~2S|Lykv>b=2yqrms~_X**85#A z2yc%7@JQ#x3wIPM9ei|PfC~VF9s>vf00feg1ONyVgaeuk3dh4Pm>zWkn%ZmEi zLhH$e{NZEksW%eaO-&*_LR{r$P>%M90w^_V=66>%>{qLdv@v{BynEvv= z{NiT+_T&Hm|NsC0A^8LW0018VEC2ui01yBV000GZ;3tls=aDGsCCQnpN!Kmz>n$C} zbw-VPhTM+g8v%tJMxatG4RQqwV{$2ap1LR@vT67{kQ^f#kz@|FtC+EsJOmiD2;5ud_VyK6B8R585kM>kbET+6&DQ$4hWi?X(pbZCL$pKJ9H9v;Q#;t literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_attachment.gif b/media/img/icons/mini/icon_attachment.gif new file mode 100755 index 0000000000000000000000000000000000000000..4400e61e9812a3b2a070c89fc6fce7489c104e17 GIT binary patch literal 235 zcmV2pDT3T9FRaKv#pOKM~ii(Pbg@u8E zfup0NYHDg_Wo1xMP_whMjg5_AVPSrLes_0wb#--^n3$THnwFN9czAfWwzj3ErNqR< zy1Kf*zrX+g|NsC0A^8LW0018VEC2ui01yBW000GO;3tlvXOigXZG+*Zq}N*6@xoqb znI4ebG0x!uFliLP(gOidEF>NSGzO3?CY}mKoAfLwmw*StfQVBbM8hMADAwpi#4{n( llO+YgBPjIoB^U)J0SOP8;_ zxOKRqzV+X~fB(Ti@h1x-0|P&U4g(N?%wS-t`Ec^(s@XGk9riyPbXfPvA=8;VIGn9H z4mEn+wzBX@-C|k0L9Bhz#?Llc=G{#K3St~n4=de_FcM-oyt!$Hl2k7Pqr)|)LT=|~ zo&*J<&O_fi1SD>BW+z-&EY8MQP{7ED)n+W*$x>9r5wGCR$1*#8hLpUd HAcHjk1Ta;C literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_component.gif b/media/img/icons/mini/icon_component.gif new file mode 100755 index 0000000000000000000000000000000000000000..bde079f97b063a118f62161c1ac4d47e3b9a670f GIT binary patch literal 597 zcmZ?wbhEHb6krfwc;?UW=g*(lxs}DIo}Q0P_`hj;|J|PjYmEPOPI{G7Qgrmm^WRq% z-~00a|Nk##b#rfjsyYAe#*dw|PUPOt%>V!H-9<-l&sFF0ci;MP<=W31x4!;+f9w7C z$hBv#I{BQnbFVo1_}$O{ANnRg|8>=_fBo^de?M>E{r1P7|3^>!ynOY>yYE-uegFIB zUEJzpry~+C1;;%3efibzn{zJ|EWTXoy7<`odzD3p?$0|_wCH@vRtvkUZ@)h+D9hP> z{paTKVDsbuC*CglzjgEEOKC|*JOzDu=Gn~S7hTxuDd6NQC9f>a#KdpQ(B;V^;H%-H zYQ@RPYP5TuzND|6qox=uE2lRzLz}0bnS-{y#ddFR78dgxrUqPw4XlQD=y1K)|!}Ig=+S=OWFw?9lg(d_%T=|twUfwenb%tT`})Q}`%7>nSUo*-;MAsXb{ zc;a;dB3r^kq)dn&&P5UYBq|;V1rlLYI3MOm@L*!!u}{Exfi`uzRc?Dfmj z+J&jaZ=1rS(EFav`|I`oQeb(e%IulJ=0i(dk+jd5z}Aeg(J3)QK1Ef&-uLpu7M7|NsC0A^8LW0018VEC2ui01yBW000Gn;3tk`X`ZB~u57DrRYfgy2i$-G zsTJY>K!RfDp%5qWjk2BUuJa@k_ABIXRn0%Dk#R_+ z@}h3mIfegVp!k!8k%2*;L5BedKz1^)c05q;inE-z!hDU~EI!5np0(b54FM5fBmW6H zJh}dRMcBj$wd4ws(8i3$zy=46{kOReB?xdZwJtBrTAuOty6OoWu1^Ve}=N05C0^& P4&jw5E@>|6iVW5OAG%)& literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_favourites.gif b/media/img/icons/mini/icon_favourites.gif new file mode 100755 index 0000000000000000000000000000000000000000..785b938755932ab8a3757a3b56d4d5ab304f7903 GIT binary patch literal 243 zcmV}Nk%w1VGsZi0K^{v|L&Oo-Z%f`SO4pX>$6JhqbKXEI_tMq>&k)u^tu1? ztLvN>|Jx=1>3r+Xi0{sP|M}bh*%<%S0RQ1>|K@A|;Ya`HaqGiz>%3t7{ru~$K>zEf z|LJu9=Vkx@|NsC0A^8LW0018VEC2ui01yBW000GW;3tlmmyKxpd5)*5tcSR-7z5Bn zqh2q2IGxYtcsOQ&K|_H#5D2bVFKOur5($NY_ETB}l>o!C<>@HkK!j3Gc`zPvMAGKL t#TJQVQrOuJN^BE@eLM#q92#2%1rr+!J04FOJu4myn2|#~n>95d06RqQdEEd2 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_get_world.gif b/media/img/icons/mini/icon_get_world.gif new file mode 100755 index 0000000000000000000000000000000000000000..f99a5383b23fc4270a45048cea54b7d84e4c632b GIT binary patch literal 189 zcmZ?wbhEHb6krfw*v!umwaLqI!OQM5F>k&+Z^fq|bvhXDvcW-zd1eeis_YHo#<8bh&USm7b|HfiTo^1C<- zB2&*9?YY;WqkfgAr7?@)##fnMrp5vd5e9?B>jf-W))_Q3ne(cwV{E9XUS-Jmz%6-U ohKzU%--1K~l{<@Algzi@uNL9X;o>Z>(Bsa^YtS>66lAal0Is`BfB*mh literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_history.gif b/media/img/icons/mini/icon_history.gif new file mode 100755 index 0000000000000000000000000000000000000000..4473b1bc7365fba5b224c255b50478f943801255 GIT binary patch literal 205 zcmV;;05bnaNk%w1VGsZi0J9GOSxhQn;wrVEWa8Dk>-PW9>i@mCqKb4rs-lGc{{F!9 zRyLIwX}B){00960|NsC0A^8LW000jFEC2ui01yBW000Df@X68GnHYiUaQoR$PDlq~Uh%i^ut5jZI=gf(+IG%L`D_ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_info.gif b/media/img/icons/mini/icon_info.gif new file mode 100755 index 0000000000000000000000000000000000000000..9dfa0e196aba9bf0dd70074ccdb980d07de9e903 GIT binary patch literal 266 zcmV+l0rmbzNk%w1VGsZi0K^{vX}bO=Q+JG$m|w5)cDL-S*7{tb+@Z?p4qk8 z_sQn}X|3gLf|Hfa{4HFBMq+vzJXv+X|6!-#{r&xKvgu!?-l)&;*zNvYc8feuU~I4F zQ<~I5R%ieJ|NsC0A^8LW0018VEC2ui01yBW000Gt;3s}wX?kNyLPFa#5UP3^wk(CC zKe9+;gdm|(VMuts4zO}DT@VOK1m)={2pi9Zf$&VC9jdjm*+RV&K$v9RFu0|I!2+1F z6;Q;%BcIpB1z!^u289U*e{2p3gL?-F2^@(e8U&FXn3w5$p!k!8k%2*+K?fuc zvXg-|`GIQRqSUCAs4#&;3tm~By~MCQ%rwwORo7gy-yy?BWny%m`4$Z=kEQF}JtY=+ zUfLA?(#?Ar^XBeQKBmcC4v)^p`DK_cQ206RTqffIk;3UrB1Hyj7R*hC%3_Rs)g7Jc Jeaeaq)&Qp@T0Z~) literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_link.gif b/media/img/icons/mini/icon_link.gif new file mode 100755 index 0000000000000000000000000000000000000000..c64c23c1fdfcd46458a89a9453bc3495605de132 GIT binary patch literal 329 zcmZ?wbhEHb6krfwxT?ZXP*8C6=+PA`R?M0;>*B?W#l^)-mMob*efok03$9+hI%CF+ z^78WI$B!>sw5YeYclPYr3l}b|udnaw>Y6fT%JSvQCrp?ydGh4Nix*c{S1(<Yl_?B?24?&NmXm(?DWgi+PmESqtN`S)cor7 z{&|?PoXz~U+5A#qd3cbkLrYwBkF1%%*1+HVDKSITQd~YoRj=3leV@70=kR=^z{BAE zWq+J+j<5g!|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`X`ZB~u57Djk~GW%wk!|F zIjRKwz#zcD^9%r+$>GpwToMU{fS@`~l+6pEQb8!F9t~jfctmCig~AI_VF1f46oFs} z+MY$>U_KA%40aYO9R*oWfPn>r9vlV*1p<Nq& literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_monitor_mac.gif b/media/img/icons/mini/icon_monitor_mac.gif new file mode 100755 index 0000000000000000000000000000000000000000..b70028777e38c06283f3156e62cabcceeef1ff93 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{vOj>hNX^J+H|LyJVcbT^8>grjg{;$&HM4A5e_4Pze zUre3;lDN>H#Mr3I-anTA;7>nxjHlD*@PDMhki}Z+(TqPvR&S24C@@0W+S+BS{paWB z@bK_6kN^Mw|NsC0A^8LW0018VEC2ui01yBW000G#peK%GDN4uTGz>FM1aSqCcqAM* z>_g#ig@BFIDRwjl!vgULiX23Nz-WAIgq{XR@OV&*R)C1Xc`Uyj#769ya1aP|dZQ2# zi1H%cPV_)L6dn~G7abcGA{Rs&jE#(jh=dt9Jst%cm>d}xi5V9I0RW;33LF=kof%jp Y7#XM@0kIw*w6z`>xFxl_A0#0FI|aCRJ^%m! literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_monitor_pc.gif b/media/img/icons/mini/icon_monitor_pc.gif new file mode 100755 index 0000000000000000000000000000000000000000..d9a9472684dce1fb192ec1d2d85dd58a534ec044 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{vh_1&RB4HMoVn`i>h10AVyga9V0lED z{;$&HO`iUEj;Zza^+8BiZ;h>5d7hfU)~L(gDKSGmL{+t>c0ZQ?|MI0mOI+~q@aN~} zGmrnx&CUP+|NsC0A^8LW0018VEC2ui01yBW000G#peK%GDQ?R$NfH1QMFT~RxHy`2 z?1$lR27*n)DRK}9219WPiYCOtfRm|KFB_ppq8VH+oX$o-#wJAE%Q7tJxD}hTr=U?N zitao-BcdCPN=qAjb3}iK8xJB78hITU7LFSgA`t>OJw65-8;ukq4FsYI2>}6B4;2)0 YB#|3#79}6E9*&M4v$-E8B)K5~JKj-qBme*a literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_network.gif b/media/img/icons/mini/icon_network.gif new file mode 100755 index 0000000000000000000000000000000000000000..c607888a083c2700d731436950072dc4c2564e54 GIT binary patch literal 265 zcmV+k0rvh!Nk%w1VGsZi0K^{v@bK{P&|kW`x}~b1d3$`bv$N&p<<-^I&CSh~m6dI5 zZNb68?d|Q_+S=;s>SSbN($dn0keXOoUG>>$^Y-^(USMZybfBQ1gNTi=y1w&QSI*AP z>&8~-=;;6d|NsC0A^8LW0018VEC2ui01yBW000Gs;OC8GS$-n4EJ9HX@DODl>MdQa z=M;t2B0^aHpM-dZ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_package.gif b/media/img/icons/mini/icon_package.gif new file mode 100755 index 0000000000000000000000000000000000000000..e01b1ffbd62bc64995909e46c0342d8efeacaf42 GIT binary patch literal 624 zcmV-$0+0PiNk%w1VGsZi0Oo%H`sBL9qGJ2sskoO}rFI+W#)aCoZ^58p{qNQK@ZR*) zmc^uG*RXBGqhs*Uk*9bazMWqE?$Q14)aJy2^V5~;$%y^%*8ctZ?#__<->v!MxYMm< z`svBmv1{+xuKV4j{`>WuZxs9Iz@mXcp>h}f`t;4Ob*hI%{Q2|o&4>Hw!so?>`sl>% z&XD@$y8iq2(zJV`a~S&Q!usgL*|>P=$cgjQlGSct%NfD`tz=iQ2Xe?t9&B+;H&f7uKeJu^WeJr z;I5-|8P>LX_t=}?yLbBO!`ixg^3sy;(Ud5`*!28~%_0Wp&(2(!Xkf?ntw3Ai-`}F_+|NsC0A^8LW004ggEC2ui z01yBW000NgfPaF6euaL6h=hI#2M}O|iGPI&4FO#URX#?Ll8XxqP-!a?cOP0uZiaIU zb|OR?H4-{>5fLLWg$*bcNpBViIU5Fg4nuo|0T(|d0$&IQWlv0aWL$*@7fnGwSqKwW zDGCZv4}}mo9Cb1PS6&znXf_H2g#$=tKrT}(P8CHrYbcN?#OH+zHd4aOI8&fPi#!xU z6fzN@4~Pr`RM42vP>q}phCB=yphU|pR9MjTFv3h@|2fC|n? Koqh@m1OPkoG-<^E literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_package_get.gif b/media/img/icons/mini/icon_package_get.gif new file mode 100755 index 0000000000000000000000000000000000000000..19712a9c24bd7d12aafdea3bd2fc8801bc7feaa1 GIT binary patch literal 616 zcmV-u0+;rMzh>*l-_0^a9>BIc-+?Li&{p-oou4coc zW7Dl={{8yy)uf(p75nJI;KYvX)v5N)eg6FTqH`Gf=)~E$c&L3V;Kh&DwtBdiSo-6# z_1mbcd?Mz=fueyy^V_bE%~SmO^ZfDI{`>Us(2${W7qpXA{`>X*`}WqcYwy^u`roa^ zq-6g5_xj_szLZ7#-l_K8tBb{1oNpAvqGHUYTJ6q|rFI+JyMK47R{s3@_0fy^Z%4YJcXbE|CsC1f1y?#i0FeM98fIz-kq{no z8%!twR4F}B6b>JePGUJkL1Rg61~ETm30jd`T^(^x04&JJFkwxW1ZW~f@PUO3m@-3@ zNMT?AhY&BQz7QZ_f=7q}BO0`LVWbnDNJUDJfHB|zk_RReMS|0W4ThMCJfX@N2mm|w COG)ei literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_package_open.gif b/media/img/icons/mini/icon_package_open.gif new file mode 100755 index 0000000000000000000000000000000000000000..e630faf917896a31a0fa6311d11e6decc32c615f GIT binary patch literal 613 zcmZ?wbhEHb6krfwcvix2YghH>+w1R%u39bJ;LV|wJPlO5ML!jZ?69S^ytXqEY%hvwbhGP5t-#%deM*f4w+-ZDaPoA8&uZICOS> z>7SpUcTA7?b${)zr#t`s{<^L&;P;Dz-_AGP-d+FfNaK}Vo%^P^UfWi6X>-Mcy_Fws zZTNbz`|Ir$mp2vP+)?r7>dK{M(*OSa{QdUgv%`(w&eeZ@uxnwF_@yn?yJkkeIM(vw zSnJ_M$y+9eJ~-OHbxPRZ_gDY@{WZTp^xvN!@2;(SaHQ|YlRdxht^D}%#^MsmMa2?- z-(CFmWc#+-s^ zZ)a=&{rUdtMEmL*rB&@ND{8fWJ>K%~_qTcZqVKLQIlC<8{f%`87bO1q@!{*$>Azka zS=8uwW@*&ha}!o{c>no$^T?clg9{QqoS$%iclm!XU?2n(f3h$#FqAOpfE0q_gn|7~ zLrGI}acgmNM@unF0jFteXGtpyA2*Y|g`L)fN!_fhOpFZ7j7$o-&TXm-7z+y*uVeJe zGH>ORE-G5Lp>Stdd@Hv=gwxK&J9&6gVq4P$@`4= v8nN*tR0uISPUi4v%6J&^qE%cgNI=8GsabfDleXUhfrmyx%V#wK-DeE|1Yty; literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_padlock.gif b/media/img/icons/mini/icon_padlock.gif new file mode 100755 index 0000000000000000000000000000000000000000..f70cc953a51da12b8c8757fbef6df64b6ea97e9a GIT binary patch literal 249 zcmV+9>uj1kAj$NKQO%#srO^T*ZI)!3~X`Ru6Nwj9HM4fp4g z`Pz1^t*!t6|NsC0A^8LW0018VEC2ui01yBW000Gc;3tY+X^tq_t*n=-o+V2~=c1ks zu&ZR_ot-IHyQzexPI2VPbReBZCeu)MF1Mz~p;#mml?etB$YvCn&4w^A2o8vd8Lei! z;SBR4y>7ob8fFQ6c7K5+8H06x2Y^`@2pp1=lZPK34*?Vr3>u!FmP4YVA0Yrc%MX1I literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_security.gif b/media/img/icons/mini/icon_security.gif new file mode 100755 index 0000000000000000000000000000000000000000..929284daa0af8e188b2ecf9b96707ea6f6f4e30b GIT binary patch literal 266 zcmV+l0rmbzNk%w1VGsZi0K^{v_vDiJ+j#x<+S#ue{QUXjv^d$TOaA%i->x>wj2G?C zX6wUB@zZAJx=G{2A^PsN?#osB-iPz!yXee|@6KHL@X6-IZ_Seu!+#C!$WYRo9pAkl z#e)vqwjBTe|NsC0A^8LW0018VEC2ui01yBW000Gt;P-i==#eElcIUY{tv8S!+uhsg zINhwBtk^*i16+U}z@s9NSO5VAC6YiY1r6cr=4c>`0C?oU9t`9}X7NSU z4iW)8k$^PRb{lvC777#y83h3tDg+J$698QZY6K;02NqFil#G`v4;Barf1aN!0}*Pb Qry~RxU@EO9vLzt^JB2HF1^@s6 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_settings.gif b/media/img/icons/mini/icon_settings.gif new file mode 100755 index 0000000000000000000000000000000000000000..14339f700daeb6bfa8024b9d27adac41fdd261db GIT binary patch literal 251 zcmVNk%w1VGsZi0K^{voU_X3^8TT<%EH?6ti|40a*EjN{*$c5%jEr}ywkkZ z?Mh;Lwa({^rM;Z6#P<3Az0&Bu*YJIouDa6ckf^}={QsxG*=d5Cn6b*d)a%FK_{-q+ z@%R3~*zf=U|NsC0A^8LW0018VEC2ui01yBW000Ge;3tk`X?|YnouubDn6RFy^E^Rd zrKKk%8;)Y&VGwpB-wiT}co3c(W#)P?70;)_Aeo^Afs98Y2}HPF6d>TybSn%*H@Wr@ z0~G>>GAK|JIZqK5dmR}IULFYv1O^rW6b%K4Jst-J2pR*3X)PB8pq(ZvqAV;S06V_+ BcoqNv literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_user.gif b/media/img/icons/mini/icon_user.gif new file mode 100755 index 0000000000000000000000000000000000000000..dcb5c2a899c84ee0be36e6b92222cdde6fbb8ad3 GIT binary patch literal 246 zcmV5VArX{>gpqy}ZQ3xBIb z?{>Ooo8TtXQxO=NV3P1sT@;64^wK0*F2cJVcp9?3i-u?goe+C8y2nl2m2^4>_FfstG(gCRl*~!4_rJ&N6qG_a(Fv*A8@Sv3u zi=hPTl2gr(EZS$RF%|eDX5_G7f&+(Kf1A&e9EZgxCyHv#?b;Th&vNJMq@$0IueZsS QkjJR*`K7mqPrmsz zefKkgoJ$Hb1^$D9;!hSv1_pix9R?r(nZdx4`r)MK>RP?s*2UR8lVi`7D|8$(kq%Wl zZpd)JXoFrePcwr+TQv9K02MZtSqu^f1VtMd-lhwfME5;P;u5G>KPiaGg4dL3kzewg jR1vQ3Emjwp4?aHpL0ur?$Wu`{MWsqHsaBazK?Z98nF~uF literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/icon_world_dynamic.gif b/media/img/icons/mini/icon_world_dynamic.gif new file mode 100755 index 0000000000000000000000000000000000000000..e5ed08ce64adc93238008dd4c5e4fa47530392d7 GIT binary patch literal 367 zcmZ?wbhEHb6krfwxT?u8efP6V?>7GbSo&%qGUCQ~qTfFFa_@%dpx#Es~ z{Q3OdW={FCi=WqWt~&qz|LwKSo{`2<NYb zUv>7rrlE7qrhvvBp+{c)UwG^PzNi0}-}zs&Ik0krU;WnL?T`LVzxIFq{r?Tyf-Bbh zHtq~Pedglod;d2)_`mZp(4wHTuYpzsS8w#&bnQ^(dcR$df!v^`onbSt|6g$P|CWdU zm)!n8|K|Uy4ZfA@eK$V%-?%-bdV~M=NB>W~`oI6_{}p%suetaC{}YC)4SrP{{hN1% z&%N>g$n*b8Z~t#ybKKE0(kC*%Z0e@a?CyInK0SN$<^TWx3)w2#=%N)wYWTM35t|6wz7aG{KM?ip$%|T4uj8*hRlYgkNu(-26AFGhB)U~i1 ztgMQzLZb3gE{0ETu(O+bO3HHcnhS;oGzEq7{Slay*x19t6=bvE(RnThQI#n@839g? z0{j*d|Ck>nA7hf>l3Nqu)X3D(7Hq(<;?Sh0Y79CSe`Y%sdrg@gP~`M*!kG!@9UB=K FtO3mL_vrut literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/image_new.gif b/media/img/icons/mini/image_new.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f4d12e5d480b7319b8230b54c8472c44174d537 GIT binary patch literal 609 zcmZ?wbhEHb6krfwc*el+;q%wMPyf$4aIJn@aOFDR+RcGiZ$CNk?7ya=^Sb;08@7kk zZ3(R15_tUO|3lCJ?|$-s^TYowdm^eg`qyjN?yk)cy*J5 zTC=5_fEjFVOfXBOwI;2maj`zOnI~-s0Iz zc&5$t_4w%N?EnA&A^8LV00000EC2ui01yBW000GTp!1DnS&9u2AzYzA0T5@}NT>+* zLKe^;0$XQDEDjAek8;UWB0rI))bos(uAj;XK`I9UWlkx* qKZVj{KPe?f16U@1AAy1-ga%Vh4}b=b6%`T-3kjAFjUtC9Apko+wrGz4 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/interface_dialog.gif b/media/img/icons/mini/interface_dialog.gif new file mode 100755 index 0000000000000000000000000000000000000000..31e1b071d9db2bc6dba9de82867cd91085e65692 GIT binary patch literal 238 zcmZ?wbhEHb6krfwIKseCv+Ar@c2CCS?N(9MjqA^cR?bVCej=t}N$#9eom(%pZMx`_ zKgq9XT1d^}n2ARMI}VmFJ=?qXa?$*QuqNy}#m3-~U(YP9w4M4y$j_0^Sy kCOoaK&GxI24Ny~IuI1%rW#!>!WR#r3+|@BdR*}IP05UgXXaE2J literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/interface_installer.gif b/media/img/icons/mini/interface_installer.gif new file mode 100755 index 0000000000000000000000000000000000000000..4b11af38eb92c4f817de748fde4ad9faac14392a GIT binary patch literal 242 zcmV%1UdDRe7FAL z(q@;)fv?Y8k;F`Ik_xs0jjhvBh`~;Bmf=D|ccjHtgT2Mt>35~ga-YGdz}}HyfxN%O z^!4~)-!tj!@c;k+A^8LV00000EC2ui01yBW000GV;3tk`DOyT_T!OGb4HRjam@=!o zc#RiL6&q(rEDjB#f@jHWE|DLGXG5)Sngo&5$(4u@o=-1s*cn`qrF%JTc2^_L}5w(}2kJ*BwMG zBP#dDA1c!dRNQdW(3>eQduhn#t-%^Iq!wS8_KQ`NMV^UCg;PCHhoz`qL|9mmk559t zi6x$wNl;aii;J6+-HDlnkx^7bPHHY28z+OSlaj_J4KcQLK|6E=*x4C0xW$uq1Uoax R@Ekf^z;NQ!IX6cJYXD-;=`8~M}KN2uM>Q(Tv~ z%RYj+X~sVN?C$FL{?PTh#PX;&lN3~uxvuejneAO@z(Pu?8;I8bJ$JdgBrg_=$?Ej~ zzS{Nw|NsC0{{R30A^8LW0015UEC2ui01yBW000GVU?+~`=$)OkELiKd-RX6}X5V)Z zqX6gszrk*%*bs2JVMhT3YBb8)5vRFapu8qWQ$QfDvChDFi)b7LD^?6NKp0#wZxE;( sDv!xikO`MM1{4_w2?=~dGBXw#4F>{;iHRbEkdcuc8GV+UA~GQWJ4b|XjQ{`u literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_errors.gif b/media/img/icons/mini/list_errors.gif new file mode 100755 index 0000000000000000000000000000000000000000..2e68d107cb6c5cf4e5de8866d207fd674f709bee GIT binary patch literal 242 zcmZ?wbhEHb6krfwI3mGtuTTB|>#47Hr_SDUy=U{y|L<3&Ex7sNY|sCH-~Ru8F@5{# zjn&G(Z+Y1@?F^Z?^Ij_7{~y<$tnvMIUcYheP22LFufF`>ckAnaFkrw26o0ZXGB8Lm z=zt_ab~3Q$KTz#^(lK}XWs{KC+pc%UI;Y3{n}dCOKv6zqKH%9!&i#YB0N zQpKlP`O#%Wpr literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_extensions.gif b/media/img/icons/mini/list_extensions.gif new file mode 100755 index 0000000000000000000000000000000000000000..a5e542a0c22a5701e9fd148df4a8d0238782a74b GIT binary patch literal 251 zcmZ?wbhEHb6krfwI3mU{d(ZVHkGy*}-+c7#5z##V^%2@ zp3;b1so1#orfvC7v#G+}*Q`?4sh023+IQ>gt1tf{fB`p9{K>+|z#zt;15yIAlYzA& zLACEm#@x^%8Nb)tu4aZZq~0$VUVPxmfBS=ZZ3{#Sb|$hiesP^=C3&`^TR>@->|6Dh zUL2E_hdE5;ImgK1;wV(G`xWaE2XRK0-kN5?corspRnb@;76EQ<{w`{QX3tSIRufZXum%7+VOoL! literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_images.gif b/media/img/icons/mini/list_images.gif new file mode 100755 index 0000000000000000000000000000000000000000..f744f19a3cd072deaa523e4133ec8b851420df92 GIT binary patch literal 565 zcmZ?wbhEHb6krfwc;?A4d(ZWr%{S8)+zgG*wQJg$lG8eU`{|I0J1hE^t-A9mE~RSv z${k$`H&;(umR8zdHDOimYU7OM`sKZg(@VNn-2Sxf!QbA?{|~Mx z@w0HPb#h_*-sk^!Klzi8R@*(^Tavh~sb#b+B+N_&^z{U4uM zGwTuLjc2|2Z}#g7#SEm z8FWA{1;q&i`=kbsrskGr&vp-X78cjuzFv=ZPY(w7Y15~>OzdEAn>T+xIm!t)F)+H^ za?v%_G1HO~H)w6-*#z+epk#Qw)a literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_keys.gif b/media/img/icons/mini/list_keys.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d3990a019141894db74d91520828ff705dbb9c5 GIT binary patch literal 239 zcmZ?wbhEHb6krfwI3mh0d(ZV->n(dW-@LIUwhp{zzYUYxez=CNbPR;^lf?b@}rwzm5E`eneQ)rO*^M=KfQA0$`dC}Oqw*QqM~BftXYc|Eox|Jm^*iFNlD4fnKSF^>iYZpYiepj zChjaQE^cjYEiW&>eEIUyrAtqqJlWmdJ%9fEOP4Oqm@#Aa?AeWLZ`zjcynXxjt1tie z-TL|;3>e4)ia%Kx85ndKbU?a6eqvy2aF|x$A+xP-4R3Q}meuSv$=$30k?XGqi*QC% z?!SMa>{bBphMR_~8S}E2h8W-a^=#Y0ubB>cr4~X8Ov2GRj0vndnr!llETVxSjOwf% zoLpRL;zBIkuA1{T*_}idWHBvQ6;P7pkm8Wba#HSOQ{iWkNe&9;mSmR@6x+2s*fq$J G!5RQ^ONI6T literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_packages.gif b/media/img/icons/mini/list_packages.gif new file mode 100755 index 0000000000000000000000000000000000000000..c6cadf3bb4444130c5adb11ca45b69a09fa67007 GIT binary patch literal 365 zcmZ?wbhEHb6krfwxT?c2d(ZW+mnS!_z4_+CtXIbxdp6%pTX1vw_S1GvJOBUxu)5Rv z?b(SxKR^8c|Lf(A1+Yie->-yB-1+;#@=up0{&>3c+P30{yDDtUcdl4kP8%lvM@3*=l~%Qfc(V3)^%WNfrredzSaCpfmv3wS1V_;21Kq8cNF3DsN8@5 zP+3)gPq0Z&RT2fe9UdbZSUZ*WBQmLZC zBI?Az%EY9>sU#^gU6E1DRa=8sRzaMPg_}_*IaotjTS`Egkx@l$OR$<6kKD9F2RyV7 O9X}Bi>=xw6U=0A7Cz#{_ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/list_security.gif b/media/img/icons/mini/list_security.gif new file mode 100755 index 0000000000000000000000000000000000000000..3e32002f1484c1965d6fed3c54c0dd42baf540a1 GIT binary patch literal 246 zcmZ?wbhEHb6krfwI3mR`d(ZX1zg|At?$@*V=9MMlx0e_^-DGohw&t(*htd|@{PuX^ z*V`?2O*^M=KYjLKbI8PCMAjO~q5(e4Hz*?N3*7sz^+?$6DLSJvYxia-Y>iz8^iy5B%-+wUg+76Y1or%jB zb6$CDeVpo4AiyEE+V#qBU!yJ`1%ZV*#>|V~b}tCvVm(;N@JCCG>9FHDS&x6hj2zqo lRcWfqBF*_VMtzcvB5l!q{bGzCwyIDgyOHy^+EE!)3x?}ar-ZiZyEP2YH;bmIE$ryqn&+}XSK zSl{YnNp-Vr%XfbM{`=AUKd-+0-*@Zle=uO60Z{zO!pOj&%%B4@8{{Vjwr+=s1s*be zeT#e+U(B?cz38!r2t(xh>nOlWBx zryPfzdzrU~>nPg!E+B!ajK>X*O=r nDy1+HSJtf?iDg|=le(3&Mj>| zIlHuO&DD)%uD0bnUtT}9>cXeaM5EA#Wv{;c-*@Zle=uOc4HSQ}FfuTRG3bDlfb3*o zElyDFdy+9%G)cnm^|q^-p$Aj$Zx>k1`1Jq&gLz>y1PUg16h&w<)J}9=EO_%`&-RWa ztF`B<4tP9vtgFywUh{TB#|-&)iC>(;eHcSM2K2o2GI5#oKMyUMJ7GHT%@B)=ke( z-2WIdac96XpL37CgiO5s;O(crk(2Y*nF`xN;^pc&RT$ZM)dRJd%BA=?nFZLmRaClq;)VEx zc^Id#GS6UOVqsAhn>U|TeUYn{BC`s+0HYcQdsmQ$Iw!ZNnwq3q@@_5lX*}{rcAq_d N@XXnBZb6O=)&S&zh%NvC literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/note.gif b/media/img/icons/mini/note.gif new file mode 100755 index 0000000000000000000000000000000000000000..17b9f418541130eb083e78e219e538d0c6df4034 GIT binary patch literal 270 zcmV+p0rCDvNk%w1VGsZi0K@gFJ|M8pu_PYQ2 z-0Q|g|MRi_*k}Lt!vFWk>&RCBiDu8)T!!DT3@0j##mD11ekK-RHklnV&OLIhEd z-EhRlGN1?833z%>34I?6e_e1JPZS7-h;56F5daq=0s)G81QZdKmmdNa0ScxS4-AY? U6Lc;wFarY@7ZbK7xFjI}J9TA&ssI20 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/note_delete.gif b/media/img/icons/mini/note_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..13402a5823027e5765a122d7c8930684c521fb46 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K@&8w0^RoZ@+3U$${#I7¤wO#g_8>(eajniK!%W$UFK|ISPN@9*TPVC&98 z|IktY_P77=k^leyA^8LV00000EC2ui01yBW000Gy;CE!7Se~c|041P353_AleXh{g z6ojG#K*|ZSDshe+3`QZ$6d{ujVM;Y@KF;WAkmzBgIun__R7Z(+`DY>~J06V)QfxiF% literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/note_new.gif b/media/img/icons/mini/note_new.gif new file mode 100755 index 0000000000000000000000000000000000000000..431ff64d1f07ea8368ff38ac49941794a3fdd849 GIT binary patch literal 379 zcmZ?wbhEHb6krfwxXQrr|GeMpEk^&ppZIqp{q-#2*GpypKk@m0DeV7?)PKK@zCNA$ z`dro2lOEGfdA01Zo^;&3Zkzdpqptt|eeXPA|NqbH{v$3`n~kTR_U=C5@c+lT*LU_b z?6CO%>(2l8{r~^I{r|G{^@*_mA7}snwCwdU*P=DL|Gypj|E%Km1>^spH~#;&>;M1% z43q)IpDbVlbU-A?PYi4`9Htg{=x~{833+Y}XmD73G1F_0L0j|T!~?dRp1tm=n^ZC5We%>aw-FvmvIpt(dOEPIJ XU%@iXKOm5ik(HI@w%c77M+R#EbrzH@ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page.gif b/media/img/icons/mini/page.gif new file mode 100755 index 0000000000000000000000000000000000000000..c5743c0663c6038b0a3e23af4d1d016d4d79614a GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{v$K(F&@%Fpi{pIcTh_A?Ym$X-Kk(J8)tJM2RRcrG0 z`nKBqq|y6{yX;b7d#=;vLrYxM=kUPa{jt~ln!whm%iiAS?F}`8qFldHIHThC>AA1MdK%`D2xE4K%l5PM3m=Ix>!sUS5I~;5p*XAu!!)KnkVRVVy)nM z5eNojF!vM!Tyc6F0}vvAQ+Ig`92^;jegS58g9ir|7>5dPc#IsD0ht~K9SS@ds2LUk Y8yANLunrCh2@nt%7#CqByd)t2JMy4=BLDyZ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_alert.gif b/media/img/icons/mini/page_alert.gif new file mode 100755 index 0000000000000000000000000000000000000000..4719a1f9209e139250f1ad1bb4207fed936100bd GIT binary patch literal 285 zcmV+&0pk8gNk%w1VGsZi0K^{v*W&Bmjwiz4{rlQVw%Yvv_|}lM&)#JYyTQf!&oBS$ zmE^2VJVR9Q&5Vetx&QB~>bqsSwX6U8=&^ev|Ni#j>F}P;`%+Qy8XFrNWeXAm2?2lw2Zk0L3?hmTml*;^0tNZQo^^UO1Nmg#l%+kHx z{fEQ)*W2Rc>-4F)%(mM6iJ!Ic_WCL^MTocMQ(}5IK~q9ZU9ZyQu-E*k%irGU@So57 zo50s%f1&^X|NsC0A^8LW0018VEC2ui01yBW000G^peK5aGbE$meeBm@$di$hlEm4C?b=IK$P(SDoO#t8R=3)9BZW`fovZSOyuj~L;x1@WP!%0 z*@yQbzF61;0TBoyc}@g03=swmxD6V+20y9-z!Ve+2o}Z_ODW3BA|U`f{!D@8 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_bookmark.gif b/media/img/icons/mini/page_bookmark.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b2a923a5ae58535adacd1fd5cf3012689d47ce9 GIT binary patch literal 291 zcmV+;0o?vaNk%w1VGsZi0K^{v^7i^Riqn*|(Ui&hB5tsaz3NwRk*U-Bbd<5|@%C(_ z)a2{**68-L*!sxb@ocvCNmXl4meV_y=EKO)Qek_|$wnh9QU)Bxzhz$f7iv*4t8j>EA1eb211p@;b9g_eA pVtIYl{E>|NsC0A^8LW0018VEC2ui01yBW000G_;N^{DW|H2gdeP&W*_0`YlYZV4 z4Z+6!o5286NaX^Dq;KQVBo>R#=pjjJP|k!z>OoYmlo4kG03;eC?*S|(6VB3`hVS7=eQX0s{~u3ISz|n2?c^9+j6E3>~5Z7y}j~4iaUH oqof!Cryd0q2?0X4LIDpIsG=PW4F(1f5Ed2{Xd)=fC>J3BJ4LjC(EtDd literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_code.gif b/media/img/icons/mini/page_code.gif new file mode 100755 index 0000000000000000000000000000000000000000..912517b83325930f4eb70d47130c3950a4f6f159 GIT binary patch literal 278 zcmV+x0qOonNk%w1VGsZi0K^{vh_A?~()-oh{4NSuG8g1OI+3G@S4EZuGagg%iiAS?F}`8<9naH z%goVdp5p)i|NsC0A^8LW0018VEC2ui01yBW000G(peK&x_??~vY1K3Vz_ty8heA@Z z>`UPnj)TpkSs0E-f|B6~iYf}ELAhio9->JUNo{zq*=?tz98)M@4-j|dhRA_EEpmI0Xv3!EMY0t!7o c8Lbuz92cDjv=0vn2@w$(7#CP2z$GC7J5=R-ZU6uP literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_colors.gif b/media/img/icons/mini/page_colors.gif new file mode 100755 index 0000000000000000000000000000000000000000..0141d38427eb770f550fe8914ef817f3a0f19b04 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{vmB{v{cvH&d{-e)nw1!}Aq|v3)`<-q_UTlQo>hjXf z%ScpdsJF=T_xe;}dGGP_DKSGqNLM{XRoqHD_v*j0w77(kqP&r8!QYL~z_abwo9JUt z(W;8Fct`*L|NsC0A^8LW0018VEC2ui01yBW000Gy;3tk=X^!Yu5=7v3UaDRMXWuaD zU3S+2g$^et+Ho)gUm-X|#8kDx;1am_h8Cx%<_k0g0h~e`plCW?!C}~8G#sV!nR8gT z8HUCp&K3^w1_lXx9%~yDS8aiUgliLsLW%$Y2@x?Kel`acfs+psPla^{840Ed4+;=Z VDjrz~4hstr5)g1YCb_vG06UIQbLRj6 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_component.gif b/media/img/icons/mini/page_component.gif new file mode 100755 index 0000000000000000000000000000000000000000..f9aee3f3ce4d81b91b408b0da587cac8de70b56a GIT binary patch literal 646 zcmV;10(t#MNk%w1VGsZi0Oo%HuG8fyF+)sQaY-@Uh{kGcu&n@%B<vve*1jX^f!Pc)#?RsLS1- z!`E40Zk4;zh|*KK-2AZ8<9VLC{p{}J?DxCf{dAYL#^U|3*Zk}8`04TYX6%>U%?^?Hx1=kNDXVSZhk%Y&-20|NsC0A^8LW004ggEC2ui z01yBW000N$fD3+ugoT5Dh<;-LTP!UvBp_jJY*v1W047p9RCGEJ5O_6rJ(qqmS!sQJ zIBppy9v4bZKZABneS3R-Tp46G7b8AJgK~Wh8XCJE4sZ_=SXF}`eRB=EeGU&mIT2U{ zeheKj$Gdt!5=le|T>{}M9V@E`d?*nJ92IK=gA6Nt2`pHkhk$~DI!xXSn(=`TjRXhi z8N{%mjDbNnzNi66kAngXQ6`iCGw4c?7;*UUK~Q1Hh6zuM6d0ssiH{I@ctAm8#!Cqy gM*<9*lHvyv5d;Jb5M$s>fdDT22r@)<(1Jh!JBfvHG5`Po literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_cross.gif b/media/img/icons/mini/page_cross.gif new file mode 100755 index 0000000000000000000000000000000000000000..bf43a0a0bc63494a69a63fe5d0fef5b683be221d GIT binary patch literal 385 zcmZ?wbhEHb6krfwxT?gk?be@1FF$yOW;=VwbgVxy_0*pO_y5|thVH)ew{!QK(`PQu zI&kgY^Y@yD&g(8ez54vahKr9^oW6JU_LF(%eg`F1hZjuTc>T}nE5Daq{Qc(Rx3cM5 zjz9kQ*3j_j+pnL#{d)WH+j&{p|6ssC8=&};g^__li9rWsJjhQBZ1WCGDDaT!>RZ^( zEEK83!O|Nd>|`Z3*C*`uOEs;l0!ub)PUp?=f27@0VfU<`vGKzV%|l1oS?<>Z^@_<= zC~_&t)O6G|iMKeh$aQzhi;0Q%F-^$to;pK9LUxv-l;q?Z@dd)N%uel7=1K?)Gp=1y z$56M4m6eCxNh-frev|MX$^D9=LUJ*T=NWkt4cpeM}YHSG&hzAuV0tR7*hz$W9iyn=0ev*?Jj1gjehykJooE``h5e7jW btQ`g#7>o$B6ch>y6%`p77-uNIz##xTkTriQ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_deny.gif b/media/img/icons/mini/page_deny.gif new file mode 100755 index 0000000000000000000000000000000000000000..2bf5013abfda71b4d48445d02b54ea9a37956c2b GIT binary patch literal 298 zcmV+_0oDFTNk%w1VGsZi0K^{vhp)~|S#Q|u{&ttN;wUKO?DSS_jK|~sxZC{v=H~B? zj`g><`P9_a+vM!^{*=e}^!WYj@%Hld`Qh;X`}+LteSPU%T>bCww9(+2z}BeC-rVT$ zDKSGqNm>8@|NsC0A^8LW0018VEC2ui01yBW000H2peK&x_?_N{VOo{}z#tDEifu)t zM@3&ehMETxIT()!gyR7SdNdH@1ai4R1P+J9nTbvqgfM|2Ku7|j?jb=~K-h$Y8SMc` zCKZK%(pFRiXCihE77G&=e+w291#|-u6Mhwo0(l1o9U_kh7hzTk1Q!n*nI4Y_0tpsj w78eJjr2`O22NM)m2oDbtr3MWWJU#^*8xa^Bng+@S0nHuH9UOEe)FdGQJ0pdDl>h($ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_down.gif b/media/img/icons/mini/page_down.gif new file mode 100755 index 0000000000000000000000000000000000000000..390ba6974ea0fb587d242a0baf2c8efe3ab57056 GIT binary patch literal 281 zcmV+!0p|WkNk%w1VGsZi0K^{vlFeIom$aJ9`|I)dqHMBHP3`_C>9k+2IMEoSd5)$N5QB{M3`r>1Bi4UV8+#xg?7K;ae;A=0svA2BOzKV zF5EYuaWN3+9svVM9T5=?4hDV{B7#T{4h@I~0siItWdjTQ=!^z{LD7(^ZCQr z=1Em+R&9;d;qGK8c$~^k$3`u1kC4A2rmZ25t&F3m`{UogbWZKqmIEq;cy&Nz*jVkL=X~ATD>Sa z;zxiUaHuyucX9!H00RdTA~<-1djkU-h$3crjgA`@BZ7>2jspppBLoRMI~%467!@J~ V46P3j3kwqy78Vs?Ik_Vt06VG>ugJjP{dk$Tr~sLS5q=$-yaxZ#SE11S zRIB!<(fT-LmH+?$A^8LV00000EC2ui01yBW000G*;3tk`DMpS%Nm39Du;)pl6A@EB z5xm!Np4!AfBnlcnph84J6a~km2eJG}oCYZJ=Ydc~*KCvvDSSTxgcd_Cm=B`#5u?d; z3!M!C{uwM9bQu_Bd3p~bei3zpcpDoG6^DHb2?~}900Ru06&HvI2?=-w0|2G~3!WbU e5ePdx1QoIi4i<=*mj?$A4;L2}RVKnBApko)oOWvf literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_extension.gif b/media/img/icons/mini/page_extension.gif new file mode 100755 index 0000000000000000000000000000000000000000..7bbe56a7bfd1db25d3ed7b4d325b7906fde1d963 GIT binary patch literal 279 zcmV+y0qFimNk%w1VGsZi0K^{vce*Ob3f(^Ng;>>+$w=m9dM~ zI&sPdLq0`S zS*amqt|kBf|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?_ORsz;l=iHBZ>f!s)4 zOOEUvh(Ko;2oMMp2~RYb2p^r|aYF5R09e2SFg#8xA^>JAP$)89#sqxDnimR+oS|+o zC!F^}Ac)Wnc5NIF3JVJnh<_Gg7y=v|hJFkM1qO>(WgG-~ew39PB10XTh@F%OpdJuS dIXXHB5E>#04z(2(4Gk6+8ygyICBY;i06T{eaPj~E literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_favourites.gif b/media/img/icons/mini/page_favourites.gif new file mode 100755 index 0000000000000000000000000000000000000000..eab0d9d1aa10f6e99659f8db5754e2a92a680771 GIT binary patch literal 290 zcmV+-0p0#bNk%w1VGsZi0K^{v(&X{~bFyu%K3Mfw7J{;snh%Z?Xu(R z^Xu{U!{Gf^Y>fZa2LIkP|Ll;^%(myLI`Q`VuG8h5!PcnD-YGFdK}lKV#fRwCvar$P z%goX1oEQK9|NsC0A^8LW0018VEC2ui01yBW000G_peK&x_?;d=ZB|tcgCQFpN&(8E zEsNqSg+|S@Sui4!2xG~Z6b3?%Wx^nM2+PA^!i`oY5vwG_&}t_FPlCYqKoXL81c5+{ ztdKz9@d$M2b!i?0cmWO&e}D>t1`=uy4he|}1qv7v1|7#D&i%p@TIJBz}B!Tr4L_o{y)q5EzYtB;xTCWf;e!643y9FwiJ6z-cH%*eE2C&?LHF520~{Ks*+N*(+Kf z6ATMOGH`g(00>C|cno`e9u*=05rZ2M2z-c&9*lzt8600y!OvQ8*k5NdeICi7tRgXG(qG01%OZLG4sLl#UWB0#v9Du%)9|Wnb)#L2_{r&a$`lZR-;OOruF+)B@Rh4olrlzKhTM5rsQvcw> zurVv&xs?C^|NsC0A^8LW0018VEC2ui01yBW000G`VC0QsW|H2gdXVExX0|CroqnDJ z8G^aZ21=li$_Ww)-$j98002bKM1sU*Mwcdo5uGM5o9klH84MVW5rEp+j6It20j*{v z+8R!NaF`?NcN=+$o5w%4uJ`HISSC2_`9t5rNhRNLt7qu7d@%KFIP z@j9C7Zm`VI>AX~t+b)(UsLt9%pgKN`ipS5`OQ+6w$xdgrjeVcEN~pKz_{dUWdslFg z^7i`W?e+iv|NsC0A^8LW0018VEC2ui01yBW000G=peK&x_?;dUtk=c1mxl&N2iQm5 zb-^ZkiVma@Avhok1!v{+90r93Fd(rAI9QDcAn{}d3riy+D08$PhaiK%P$~nc8BGub z7>joS@tBJU2Y7izd}SSIdjl323j|ea2^|Jo5g8Q^1Oy412?+<2P6H8f3=T$}o}d#P jLzxb!odBR4N;e%jxBwHN7aP7Bz#0a_!)PVPBq0DhWzlum literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_java.gif b/media/img/icons/mini/page_java.gif new file mode 100755 index 0000000000000000000000000000000000000000..6592a87a014abf6178ae2bd407da7110c2cc7ed8 GIT binary patch literal 650 zcmV;50(JdINk%w1VGsZi0Oo%Ho1?1Z>hZqb{o>^1Qe%L0mb2{b@Amomqq@;NDHQGY z{!>m#>+<=QrnR2V`|9!cm8iPq?e^yF^ILkJzrMWl_WAPl`B`p^-skVG)8%wcEh#ZW zOj&VBRB29Lc|Al`LQ7rp^Yy~V%+l7``}_N*()*Um`|a-V^Y!-T>Fk@$`^U@C*XQul z=kP^OVV}d-YM{QOX9jF-&+j=}Nz`}^?m^ODH>ps>H9vcu}@?onZWQ$Q-x*4wYp z;y_1N#LCd1&-F|M2E=5pd(8ai& zrmo}c_pjFcf$o4BR8%jEC%o20B+U~XrJr*)65=kNE-yr^DGI?&YE-QVAcmZFcG zr<9_w)!XFp_4tFctItD09W&&3V3Kda)00uo2Pi651{DZ%;=}+aBKq`kFvA3fAA{B$nA4yE1PCR9s4#Iu%ZEV|=u~(hK>~~b kUAkb%a%V$I85g1u@W7$N7Z7+$w=m9bZFkx5l+)!XE~-u>9L zRI1eb@%H+n(EEwI?6ukaQek_v(cnQzS=Hz8%H;lSD z?aN{I;*0d|q*m^48s#3w(JQiiqKvS)1 z*qa6XAotceZF&s?d>#sE8-RHYi~s05E5 f1_%s1J{PhC5f~x`2DuOr2fY%%7-l8IBq0DhF35ke literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_left.gif b/media/img/icons/mini/page_left.gif new file mode 100755 index 0000000000000000000000000000000000000000..f222b46931c1d70712206b8d84926fb11a536555 GIT binary patch literal 285 zcmV+&0pk8gNk%w1VGsZi0K^{vc9*o0&0Ckt{N(KQh_A@UV{1qyqvJVHU?iCy8)478B70YV1rAkuX-v?F77DMq=zCKp&ET{7hLZ zL~aCJE|GNV19u((4M`6H4`>t|0~R8LNfC(@6a^d{8IFU6VF?|U90CFv8;=WM5ecf7 jq79`U2L=l~J{h(R6&jBRyb}`&3Kqf}8d)XBB_RMiG01n~ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_link.gif b/media/img/icons/mini/page_link.gif new file mode 100755 index 0000000000000000000000000000000000000000..ff0b39d0fd96bf36b67234cae6a6ad2bd3f88952 GIT binary patch literal 644 zcmV-~0(<>ONk%w1VGsZi0Oo%HTY8?OqoZ?kbMyB3^7Z*yZj9dN?|*-PxZ3@$)8#2K zLrht5NmOZ0UU@x4RYFT$aBy(N#l@(osG6FZcXxNy)z!zx$NT&HmzS5((b1mH`=Fqp zz1{tm%KMm@nCDlarI;>F~kd{iUU)%goV5 zPhslu_M4lV$mIUy>-DhG%y&-;3htKsPI$>aTvjg3`jgrA?E#Nqwx@%X6A z-RAA{wc7kuX@*c~jIYq*u-E+V@bd5R^oqUj_4xUOgoLEg`;y4}=VTF`qSs| z;py+>@AXAcW9;?*{{H@1U~W-ierJcLW`vdf>t*W>K>r>Cc~*!+8Yd-3)7eWARR zl$1b6S3yWu=kNEa)BCN}``732gR|q~>hX|}kcx_mj=}L#V}Np!u$`TqbeFZt<^IOv z{l4D)d7HSO#M$cd`Jd1Gp`oFu%irno_l1Rpo}QlC+S>pB|NsC0A^8LW004ggEC2ui z01yBW000N!fK+~igoT5Dh<;BALq1w1Su|jDa94hb31?AyWOh9wpj&JJmwqx#IB_s? zJSre_A4g~fgLzI8Tq`4Z8yqAbQv*7KbrODk6&V&0F9;`H1XhE_BO5yt9v%^4L}mmH zethD50U#V0<9uab3&(x$dmIP{@9#=641Rn2dlMu;0w4&4aA!t~K>_?=P_rh<0WT3K zXb5rR!5}zqjwM?rKtq!b2E+_WE2OU z7kseL9!a4?>?Dqf$?NB-bUcKp@i?hQM9*S}&=GhAldGo#=`a}Eu6Ga?F+7gARNr-FN=3zVdt9tv~<4fPor7@h1x-1A_*G z4#+T&pBUJtADCR=A+xAY{q)Mqma1&c{a=cmxa4~mroT4KS#`QgUof=)~+&T;I{j*sYXaTd%6BpddF%U0!DD^qC5h za!gM1`zFkilw?>wPi9)j8Wt9I))h*%tJiLm*{Loqq9hZ|aDstdhKpl`^aUv?Mn)zk OR#uKC*E=qb4Aua>fQ#$^ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_next.gif b/media/img/icons/mini/page_next.gif new file mode 100755 index 0000000000000000000000000000000000000000..60769b66d27aa46bc04658797263227537bf70da GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vm&^QekgmYr{p|7f@`-!{kQek_v(coU0;6qDX)Zyx}*Zi8m)~L(gXrJQS=kF;oLq0`S z;_2{wp}qhA|NsC0A^8LW0018VEC2ui01yBW000G;peK&x_?=!BMVDn6M%M*_hejDO z=sV#*2b(8CC>V``q~ZY-T@=Sc5`j=yAtDPDDZn5YjEVy5(Q*-(Mc6SG8K9W>VlHv8 z6K+K}y^#1D4Fq@|9RpKge}DuNB860I5`YZ=9E=_T17B;B000>qA^{3t6?TA~00W>N h2NViD9I+f30}&db2e}Xs2?-Mu8ygyACB-Bm06V+Tcya&$ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_package.gif b/media/img/icons/mini/page_package.gif new file mode 100755 index 0000000000000000000000000000000000000000..d94a07586d1a4a4f8fac1eb8e83e1eb73066a905 GIT binary patch literal 640 zcmV-`0)PESNk%w1VGsZi0Oo%HDKSG#S#e2JX--~wJw#PPOI_^Hn)TC@>c)Yo)BB>( z`}_O*o6Y;>?e><+`=rtPp3eL2_Wr@&{qptsuG8iJ_tdD%-Q?@?j=}Nm&5?SKtLE+V zMNeVA-u+s6o!#f}t<&ZC?$_h&_psOeTY8`U`|-e+M!Vhp)sh;py+mpH8^i{lww@ z?(p*O@$`zl@A}=M|Nrp+|Mil{`~U2-`{%%`i9_e__y7CuQDJ^>j<5LTxu3(=`{%!V zp1QBl;^gb~@%8xAv2fGp@UYV3rqTPL&-+10SBS31*XQuXoK4~A@Z;+7Qe%KsXN0ub z{dASF>hk%Y&-?!S^5pOJ zxG6Ab&z>U{z*&SS!@&nNgSrH;&#C>Arw0fPbbPzJ^YGE*2>n}L8P(di}#f`-!{kQek_q(&TBN;zLVZ)#vbFn&Fzj)~L(g-skTrF+)B@RpROJ ze4)L|%+de<|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?;dVMVDm}1jhw|hep&O z==8z~GHrORSgnM6@HQ4;4*@!6xGR+fIw4vg zByI*g?ikQL90EyhXA2I80}~>FNeyv^hX5Oj9sz=0a*zN37#bo03T1_nn*yF52n7l~ d8?74{0v#Ej2(=Ip2?-Mu8X6f_CBY>j06X7qcdP&a literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_refresh.gif b/media/img/icons/mini/page_refresh.gif new file mode 100755 index 0000000000000000000000000000000000000000..dc238461e70d12e4668c5f1b4bb3bb3dbe3936f1 GIT binary patch literal 286 zcmV+(0pb2fNk%w1VGsZi0K^{vm&^R*?DTb&v2L1Dsnh$W=Vn)Mk%+FxwAuXa^Z7|t zYxDN`m(yE*uvn1GSBbmp+2`-Z;{K@1-k{IpeK&x_?;ePSyGlAhad|cYC*xE z4?!M0hMLEcD;OENPT~O+NjgvrhEZWC6AOwc(}_f&j&KKo$Zi+jFT+t86U@-K97=dA zJRM_UOh(iR69IR51sG6d9d#3d7kGtJ4sn1J00E614Gn8y1Csy%5E~u?9t%62i=O}q kq8c^ugJ^H(N}PhzTW*xS8en5 z`K;9Y)#&u=@%HWZ{$Y(oiM#CM@&2{h{C=@pQek_q(&R)0^Wd0C!G+n zlaI;dJ$VQSbshl?No8ga5gY^-B7;c`5fL4T90QAugkK8_9f<=285@lX2$~BVm7fiw h9tRl;JU%@c4F(#G2e}j!2?-V!8ygx}CB-En06S*Zc{%_9 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_script.gif b/media/img/icons/mini/page_script.gif new file mode 100755 index 0000000000000000000000000000000000000000..44717b30690299c0cd7fbc862c5cdde2cce8f0d4 GIT binary patch literal 277 zcmV+w0qXuoNk%w1VGsZi0K^{vbd<8!acxamZv6fKfUwP0ZH?sY^w{e6>hboD!SUY9 z&A8LBgtCQ5f=2fF{I1gE)!pBs(EGI6{PXtu!{Pm?%ibw5LqA7X;py<2ztzm-x0A+r zICCn`S5p7~|NsC0A^8LW0018VEC2ui01yBW000G&peK&x_?_PIJXMwv1Rw(*`Wy!0 zh=Vs7i9*fu(DeeHK)^FV5QLt}pyNSyuGG!|inxlF9`6+*x(*uTGIg5OQW}h~cM)Nm z-vqg5(TF(2S`8Z-A`cu5Y$6zD4RQ($Y-s>f0}^_59S#>F01g9{2OlVvWhva(BkE?Jk7y_{rc&ezt!Z$BH-xo z%goW-wjBTe|NsC0A^8LW0018VEC2ui01yBW000G*peK&x_?;e9tyxA8LM(V_1t|%h zE4;zbo=)S^C=Q4N#OoLIEIgP3MgvG95X_FJ000~uj>8}l!HTqng+u}XkIPx74ikb81{;n72?H1l2aE=pn+OpDr~`SU e1__P~5C}U88?_q=9GeWgyaB$yOeMl3ApkqX9(&>d literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_settings.gif b/media/img/icons/mini/page_settings.gif new file mode 100755 index 0000000000000000000000000000000000000000..af4099724f0e474e4bd3c28a41892e72dcc8f057 GIT binary patch literal 298 zcmV+_0oDFTNk%w1VGsZi0K^{vOj&P^tH!Lv+4J}Nn#}vB();D@_15O}RA`2@+5Li^ zxv0F*b&;>__5H%$`t0%d#nt7`G1#m|NsC0A^8LW0018VEC2ui01yBW000H2peK&x_?_NiZ34#yfub;#hgyg6 z=)2)hwU1{*Sr`S5q@yvJAVkK2^uR$b8-wR!fR%U;kVRsg^$0uzNkbhuD8_{Wz=OFA z9*Tt|5`f3&0uN~m9uOBX1&IcL9%~X10SgWYi3A239v2r72Ldn(6$}Lg1RacD8X0pX)FmMRJE^0D6#xJL literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_sound.gif b/media/img/icons/mini/page_sound.gif new file mode 100755 index 0000000000000000000000000000000000000000..1526ad11ca47ac3c7bc8a6dfff3293c767409795 GIT binary patch literal 407 zcmV;I0cie5Nk%w1VGsZi0M$MK;_2|mhzbdRA0#3y1~`U2JS~cg z2r(5ZFF2A1lp_SAJPj!oAtg06JD`X>5d@_eCNL{CGCKo8H!iR|kvJVEGBN@!@0s<2SygCRPJf67F0yfk=G#ffx0ObG^HXIbZH0?7p2L}TK1qBp&MfpWR06Uae B!1MqB literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_tag_blue.gif b/media/img/icons/mini/page_tag_blue.gif new file mode 100755 index 0000000000000000000000000000000000000000..5ceb96ced609960bec191a8bb96bd7824ac2b476 GIT binary patch literal 288 zcmV+*0pI>dNk%w1VGsZi0K^{vC}X&dvBOcONHvIIr_=Vr-~3Nqc8$OA)#mo$>F}t@ z!6lI7Ku1?6lDm(^(^ZkoG=w+D_aj1-O>gijRUbT$M51ORY2IR=sQ2~k`e4@jcZ;dr*2hgZ^&Oa=(@mJ79tu>8x8}H4+n7^44xPp m2n4RLNU0tj6&N@h3Awo(78#yo9R|V%48;r?StZIPApkp|4|%8n literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_tag_red.gif b/media/img/icons/mini/page_tag_red.gif new file mode 100755 index 0000000000000000000000000000000000000000..4aa2416b6a7364209194883ad2c7bdbe9ba85cff GIT binary patch literal 289 zcmV++0p9*cNk%w1VGsZi0K^{vC}X&dvBOcONHvIIr_=Vr-~3Nqc8$OA)#mo$>F}t@ z!6lI7Izmz>lDm(^(^ZkoG=w+D_aj1-O?gijRcXf^}^1ORY!I30t?$=N^@7smsV&|p2>%>yiHNG1aW2W##` z00hdyErAfOb65oc3JrS@Qh#-G8v+w>R09AAbsiaW2@n$kRFh^FA{kd34g-=82XY+@ np*RQxu(3$29vBrJI2#GOyB!v^85qI_#0Ct<$66)JB_RMiBn5e( literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_text.gif b/media/img/icons/mini/page_text.gif new file mode 100755 index 0000000000000000000000000000000000000000..c1132e472e3ace1a1afa804797a962c9cb26dc5f GIT binary patch literal 276 zcmV+v0qg!pNk%w1VGsZi0K^{vn#}uilCY=J`|R=dz@R2&2z3Q5F} z>qOreH4lW4C>9+^M&l>CFcO`pw8N-AM3yJgq3CuujH~DHoJxhgmVG_m>3!&0SsJ)n3w~b9tH~xJRGVV a7y}R)oCdNF4+sbm5gHm9VkN#LApkpIqkK{T literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_text_delete.gif b/media/img/icons/mini/page_text_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..f3178ab40a4af1d9d2ff0dca5db4193aaba14763 GIT binary patch literal 277 zcmV+w0qXuoNk%w1VGsZi0K^{v#o_%-S#Oof{Bx49s?+=C6BGVcR_yThh^*A&>he}> zjJDeR)!XEayXn5({r>p)@b&uth=~67_KdU4qQmEYq`;1^)G0ATK}lJ#*ZiQ*`~Jwt z<2pRc%+de<|NsC0A^8LW0018VEC2ui01yBW000G&p!Z0gSf1slK3w5#TrySkFnDTN z6ov;uhlH@9z?BRIP6^;>LK;L-%VUUmELh7AQj`>|r-eAP$Up)p041A65YD9u1Rx$~ zGK4qUQ<<-^2!Rb6340X>4t9BYgcv1<4r_svg9(lv1BiEv8X5uumL&raV~m}j2bT&A bKtirU2OSrp3bhIWxEQ(^7kenbz##xTpKyN? literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_tick.gif b/media/img/icons/mini/page_tick.gif new file mode 100755 index 0000000000000000000000000000000000000000..d7edd0c0dda178bed8626ac89cb09366617d4401 GIT binary patch literal 385 zcmZ?wbhEHb6krfwxT?bN=;eov*Z+L{`oq~f#xpc~>Zw1o4qUTy4ei|hX7`=H>n=at zcI(fEi;u59|8Vd5`;PS|R-C@4Y3Tg&{g*_1Nk3arbyFchZ7%)&9DE?$&WMEKX&;c0?@)HBwyaN*p zJY**IEpBUKG?b9z@0()mq$M@qC+zo2CB3VHkA=0S8)oo7(r&3Zqu8S`@xu*Wr^CN> z1U$vK8RaUJ*_3OPq?Du?6`Gxul#4pMd;3_Nrqp&xD=5gy%FmeDHD}%eQF&&kkSTNL z%ZiFJtX7thl%Bdll$Di_eT^Jv&+<)sB@ZZz3(LhYoM+&Z6cJn_eqBtAg@u`!on5fS K^|6a1gEas?Jc^V6 literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_tree.gif b/media/img/icons/mini/page_tree.gif new file mode 100755 index 0000000000000000000000000000000000000000..847274e6deb460b26fbf7694a2af62eed630769f GIT binary patch literal 287 zcmV+)0pR{eNk%w1VGsZi0K^{viLcF0TyuJyy0+T+@?)NPT&~mQU4=u{I#ouI z>xPjfjGBjIco>g^fg=G3dN7V71p=WA3J!7Z(|59s&hP0}TWO0EHI@8zPE~00;yPk{OkWi;WVR1OgWco+1qn l17&5Brv;x36%IT;8My@=8mbJx0l@(q#2XrjCCMZq06Sn3cRv6C literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_up.gif b/media/img/icons/mini/page_up.gif new file mode 100755 index 0000000000000000000000000000000000000000..08ef934c720dd9d83fae91aa0d6dee9988f0a586 GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vlFeIom$aG8{N(KQh_A@U_5SPe_F;`giM#Bz+5CR7TT)?ruhQg1O<$V8)~L(g;_&|7=V{1WCH>eT^7f}oo!BE(C zI|xD|aX1*{b!uJ+7Y=;~1qE~*Y8x5_0|syh3kv`U90DSa1O)*S1(g;E44Io61ORdX w4h{$u3=o+$xO%lvhfvA5g(-(Z;21fJ!QjF8i4+e`VngL9A6TGAA*Fh)*T|Ez>6kkkaN!~LEH({}S-u$* z)&|i6(@2>870~J9r{|_y7O^ literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_user_dark.gif b/media/img/icons/mini/page_user_dark.gif new file mode 100755 index 0000000000000000000000000000000000000000..6ee2c1c81eff878190524a83a92432b69a7b7f93 GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vxZC`5kgoIg`dn>>#p3q7(BgcbzS!sRjI+#^ywjh=*tWjN zDKSGrOI`o}|NsC0A^8LW0018VEC2ui01yBW000G;peK&x_?_NWty+dTmK6jZT3w2f z>q;LbHBUuBC>jX>LnJZ~RRl)LU_eP41Wk_yS{!sb1AtiY5M{UoFBrgJkVP1@l-hP5 zL=LW)U2iDv9u@{j6bT0h2^I~09U_7N0bi0G0Sy<89svdvlam$~6Cwcu7E=!ohldFU h2qFm*5(}~m1sk>y3ml?T1E+^y69^n-CB-En06PY7aTNdn literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_user_light.gif b/media/img/icons/mini/page_user_light.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b7a924b79d3e946d246bc34a3a9bb58859cceae GIT binary patch literal 287 zcmV+)0pR{eNk%w1VGsZi0K^{vm&*Efm$dBh_T}yMh_A@UqDO)HP2*FC>9yWM&c*JG>nnO!oX-)B_hkSD3wOO4Xj6N>~12LOISpBA`Od;A#G?V z*bOA(i#GTNcOC%(ZwVO?3jlu=?5f&vB`8xRna4h{(#9gPi;k)IEt l4g#ef2nP*30~)p(0uvmK2)z;#3JMey9UUBECCMZq06Ui+der~` literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/page_video.gif b/media/img/icons/mini/page_video.gif new file mode 100755 index 0000000000000000000000000000000000000000..a1c50325d4e7c8bc68aee940cb1e31a967a04cbf GIT binary patch literal 384 zcmZ?wbhEHb6krfwxT?%>;Qrr7FF)+Q^LN{=KM4i(8?XPda}9O&j!7x1_YBSM-2G<7 z>3dh7f7o#Gv8JK(z31;|9k{mc^3#s>C!%xfuHJrf`pm_k#Om;ZiBnJgS$*aAl8e9R zo%>xjeaoAV-#&f&_4Mu6fQfzDQV3lmHNLB3XlkDcKkXBHXm_AccN=kl8YsVrfX?gaFs+yX54ryt|(c9su)BEc2_m!ruR&9+;T5_U| zW%Bm=yxsku&-=#W{nO^x^s`L1+WfE5peK&x_?;dlN!WD_Lm&qpDp7)= z8$vH=h?+-Ya2Sn@SXRxS% zA)5`mP%w+=Y#bXR8yS28asdVv5E&U89UTe{4FVG)ib-&gl9iVpnPV1w3Xua8p8*RD kaC{919UdB=2m}i}K0OB_8kh*b2noUy#7w;<$R!~FJ8t!Sd;kCd literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/readme.txt b/media/img/icons/mini/readme.txt new file mode 100755 index 000000000..0b0307974 --- /dev/null +++ b/media/img/icons/mini/readme.txt @@ -0,0 +1,2 @@ +mini icons - famfamfam.com +Contact: mjames@gmail.com \ No newline at end of file diff --git a/media/img/icons/mini/table.gif b/media/img/icons/mini/table.gif new file mode 100755 index 0000000000000000000000000000000000000000..e5daec441e2b1e16812e7ae0a2bdc7bb4716b402 GIT binary patch literal 270 zcmV+p0rCDvNk%w1VGsZi0K@>(BfBbkK5_=bdav(>+?xfYwPj$o4nUlk-2!E zx;=NfjI-HMVS9nC*+WZQ^7Z)Y@A~KN^@FO#jI+$q*4-&FLq0`SW}w+Vg1MKs%aOFV z;OOt_^#8uv_5c6>A^8LV00000EC2ui01yBW000Gx;3tk`DGou3Ak?HN1R)S&Fi1nL z=Tgj?BLG6I(bUaRI$07NB5E6uE%iS^xRzyS-ElJ UtPKqY1`iJx7Zz3~xFR6{JAYbm8~^|S literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/table_delete.gif b/media/img/icons/mini/table_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..99190cd537e1527167d75a2538892f5b8eb35673 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K@Il(6O#6aM%2{#I63Z;#~b^WNw2NmXl?xY_@R zh&^|?@ACGFve{8#dx5RlLrYwYv&?>^z}4I2=kE3?F+)B@Rc4^s<2pQ%w734q$d|Xv z%goX0^#8uv_5c6>A^8LV00000EC2ui01yBW000G#;5Q7PSe~ee37>`?kt79l5uAcR zd=z#32g<~8A_y?0g>uO#s8|HWr_=FJ9~9z1AU%1$--dyB+EA_4>$nu5WWaFG!+@Zx4G)?C02dbk43r-Q6AV2Ds0Kd_ Y92J!XunrCg2oMk!78PVEyeJ_6J1VtyLI3~& literal 0 HcmV?d00001 diff --git a/media/img/icons/mini/tables.gif b/media/img/icons/mini/tables.gif new file mode 100755 index 0000000000000000000000000000000000000000..87246be87fa2d14ad215816bcbc9f201cd44e905 GIT binary patch literal 276 zcmV+v0qg!pNk%w1VGsZi0K@q`-``%vyP#mb}xS#Mr3I-qF_GDKSGnMOD1n|3rVz z;OOti;Qx4{&j0`aA^8LV00000EC2ui01yBW000G%;3tk`DFRJnRg@IHf-nhU11vzU z=g?);2?AnxC~g7)#qVQLcs?Cb)Psa9D-cg-%k?A@1BQt5ct)Wg&tef4Ny;4|(KslG zB3aKWdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/anchor.png b/media/img/icons/silk/anchor.png new file mode 100755 index 0000000000000000000000000000000000000000..9b3422c61e5d23434d085834b82eed7a7363976e GIT binary patch literal 523 zcmV+m0`&cfP)JNR5;6} zQ!#78Koq{K0R;zL3K^ueKcPdX4$`e#^8*A?$4(UrP73NEC=L?Wb`e}#+M#4AI28&O z(h7D{iBLo^6ibLnntoS;4W+RSeem(_-M#O-mv=AJwr%ns(1oktvOHk&-Wjo2=gN^Bj3SRR*}a0NpG5_ zolK`M<47b@MJ$6*<9VLqM#|QJ9FOl*`~9c!VzJ0#yuW&YL-uTJXs#7SsfEK~0YXX4 z0b#F1DNRn42?6;6#8Y4fXr9klsZ0WbcEP)8e6`gpm!y1M!N^ZV(=IC*t) z{^;nqJv-tM$9J1L2QJ2DN!#51=1_l@G`2=6e0lehL%sic%`_4--LFM}IF!KzJCseW zq1I3__Z40|e?qyK1__gzP(qrBf-G7SQbQ`#Lw94WVe(o`qg+f4hy;Qju)q#I(9{`% zQmAGomzhQ!b|gq>KqL@IkO~$=Koi}a$u6d07kiS}NoYVMJjAeZpaB*;wwcDdEbK@K zNP;B7RzhQ|H9AlUO<`J>m1(5R)Pb-iLBb@7Jp)}LHdAb-VVgYxVoTzGoqu{~a>6uj zeqCRFI9pC#h09bGwy9;oHcp6(RB%jeY^F=Ll!S+9JkVe4nDG7tJMQiP00000Ag3?`k8$#1J0F}NdayEtTz+~+#EG995YAF(1xew#=1J)ogJuY z3Lxu(1VP;KAh`GKm^?X0f~UCV*)Nf5F(3GKr=#9qzp;L29U)FF98>T4&VoHZ|-ho>^FRq4ws;uOVa=V002ovPDHLk FV1kR43LgLf literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_cascade.png b/media/img/icons/silk/application_cascade.png new file mode 100755 index 0000000000000000000000000000000000000000..da5c622eaca0deb4866135926af1d2aa5101d106 GIT binary patch literal 524 zcmV+n0`vWeP)}lwk9A2Ze|&iZoIgAZ3MTi0rviU@eS5?r z4KA#JuLrmglUjU7y&F^VIw}$Rg3uR)V-k9U&=-WhAoK;n1)+F@6(FfbKq!_YoYN6- z@oomdg%KbsI|VMR`^0v};X*@SkkbJdKbzvy#h(jwfiBRE_p0E=F98r%Yr~OBPWzsj6v!X?6(f7#B3EJn O0000hj32+Ia2PFSwHp_;8^u8>r6{e*krHy43#H^jT&z}Wa&xpokqZtA zFR&Fehhe_gp*x{i&XLj%HzdqAeQvxDT1Rjn;gaWw} z5^~2QShuR2o0yn9fA7Y?Xzt(DKhn`?rmhAn(VT1h2r!!4rBZw52P-vSDzPZb#g$`y ztkj8XEoxZ`Y73PkKp{LJ5D~&7@Je_kT)~2i-c6l&IJJyK&5~gfN`_2W7%3TM2{XqE zQA8qFq861?%N|ZG0Wt%FLJ$TKq7Wo2$Odl0Q&0;JYFQzcn1MtBWCjLiAQxdE1Cmih zK`p|mAf*(48Y1z>=gVSoY2jATaZ?l66O4$*k`47+`l zweRoK+p__ghH^x(%m8DN8Gl-sYSGx#3kS}zEMMMC5wqj&noaWd37uvw=_X01NGD-Z+i^1;8t2&z(w`{C(PM?|mR`Ky`;pI zld+0ZK^TRQ&AxX;a%I->Ls?9Vv(;_9E)=9HE>13WHNsnHAS>LKQkMbVH_QE8X!1!(q^p{6+N_ X4^=JUQP|Z100000NkvXXu0mjfgEH)N literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_edit.png b/media/img/icons/silk/application_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..fb2efb8775442af862ef0ef111f371e5857928d3 GIT binary patch literal 703 zcmV;w0zmzVP)FxeKF=OosmQ6jmTLP{}-6iF>nO8f(+aY2!Xm^*5Av6NhR zD0!Nar%`rnu~v@R4hO^8&iS41=VQN>+65QO>m_E!|B#IbuI^pAy5?9WYjHC`6;s8j z!_-hy%sJEya}KAD$C|Z-~!ZLFQctG09Uhp@QPcl?mU}7$E{?cz}t3fC%LK?;}5+keI!OTyHb6 z@j}nbBm-HHT&CJnb^IYBAVSCka_RdNzT74;XDve?FCx*eM2ky^TZSvCN4lf#zADBt{VLMZ58~8Xlk&tIj2}J+_M1=n24SuBB zC|kIW{HG=&F(WrHgY=^pRBSp=QTYN)m5{Hh{2@SBTQi04uPMk>dS9PrQdx|l%yhmz zOH#Sz0@1`YLTX0HPj&aS)SnFM)H&2CwbI1q`b)fRK1k<-HpW#}^Sv*{jiIgdH9W>t zQ6<#EFflVmJF;g{aA;S(kLP%K=NdiTT|X03N>|n%ZExo<#LO72ZdK{vlG)|{vIVoS lXs&IrKfQB()Zh|+zd6v%`rDz z6?4Z`Q8OB=D}|}4g>&PV`$y8ABR#`axw_DjV?F8$MI8o4(qhF!@oS#-Dpfr2Tk7gu z9B5~~P7lozrS3*l&J+jS95pZ;Ge^zP%+btIH_Ga?wKkxpL;-gq2|^GEK?n&XBBUXZ zCMo{&1?6``R7r{2s+7nwB?@Xv6aW!Hf{+9uB!UD8USfG}ociW{R6gA&tqw${Miktf zRU$+I2qJ_aB#BV`@POLpE*iIXQJ8xO`57WJB?@NB8W8~zq5x=qfp72b(XhD*{c(pa zou~Nz_6BYlW=0gUN`+M-hzOC05Pf-bljip0usq4cwd>S3mH099i0`wH$toF9a5bU? z5I{r_pzwJTEiBQnsfex2fE${BN?Y$)=AT@lie;i;W~>n)0OHExv#T`i+K&}q;Z~x% zuLCQ8B$u0}amOLLY9@%}#NgOi%g$~6ri!Vds_fbDl#>T@wC=7!^Aot2d479}?!HbW z*$6eqcr`C*eJwEdkCSfuyE`#n&&HzI*;w%0FZ)<=o_G qU&+mJGu#X}!_9Fs+#Jks_tsxXE+vBxy0Iew0000u4Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_form.png b/media/img/icons/silk/application_form.png new file mode 100755 index 0000000000000000000000000000000000000000..807b862cfc087b70dcdd971af3ac92688484e998 GIT binary patch literal 467 zcmV;^0WAKBP)4nWfMy23V#h*$3p-!?D%AI~T5+JJ;5Qi)|`;Y?)XOj2U`VS70o zp1%L~Y4f1;U-b7MEOk38OU$EtImvzCpiEkKCg)@3^{;h@nc_6NuOBn7?ZF9Ev4w3+ zWiSxI_v2&k@_b{1R8kdeGLx;rFK&F@c}mqZ4YwJO$7q^VC6&nL^Y#-6g9F*zM-oa= z70W0^1X#=%!t{DQE-wCJ^Pd1r08&yFDUlL$EtoM3e+;?Hv-Nc(QI%=il9}v$`OS^N z)(TbAG~DLw><`m+N>!Xf5_@kR0j83~eKLh5sv-%=fC#``TU}jaG#UW`VS>Ph2!jLJ zROR&N$x3B;J002ov JPDHLkV1im=zqk7R5;6} zlg(=rK^VsO-|*I>7Z08a{s)Rsf(J|SV_Rz!8yef7kVJ&ghD4GkA*3yaw3HgOrMaY5 zCEF^>3bs|O#wgl0$9$0`oBc>UmB*RcC2f(EL>GQM^S=AeGc)h*Z~(affwPP)k4&ZW zy8GEaTu%wfT{sti;{L*S+?&tAF_*=7d}1I*%E6Q~85vri^Z} zN8TMU1G@6RU=6$lGjJvM&}=rl=7#UJVc>l73ynqtIzxx9>ufBFVp|%dhW84l0cn`3 zs_37{w$MmS3)?-Krs10Bm0>`;T~`z+b%IhiRXNdszQ6MDg<(KHRjnpNmSv_4xkj`` za)urv8+pROgH^-8k@yNpl2A3FW2q|rb?$g7jPaSPu!j1;KROSKbIdTX&wfIsQaRQG z8XrBv^AAh#tPEl;H;pev0payKxEwx%-jP#5ZZx)yQmI5Jn`&^>U?^|_>2DFFe?(av z+_;JG#w}{_o3lkXQ79A%1r!N|7R8ocbf3k`T;f_-wuiF&l>i>!Ju~? z*C#Th%WJGr{q8i**?JHVhTs!;Hrbcq4|mYXjU$DVmx8A;B@DBbsnVGBpwnwhiv0wY eZrfBp&Hn+e<03_si;HOh0000Y=*2{WUucY-zdJL^dl3I%>;ad8o^ z7>UT-aEZGeIS2v;T;fmM9XBTt$%UH}0?1h*2qK@)Ge19v#5w^G0dO}Gk-On;h*g0V zg0c5w{A6?(dp$&D`V;BhwH(@f3^+wpiDS%+&U-Vg>20eaQ79BhObrh(SA506v+ZnZ z$g})zgzWPtJU(945y>2Pr{~-rKqTCq^~N9e(A;`~%*Utj>?T{b@1P-MscT0g(~ZNI{bH#Y_Utm11j?0+FF&hK-qRX-TePYY3~f zgtoM;)~2M+AJew!(sr+7^KN&$cgxoJcJAGZGzzQ(AD(j#=leYm&p8hTfchUO*=18r zr!~koJq|$qh+zB()q@3G>7PU6y;(H$c~Nhe#3lU)C~l9VR_BJ=;N(S}WT3GGbJ~$L zY!^k>SWYq!Z~hmmJ4PWHsEvN4)9Gy^Z?)wOR0E3;1OdDR51!|xxx?Z3jR~6$3lGcS zw`wrecMQ|rMHQ4-uw*icvKH@8Qe-U(ejNgB1!Gqt;e8II!iaktI@}570bpEkH@7b5obwc$sUX75)sc{ zLoV$^I#`Q!&qeqKv2}x;Q6ZOcK?qbLvr>-a zyc(hY)2O@Nn=hiGX9AH(WK#{q_3OcQFyqRCxB{6^XTi-jVaae3jL(UZMoZqHPUiu` zFod;2WZ-*e#Qe)flJ*;9mgV@eat;ZSNkD%BUpZPjbEd(ZH>lOVM>tFq!k`K6p&rZ) zt12-&(V<8oA9F-Oc!oCq@PvQW{0``D3AONE*fZt6-G6K6?>+q?gw;DtTL1t607*qoM6N<$g3ymi=>Px# literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_form_magnify.png b/media/img/icons/silk/application_form_magnify.png new file mode 100755 index 0000000000000000000000000000000000000000..7b7fbd17e39353723122664abae8461f3788227d GIT binary patch literal 612 zcmV-q0-ODbP)PDrjnPX=rH; zqQ${l4iyS4Fv&4giDwVmm?Q$ zhTL&8OyXERuCJ_Y++wrjMj8GD99k(+b> z<{<5wp8G;7au@E7lX7q%1U@V;^Dm<#Bbba-gga)&*~B}OVT z8FJ_8^ce^a9*{dnoOjg?w)UFTS_KNZh~pjN>QDihNJTD3CPDxgha7@4JUq?D&XIEY9KSYW_M1j`N1m2BQ6{jt9pgXOIG5 z7fYv3PRIVYk-8wpOV0eq;C3`{e8D((T~xwBz-I8+ZE$ y`XBWUUFlg}deaE*PP<-CUAQ$+zVt#$I(`F{%rIviW}jLB00009TL{7iX$V@PAta(9$|8b7D6wp-IURZdO^p#W zhGj%3h}IwkopYY&+|PAgc}vbAem;r__Cgn?7OtN?KmKI17sC;NJK>JG5gvFrVTMN# zW|%vN_vh}?(%S8}PbcQ9@iXId`-X{dTVVoMbkJeoYg zZe4x6LQzFH#h^6;2oKD`3ETs7$J)T!z`_|=FnatD=0;HwL7^lRK_n3h@B_uHVGm~Ku92vAS`gf?5Br# z8{9Z~kHXz3lDn}(5=ayYND`_NGav5KA9U$9znOkFMd9ugsm+;f5|St+frNR>{r5M? zxnXQ%jM1ZG)Va%*SCi!2P^2)Y=l}vFAwaUKcgHXPW0kkyS9ex(J9 zLu@IU7soQkH&cA1hmXWM zDZ#H?v3PJ5$Hq5OmbDN{wJ%9%wAR zT-Qu9!vIN`896F;t~rD&@Nfe0`Nv1rEgogE>hi36i1p_V%rE6ZqX5JdGmz-z3Rm#{ z+Z*c0z*?bg!mefM79{Zs`zK3~u)rkEuD#mHG}dlY@$@R6?<^o~D%1C9AK Udps;mZ~y=R07*qoM6N<$f`qvmMgRZ+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_home.png b/media/img/icons/silk/application_home.png new file mode 100755 index 0000000000000000000000000000000000000000..b60d0c85afc41d8888b874fb21fbb215a8678065 GIT binary patch literal 685 zcmV;e0#f~nP)I{hwZ<~aTagPdH^@uK zjY~?Dw;H9EMl7~jY&PfYJf}U+@AtF+YUNh@d;&9LB7zNj@9bW&y4W^QvDgey#Z(a$ zObs=~L{KwK1W{#5ln!@vbRT?hX7fc?Y${&J*Tmt>8vaK-T#*aFMOR5JtPGU-m&=A} z>TO{pOGy&t!=mG4xtM^3mKOte|UGJg?xP-rE$mV9Ba&%vrgIZ=IbKrquG}+;$3iho_m~IZ?q2fogS#R3qlEKgP5f zb4V+{nb+8a*%6*zK1`NoxG2O^Q9NgAj0pmk@4U(5NB5aEw}I1btqcwh5yvsj&CT4t zSL8s;X;8+f3SOuxj0=K*R0A{}A)k+EY-}V50x%;N*Wq#y<`|=@crHs*yjQ(1c>V1S zpUNF9?O#T1TuY%)U{Zb(?E`NqE$`v{vo;n^UCgH9MzS=+b0&&+^W}AtO2Rb}@>rRo0Q0^~dYKRD`il?SH=a@Wg zGEo%asTrQ@{?c`K*V%NlilCy12&#&tDXNN^VJesyYKp0%ig%Y$ftfK8Artf$>Q*=b T>SSUs00000NkvXXu0mjf_=`4z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_key.png b/media/img/icons/silk/application_key.png new file mode 100755 index 0000000000000000000000000000000000000000..998d65c6942453d764e0d5427e6a361cbdaca856 GIT binary patch literal 670 zcmV;P0%84$P)VY)5dRg+A)?a2)_PUQ=}3+N6D zvAM#+@`kM!V{-tZdE@rkmJI_g-<_cXFa;ngdkio&ynqp0w=gY5C?&SnjoM& zmLZk=!p^n}tjxWn(MBqDrqw?XSpzw#bPoa{5GYRc6RZqTzb8$8W`H2Mi*wCy7`V3k zOsG`{R2=|dh679l4TW;{JzHB(;tL}rw>7ZhztMPfA5xs}3CnT3=0E^5LqxE@KtZa3 zc=0nX$RaLJqAm+71(tu5g3x^B3ISA#L|9#Hl>J0*_#u*r(Q*-|Kf%>vam2^IDaOYa zu7s-kXN0N{VQKOOxzXorX+4NVgNR>ZY%rpxR3Z@J>HG=0dT;fHv(qz~&IfUadXIX= zdylHp+0@7W_G3iZ9>TDm;nyX4#||);*ozrNiA|a6zHD86?LYpuG{ZkEO_ z+;HhiElFxjo6yjHV871y>^#rs^RXwCT*&fzIWyybxb6!Br}uWWU;9$Bf*GKSsUj+v z8fuD(pk|l|qDo!0UmO{kxHx#D=eBF#)81E=FC^>ptVCh4Bz?ebSMrvWzAUg(nYV;x z&cwLV+rmnnxcZLBnJG~v2nK}tXOutoV-he?G$bx z+bC({FJWHT=iUt#X!bBen!k*-=p@PWvgC{e!HNhnW4l8{R)d>tR6uCaqq{zj!VO;W#; z=I-mb+9r}T#Z-x$suC48_VSB{1!iC0r8N1H^86&l9p|WTJgFy@`WU!f)*0Mw4O9TnqBr{Y-GHDVuib)O%q7o!E zKlFxCD=Me;C78Guop0xOj_&HYpW_Dm*t+3@`&{>Re&;#QbB+dp=6|HIxRxBDrUi@fE_t7hH*d!sYoQrtW@#bM76y@j{#K^yGu+Y%mKB@Gh?6AT=?YQ30NZKe^FU`jD8!o`SZhpef2|bb8oqiKx}PSX=Ml zPpyStYfYXXpH2?}Y{RJJ!2oi<&p};TK}S+S+g$})Z3*j525N|?ZghFxdh>+}pxvhG zGk`)6rXB-{4Ai03Fi?wD)KO4x$=GO0Jb&iKa}_{G#Q{4z9Iy-OF-d*(m3BeRA&BbK z^=B$Txc7MvKx%ipc$rQk6bd1cNFW#tVzpdGZF38^haSzwg)nqF-C@mC?4t@`l4KbR zED(uAP_0%`sZ@~5<@oh{JdRSS#JxhHz`fDY(Oa5JbMN<#=5;m;pU;Ql$_i!!0hrBZ z*ladLqfvM~9^R7|U^9XUg3!=7qi^>B;cyr;Gcz0@NfL}kBQlu`ip3)G`8-mo6!&OG z0KeZa(!a2D?#>(jWtk`Zu%CBwz)9;x96LS&gTVlc#ll5Bc_&U^-~hYbUf=g;9bv_m z_?>N1J()~yE-x=57K_24C(^PW7KQHHYn09vi~kY2ApYBHIAPfkv@9S(=c)EgTc jvoejazDXX-B1Y!m%PGQ6x$c z#f9@AK!Oh=jElv$CqBcNDKEr@t}K+jhk=(*)=6Nf9`DW>GPMDbI$#A zadnmXt6lDNZUb=D%3-T`<7 zxtL}GCkYVlWRqqF51NHf9Yl>2gOi8|vh54F$BDrs0>$iLAcx_0>Z+sNt2+U0SgfoD!Wm8sxbT>nyV*Byc6US+Mev^`pI%-cR#%pfrES|$2%tg@7${Im zLBJqCKm^~%kqyWahMtFC{m)BDn@^W+n<9Vs4o8^{xZi&Mv#JmPg~hDhyn9@iQaYl1 zb`JLD2V96U6l8WL=?n97fC_~~t>ED5npj0DEXy*Oju~q^dmy7QgiIy_{eJ&PQrd=O zTr3tLpD%!=R5+2n4HYIFZ-%8JGt|1(g~rh-D=YFj+Az zW(A5Kmc(%jan)&(SOLdLpDi*0KTl?3g3&8WuNWgH;XS@00@rm1q##!+l~R*`BVp_N zo+o>~-p$tT{t5Bs0?k82!-S(@;vSVo<7@Jfu3S^qP;(9ryrKIh{yWa!k>a)0QvY16 P00000NkvXXu0mjf=yc!b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_put.png b/media/img/icons/silk/application_put.png new file mode 100755 index 0000000000000000000000000000000000000000..c30cf59894473550b70d2ab97e2244af64c2ecd0 GIT binary patch literal 585 zcmV-P0=E5$P);No%bTEi-Lr>D_AI6iV#?A3~B^FfP%5GR1nd|DqtT_3=slpZLAdaE7%DZ zq7q}81xXPN76HNi^JdngC8_mhYI?w^U( z2gw6K?&>VvIx{ig&f_gAfExg@R2*<~)WC4e95q8rugZ<6&Z+ic)U*Onzk&oo-0>i| zIATHwf=EC_k<7^~keAhcD{H`r6aW_ify}`K%$&?2NJcK8;%KOhO|6b#^*;~+_kTbl z;Odxw3lN0NvI;PYFxpfMsWxLE%Z0^vw@I-i#zYz>Ufg_xS!EE)l=cip0Fkc0GbiElsF znK^ijVHt@UnK|0x!SlPMyan7K-~PV!>fW=oV5*oJs*0JRDPew=cw&P?(*;Eu5;d~( zYlq(NDUO%dUjxW~rt#|X#V_sY_PH1n-EQ~u$EWMFd)E6M=kt$dKcrzwpH{xkji3Jo X7}OeR*sz>k00000NkvXXu0mjfdXfo6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_side_boxes.png b/media/img/icons/silk/application_side_boxes.png new file mode 100755 index 0000000000000000000000000000000000000000..efbf3c4f8a3d485eca2601b06000e1fa43ce9e96 GIT binary patch literal 478 zcmV<40U`d0P)-eKLnyL&KL-^knRT*t=6EDnIfI_sQg({rxtSLaN#|N7L+jNg3p|2%yD-j}Gh zXvRmU^d_Srz3KUHVs2t?!s1VuJ3E_%f+l0r+rG8QqFO3-kf}E^YipI8gG!@$(9}@S z`}+MSi%N!^3N=9_6InD0(NxPclhKf6N&+Qt0&=3L&`3d3rJxxfozk0(hV)X+R0$a} zpu`nPGGScUSKXc>P>6^?647;xo_#xhBK?{PAT#LZ1hW-T!t|5p9p`b~K3L-2ju*E^JkQ)1ep^i@O zO=b{e1r;|mMRr4XdiVLhU+?-1LR>b8k4JEKb|Q?7&0alocKG31%X{1b370S#E=Mlh z47uZGm_+aH)LdQtc4J|(HeC##9-i7&?TP(Wwxg%nvMFG?XeE!WwO?%4dh*C0g`0Ef zLWe*W2m~ULJ9D?Vcyg2zhfmSB_aH?q_}l12oh-VGO(x^z>t|%^tu|H~?#@1A}DkjYKCU z+(ih1ZZ45UNo*=A1>;x7$x=HZ6aOQ3vM@3>JKKNsNKIzQgqa};O9@HH9hc$e$c0Nt lWUm$`Yv+TzvlEdW`VF>D22IH@9z*~D002ovPDHLkV1mW`@~!{? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_side_expand.png b/media/img/icons/silk/application_side_expand.png new file mode 100755 index 0000000000000000000000000000000000000000..030cf7c37839cc02c5d08cb35de9f62640063c88 GIT binary patch literal 581 zcmV-L0=oT)P)bXLFrOI}#XAMrnzM!yjS$@!NeFNp5HyTkm?RpyuK%q>=#nO`L` zH==;V1|c9pf>tvp`m*qu(YM#h+5@Fh#;&%E$O|J1=7!iLIYm)$u;VZno}ZxjRuP@|>+C(Q4%^EH7|#@HX#1eW147;PK_BBq1TB ztSj<@D99YKNph?(W`E3bY~OK?cAwzMa0QZtGz8KlA(A^$=I%s7L~>CS1&w->X#C+#Snv+#Q#Y8#3W?Shv&pgYxkM5>5!j*M^V=GM TxI=}Z00000NkvXXu0mjfz>*Jk literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_side_list.png b/media/img/icons/silk/application_side_list.png new file mode 100755 index 0000000000000000000000000000000000000000..248eaf1ac1473e89184b1b037f7c077ba76ad99f GIT binary patch literal 510 zcmV*ZfP_n!43{GpZid`(Gfd*b z+4f|A|KP#fXDi!vur$~@v#^*iE^r!)CllKOw(F$zJUKk(w0^dp2@hX=@qc;r`m6uX z-6!w8M|BrryaywFplKS0!y!|L$G@=7vCc6UjX9SuoyTN^iaTLvncg*K)lx~xNX042 z)XoX&j8IKR81KRLAMa?}meFX$RLPK2p(e28SQbGhLUlP|XPMp&W|ag=;0efyqC$|2 zP$eTQy?}e^B~8P~Akh zvI%SFo^y0`#Ky)3Q#mDqfRYj}5nLivNrX@9^wyYFQX&-oDup0-LOuBQeRsUsuE-3T zFf$}!ZOg64pOHH*!_AQkmyig%^pd+XkIbBY0|KZP(ksAG%K!iX07*qoM6N<$g5MkB AmjD0& literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_side_tree.png b/media/img/icons/silk/application_side_tree.png new file mode 100755 index 0000000000000000000000000000000000000000..f04a52b3dfb8dabf3491ec7e052ed1a5f7dedcc2 GIT binary patch literal 483 zcmV<90UZ8`P)pN_*poPV}fK3`pE3vW?6l<|D5Xc({VhY=BuCHMV1+hrG zRkDirp7VD{3|xW)!hTy z&t80bcW_)5_ZLUq{><*|a}%?RjUNHWWi!Y&>vL}E=OCkb`Tnc^=hcUAy3Ug~pS4Ai zf@ZZ^(RCfQR;JeHzwlA`C|tpB7x(Vo!oz6_5>3~2)LOZ!duS=Ly?fM?8MH^Wx#7jrYe3uiJoxB~poHWZ_I?<4jWG_RV^Fa4>!S z<-_K7zwuyW>&Du8xwFPqte-A&3)t=#)n##f!d0DB7glf)6EYsY(dy7=k^w=~}g0OK393~W$5=0atlITpQLO+;BL(=rAq$z+S zAfPiSKr)@7L`NTxVX}xuDVk!L(P+eEGGTXThuP5)d*d;)>4filyUeE(_P_2jn@{+$ z|C!(OIit}CDY@|K(@!^pEn^)+ETDcHG z0Jez;%!*B6r4%|KZAzGCr~^&!6io-1l?bqDB7#c-x(F=MSfc4AaVdacC4&ET{L^(b zvT6G1ufy^4k9AX-C`D!>iL4b#$i_;XMi!QkXvVCBZLXtmO@9G#_%iGj4i?)00000< KMNUMnLSTX;N$uzW literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_tile_horizontal.png b/media/img/icons/silk/application_tile_horizontal.png new file mode 100755 index 0000000000000000000000000000000000000000..8a1191c389aafecbb9493f14f13de25e34f36f71 GIT binary patch literal 432 zcmV;h0Z;ykP)~HSm3sN|U6QrN-pa}fa=>kAy*54Rm aM*ISgWgjfIBP3%00000 zld)=4K@^6+dv{}4Y=qQeVU@}tM6j^36YGGDjg6qBwU$%~R)ORVZ1Ms&K0^u{3%3Y@ zASi3DyPIt8obw-xdy|`4NnAWIGt8O8$DIG4DI$UwJ0D*?ez>}QJd2wWgoGrLH>*j= z98)mhgioKpzkdJr=^j8I;L-Z(Zf|K&t}H=B5I{sb07Vc1ist;z*mi*qFilZT>JuWO zErKAB$a3eP@ytuw=mWR~n@?`DXuN!PLcxWsZyk?Al4tUtK7 z)>|I1a-*~AvhwpT{I2S?3@|=ZS8@}JuPPh5A@f!oKT{}$MV-7EUD=C(AAx)Hk^e2H4jA zqMp?=kuw0+)g#_`oi1?9<#Nbovq&bBC~8$C5(!-9btsAgS(XtFhdHm)k*NX1z-X03 zG8Gg^r3&tfI)C33bX?!-xX71rcB|p^M&taBv7`Z@X|tuRJjYBXgH$SoSS-eXXf(HUrW$71hbZ=gB zq@LsPI6|Qi1A@UI?nO&JpATNI7aos?^V)2(0Wi;h=Z$iuigL{bsi-}bDj<2`f<&uj zXu|-!oBL`^RX*oPy+3+`7O%$BV#=F5s5ZNTR%-+=hQq>kNSrJ|)Q}_wH2fMH1v~(6Q9)T8`;*=P O0000CjNr zUW1fN1d-Gd7r2N>l%796-}n2KALIT2^YO?eu@~9M*vzf-7i;%d+Nwx^J95X|kPDY1 zGh9Mum^%l$6{Q6;tonHam& z&u-m)+9C;(lg!W0^P=Y{J$aeIu9KK&6b^;p+My?$?QijWYk;}0r)e}Am>WqzqNC`2 z&bQ6)?2D%u>Kdo4V?>9yzpnCg;~hszOJrF_;)Rg}bEBg#TjxYM(AWKi=r@UR2yLC= z^Xf3~moMO(#>D=QByLU;NZgGixEo2m zUZ+l-#NFwTM29LuhehJSZEZZ_k>_v$^`U`{uGrzP*mgoQg002ovPDHLkV1oRO19t!b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_view_icons.png b/media/img/icons/silk/application_view_icons.png new file mode 100755 index 0000000000000000000000000000000000000000..6a93cdaa78cc42caed19920ae622af7e35f6067a GIT binary patch literal 476 zcmV<20VDp2P)yh(bgPr6Nj-nT19X7DZ8zeUKOl_Tl|>1YLMH z=jlD?b+Sb_xgR_*#(SP~INR$20GAV7?rFuloUPPDd!HchGLr8gZI>aqRf53gD~KB} z;7=4_D*g<@>Ld7K_aG;3>sUvEaJphdb1M87A#!by06TZW*wPh{Ku&%@CmC6|-~wsq zjb0RsMFKOF(Fjbu5Fwh)ru|I#tR-Lz>qIaxcgh90?Z1KrCWc|y!1T|aZ~=a*-(Ag4 zSPUtVz{2m+IDzS#IpP9w-9EN;RO;3eG#U+?z$0h4Kv;Wfk8B+i3#{n6-UibhNOQqt z?12jeFM)^6#o@C#4HjCL*d?a8z!%N)t>y1HEak5ffl*Zzs?{nz*J?G;G`=UdUjg$j zC=)9;^kAC{HL0z0x7{1P|EQ`>eA9tOij?;P^H=75o6^EkKQu SuK{QP0000x=~R!WME*cb6K0H8ItD70ARH|h P00000NkvXXu0mjfzPQHT literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/application_view_tile.png b/media/img/icons/silk/application_view_tile.png new file mode 100755 index 0000000000000000000000000000000000000000..3bc0bd32fceb21d70368f7842a00a53d6369ba48 GIT binary patch literal 465 zcmV;?0WSWDP)zJNu3H-P zO&@UpeyZQXi7jKe-Hk?r-sue;aDce_XqkvXP+W#F_*ot`jB?BS93Uw71|U^ZjLH`yP%FO7U<6!nLCG} z$SDlWwtp^MwsrC67-bFzu!t;6Q^%|k2MJ$kfh*aj@vhNOIJ zWFxBVQIH79u!vw98!Ll~y$OKnm}QK5wtxPNU<+B6{mDR{T_7M%l&baHE>bEbHX04+ zn+OzZ0e^b{APT{9E#RmJ5)l*`)B%#z1i)YIM#v1#3=Jvuyn6YS$$CoGDq?9U@APAh~ZOF>jp#TVKsZ^rDVDQJO z=z(unDix`Pp@6(DbUGbswOaq~fE^0}P{J^D(r7fOTCGyOUUzmBMUy*UwAN0eHX3ch z0VGKh>h*fm?RK3*p0=MB(nc}0O&K6sv)ObGuro)jd=1C!>krB`s44?r3Yg)uiG7!8OBL$a-Fo@&0(0LjNH2#KGJZi@q2YVKu xMc5!EfO4vTMwnf`nA&W_@!!aPwbiWO`5Vn?>V~$MffN7$002ovPDHLkV1l0g-PQmA literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/arrow_branch.png b/media/img/icons/silk/arrow_branch.png new file mode 100755 index 0000000000000000000000000000000000000000..7542db1d1a57f9f3ccc6d5d4dc82ddada796e67f GIT binary patch literal 582 zcmV-M0=fN(P)8HN)#RH5YnYUGP-mK>R8bw z2t8C_N?y`%B@?pVvm%P1(=O${na{Vw7Aotm+uS~f8Ro~wbIxHo`d;S7O>X_I!*}m4(;rQL3lRx0{4$S^45y5Zuub!<^(wd zDg1Ydq7a)PBNSH(^bYo1I&!_cv8F)Tfk3iCfaGzKcdABUEYJ~V4lNs7(L31l-D~h- zlLeyC;Rle^b>Pb0!o4OezZxjWAc9)nJe_NP=QDRgIAC4B#i)@%!f@-iPyu79xm3 z&=Ei~gdfA((>G@?t|CClgk~>+;;$k`$HzXCdi?6@>wW;(eSTM7w8{L??AcXUU@Ta{ zLrZBBKD>>O2Im`9qM4R5P3BW3krlN(mI5Z z(KV^C5HyzvLrS5djW#mEchkd0<@IzkP&T zje~)eD;&7qVC!q^K`R)J4I}kERX%bq_9+7Zgt9nQ1hjexG(6abiLr9H+N>B-7 z2>SBph(duFLM%ZMg!96nVfPZi`0RE{To_%f(_e%DKo9^(nOQLYoR{*7@^cGNURr@4 zzkZ(Ce|2}YP~a51^_3ecKqY3A9#W~)94RvZ5Lhx&%iTlGqzqJ)REFGQ7YYk+-h&8H zSWpD2LHy$fOifSwLOD8d@zwpm007W@bKhnf=_J{@wR~IV`r=Zk3O;}Rf{Doq5z1{E zIsfv~>-Wn(Sk20NF7Mj0E;nzqrn&}V6|v_rc**3>7Z)bS{%hr>c-THN=6y>p_+sGG zVAk^%RuiWM004bvt5qlzG?JaJFPIi!hzCPM5F-#u+HVZ3^__nM0fhdEP)RB*?~^j!LKVQ>(O&A{Xr%)RXLn#U zs4LtZ6rCMFY5|B2$)yG$6aaIFPbXFR5;7s zk=srhQ51%Gi+LO^77wV16dAzbG@wAMB7&i`(b(8xDqyU&#ij;pOFf{D;3PUo6_qH7 z@zCD%DY)SY{?6Vev}G>5=v^;XviDy5`&RNV6#!MZ;uAv`-s;%-AVco=6~AW@oV#X; zoCz$&Z(d;jHilq%pcXjuFe4{!G(v;>9DU>S79m;;B2ox|%Nj+MJXx5%p2GUiG!j?S z2%Y&cbj&LR9?=RJ#?#^`7Ar|SI}E|PVW`sPXn8=Gxtzq(^&D1yr10dMQz3B4@Y_lP zuSye$7RF#%H`Lg#dZzwixa6krr|(Pf7aR(KLtwFRkwCIM1ACSQfoTSJFpr@l7akX# z@D=Rv9@rED+g2a?Hy@G7U^9C3eb%8a_?P-$1a5i9WKAS#+qN85)~E=vH{A*SvKG1z z?dVFiLHkbgJ49E`%y@DfW=~%tej1}mHwt<_YB9MVMN|yeVJaZ7Jh>K;f_N^45j&cq zYibm9%abEw2)<1>?5kF^y-^EP;Mg%$3H-V=jgh?XuO0tco$p(rOKHJp92n09(Vu4V zFxf1qxGkd?5d9d=dtu7-P^)33OCji3)S!K#g=w8v*PN>ytji{-6HO9rn%8(HWsOpaN*gR#GpYXhHKL|EB8l4*TSU_vTR+aX-(Oi?S;8XyR2It;Uw(aI)9^S|=&95eX@({k9USGy;sUSUzeJ^< zMds$`SXy48v$4bI@E9?)it=aq5A%!jd|dcIDK=`4J{pRP&HSggJxd`56RH!pk4D8J p8dUC|epvAzhprq*3?{^oguj5GN{z3E7kmH!002ovPDHLkV1kL#`6U1V literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/arrow_join.png b/media/img/icons/silk/arrow_join.png new file mode 100755 index 0000000000000000000000000000000000000000..a128413d8892dede67a722b755a0e5a241e22cef GIT binary patch literal 626 zcmV-&0*(ENP)rYsPY01;xw|q+1XP62ZKNNf0i}lORw#-+^ z#eWjGI5)D~*%m(1>5Uva|KRl7dV8+T7A`G}x7k6Q#1cL#?^nclzafIHF=frdfxTM;5eU`G(t3ZL>h zq%#>uD8p~AzniHE4Br`SCb{0b_i(V?*A7x4Yp)<*$j^%sM0Q8xU9lJpTqqXT@nX^1 z5K1V0^Sv}x0%NoVtwF!n4+^nruOj~?pIo^7eBkL7YanOml9_B4qKQB-fL6CVNJ_L8 zqEZAEp`_BgUC2WzPE>s=#feq$gGR5;6H z{Qv(y10{fofkH6I3@AO3$p*x`Nil#0jeqs;pT9Ds7{CaN1)$9r#n~kE{`~pF@bLXZ zhF?E_GyM7i!oL`P0x_8Wj$ni2F7#hzWPxfvDaITYg5=lqDRUe#ScX*(E2x=9XYzD6%FONbQIbA#VsuBq0ij+PPf#`3M zpvPY0@wz6#pQ1M#cCJ4HtBQCgjp?eMD}Ow?B1lUn;`#{$MeS% z{6Rm$gJCR2mS9S5Qr^HNj0iI6M|{5JQ7pJHG!RSBu=Xz)&p=c#F*=4sGKu^2{X2Z< zASEEw`V6Q2&NEMPuTwY#5DA1Cf aOZ5%-nC^v5N+ApY0000%pKpR5(n-OJ3xTo| zzV{Az-rC_Vje#(D=jSF0=P$d$OcdrqWdZ50OISNyhHKXf!jg068_0ZrhDT>{L~4Gy zBdqY8Z{N|1SMT6qEsm9X5`57DGIJ6{tUiU*w*<03GFWKb!_-I5B@^$yqd8xVVYQKh zR0+dTu)vlxgG|$F-~JTf!pHvB;^}=nIGMw(LqWZ0Ajmc)rbZwghz$N6FuFDPw?M3V zxyd6>bK=mgT-5{T&WPHE+aleX_AmP13}~n2@i(LDRmJ8PMrCl_&@?^QbAJr{3Xe7{ zRYXL~lWa_vCNY#Ts)2%lP|*kDnyzJ7?dSAQ`{;tavxCB5aI&_5*@FmdS#$HE!Hso; z?9Gj1PKm*v6<|v1p?jjC$@D`cYYE)_AVDgN3~tc{;W|CxdRiyDU-Jm$-Iy+k=wIpu zaqU^Lc$`4uXdceI71qtpa9aZ_T0~1>NOA<)R1XMW9DzMQjIr$@2E+2ogl@2IS%W^B gtbN=AP4XIk0RxY;jV+3>Hvj+t07*qoM6N<$f-d$A%>V!Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/arrow_redo.png b/media/img/icons/silk/arrow_redo.png new file mode 100755 index 0000000000000000000000000000000000000000..fdc394c7c59b83cc2b876abc41064c75eb365877 GIT binary patch literal 625 zcmV-%0*?KOP)FZj9*=u@@4&g|7erBn|Ebu&JU%m$={t4j zMA?=F80s{QH%n(hsfF%mohhehBz1^t6ID+NGJzBtYm#sZbA{ZEu?vrT)(Lb!?K~){ zH(Aw`uB}Xq9=*Zczi=_)|A3QuQ}znM~D7~ zjUb95oVKv23l4|e@$lZ*dJFeEA1zqO!B_8JKbXnR;M>>lDE=(2>_dXN zph(~`!iy8(2_#ButL^3%VaH2WCpD^U)OZxp@C)2#hU)y+@T%ZNzJigNk%37 zz-WYJwT%teVfiEI+B*@v4ey@58(ld4VY_&5-ox`e@AKg+0U-I`y79bmuw_~y6+4rZ zBG5EdFDS+@M0OSE`>d7SUDOzKZ&h*4eB1iX7tOd9RiYtW2mQ--bUahxr1`i{RG@dM zL#}_X=DDO1{;UI$pFu=dLYT_=5d8WC-sLfjr7UO-HKMAwa=!>)kEhvuwre zuW3yF@ZxFCkI*+ad|5kOX%5zu8IQjhan)UqgSrFGA_0nQFn@Z08DSEUToCSz4Z1ls z&fDbq$T&7|6iq$_uDI$@q1_kQ@dfqk*0>{SDL6V)94@)ete)j++*>bIc9sj}Y;R1o z#OpH+Yt-^4wfv{nern^iVag8-LrYk6ae86R!cq$1)rW52v1)b7{)|O}AG6Uw?DO|Ft)k{$F)%(f{RF=l?I+ zlJnnhy4xL`1{54hojLt{-~Wv_SN(53T=hS3efa;Fl|lb2w&(vZ*_{2~XR7ONye`Pu zoA?0e-~T}W{*PZ9b_gaOFw5hT_Y~(tZoT$Qj_p>QLT-Dpnng!_d8sIiCa_~9WpM}{jZm=`Cltb^#NWN0R6i=Yh}{^)FrY1 zts6}Ln^hV9kC-0#zxPDb|Kx?y|5Z~IXW}#f=--za%M<=jKim6%%IU8E6Hm4O?>pJ@ zzvo2be~`FJvceg~cv%O$F0gC1*cmrB?0?kE;Q#uCTK~1P)&8reDgReaQaGRxhpHK8 wAOih+0O;RKWM?MbJPl^eOx0CX$&G|C05z+&w|oy)!1^@s6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/arrow_right.png b/media/img/icons/silk/arrow_right.png new file mode 100755 index 0000000000000000000000000000000000000000..b1a1819238c6de8f9e50988f4151261fa6ba64ea GIT binary patch literal 349 zcmV-j0iyniP)o>#A+qW*AYQLZl(!&BX$x7Ik;qO170ssEM z@$bKXf%rGW?|(r27bf-TSv zD}TdX0CM*JhkLO)8|Y^+n~Q^sK~hqR;q|N647YFGy>NTZJsWr!5CaSfwJm@a><8NX v2&h?|*nn(6-Ko08>y5Bipj zFuyiPrdN8pDqvvkw%oSbD|$YUB3aMBizpn!0@bH?0kAfUJ+m=Vt{!e1UD z_AQ7AnZ&Yq3oU^QbQ$1o#v~>3AqYSCl3VwJuGp2*ve%Mr?A16`oZg&5Nc6*_Q~a<`f+n=r+3NUh>M=H*cV_-chG}N7Vspn9Y`Se z0C&>eX!bRrM=;=eq7!GFC$R4w=n|A@e`7&l%LDhi6W$FLp7k-fKe@oJG0^dCs2ftC zB0v*S$*EwIXr4EM`7n&hl5iB`A4lL?b)cQ2aNKqjRZp2DO_QVx^`6pHR5;7E zlj%-cQ51!F4&J~xM61?D4NeiKN{NVy6X-Qqxk8=MfEX_jL}^8BK|~N7FhJC_i5-lo zIHJodz)CX1Y{)@S~!d8q1l+bMV!}{YL?7wC( z%edaW=F&F+ z($9?`K8YY%uR)_%0MQCxd3ndPa;Y~P?U+0ni$XZM7r6Hug|3%ZMP*Zkl*~_HJgCLk zA%$#B#@zrWY4GPt5fc}9icOq|ZdVP>t`f>G-FQBfO2-8VoE7L?C-B-QL8&<(Elc$< z9F9VNpaHd~Mzw{9XMM@!tpI_e9I`cn>D7RVpdQ8}3WkFbsCW7qu?h_iA<}x2LUHGS zH_L_8E5^i;Hs-n?bM4!dqv}ItRGh3xVBa~)+_!mXcGsfbDMZdlCbCp%NFPW!OYKP{ oAG`}3ZPvAA3WJ2dfsV78ToP)wU4~UJxT^#Yl8pW;T)B2y+W_BqqmW z&#t|w0SE!KR$a#7aL!?!V{G>0(f7&GF0n$i_yAiovkXpE$M|c8KDe}2*w(W8jK3Y2*x)V03j=u2XF48q6F<0_UD&z zFmi~T?K=p$491faq~>RsPR$VB89_xzOpK2V+=|x$1lD3~x!;g2Mz5ELE831k>xd528II@{FM*4t5cwMI2$KMmfFm;RN43xW+e;$tzEyd|PV<@i4gUfKh|U-I$hymfQ} zt?kWDj37pE;wZ>1WHG%+SvbnRqEaTN#u*-slSm{u7_C6WGBh|el4$>24G=QE;Y9f< z)G2BOvC3T5Jn;{4ig%R|E{ITA5W$|ds8uW$Z^f(HeLnnp>dACn(D>^wEGjH6Et2~F zjpx1H%%|rOCx{iqDPk27MT{DNK*OCgPK;oDLHt!jVx&(zZS&Lq>Ld9Y&Ck!LvbvJw zmn1{|Z(}o^vo(KE_?L8-a>7*bay4g1#tO$)YSGB-# z09u8rA}2Xye`S%*{zU3D^_fPdmiyPg-%=noKoSatC_xfp1wO}z@<18F!7w5ZBTtQy zk>Q?#Vu_u^$z|>m7x@d+R@cH9d2;6$#K=oAGXHn~_+m9`^0Ksl zybr&x6m>QAki2vjRQTUKo@})pZ5^O0;;V6NP3$@V;4k*yCND4)s8xvJbzU?;j6jsI zmJlOe00i|<1M%2^mY^!=O@UVms-Tw!6e7N`0#c#W>-;y{_WlDAEgOIU0000T|{kC~{~#l_0}%A4(11APN%oTu?? z=X074W`VoO1edlFk(}Pe+k{l13cG z@Zg{ebmFvrg4(aE)ymt0PXG|#hrbo`l9pd&CJJNeG5oRLh@uE|LN0g+kPAk_jD!Dj z_W)6I$xu?r4rM_XOv2giIes?kpb5$I1f+0vQ(N0DRX_d*AT>Qam_gH;poF6zhu1W2 zZM?3O0ATjZ%VV0p@0F|Xy0#$W%*eA545VUQHZIT}1^_dzn{lzTg$Dx@C_=$eZ`855 zuv2PZ+%F%lcB{7yKrj%JgDv*_6XP~T7zIHv>jS`+?hIW08PEt5;h|3hYY}w9A7ik8 fw0GAAdk6dl5~BQt8lE;000000NkvXXu0mjf^Ze9L literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/arrow_undo.png b/media/img/icons/silk/arrow_undo.png new file mode 100755 index 0000000000000000000000000000000000000000..6972c5e5946080ca1dec4de09d9430d3edf6c555 GIT binary patch literal 631 zcmV--0*L*IP)`NY~_X_4^RN+9OmbDu*=G*+_}E z3jR}&gbG0=R0#?Z-=09KI|YP8=#E5@+>uO|=1VUCOole%Li*0J2^Gy8+;b?&km6gg zf;aDGp1r#I_V|We$e$~WifFF9R7MCMwsmwsME9<<@yx?a+v)qKuKbNe>k1{IrVt}k zbbSs~bXr8Se}V_b4opa0GhLA`RHceaP=N}IElbSa8@d(ij1Q|4CvOirm96w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000*uQQn7Ao3L@HcVN_JG5Oz^iELqtfic#8+p{{13 zB!rfdf2k)SDwJS|D58iKOKXwBFIFGcC-AUOfLS9bv(H0S%=6T$O9SC=2fMD%gnJC9? z!Kh(gvt=Cx?1R~s3W9x8mCUENrT{!2(+x==*z->Z(e<;6aicYvPErVhHT_;HRWCrO zX>Ant#Yi-31=*-(@?ZTrNtR{}?1a^q3-ss0eBi>@Qc)edAUbFFjhvR`kHwNKL}lr> zmx4@#VC|1-HQcog=-UoF%!Jv#1q7>sa}xhtBKb#7NeGlV;rH6OFmr?PNPiwMRD=jG zfZ3f5vy;Gqe4sZI=uW3=7L4|E%(QHx)3_-#2chPTcz1*X$TTNe2v#yoR){KnCQhcg z(YBd3W>A0&#{D#mmPqQSlM)|3A^ATXx8dz!8(tOJd5pyIa?we$G^;NU;SSgD5WO`G z1giu)7o5cCBA8D%u7}Z)i7#g)f3PVT=*fasvkLEz*?bEIkm>TthSk)+f{EIdAk!W) z?VGx_0qAlea5(`l58AzP0|-{W*Cx;y=hMVxgG_4#JISQPBo@rv^)uedmP%+LWdH!1u~sTvRX(MC)0C( q-3yOhdA{Gl2X{NXPYNCLME(Md?VydvM~!0u0000?P)rx$R<IWI`!e`47o+X|cM zhswMI)6H-!+|Ry*GtmT2KZBZTgf*vuh@Iv~E3-o`X2T^+DyW5TGfmLUU@4QG+c^0c z#zg&+`J#c@0((YV&ur`*Iawk7JMET#>EkfEJtz9cD4oNF6e!0Aw?I&|=qKwHAy9XoQ zA^YBJr@&gw)O7(`yrYQGx{Yirh2eMScnk9(q^&}_PQ*$`FTOgh0*()5P;Djfw78dp Z{0&Uoz&aZx@__&V002ovPDHLkV1iM?Q(XW6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/attach.png b/media/img/icons/silk/attach.png new file mode 100755 index 0000000000000000000000000000000000000000..ea897cc9f18ca49aa0f30bad4e6b67e4afc7f498 GIT binary patch literal 391 zcmV;20eJq2P)`oHYyCmI1nr3DC<^9@PyNudrDc9~P$75b!T6T2tv<*K=EzTZ+r6P_ zRz+%oP};s~_x>mm z0pQ)E-O{|Rir?=|;*4Oe!&-;44r3gf)-Iu~;|c?9A1D^Up9`F|I42nWf1;W7*36nQ zf;E<>;mrl})wIO~mSnh(rWZa#2NtdEEaCGAoUuGEYF=CvMF*C~(sQg&{KX2n%}a}8 zOciIa_PHI{);|Uxur%sZTk(iBku+YSk$2)hv%D-q|J4zkv8~S}=sv#n$c;b8Tl>=) z-YmU{U%3OXd?U497niTyWAILy_At!M7x2Apj>MrbEUAGs! z2*LgDY3~W0-&vFXRK&wM!Rq38<&LrY0BYvaiV-PIt`q?gL7d=KY=+X85uHPH9zBu9 z7RL}2PHTd~U4qGM(<>iJyKg2kEiRMk2-UR2{gu0rAcG5XIGqJs1my@XYarq;!Wm6| z;5%{y*&m2<7C?yz`F2(1ES-^c+p9yX-baE5husHL>x|gN$EFoidu&lgFg_;qBqAn^eBg zmrfDE=lozB5#`f+?N@-W=9l=-*J{u77@tgMX{kLa7Z#4ze?Tq%=1F}hk fKwICJqlf+jPqmTX#t3U(00000NkvXXu0mjfGA@$z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_bronze_1.png b/media/img/icons/silk/award_star_bronze_1.png new file mode 100755 index 0000000000000000000000000000000000000000..658c7117bb8c5f7f6127b82725880898c3d7fbb1 GIT binary patch literal 733 zcmV<30wVp1P)5#ZOj$V zV$6R8et`Hsp^Y06t?}x?-BN{Jo+A{GLpF=}{yzmtYh)C=wic&;1MX^#S<^tIK8mw$ z9j5mS;s?n^1>U{8t&EN(863h(*qFLQ=;hn-R;7@>ex(0vvZCi*>q5p75xCt@M#zpM z*Z|q?@X7EteIjT$hYlRP@ApxiZy$PlmbH;D0hOKL_{*WZ;MR^|Dic+L1tK5@y>d4> zXDufE6I)H=Wxil#C-axq0i?$W%}gE53ocb3M9Ce~cq*pr4r68}P%}Rp!|ZI1=W3eKQ{(8&6eg2G=4KE}@YE!+_s=wG z)yj?Wi=|CWjtmfUw}tvT?>o~yi1Cr^9Fogm)I5&s5bN!p#FzaA_^&C@GMJ`fX;)}= z5K#fB0E~v<&l+~pTpQ_Hbc_JlkpsFSk>9$Ch@B!-R)IDix^hJgZHdi`3)**;A=W+} zt0nUFG38I&2bR2ge6xJwHJ&|-TDl&zbzpIUHhXn+ZJGP%0^v7ruA^itSBHu$h4w+w z&L~mIqJj#PGAqhVOEX1tY{nVK(RuHFv=}WVrUQp_xcB^j9L~Ad&|0%#r=L{ogPY3f z4!uHZg;a9h6+#J0a`(`5{}%0Mo*4@oH;YU-0;QA1Qb~kT^YO3Swpc8|wFF=bv<62? zY$@0n33K%OS8VAZ?>YLSi`>qj&9`d&Y*T9wm4vIN9j zkP|P4lYpD0Bjgn4X$;UBv_dZ5O~RdzicMmQDXe%u##|`bv~(aghASFAo&;Q6a|ogD zsQtBmS$G5$4I-kGsOcaoK83aupcO`1Iwk`5hZekp0}sgXR2hFB(%HO16fJ6JWl^G_ z5*Z#x#>1$11U(Z)8yZW5@V|X5iHUle#xE=#VqkOtzh{T*b9=LU>LXg&=(!nmB90QX zxIJ$Cy-!2fx_m+W&lac~ijkew;hG*o3kQS)N`f;V)7&wxjdrA5BLJqiLS`2yQ;)!F zMsWGEk;+2mEGwX)cx!4v<1QcCI3WFN@qTL~^HJkK`pdQ(nZZsha~hGg4x~|$8X(m^ znUU}Fw4NiatLr*KZ{zAnwP$R&Jfo*|RL{EdFGe#L4Mh%X#Cm!=lt?e lJ9R~yy?yVmASqoe`3;e&U@M_8ssaE2002ovPDHLkV1gayPXYh{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_bronze_3.png b/media/img/icons/silk/award_star_bronze_3.png new file mode 100755 index 0000000000000000000000000000000000000000..396e4b3a2583924c56773430b5f2a5de992bb696 GIT binary patch literal 754 zcmVD`bm3d zGTu>FRh`dR#u#|GJA}tuhQSMPp)+>o{OWh73pXD}T${kJM?CzXpH!75YRGK?HI?Gz zo8Fw@!L~jYmlqicA7i=FXk;H0N!9s3d(aspCafT z#S#=yNti3b k7t7WKJKJs|Y|BUf0tz8#4)XPX9{>OV07*qoM6N<$fPbrirq-~0P{ulMSj*I8(*O_yaV*n;RGqTmwM3Zg;V@I^LajC_gJLk|%viB%8v zXb`=WSiKo*!O$dgOXnuF?pAZ*qAgv&dGGaluiN$B-}ley!894P1BY{7&gcABA_Bm( z?~coX7h0LTvWPQ+wGL|?&N_^7JbvF6`Uihvy8k7`2JzP%XD!YNM*kaVR;@LwYK&lw z z6|B8&1-9?(`Rg>qd^(dwc0|)e>Qg*bJIY-(QKo*L!x`K6zku-%b{)C!d!}zH9q?%4 zd;F$7MCu-+Gcv-Nb5}TjDd@X6xc|tl02Q9v78mi_#EItw-ukiU(4npq2e)+{gh-U| z>Q@Y$^uF2Gk$y)cf^&k^rA*VFg{uInGS)aJiT14`AR>qpBFQHpu^rKQL>JJxG`6&W zpm16fF8@imnC)qKMFxD63wm7;40;{Cwf@#_Bn)t29;dTlOQ0N8ckU$WZ^9W(VfqX5 z)7fLh7y?itLSaC)I?M6sgS*?jdtOAs>xj9DxDsMlKzRh;O%wd^3zem^SWo7F{-=k{ z`)chH^Ixi32cO3udSkbW)#FSau_bV2GL!QxU&``8YA>;tPFB*x{C0B0=4UP*Uf)8p zTW+X$&4@0{A_@?PLV;NR8lB|+)LyDDkD)&6Ch^A*&D*zlqU5l@aV0|a^Hs^6DCOgf zK`&h++R%*77O8G*f#+WP?+4y)!gH#59grJph&v(W)pbxf^C7v3iCGky4lN>GQid~*jzV&2Y;Nxe8 b&C!1V<3gG|1vXA400000NkvXXu0mjfBS@ei literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_gold_1.png b/media/img/icons/silk/award_star_gold_1.png new file mode 100755 index 0000000000000000000000000000000000000000..97a22b72eea2e8d65655993c68a9e03f6a40aa9e GIT binary patch literal 753 zcmVPWf;dl@9%f?!cp_eSg3A+l4!Fq^t+ti}&IAe0X@D=QWZj zM%;Z?uCWO_G=wDZ9(j)>jD55+NwV|jvC>tN3^K{^fV>&V*w6!et5~&pa*WZwJy*mn$*RS=E{iBzuX~I|52pZlZsC^BkvS{J~dNA2rd+&Bn zDPttzeo9qHVOn0H7x@0?K2+P{2W3YuKv0gI{t`DZ{% z^)uSl+#vB}3L>aG4!cswJw`5%TN)=W%p(lmIqdQjHn;eWkwjs@obZk>!UG>wB^pj6 zJBPQA@h%5(0Th8rU=r2%$dMnrMsDoxS0p)Oii?!LYWDh=q4NEw(&6(bk$r@sRpbjO zUIP;n<+9A(?2qj-J%=u`3F{W-TmM-l$V z6zWcE#Z*)dyL<*2KpukuZ7vZZD=nXBc*ijUh^IQs>R!T_1d1YTE{iGKO;BD#`7_Tp z-nnR6O6#}%g{8r#E4*kAYY&kBcxtMq4O+!H+m&<9B%$t@BKNE>6je&Y}T$>)>rA=-mG16ocaoM?$_R#KKptL1a;2QYaEZL?ZqH!+`{1Z+cmQ zQ1}3XixLgQQmBz(W@=0D%tV*%@ux?(vz_nL)r+<|qt*=^_D2k+IGc>M2?jCYw+~gHPWej16&S4+k!e$e1 z8c9@6m=~ktaJufDrrfG+$c_;0J)+AXR6rg~4wG9-^p5hyBV-q^eLX8w@MpP7yr zI9b1TYcYNFC1gjDpGL8Q!VH)cpWS8T^zmRH(%bc+_AeM>^BXFW=c(D>`upR9L6DHD zC{{rhL(1sa$1_)@d!GESEwpUYlqoDZ*YYIB z@KEmIZ1sp^{p%0ukJJJYwH*M!esx7LKIulW$P&a@Bxzp10@XKE-7~GSi1H( z@@-F$4UO~wSO2qv5d5>I>G8t&$-Ru98~DgOHgvwPo%gSox^JHNWdP)CrU4o&u6xvM} zE>!43A_c(|D^&=#^_8j(DoK2_jE_hv6Jy4XCZqY^$FGYRnNZ?^!{r{%_q&I4&NY&l zv&~qvd5Z(RR~bC;k(pzXlvwbd5QMWYK{tDPH|x#` z?|dmjqV)3WHS2M)r?Ko39dCYxjXl=-S;5x{1m~G9T9#F%v9YJM{3q7c-eIY3^LBNH zsp1UYzqSJ3^XKq5i_=M(Yo4+?HAJGel}(jrSW=PV^0hI7^F0d+ocpG&d*ttlp36fy z)|dZAvTi$xMeoy`=;zAyQHKA@_1x<1>@H=DB<#gi87XQ|P!t4TTB& zq=+B<$dU8W&pVoi_DKms5Z)Fi>b5_6U?dTrts7H$<8lckp&$}9A3*skWS<~gz)lX~ zi;ob7U@h^p`^5Rj9Yzwx<7P{+^hQmeRwkG4L~)J~KOxvW_#()GNn(;!1ZOD>9wk3G za)LCw%-kXsj+px3Ihk6stsz>m6~*JoO`}jm{yCTkmw!m^)G;4Fqr2sM?Vs1g>W`Hr z&AJ!&`uf7tn;;?0pfCf9F+`02dMs~eXq$uoH-(y=nlhP+ep|>Q11MlHAdfNC6e;g@aPD2@LIrTdYx{lty>00000 LNkvXXu0mjfmic>9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_silver_1.png b/media/img/icons/silk/award_star_silver_1.png new file mode 100755 index 0000000000000000000000000000000000000000..028a54626a0aac09911d57f4fb475098f5a76361 GIT binary patch literal 714 zcmV;*0yX`KP)fArj&{$f(hg~Pe`ob!G6yckK6Kt94NpER>OV46q( zwTmK1MDR|u>fiw2+jr1@{ldr?4i=8Y^YdUCI46;brn5x|u-6D?{1reDs0=nX;Qa7# z{-z|i5};F>PJvxtr+|jr4WpeM7@ADLx?BL`G4|P6su+9mLZTNX2qk_wz?^5yOziHWLHFBXekkbc}G;BKUEEtks` w1RezffuwAYL?TI_&v!4KPQSq&*j~i^1*0~MIoPHs^#A|>07*qoM6N<$f=#+TMF0Q* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_silver_2.png b/media/img/icons/silk/award_star_silver_2.png new file mode 100755 index 0000000000000000000000000000000000000000..e487c3a19e6de398863e819239a594bf033c3547 GIT binary patch literal 734 zcmV<40wMj0P)lhS)MHDPD zN^nu$NDZ3R#lmf9$bw~4(f#`U_MX!ux3B{*@A=OAJkR%@=RJa980fCp+X>@(D2jzf z0h*yh)3v?Oq3S9wxGv$ri$}=bc`tN17W6DtQK1`uz>KKs`d}@Mb?m_ z5l~a%)+B`G%d}UZYJ0Vg(qBL!0TG8Fnye(EVnhxhU+6ij>+NHIku3s^xm+&ZvfXaS?(Qx(lHG8@j>qE@ zrBW%HPN#n`KMo354zw?o%jF6YC#R>Uv)%JlDwU1JVkhV3=I+rOxY*124Ljn86uv6q Qr~m)}07*qoM6N<$g31I`ng9R* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/award_star_silver_3.png b/media/img/icons/silk/award_star_silver_3.png new file mode 100755 index 0000000000000000000000000000000000000000..1d72d47247ceaddb46f918d53ec4444d633912f6 GIT binary patch literal 738 zcmV<80v-K{P)Y)`XtzyIql2{sy6=Hu9+tjql+xOzk)<~?R3&ZZt%=gXAx2x3abu`xKgN6FU ztvTdqR_-fsPsm+$v5g2F{&wVy{xABFA=M z>Tg$mz@w??JKYAiqlT`oE)2OXoN={bDZS1`^p*q*kAjg;*-d@vV*wYO2F~{MptG|R zZl#Q+58tqoDd?Z$cO%UhgO)<#mU{;p6#;L>jklv)NFsR-vjYHa0e}wY9}S8QZ(dwW|Fum-# zX2Z$8|*3m`ciVNwH*EI!K4;uvAKH6fHzx?V&@^We*)X?7dsir9(vp z8s0qC66hg_FvDdP+YZ*QQXq*asiJ^PAt__udR03JSKMNpvg7nRd;*rSO>RS?^_43zGp9!-$Vr8Z;-c)wwgHkS+YjrxEH>PP4=o*Ja%j@-qQ7nuXR|G+z`F#G__zp#^)oN!YNg~y1 z^~|0zhm_4`@5r+3Xt&!}L!nR@MFO-?D2!7|UpJf0T_|9HeV`8KcGd}Kc-Emip&y|t z_#%p8-7t&=E*g!lG#ZU>nBYAEj>EBt4o4jhM;RJ-I-N_<7<3u_xS}Xbk7%04w(w;0 zJ9vZz;{qIPf*|w*bT@RBO#o`l2JF2T=VSmKyFa;k3+QnBw+YIugUjVAvW{-In@tq= zcswQ8$Dl7zB!&WY@O=0src$Xc9HR*Gv(tqJp|8MRP(`o?-T@Vz_k&BxWbzRI>pqdd zgAD|epI0;lNkiCmk4uxq&x&fK#JHU*5m%y`?~DO@!TL22^LGT+1A&?K|( zYdz4JEapD|xm?ahV&zG!d?u55n@*>{uB@z}*A?8Dnwo;o=L7kmHrYQ>EDQ$2$Ii~q zd`nA9Ua3^3nbPLvgs&1Mmc#j=S+0$#6I6p2J&x7#la3=BZ8*W3I0`k+#& zE-|o7CVN*zRSr&1Ph)(1yfhw<7e}MfieNCf-{bKJoKEKsN;uNp-Mv$%)0L~$>fO!F z&E;~ryo4Z-NF+mrIg-ib2Lgbq33;9eRjUbwLa^CvA_9TqI8nP*jyvY+^&9$gxY%}T z{efPLhK7cw0$_M}cqAMSm-_wwVz=8Za5xKu?O?- zc^F2;5E%~Rr1;RY0$^}(P)Go{TrOcC5P-#Esb({iSk-Li8qMj?;hYiS{9~}CObKSiQ5Oj@%7N~b%kV2yzWN_>s$J96xdd!ErX7~R;bKQW|LpL2;YAlw2H{OX6m%2x z9k^~Jj3Ckr9VnQr!KB%;i_&6Q-*(XV^lcB9Pu|&GNonSO7$7c6eYa1wJ=xR_(A>>1`N5p7 zsCYibaSEm3C|Z4d`qoJIKLgO*40(CD#Kb~u;S1PEWOj9F847I;D8ro>?l*53aI{A1 zw@@0=mf-t&P#)*lE?-*hbMX_6_(>;&HVm-K$D;kYD4FDlj`cs$<#J_l7sY6*DV#2{0r?SCzu$9X+Hvz4A#KOj%eOjUg_)^kmHOR* z1`3r%1NNDUgv3N)up5mIjhZ)>YP>$qw8+_m~#CmCO(2yCKyGw00000NkvXXu0mjf DL5fvw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/basket_edit.png b/media/img/icons/silk/basket_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..8138bbdf05086e7f8629fddd2620ef1afc403cb9 GIT binary patch literal 811 zcmV+`1JwM9P)=;R!)R*{6v_K`G+ksyda;zeC!nj>s}-s|U^l!%WrJook$c!=9!O}3 zv>H?DEKFO32*|HtRC0n&3I>BxqFEC}vnIS=?@Uim&vqmdL6g$B>G%7g)9FCupnYBx zTX2_RY0M6+e#Y0am*^Fx#}b`x42Q!Y0PuJ`RG-fWyWQ?{xm?g{wYRKRE4&8kvoGUS zh<&nR!6U*(unphl`Vna1ZIg&9#|8%n(cRsh;&eKbZ8qB(qtSR+qtTER3dR26w(EBm z$1AtCHu|yg;VvSBg_u;bG2E1kM-K`-JNI_G-OB_3L^WzhM+ekub&lC=Mwcq9W-(Zf zt*8&{GYmxMX;_)yV@66@(zn#3prD{^2jFlx+AS7Kie9fzR;g5Exm7*;pR0z_f(2)+xA}nxCH^<8U~sI{=f(L?r-FDwR}&!2q4;MqQ}A1X~-uh|aRH zIiG_i;w0}SS7LQSKJxPNa@lP5EQ7%~`1AQ%TU+DJ&CSWO;Jj#5Vttl| zNT3W;VoJnRoqmqT13T>+UF4@7Gi p$Kzd3(&DbClpb5@$)kJy#_u2g$edtF$hQCh002ovPDHLkV1k`ddgA~9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/basket_error.png b/media/img/icons/silk/basket_error.png new file mode 100755 index 0000000000000000000000000000000000000000..3978b2923ad6c7b4a5dc47ef27f8476f8a707d76 GIT binary patch literal 794 zcmV+#1LgdQP)sl!)1JQyAh{Jt+NLd0LFDr+7@6S2w{R5lYZfG1_t~4R>k90x6E9S7 zX$X7_K$Rek?eFet(@HT{eqG8Wp|g&hS~UZ&*Ly>fqz(+oX0tqo(QGy|Hv8*zTVs_X z5D0*=JOxa`MU>Si*q6hOWG0jOl1`@qF~TBI(&==~DAtUL^E}TpPN#FEzEZ33`~8On z6$gdlt9gT|la2ZAc?CgGi=ueRWHL3Qh>=CoKrk4DL?WTbggqLKwj=IaSXkJMjnAv; zlj|k5UHZbxEl|dXYV_>LA*>Jke7?Mc53I#vnL%JXJpcC6G(J1H<-n zjGQc9WQZ6-0r&Dvv|6oMw4_0DotlKdw+OD`hK`d>O1TS2X71OS$w4NxL--R5&+J39 zr!T*#UA_lMpP$`B)8H_!e#x4RxoCaNEEi|Yjem>%l4acjK=DVE=fyuAA=Ktrvw>RP5<&7h*Ts$HjZ`yyrZ>m-jgw3IO##wdLW` z(o#+$k;wfg0RQ=7U59z*^NUbyP3m1)yUQ#z{4s!-E889O5ZY&<@V!HK;5{Nm3*dMKVciQ>hdP0O4?$8;ivd2n1rGPzZLrz1rvV!DuvA@tHE*8a@HNK?ku| zT$2F{g~E>%nQ}NDk7H_Ts$gPbg5~%7OWbbvKAX+PF`LbK27{q^U|?W(<8aAWv7d)( zeG%@6>)8YXfj}^t-D7fc@)H4oOydTFL0GNU>jLXp@R`zdGkp^ErsHXmrwY!52JNmZ zIH%s5Hql13w6t_&0b^rh<0B&@1x}}vWwBT|CX*?@jVXn9Q3v;eHfyve`q3Y12OaCf zZEFQiJ!XN|%B{=-JRT310KhN|*X43Sr_)_)B>QH}s-OV!@iz3nY(kH}9+J^!=%=Nq zHJ?FYH}!MlIcS>xLBe8bwb~+;O0}oPcm$4kKdiG#(9u3Td-H@qS}`~+L6h|Y3cGT? z@9(6FHvl9okg%XsDj}1}aCMN4i<5$NH}`)5qM)n=Nef1O00000NkvXX Hu0mjfkRfIr literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/basket_put.png b/media/img/icons/silk/basket_put.png new file mode 100755 index 0000000000000000000000000000000000000000..be62faaaab2773a6e951c3b54eec1303214cf4c2 GIT binary patch literal 733 zcmV<30wVp1P)k4ls z?I!B3WVC@<#F`aNER-!jYPQ1Y^<$s!$F}~@D5-FE;K%=co^zga&hzoIN~J=Z*|kUe zD`H8cmBJe3ob|WC?;=|ty?Cj+a{UZ=3Z(t?V;sNiq;AO_1TYM zPddZX*@@zRx3KW}R`+afoaTiIvgn)1YHXwU@^eb98>x5uee1xLyIor*7_=9!tCxmo zGWUdLeuQX7ct)>N$@RwUDYCLW_1nuA{yOaG>FGO)qU-}C%d!TvdpsWYaBN%*+0JNH zf|D+{4AaYaqHv^tZ+#>Z$xD*-Nfbqbepg|kVzb#?Nan)CRgFf&qS5H9jvZ$0iPe#l zrwunLkw_eGv+C-@;qZuFuh$ie#UZED=|Ylr7K_C?7-JuExm*hp2*3@}a5nNvz=7{Y zXfyO1vw!#k)K`T>5Q$z;wq}JHQfXLgiiH zVjvLc+jxmspaum5)2}Pq0E;%@*NsD`QmOQ~`VMOS&Rdz^@7Hh*27}U1CMl+92*+qN P00000NkvXXu0mjfPQ5eU+*>qNCZ^P_vEK24YDO;&<-m{sob!F>yPR`|({-J4jrtym zb5yFCuiu36=jXm0q-};_JA=2{t{u0uQ%li_n(AKh*?$G-9;wrPrdET;9w3i&jQqQr zj#l+p@8$C4wzhC%Z zqu52Y`la^M(hc%c=h@v3p>Swu=&s3R5|YW}^@@rL4}z3&p-^ZK$8jHGu~;zz$Y38> zf^jFy1l;(JK#QQCp)RmyG#Zy=S$<^j`F!E^_4V(l;1e8LU>HXRzaR*c(16)&ehqDg zzJ)ztv)Pz7y4`Np!i$Y}Fo=Q4c^Fs)<m=o#NJYL~O_d2{_ZQE6RdRS=e>s&?%ixKg{_r{LAR*=-`}H~;_u literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bell.png b/media/img/icons/silk/bell.png new file mode 100755 index 0000000000000000000000000000000000000000..6e0015df4f737ded7e7e14b546616e704f023226 GIT binary patch literal 789 zcmV+w1M2*VP)w3Y+732PG_{dW-vWnGW?ek+eegcN?|t9z2?7xGKN@MGRD*J^ z&rlky@ZUE!D5>oxB^64H+e}Jso>dhAcXJ|I^4Pu&0hSi(IWgLX71SJg^}9{IANt4a z6@3vO@*Gyvx&UJ2j;g6eXHOcITv{wUTQS>}4p&n=2Fk;r%w^@S*8a(S*4l9Z?xB2q zbEz@ceIA}S32-WSa5Toip*ae*h-LZ>K#V(y+NX@kSg_V%$^H^^#w5(VjmNa^Al#Zr zxKskTv?tM3%<%;PqbiC^j8kOR6?gv~_-2jxYPk=$UI?e|FeaO0Fjl)4b{QYeM$$#= z33NONUJd|;c@3 zEdc1N;!Mt4u3_FH!uuLNdh0_mSQm{kBBv%A#u5&?pX`FYmIHU&F-*wfPx9%`;Lgug8DbunAt zBaI+kWJ7UF0I#(WUwSj4$>*c9h=G}AiU3$-A0$Ax*`Bq(7C5v$WSb3D;V`_ofN@<0 zyyGH_s4k);Wh-=dcVI!ug{|Qbq&Jv@e+2kN0@9!>-iNlrSST`i(3d5k^wJhQO4^KW zF%1@J6soS$C)Ne{CC_FFV2Y&a z4Co4YFjq&xTp5X`tPqr@&_w?P@T)qFu}N};o>QJmcZySJ(R-Md ToJi+(00000NkvXXu0mjf*@atu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bell_add.png b/media/img/icons/silk/bell_add.png new file mode 100755 index 0000000000000000000000000000000000000000..7db01d627922c6ef45c8cb85020fb230d1f9bcb2 GIT binary patch literal 816 zcmV-01JC@4P)r0JK8p ziZcp8(3p9#IermhN~gTGd#xC^6fa0Bd6~45i+Xr!rFioZZMAX=*zNTYoNo zSQVJ-x`3HCA+X3en6CH7bW11{>5Rd30Lti0sdY+s5#LPJSTt8+PInq#-v;Be<`8Tx z`(Y)yu&Tq+S-@I$07giHO&O=CyRO)J?_+sZhwsKr*tB7=XpUgA$seOtUNB2MVX3E5 zC{Lj+%YDfK7?85nHvM@lO_#$yo(%h7G!}Z#!TKr~BQ-wgf5yRw5&|aip4DqiDNdq3 zg)!j(=qp&0^TwN)H>TtL3s3aac%ZM^52KVUEq>4yvCvhx8|Eq&Y^oC&mjt0Y$xY$_ zbUbu_JWK{*W{3|%T?ELq0BDMjL7m6MM+p}*N^j_knRr|^N|CNH7r>NfClLebD$h=%@R&`Y3>flz&e1}v0LKysfjbUpTVbhVK{ty z7xGlskfY+Qnsb!AjT8JWaiUwgIKdT~JPxw52}BC^B42fVwKKib^_n->NYCS4x0J`a u@JpjzEWDVV_P{vjpLA?W^OPRYXMO`Z^tmZ;1l9Zi00003@?;{2!fhnpdDVjACjRc9&&}_7G!fzd+)6QD z^js-e&7gSabE~uFe+JIvM-+_c8dsFa%V9nCP%1n`ZFBWufExnUQvL%p9uS{|rz9GS zB=!3FwxC?C>qzOkK(&;gR>D#|QwS&aKZYg&_8%qOwV#PcJgvI6HTU@27vKC>pjyg5 zVT6Z2i;vBcNZ*ECKSi+9#%s3_ElPTFnA)FPPXm7ks-=7e_$ZRT{odHfEPaN9effQq zW20OLJrYKI8_Xd_qvq6Z&b%<6pVke&3Vg;>lTT^MiAQiZzQDS&h_Y?`o`b#JCDbqU zn}P&_Wh=D@_>P=RPan#}M~@IVD|pQl=-xKsxpX!xyd4*>=V2x_FicdS*xpgCJ;1Z% zU}!Lnv(sSt+amq_iav=F0^*52YHJpT2!?3rgE!Obba7nyeizW~Yihn(`4!)H85o$N zUWwCe4REQpPWM`msav9$x?;29@%x8Av2x-&5=)J{%lDhF0%#(_;(G_aiDgoUr|vky zm#2ypjy{XM)#itCk(AM4$T#V(k1%u3lZ0}&VlS0Bx3~~oU9P;S?N)i=_<{5BeaRWr z45Qhb7|$iBpR4fsr$r84b-3&3aU!c{q46~&lC;e%Kb99S?!EE8W7Yhbx!mc&#PaNg z&CC3;Fd1+0$2@+uAOdTadTmC3hI^7`n$7^#kr*Hlal`IvegYu)Ek%Lu%lyrJD_ z&L6*!HC#uIc^=OXI}#n(XlWr&!hsCQtw$vWGj$RSg4MP#$JT9~>*(5N&#&*-6OANOx%eB+tcDd0+ph(OOzXSet)ue=n#fRxPKJ!7q4Td0;96nICJD&_1!IjO3|5$ zB?m6qJ0|JPj^WOKMAWJi)R#~rO?G5}x#h+&;9;Orbn?K3RQBnYtlT7BF%S3ddx+;E zzK5AgqM-}%ezvFMqYrZN->*2k%otxsA%lG*M~%!Q2k}?GqPcJtab3bqk4-Ou*)vQk zDnq0+U6BWX8G8DGJ+wPN{OsFCkL?rG-p6duqJhu-)h6q87fEEXA3KI;W|2r(Z^=@p zLD1B~ww^3r>mIkSO_N9nU7BVaVE1;h?4`+#PGRTwuyWHvyat}HGo1$RhFq!L`k65F z>Fyq7{+3N`shc}8&i3)+G+Q8Ie$oM+J6S$aE8V+xclHZ*?tYS> z-Dcvo1MJ!NI;-mz1BEwXbC#J47fEMaq9}$_7)f>jfEP|x_O4XdO21tFlDt!(R$fHK zCp)|stFMiCRZt{<8WT42~V9+p44CDi|?-{ImoJvRNYc z_%M+doc!kO*b~N9Yn(YhF+cvs#i5va2MyPNzyFxTQVvTuuT#2w_R^MH2t7YJ`|*^k rqKHUbBZ;dBDypdXDyoQ}s)K(4xVc{-Vpqm500000NkvXXu0mjfWm$>@ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bell_go.png b/media/img/icons/silk/bell_go.png new file mode 100755 index 0000000000000000000000000000000000000000..b89bb343458ea62488d810fd38a052c6a0572b30 GIT binary patch literal 836 zcmV-K1H1f*P)Yz&dqT~oxC<;gIOR^S%DIiX_Scdk}vgKP!L@}D(FJ>QuL4&2|W}( z1Vs^zWETnXMvxi>si`B5la80k%W*t&&OT@Fwt_;DMf+txto41Yz1Cg=V+{Xu`h8v> zQCXQ3(tSn82CHKJ3B2^WDBuzWj8eu<8AZ#!B%=d?AA|cB<9`+S8@=}-U@y~PBb1pf zCc7Byn_{4l)IMat;ah%nGRC*N{eAKxG+Pl#6B;5Ff`7 z7sJ4G21%xLMW89{o-?n|ZA~eMuJnV1?m{H9U_`}SSOSTtAW?!^vmFtQ;C!r(*$5q9 z5fF*x$0s_WM82c9!-u#yidbewJP%rJu?UPwFz~+;HLA#PuE*JtE>vi&b6FtD^Ryw< z^97owA|W9c!5%9@;|aK}#pCLvfCqLPYAw8Z_B`aL6(KX(i-+!LWyuYPc~KxN{=}AB zo_32nX?yP0ax~TXPTPsK_n%npu_(Toq=W=)l|pQ6pBy! zcf7ss=~I+f>)hUaga*gJgG=ymnD>Qh&?o`X3FZ_Dg_*^eCkx_-q1Ldt{Fc%hzjtD2 z`gvrg7X#gGTo8rEN0VyJLYg%jZkvaX)&!R&9bF@BXd7&uTu`xD_>9nsz6z^tMQy zJJHemUXnn!aJX-!iL0IZ6WIn;VKs!{_|5d7OJSl=IGs@P;?7*la?VfOO=or#Hn2Yc O0000JYm9`uEdlL{An(2adpq%j49-vJ2@kpJ&w0~X z3{(g04JcXAl?1l_6F>%;(hO3o>(VB1=WP!5Z-oJ&@XM4`W zJzj|)E)zV~Ygl;~2d6$1j+SURI^toH2ipDskiny*-Y!`(urb?+?S&WcSh!g2=isaP z0^A*^;WD0rt2-HkRSd5WFl{85WN?YR>z;c=3h$Z)-|eMv4_t!N%*J9{G-m30Wu6VnZYn z6|&jvLo}tYDrjJ+Ari}z5)|KLL#0x|;c&oix1+bW7u636p;ibnX&a+^{r&y4hsWbp z`d*={JZQ338Uaa>7}k*ylu5IY%1ePzD1=(AMsaa5UGq}7$jHbrQILXyf;GQCka;C^ zs#Gqc0dI;}NQ{q#*=&Z@YDHgPA9Ok$;yLU+KA(S(0?6g^Ek8h5SXgdO_N@&Ha7UPo zgai(fl9G^?mPU)Jr?}raY9_4?qyaf!NsCa4whoB`YiITV7t?R(_snS9ar!M}D2<$rt79lD%ze cjq*_5UuZ|Dxxf{wWB>pF07*qoM6N<$f_V&p-v9sr literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bin.png b/media/img/icons/silk/bin.png new file mode 100755 index 0000000000000000000000000000000000000000..ebad933c8b3729a9b27dc34c5a111600b8d46fdb GIT binary patch literal 476 zcmV<20VDp2P)!P6q=I0_iwCeRuEs-nY*ui2wlBo{da&-rimXk_dpOx8l9Y2eXq^TiLre{gv0N zh@vQpp3E(_zQv8WAB*@mevb>S`MD?sAf3NIKIx==eZ#Jr9#7|~0H2e>)YKJ;10yn{ zb~SBXr^1(^@_cc&7(P~SnNU?q95~@CRVtL1isxZE)U%{&!=XelB6GnODxd1btErjO zj_6poZCs)d1RVpU;qKVX8HX|rHyyQURHCLW%8}-eFWR-IYhR*iQ-E&#nFI_$K^_5DwQb0QR_*>mIH#Cqd99N2l)Z|DPKCCbQ(9lp- zvu47Wa~kew3p-R8Jp8%booy=RR$@JQDF}+Z*eRMM5iCB+Uxaqp3-6bf0D%9C#5QQ<|d}62BjvZR2H60wE-&n>*?YcA|c6o&|A+rkb&Vsas2(@ zRZChzd<-rL%s+C)K`AUj&@4exERnTGr7g|ufjFlYo2X-lQc?WBS5|%h$H~-pP=>{CWcO1^&sC zas{(rHNEeVX?R|+D*2koKAT-1TVxuXF7Gt2pCrhe%W27Qah0e`>%4W-qEi^2ys8L$ zkzFy>C52%M!-~#H9Xt(|Evme3 znsTM3@O9jy7lMk63GZ(u8Hac+{l2Nv{)WYyc2KzeV81veQkLz}aZs=_c)I$ztaD0e F0sv?9ij)8V literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bin_empty.png b/media/img/icons/silk/bin_empty.png new file mode 100755 index 0000000000000000000000000000000000000000..375b8bf6a09803b8fcee625fc5f38a949b5a1439 GIT binary patch literal 475 zcmV<10VMv3P)rCP_(<-a*jb_Hyre&wGyNNooK906+!+3lsI|p?tm?Ex#0xHV4K10Z9#DVK`pc ze*7w-lmAYiqVQ^K;s*qy{gNXl3K__@vT?o(V&K zcsjVVE#qaQIuQ57;gih|+H#dz(D2^m2pQGkc(XiPHv7qxcY;izAvom~vS-bB@7UaK zL)NX}h(uIcx2`~1o@>ob`KK>8W8A9k5@R}Q0cp50?UzkmTM})nYN>`oEg%iMGT-&} z_59V;^#>H9fVBA5b5zGCT|Ep8R4PHGL|Q!gtm(MZas<&1m0H7?fb{C)mF3rRxlv=@ zIH+Z>+^mjrjf~>_+vV_K8L+b&88i{a`h`7P#Ww_cAT-3>7iG?d zKQ=FfJTtdc)9<~|e5oamr>PvpaLsiMK% z)`3JKfz0M{+kjr+tJMf=)!zW)RDC`lVzC%#5o2Rx@Or(N z+pwWr_G0Cy#KMLfiChPqPN$_Y0QGvkUkCxe-;Z!O3?8>yEmSHM!)YC#@*XrA4QQHX z0BF760&r5HP@qa>L#*q%0boI`Rx<$XRMi0R97hX46Bz=Guz(YJks&PLZ=UBdyUk`p zsZ`>ej0K>|afib(q9}^d4OeFfM;4ipp)QvTJ3Bi(j$5}tCq9+UX8HLVTi_P?ApdRO zZnqn4=W;oEbYjW^%*@QBNDxgXlO=9ZRaFCIR%heN3`nQbC8{1JXzH(jfvvZ<_c95_ zgTY{*$Kx^fYu?80?k<*>m$`D3z?1*|Or`|_fk8U72%SNQDjC;Ho*|D@?i7hr`}2PR X#`)v2r!)w#00000NkvXXu0mjfQIK%^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book.png b/media/img/icons/silk/book.png new file mode 100755 index 0000000000000000000000000000000000000000..b0f4dd7928cc5714e002fd2a6e8f2faac0073f00 GIT binary patch literal 593 zcmV-X0l6k>CGhc0FIuigU9U^L+D`6bSr zIEp(+L4eIgaZT(|{B!*DbrTYc1t0J9*MLJm+n zOEVloE20S^g6s|1rvjjuW1W$TV;&TbK2|slm=91)Q{X{Kg;c!Saglq7xo8`(>{A}G zw@`8gScq(adr(4@;>^%e<~7+uNMv&?8L0#%0yj~@DW&fPImKeyFHkRKuNERO3(SOB z?S)niZbFEN`0<|w+LjBKR#DU7F3d&rQGGY&Y)Fv0w002i=Jm_>x9jBX>wg3XCKK`E f>xbvJ_5i;DeEQXvyE?}U00000NkvXXu0mjfKqCEw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_add.png b/media/img/icons/silk/book_add.png new file mode 100755 index 0000000000000000000000000000000000000000..e2f084727408f27356022964c059b02017988b05 GIT binary patch literal 714 zcmV;*0yX`KP)>I+w#Eg*+A?cQ*gTsOTO&elT=?-PprnusH^iNrUAVMeNReFOLbFcMel&QL3~P_-NYJIZZM z$*ztjRyCBdoPe6gbXRyJOBUy07*qoM6N<$f)d9;DgXcg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_addresses.png b/media/img/icons/silk/book_addresses.png new file mode 100755 index 0000000000000000000000000000000000000000..b73419ba82098bbdca1989d31fa798756c987524 GIT binary patch literal 770 zcmV+d1O5DoP)LHt}U(fC{;>Yum{xmD^Y@B5nN0h99fKm3?`0_{sl~q#>Lf`Xq^mk zkPrtoHo*|Z3nt2x}Jy`Dy+VWv$$5Q(e+JC7mM8^t0(iL(m}3r?Oq>CBlk z+U+S25g-Hs)ayudKxvr*V(ri6%46oq;@1yc0P zA3d#Jwv=Vd%^Q~uhdUw?5#qmljMYF15n(hM*?Rc9vGHS$KYP}#o8KGsA85A5J$?L5 z*MC`7uV)9h3*UUa-*A}z_>9dmBBYe0l)#gR7WI4g9iBg>J=3wbH*kCHJ4ZXOSYQ27 zDru6(55yX)S@&n6~krBum)TC;$e8swaf zMkA1;lB^Q1DT^mw z_wd1AvaF1rQ^f`GXt>pMc(a6@v#P4V>fhgb;ib1-`{@%;>^~y%NUa>Var+02W?K%X zYERjjxIaDC&rwE%l#-mYDhz}(!NW^0=wBZMH5C_+RAIVF!K23~z}<>ANUn_?}3M|H~;_u07*qoM6N<$f@;M1& literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_delete.png b/media/img/icons/silk/book_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..d9a6340d723dc9b47169f3470c503ae0514c840e GIT binary patch literal 719 zcmV;=0x=?)~1m0FJ8hb!d!Yu0W+yAtWhc z*}ae_E)-c*SA)6F0RT)5(LjlN(j#U@j*&Uo8i!f8Sj^uk+*2o^bAxTO*OM%hKM2Jh&W@l4NSi2qVCCAlJZX` zf$_0Cn&-##49Ml!zH<{EMW{NWj#cyMmJ_^t)kS0dJmP$T@nKe*hK>*g-q220wjnJ98}m)EabiEnKG)?OAx~Z6__u- zVj)yS6Ro_77yvtqg*D!%oomRiETS<1QHiTcTzy$%hRmV_J9dA|I{;Ld6g!%^b#IKh zx!0%&08&+!164spaZYg}SWy-N!{w`k?*k~# z2@}&5Qht&k2ryxUl{jyyBauu|NDp(e`xokVbuxUmN4;QjUv&nE6Rb0YVaT3s?Xmn= z9jeNmyM1g+KWB0A8*;5%m@lno^yj`4H3h~A&RDGTxiI(_p|Mz}I4iWI|6tFiG7Y&M z%#Qy}%8U4*VFlR_^SK(pS|KuqNI?BGUNQ;3vO4vEy&Gp~T-!r9b%|8QV`69&6GShA zh5x#%L&R8z4J@H?SSJ`KtmHmlca+Gr^%6|}grBk`v&{svBZ&1s?>gH5*sm#Yf(Z?w zaRkP(ql@^{3+~fO!2DTpU9|G{-Zoxz`ps{k7FY?b=-ti^T z^FHcQN?2)T>h^tp82OB``E>0W{i#(7v{#if0`DuhzOg%h>5b$bt6{W$4Tw8RQ z7g6@TMv4s+ISM*J;iEG=x^#@kcYY(C-%NRCikr!UWHL)p#t@OG?O^3)fwPCHG3Skh|?C7Z~pX@)~r^*3ES@GmJTU(dWwV{QH rsGh5(PUcLu_A^ng|9SQ51*2b9!67)iy>GqcMEC5#P* zVFs9y6`M&Fk9XyF_s^Z^0?3gy95h(oU+9Rwek)@(Jp>s{F@^E+FQ%NKmRrJ~$N;dZ zztA3S8EB`YwI9m}sA;xUv+XTSb=1}7*tp{mvjCXQ>+kF2=F>NnN|Tr>06MM03{zu# zVv@wA{2PBP5anue^sMNld(nJEz)Vp!L<~_Ss4-d^N|?B&1tzY4r4;sZfq&fj~5 z^MN2nED771uduXd3#H;C%<{7U@iZU=CH0cGQ=aLOHwhq#oj?vyY zUI_p`2q6hLFC;-oypWeK^fF3Aa}zRgjkbY(Y;Ai@Ra{AdDBk%D;05o6f<2_IZ#N{* z89R4@`lczC)qiAlo2zWWrx_p($^t2}a#2LXyh+r(15@PZ6S_7ZV^^WX*s1jmGXOOs z4MK1M=atl_td`p}b*w@sUtl`L&~PuBex|mz$l%6df=iFix&skIQo(tl+mF)QGe}*- zcP#vXsETJ-i-4j@k(Onhi1UXZjI1ckJR@<;nsozM6fyMaE-i)A5WgpGYyph5`*+T` zuF5Z^YwPia#p@#{rvZ0v-55QP{XAo6d6~y&_F!t5>Z}@Rkk}+e6*F7>8&yNBiO-YD QcK`qY07*qoM6N<$g5Ksv>;M1& literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_go.png b/media/img/icons/silk/book_go.png new file mode 100755 index 0000000000000000000000000000000000000000..cd4e1964c4fc6288ffe2a52bdb8279b38f4694e2 GIT binary patch literal 745 zcmVmRp;U2rehpEP*hRW`OfcGbt-Xp_8t4T*WE8WOyF#D z9CyH-V)EHx8i{%B{osXDs{u+B2M#;@S?%dgK7Oj<-b{i5X1Kv*?Hkj%V_sUtOcVgv zS?%dc{_g9d`;RJK5HPo*suk6jE}qZ)wi4U-AK@ne?n|n@E4lgfEfW(B+zbF~s&L26 znVf2n<$<{|V}Yd9T4LRXm8|WopbGAWnWO5c8Dh?K7P)j~;CBE=)fo9WMQd6n%Q9jf z5G(eD7E0w-Iu^{s+AZ#%iNfS8S&qrg`>Zu-5laS}D!75JLeFb21I68zZ0J5KRz^M2$@4U)k8T zgL-VFkKYe{E;Sn_h$6X=M%8P7)_@ZjChry%T^y#rN8 zgBBLdXn4-~hi3^E$Rx0)qlc}l_wZz7h&wL^HBZ^*MH_f b^BKPbr%B>ylaEW500000NkvXXu0mjfu(4I; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_key.png b/media/img/icons/silk/book_key.png new file mode 100755 index 0000000000000000000000000000000000000000..d8e23ec9329a160181b5dd14079e95d769e681ff GIT binary patch literal 779 zcmV+m1N8ifP)JNR5;6R zlTA!qRTRg6@6BT%D1r!D5(}0f7+??^@jDV1BqUmldz&sajk_i;>)xf?E={XR8-;~U zTChZ*#`+PPnvkG?B9K6gb;1k-Grarmz2~@iGbqYQZccJ@@9+Ho=bjs=Diaqz9#GZK z6$&UXDT*qfN}BX=iMLp@yMFu12i*V>>4EbKPv!bMgZqE&qFTEIDNIm-;%=D(qliYQ zs74BaS9AR*gV%;m(%F$iQv#xrR+Y4RdrKpY4G}ND`5s3As6Lz<=wkZrZxjj@R0II2 zsZd2lDV8e4CgI;vwLlPMBc2@WqUW(zya!c5MDbqnA~;bFV#{Zf3&#Nz?}g3#C9+{1 zaU5e!f|GRLks+$f()K_-qIwJf5HC1yF~;!Lb3Lj2R2{0y<@sND;$V`C&#p3ADg0l7 z^@6t!=R-bS_!(mz&MV#tj({OI&ohH1n)~19#3LVZ@5A2l(-&7~4gt;yiM1pG8rBok z)j_C8AoRxbjPfsp$*d@79`#bsiTxjP*D#STEJAbcVmul6xIr zS)!rsabmwk$LMgQD;F;PqreN+Sd8_l9j_!+$e*qiTi77Xx@76B~49=xNSlyLfC}bgym~1@zP4^d{i5l#Ce=?7%Ny2`rHqUMBniA zD`RMKi@@)(c=LdyP$Uq`)<)^=vsc%r4twCe;uD`*5aEU9pBNrJLz2Hl6g9IrmoU5c z248PRkTT2n_t&YFV58fe*<5d*O+HQosR$j002ov JPDHLkV1g02XZ-*G literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_link.png b/media/img/icons/silk/book_link.png new file mode 100755 index 0000000000000000000000000000000000000000..dd0820e86d0ae7484a9d1fea509ce168ad44699a GIT binary patch literal 789 zcmV+w1M2*VP)Ibg27S@bI=*bsb;IgkCPuV5Vkc|%HT6t6!`B9|*t zHpjbmR#Y%cB>BZ6G~K|TYq0zotNP0+pjRo1^k6y zQ(zK-ZCXSU!1IwY=-xjmu$Tf4f+)hU{HAV5V3E@>O&HWaHz0u%1Ry{!z_DJC&*o_V zmjEy=8pfOy7Z^<;&>NY@@?}se=09I0f1Ga6p zG?rs_c2-+00f7M84&%w5U zF$P?S$NA+oaJ9O6Q0&X}iyNdtz%UGZB(nkoV~cB?a3#4vc;;xhAxr%76YzLEP+hO? z?&=*KAO<-*-2YJsNtsLr645Ah?T~_PZC=>bAwxEs1zuLUTn1HDfe;f*X#rxIfMnHN zCkx2!77hx9g01U1<+RIcy&ye$%m2*Tg(5LgBW?-F5D%H?w4^?K`MF2rr8R>tbKv2HLCJnr;&f?m);TU^d+FTbf$I2?vz zu_%a}F76$EB-+Qz3WY+@p6JIiy|6tv*_UrkzroC_NREjv$g&J>w;TL^zkno3;B-10 z1jS4szAx;Z4ITI~jtNz zZhT67I+aW`o%x}m4?^&tT}aQ)3kRJY0g-8BG}Y8W4bg1z9Q?8S!u?m3O8F!oWuISO k(%#-l{_i$Awz|&00Xevia);hrMF0Q*07*qoM6N<$f^aM`9RL6T literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/book_open.png b/media/img/icons/silk/book_open.png new file mode 100755 index 0000000000000000000000000000000000000000..7d863f949741ff83fd8373a77c0d95a3d95e441f GIT binary patch literal 622 zcmV-!0+IcRP)YeaZ-G+53gSTz{SPWVdFiPaPX+$~@n)fi9>qgJ zh4fN-QcEhq^wI<|vImjml9)pF*W2zl+qWbTPaSyKyqWKt`DS)j3xa?yVgf%ewhl|m zA$_0x^Rx4E@d&=>uRoSN*Cm&aL#`7&zr0;L(pKMn1G#$ZszFkMC^?B8f`0w&-UD$u zd-(?iK6#!;xZ`>J^A9DGiTfguewDOKwDEKoL}`ZE_M}0=xvsgf$usmJeV$oo28d0#yu!pdgpag$giC zhlKP!CMX3wsPMGgZ5n>Xg+hV--ENofAcH61#0B7Hvl-7Il}g2A6;lfG`FxbX8A>p$ z0P;GW4il9Mr9jO9)xB^Rgy%*CSTdQ6D;kDDnM{U{5Q21FA4#ZM71$_Dba8z<-Y_Na zS@|v#c0PZNDux9AoXD-ZoWP~q)7QrC`Gr3gZ6sTvbKG`S=Qf*6}Nf4;Z7Z{zN!O--ANbYb~sXZM@=W_MPrR;$>|(APVL z9?v<)29FSdeXBlhS+G{-_{fQm(s$|pt3F04wDk%Eai0K>nDfCMZg4J%Tm>-+#q|66 z8(eUXMZynJwbm5eoE>%wcnw@1t#WGynhm$k?XL&soFn!ri`4f$cVy<%2mLsExU->z zZx*xss|zVtj$|^aY{nS+ySuS>yS}Tnbt?kCHpJucS_vZi7oW4eS02jdvmho#X{ij; zASmWb3g!Cg&?GXM48q|syk4&gstfW5ufx~d(b5UV8T>6lg%x6ea*97xpv5pT@eDFq zp-_Nnno3HNxizp%!hp9l*G6j*sWM<7rm?Hgq>7h^v`h)1B=y2@X=W?ZT z$YtMx?9VKI<#P?vWl4;(2C}r%>Gaw&UVVOfffyvn3OyrEa&l~WX&F&m?+<#OqiY~^j9wuSWM=zzA_@B9}<+jo_mWWEvr O0000i3lOYrtSl@<#7b-w zf}j{s!5HvocfT|9z82@(O@vrwU^wRt=bd>tXQpGD!`Kvuv@XEI8~tgUP2L`{+*)U@I@ zrVtr5X14??iAF(=0+k>q)v`Scm$9&=i`*knBsnaUVL1>ti*O1xfzmiD$%Md-h*6M( z@*iB)icu3eU424Ok{kp%Y!1dvp%f0`ac9vcupx^$vU0xuKpJcBvej0UYk%)EV>mIx2hV}QRf#LX^Uh(%`7hZ~|KEf#uQ31s002ovPDHLkV1hgQ{`mj^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/brick.png b/media/img/icons/silk/brick.png new file mode 100755 index 0000000000000000000000000000000000000000..7851cf34c946e5667221e3478668503eb1cd733f GIT binary patch literal 452 zcmV;#0XzPQP)Pdwe5?6tW?r-ok|b$oDQj8FV%kZPq;(MWOV8?8;<)(iP}>hNMU> z7fbz%jjlr7h8uuoQ~J6}n}@Y@PdTk=)PxO{%7zmL?dchpZX*~n;I{!C>*(8cU;q(~ zAS%Po_@naEU!xidrBXD?;hN|x^%W|Ij)0y*r5vi|?W&Fub(NqJ@z0o=O5P)$DtCMgZgg9MW%rA`w{qe=RC&!sIosTV%x&Y5$*@4M&R5da8Mgu~%CZnwK` zGMSDDw5Qlvxg&vldQFc=`4&GHz1 zqa4aTal{E2d+%?xN~Hpa!-4hnbq>4T&SMfsJx<_sI*km-<#Jq+5R1j&@p!Pjyv#v+ zijkXszmH5N1FBhET(k&GslU0oiDWW~R4T<4NnN^593>J7ghC+%0s-iBy1u~diQR4& zJ3Bkr-rh#3R02C6wzjrT9nn4#iJ(v@z~}REq|<3=wOUcI*=(F(e}5l)dwZx>tK4op z9zX2?sZtZEFc=JSkXwyLBT@r7fhdaD-Q7j2)k3{q=c;tHXf(7dbQ@Zxg0jAF6KM@h+4sC6jtTy+RLI zIeishH}wCE^>ao^1fxHPUa!B*=4)mnI-uq<2Oz|6c+rSn>=*hio4|XDI#$RoWYMPX?k900000 LNkvXXu0mjfahOHG literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/brick_delete.png b/media/img/icons/silk/brick_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..3a8c373482e071726fcf2e8967eb3c762b224cbe GIT binary patch literal 745 zcmVk(*8wLyDN6qc8lhZhzWexdK7n$>DOH&Eb@W1hKn8Q^d@kW41g?RL@Wbg;d>&1>|H z_R!v=L|lNWxBqtA-QC5~(h_2^7>CVfq3AG<**(V(o?;pYD#p|9T1vg`zE3EEYGZ7mG!H z3=*MUPy!O*&Ws$JzJ?#pH|Ql-(faThp{Xl)KQ;bEU}HMXF2|(VY|c=3_xAQstJQcj zNr2+J?w!YXM#j5wVCD=kJBr$?>u}u~${$}zlgTt}G#X#B*&b|eZgLS4qXw?sl%p51 z|1;Ku7bEOAL%kFKf?lt`%;sxhBkIxJ@OV786E00000NkvXXu0mjf_hDCw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/brick_edit.png b/media/img/icons/silk/brick_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..eb06df3bb3e38de2faf51d80a05e8254d13fb18e GIT binary patch literal 775 zcmV+i1Ni)jP)^9OfoSNCh6N{UH*G>^7ov@7G7j2))Sp-vPxR_~|#}oBaGXXEK?XK|Y^H zHk(B1f~_(T2#W< zvaL<2kX^Wk+SW9-V%M=b+k-`2ClPnyl}cXV$lX>%QAD9oKqix6;&?ocXf%qjM~iIW z4r(PA#H9|DR@zYr^SQ^mz+r?4uyTP%4!Uj$G3|@^f^JjEqDb4hL3OR}pcKA@uPUsqI85-ih+cW#mYc zi0T}yV>}fm2znF>#s1x2Qlrr{snu#3KhP}(-}k}y;R(|2Hi+?dY|h`tqN){Y<$y?p zaw0sq=UXrho&gF8gkM~M(ASI^Qdy9lgzj1YCn7%n-^X;n>!?(5DN%7hg_ zql4Wy8ok7Z25lz}lpb~*ktPRPq%ZQ*4qNZB!+VJ-egn1}Am_E)CmFH^{)}n~c zK%gbmsn_!1fEEZw6+o5S1JRT2pT}L{dCN-wn+1Y@JEnE)< zgQ(SNU~FK;u)4a6P$;y=E9MQXRx28f2FE&`PLxWeD7KYm7P(xG6eL6jzFa62ZpC7;FUe$*GgI4yjV!E^2Ak_Q^sTS#j*M|* z9><68Ld(BsZ2T;YumYEaZ4biXu$#^Au(;hF@H?HwXYiiB0NI>?t``3GQZPe0*pFgX zL?ID=aCT&2RA_xnV`F2dJo<-lu=~V7`$>hd&M~Pf7NQyShk77L4nVnx_fPJx8M=O6 z*zYyYJsK?ZUYqbqVjf1bOg-AQD?(BND5jJ6{Bks6!ak$9rOJzsLz{-qdQFDzgt3#s cjW*i<0Fgc1D3~yzp{gHSP{di*#8D&?(h#;bi2r7yUe@M_9Z^R^1th67Ma+}U=ey(q{ z%~>)Q;cRVlbJ5&n%2W)U;$S+(K9zyBt*3JiDKhoI1BdsV_j#W8ea|5PNIG0D*E5U7 z66xyd`pdxfEVk3#Z2_~{oMA8+{vd6!m|m|xvLnHN#V}P%QJ}ZC7h_{%NTpIpCX*N) z9py20#_q7Y8;&>uWnbT_HZwDW?(S{`gFz0H$;4x6j@CIrPfw4Q0-;cdD>8V!URbSG z=yW;`wr4TsCXq;BWMl*^N3B-t2~|o=OiaM<_ahJpa7Ct`zBU{U4GqERbi!`8L#0wB z2(>4zt*v2UVF6Q9Q<$Ef2CWa1larf{*nVJO0ORB1u-R-J!^6X9Z*P}~(P-oZD=RBl zUS7uR>@2tI^Z7P=z*NiL=b=!07GJ;F;BYv&+qSkgi8YWDNRou5r6t5-F+?H}uF6Vt zyWL!|xHA_|Ew^z?c?$jZJ}#hCDkVZ^`#Thr?l%iM7ujJ_6Bn65+CbO^3N2U=TO*NG^KHr9~2xj9}2BVoNL)#c(-Kn}D29Z&q=YesW_ z1q5#+N<j%go#9EE}){AAsopP$F#;vyc>dRg+DzH&5tDMkI~BGgzO zpw?OprK=8iJM(bj2}y1~Nv&3!q0wmS>1=;_JRaOpord8@GsN$&Aq+M`<9R_z9zo%% zMUi*~S=A(Vw36g(`wJZ%9oclg;tfR>uC^RQep3c6y*z+>+KZ4oYfzw*A+wr94_A^i zJAS4O&<@KK3WZ%Rm%C}Ru4UKliQgCUky%9|H2LJNzi~HE%kkq?dvUOmWNnTA1HB~u UMVP_&o&W#<07*qoM6N<$f>=0SnE(I) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/brick_link.png b/media/img/icons/silk/brick_link.png new file mode 100755 index 0000000000000000000000000000000000000000..9ebf013a23a56653655a736a7e149deb7365ea03 GIT binary patch literal 764 zcmV&SR3v>A``^efOSo-hEdApp;^Jd;9y!%1UfzX6Bh- z%-mbG|0Na{7Ruai_Y+DEb1s+b!*9k%Q!whMxjtZKA*?o;i1g&jy0@( zaU=-@d-h+o%gal6JRXEXA&L3`d2 z%jIxzZ~*p9O-;EJp_Ds0If38rM<5W8ic~K>FOK&2_p!CLg^i63OioVb6k$)zWHLx3 z5;!|M!}<9+#QSi1dRlbEcxPt^;cysUuU8@%3}RwpLRIGG<|IKnoyP6$Eh3SKw7a*r zSDXP=IYc&YZf;7@?fCe($^l9ORaJ3wbAx0uiC8QqRr$2t-Cfy8%XCI3B%pxJW>XdM zw~zPt_s}#A@pxQ5Ly)4szaMtH9lgE1SXx@b+S(fW`ub$fYPE8J7#bSNDzme*Ub07{ zQKV8SjEs!%0@v5ql8ggm!@$6Rbi^E8vBqpRM-}l+@5OSMrl+TWj*gC^qoV@>u{fQb zov5v?g~?>X@bEC&+uLPaQ&Ypn-y~^mZA}+f(&2EFH8eE%dU|@ENpN*_1-)L6_4Rc* zFuq@`IjX9vp1QiaK9ZojyZhnQURP99d=u;%37VRkpwsD4U0sd3x;hEQB&e^i|3QN0 z=H|Os1fRqaw!?#igLmS4HE!G3*ce(`TF}wd|HNMlZ|>D)M67h? zOIjz3DJbk0=97q(mSBd~-ilc0Oupt^z$#N6O&at_s8u-PL@9M^gQuq(+UH^IB$&*DHP!HzH+vkEzC?S52tN1$mKhziPkOR=y$ zhl#aO1Xly_M?EkN>tM6E5T&Ht4dh{0oQr6Q1b3J=sM^ACOsvD=TSP81#0oTC1v|Df zgpp-GhL(KrE_8t&(jeFR1W%(osQ12tvSpHp_}~HR_8G{VUO;FILQv(P-b)es=)ZlJM#c>{Wx-rgY3D#Ol9rJl39A<60Xo5cneo(9g5a4q>ayzV-7%Ue2}0_ z&TIets{Cl`n(nefrZ+9F8|N&Kp}^StU2b+&pVj;XvgEdBL3Wlp00000NkvXXu0mjf DwZ3{L literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/briefcase.png b/media/img/icons/silk/briefcase.png new file mode 100755 index 0000000000000000000000000000000000000000..05c564912953467ae888192196aeca2f6db0a406 GIT binary patch literal 793 zcmV+!1LpjRP)wCLzo!u5vjB%3bO!v(<`_0eVUfez^@RtZWvFJys zmGdnDZpkw!t9(+21YEn-ihl~B1qBIC$}CuB14>X1 zU~*Un>6SGZ3Y^8*Q&uVSbD7}5T-49a>2vqn$7#MU@h6((L#!%+= zz%VT|T?$}o@{26(rTuQtd|!BWdNe#6g6~WN^yIoCkxFeKNq#aJCqJG$+l06391?5G z7z>TBP=XG7ma%A``8El+=7!znQNd|bAZ=Jk8A7QPMip0;lwx{5q%cngmVeuX$bNi! zqrCTYUHx_Eeh+kB0G;YJRksPqvt2K8IKWmHFg!IfMBoOAQ&Z@^bIi5NVcR<~{)uxg zY|Ik&{88-~C*A1W?HJn{l#TYlO?I~A&~eSM?)n~-RV0se6$@AD0E_GXV`XdVUHN0T~Y^HSDgA^X!&oW$jpM5h9)mbXmSy~HD zw(w^mE;n9P!K0&YL?RJfsH;OT7({E!J;dI5QDC=imt=c(^T;}l=)l&CLvanNo7&*_ z`=M!?3Q8mr7#tkL(Cg>WG9ie(_q)AF`O?+Z)u!uu3$ZvUnUEhN9WYI^y}!Rdoge!L XLaEPO;P?1x00000NkvXXu0mjfUe98= literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bug.png b/media/img/icons/silk/bug.png new file mode 100755 index 0000000000000000000000000000000000000000..2d5fb90ec6ee08f53947e0266a87b03f75893446 GIT binary patch literal 774 zcmV+h1Nr=kP) zlgUq0Q544c8(ae&UR$8ps&snq6^bPY3v3xAmMW74Di$h~GCH6E3TaYs2#6A<7K*gC z777H71_Wa;(dfp+g-drPCSWu)#PInZi72LJ;o?i~$-U=y&UbQ89Dul3%3P+Axkzc* zbH-y;QF=hR{qLItf%ci2_&e5wNo0gnVatG?ul6Zw=o$I9Ljfn*ic3`U?>IfEim3g{ zujU&$-hy6wn;w(xme|zJm;lWJxtTFfM)q0`kX!Vu0+d${$}LCddK1<^htTe-fUYL3 zB`SdNsZD>RgvLj1<^@h6_+cDRK2Brcr2~>%$*5S)hyV33PV^teac3%|4lz@8p4?)5 z?t5o^?q+%^%)Yygo~I^U4VR!bTnWuE35hcWrfCDR3q+sxJ79e7Fg`&)RCqLA^2^y^ z0laVfadW90_Fz8Brm|r47sB^u1VgI>kanj)Z4`zMSfHlm8>CwXa$JVM`$2RrmZB-3 zN10m-!;BvH*Br3V8t`DH7m`jf#2upVDXl{5ff18_pzCPK1Zu$$CKKvd8FGeFf)+K<|x33pc7P&S#3GZT4mEw;nr(Ze*F z3&*?-4U-lm*#tber5 z%S_ceqB`b3ko6r~BbvDwdohTvP(3a(pq{x#T$yQsu#OKwEe}KuH^Mh@nxg_(Nw136 zq#a^3xNBke)In+!?qk3%4wB69{pF`Tzg`07*qoM6N<$ Eg55P&8UO$Q literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bug_add.png b/media/img/icons/silk/bug_add.png new file mode 100755 index 0000000000000000000000000000000000000000..ced78174740958c5e11583682dac645197c09e78 GIT binary patch literal 806 zcmV+>1KIqEP)`=&gfiynuLKNZXG^E&{Pmo=c@q3lv(pO2HUs^S=b~RK*#7&0iej;CY0$=&!}s zlPnn>f-S)ydndO_sP#!8nj+R?CkfAP%XVTzFwO9TP1xb;uc#KsVI@l}Q45e-dhki*R$I z2-9muy!q^gVO|BPfeBvOF`d^nvNfldX*DM?__P--&T^EHL~V~MQP7!$$#>nDeBT4g zbPGxt7D_0BtwZmh)yP<8H860+R0_4Z46G^!QX3=jcx?dt&Gptu5gh%A!qs$BNJZe! zpi8Gf>I6~l|Lc}p0gYR}o2;3W`|jYN2NngaMkxJ}tqVn$`{Hh8DpL5+419Tj?8J72 k;<$%Q*reM26FaHB-E4&O1t4_>`E~n3&`B&r=tE$5)r`S6ZK!@$4#rInBo9QPYpNc{st)6*$_vbLI@z_C zSR{3BXeV`A19V(;ytsw3Aqk31@hC8*Ku}MBq4I>JO^o1Z+S?5Vq|Q}RCwLFoT7iz3 zKW&JH?s*lina@IQh(c1U5D8r|=$vjq-B>l4rJmp?xEZ%d;I{cp5*ikWW)}1>Yf;>v z2$?<-Ntz&t+aqyzyd3flG4734fKf~bT}fN=EO3)<@qlP#SrR&9p&pSUw@ZY?79rxa zCvj)26w=lhq&9_-04mTGG>KIe`^(6|AoZvD_iUbT(t{@o}nj%QdnpkBqzIJEG}nEv_4LaGnGzdzg#fm;?Ah z7NbT4DE0#tPWXHy5JSO~_y4?qW)XdysifnQCKGaPHkf(zb=uaM9&8@pN)BQ~NVRVJ ziM-@Ajl0x&&Gmv4NS)|DvG36p%j5+3oflZQ*>*VN!O+9#d&< zYo8QOm{;z_yR{l;}?JZ=-4>sE5JZmeq?fn90A$P1xW-&(q O0000{*+c^G!iQ-|(6%~LCN zA@Y!iBF(UtNGXJ#^nk?NWwKXJ&2s67_xAd{w%2Q~yc~D9jDi0}CJUZQwS#(;Yq$^K=%m$}|b|DLo2FO9X^c3YQci2rS?u zyuuA3MgEA&(tkZW6u-3e?k=VtilH35gP#*!7%T}^5nj&k8cmWIlP=lzD0`HFh;m1y z)Cc2yX+||%ZhL~ zB+&>;()&0&7=sm6Hx@_zp?d3s`4_Pmm)U%JA~|BZw#2^;)U#8xwQ6U;juxkr+cDJ_ z^+)Un)ucDRKaay`uI>D*bW8K~7SslGE=A1JSj0Hmkm!Z(B@KzY+=m*^F0Uv%p&A$A z$6H^_ttJ`CwNnnKQ~Ng5sM%}bDIL*JLoA*(X5oF0Cl<$jFw-B6*HXdfVF|_f=MFT9 zsx&)begeaC546Yb#^Y;_=twaCFp$bN+Vqe#iNql0@=~`HOFh}>Nfw|gaL+<>j0x+% zpGlMOq_tEj{s))aQXQ9DCAJ-PQO1n_iPiH94U>E_m{*tA00000NkvXXu0mjf-H(&g literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bug_error.png b/media/img/icons/silk/bug_error.png new file mode 100755 index 0000000000000000000000000000000000000000..c4e8c28096ae0acb84b63a7b51ed824b8d3fc62d GIT binary patch literal 841 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 N002ovPDHLkV1oK8Ta5q! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/building_error.png b/media/img/icons/silk/building_error.png new file mode 100755 index 0000000000000000000000000000000000000000..a342eefc68fc3afc61b30ceaec06c47d306904f0 GIT binary patch literal 653 zcmV;80&@L{P)@1)Y*u3o>2#VzB0*hU9nol%SS;q-oY_-I%jI%JA`t)z!KzAc zZ!fA!JRUDnPy{f>05Cqk@iMDm1w;jFp|9QGy6*o0p68*e96h+Qt&tGg9bjUq5>dg( zhJs2vO}!l>*l`8Nadrj(9IMUzyV*ME(qls59 z5P`}p;(i7d?4NfupT5qT>)n~W+a1UQt|hJpvA!4kORE@LdXCr}EfpULg^wWF8C2Hk zI@gMLU)j4iMY!Wa{ddpY$^)#i1Fq-kLVBLHtTNyvw+H}2qkS)f` z?(TK-0aaaIq*5uh)?$odX*R}?$z(_*5=0^qVzC&Vot=TDJ*6u(-}i||qX4XgRh9Pk zc2t#kJie-eRe&)DfOq4?n^^@bASzf3mkt?R*WDQKJP%dnXx;p}jfCp00m<}ELU zPO|5~w(4>&YX>5N5swQkU04;YSOn!qc9z2pr^$JR;K=uZ?2-Gy@G>AG2ZLoLq_SVw zqY)hAVO5y%Dy!j5`ZXegV;qb% z)Q0v^7urvKRg|)l3U=?<%jj%^p>K)#yvOlU0BdZIHKG%_@xXR3L_Gb9ym5Fo+>0k3 zj&X_Av~VhVkxw&&^iTF{ZDs4&(B09oBJjNYAwU4gV;N_X2py}Q>qFrQfnWtgUxzs6 zb_Bw6wddD-rp+RHFR*B(q_QA3`s;yCE#?0MOlp8%R|7kz00000NkvXXu0mjfed04y literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/building_key.png b/media/img/icons/silk/building_key.png new file mode 100755 index 0000000000000000000000000000000000000000..8b79e30ed9ecc6b675b5a097e75c2bdbfa6d1e56 GIT binary patch literal 705 zcmV;y0zUnTP)Hq$Cs}SPFq*^i6iInN3M=Jz}^!yqE;r7tu#N~*Zc9^0GN z)|7EeL=ux=FeqAUlu~SuN-4tOFe4))`2BvWs;X#dX|cBVcz0^?c$`2W0KiUIL}+eq zMno7I8cM1l2~bJ_@G-P?GA*DD7%^xK=W7*?Y!022)Mhwbq zRiHE&qd9B$a6D^_neNBe54BG`NeKYdmoDzgu7AHGGi!m`%ePtl+VyDcLG^rH=k&WI zz;PTzgio^tXc3eFqoHK=H4R1M?5{aP^zR^PIW+}&<<85&TYX5HA!YIzD@|k6B(_-rI|qroOg#&2 zPKMTQcmX;_ZsuCX`fwn#km0#Ot`@ganK_3)`h)VObBOyMOD{7%u!gmoe_a-@EGXXBXtR n#g?NR)6?O**LtS=Q?2_41-p0PftuMh00000NkvXXu0mjfc@aOR literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/building_link.png b/media/img/icons/silk/building_link.png new file mode 100755 index 0000000000000000000000000000000000000000..a340629ac968cd8dbcfd651458fe48339c2d199b GIT binary patch literal 668 zcmV;N0%QG&P)6&op&*3N9K@Tao`hUlY4MOlS^~C*LXTc87OyG2#h-Pn~377JF}e`F+?!If#D5r-~8V9-rIp;7+7Yv!eL{Pe+5gf zkNf)z{U%PCt!lMu5JI5qI%bydPN#!XsRWP5gFqmFSS)6m-7#OLO(qlg{eE%24Cd!( zG%9R9pPy4O2jJQG`toyH8DR`U0cudD2zc~B$7nRV8ZaJ@MV6gA{}wh9xV;?Uq$!K6 zI-M%eS$0Yd>}~7NH0^o-U%T$^72}kzSHM5=z_0a9R=*(>P%`a>!4y1sIJsWIIXS~{ zID~XsM5EDw!{I=;-9{u5fz4*a@$n}y%5*yYS5cI=l}hFP1>nue;XSiW!g;PI#+gVY zFc=KbY&KCS6kxa8`TSuvo6%~uk?M5gR z66b6-3$>+U!(sjQ^5E4D13VXi*QFP?Ow{yQtBh{xlQWf}c`U;L3r zAC5q_N1Hr`sgeYM=;V;-)abAEOzNp30JUE=t_qn<23D(8_;^WRja~bG^DcG))(1_z zg=8{m%mRA79>U=;yk0LX77N;}iM3h{k|e?B^TFkEVWS#V)Nf_e!_hJz!RGI-NOYZ?JI_RaHAI;og7fL3{3ZGN}as0000C#5QQ<|d}62BjvZR2H60wE-$B_jGX#(Kw&{<9vg>5sw;c`@i>p z_kaC=>wowE^MCGt=k0FV8~^>E{g3+d|7HJ+|I4@QcRd)^xi$V8^Vx_G`+r6+RSGlL znKt8REw4uuU$^wNG<`ek&pG#xJ(Hh0`*ZlR^+%Epor$llpY=cF-^u@z|Ed2wufXdW aBfwxkOHd_T*GCNK1O`u6KbLh*2~7Ys?Or1Q literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_arrow_down.png b/media/img/icons/silk/bullet_arrow_down.png new file mode 100755 index 0000000000000000000000000000000000000000..9b23c06d7b4f4689dc8c9fd4e9d4d1f199fe376f GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%M_H=O!(Kw&{<9vg>5sxM-`@i?U z_W%6<>VNmY^FQu?=k0EK8(;qS{{MRQfQxhfe|^4DBSLrMi_=~IrT?G*6aRH>fZ%Fr xHSdzT`JeW`iC!n;=N{%MvhUm!=_W-^hCUIl<$=usRzPbQJYD@<);T3K0RSKzPZ9tC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_arrow_top.png b/media/img/icons/silk/bullet_arrow_top.png new file mode 100755 index 0000000000000000000000000000000000000000..0ce86d2b2bc8eb047ca749fff00716b15c5bd9a8 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%s@N{tu(Kvs0!a}YF0}=J!QSUY7M7z;-RJ$7n8*6-IkwdUVS%nn(+HZ=IM>KhySVgJojLZytKsQlJks9 zg>q@PUpbdv;&|+P!{NQ{65)mBh3B(*yP58!PISKz-O48F^~6K0e}RJHfr*NaZ|Z(M akrr=d7xdAvd!`9=1B0ilpUXO@geCyB6I2-h literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_arrow_up.png b/media/img/icons/silk/bullet_arrow_up.png new file mode 100755 index 0000000000000000000000000000000000000000..24df0f42129c291ddb3dd50c8ba2884dc23a2c43 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%M_H=O!(Kw&{<9vg>5sxM7Y}K&+ zaVqV>2dg?$?}z`N|7UG5-|D8TLf!k;{Mi5T|C#@x_qjwjYRvdu`ttwR|Kb1QzwCco x|Ef}l>({^Sf7bts|6%{R{?h*$`OZ2jjF;IsFRaMi76-J3!PC{xWt~$(698OLQAz*+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_black.png b/media/img/icons/silk/bullet_black.png new file mode 100755 index 0000000000000000000000000000000000000000..57619706d10d9736b1849a83f2c5694fbe09c53b GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h^>lFz(Kw&{<9vg>5sw~gS5O!4 zr|{HuUFIBKiQyL}eBJ-L{`UVT|6_O~L{G%N{Wbre{kQtZ_0LvEhDX@>Vt8IAj)#jg!+?Z23wnf7d! zNAH#A4i6V)y_WtvZQ1hT)TAWgjoY{t%BOsI;8VOzQvNniDZk5xCy$)UQWb1PRjRoz l1#moJy|?3|{zvx%+XakOf%ava&w)pvdYw!Pm*LM8> zx}xa+>1^FUyPR2ai85fP3-jG?K+XRr`TqZ3F8Kd{o8tf1T@L?&;`fL$0Oag{XV?8l z2Jh=7{)5DcbAc=K<1cfQ|NjSS`ccO4{~ZuN%wYZx6n{dL0f)n-8cwFD{(e@j`2STU z>;JncjQ{ugvi#ZM%3MW!EQHHe0ByVvjfKa!G>;}_2nGNF&fymKM6jp;0000iurf=~3UFXxqI7+S%~yN; z&QFMWB8?geDax2;<5v0zO%9O+HCOhCe@lCtqI|U`n(Bw>E`n0X60GiU=_L{j`ZeTrWl7@6TVgmzQ|3 z5;Op46VsoczbZwwqJ7S==^_3_&=Ox0MY;dOCY;|ap-3z08F!}8RFQf3;+NC07*qoM6N<$g0j}hYXATM literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_feed.png b/media/img/icons/silk/bullet_feed.png new file mode 100755 index 0000000000000000000000000000000000000000..1a0e0f18f8bf7b2c5bcac354aa09be0ebab3f284 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>J@N{tuu{fRlV-?hn1vRw7=~`H|6d*}wJTwx9NUJ^A-PC{g+mZ-(ezrYk@A zSA66PNIvzSX`%9eCjvLPn~<&zkcB#E_)bRoqqqjuJxZi%ZEMd z&v*NvhWGUx|LY&|dWg;8xl+M&hVS8ire(E1*YzxOk&ZD2*!*kie8d0ob9Fh%G9Y=r;n&8^QUAkdX#Dq|D$hyKfc&Ml|8p0c z|4m?!%b@Oan%jHPb>P21W3>NYd-<1_&1WU%JGUHShzcVz!>-In&hVRPdDrmgA!XB=w& zAG5&bziK_hADjk6&({3E^3;U?OHcIvUwEwR|Gc9eKtr;M1&07*qoM6N<$ Ef*qF6bpQYW literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_green.png b/media/img/icons/silk/bullet_green.png new file mode 100755 index 0000000000000000000000000000000000000000..058ad261f520490be9d3fc2e322392fdedfd1cbd GIT binary patch literal 295 zcmV+?0oeYDP)ef43{&%10 z`rmr0`TyJtv;LcOX%laN^>UMjsi!CYUwmcZ|JfI2{-1ED=f8fLD)C;hoM$LyF)D9~S@raHZk@o8xu=?=BAbx-CyJk|+c2F0@|%^WDn-Kc3b7|M6nh z{|^`I{(pPa@c-rv`wv7JaBHSX+n2kY|Gz!R`v3h=@&9l4pV{WeA)K@>rLPPXC_&Fo|~u=OHx8Q*=y2zb-wG%)4f&?mZqzQ e4THQu3lFzu{izqk|8%^q0F(5@h6w@ zuSbE=i9QOwKvPc#-iPCap~BwXFHIr_gU^WCH%x0(Cm8h3e{9o}5`YUO%{ zPiLR-*D%CfK42<(c~V-?1q(}8{p2N#A`c~!wa4X-$LfsZ0%WH-1^Zy?%r3<3e~Rbycg=S_Egdz d?>~Yc*m~Z+JF!m3&mHJ+22WQ%mvv4FO#s^$Z2kZM literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_picture.png b/media/img/icons/silk/bullet_picture.png new file mode 100755 index 0000000000000000000000000000000000000000..386cb302f16b36e4ae67dc9f0aea1b4a051c22c6 GIT binary patch literal 470 zcmV;{0V)28P)``2`~zsHhc-<7$F60BN8G$;h9Qc)$m zPjaF(rLGTDO~!4K5|M!ls#FRA{~+9_mh$B%Z0UrmNw|v!8R{*)VvIsyE!@@WjQ0Lu zG45gF&|%`^8m{Z2fQS@JKovnbzF5W>!$F>t_qCIs%wUXRcKm?<7uRk6jy>0U{$XW$ zkEc3qYB0utYFr3Nl5}@-_vnko8F3szAXJEHK*aJ;t?e|ae*4Gt7rT9)_)n@C%m4rY M07*qoM6N<$f~O_aVE_OC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_pink.png b/media/img/icons/silk/bullet_pink.png new file mode 100755 index 0000000000000000000000000000000000000000..0c9f73e3f58fec93410ca240016ef0522241aebe GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=8@N{tuu{izqk~P;M2a(o?Ym~XI z^0KETC^sqCab0$O!=k-0z-7w?M;1Xr?oLLkMCemR4UW__o=Snfs{&byph%e z=77^@l_n}qHB|c9pq{s5_I-v&H_y*pYjU~LY5(eqL#|WUf--*EUEAAGxHvbtb|TLazB;OXk;vd$@?2>?vIZ1eyC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_purple.png b/media/img/icons/silk/bullet_purple.png new file mode 100755 index 0000000000000000000000000000000000000000..52ba5036b95383f6c14176ae33300b859e4d27d8 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>p@N{tuu{izq(ta+-M44kBpIe=q zx`X8@9}gS%(w5FYFVig+ojZ_cD5YzW==f41NB?BP0gvSsuL~|cX5(?+BsuSEuz#(i z(0!iz2et`~ZLD6*`-~P&eW1fC)8o%D^YrBE+t1g1f3V_>QFkv3+p8U`|6X{$=uzRE zYb8;$Jas}77I1~H-7TjsdDijKvCOxpB#s?yRPsxju2(W^mhtCPasN(mSRK@VvcWVc q!c)dr)HS~K;xqxD$MKK)8^oXLysE8u-|YeP1B0ilpUXO@geCyg%6BgS literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_red.png b/media/img/icons/silk/bullet_red.png new file mode 100755 index 0000000000000000000000000000000000000000..0cd803115831933aa171497cfe9c1af983035f86 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=8^mK6yu{izqk}mh50EX6wkMFui zZg|fh<-*g%H9O|;u|DY#DW^u;K&o-|vHe`x?xbw1zYx$2><(A#;6QU!sSfhO( ioL~suuJh6Vfb_?jd)=>7iZy|bXYh3Ob6Mw<&;$Tq>~Ep~ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_star.png b/media/img/icons/silk/bullet_star.png new file mode 100755 index 0000000000000000000000000000000000000000..fab774a3288143c3ca5ef4a6354476a816d20b29 GIT binary patch literal 331 zcmV-R0kr;!P)clpQjpWPb8b##8}RLd@5ygx>`#(pz>k}$oIkF|*aK~E`Efn%|Bp+N z|GyqlYyW&e-v0A$8BQV$NSgWcM%Moyw~GJ&deHs<=iR3N-_Hg9|8m&q|L5&8GYK1T zJ%$-*`^F!)N`MCR01asV|LsD^f1vFfKW>v|CMpboe%Jke!RPC#5QQ<|d}62BjvZR2H60wE-$h^mK6y(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz1H+_;eX)`ni0%X8XBDc-`=Ph(Uan2 zYsR{H!kvIN--9isvHznRsC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{<9vg>(S^W+6Zii9 z|Nhthr~iNb*Z!}6uiN$Dz5neG3a-`baBX8yz4q@v|B?28{s)#N@CGn3@%_y|zAV9T z66e<&B4?b6oF&azg|C(V&1ZbI_D}pL`}(^FT2yXwG1Ph~$Q@h8mJYOz!PC{xWt~$( F699+YQR)By literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_white.png b/media/img/icons/silk/bullet_white.png new file mode 100755 index 0000000000000000000000000000000000000000..a9af8d44bf3c001adc41e3774f526bd1d1448b1f GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%M_H=O!(Kvthf+1gnf`Cilxr3SC zCq+y2HhAz(;&}R`x^q^&(wiOs&2u-u^*?dO$=Q}CfYva0y85}Sb4q9e0M-pfO8@`> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/bullet_wrench.png b/media/img/icons/silk/bullet_wrench.png new file mode 100755 index 0000000000000000000000000000000000000000..67817e6e5a785b0a1f35598671f5d96f433298f1 GIT binary patch literal 448 zcmV;x0YCnUP)7VG(pVO&BhbRxxA@I^akcY^KxeXPXwzY<`A1LBLBqoDFV3>hv=E-l& zLuDq)&@>DpLa1JUfu)4d;axw6$9paSuD`@Jb3oHHkE*I&S(Zn!SWK7-&@^p9QIt-r z)dC>|k|brO0%TcUvn&ga<3JR}p&$rGBofg%jys$Ph(@Ds(=<`9*TM7rZ8#i$D-;R{ zg+iad0+J-niK2K}tyVz@L8VdwAq1sT2`tNYe+2k!o8mH!QPL>Fwr%8cIq15Mcsve< zVLE=l-!m5AjJ7wBe*DUo`|u?iI8L1*7z`RL%Wl#%?WQPder$c_6~(fb3t z9fO=s)r1xNys<0toy$Ta)Ef4L9Xj#;LuHACPs?SaC)p1!HoK`$|DN0S(B^2t{U;k3 z{z`Gkym)-$S?qyE;12cK15evqWFMuk`FjMfG>*N*A!+l(#* jF-_{7+4G}*QQ$ohjSunXc9>@Z9nawD>gTe~DWM4f1nGD{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cake.png b/media/img/icons/silk/cake.png new file mode 100755 index 0000000000000000000000000000000000000000..4ef151aeef90cba37e483fff6db393e3f3c215a0 GIT binary patch literal 676 zcmV;V0$crwP)zhG}s4?zzVdkG3gj2<%zA*q!$2x>uX%NDCytJWaYrPXj4 zU1!!qgC^xq+`MO3-MxA@QLjVPPv?85H*G=(KHPIYzrN>QxF!Im4#IxZ@krPd?&kid z_ZSiplU6Pr0XN$E74*}446)Vy(5l0Tt?p~}o7mB#KX>@D#~Be*<>IiI~I2tp#x z12i!dI9uRn_jAuUmOh`s_#3O#Q@}+t$Jn&L2-mkQOn%5i(=-?p`Lj?c!2VW(AbHes1cgEB@zPzW^m!s{<8 zH^}g>l=Q%z`79itWZZZq>1T&4kE_!Ru7HeXVR6SO2noJcy-wyON8U|XUoeAf zHk*)T8OiUqhEc#)EX_nb3VMysq8mBfIar@DEC@xNQ&ko5*l*<1J}BWse+#xk2O71^ zZKRS>{bS{FIWTbz8yidq6)TE@^|cgAnWrExWsHLC$l+FDW*C*!T_{XINt{JZ95tYc z_p#09P!;b%OW8qQ$`}Pj@4<%r;2b2&DJYXe*!EsR<%dl-6KGEyY2+ae zQs4@dsSC*31|bfe!20Q-oXHShTsI61&!<8X5%II3+V+8k*E-I+hzUk`L)aOtuD0000< KMNUMnLSTY|9xOrt literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calculator.png b/media/img/icons/silk/calculator.png new file mode 100755 index 0000000000000000000000000000000000000000..701a60a5a4d5673d0e3dd3fc8f316a2ebdd7fad9 GIT binary patch literal 543 zcmV+)0^t3LP)@VozFAzEvI&~0#LAwY>5FK39Rg@@bp>BeO zw$McyP2NlT?u|(Uk#_LH<=ljK?mhP;k2#J5heX6H%H{HXCX=~NBoZlARe>=^i32c& z5WqPH!!SOV%jHw0Qn@9fcc5CW>Jq=4|6^OL)m9$QSCC95(-PFn^7EgPn-5p9Xf%2j zT0v11s^jrE9G#rvGccKoT*Is1-&Wq)um?di)g6Ha$O`*a;Q$Laz(Aw!N@+sNvdAvNPK8Qq^wr_gSuSaWLG&M-o9;vBq+hGMlxGxKZ0_1Wz znv69PFh5E+M2titU>*W4;JO)kE$QxbPq19@+D+v)+U|OcH05hn- z^9BftDEsz1&z7-itp~p6;XLO&pY!G6%mJ8_$z&S0+uaEUg9wMi zh(scYMx&J3p4I(+KO7FnP@zzmSkG_KVzb!_V*ZBHGE)W)qD@1Djh;ybvT`|Cqe%}M^Wu8PdaGPVM$wTbzq|{0}G7TcW!EaA!?fWL5dnF z2D1#A%gQ1{g%n-+HK!)Dlhy}{SMT#sR?}5CT<^_$KhO1hFK%8Q0G>o5QQGbHy4UN4 z-|t5t5I`^(q@BEzx!diA)oSg?WHKG`{1kndOr{LiH}UWKW;UBQh5$~dv&;3qNOBK< z6Dck!h5#fUsZ-Y;K)kqu^Qu)$YLd8c>lvnXFEC?xNzX_*9FAdt%jFsXCOPxeHuELp zFTfqg-O+$vuZLo>h+A49r%wOWlrp#YD^1Eo?) zL9N-#D4jluZnryn2R0iWqF%3~TCHMjZ4ISTiKfZra#Wd2hTget8v!s|Ec7rG3PG#Y zqE@TXG#ZVD!hAj-R4NrsU^ZKZ0Y;;d0$QyWn$0E}jRs9aK$S`b<#HJryByEY9z^Wu z7^36+8mIXIK&#bJKqL}@!C;_}a5xOTUQa<$W(IF&597;275Zqho@L z6tK9oL;;;nhpOFf57H3D&j|6EGeai==5_;&5FOuzq!RQ3MdquSQhNU0$7%aMdZXDe6pPbIMdfFJbdI- zo#K;Stn+@~=uTRl*mol(KG5Bm6XL_wF}xG+!V{68w>-|5{uhAg>BRnd?u%s-o9lIA aCiCwjy#9~3ed^Z$00005{JVI0Q&7rJd-bKnj|5%n4Y6@5>kN(HX=3gQZxSrZA^D5`8Z{esFV$a=C&4Y&IK|N+p5V^n66#)oqx|kqlhGx5);u zsv>-l96t2NFEmRe1Q3hGh}cmhru%PZV>^(XtHf%s42#($e$7cdlnQdcQ79CqhaHY} zyWNhyM|@1ZpfK^W6`$NCSeYwDeEb%?>QfjQ=vx#MNy1E(6}NLiqLca7_c-C zw*4#yshx1P6=Oh9fCs{Q+!ZvgX5YGU0KZFcF+ZJhDUou^;chBKPt~sF{`&m~w!YgI xP*SiXDXQ3;es!-nZI>P$eqOh4_jYDZKLCCG2jOQ#mq`Es002ovPDHLkV1gc3OCJCL literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calculator_error.png b/media/img/icons/silk/calculator_error.png new file mode 100755 index 0000000000000000000000000000000000000000..0bc4288a47268f2dc44b7ece051373f6be4d8e02 GIT binary patch literal 731 zcmV<10wn#3P)Mg|`>;I-sPfu@FiJ7-B z5|_*6qaY1OALCy(e|OAov)Q`p_c(zliX0sd2iiOxEQUZ`q}Qmfe}3P@ZZ4V#n3SqX zy9GjBu_){nSP+^Cn6XCPzUJeo>pE{*1$DkheC<4swzh#ltQNEGXEGTqEG)oow_|;M z9f?GOU#mC$1U)}ypq92_nr5>CLMofVU=V>ofS=6POa;;Zpfo7p;PDas{`LZ9qkxJ6 zgBU!JWf}2!oGVycTf^ewB3cz0o~{tux(2cR`6Zkv>_b3LWEKjA5Dtg=b(n%Hm(Ih; zC*bb%fc%<=w|^W*TRtH3@S?4ez#u$WSy@3W7USJtU6t|a)qQmKjR0jCso6Ok@F-{} zIT&SaxPd^^wVHxRB*F>K_BwH@+Y5I`38wmmzMlzFOylH*C=6A-mAZG%U2CGQX-0Bs zNunrJ=7PYJpT+6WWtgR9TB~4av=64XiB?w@hX=;`Hh zI*t6hI1cp;!Rao*GPdaBOL+Y(OEXQFtyZQ1XqF;uNpo*7jv`sfxNoIST{2!@t*;BJ-ko6&RX1Gnf{r!El>X(K%C+p|)lFLAvS4UDUb| z(NtO&f_mYYleP&VL@lBi!?ADAIn?^$ssrbJ&U>D7KJWKA4{slUKC{{EU07IXClU#) zt*s%IN+F$2^GffOUtV5DEEan|K0Y3zo*&MSxw*NjSP$`kJB~ym?|J}>i;G>co+`{w z@h>M6O3?!#d1Tk_KZDkn$4&n$=mRAf9+Y7Wy~gc_Z+MR^9*_3|mX?;z0D94U>yPF; z;h%uV@h9g4PEJm+v$KOnqk&qjhDxP^t*tGTN+lEu1>|zMzbp8jfE)UsaB!e?Vdk_`FT#F-EL!le;>QMyJ$9>tfpSCvsbHCu6ZYZ@@6KJ zK``~9pS5{dQ#!r?FjI-L&o_V&2h=ku{#kH>>@xy%X(Lb>Vb z>5rqMqxU2d$t4B^gP}78CX0%K+cZ3cd$aUdYMf{m^v_~~m`weDl+&_@K%&-6e002ovPDHLk FV1i#7Nd^D_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calendar.png b/media/img/icons/silk/calendar.png new file mode 100755 index 0000000000000000000000000000000000000000..658913852d60fc6ca8557568d26b8e93e7d56525 GIT binary patch literal 675 zcmV;U0$lxxP)w!? zFisFv!T|cmRtW;1f$>$s0G>^*GP-h`H-mzTP&3`b(d;hDCL-{+T2LSiJi1S%34OTG znWn~v^Brk?FQB#MFuosf?qnt!t(A%g#tAAA`tV{p&t%~)6GMus628BV?|aP6=Lr0O zrxPn=6Fy3{fE84gngF`mQ;ZG4p#ul`mYb)mJw@Q%q_eddamvg>kv)yI#B0M!3sxev z!1s9dp#Z>KE{BK5@W%p1Kt!2cEYj2vBiUHDJ-HCTS{r%b!`Wj=!r&Tb+LFBfRN!=5 zl7aC&Ul)Foh{s4J>JU)^p9+C-Q44MR8(8|WK})8dx#e}T%`v`wFOp3_q9I1QsXihN zJVaEgK9Y|1KAJgEb`m$%VXVVh!8pM>`_Eli`}OBJfVb0i{tF{QT8%v&>u>-7002ov JPDHLkV1feuD8K*! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calendar_add.png b/media/img/icons/silk/calendar_add.png new file mode 100755 index 0000000000000000000000000000000000000000..17679db6bdaa6771296fb016d21b0fdfc79e48b2 GIT binary patch literal 723 zcmV;^0xbQBP)5ETnpqPAn6zU<&FIp9Il1xF$N9eryjdy0$g_1Iflt9aIG62{ zJh%k%4xHmhLo?3#;voiuIS4Atz|yRg7EJQs@{lI*wgUi{`ac_PABetl_Z_I|3#8?`eD|ed6f0%TQcqH8_?!MPbDcMaNaP9 zID)f}I*Fo?b1j|35nOoE$%C)^xO?7^8AZ<;nKNMoiOUGW!7B)eqks)d%85f*Ut3O5 z2y1J~34@4P(`OKd5v!{!vZqb$PX^8#GKfRC{H%*7-3NGlMMxrkzLPKvXnpw>efz<- zL+i*V2}yntup}dJsUeA?2-Z}W0WfXy6oMdN)xt6+rt=t6;#s+T8Fd@$sj8kz$=Hk3 zZm&ETLN;{(Q5bOJWj6qApFR-~(46b$`TH|e&0c^HJqyOKzz2@nc}oH6k;Ja!@6_`> zujX8rB$7<5R4{TFutjs$=EoolyOHUV|OXy7|=wB>Mn!!NA5kcv+BTC4y7002ovPDHLk FV1h%aQKkR@ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calendar_delete.png b/media/img/icons/silk/calendar_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..69a3b10ad106f0c1603e5016097973b248988c05 GIT binary patch literal 742 zcmVObCawiW7N$cdk%fiWKxW)*|jDAeXeGGH=bv+%Yb0At;_2hK@Oz=OUd zs6-?p5s4eiKq3J^HYb3p(tNXDf2NI|X&Y2k)pL&rR8{r-lc>JX5!F{Zqn!Mn)@{e0 ztExr>#tEWI7{JAjA%ei?Qs)q109T(4(LQ*HM^^+DA=cHzg0d-OO+?_2wV*&4cx9KC{J4yRV93}AK&+g zwcMfM)k|8NPohPoEGb+E)aL}OpsK_IXs9iwqXp(vRMOr1iH6!@@}8DaG~C6!t$UeV zwUG4d+e~k3<<9EZE+3+)0|2J%w4g8ypIp?PHkaI_hqUo z3Q-OHH!`*J78Nt{34<6TNlVY5uZkS^{&t<)HSgBt&-pBVMkBEhC;4*D*}UiZ-t)bNi10tl2Ds4Bw_k+q zN_0qTjnd$0jZzw=1yAWwrBI%rw0?AC^W3lvphb3dpFZx^Nsl-4-_nbkW% z1e6C_f$RF`R1(}2BwcV_2KUzEx@ycQfnPodp@_pEqiw)f(B2w8H6A_Us z&HlZrB_@NPYb08~NBTNzMFt}BwX;fEPOOdD0It$#5o`;pTjE%j$<+sOYzt~y<0KNh z7|JeY%G?rqyI$fLDY7R_Cu{1=iRl&uuq}fP;Q%$Q3D$>$)IN^0y5JQQfsh6SZd0{|4;Lu{NrgNbv>7>S(4%y3Ed7tnpb16j6@?@kB+6a1+I zuuOxxjvjLQKCoEE5iDLuDprBz2+96@x*OVH)ky*c3)4Sm19+b2dtkzhfjV+0&&HD= z(PyWa9CR4z&7-IFCFZJ=1akAyTChxh6S&H6VZqESIvOjOzkCN{J~r~Yriu1jy*$73 z6r;U$IB>~PU6BqP~898YX3J=*#1Z=w1DX^nQc3%5aJ00000NkvXX Hu0mjfn=oBS literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calendar_link.png b/media/img/icons/silk/calendar_link.png new file mode 100755 index 0000000000000000000000000000000000000000..6b106b9429aaf978ef93ef331a3a58ede07d677c GIT binary patch literal 795 zcmV+$1LXXPP))y9?D}-jUWvgMWybY$46!FOgIME@ZA%%FuOX7|428g%rR1ovp z*vgiRA}dotRFqhtz4&&XgOmBP_2T=S-|zc;f1h*Cvpq=wlKw~ZG2jX*`<1C7(`&`tbA{n!tvE#FW*>_g>)FHj747mfgZ&YfT+`Un4_TfNJ% zBY^4E7ByiO0RuvyHy1G706MaOw#z^xA86nK>a#%A8Jd-JeZUc*%Mm;TkYR@$cwP=X zl>$$SfyqL^o(GIx0|p7K@-)pB8Q&!U?c~14PSBqZ^pT;S9H9F;&`E~d1wbnSv|OTD zVY4RzXdxeqH6OkSuqKAxe!7m##CywZytmKA*Wg|hIr_x}KtHvH@b3dUU|}`83F~YC zw)p_;L{j@rl#CUj*jk9`w|;!x2;-`DE&-?1Axz{KJvY%{B1noFUsSHom7p+<8Dj9CI^RDy~c1@*LA9kS(J zNJ&XKNdc;n6@-56V`^cY1`GxR{C+=tJ|CP;C+ZvYFt&HX>-AF4?RL{lMn;B~0+d5O z3TW(^z-^fVo~0$^Gr1&i0V0tIO-)UZ%jLA@^Z8KMYAA$Zm|Y4`m_K2M0Lm)rpwVb3 zAQp=ujmv|>;ef~Efy?EB)oKNgcOHSQFa@Yoswf4N_bp>P9K-!yGbEBy3XoMO!QpVg z<#LgknMuXg98MaPRn-(wP*4z}fHKoZcS*-mBwPIm7qjx9y=#DZ$O4WPo<})uLy<0h*&I+6735Ff^4F5qzk}@P)Ff}Nlc zJ+V-1gdjvrBToYb_&=5JJoz%#Q=n#p0PUsg;0_wW6hzWF z6d(Z#0TH%uy+T9>YJjQ_4o41w#S|V(NC8qn46yPY0ExQO163;l8LV%BTT)_{lxVdB zLqhH!O}vfXt+G~AtirG?JdRPE!p4;(u<%+06sOr5$!l?%`w$ZJisblGeq3lk?M znK(IF&Lv~|%q&@!^#Q8MB|waLDd+L)A8Bgth=QmR)CiKix0+Qk`lsOTj2++4X|3MA z_x{3e%gn9zko@i4h1Ih`tu0ZJsAx1qji_-~z~gH-D8wdL6`?9WFzi$qo8J^aVr5)w?g*$f-IAT>umA~g7`KN%tnR;#U}<7 z5hMW@Lgq>E$!K>yytk^`8I7CZh3ZpP+&cH%(^WC8HJ%e5f2P*XvcxkWwQ`kGkO~lt zlII$NusS59(6q0vCnq`@4S~{naJ;w4`Jc)kW_~B`6%d;_oLG1Va7$7Us|13;&iz}O z`@n5r_O9P&2_$L=A|D7_Q*>C^p+!i-1T+MZ9OX=AAZiJ?X%jKvPl*mHtAuC}!6424^=42In{JdU?xY>Aa%fe%j@!RS-}GG7@u}MX(vJ z>tJ!K2+sw+>=e;Z=V0Y$3Gq1LUIFdtdibFSPSgUs;JGo3ze>ZS-Ld{OC?6xeX_GkI zowC?tTM$B330MKQ%?H2kQ68M0%NJfGeerSnSF=wtJ002ovPDHLkV1gqb2Y3Jg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/calendar_view_week.png b/media/img/icons/silk/calendar_view_week.png new file mode 100755 index 0000000000000000000000000000000000000000..8fe695f51fce503e1a4838ac4a93f5b9ab95553c GIT binary patch literal 480 zcmV<60U!Q}P)@KEQ1dB*OY;8rG{0D1W!OBLkw-N=dwXm~N1QE3ov=J3VoAfqnBj^Uw zM54xfXXYG>dvA7&AS)Rd=55|*zRs-J<}fw^c=>n$4xMPD-K#DN!X#CQA!mRGN}D zZ(TUGF#(W$<^0Ccwg1U{{qg71`xTV51~7eg8EmKo6-0FJwt;A&35ej=)z?JS>H=Vx zgW<$+P+1ltJpkL>eL3^by|8WH ze>3}MeDdL&w}0&U;_Xe_W&{u=wB$OQFuT8lHo6K%Lkr8Qp~<2Rk*PT#N?1z*LjAZG z0V$SMWb~P*tCKk(rKJTl0EW#?05TH;58iGu9(7SR_g>A2D(<}aN*l$^r(ZZS?mmu3 z3%3x}wQ%n2F|r2jd;b;=GO3$dFC@Re@#xc;wls|_B8y59C9?8Bz|QWU=Kw2*J?FpO W9yz<&(0nxj0000gJ-O!jxnD7oNLq;%;3B=$mW~C-A78b#}Ym zUa~ApY&IL$YPE8+w{2VKx^DRW{x^j};R(m*^Z8S9-^=ClFHtNO4^>s2WHK4B90Evd zRNvv@{p&Eky~2wRC-6pYqSb0Y8jr^>3G5|f?PqEtk*KFqDSspqL8sF}uh+wHIK<_n z6MX#q6V3T;+&aAjAq2YJ?gK?pbdSdaP1D3|HoL3QsY$Qbi+a6|a5#)~It`Knl7dhu zghr!*N~MB8Ab@N(i+;b4$z&p9n$6}7jROaR0fNCGwg*Re{(gmpDPU86x^Us%)obw2 z=aha6oFxO>?KYy(sFbSkv{)<Xg3cSx! zV*;wSwBMGSfGRX({TECm3Yn@1ESF0eb3TJT z!7c-;DBO+#(G_BEZ~a#M_t*Fbci5Cwkwgrt00000NkvXXu0mjf2e~nc literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/camera_add.png b/media/img/icons/silk/camera_add.png new file mode 100755 index 0000000000000000000000000000000000000000..08b5da9891cffe3ee397f528734dc5de406c1c53 GIT binary patch literal 800 zcmV+*1K<3KP)ZO`s5Iy)3 z^blxIm6b3;gecZ(Yy%rC)TwiGbGzG}ySMLLQF<%r!0&t)?)Uq?-}!y#FkRR2KTG1< z)YR0ya=9F+R;zWjT8&jI6_cVUW*#+7V-|}=wcG8l$HvA+dH%@ANFRlt)6>(NEEo(P z5=AlB+uIASh6o0tU*6*C#bZ#Hp5f8^4%l3sh{qGxvf1ooBHIXD`he*5dLvz3U3Qnt zg;Xkq)zwvOY;2&}(}9nl*AXk6L{HyoFvhU5vT|7v1dA-okR*xa^Z7FpbvmUa5x+Y1OiB>)5zs=MougiJ1+6WwY4=gHa4PK@44?hVMmi8@CoU=D$G!@wY3GShap^=L#b{X2m10@ z&n_7S#P06yyH=~!aMt6jM_MtX%EaAUrYSh0en(>Y1KRyIoa!IIQ2%*U${9ERlE#EA|+nOZ}Sdl>J2yu_f-k7Rrn5_KL;CX@F` zj-{cYfh{gBGG2holXvKL zj1ND@#GC7oMGIcMnkfta^5QgId$>3{* ze^{whg4JrZPS6`MxN($ zfj|IE4Fy;cS$cyT*N#J5o50ie-Eg>ju(A@nnayUOQLuvslitsFc6Nq)dwXTK+l_cU zj#MgzOeTX?Z#QNZw-7C!#;Lw@AcP>9Ob&1yCrXk8K@doxP&hBpuE!h>2g2bnTrL;< zen03_K%at^mKH=J5zNia!Rd4&7z|=_a}&8-&Z>zCC2JfpB7y)(LieI{&0(l4=b%t3Dn*7w`;kx*auv>`)3D6J)nbUM*n-6rY{NcvxB$V8a7@*RZ=L^f5ifi zud7IK2idrK**&p5KU+&y>QLZq$nFq)OAwv5eohX$&YuRo_ewiIZ}U3o(0MaKQ72s_A300000NkvXXu0mjfhN@V) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/camera_edit.png b/media/img/icons/silk/camera_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..b5015b103aae138c81088270f9f11da15bcad8ac GIT binary patch literal 872 zcmV-u1DE`XP)gnzR}dAN!lccO`E2gRvSvH)rF`K)PSFY3td^OAd0KH5V99U5f`EqDcV&x zMR6f^BgHTE1J(~|N}8%wscm1=(3dp-m*hR?MORf<4%``LxaZz;?ww0CO~d~zPTvLw z1}+r}g+QrPT2rZ1NU>Pt^ZC4>pQ@@7Q4|%c)jARih0g2#Jv}{J>G5@FXlR-A_xGDw zmQDKoe&}o{plZ<%qd0MRBb1pz+<4LolcNpO)1P`}S-wfZCTcqM9jwRWiL|%3TOAGu zW@l$1NfHu?1lGG+@$B6aV(CtFY~2My2o@F=jxY=(8Vm+-97k4GR(5kVYm3QbLL?G_ z-EN1^=L3}jDh2iR^@v8J7#kad&1OR&5WwQ%B9h5u)h8B^Js{#1jMVXFUy z)3c{iscL&{vWy*WH^f{7ott>rw{%01?tm3E6jF_lUcANKSuaqVMJ|`C1|Y#;u#fij zGQEfvi-k1R$fWP|K9q?aHtS1R>;eThU}p3+Lid-|#k5+Tf!{Oqh^!u_dsp{rN6!r+ zHhcl|-(EpWA28sjN(nz}>M6Mxz&V;}e-eUODhLu)h9a yaBR0V-`VWowzs*V@x@p9_|mCESHd&@8t0!9oOz=HFLpWr0000D;+3^E$z4{$MYU~w{WF-|B0J{Ada(M245 zM5B?xRH<4DOwsYEL^vFoOr=tHX|O<{NFU%@T3P}kw@ic3zAP5Kq0fOcC&R$^&w90dyv`v)9HVCDVj?z;#J8&v)1#8j&)P*@IG zl|zUOWi=QUpz#kgwRGSCYTsBsga!vU78>(_w3lYQgq=;Lm~?kll}x< zsTfRnC<;VuXxc_Wst3z_yv0nfuLV zGo~m?i>7Hrk|ax`(Xg^p*L7mE*<`2F`Eqh{a)RZLjg1Y_V>2F)@0022=@UH9m!r`r zm>LQ&Bf0h(x3Bj>{`L%y-}b}d9Y8vr884MePbk)oS&!K&zg1I2=eM67YCDh(scw zt$?Wo8K(oRKQpcS=llS9qiX2 z96<5lIf8nff>aqj?g6Z}Kc^((5rJ^1fI14R(E?SsgQF9&+wOqp6+l<9sH!;W?889U zFltQ^pGV$9`s({jz^bpWuOr$W!CJ)wNuXoWWn3E^hej1?x<*Ykuv5t*(sKz1asw+; z9QsN>1XjILshHz&l}Z@y?KRE$NF_7y_hJSLRiWw%6iq=@s^Oe}1P4kTA4V4-(3wtb zZEZcEN^Bh+9b|cVnJ|LxTTQ5%3a=wT!J0{yt8ByB-i6id0v0!xAS|6)Apd$yH=hRe zCN)>4tuO;a?m==fIEqi(iDiyMZh}+n{@4V; nyF}D;{j00000NkvXXu0mjf57}={ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/camera_link.png b/media/img/icons/silk/camera_link.png new file mode 100755 index 0000000000000000000000000000000000000000..d2ac9f9350ba1b79b64d454dd8bbdc21c718cb62 GIT binary patch literal 839 zcmV-N1GxN&P)jCRQ2LkQkC`7#N(`Wzd0W z)SBREOthvcHI*MJr3DJ5rS$iC&Lt3>eaX4^y_fTy`!1#sw(C4`CBTT>a|!bh(@DuI-T(Q z{h(Grt-#@MAQp>Zb#)bXyB)z`5WBm(I6OQQIq`Vhr*dK@lR-;M3#w)ho_{EzSd-8o zeg;X0+wIq2J3c1*YhacPOe7L$Yikp&%DfbdMRas@;LVQ;%9;$LjzTY^F6;35k68fs z_xA<3QmKFhzF?_x0a9B;p{^&O0#zo3NFs@rilzrmNCbm9kKcJ047kd9Rem(BaR#O$ zGKC^bI5{~HIhPrn7r0&vrlN&H0oiO8;cyrm8yh@jnf^D_m6eq+eQi}v`g*-y@9U9~kyi3WgY0VK*4RXJq0rgcDLhfD z)efjVITDGa|0&?}`4sBePbV&ufDQsFOqK4&Bigsgt;@9QNVhs^ktIfBe*xE3qL_Mp RB%c5P002ovPDHLkV1lB^g8={l literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/camera_small.png b/media/img/icons/silk/camera_small.png new file mode 100755 index 0000000000000000000000000000000000000000..454b0b0199df99a52603dc9d50fb108f138a36b5 GIT binary patch literal 489 zcmV4nF=aJh$b&b^ONN^wktaAf>FK-e!dO}leb)%S#D|82Kh z)M_Sl@!Vs?A}E~6 zxJaeYXf%+^<k76bVRR$kAvNPi6?SJ&zf9ynYGbI1cmq98A08I9RXOOm1)s zwryjvSh%L`L77Dy0Syt1$78SeE5LL*g=w0&Jh31V2O_bN3HMFS^-G}e*;M)Q6>s#cP zI`Y#S($G6W`W@NI5g|L-MKl0Zmu$m^(0~^Lwo5OO~d#(vPfz1rk%1hOvQ!2cN2d2?-uHXIEo8vToeK|KINWnNa4+Xt#u)Ykn|6RndSZEQHfCZG5CcC=T z`(o_NTOjbCK|GPF4%)<=%>`agEOIe^kJ+gSd~H}=`AYZIyJS-%Y|LeBxc&DE@kHvV zh>Ui%*7I#PNlilw1y@n@6l>qJC^2jm6{4Z3p@!y54^361Eu)pbu{`o1V_kbZ`MR$y zdh}&Y@Fjlr^zxZmgL6TIkJ-*qG#j-x`OjkRipD3485n}nXu!{oDbIFDjcz9A?M5% z2PG>yimcp1&>5MK%jHlg6reM+k&%A@^fo!tWxH|QR0Ma}26yDTXd(nZ3#(s)-0F2- zez{50^fbdT&}y|H>u{>mC3+bKC)$uY9*^5a08#oQKc4{{)TYPG8KIs|3 z4ORT?V0lH~l?0j&3hB7!W2DOBEbhsYf_b7(V%tAvUOfK}hzhb~cin-F00000 LNkvXXu0mjfWpp$z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/car_delete.png b/media/img/icons/silk/car_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..2803b567847e69fe64b0691dd30dc83d5cb8e61b GIT binary patch literal 689 zcmV;i0#5yjP)O%0M7oPLI-^+QP?|IL8KS>CIorH`X z#{U;kx03cgzm1lD&iP@kbCb?=Y=W5?V_7}Rrs(-_;>oo){}iC`H#cZ?N9}vbmIR%1 zFb>LqUnCTbuQtCJ{X9Zj;%93SH5XfYC4n}U-rJ%075Y!Dm1|o2KLgO>T-6vG~ zU~R__Y6#D#b0=pEa*kw>#ikhTYrejO78!u~M-2O{7X0h`!Spj`&?4f`5S^I6JW_j*t8PJ zvW&#i3M5M{M0yFvsP|eYai!-03M21;xEHWkv7}aG!u?@3_kw}O#>S}A=@c%POHdx# zsv8(Pr*i&jP~^wYdlkZ{=g+|{pU>AvYnt#p|5xdXh_44m_7@FzBa>dhI@OYE3e_<$ zZRa+6J1Xy+_7vT%DrKrF&msApA(l||?1t!-wtJm@9S82DmgjFPx>RjABG%JZH+%FO X1fWDOL6s`T00000NkvXXu0mjfK8`i% literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cart.png b/media/img/icons/silk/cart.png new file mode 100755 index 0000000000000000000000000000000000000000..1baf7b9fde1195da75a09a4ac8a7cdcc11542c3a GIT binary patch literal 421 zcmV;W0b2fvP)|9mIxVK*qV(LJCr#hETgDW!z&|9$wh3`VrtfF?un9PlRLs>2y(-4 zrLKn+LM$+c2R9RpV`rECN`sK@HGt)oU|=2}GdOWzXOuyDL72-1pjr{L%5=%8 zRQ(pEyJS{6KMcTc^`djdIyOcaz(RmDeoTeB8zvcNthS*`>A=K4->m8f9c)wTh(V)x P00000NkvXXu0mjfbTF;3 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cart_add.png b/media/img/icons/silk/cart_add.png new file mode 100755 index 0000000000000000000000000000000000000000..45c2900089c5b3867019ddf2d1c9c41552d66b32 GIT binary patch literal 711 zcmV;&0yzDNP)uCxwbv=KH9zoUDon>V zr>UxI+l z#KOV?tXAtCMJ|^E)z;P)Ha0epPNyNuGGeh9*4Njuva*6;Fo-}P0FTGRu}4QoI5;?f z$z&=kve_(-kB`yqcK=$PP6rN$<5RocMzvanBuNc}!7!r8WHP+bYPFEh=h197LA^$! zfn+j?{r!DJA`y-Wg+eHo%iPh-%*WOJf!=_4JdR?q$TO(d>pTNeCUT`x=_#{;C=?2$j;X1sGkv$Py1I(P z!$Twz39zJva5zj#0@-C@2}IWEbb{S(Co+D!Mh2YN-Q7j4Rs)eqd1+}0rBaCoa%Hv( z_V)ImR4Tvy@g2C`Zb};S^YgG+ER-}@($Hu$P#T`&g=Gkj-rm5_>p@&oUYt1fLwX|J ze5DHBL!@j);j;`WIfC2L1zdi5R^$Me%XOaFdp9>XM@hqIG(xY}Q_`58p2l6>Rjidv zSo>h6-65tPLP|ZR0blt578bWNJ3BinisDB`9zE&c`pZjrU$*1q7cN?9zz+a>(-SOd zeqB2|JMjDcJn8ZAag2?P;mWgfcq8A3P9ElDU1GT3!LQP4wNR;4n4FyKbHIS=TjBtW t@&m3+C;j&_I88CIp4At!{qxjQ|2w4%;hGY8=Cl9+002ovPDHLkV1ip>OPc@y literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cart_delete.png b/media/img/icons/silk/cart_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..ac5bce5c8862ff091d89763a9c0ed19a70e639a5 GIT binary patch literal 742 zcmVy4^0M)9E7~PQm4Jv4X#i>2wOI zRH|*W+0?aK4YJwnF$x&tVRE%v1))#~tyT-vYBkjBbJSTCeRBEc-5YwfMssp)=!%M=N`K@UcJA@FCzC%1C**Ti`$vEb7M z#Ts?^`j+?NC4&`CzviI$={-Ftmv-4ojK||Q5M>V$A1;aO4mN*`U~|h0{MrYAk1s$V zk%C^Q=4}-zr;nG2V`{jav#X!KFy+1v0a22=1R0U3pl!)07)2~?QeZA!iu>VoZOn9222<0v z*_>{&&CTH?(D~_>E9czAE;OB+evM6@zV{=9K@6gc!wZM=Jmx!`m*JDd zXti1{0sD=&MB)B>h zj(dB1iPBK3)le#x=vNEzbD<6gv>$ulsz9%mV|S?@i=8F-(pG$_ppk5Ej^5pv75xEM zf{xusl6r}dvKW%*HQRYk?CI$_%_#l8tE&qNg#sGsBT%+y%-9~#(Hi_(tH2I3NvNX) z;nvG11Oh=ikAM+NOkTNME>t#DY%YGT$GlC3#7r6XqUG3{dx0foQL5o7FTsF?d_JGf zBVar&W^Bo>%S8OKyNa;p4kqi5!KW^T{q+?XI-6M=GqtF$u8#cmm?RPj8hPiC@pm9I zBgahBHJBbAPuc4(T&%6F74mpI0!G1WEW3Jyep_`W>ufH~I@+$gEu!-$3ti`La_RM5 T)9mKtTqbJf(rJ5aze{dD~bnS8HAT_H56d@9+Ejex4r>0Plb5p9Kbk0a~pV zy}i9qsZ`f^p->2<0)YU0J|8HG!sO&6#>dAoIywrw-42Vz0+Y!EywGFe(8k<{~On&vLD*(|1}rjW^GK@0DIP$=BL z>la2wMo=geFflO!mNehta1bZ{u+@ZwyEeU=v|z?wXYB9qCu02ejcl%#>FH@C5(yA7 zaWN(A3nlv*#Y@bUH#BJv}|>?(RmPstr-=WfYg4D1PX| z+JXy_p_>rgY1sMeBE7X;+V{qM(XjH)iemNw=tpPqZPkhyZ4G3?>tA;@7#J8h%94Jp zR;vkVbar+^BNre|HKVko2Qz;IbjKNNWg4-b8iS|n!uN>c+<{617FG*66$-^IsZ_cs z6}L68PA|W(;I5B}XC>>{C~{={N`xfU!b$^nr(4*yv@hRwsCqMf|CywvR-QL~~kw}D){QNqzvVhVWh2j#+V9D}J*-*~M zkb7aov*sg~Jpr=gtpqzxGl8~K4C}F8}}l literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cart_go.png b/media/img/icons/silk/cart_go.png new file mode 100755 index 0000000000000000000000000000000000000000..20ee0584f61fbc7a4759ccda9a3d805460bc70c8 GIT binary patch literal 763 zcmVaV?~72n$)U z(3)sy@M190gjOOI`b?=sg7TQhow?pSp#)+iF`neiNzTl7zwe&&jl>wk|AggV0r7a8 zX_^K~DR{jhC6h^0f?*iYb^TC^j}E2)`u%?N_xEFMZ4FaXQ;QaHg>X1*0*(q*RWUg^ zS?cNO@nkX?%*@QJ@&lh)1oQIpGOSiB3WWkZ9uKnFEPOtn*>7)e$I{Xgy1Kexx7$7W zd>-j^S{xXS#bOCdBodJli3DqEYQo0GMu@*4)oL}QC<@^+L$WNBa=C2QQmJJ2x3{;& zb&5h+op^}*H8(d46+|%GY&Ig8IU^CwPN$P}cXz|(a*<##D2RlDg1}0(HBL`Yvw?vD z@S&nose}YrFbi<8SPZSWUy>cViI9E=xm*rILqpQO0ufx&gH$Soj*bqKIS>fI;c%GD zZnvB8y};Xg0k7y|!M<-E>7bD&CMH;IU1{43FhhfCP^i4;aRt!py^Q(QH~3s2*riI{ zyZb+w^fxEojfdIQ;7#a^`@_&-fT6rufYW*sbKhQLA@`QbRBbe!I6gjpp0nQL?6(BF zNZF;D;OzQWXj}#5YBXKLPvsZ-d=YGEI~KAsE7$FrpI4pYu#Msyv^Lo9efwma(rkj6oIv4xraO`e2x4AjJ z%qz7ynhQf^4{kb_bA{+YnXnXn>q!`dZ29f?yO6Y;L=T4x=brERp5Nyj5dcxGQ1bWi zI@E|~{sy#ouKYZ$PITH2MX0eH`#OyGSr(6+m;b-PEAA$uU*3ZMY)6yhB7WyXp%8+> zAVx+;;C8#8i_+;dXe=%+VqswcYW_at++FBCJi)tF7QwU?FUIcRmiauc_16it<#HMO z`}<&7HZNLQT0*5#!QtVd5R$PQFnoN9@TwDRLIcw$Ifj${c*!;4y8c4t;NSpTTU&5A z9N%mNqCsDmrec@N#qc~Yyx(Xv)*m;Rot?${ z`ntfNSS(_GejbJG0vO9#w772{J5NkZU~O%Ux}&eJ?_AXuVzC%Xr4r`m=0Hd@@pzm% zF?3u4i=kqR#li#v0V>9cHIhPIHk(DEPyiKgZf+tR4r60ugEkbL{eC}kxg5H>x{hkz z0mpF|9UX<&>&4K}5G4&l8YYto27>{5y&luk)6i%%NB=yeTG83rd8WO+9ZIG0dsTz+ z@$suBA+hMg@DQUsAr>6%U9UW+EYZKlsm&;344G1h9{W_ga)!^XZ4iT&V zc2}#_DuqI^L&PenRQjW;0l8@%AuX(HWn~4Elam7J?(S}AwOSA{d_JFW#-tWvv3R>C t1GCvI!0PSoJu!hyCR0fy5-P@@`Cr&f$(>anrvU%}002ovPDHLkV1l9|S^WS2 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cart_remove.png b/media/img/icons/silk/cart_remove.png new file mode 100755 index 0000000000000000000000000000000000000000..360217b526d10a3a39e0acfbc4f4a41bbf986734 GIT binary patch literal 769 zcmV+c1OEJpP)m=n&zdgPnpxQq~{D&6m05<{G#c-_mW$Ue%e~ zz`fum33Dj^=QhnX%iLgNfhl_HBn(1)`Sv`|L0V3t!;c4k&+q&F{hrVB69EvFi`xFH z7oJ5bQ0uv#KCgzxxfgF1Zyk>$Uqiq264jO~!hacPgc?kIl3+0(K z-c3zSVSIcXcDo&;qoXfG$z&2V;_)~HLBM9;{6hg6B#Qgj` z2x)G1c9wSH=(q$HN5y)*o^v{#RE#s2%AkjZ4IA?xgLIFL@K zA(zWf%I?ABO=O&hm&d$z@ZEbC6 zX=(XcV&HPQZjTa>l6HF&*VMp~gzprfM$L=2nF#@3kB zqM@PTdszlLosPj$sZ?hs5R1i<#>Pe}#-I7$7+=lQ6LRxi00000NkvXXu0mjf3)^L| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cd.png b/media/img/icons/silk/cd.png new file mode 100755 index 0000000000000000000000000000000000000000..ef4322357cbc34e0b5eeed34f9fdf553a1de2ee7 GIT binary patch literal 673 zcmV;S0$%-zP)fk+XBT$+GFLor|=G~7Z=&Bd_^zJLLP z{dbOmhNM(Q`mp7h`OloWYysF>=iU40Tf#?V356IC6~fPKul?5pw+W80zw#nVEgemD zincj})E^?AZGqXAKHDz@mch}3iwfqB3rPo#(gwa141DiTF(xO6U^eE%d{-hX0gf3o z8{W?(@4ZV6pRS)EXbxQZMi1!D!oC#YJOO&yAsn%9V=twmsxF*P_%ZxvD(XXc8T9DS zr0103x=g@fvEJ!1y5C7b$Hz+ryB7+I5>V>_sj5lWnV>%bWD?LRmBAb^h}fbg923Y3 zqK41OM-q_X|0W}n)p3}pGlwoCoNU0Ppf+VweFB8`9D=Abd!7lXx6+7Cma$90A4ue; zVKQTfc(bHa=}i!!qJ}b>M^UnvkNQWze=dVN?ZJ22Mf(14f#NRkt=PP(cyuKepkb#y3Gz>xmDvuMC zIuoRtGlX&@?9*%nGA0rvwq8W9jW)GLrXJl50KN-ci9ozQ$MNkH;k<IV|^+8goU4jB6C^%Mg5h>3Q7RCr>7r_DEKw7k44$|vUmJAm;${=2wBT`(Pek9N? z+*$Z3+nYyu(=ufrbdbTWW%|!LE6aD^rgi=em@XcV9q^{200000NkvXX Hu0mjf|3D;c literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cd_add.png b/media/img/icons/silk/cd_add.png new file mode 100755 index 0000000000000000000000000000000000000000..b0254effa6c39214d063f84c2fab1ee1d95e162d GIT binary patch literal 758 zcmV|(^b7zP# z!cC-!Ea4|iEcUm)J+YH85|w#Z1iq+@Uy_1&;Q+DB9_;QYSgfJxJY>*Fo_n+CN42IR zCIj!+^O*7E@hzjEM4}qOVobxdO_Qd9kp*%UXjg&MQ%gC#SlNY;t3jo2G(fJ^;|&v| zWXtF>3^75HVOb8N zKuK|`Ca?<#@hXIf%;G#VkTzobG_!~aN`6KrYvBS5CW!6^34f{#D{ZRzdrrd}D>9AL zGB7QOFgj8gb0o38b=1K7y9l#O#_P2#k%6bpfakZfFfJsuhB3*R zao^OB+arCrI(!ZzGo!5~Xq&jQRe~S_(IODe6FI=YQ-&{5hUwE=44JRvqi-C1f`h?+ z7ncnu(K~pNZ?&;Ptr4k5KeK=<34DzJ_D~fcHWXZYbRM(br)23(`QX^Zktqx=R22ncUklHj|3B2M=Ej;gbFYo^Us{nc2wR$w1%nAHOrh o-8
    KW+XXJr$4Vwmaw01yHP87~i4a89>F#IhBV5<>KCsArFP3K~RSeQz_oh zrI?6k*^{KApkgXVk^-S;4JgBj@Sw>K?8r1a`rf5|ZHA$}k_wFus<@|IkY8-U*BsRpdG@9y&yGjX7CO zRCctKfax%N^+W$kflmurzBfKVdsYF@&%^o!7_P?t=(b_5@!*3LlXbabFe1f$%Lewv zJo8<3M4wv7behz6@+!rFc0Q4XdIW~77uwr|twv@m3tG=Wo%M<3f3Nec#*f;@*$N|c$wIj1 mc!64Lo@-XPV$E{ddh!>bnF*|Cn{Vd;0000)-`2Y0@ls8H{BED@;Y7( znup@NACB`ak|8Ccyr61IqqG|#8v$ljh-ERZgsAI#V$}67;fm$a<(oXv@@w_=5VH{= zFNcJ@Cz7RpAk1WVP1IsfVd)Gry^PU8KyC?nW)!-v0`kghjNT^mYZ=yf-V>sxJH&_= zrUEc9nULwEiKHPY0h+WD%|TpfTU!&e3UInSF<$j8N94ECdGiRVkB`yEZLGY# z!T0M2d2;bo@8&jUWov@6N57(A_rn(tv`^>wFqYxd*?lC%%(F_U+6fQJ2|YSW%Zbv3 zEe9zi+vN&DubA7Wbgbj6G`Uhn+q%7(!Yg`r7ahln^=(Jl8`t?M9kfs7u#RMCawf5z z-ox^XOCYB7EfY(E=V}qH6-C~E{!ETpjd6d*Sc8Gu`wU*$kFTnn#oHygFYlnUvN&g} xD7s_%kKbA0sJ(W+zvX19Pqi&0&nvUi{{g(`2CeVNupIyZ002ovPDHLkV1nU5V<`Xt literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cd_edit.png b/media/img/icons/silk/cd_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..b0dc194b0525e847fbbe1241e93959a2f645c623 GIT binary patch literal 790 zcmV+x1L^#UP)-<$VlrT{=eK4py~mkA9q zM}&zO;URR)cG5pTu#nIa%IK^g^MN?lA~H6Ty9f%~_%Rm%v*mmWj|t?0N4kt2?5P<9 z<3PVHfj(yf(}E0%oK%9@m=E(k5IGRgGJ~if`y|P`b5cZyISPlUB18XZL0sLp=R~ww z0s6Q^sD42~rzL{r$iCC?tOVV71m10AGuWh8l2)0K$uI$x#b$ROqw@_r<9I(AMw>AV zR}fg)1T4!*I?fJ+9e^i+@P-~sU1eAqXaM)&8Z@sTjxzzy;TQ4Qv_%3ubQ3%V=i=!3 z5s7`-MRgx~-|hFXZuAxdQfF=sD~EhW25AmR?DXlEX66x>cCR$r0@|0T{bnsoKi zsQU%vKZ6KOyh7U5kG*vhxR2GDLjj$EhgQD{jXnh1>XCq@uc%ybJ%gGyA?>>l!S(=) zomFslRHLS;JC;2Hw;qGm5XuIBwTpC-8L+gUziW<0T~DA&7NoqDkOJjMEYxA;Qwe@^ z9NUCDyhQV=1P2cU(ts}kaCSQLOl>as4kZ6=#OI&F(|QvYJBP9T#?l^^QK8cCRHLOB zU^Wk7Ve}ED{S(q!6?Os@5GfOnt{C5@yzp!(M`g@!q%f6BKiUoVa2*`q-ymo$MQW`a z0{0m1wi5K4Jh1td ziw3gwEvyY!(OYvK(=&Fk0sHST@Ji4tFZ40?%caa8P5Q(0zkne2A0MmR4NNf_{a-Q?Lv zlXvM;av~}SDyB3_``6^JfkOrKJf+7H^|ViC(*KLFUZ5!dWWXp~#4k-8B?I}mDHLMq zJkxJeL{k@{r9ckn%M`oElqxuqmnGw=qF7W01(jQxeOcDG^wD6#r!lsw@hJg2NANak z$#PCepFmO!3@IgZ4yLetu_q2?5DLe1rr!J%gCx#ZNfv_!b8EXwaHyDnvxg-~PN$Qv z+8N;==Y(U1iieazYAf+uW==9D$>U=3e$P_D1L4Lc2jdeHc)ebR9*r=!o|Y=JN|U-W zaC(zCJV%Up4q4wXH+VcbiO=W5Fbq5%5BKd43B{}{gHY&u28Z{slsx-EmyIl<%2wsO zTrT{6KbB>&wY5bilVM?DfxEUI>g`M6t4;Lp=Ljbuo`pSA&|zj~hK-F4ve_*0c$`Qi zLNpph*L9R}b8|CSZOlt+lG3B?3 zhK9y$*+J5zU11H@BzbwK$l{kX=EFH=gIQb~7Ec2v>#=b=Hb(yb}@(&i(Y~tii#p5jVyfeAt}w2NTp(hoN0nO=D^FGowjKJbAceN z67Z(Wjp|-EIvhTDNfaPhjcJ&6A!H$dV+EHV^5Y@3rrCwk_9+-$0R-tEHIM@H^-u^W z2hhhMB4Ba&q0xyjiSwdby%(x4A_k`+k6?mc9%_AzV2}j_m{;z-p5|BEE1{^_j>0B8 z`mDh32|#D^&~#?um<0q1kZ35*IlxWS&#wu`0t`lr3+lE>3J{?BD&RdYp|W+532cnl zZDx4LG)AK_O##NSIT$Sxs~cE=_`~{#dKOSf=2sNbY4)(dbM zXPsdhaWO#ED1d92Kz@S_T|>(Q?vx$Jqnb;&P_PGOoeuPd1sDt?PH>Gj*<3;CCNYQ< z?J?Zd97dA*01}G#+@w}dAAbEhE%9^dAOyGM@-II3i!w^Zlj;JMxZ_VRZITUgms+KGy zYENT#MwBx;O%bu|C|lh@e5VndE7*=RFSjC2xe>8X*Wqf(5pd0!NYKQSd9(XO*1h#B zUM7A-!cUtI{o}LfF}rXuHwxF(C$TGi(_~zBM%1#~xWaX2@H^5YyxZ=t#)dS-nsEI; XafIoi2i@$300000NkvXXu0mjfN6%>) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_bar.png b/media/img/icons/silk/chart_bar.png new file mode 100755 index 0000000000000000000000000000000000000000..9051fbc609b92b15af9be410e368b7adc20283b8 GIT binary patch literal 541 zcmV+&0^V&qIn(Wzh!))n z^W^$!aM&X3bCX~Vo|JLOLCb!-`g!yN7b-yh!|sbVZ|M~fElQAyiB?lO%sjz z7TJ==TTk%_A{ znxkIa+E~RC#EKF{U0G~y<6)R9(uCp7&f7|JN}RHwEO@{EgbF~D3a1<@ip|9yZb^6$ fo@6A$W#9P^w2GuX0-m@}00000NkvXXu0mjfB69Bi literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_bar_add.png b/media/img/icons/silk/chart_bar_add.png new file mode 100755 index 0000000000000000000000000000000000000000..d283e846a29f929681435f01c961faf486f274a6 GIT binary patch literal 626 zcmV-&0*(ENP)v?QT{`n=t5=RT+5AJm{BbjCAW=lY$)Da?%jsp?V9`R99QPKcuTq)0YGwL-(m(ExjR zzuclKmIO;e`|<-qG<-6WDBZP8-RFN8Ox*-kikvBOrm?96F3M(~{l;?gmI5KBPtkOY!&7>tk<7nGEZ-Y!L3%G}C~r6|OhNInrl zqM|;42>1ZrLyRHVOl)v{XpDkl^VKAerZ3ijA_ypt(BA64R z80Y(Hh{E@82W;)EvAMI#{Pa^6UeD0o(N$jIQP(YWX%`EErHrMF_GXrsb|5O2g|h>< zS^xBg@!?5ceO{!qsIvO;9rd3>6eoS>vAY)*fLY))&;S3R-CpH1QEovYWmCYySByZom|YEI8%B`R1GhlckjSpUF2{PTyTgQ57!`qvAzz zqRdR~&DsJuuN>Roji{mtBqkobY_#vd1jR>XWmO0<(brXB&1n08mJz%tHYgGkF7Kde zWOG2edbw;-l@x>&gkty#&L?b01W`Jxk%o=`a4>!xRLNo_i;?DA#Yw`rNQlr?O*FQO zkb;nj!0T5a0S+Bz&3J533SUOB+cLz2Edb7!0B0cx1Yy-BTu_WtLQM456m2ONpPWm< z3*HBU4LBFb)jB#vz&Z#4yl1VYSf4On@v-dUl-%R=%v0j>7o=XtjZSd8_KjT4`eo<9 zdk{fPC>^W=_I0Z3g&_JCdpTCl)!obD|BB)W!1_yo3B|7_u;pC;i{dA52tYEI|a~eRQO%X$#2w7ptC!l0{32(CI}(lp$fzNf0TbdAIVWCque*=#U*c zs1=bX}|=>LcQ-(oKM)02%@YgMyfV)Z*0?hzBX{Wscn$j;|pZ= z;eni|cI*UIvKYx?Wa*~jBw<`6L?{&#Z+D%ewDO(PUH#kW=o{kSd#^D4^yxlMECXt z;eukEvaaP<_LisV?B9i}oT9lkil($nchFpz>AmAK$4E1Yk|LY`8%?Z1>mPePa^Zn`}{-!`% zaM+rqkm?3Rz&fywnYjs0?3*RhOXb#=D3;p7YJMBP#nj+F<`s-Hc=4FJqo8#IA;6Zc zFuaYa{0^@Te?-fJOU#U2W^#OiU(QZ2`on&fiY3b318nRm6U5_;BRjhDc+wywC!`Q* z89Ku!AAAgj$mCCFnECwyUrZn4kA+^k%ReJQi4uvTXjHP463=>ndzX2$|Hb^RSNljs kcg4)j9~}97>MsA`39(pz6}>#e>i_@%07*qoM6N<$f^l1B*8l(j literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_bar_error.png b/media/img/icons/silk/chart_bar_error.png new file mode 100755 index 0000000000000000000000000000000000000000..bdacea5e5e1657df6b370a33720220fde962ce6f GIT binary patch literal 671 zcmV;Q0$}}#P)k7dBh(1Fmof__N_LYSE8EF!#ZI!fu@I4kQj}7N4aJOW zC{yma4U+MF|Mzy@b1Xh-%A_f$PN&Y|cb@0eQ!z9Cr<%uF9ys^KvMNy^XC;afL^-u* zPGwwx5S8`aEr=>=AlbM$I5K_(E-5i9Uw#NF8`CB=QFA(eK-~#Z6rU8yMrbbh>11qx z9o*aaqAHdIOF}t+KOq`E8A+7tgv^M~|4^{07gVX_OeJT2K2m}hE@V=MuE~!$y6P$~ zuf3nOp!dx1Xh2~}Km-N{VBijjP;(KVlrkz=N)|U?W_8a>G^KriTL_Vg2m}vFAPGN$ z5t8D9vbyyqbLOpJ>g;8_dwQ<_(B;1VccLVp2q96Z4-ExAfcFq1wYuV?F~vTzta^ji z8Exc|OLQ#V#TMGxwxEx#i+1Acooe5?WVgJXjX+nDxt5LX5YEghr;YuCa04Iski*|+HKTue*r zS4_S^rHOkNh5$wV5HlCfrTxtVrpHL-aPJY*Bv=qEWh`aZ_1$OV?&CBSuQB-!j81Gp z)1)pwKYhrVlP9Q*73bT>mVdRZEvAO4j%xceQN_&e{Q^Z5f`6;uX>b4l002ovPDHLk FV1mc4Ec5^X literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_bar_link.png b/media/img/icons/silk/chart_bar_link.png new file mode 100755 index 0000000000000000000000000000000000000000..bf18aed48b8ea9db86bb7621d1c9c63cdd121c41 GIT binary patch literal 712 zcmV;(0yq7MP)2BUt+C1Pcjhr)VWuX(u*z zK_L=?WW}hUEchaBuF0-qHhUlEo^$3{tc8V2z$u5}oB#ir@tkw~Px*gpUbirwvXUqKy|(sUy)2ZG=@>OFgmwP;g)bMDVP|vzFyqK^aG^ zEZRa_)=~eP1*Z+3G4P@UM#Hx4G~$#*3sKs%khFT3SpNl}(k4J9pbcoll5!|5#7fZC z(Vi0|6wXbYbUHPpsYWLnr8K@Iii|OkDA1ZDiYSCLc;&C`Dy*gaX^}{VX-!jlW;Rh= zUu3bih~Jar>C$6-iGOWY3au0mUccecmVS;MJ3$zR3=Di>V)7XW`(X6&C|N&C5CoJ; zCCoeUB}yPoA&!}u{M^zCfUtm#;TFHsCy!|pxw zyn4-a5CE|J@-7)q7#|-epU*cBEDXuup`S<42XmD#cvnWQInf5E40ZK`N}RLq zBa83f%q*uO+hkn-px3iWUBhj*zEtZ=#J?K1BwoS4fri4we+W?%x_!2UEjG9A57v+ddMu0 zbbp6n;=LcDNq6gD2L9C2J@8#y?*rTbgTj6Ps|^D5|MCj{`@<*H#t`wKg(3XGf2QyU zf0@G{{9_BdAC4aSKNVGeAq>dh`~N>9tN(u{wmT>x9B`-HYmvir?8JeOFVbz5u> zH|V#x^ai*A`gyzm|72hZ`OUy04pZPY)6&ahrsWHdS>_MiW?QUvoolwwWxnYbrv=9G zAbFr`rQinWXqscE(MN|a!$l4~hCDEFhknBjyGi=*G17r<_V)jl zB|4H8rP?#iOLZRs>9-bTIvMExwy4+UuxQe`XV#)U8P$NSZU2ojH2n=T)ZNqrEM0*# zI5i4uc*w#O3aL7Q*+%*5QW{Y@8K%V=Ja7ZFGq?QL&e;54D`OK7Z~U*7wgHIO|JMZJ s)OG(gKsaSB6tDTOk-Qp=;RaBG0e_Hjj63iYg#Z8m07*qoM6N<$g46R|L;wH) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_curve_add.png b/media/img/icons/silk/chart_curve_add.png new file mode 100755 index 0000000000000000000000000000000000000000..f9e2050460f240983415928fdebdbb94111818f5 GIT binary patch literal 761 zcmVRLq zBa83f%q*uO+hkn-px3iWUBhj*zEtZ=#J?K1BwoS4fri4we+W?%x_!2UEjG9A57v+ddMu0 zbbp6n;=LcDNq6gD2L9C2J@8#y?*rTbgTj6Ps|^D5|MCj{`@<*H#t`wKg(3XGf2QyU zf0@G{{9_BdAC4aSKNVGeAq>dh`~N>9tN(u{wmT>x9B`-HYmvir?8;%0k4&7Bhd zEv?W0e`Jfprz!qw*Wd=|=k5OglYu4VHv@|}OtaTaOD~U^mM=VJnLmh{;(o1hb>jam zSEl~I@NC!r{@q#s!~1prn`cY*fEDZI?)*PTRKo$L*|EcDnq#NYM~5!MMGifNJhAOA z-#1>K@PFgANuaR$-?Jz6fB&9zkOAMp8g#R_|FB!KO=7K?Xn+=w@yEZBQ3BsxC{u^W@{txca_}{xL1#B~j r2JzuxKnw;d?f~LXAZJ7A4v;ti!dZAcanXRV00000NkvXXu0mjf_r!r> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_curve_delete.png b/media/img/icons/silk/chart_curve_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..b411391c40582c6f465b9bb73e454efd7c0566f7 GIT binary patch literal 782 zcmV+p1M&QcP)RLq zBa83f%q*uO+hkn-px3iWUBhj*zEtZ=#J?K1BwoS4fri4we+W?%x_!2UEjG9A57v+ddMu0 zbbp6n;=LcDNq6gD2L9C2J@8#y?*rTbgTj6Ps|^D5|MCj{`@<*H#t`wKg(3XGf2QyU zf0@G{{9_BdAC4aSKNVGeAq>dh`~N>9tN(u{wmT>x9B`-HYmvir?8x@xqa?hX`q zy~l~=-%eNNN7oE_ufh$`&)fa~Cj(2!Zw3}|m}ak;mR=q+Enj%dGJnups(JZ*iN)XV zTYLZiySC&1*A+$oPiO1?+2zcV3s$U`yYv4XQ4I%}X2%YrX^x#nA04_37diA8^6YeB zzWWWR`Tr!}|NqMc|Nn1O{QtVk;XhFP9$15J_V)jlB|4H8rP?#iOLZRs>9-bTIvFqn zLC*encHMtu@V;K+KS&&6K-RYZMj4v^h8gN^>H(InKpLDHg*7~6K{U|MkH5@K{{J7S z=|>sE|93$AFoXF&Q2Ytl0PV~z|FttV|JTac1jHNvYo%=f;`RSEK{$2Y|FXE0|Ho3) z|352N{Qs(w_5a-z#{av0+5YcvWv(JR*BuF$tpM719~ujfL7GA005Pq04UpJhGXMYp M07*qoM6N<$g8Vm(7ytkO literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_curve_edit.png b/media/img/icons/silk/chart_curve_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..bd07673b55bef41b65858e7646f8117bb8e4ab71 GIT binary patch literal 822 zcmV-61Ihe}P)^(c>Y@u(F7)kFf>aU6kDVZZvH#RKW*PIV|R95O53!9 z$YjiEgA@hRg&A6E`h_sRzdDN0Tviqh`o z@ZI!-oUu<)OJPrt!|vdB$DogEN%o~PjHKPFtq2YWy~E?3H1p+fWU@wOXGI9af_jic zzW6 zZY)?sjpnY+HV&h0T@la&%RpzBLW^C31b-a}TXG?6%|dIE1)lpI04wkwXnwDjCRV4)Bpeg07*qoM6N<$f*6Q* AYXATM literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_curve_error.png b/media/img/icons/silk/chart_curve_error.png new file mode 100755 index 0000000000000000000000000000000000000000..906dd038368a493b9095ef94543ad9bb04e70232 GIT binary patch literal 837 zcmV-L1G@Z)P)RLq zBa83f%q*uO+hkn-px3nzYqrG@BROuk=6e{6WbkRr#t3u z?!CA!;Kz^GTmJue*7yJ2-L3yGFZ0}VX|X%&Z*l1ja0B%7cK`p$z!LJCfkhmq*>9GW z_tGV9-{0I^^Z&==rvHaJjQ{_7yXOD-dCvdN&2|h1x>gEqfL`v-|8qn&9N;#07){HW zWcl^}-s=B9UoHCo?M~wVL+ytDzdtPh|KZ-Y|EH!{T{}6^f){RpZua*7mL)op7Ny!V z%}aG3*_7$LJvhtp;d@}feSc8$|Ld&?2)-Q)^vZ<)4-ZcIf3(Y}4q-snw*N*Mn*N3v z>Tc=*mafO9+Z8-K)c61Ai|Jt7zut}pdcg=xf4i6U|J(D8{|`3nzB<^btpzqfJ9Eo_ z?TpR;wK6sV@y7oNGeW6fbe z=e;@7Zt(4JtNyn`&AQ)!Hhnu#ula3%t;RQ?rf+*IRln^mSN^uAOzAKH(R5;6} zkZVkmVHC$-#Z21FbTg-xit~aX%Eb$q*EvaZ1(tWr(}1B5w9p4)Z6!^N#9p zW|mWq&Ee>A7I3`(7L>gOKgj|ium;uAYtfOl=(vU-vGLeyJU7xbxXMlPUP(+|SvYt;shRIQJ!S8JnXYRoKP zmQH|a@GFIb%`+0TmSL}Aw9ltRrS~sYDKyMb-*r|P+|7{5w*)2QMuC2>n^Nn#Pakz; zOtVXfw%cdV6ZT}QM;(Q#pZRwpbh!!!WOdVsS_*AkLk(Is3+QKGLlvDLY_NC4Hg-GJ zBWdUbM1X>|05uQ@?8otQ?HPK}FBurZYL#6poWIJMoo`;VWas&^THM z7e_=O84`l@X&!V<)WNCSk>Fc{Y#0Ny!e_uK3v^|dQ?G}Y(-!dhE#pQ2+@EO$<@;vn znQnqxQ!-pq0P+bbh?I#ysz$!JS0eP^f`SoXiUW8Iu|LlKf4b|L0Jpym$)RXhX~@e`cKKoJe%3_!ppxsQO1LzUV= zR!=;5RXTy6s13+D{a_aS5BSP!9#sTzu0%+d{a@aHZ>`b{@k;;z002ovPDHLkV1gHd BcP;<` literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_curve_link.png b/media/img/icons/silk/chart_curve_link.png new file mode 100755 index 0000000000000000000000000000000000000000..144eafe08695598a02e1cbc54f470888fc5786b0 GIT binary patch literal 829 zcmV-D1H$}?P)Ma{BCQzS3CU@k3h0*+qU+C)VqBzQXSX@1qZ^5S>)?En1F?|pX;2>?jjfp}!K zj6sFfUA`>==f+sA*y4V=dFhj1Fyml8+4%{a%Krof<|SoroDj|oPV&EkCMQq~Gvu^3EJ$m|2AA1f(^6i3#GlX0T`T%|#mNgrf`vJL z>5AY!X4oQNYDXct&~WHr%d}Z}>E-G&BPXzu&3dr;BxW0S?^L@t%rbgIxt-o1yUQC{ z7cjIASS$WWWksgx1;NcPA8x>&r8Ig%$F!bD0mjLrE6i+oQqg7I5Ht=Gg3$g0eZj<} z(3z5Vfjw22CANB+ytmr>HonU9Gojkux+V;!rVj_G8T0D`n&tysqm^ccW8)*g;`Vit z9&-zx~ca)*si-N*Q)FlL&_3t4_+F3px6PF|u3e7z|Juo{v3vRa?Mn*>9 z`pv6Ln)Z6%m#Il2b2^=XI;cwsGOi3kZ^H3BI-Opk)oSNm6B8g+l!OEVK}4ZYfW=|~ zyUn$i-pifQ8pqalI>ryDctIUJ7PZnuNWhC2Lp&Z2BoYY$no%Y!6MaPj zrBdl51k}r~fm-(pQY(9*NOBQOce>$m-*Xrk7yzr)3L1?DbUGa|qYUj#=57#)L{nRS z4TVA>WinYMPCh;_q73a&2X%h~c-L>T2pyh000000NkvXX Hu0mjf(aLT? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_line.png b/media/img/icons/silk/chart_line.png new file mode 100755 index 0000000000000000000000000000000000000000..85020f3205adc903896aae3ac8b2431d81d25a92 GIT binary patch literal 526 zcmV+p0`dKcP)vZ>%h3)%~ z#+IbJ;FFDG??-c+T_21rm1LV#4~LF)_b?ghyQZ9u#u#o3H=L6>&|AoXU?qv@1Je4>AlGSTjH9nQnv` zZj`d7z#wVmBfa>gsDTLdFI#`g-3Fu!5 z$Es7u?8}cWwJkZs2@EU)U|{|IH*L!Qck23oaHd4px(fwB|2_x$_YKg$rO1-+wT;%l zQ`7tXR!Mt3P6M2(&pepC=Hh>#e_xW77aS^%7ub~^eqd9yzkqI;iK+$w0LJvVLF}yV Q@Bjb+07*qoM6N<$f}^baNdN!< literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_line_add.png b/media/img/icons/silk/chart_line_add.png new file mode 100755 index 0000000000000000000000000000000000000000..5571a5ebc987ff07de879946160880c5482a09db GIT binary patch literal 655 zcmV;A0&x9_P)vZ>%h3)%~ z#+IbJ;FFDG??-c+T_21rm1LV#4~LF)_b?ghyQZ9u#u#o3H=L6>&|AoXU?qv@1Je4>AlGSTjH9nQnv` zZj`d7z#wVmBfa>gsDTLdFI#`gwkE^?tk-a$sPvRx(fwB|2_x$_YKg$rN}ONuWhvcotob7gjSb78!u1z zzwz3n{~*w_C-r~-o^+4_-x-{$&pepC=Hh>#e_!H?PM>PS|J$z2`Hu`XU789q;6H;y z#qk2W(!&pIiuM=aGQcuN`g`}Tr2p-^62O| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_line_delete.png b/media/img/icons/silk/chart_line_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5b0aa901297c4b1a1c2654fdad228e19d53cfc6d GIT binary patch literal 675 zcmV;U0$lxxP)vZ>%h3)%~ z#+IbJ;FFDG??-c+T_21rm1LV#4~LF)_b?ghyQZ9u#u#o3H=L6>&|AoXU?qv@1Je4>AlGSTjH9nQnv` zZj`d7z#wVmBfa>gsDTLdFI#`gTJ`Gy0&d=K|H zvHaWV%KQk3D^LOv=wAuPs#C}8%a1L!Ejh#q3@ig+VEz3!ZOZ>!cItmG7F+!MzP0!N zziT`Ge_c`Z|8%zQpIy!@xeTs#7Ycy>eGc^R8=!wnkzMp&+i3keHND^a9NE8o18V+1 z$@l;Na>4)q+Z6x5?sE9Q(}npSgH!dH2b0%a{15c+OI*;5By_w^G0LE;P! z6~_zgN)JD3p3giF1zAS%sxH4A}orI5s%T@qwybq0q#~{rhaR7ospkimCL{b0%002ov JPDHLkV1g1wP}u+g literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_line_edit.png b/media/img/icons/silk/chart_line_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..9cf660733d4271a2be337617957da5db7eb23b9a GIT binary patch literal 718 zcmV;<0x|uGP)vZ>%h3)%~ z#+IbJ;FFDG??-c+T_21rmp^v$%%xy#>Os{Qx#@uvUJ z4|MQ$Waqj#4p|Ns4d{QuWG@&CU+ivIuUTGjviGaX)>?R7Cg2}GcOB^;|x9kVY#w$!%d z5a;oHrLyOz%b}X%{(pZM_5b6Q>i>79I(@p?V`c(RiLP}Q3V{B74)pIEpnpq2g4>!U zgRku<{`vRYq5t3SC;$KPDE9vcpi6E~b^dmv$3g)mDLYl4c`$j+#s5J6z61%($&^jL zx~=N}#qAURKRFrt|Lgte|8Fl;{J%BD@#T$P3nh%a;81bAz^?T01Dm4#;J9AZ>HPoy zrw9LU%nJFxuS)9w(HWlq4>p-Rz0_f@LsVvJPSyVX^Z1niKTl5lf3nr_|Ed(3&pRvi z^oh=mp|*nG+v7EU@9psXy{Fgd;O25&C48wB06Lk&#h$7;IsgCw07*qoM6N<$g4-sJ AV*mgE literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_line_error.png b/media/img/icons/silk/chart_line_error.png new file mode 100755 index 0000000000000000000000000000000000000000..ff23c03a8a9ae7f2a852d5e98010f973f2159545 GIT binary patch literal 741 zcmVNon?^(g@=7(m0P4# zS@uF^lyA;-;f-`HKIhC0gH7U$R&h>oiG-F)j@?nX5Qkh@mGuYg&BrEfcmMRa+}OvH zW=p}!(PG2+bwl=g#z<4SE#Al|b*bb7bv+8nufO2(hu%bOV7nl>{MqIxzvRgtjHSX2){ z{16D5;Zy(lUctE2QuBZ)7Lb#wzzo$RCVpmh(>k7Jg0Nol*^$j_83$-p<9~)JTQ#dAXuGdH1!!Y8b2gkDmG9# z?4Bp!jI`hE|2~51tqZo89Ij7HE3wALeFZ_M@UbQE-tsFk0v__is&pgvkcPgNO&b@D zGTIxnRClFH>W@e;t)xHVuNtHkW|(;O0{p!#-HRp>?P+|MoI$|_+UF5R{H~x>AyR$< X=nrZU-jyx=00000NkvXXu0mjf=^vZ>%h3)%~ z#+IbJ;FFDG??-c+T_21rm1LV#4~LF)_b?ghyQZ9u#u#o3H=L6>&|AoXU?qv@1Je4>AlGSTjH9nQnv` zZj`d7z#wVmBfa>gsDTLdFI!hq-@bX#X+L@z8vo6kH}8K}amoKn){fuj1c#~B)YRMs ziM6)2zRSwWDz&q-<3{$cgk#0gf)Z9d-K|58&^ z|4*7U>3?Nq<$n;{+uQpONDgEONG*d?^_d5g*IfJ$^zTa}BcraSrl#*81N{B{x$N!j zKkwbU_y4(b=l&l$bm;%uwQK)_#6WT&13+pS94d|%*p(iBU{kceKv!2cGd(^1J;;Ed zprDL1_pvLhz$}0$$<<2sYMAyO(5{~^}XKP+xvdis#R~-ty}kh`t<4l z3kwVXS5#Dh*&s2H97qjFEs6nZYHG|tCmMKpdEHM*N%@kUo&6n%e};#L#{sc3ko^fH f29g7*0jUK58Cr#m=F_A89qTKGV%LqLqA&{k|D2>yV7qLmg~*x1@cbjz3zP!z2FhV16<-TNNz zuIz$fLNt0{xWmll%$dUkM1*+|PHJ2ZGvdmC35A3UoF6R(-~DS$BH+@Xy#VYsLyQ>z zxq>v8$ny|FSR~0W2u4ic`k5mcbEIiLksz4Y#KyE{9LLn}_oq&%6$}Oga?Zh83$3-^ zU4V1$eaMkz85m>bTh*c{3ch%tltQ=L4Q7$u>-Ff*JP6K)r(~Ul_41v6uR1rSij#*! zl14&E?hS3Iagod#Oo#p}d7WbijUO{Mqc5?@<$>unxw*22 z?bQuGkPsSMOgEm)qR1=cLLyZOm>T65_V?)|o0p=i_uUiST44Cz-W mqJp!8r`H!$*8T4x&4Leh&Epbde3h>N00007f4xW*L}=Ip56|I&4-dab0EEr-e;4KEPYQmU+1ds( z)h~nw3SOI6tu{|revn>V4-Z^i`bP8hcid+i94)>L52&|4lQPzbYAfu$^gKMU=@0?I zaU3kmq9>ryXb=Pep66lPHl}G(sZ=lw16|k2<#J>)8B|q8mSz3{T-T-7vy;grp))wM zFq}QTkm#J$k1#y9r*rW9_ADR>GfyT^AE%jmG{$6oq${VEhe%k5h~C>z!Z^U?`{UTH zGVi|nl@_$#rkj!04+E{ zDL6%BT11$vkMdx>in(@&)bdalI9wed|6-PG^DKiGcHy)Z`MYYXWh6yJklh61&N0U9 z7$dc47Z|wJPyfvbk?T9zt!|;NfGmsB6cK2ILwFr?K zNQYR|Rf-e`!QxO$i%|0Z+`sRhd)=afDXBfu zp)>e6SDClGd*5ov|+hA_DkBeX;yXW=}-67>L5X~ZT%Y7$(I4GO2nfa{NbKhVN3P6Pn{ z3dlK-`vagARySMF+Tc<#fY?|?vH1X6?m_@a;sE={gTX@lFk4#4pDaEu57{uxZ6o<< z@qI6#O!+5+UtxB1p6~D63y4)H@IO4TRBhX*zW{g%134O4{TKiM002ovPDHLkV1hlF B{lowO literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_pie.png b/media/img/icons/silk/chart_pie.png new file mode 100755 index 0000000000000000000000000000000000000000..fe00fa050a833fade14de445c554b21ff2266632 GIT binary patch literal 918 zcmV;H18Mw;P) z)5~v^RUF3g=bd?{7w4U(okA~6ODQu&AyTU)qaihDP=g^ZV5Kfhx?#trq@YHED?=nm z8X{F=Fli(%K&l}`AXu0%WX=(eO^E>Cfm*WCSBpMff|A0@P&0}b- z@vu|b_butF9--78p(rVogpgvCg!(S1p8cR&zh3^)8!?W*Wjq8aNzH zSpmoJP*=GgH>dKrnER?fW_*%Wj@zr0*Zui{_|PN3iC>TI+Zak*tPO9#w7Q3JJCC3a zV5jvo&RzX%snXq-j2JJCCKFaPcWV{5XYKvx54R5jK;Xmiqfw#6K%KP_V|Ed#`y;sT ztRPX@g88|-V2s`i>)nU8)Kx_5YbwyzXn{x#yz=&N6aWHTQcq{~E~`XS$nyzsS73cG z3QL6WP3FRQEO`2wAm>1$IgG-LK(wkHZA}qNaO(LBV0(k1a%AlSlq*pcu+U!h1V)QL zgVw}BN1A;dn&m(!J1{?U7yV-=mn2ht$Ch6^GqI93 ze+WNbT38m_O&H+JhxUC)WkQh%K3KqM@|PRK9ha^TE=rQe56?E8-@O!mOY_{s^E~~+ zrER?s(gWuj#5~m2gfP8eLrE$<02qDwZRYF#Q&Vl1x2yzvG^f0?x!E#`zrkO#K}6uf z191&uyJ(I-hT*FvIFc>{fH_#|IIB4w*PKo}@s=_t-U8qAV2))0#vr+bkRFJD&g~Ht zCg+jKWo*w;eE?u;o0&f2Z>pWiGPkB0;zk~!#wPeSgJuLNI7oO%#KI^Pr%}w^geyh& z?9h=#00@LWKC|erv2Np98pst8YG{N{93Bxo5>O($wzBNzVh zg|)61U)Dl=s^Xhk-THM1{5S%=@JIV|JKj0xDM_xYzV}>pVm|e*{jX;NfaR@ES)NqA sTB$w0a+2D0+Z&ca0*O=8=#zfKm;e9(07*qoM6N<$f`+80v;Y7A literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_pie_add.png b/media/img/icons/silk/chart_pie_add.png new file mode 100755 index 0000000000000000000000000000000000000000..bf0822ee1c2330582ac8d5d23bb055b7b26b1843 GIT binary patch literal 975 zcmV;=12FuFP)N-T$EI`5GE^Ew&>_I1R3ak8;ov#X^Zh>GbDrnv!rb(x_aE@u=jNli zuFL(7OunsKIn^bV+9j1}lFC9_azse=y;tpcx7d9t|HGG~CJ&_D2YM$Cw^>>B*^|Ys zRbF2KSKhr$%<^OE zGO6quHHDSjS-gp1h_?c6`~Jn=XHn$QsVmyT z$n4LEwA`1qd`BBL1-&ZkFu$UhU9c^6z3czOwQIRd?+Ek_ZFC9?w3D?8_xbdv}_5h=fLfX!S-a}Ro9Hq zJZ+9Xb9QSt(y}p47h%|xtn+hgDTA^^;vQg#&%c^D)qi9@_U-01ZioQ#2O2rOxm zOnptmmU?WDO?~-u*jkq6Z7l$Ac>EvtEjwwWL%TW(@oD_wavWh|3xO>pN=TCFMf{r1 z3$^e4!Z0uMmpslk)(%#EGiZ_dwg;Sx?_4%?L2(!x@Le^M(>d|{ZL^Bn;6 zoa^BF(gc9i9(?0!ZM|+=s@qj+m!q;xZZ20BPA*I~cShc+sCwkhmbzAA;q6>o{FUK} xOU%!$^*#jrU(KD79^iE#2&93&D<3T!{1?J?)wFqC(+U6p002ovPDHLkV1jg+)R_PP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_pie_delete.png b/media/img/icons/silk/chart_pie_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5ab9efd55489c87196fdb984644e6e06655d64b6 GIT binary patch literal 983 zcmV;|11S87P)v*Gz>VKO;FIU(QKXc3 z+_B_gom--t39*w2+QtM2<7}8R@slbx9jTO^-p_YO2%boJ3>+Olw3(aYn~jz2F;(-y zRBTlFS7Iuc!i98xX4%`R&(a)HWD>+;SgD4f zGdF%1KQ|gtPuybE+#9bAAf0CjRd~_3Ca5z)yZ-}>U8>uQWH}9Caa6c;G*_(0aOOH_ ziFKJ=JKnN3s0!0T?x8?tmZK&d0HbUd0BD4=4P3F{f`S(PIn;Y2_-8tcL^g3c7VKY5 zDQ}I0{kWMSAchTN$wpJe4bEr`05pRVTJ2lmX%D`Hx%@r!jT|j-LmWR;eB|5<1gF_YfI-jxIDWqGSg!H%x<$2H5}GpC*6K>;Hk?u!lu{68 zBR+K&+o#T8*}@$x_`(R8(IW6Jw83o4X-R0WB=m&Y5cQZ1Q8=~@Z6pa81~}n}q`t*Q z`)4%0vk%_bv!LTch+e(&>XmKoE|)ADno}yj#W%HjL}LteG7ZO|aLNX3gMu@H@YpG= z-_il!?O&jr*^On>gQ$;&RjJ7LUG6VV&O0Szk8&#kOr+tiSp|m@*p$Mi41zKQOEd7* z#DK1gKyLx~a2lGChUzHw8UXmu51cEtZ`q-arM|Ko>SIpz3V<+3#=!+eQ4I((df5}W z_#QZ&1p!c6QemseD^I?$*z|&KbI~J(*y#wfOqFL&e*vC^-G=ZLX@vj)002ovPDHLk FV1gBE&J+Lu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_pie_edit.png b/media/img/icons/silk/chart_pie_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..3debc12d5ee0b8454165cf2ef52c976c414a16a4 GIT binary patch literal 986 zcmV<0110>4P)jsHp9U>bEUr=&5Gt!&3TRri2n1-U zTm;cl1%x@3A|OLSg|^f}FF-+{1yod0sQpVz1#)bOntA(hlJ~=VemUpK^H2a#-YZ+5 z>UBn&kdmt8w((kz%*HfD%pO)S+QMpr`3J9NE{MJIWa0n+d-UOvsY~$@YEBN_9;ij5 zr3s4R26VjC;)=E$gp4MQDIeuJ;f|#dW&KxiT+0XdQ7UTs z{>9!)JFSe8;vXYR&DPS^ad0mWf)MF~J^)0W$%{{`Pms;S%@7$SV5y@Ku8PL_o>E9# z#MmL-#$jI=l4jSAL17?KaOVYRX&vNt-owT70C!)3qW>0(Oqan_Mg z#Xg;^LgUY2;=b9NIy~ovh$~egSD-cx? z32ORpTMp!z?q@5Wp;}{ur1Ba}@(?_}Aw*Y+KXm!tVU(lw;jSB&I>cy_Akycdvabf` z>P6Tj__c(Q+e>%%byO-RQCwYyv1T4@`dWZ|ib;Jn+A{;5Q^K#)ZOZ3rTA; z?@OPI4RMNCV&ycGndA(nTc>DyR`W7)%vK{GbB+ga3?75kJ*Qq-1eDT)GwQscpD4SE z{J4I(RJI|W^}UPzSJrfBC`qOy<8{bBjAnXsCJYIfbGBn@fC=Xa1NNRo=<{hH7zxGm zL!9~h#G*IHjuyIDEZ1wH0FxCmSmk9HWNyJ&2k)IZ49?;Gcx6mNw#aC-<>w{Ej2yhi??9k?7RKdx(!2B zqCWt;1*Reb&56tLupkh%{LQXE>D=?*P=#J!JtmJPR;}?89P*xXwM*bqN7bJfg$X9H)NvVL#5#asQu*UTQh1&55X+otlN8~^|S07*qo IM6N<$f|4H26951J literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/chart_pie_error.png b/media/img/icons/silk/chart_pie_error.png new file mode 100755 index 0000000000000000000000000000000000000000..7344174fe9ace47ea4f47bd3202ff9cdddb2d8ae GIT binary patch literal 989 zcmV<310wv1P)ZI*IfwoU}x-gg-1~(b99V%+GpGGY8 z8^{uU$6!iFWSvjuhK=!Aj?@%GQLY!1(0xw?gl=S#2?r!Z)J&dX}_ZNc=!eVprSpJN*DI5EHfY;rNK z{JLiC-2$!qnbPnM)X)Ben+q?2aRr=E82}VrC--{q^h9p_-8I7qJ9%WX^h(p5_bs6( zk~{VIZs-2(c_n3AkX>Al8rKI%`|9xEVIepp=_eC3@@@CPwL|S=;rg5Dnqbq6d&np+ z``D7@z(SoB-j;hi&zI+i_4qrK*T0FK>JJ!6jlp2#djL?n(vb^7CntqY&KTkHEF)YF z+p?hC9>h`=-VW8iDuebRcBvcN4!(~((hKjRNlhca0{|Q%qbc@M<_)$rn#HRsK$63- zH3HqQ!xf6W?90(%vwMKBVP$$zvAYe2YGSk3n>#50IGmrKow1j+1JbQHkQj!us2CQ> zU~ZEMe<%W5AAqn4qAeR>^9i`!DXiPv5;PfqcU22ZjeDLGlzz#>YbzG3B{-X&MbUZ> ztV|3-aKx|OLA0eBlDr1+ynsK?AA2ZldyllT#`)?x)nfecXlwS-jR!Ah$&L{Sa~^qdNE1k7nZ!vgDnzZR{ZF7F-cgf}WVh* zAu>`9<<2tvIX{h?Q`hp+kSow_~4Io9a|l>H+{N+gjmJ6ISs{@ zvEQ`^U;g^Znlszc;+CEpZK-v6r~cW*zYFHkfwQ{@0YH9#{G68w)?e=0io0e6zpUTE zdS(N)&Ja?IaS%e^*6l-YY%eeLR+JQ?&hG-HqW|z)x4i%$Tby<`dsz1}^#;-R)iDL|i(5|Ai}a z8)NDZdVO^1K5JAV!6JFs`8>E#At+NGEU@U`zs=lk8oD>Q%qf5G>_Twh(3*b2wx;Hu zw#J?rYB&SNbFeHMl;q$maUii|LU0;=01*1cHxoDdF3#6|yM06Hro@{0(J0er-9_*Q zgA;qBKV>$S9bjoUYUmJl_{$MbE@PKxeYLfA{-8*y}cc6ZEY}3liFe<3;@N&#hMBL&Km>Q)8S_idrA7* zREgII0GB;($eb1Q^z=a2bpQY%1hOotilPhxKq8S~(xY$eXxP=PS5XqtvlD1?fN3S_g{wRk)(4-XG7J_gj+*DHR%zfsrqLBlZ0G)+?g$SW%= rF9S%FmX;0zaB$9Z$z*bw5Yq7Zkp%;s8}r$h6cUMpt8KZ&`memftw9r2BH zXZp!+CFaEnJk?xA$eKJbHrNPn>;Axd{TeCT;zL2Z2lqOE#$fse--k~9GCAnb$WrIY zUzF=05;%7ScRp;-^ba=g4+!_yjOVxZHrAy=-Qy;3W{V_ws3i3@rj zN6Uq**d4Ifp5hMksmBf!JrmJQC(GkeNV1GOW##ZtQFwF|H80+P{}RL%{YNk_%ft(I z#;Cz`v~ti@ZP83cwQ@*mu2Dwn=d>z@4RV(M%#h6&LDo!N4vuc zo|;?G=MQ0U0&vMd?WX`v6t{tSSteePbgELlMO}xKy8^QHBD{2ALkbX%5TpZC;3a)d zD?(MwgLzpdUa8!vFvP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/clock_add.png b/media/img/icons/silk/clock_add.png new file mode 100755 index 0000000000000000000000000000000000000000..598b839b818bd0178517bdd88669bd8f9897a5f6 GIT binary patch literal 925 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/clock_link.png b/media/img/icons/silk/clock_link.png new file mode 100755 index 0000000000000000000000000000000000000000..481cf04c12df9c3a81e58f2b660566059d55eae5 GIT binary patch literal 961 zcmV;y13vtTP)=R~W}{mY5~mvTuu@_L=O9S(e2Z7eNN1X^TnY65PZkMq2E!Myv#IPD|MoT56%$ ziZCq#3bD0~B5HgoEtjrXkwUE?RZ5qlvz1m_+VWC_|IRsa&2I9$dG2$b|L@#;aybB8 z>K69_K}qlu9uYpI{r^LH8{enx)0?|Yg zbBPrEp#-|`O~W`8#MK*3@b+w3o^1crL$W#SAdX+Wsj0U3(C!SvM0TUs+jtz$U%kc> zsVT{I;C%ly42~B#W#aKuhwC?X2K2VCZPZb9&4=@M{Fo#=r&rgJOsDaOu>%nzT3B9& zyj@u+eBlL!%m_fgqlS6R2;{u%7BnBYsdc26A(AKW2jbs!pXq zc^yaEhH$7_i~zoPN$R2h(sba6MQ2#d`+0xF4aI$ zRRfRDhZCpkQCwUMi9`auUXR+^T2>21B8c}NN>YhJp@?Vy_05u|a^YS{MyaZ2f}_ng z ziy5>oEG$H6Y3U;>C@(LcXW{<-{?7=>fq?=nceM9W+x?0x=n};ZJH45VhjX-Vl@c$LMez8BK{Fk5J9h%Toeig^+qC6 z^g__y1W_;*DNWEus)9z4+SUg1)0oC4joIC7vYAb0XU;b}`+2c3_Q1J(AKvr697Ai3 zH*T1~Y2YLvK!56l7Va8v+-L?a0RixG>V%#HFp6K30Nzcsz4YRq_Sf$57eC9-uDbJI z+2<=j_l|yQp!}SfX=};ElTC)qzVjC_&~Q>O8@VqyWgQuO(>nBgYiV(G^Y-#w{QK4m zj+2b2OH={yLlfnD9M2Av4ng#OU5KV3IF5B}2ejooI)NtPq- z?`))DuZhNB!;ScDc8#zuMrz|c_j;p}*q)wF>e35_)|$7^U3@>*aQLl`W`_pRJbS#I zqU%!deA-%D0H|pAe0+hbqsiu1DR}YsK7QqqQzpP_rS-w8hU%8$zOE+96-^?MVB))P zDY-782$v>)Ak(!UH}B({`*2nAQGhsr_+EEK8MsoVsi_W$G%4HW&e9SSmw#gFkLx_~ zVS6n{=fPHP-MB_}Wreg9iQQRe ze;78NIdl1Ua|bY0+A3qjt1M>AM1~2bMehTB#7u)sCPPphzK4|c^OQp@1yvu|8^`1Rql9jVO^rWPyq`j(K*<%v~I4%{UU zM2JGsN-0BY{XYQU!&i^ptgo-P^Mzt`dh}*&#;`GC7Eh;ZfG`X(tBR_Q43XNODWz(F zv9YlH Bw}b!y literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/clock_play.png b/media/img/icons/silk/clock_play.png new file mode 100755 index 0000000000000000000000000000000000000000..fb4ebc850a94b2c8c59502f38230ac54f164dc7c GIT binary patch literal 943 zcmV;g15o^lP)GE3cNY&!T;=j^f;gxRLSB zG&}X{iKV^(TLqKq((nH^HB^n^chQay$`D@KFoIjnHWarF`VjOrt_N+()gGrw;^Es) zekWfGF_*F4W6rycY4)M|Xov1W$d9~teRyOXfP(u9xvB$sk2`Shbq^GVew4gr@kzaP zX59LCdg%EwGkF7;F9pnouEP1|#-f#;Y_{cdNG`6*NqK5QVM8yJbeph7olboIHi!w*0{lB+uni}?Wrdw+^I36lWz9>_zB+Q!R?Y#*eJ+7IfA?SK}c<`81b)DS%WfNkkdw7agekd(LJt;LA} zdbHK;#S3jCdh9L?O#>;7i74;R$JJH|5^G}+nRTnh9}srxzBoes97%U|kSfg>rh$!m z0rw0++Cc#)*?5$g^H5Ak8dDIh+>J>2=C!_n&;)r9(Xr)x6+{IbvXosg^g6)PJa~^6 zM$(5Xqmkbs!zIIM{D^?Dr7 zWwB4O8@cTnIMbzn`GdXciH?#bSZFs>;4sc(r;{{_Ow*WTd* Ro>>3@002ovPDHLkV1hPn!1DkA literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/clock_red.png b/media/img/icons/silk/clock_red.png new file mode 100755 index 0000000000000000000000000000000000000000..2842cc3386709236ba7608965c716054c08ecfe0 GIT binary patch literal 889 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 Z`4?5=&N;mrg`ofd002ovPDHLkV1fozjIRIy literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cog_edit.png b/media/img/icons/silk/cog_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..47b75a456a4bb1487dac02c60b7e2e9cb5e210a6 GIT binary patch literal 865 zcmV-n1D^beP)GR@vSHz5C(pPxHny(nM!6aSI^7R#-{J~?A^0H*YCdW>wX><0M=1!YHEsWHk&65 z2EzpTxW}DK*f^ce)R~!?WFk%?;`Pu5C{Y@ z9*YwPJjH96dcf=xJG z*kl}##L?N=83%;ar!Pg^cVqOf0lN#g5Vlp~vzQCln=Feu@%+Ain zAxsXvy}hQ%p)0kKIRWUX89RYeM1w`x^47xBl|kR;=6}n}%d;PbNXFDkg2d$HB$&Tm z{utC0|DU)7(XWO0;TB^4`9-wVaC#H&fkYyy8yXslc|4xD*f81w?^q4!T|J^pT>J`N z!zOX^g^2B+#!yvN6)P_<|3AiofdL_tJahBjw(;Om)xxQMf{?WUJ4;0fJMO^QaUmuX zzldkm(9nR~++1P8J!ouf?5?h^rbixT09(uOy~>BS_9Toi+4ykpEG-e7Pv>wrR8CF~ z&1SQ^k9z?Ck8E=Xrk5^E*cXKych#SXij`csx@x zGc!|URR8Z@-ez@mRk*aYR7k)D1f1O3+Cn0cfYE47n$6~dk&%%?lgT7JmVkge2$-9n zpJ&`|cahWSWTMe1B9RCPkQp8xE+RzCz`y|4+uPfbN3gQ8A`gedNTpH;g+d_UJ)6yz z4Fm%4`~4Ui8p;yz9;plr!(e=T98FD4@*DwCRS>UPNT$c> zo?c&Hhu7h@aN6V&1tPx8*gZ6@Cpc++uq*h z%caUBNc8pfL9JGoQH984W#PvAo3T{LfK|&gzA{=34Ob$Oa01d}ZgX>!_ec+@0!bWg zZEZY3$Xrps^HGnZy)XhpB3Q?|L8|5NS5;MU0@4z1Yinz~tE(%$yu8el&>VC+oqM!b zUL6>`@#Ao36o+40kdBOD!6?DqJJo5CNE9zGFZbp`ByG}=Ao-x^>hZYYdRL3xpb>|0 z6`ap5;#bOuW!+V@D=SQS@4#R%DEj;RvukT>Jeao2=Q7}vRgO%u2W+?sPHhPeVp4pM znlagO1$C0!>KuVyub0#0>B}QT(5O{=_V(-eMuI!|d>{K8qCYcqi&%MqnBx`RKD=zn zdk0FTvZJ=PmaD0$VVtk8J&HM7koo$CSKkj+5(}mL%0|UtnPE5^&TTuC#b@(A6Cn_a z#p1%bmzNUkZUmXM6^BWZLDKNgG~wu{ABkB#Z1U5FW51~DdFk%7wj^U$U*M)x=Q;b+ v;*9-?keyPTVF`$}%1*IX=}Fe|;KcNA$#nLD6jKLZ00000NkvXXu0mjfo}8uk literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cog_go.png b/media/img/icons/silk/cog_go.png new file mode 100755 index 0000000000000000000000000000000000000000..3262767cda95a217ac8d3fabf6c4bfe3514fd770 GIT binary patch literal 859 zcmV-h1El-)HU~Z@BQ7|ITsWqFPt%czwZJk^u%JZL0Ogu z7-JwwQn0tTclx3}?kvID+L{XidsxQ^&e&|W7P?hu`JbU6)Keq zD2hUaNxZkB72a$%4^2)^`UtC|A7te-nGAX1Xrjep5qO>_@7ffX%SGn`-ED7gLpU5( zk(@u5K{Og2Z)$29rKuELp-_NyIt_Job>MI~K&R7bgynLX>`sh~jA#lt3}_YQwqglZ ztJPR4mEiF3kO&v?|I7ONdO%xaZnyg`4MVH2u&{85WF^F8xkx0!oK7d7&*!07ENT-s zHZ~xYO7;1CzImGB_xm6GXq~MiVV0C|gzZGQ)-QC?rN*&h*fy7fxUu2>pgCsM)-Q?tMb$Vds z*E@*sEW?$R-d!Zlo`yI#H#gqa);3B?D6pBWXVBO67?`R6Qy3_qLZ+|_MxhlJx8`9r z{Xs@mdTouNQ0N7+J#TJqhNGh+O#w+J@OC~45~`3D2_z=L-&zrFU%dy%Qdzg0ic~cM z%s{~na19L&^isj*=4PpCtqL-e!E)J#V5X7%DWt(#}Pq3W$oGSy^Pc4j%jrk7_ z4xV5*S(C}slXQfB*Dx$m5ut)=uA6Vdoof#vmX1Pr{o_H2ueAT3P;2Ktrs3gX7h2gv zE62G1jK||?p|odbXLH|f%y4eoeRKHd`|tRw^&nXM?`u5!c)i}iTrM|2E9N*Z__gcJ lE2dmBR}@y4olxbIzJJd{=EC=vF*^VN002ovPDHLkV1lGDi4On( literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/coins.png b/media/img/icons/silk/coins.png new file mode 100755 index 0000000000000000000000000000000000000000..0ca9074d66e7a008dbdd265a48ff37f454941be9 GIT binary patch literal 732 zcmV<20wev2P)7$(F5I~EPw2+A2=20Sy*#|n7r8sf)7*RgqMLv3&KWmL+^F4r z7i0Z}>kq&FSJ~Z9+<5!dQFwCOz1ndvw%m_4J#=sT@Q1U19`B}1iL1?~3va{ZF~|VI zfHw0WI@T{zdi2I_>3m@YYk3d;l(JU>d+bPFLOo8G;T$3)1!qp*$dock%HEEk|V0 z3L2&;r~p>tQh+yD{T!MxBF4;%7xC6JH1CtlE}+w%Xkuu&haUcdHC?=ZKr(+GZJfIQ zJ6@GU%>XYSae67{=&NN{rB<>+N;FbBA#_{A0WZW7cXJ0E=}(_?dx9< zr?bEW55s(NboZ^^cb|S1s~AxnBh?-gQ{Ob@*3}OO`vCi&FRqICO$~lSg*6r5QDf7DTmJy^bFNy&p3d3; O0000Fn@9 z6}_p-po(}ZBq}nQNbG73P@(2?NiZt6&X~)Q>%%i4kr8qQ=3COEo>Z8 z*gxJ~L9Bf2mp|AW?4AJafQ|B5v`GBm0)<^C(Vi8&d>zzaGr9rvL%;kwm?qdJ*cN`F zOcqt~+Pr7&1#Vw8>eV~{)UEe zBiv}!KK=I6or}I0!A1+%jcFuZMU#K=`u1Z}C8^y<qlji`q{QWr=E3G!ag_G z_nO;N#PJ=nv_`o0C*ktKkBxus*Q*bvceNp!u2=KJyN6kimuW;5e!ersP&@v~d3bGL zL=5kUl{40IL=1Ccby6%>#?RN60G7VkIr73|1VIEh)s6TUxDXWT zs&peQbYX%;a3Ml#B!N_onSc(OOp=+*$GtQ6-rw(iyA+ctc;M^~59e`ImCZ?K$0t?v zp(>*);;E3R=sd!;{%=9RgLFV+mBTn)0(Z^)#jt!uQqRedPJ=Z z_@5kt?prW*$m+P^HpIy1o3}jyVnLD$PPPHs#dek;aj|Br?*BYcZ1W$omHSB2M&brR z@i1cGBOeHEI7Tq|C7LWFK_8-mHL?|u%XCHG#2bU3EBl4g;}&n{Nfsg9Y@goGG15*HQ0<^0KM#w90$_`+XUOjFN}~y z>v--w+G$~<7J)N@&3Y(U14x9LHfV|@tB`guM#v3KqWLN|tg$+~LFF&Q;_X1JrxoDl z(J6Do7bDnc0lV=ONmtP14c_1cHdT_^b2N@vd)6STjdAGA&xEA|PG@#%&-|n5>rc)W zCS02-PEf=vl<@n%z#sSq)M7Fv9NtH6`!3%6U1jpSQ{)#P;{0-&zVbcB_ZFSFW`6Xo z5ggYgix<%DJ2YJ(96NzY?~z4o*m@OH7xJSeIC1g4`_)}Yo4~gjzjfATPUW|Kg#^Q( z<;X&i|^ZNRWr#pPVFRH$(hHl`Jc@d3urM&Fn54lrL`PX7e3_ppL@2%x)G0ch8 zX|dcoc)q>_uylL4RGZ7+*(k3aAtI**(xB))9@w8d`yYJHm@9=_7d-#~002ovPDHLk FV1nt|Z+QR! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/color_swatch.png b/media/img/icons/silk/color_swatch.png new file mode 100755 index 0000000000000000000000000000000000000000..6e6e85212b85b7ba0918570c2ebede3047596237 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5iLZjC;k_h{kHThqfC`(hFmxSO zSd?`bB$R({-*5T0gITA{|Fu6pn0eqpx>}JTL$UWimE@yNe}L98c)I$ztaD0e0sx43 BPNV<; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/color_wheel.png b/media/img/icons/silk/color_wheel.png new file mode 100755 index 0000000000000000000000000000000000000000..809fb00e5aa1f28726db3e2a5adf8f536bfbcbf1 GIT binary patch literal 892 zcmV-?1B3jDP)n`HO=N{yXhvI{h!_0ot^nS)JXfldwbvK_6nsG2Z&Wi&v@PQ zheULFT39nvnw}fe2u3u2dsOe=oVI#j9M1QC>zmd3XI9C7d+1ER`oBP|zA^0tJC|RwkIug^e1fA zX~N2H7aFgMFJ&|`u{>vFkyaX=K50U-_$2WeLXrR?y%y9osP$m;9(wLDa(L0IUjO100%{ufD~Y>02&pjbm4v#?whc82VKwMSB#SqZE`$mB-jcCHlU+0 z5!eC}fZ@6i#^osNm{8QAUxQqp!Je3uR3kxXnuJ~O)qerH3OWj$UL38Ff>!fEx(x_D ze9vUyrvmBUlf}BOj>p;pw*yU}8i3vdQv(|vr;&lW3vL^{HjGO;yJh@AvLL%V=8X-d zj-N^keq9GM0OdgtfE|S-5NpMdyD8XjL8D3d)Ci3ms|*JAHOZR#{F@d3_1R~2nP^IO zx1jHVVL;UcM?t(JNH>#EYr=^m)YgmC{@kfR@+(bUGOoFIyidRT#pP%sAgjUt2GomC z-GbUC?3chRN8#8QO)J9o??pQO=z9z5hjj@+!++`xv!lb9;ml&Wvph&Nw86?bNyh%=cqNQD8i+$LPB!e5mg zGpxOzX7}R-bs>C2a6nYto*kyOG|b@Xj8Ib}DhS31*TztPJc)IANu4e{-2WFIIaS?u SuzCdm00004%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/comment_add.png b/media/img/icons/silk/comment_add.png new file mode 100755 index 0000000000000000000000000000000000000000..75e78dede2c9cc3b789b880e5cfc930e60bf2c91 GIT binary patch literal 530 zcmV+t0`2{YP)~sR==D{nWel_pb&wQ zmrP)tTX!KGk)Sk|wtZaUrliFMw8)@DB*yUg%5WWG5T6(V4-98P2Jan%`$mH2CMxfq z+T@bruYw${Wles0MWFb|;3xR>p5Y`0A6-c}5Tk;D`5i8(NGiA>_&gYcZy8+IQP@fF zZXmTF{tLW(AMNV7m2gb(;iZIqf*k=ah{%H8=`Ai$Cv75^d>yNTn3+NncKU5>gAg(yWFU6q^MCd-9z5C;@-l1LJzY$X{vI4G2|m$FQQvK%ZWWD8>- zgBiw>v1GpI?|EmK(9D?Pt^eVDzka{xd6!QHK=zl&{!Nfkrw-)wa9%lZ5e+BOkzk~6 zb`NhB39iQI(vgtta};&~Py9F*i3oR3gsTUF{+^(_C7hTDhu4ICg9NR?Ca>sR5R#a$ zg0P~t8SBSO2K9G@Glq|E2nQeV&ZUGcy-m>2zaj()4h827pPD{kBVq5#25&OFu5&K1 zZ$Y$w#8tIM3A+q$Ur5+scugk+7OSALdr=5t9Uh{Pd>x{jwKK^o{&9%j&aTn&d1W2y zExSmgD!@cq5T@eg7*6z|mh?c)uMdeO+6$8zUDcUbEs4eRSQBVl4RdcXmJ6d%lj=Y1 z3T|p2-xQrZ4kh`~6T?s?0c8O|Z8(gLap+Sj$Qc~LIppMuxoDeKhQFQ7ZB;NPdEKq| zKERb8J8}SqUP@&!aZd6*F{tz+w*;+OA#)3PQP7u#!%*&pgIo_xCCgEt;yds5U)P)+ mI@7OINTTfluFUYPSbql#9Qmg?vhGv>0000+d`M13jj6(1&OTfK) zg!qUPVgGHUxLV}I1}ul#Fzc;Br`N~2tN2UM;u$wjO|KGs%@7Q_4glGCOy56_G3R!? z>v7<%+Ya@+0M}rU362yLEYfg7Cb)5SH?+V#Xxtre9s4nKZWn?f-mEDouwH?+FD?;tGeKp(!2F0zvT?C)LP^6Ev*qJN7M`JO$ro7H zs9RU)9gY7Ht*ot^&vZXZDa)Ugf&)Yg1xe0XL6y?}uVE_`?(Q9lvEUEN#mz=NKU_+g eqns}GFZ~5YF8XjkorNI)0000kO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/comments_add.png b/media/img/icons/silk/comments_add.png new file mode 100755 index 0000000000000000000000000000000000000000..b32563442dac029c917d2904a9b18699286228fa GIT binary patch literal 648 zcmV;30(bq1P)+T3bY=D1?}_NlY?Ho5{==PS1UvlqjYh_;~Z)+;i@`X96ce<835NqD^>4 z&XOGf0{;@=hx@N*ld4p4l~reDjUrhpR@CV9f@0l`W(F}47g(HMcGd5)tFmQBWlN4) zva0$#ktvJ8U{eF>D&mYUS}ayos$i>R-q!og44#*4SLN7QiqjOoolCvH@_0Ib%9!*{ z6Iog3kb+N=+>-pnU?fMOHjgh#DFJzSa zr=~gCYkDH){NQL{E?_QTF5oToImZ%%?|Kft>?cE#_{4{V%E1ld`g*!OkTk8$ZoV> zKJX^+zklnS93z%haS*(H5Yf4Nh<wEBWegKV6 z>~o(OY$)C;Hz4-DOD#^Xc?KafsKud);N~}=u!W3~T`atL)M&$9vr~7LRrWkLHXNZ5 i7Wa^nT-#rJc;A#1+9e&U9~QBdhb7i%XEvtC8q~e*9 zTGor!c}UBO!Tp8?(pAKoEsCX!Dv~OwaI#?S|7Y+#Qz)whJ4xaq8BjDPqnKjt1re<^tvd-qJefSYq(anuCjd93vneh6K+h(i&yD!a1MnYqE;KZ-O};W0OdWKgI_pLK zle)Hr=PlJ{;*D|xQkXchK9;-N1yEG%b|6WX&N<<4bB3E4Y$IN>=XK}S-Z!3BGt%RR zcEyG7o^?>|EvvpZ=hdbo)D!63ewiH?<=TAz5V4&90#T#$5FJ5q1^@s607*qoM6N<$ Eg00gme*gdg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/compress.png b/media/img/icons/silk/compress.png new file mode 100755 index 0000000000000000000000000000000000000000..8606ff0fd23c97d71d43afa0bd587e47c1e90441 GIT binary patch literal 766 zcmVZcJ%1+b$|lEg|m$p?$2s-?aFIU^lhS4 zt=5>B*onJiX5((A#g&zdZ;7N+zyNUJY~v8{(NtqH{`+@8xk&m zG`u_jq?FJb9n=hw%`FbbD_m;*4&fCDuR=V`pUsP7fU1Tp7Q?_nK-IQ85K85YX7gRJ zgwtoomKC%RWTO%Skh+*{%b>T>VfXA~9;mZE6vn=~?YHE7)8Zq;mfF}l;^WAReVKbv2dyl8I zZdsNM9oTISwn$ahzw_tMS*<#q^{;+1adq)i5#6)A{L5!4^#~!-uOE5i^$%Jv0}EmF z8*kM!$D7UP9;w~?<@c-q)vuj615`xxpt}~#kmfz_<a!u4Ek1OWvhNg%r^rdTXsY3VK8?SdPP#w89em&*t9`8-y> z{{XWmi9uo#0y2mREC>R)tyU|D<2Xwun+7u3ce~yHC8N{n5>SE*7ca{{mxCuK52M#x z6?VgqVUHr69iApkt_fp7}UIJIX)^0!0b=W3KH zu#9)c?;$B!KqeOeo#x5*?d$d(>1am)Y%kbK4HaZEF7DqvCglmk2%DRMFl4hCO2bI^ zX=T@9j!era3Mj9K%ggW14jP4g$@9D^u1>q%4oF>&Q{%YG^bC$1Iv|Sn?VXTj+j1A` z_4;iBxjK9L%sJ01;N^>_f2ih9=zM1B|Mb6I%0_FShXA!&ZGuYnYi{m5Mm>)<#Bd!= zpw*3PwK}@fZ5>`FlHMWvu(WdP)7sBGH8?p(}ako9KYX(!NC_${+66f zCL^323pYiGbgW{=R3}SA9sZ^M67CqjK_%js%5CkR;me zO?bAIxNg3Ro($a-cu31+pwdB9n{8&kSIhHe>aHBjVXA_CRI@ z^iBXW91h1XCKo*~ZXPqvsnh6OjES;@0=+mMNtWPHly!FDxdig|gWCPa(Ea&26soIrWMt?>>7bAgsH$4Y)5&Bq8mV)C%YB7Y+Jw5j^+Hk8>AUFv z&`yo)gA$EKn@UpK+S;xY$oZXByDL@Ihu$X-O`7@r?DzRA6X`K2l^#WNxC<>WFJptl zO&yXgxs)7>#kLY#ED||;DijJqRXu2EXxy03=c9(D--^EXGrJ@OqsiBFdd$}K z%S6%_$lmt!JU(1H|HXST8NZXhS$l1}(mg$J6&O${e1)u?zBm5_@-L-Nh&J@-00000 LNkvXXu0mjfve9f* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/computer_delete.png b/media/img/icons/silk/computer_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5e9b26836cea5f91bc94770592555da48addc64d GIT binary patch literal 775 zcmV+i1Ni)jP)IB7 zSr<&xRLO(9u(h={_FdAy0EUK!3MrvO*Y&f3KmiO&g5y9$Q%*Rnqqp}J)W0Ps5{YA+ zTvAd}77B$hJ~0JmcN`av>kyC&o4^difI2!lYS^~zClf(Ane0=k)bElpKc6BX2ZxUw z7vEG)E-$Y@I=vv+U4C3v=?dc);zUun5HFrTLsj)o!Os7L0!HQJ=8iapNsuI(y-9es z%;F+$U)e1f2jlO+YD-U^_7t#GX63+eQ88p$hD0W3jn@p|Iv!*7_8PHvvwI-30(vI^ z8H%E;Gdb&d@a8e&oHmZmbX1fj6qwoeNU{V)RrBn^a|z_V&UuWTpW3mMv4jc%z!Pr> zm%xmXO$DNUZ%CM4u*7P0pc^%V?Wpaag{2o`$?Tx6NFIQkt&?r+^PlIUHWP#Y%SY5* zYC<4Vg_YqxjJ$n~vQ*du@cC5Sy1YZQ$22W0FB?L#-|wR`Tr9LUW80ZV1jk~)n;R%7 z)Umaq5|d*Is8rXTSggM;cTmU|X_^+{?j(~*gVY6Tf6O4bIRcz$%BxaaN}(A)vFM9Y|u11$~II*CeXV}4Kt5h{aWbSmSRg)zoxZBrQl+iPQ*@N>AMLYl{sL3^s-3vtl?VU;002ovPDHLk FV1kc^U#9>7 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/computer_edit.png b/media/img/icons/silk/computer_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..34c72fe521f38a62bafe480939dae2f09359741f GIT binary patch literal 792 zcmV+z1LypSP)XJ>QW+#knvSxsA!iY&~)5F#Wfv4?&j69V6gpqF|Hdgwi*2U&^A2P1m( zwG?87QWFXzm)SH{C0BiLH?ek|m1O5Yw!w`uF@yv8xr+$drk02h8dkA3A>-Bayoi1nu1j_>3O)x&67t!cDh*w%b$)ad_`wt0-nYz z$gd87mrOX^^$_z(O43yqS3?&~1nYXtlPyu*Z^3uEo$G?JCw z2)JvCWu%kCA)@!zDOMiCFp*msLv@*jK+|RDKL;U5Hu7pc(i30sBX}EzP{CBw^hHw3 zzVY!7?WIPs*QV;*&xB;du0eX{DSQD5`OG1tCS#a&UB!`x<4j?&x{5X1uDj6R-+w=( z4M%R=eTn&@2S_b{g0rp}TWhK@wbktSr8#%Hlp1Nmxt+TZiA1VM86ykHb?Dzm5Nh!m{6#539VR9^r70wOi!1tM(B7`KwUjX#i+jVe(%oN_dd__z0W&E2!a2tNF?$& zm&=_uO;e`~$}+OqEa#`nzW`#fSQ!=cdA;7##lLh8M%buc7~~I2w(1 zak0<+Y>&vtW;+D$sO&gI#7))$ATa zU9cUVsuuX2&+zGCJO62`{m0})2F$%Zu9IWL51X?cO%H%7| zR(Dg4EnSfS%*c)6m`dblL7~2!sU1V0^AxZa!Nik(?7egoMJr!Wj0OVmZz^y&blkbP zTiRoqIi%BM&uRjdst0Z(P3%ds(}uP35j6*|A^qk)L~dVR0d?~3$jI9R>w`kM+~aoD z)QKT@+t0#Ik5la`T6-E`XJ@d@l|UeP7%M;D$zj{_U+C@ay-Fb6`|FiMenUlNy^~lc zNNyIBFXIFfgrb!J&SMyTa0^2-waE>Da5!8+*3ETvbYkuObu{+egQiZC)Rdgh%|&)Q z8!-Dhip1dU7aIVfP)H;B&3_5|}IFP3a~35lF6iQ+x8YRd8jCpeL9`~Q!*A8(?sN;y`xk9r!hDb z3S(($Sw4e=s0v(~wh>)=PJukHoMj>utihA_H!)**r3y*F z8yAFA;E2`R%VhpvvKL`GRDH)nFk+$7yAL&0O<2ukkpBLL2s5%Pl0Yrw$@Y0NKMUb{ z1MQJ>u&M91V}nO1wLFXcp`%zc)^YjSF*KOnd4iG>4c9N!$@ZA0g=|(w|CAxY-+oPz z5}FTEW7;NG^i|aDZpNCK#nAd4XjI8t@%Z!O#X%t-@OV7cIXef-wy?t+Ca^8Zek{)* zP+o<^>`RQNlBkYj-Wf>rcKbYZM2AS)kbX5rgT#l zih&_Q(57*Qd{Jm>qlr%5QJbsxdHT2&(JZQFM& z%TftJD8n>OfiIPR5oEL3ASLvKLZRE0l|C4h1lNU}O*!Fk2*bleP!CJaWHRj{IU0@D z*VNSD`}`7wy6bYd+$ACohsX@WfI2-rZ8(loK_MsY+7zg1+Cj@$U)PApMe<6A{HBWJ zc>Dwkg$=3B#l?k7Ek6x>`Bu!1&TuV(oLd>t<6n5 zxpz(~j;B9CxIKRDX32rDDpbY9aHJNDF(?$Q9O79JaK}Z1^AU*zL*8iwFZX~62hQ4Av_x<+*@a_)ES%MJ$$?c~9)&6JsOp}&L{S3ag+K;T-%kV^lPE3> zAs8SBbFUHF_Cggbq9LLLp_n-8ll7N|g5?bxO_5~;PhE$jPogRs$BvUj-K8cZH^xc? ztX!vv*{^@^i-u?bmNriUd2&=lMIaCC=qRr2lnA_D6^}bl%jK~w8@g_gD;L#P4&kjq zc&lBw_9U2F0GJ=#GBMLPhj+O+RO;l@(a{fWyBmct;`jR#wbm4TnBa9Cw-j!^hvIBu zVo-002ovPDHLkV1jNh BU;h9A literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/computer_link.png b/media/img/icons/silk/computer_link.png new file mode 100755 index 0000000000000000000000000000000000000000..3859db214765ad84536acf95b7fb667570697ec5 GIT binary patch literal 792 zcmV+z1LypSP)5M>TH{B>uwY0wtGA0+Y*fG8|ORs-ktON{mwbxCmDu;|E*Xo_NZ2? zjaRExg*?a$J2*IC|5W-HKq8T_P{N$mYW1q>F;plCx(*RdIX0UW3k$EI{4F^ik6-2F zj*gC=*49?6f87SN>$(Bm&P{631d~YsBVG<;X_QobW zTT#>S;O<4i_&&A_R@;63MneHhWmXQfwY5W*Wk_Ul)A*SI486hFcWyvD8_gcbtbpDL zK!(X=I%0Cu^Wx?)WA^wu<_iH)mQYY_jz^Lum=xuZU3e~md}DGA#`#YVQ7+bm3IV_y zH-t-I#uGLZwA3op$~L+j?fCL74b^Bzsl12%{e6trCy^;-k%&hdO=JMMS*KRW>wJAB9qB909slU+@JIy5{V$0G~v?V zAZGjld|X{ccXt>1`};+b-|rW`x7Ur4kzs6XY(OCyGvRRPG6O9xE;`+Aw}a<-`jiWi zcW>eI`RLf%P%4#>&1Nw>JBv}@E!3)euvjcOau>W_?=y$PF??rgN_p})NEayrg&NDp znHQJDW2YEQPfsHl4Au_;0)c>C)3glB@_0PxaXRT(0qJxaYinzwc9+YA&dyE-$!%_K z%HeSM`{8Ax5^^+&7~Q@Lp->2RyB%h;Sxj(ucXxvPcClD|zOu5?LS?I|R4Pk~ZvFx_ WAFY|n`T1f10000zR>QH2KN`fNj zBHaWZEgiB#>49kYe(borqx+hj`JS_1d)R}7LjHa+tu+qg(TC+eO4&q(D;ZL8C8o8; zLEfZxiIlQ~iE1b1qBZ2=VhsA0V`*@y@M|Sc2@Wtadv3g0hOc*O(ADVFjPTWAYz(JXS z8MBaa%aCO{h8lvp*ONKIh5Bg|-DNo^;jg=q=uDZ@vodOJXfu;GK`ze`H-VrWK!nUg zje)ufRUJ&ouB2nYB2_pI=gji&GcuBL=+DM-wBZ)fbc7&a9AP1Ztk5)S4Ah03bqXOt zxx}VdK|CIVljyc=oqO1G{;Qew7T~%?tSw{^mi$E(2^Td6>M8+m4H!qrBtj~%w(Y~Q zVrXkVOEN#2&@(U(cX3H&S97B(;-}{)?<>?0)RjVZqrJ&ONChgCgE9%PC}CSBp!+d1 z`bkAqacXYz!94aLsJZ!K=3b*?T#ge1nL>bsZNf4&8mt(EkXYZ?MK0YwH2ZOI9{(VN z&%WPH*v6AY+yG?)mZ`CxE@5ZK2lW}4Pr-ctMRE2V`yf8$PurT4&^p3q*2kt>M8OM& zl@MbQ=U&8BS_$dSjo(q&2Pyd!8`}{~Xr#A_DDL|G({Ha$;Xe@?&|@q4QbvV}D#ixB ey}zEqA^Zgf(1+rQ>#k7%0000@ zcBf_(#ZX_-sEX?*?9!(0{Bl__G*A>pqqyNz-JwmMeLB3br>{{IMX~DC@qV7t3SKP# z`S8;fU;WT=%}r-cOzypXPb*-3Ew8%sb7mA5#*W8%v^9cO0QbA;S*^D+wQoBcTSq`E c0001h|Fw(1Q4#~PfdBvi07*qoM6N<$f=H>olK=n! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/contrast_decrease.png b/media/img/icons/silk/contrast_decrease.png new file mode 100755 index 0000000000000000000000000000000000000000..0155bf5c0bb0df2d20b1c9d67158f743cea1bfa4 GIT binary patch literal 695 zcmV;o0!aOdP)>d)<)F=Uup^koXw) zd$^lX+9>bw{3ek|{4)BRj2R&K#BR5r2Lb`7+wBI6#iH6JNrK^U2-RwJxmYY-CX>mM z4q^mMa=BcnTrSh)a!CmxbhTR1$z(#u<1wAhW>geKieQ?_WN17d4{Nv`MuK3@;c%S$ zd_FLn%`l(O0SN$!K$c}dAdE&Ms8lM@>-Au>*}RR#VjRQn{7EF`_xn9os}(Q<<^b#U zS`|$%7K@Nhr@`rTg3IM%y?Lb*pi`LVd9_yNtSE|3!1Pk7#QLM^tyT*-j$`SEbpkvD zS#&`Vbf6|IvIb_^G#U+HzNiQFF=~@Arp<&!E))vty=K>R4WkiMF#1zAHdclatdTuC z^#hR=Y$}1i*aB!m#n^+3!C(M3n@vxffsLg|B7xA|BRIPM0)&+sm_Eh+0b-4z3lhlP>ijqV=Y(3>@G1n{ePcPzh>Rb@txK@5f)j3gr^by;*J!Vt3YP?H2^}0d}_~oR8x}F zP+7a)=0c0KaN<-oIn`BFMIUPFOKX}*3K0^y-dJ%y9^n(i;V{Gv`#hA~_=y(=(v$Hh z9@bW#6=DnwYZb!al0($-+uA0}H@EbmB!oc|oqS^W7)FjP-#D&_;wB&h0t_FABhMDX zFoYpm3FmdXFnn@k+essMa1LRx!)Lnj$+Lw8J&aMR*kLPSjxg$cHF+5)JW-pEc15Bs1GuRuW6QjX9FP@ez51?&;seYxIvr*M3QBdYG d7%TMO+&^g%zBmG9R)GKj002ovPDHLkV1hr^w`c$W literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/contrast_increase.png b/media/img/icons/silk/contrast_increase.png new file mode 100755 index 0000000000000000000000000000000000000000..a3e7f5200a762f96b74035926f0a45f22d8c2006 GIT binary patch literal 717 zcmV;;0y6!HP)3IxR-RFpwsgT-ZXG)rg2BNZV+Y(9X?3n+SqH+PP^q{w;SVX;^|4Fm#u!Y=(55^*>jt16WW zPyq$Nd_Lz*@YCruM59sA>2zQ)7^pV)MFI@+noK4>R|=lZW+DOknM{W2!~3OD3G{kB z$@hu`xNy-=MZp z8d9)8MgaSriy)UNVEAcBu$;68`}KMq)M~XTo50dk?02nTS+l^(c{6;s@txS0*5GlW zQ20tME0@b+&b(~=F5g>&3zl+3)vn5kFviW)4#^%j*FpW;Kp>lIrtnq;t75M>sh>plf=^)<~ z2)YS^r^O6n8#%l4J}>9+z5=m&1VRZVlyKsX)pVQF#;oDit@>KHT>wt9HSZFjPy~29 z&ughAz)8F@X2KXBpKk(2+_AqA0nJ!TjR^1=^1*;UeO|FC28CD%7#WZ_%TCJAaY&Mm8y)OMIz{xTv zv-NsS=ku8!kB7kNbfU##LA6?qRjXC`TY(o@zh19|h5c|ikgn@=xm-jHqLoTTFPF>m z7lD^;W{`Kg9c{N;S}s?#-|uO&*$`YABC4vgLZKj;0=!W)hfz>i`(r+i9|v(1^AeR0PN$?YPB*gBP$$Dr&9sLMLZsV3p5%H6&*(z zAR#L<0v3x!z~yq$WHJ$x84iaOi^bk0@cAnE`FuV_2CvskilUIm<1u%{Mxznk?{_Md zN)(Ai-c96lm5Rk8Ll3YFyAU0Z$AXBgNPurnW*pL&iN~IVtNi+^ULCu&uzdXc=%tD#Ux p3j_ihC#gQ4PvPIvUti*a1jn*n;#uCM}X>FjAph?v>HMSz1 zf;3HmQp)fUut1?Oj4&`TKsnC2z=)5XlYE)v=6sKH?ztlXFfxpDv!GF+Q=nI1=tJK> z)BIUKOgy7Nd;3kr=-fVHy#5%we{jeLLt%bvH^RPlC7E$Y*@!h*`a}?GjY$GGq&7@a%@Tx%C8vwF8lXfELN2$TzXkYy*Ch+<~�$xF_*&%15 zB*T_3AX-q$zz}$UIw`+p!e)WS?n33<^>s&1&I(xCtWah->dvT zlk;@30hM|iP6P?&m*26-MFB%#|A5C~VO%V{IK>h&5)otfwqcaoAZ=g@xqS*twq+i< zM8F>m5dn;kMH#-KMn+dml*sqcOVNV)g;%P8{>x676~rb~r8XfEXT=e5{>~?YOAmbz zKdzITiDd+!tv0mR{WeIgd~}QXa<5RRwMm-P ziA0tOonx6Yn5=ejf?oZ#NW-fNn9t`>tyXEJQW3uee2VqU%jL3O zDwV`9fKS`>DOS~Au-R-t(=;CI^%~IC6G8}~xm->#0IXj5xnaBAg4Jq;LZM)Y&1MTY zogdr{KK*_l(&@Bp09dmKlF=%PEEX#Z3*_^8ST2_gVCI0`ZpZt9?&9${F#xSrOT%X2 z1_WS647=S9i9`Y<$qWvMle=3i7I3{@Argsb27rx;18@VDf?}J^#xp0ANidltP!tFM zkJCUG;c)l`sMqTRJC0>w1{7mfbTpk#8NkE=XdU+r1_KC%La!3oeC6?Y43EcyXOJX` zizkx_4@FVn{axYZ-EKE17K;!F1YS*Ka}`uor6_t%0)+@2jYh^eQ9K+DQA}9~Uk*|> zn-w#ejE-YNCx^prAM7yza-4I45g$8m^55K?|L?r+odSTVNnJ96LXt|7TGI4L>d~Fz z&-h8>1xd<>>vgSt=Y;X^$Jv9(As-4y`R%SPp?5wYYBW2LD^|g`7v>f>k`%^{A!C3N&EeR0q1EmI9?j zT<^fuCti3LD9UEdoCoe2BcvKUvD7KhHa~-21gL%Aj#%s&OGVR_$6iSuSoaqp%eN%J z76DWmU8pyEP^yWrwDz7wF9N262N52Jg#ie_jHv7Leqfv#&`?`&#}Fpfom5)T>7B!> zWsOHK0qlpu1b_k9E1Iu8-65F`u4B0T$PKrdAs|z3NmX=VY5BDbP=DEtvNfR%4Y5Zu z5VMpOD@qkb3GkT!aIm-Gn* z`85iZ>7zVE#RF?u>-GjXzTT2IfyTsX6XN-%yiPPHr0n_^E8Hzpe7MH(L!#e?D90zS zP^g}fN@{04Qcb!flJ%iEo~?q;Y!zl{=dXt}`IHwd0cyqO;QYY^WD0dM6YM#f=E3C+ z!2-R=&FDY;{gfv^)4f+|?c7Tj^US!+(gqX%T+i_HIx{<~voklC*uOv1|9t14Z-oeY TX1>|Jb)Dfc3=%9wAxt9|F z+d&sV7i|Ri?b*J^NGvsH()NE*Nyw=rHOq z9m05cXZVv}DLkU1y6J^t9{Ie+&$xra;?lD0_4(zg1yOkVF~Tl8PyD8)GkMUbW%rR#bC7lH zW%k*fs%0@X=TU8A0Wzs(2GkeDrphJpj*`W_=V8Q>S%%hUVMG&|vdP5cv~+zSM(r5L zpk_q)&Qt7?cq5sCsciwPJ89hPlW@GQ1=qU$Sc|6_M~rNO8=m1wO9sa2uK|I2rl?eL zT~6cT0}tkd3eMer$IdfNqs&lA<*}XA&^z>6AT1e~Jc~;*4J*EzV+KU5Yj?Brt{(qr zZ8L5S1Q6NMSc+`^00WL8nY7Hn?e#GOich5aUJ=JG++neU8!4Q(I1!F%48;^V^!D|a z4UC`W{X$aBU{}jyHt+*yo5%4bq~LVpD~Qp(vO#Dw#r{liJqga{D7R4KaEAERXdHzC zu(GYOsh_;Up{YN>64bT|>t2 zQspYQIp!?(;ZbSE6T)gtVKbqg{VOuYU0$?tJyJvGo4;4N@-ba~vSMy|JkGaw^$FY~ utNgH&m+yDjgvO2${t_?#`!W5`bN&ejO$WoA0n6Y30000VN9{w9DwJzd%Gm5%l6k(Srw1f=C@i5k%a|<)Grew%RTzD&|xaqcXf< z9*@@$bXSuRnUR_GMnrG_gFk+>+ij)QYU#~plQkL*gL7`wYBg4^R`qhZto$k<$f_Xo z<#I{K-n-q7Ow**(=_LO_v`{FR`Fvje zCh%1@e~?F`5v|v2G7LjvFc=W3dWbN_cqWrko&v(J{s`D?He|Qk1!*YBtJR9ERvYzt zJ(|zwGN#k%P%@d+p8}#;49X}KB%94HV55G&Pm9Gu2v{Y$-LC8hs*A_t>?u&M*9|ml zyWL6wWCWZ}Ck=-~vRJGF7W(*b$n)iLp-3cRJO#v!q9QpfKQN-6~U9q_TF$F*h9sL-j zNpc$weSXQZ6Gag%5kOy9HfA1@g zVA*&|VjFHeVhIV!`DzQM7F-a@NRTNvNlYYp4z%6NAQuJno^MeOJ!7dzy8e(=;etr6 z4q2h83Vb36o=G4!6u79$u)6u4LoN!;_)kItHmh9g5CP1HxVh+sSiS*Mlqx_uVfwL~ z+}p|}Y*;r1{g* z9DE4_W&SW~qUN5hWN@-RUJ#q3Ngxr&iJp;+4aEd;HM{A>I)B?7>yL4`Nc6h^we^ve z3YC6fwXTqAQWr8=Cd?emR={YnNptkhuSFVP{Q?6Lt^ zqF4A?)Arx1JpP&Pyh<4sUhXnam)AJ@xmkE-VuVGbg_|=vm|INb-=FD!zVlDxJ_uiv SXLQ>D0000yhD literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_pause.png b/media/img/icons/silk/control_pause.png new file mode 100755 index 0000000000000000000000000000000000000000..2d9ce9c4ec4b787b77e2407809c8887b6252dc6e GIT binary patch literal 598 zcmV-c0;&CpP)U3VE{tZoOXQ3gborPd)C!*bfsFfgUA%b`K z{k54{z0H}ACRrHvW^d-rdyicUV+{VYtX~gCqfs0|(-=vN2o1PiuPW{>+#Atov}dlj zm>FQRf_YAoB-!b7g57TC=llI0*6TIQX0twmlwz@1Su_y<#c()O27`fy#f%p1x~?-# z)7Wme<7b=AhIKj}t=(=bMjvNzr~MuZg=Ct#TCD`Id5F*FgY9+;-ENndyrfd8-V+sI zk|x?lbD>axN~J2Ai^W%{R^I>_0Z9u6gEF#73lqsO`axO|3~qzj{hRS`0}LC%>-AD? zlFkeU5t@ED93Che0EA(j5rE6(g7f(t5ddbb)O7oPG}&BpJRae6I)RyiO6J&XwmSe5 z5%qypxm=P~KCwUk1<-E^%&v%&sfQfOPbAd^dMUz$2)JWFR zn(5E_apM_H=DRN?Tj1j{9obJa2Z=)=&L)N3y%h6eCr3~F>o%;x+TQ>p^I2c0Y>yvi zIld-=tn@%V9S}8IT_{!R5Z+_Ch0UxTYjubYFr%4GeU;lC74TEKeW=Sl5HvMAeX=Gi zUD%DrWY78$Ld*n!b75@ktedM+7b-uxz>7nb#SWC}9Rsqt73OZQ@HmbM0hR#sjmFrz z`Qn2R+;S%k^W^LfTz4f%8vIhZ??Cw@GT3qQ2$+f;Bm~?nEIi6bESWz7m0cmx39em$$Y&@l88-}q`@)p_|Tj# z*1_TN$urdYuZuK(mFK)s`?7zHi^MWe;3cvrICC;Dz(yzzbJPMi?R@k1RUUs#H=pHg zvrjkZN3JD?ns*D2owV@K;bCSR0s0c1`uAh{pXdA&89xkjaU%7W00000NkvXXu0mjf DW6MO* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_play.png b/media/img/icons/silk/control_play.png new file mode 100755 index 0000000000000000000000000000000000000000..0846555d0ca84cb99d4c70dad80144a232604041 GIT binary patch literal 592 zcmV-W0k7R5;6} zlgp~&KoEw{L*wq6jM9+RMU)_iNO6K~b@$|K=nj zb2!5=4Mjq_zrU*f>U2#vSVnMZ9ja4cY`AdOM*t}k^goWqfa3Iq(>2kSH;P81hAqIyBm_{t1>+!KRdtb~{1AK7>C~ zD-Nov`UX!X6ET_La7f{B_|*cRuZGR%^C`gjd@jmW6h*+;8;{2{8ja|Fzf-YTq+l@k zGLg?!DijI~9$+CG0*bxx-)TO!p6i!Q&%N5)kR|pVJuNho7M&@5o@ZpsgYXg z6pCpqAEgW*0v6~{n89ISU>M4A&V?DNy7MOQX68Ka`MBqf0l?U(ZY+X9l}VLZ)#Om- z;Wxvd@uT21RmKNz1dH$Bj0zp6>Db9B7mX*l{i7uPYA;7kd3g)QVC)rxA$;8vC|jea zS%$3%AWB_OF8f4{mJFo|55c22v$T`7VytGO85j|cC%=pBjskcjxd*)11x{77(<9$R zNrwG!M09PX(8Nd#urDkdGiz{FkfHKZhPUAguyq;A^$wKyj&8EE8)WXSvDl6Q4NN}z z2Zd#i!U*1a7=Vq#3W3jRZ6Z9$+&MVBAqrVEFbBV-XzUqFMNrFnb9RsDb%-T!q1pza zrNBj9g5~vhG_q(g8Ht^6IILQuOJK}cdY)autaf$;u_Hxz{;liNSF+ zP7JVo4aPtM&mF+{jGz3=veK}ME-bIS)D6sEz9#6p*nx(m=)Gd##2kGE&YZW%&7_NU zaJbxh3nsTeLlsIj==Xtu`3s4ZJ3jM?zzC+xEl8DG(CzhM_b>rg=Lda=hWnnX#UBVW zoG_R&W`Q?ax-3JI?gr8ns1oY(%Y_9|I!G4+85=MXv^z2{WgQJlI?w zaoVx2#b| zLX6^UF84fh?wy$kBLC~BD2js0>zp+XR}r`}LU#$3n|fVSTQ&_fqK z-dP1W_0w_)Fx(96Hd?S$6Ag!Gb0{2;SA#|hQKxxo4lC@GkWvoF>433OT)ML_c*YrK zxk(GV+5xw=j}C#*d_)ZQm|^vSE$e_Rfi{EB*{sr@#u0%!GuA`kT6eip5)*9h(VoI2 z7I~jC*1{1PRmB(0C&t&XN#G6@eBuONxMW%!n+~_GQB^!(14SOFz%!m0KGcES_nU0K zx*VUU%kcb!9C_-b+%XxB2spb0jf9EGvCrBTt7=&<*|?4A1r-;+e)BJV19u#CG)&jc Qk^lez07*qoM6N<$f+7R3%K!iX literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_repeat_blue.png b/media/img/icons/silk/control_repeat_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..406ec333bc036690d4639cbec70e8f586e977699 GIT binary patch literal 750 zcmV`dI4bfJkF0x@cXCL|Igq$5O2KprVjQ%O+X7O;#( z4BD1bI(<+cEez0UoerJ8pvUZH<2j7y zcZNUt)xrxJYFpmPCdcPpZrKy&*VZ>ApFbcitp@qg#TeIQPnn2A+}{k&#TSQNduHE8 zR1lLg6t#%bX_+CDEg*4_f_v33^v*=h#I2ZA3~EX24{j>CdV}A=`*V zT4vz!`I!OrPI2eFNk)w9XPLPE(JbD&MP{&ll+#ia(bqqy8yG)*4e)6tkBnME*Ypl9 z-y3DbfrSJUUwt@@D-R}c|4op+OgNr~#cI=AsIxgE+;$>~av4mxb*QrFQBlRSu^2P( z#4-pavM8REG5;k1bN7TkM8nPocv)tTbCDe=Sn=D!1EK%memuVc8qO zwkWfiP|txa2~#c~+AY08Q|E`jSGoE#-RjvgwZ5L>o_F>0mY3bqi%w2z>#*|89S-gW g7yS2U`k(Lo6ZXgk;$VJhmjD0&07*qoM6N<$g5UmA*#H0l literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_rewind.png b/media/img/icons/silk/control_rewind.png new file mode 100755 index 0000000000000000000000000000000000000000..c0294477171e87351813135e50e05766b5607b0a GIT binary patch literal 614 zcmV-s0-61ZP)jUp9KZp49DjNvG4H?RHybjH%6LlQtR+QmfUZ9|2q} zb1_@3R&Y9<;C{c0I3ABMpUdND#U4V-<+4^P zmE;$|hi&#L-fp+BSS&zQRT1m;8m7~!4xyB?d_FJf0A4Ra+kcClPUnkQQ53O{tKaWK zCX*pLfH#XG8LeWiR_h-DK5r;AuD_5{@H zb&4IwGM39FxLj^tf(vG|nGhgMQJgRykHusLg8@XN(Ps&Kz61{+kB1PTO^?STGGd^0 zLI@0pL%7{;P%IW991cI5$mc2*3I&EG;6f2*N9brY5<+}p0(|FU#zT6!NV!~2&StY3 zjt&2KI2?o<1mR`E%xIkpwLl;se|weF>9m|oCK)eD*v6h<%{X^{d4LO<&*zhW{FoAn zgcONHNGKGd!C+AJ`~4~xQLooa_`CG$*Z8mT4&e|nrfoDRBme*a07*qoM6N<$f-U?5 AUH||9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_rewind_blue.png b/media/img/icons/silk/control_rewind_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..15d1584bdbb2c26a9fc4c8269aa54615a58a4657 GIT binary patch literal 745 zcmV1hlor z)=Ec^h7>5J3?Bj(D6|X+0|UcQj&m*_Qg!D|-c07sd7pF6opXl(U}#WhWg0W$d_xV%ATb~UcS*dC+@kfS*m{?64KBH-eM78JQAu#&2c z7TM!?0X98;&a@msh@1ehFDx4~_smCS0rm@Z$dv@5Y^ec>Jl}_`uDh5!i#cpZh5&_) z{y|~cgJzZ1d%`?CxkdJIg%by0u(~PqB0%Zdj?maMmYO=M!=;B#0>~5_5YO>&?w*4H z@LRbi!eNPrxg`gUUIeK8JG(3%R{o~|7so$K+8_qZe0Iz($pKd%d&oOhA&AGYXkKE` zO8~w=kN^smCS05H!-WT*2mpbXAJK6B{s*`+;U?8|s%XO8{Hs1d`DH6am$(L0coEX9 z)c+Ho)WS9-4?6~g4NrO@c2FaKCYmmR!DQ~YpfIn+s8pr^?KThtmU&}3Kr*7R^y^Rk z5Xsb_*=oc3w-9KI@B4=+yK6a8uQ@#oTkf1PnlL+NjAm=Zh)+xqld|idFEF=^(avw| z4U*w)Kx6;tnV0ZXQD@SHtHr7{`Y12 bpX>Y!%!CO%>C8GV00000NkvXXu0mjfJYGkQ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/control_start.png b/media/img/icons/silk/control_start.png new file mode 100755 index 0000000000000000000000000000000000000000..7dd1c07fbade1ec8d985d95fd89385667bf83e3a GIT binary patch literal 604 zcmV-i0;BzjP)V=42{wMyJ==FL^x7*b^oepca+Xm;{Xf~Uy(P(J3T21*D zAjGN=^W}0$$K#Q1x0{T^;Xw2GoT}9-uT(1Pmw*qkc|M;B58k`oj!e^})9EDV04fefqL?N$IB5&$S;dHP}hDFLVh>akw0DUnDp3(#t{3=|9E&1OS( zyMvrg7bTNPIYt05old2T%jH7RXwM2F~VlEOTqhl>IpEJOe`0XNaO*i*Xs-w zM;fqav)QCzHk(OTpMddrEITt83@989KT;6=)$sFvzsthux=wFzy4(=~R{#u$L%LqC zR4f)L7z{p&DEg`t3I&ecu;80x$iEP)ITpohD^Ctgf=H~o==W*|y0)VM;-LQd9lR=YF)677| z!Jh8V_;KSkP5LJrlF9S+j0qkk+2iPm7~x{#{$ZSbvzK9J-4zqYVC)27V7~717pTZd znit9v$VwYJS3ROyLxp^?0)a!0U)oMn7(0Xv0eUoZ@gH)t)d5_J+J%bT22oSJ)g^nf zqQZVCEIYOm2+rB;rB+cID%~N1o%g50=A<=fWgC_GFUb) z%s4&22M=t~3G+RMgR^pz#KbcfK)ZtsdJ$j@d{400GnQJeAz+sPu#&f$`6hKh0J%~V zq(%oWs|qZyzh}{lfSK@dRK#JSxg@DDP3^*cD+kP0j(npKkSQvp3bk_uYtD5My##O+ z;RpcDs9R5c#9;NFP5{z^GN_^r%PX%(0OOZ~7+aNFP*XZk{E2|i#E`vI`YjCrsfz|V zndEsDXoqvug2CxaF}ZvhdOaY6!{9q~KO+jO!o5Vk0qt%NcD}`cvVR;6QTNzYGWq-= zUX+?7V0e7VLW2m6_>T!vT6W8eRsOC$*+0hNMWWwDsLfA)S*X-WV71;M{bCzP)O;^z5vZ zY!uIB*x&E}vNJj4{?GTJBigE^o7UKdzE#&EBXnfjM2N9qUNJ=7T*(!I*v$dVF@wV! zPcbfCO)dpCHwm6#49koVc}1IZ;f0opGWdxBx;Rl@XzG}46S&UgQ6wI6lQE987w+r= zQ{sp)?}bM^PSu zImdUlKjSCCE4u7+Z)8{a(f*WH^6Vt$sa4Pdn>Gm|hqxOd&DgzL7wR=Ny zr>K3{Pb3xpRu)a{!~pxkvN5v>H{?FlfAoQu4ArC_RK=cUva=WC?yvFKjtvbQVdguH zW&aC4ZFY(9WQu1%h2k`_XyA-}%`(_CmTH1G9&H+WxB<7lEP>07F324X&LtI=*Ebks z(O^1xbS&VonymqWF(ZPe(4cg#Lb0wAqrP?lYk_qESz>U=ricNSk8nlkTJZI`2;B0p zP~cS}qly76ue`DhoFBiW8A<6uOVzAiF)Myh40}1zPD8j{)c_{NT znF;osE(x$5WnrFL;%2<>{$AzD&vfr)$@TcfHvM#Qg`uALgat1xJn{IMSx=b0LuW4k dO#kzpe*)_`5%$M*g6RMN002ovPDHLkV1l_FIQ#$r literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/controller.png b/media/img/icons/silk/controller.png new file mode 100755 index 0000000000000000000000000000000000000000..5cf76ed029a4468cfcd05c1a50089a98e718418f GIT binary patch literal 666 zcmV;L0%iS)P) zlg*1#VHC#iD%uAHty;DTg0}q?ty;8bDFzCDreJ80{BB+R< zJENR4PZMQi-K$n$6{M+e{`y zCzHvi{{^55g~BV5NOa+FIKC8%#WFEpk_S+;0uA4flMsu=wvk9g@eiQYYGoUZ#;;nf zwk?;-FdB`3VHmiWEa5y`gl|tCa~huHAQ%j?r0MVf0GiFFt=sK#C%yTk;Ec=V5(eW1 zy!^<*iw^+Bx5qH>dSE^ra{Kc6JlJfuBMv}5)@Yi~=Nw?K*=zV6|Ft zLOAX<8jU;B^k)=l4vT=l&3kn^9UxVL)9GYU)9I9}vfXZjQmOn(B@&4pQul^EU^1CN zHk*ZXIt^qGkTG9cEEbJkuV?WZo6QC!5(!Z8c%13?`&?OQ#B#^uF;uHnNTpKPc_2n0 zqyCI{R;g4puH&IXp%AEOGKB zFaZe_Htgq(0OW7HPl9o7Hk+@=e6O@xZTY%@-!Rz$1Rlkwh5!Hn07*qoM6N<$f($t; AN&o-= literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/controller_add.png b/media/img/icons/silk/controller_add.png new file mode 100755 index 0000000000000000000000000000000000000000..efecb3871b9220d8192afe89ab66caa666b69e0c GIT binary patch literal 759 zcmV zliy2|Q5eVHtNwu?$ZopyMku8m$t8i5HDPWtH@CgpQd`@%^Bh_X>&gS)_izr+_j8{2InNPXE|-9%^dU|HGTJ2nWd;3w^ zTUb~y%+JqP{C_nhR^2%i$S;f+0UmhZ|^^}Tt(B1%XlkG&}cLe#>dC= z@pzo4MMg?Dl}cf8aS>jxmnx4=u@$-xP4KNs_!w7Uoqmj))&^W_y$E4+baa|3PeuZe z+2L@+IyySk=H_NFsdo*R%AQX)cs|=fL!5a4>&zpZYpE*DIXIqX#7#bQn$?i2D4u=to#ZW93VYAuFwSe zlV3sn^F#p zO;I0mE*EY(x3LD!mZT4XmATQHvj2Z=rMusL=fYxGPhR+5xQFxo{LVe+{J7E4QNzf{ z$bA6ZVZ;p&4_`2uOiOyb{^Fqk^wMgzQjJCvQK?idhXSb8>SIc!a#1dqFG(blQxscX zULFVrgS^k@<2@cv)#Y;e91h2|{{l#UzyGmVEZ#8~3||6)K!}-l*#lC}@59!t15;B| zRlD6T{|B(XzV2RKUEN<m<3!P3kAOP4$g-rQ;UI5gU z%jNJRnMZWHfI^{wa=9#s;FR0n-(O=*zss@a@B}z$t}7aif>jBl(a4js*{o3I#>NH| z3dL7$W@e^F)ViS#$Ye5byWNyAZV!VHH3C6A);3g&}7O3-NBmkK$ z7E4?vlNCiG5txe3+b1f!%nVZp&~p;dv?2BUI^NtmUf^stTQ8kNlOO>74qNY1_=!ip}mL@OCus&$l-zgamdQTiIf4 z4h|0PvH9-x_4S1g?) zliyELVI0P}>K|z9qN`S`S*>My(M=b%{)4tQH*2fA!Yxx+hAy!Jp#(A(!X`9JVhTFY zg-ej%v7wSpR%?VHEJWq^4>@2YPwzR6)~YMd_MEeG_CBBQ`##_AVX4(>nM$Q<1Hjsk zSW2a`NiLV$rBdmceF5m((9jTfaB$E+FfedvUjTtXaDdO}FYtIgJBPzLNPqMBd?Js> zQ+GHVb&JJPHJi;2lgV`9zW`cJr?aEGyL(F}lZ9L^mzS6+a)DOP>A?Do36qnPRjpRb z`v(vR1m;&(R(>okEmgfvU5Kufd~Boc{;0g#t6ZOZ5K44|Q0E{Ba| z9?^|$L_J-|gbYXoGz^?xD-;U%Na$BsB%C@8_}ko2WLb^W7cFW#YY0qV#dh=qv&&#G zh~D1bHI~t6+@q-tLj#b>WMF?cfzQS^R8wzJO~{Z9n_(SoM|r1&N~HoWmkX9&uP-GM z31(Zgu}~-=olawM(Ffmj7t+BgRKGofTilB8nJIjHc^OuNlsQUgXD3)Xoz6-pPaA0f zZ5|mJi9Z+Irq*qJ*iF6$wRRJ3(K%FNJ;+Dq;26HN!@1j$WwY7OSmWd4_h)BkL3e@% z&}5ZTQ6iQ6ITBnY%0>BW+b@N#lcNkH=90tvw56Zv!r0i@5z^O^-|t5}9!I%chW^E! zddw}u?v|3NUJkXBBeXD2D#8Y}IRp3OGuy6*r%y4%pin4A$(Vu+6Ub1(J$$iFrNh|G z+E7iB43dUFG>uy66XHHC?0qK;41oNNhsj`s#bR-d^ta}Ea=!Ln)J%DVXDL#NB9$m7 t|0Lyj&_odvW#b*EY(2-Qg?mRmKLN4t3DC`EWF7zj002ovPDHLkV1gAoYv2F? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/creditcards.png b/media/img/icons/silk/creditcards.png new file mode 100755 index 0000000000000000000000000000000000000000..4eae583e15294a046d9ba4421f6b832361b7c516 GIT binary patch literal 693 zcmV;m0!safP)Q4qy{_r0XCiLueP)TcDHRjFwyR49fBE=0SrAQVAxqZ`35;M!d_>Nn7(Yg2F` z1vlcNi$EwyQ)xj+tCU)6UTm8-FYn%Q@nZgv>VaV{%$;-Qo;&K+v&9$F$=H(~+lm8- z0Adgk#0Z!mi!m4@6ib!2?_bW}qk+)1(fHHTL+1etq;Uer#c88T|dM4_%NSVb{RO;L$#*c>!gO`EEaw+pK$^dpxC_E1xZNEcKya6MW%d@1@X+oh8 zN-6#Y&+{UVuEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#`ZKMgf6%T?Ed*Cat6T(z(gze_Vj!CM zy6@eO?#%UBLOT}?40F9R=iD>%#+We%%UB#s+R_AGvw8Yw4_Zs>2F6fS)&oeXpp>-P z(4Hm2FoZ|N+3e;VNHZ};&)gBvnMk6jHRTlU@9U0$Oo&egxTGs^ATns~z)sFnC~aG*pjzb8G=xt@DLRNB;YZL<4tG!V^NUq+~Mv ztN7=;N57-Juq!r;ZvU(T-}ZaSebaUsBWyIhc|_vmN(Q*NXt96)H+}<~rj3txZX_4TvTUMq|>LbhG>RIrFwD2p$R<_?X9=nQy+C-KR+@(T#b~rFBi9 zr&5dmoxyQzf`pXp1)&Yw77)Uws6}TRmSsWbtx3IRhjPdcS z@OpJ@ZmytO{i^P5+l0rqtpjE*E)+5p*rVbL*xpW|(WoF2xulZw`6M+7fop`YNC6S> zQg}|jV5`?l*xE{=)v97_>t}iDL2v`r=>RQ5JN_iu51ZVtjDaPH(RlDP!p6H`bm zy@1CwO|?;sDQf-$1 zE-6j&QvG?{oz?v&g7sn=ABwA(pM8dfH@9GTeeh};w8Ol{_?_^>!N{=(Q_*RR^vCdd zCyVsQReUSd9%+Yt&P1|6?lvJv*d;v4JTA`v1@HWV%by88XaE2J07*qoM6N<$f>mTU AbpQYW literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/css_delete.png b/media/img/icons/silk/css_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..326aba44079378741a091b4f6dd003ba16ebc546 GIT binary patch literal 654 zcmV;90&)F`P)38XA*m5;4_2X81rH+VK@dEO0Z*QU9z7KV=|Q{-f(ZT#9+ZM8 zC7_fnsFxNCDJi6tYD|LS+9YPPyE8k^n`u)84~0B<%#ZiJZ@%|tCMJZyAQs1fHZXzd zIM4oDLliOT0z%Npr3YY)gL5XMp`0^>VF;6w$Hq?efz%Trq8--+G$)eXF^VY0v9?y! z1Z2M7RsbE;2^z$AK)bFLC6l&P;AsNQ93hoTBbz;gZr4S#SwSv$PVR?TU0uM`)O8q! ziS_ljaNRAn&zO%mV_~0}z?+-zWuPa)XR)#2pwsz*eExz;u2hQhkP#4u^H3^~1k@C& zlQzg&tvaez2cG9*a`G}PYXtRr8Mb{G6BAdky^km%vj#Op-zJIS*7*W@ZXXS`c)k+))+Vdhr;C8eeeY z<}4EVlkh$*qFgE>ZAb-Fn^q8DdHMN2o$mX~C%AZf4$0~}VCex;!)YALjiXWe2-Ej{ z)zL)4`s>>E?w!`2`wPhyuT^L1bqV3iQK*+kB&6HxYc zuV5|A!uJ~JN`iLFK+hUNY(KxTRLIN^+19=6C^OCYSG2z~d~O;%?1}ra{eEYskemDc o^V=PR$HuuKY7+JI>LPpi2eb^A3F^mTJ^%m!07*qoM6N<$f>8%1?f?J) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/css_go.png b/media/img/icons/silk/css_go.png new file mode 100755 index 0000000000000000000000000000000000000000..6cdf38c36670ec170cf88493142a6277f3a16d3d GIT binary patch literal 655 zcmV;A0&x9_P)s4B8sX20TCgDKpLQ_sjDn>cie5y6M(y6rsZg6xGOU=ZxaAO6m8+|dxuFu zBGNt4z9$`3SJx3jF##lGBa=BsHrvDQ?mBC0v*dDTF$+vjzoN7ADwUOK=H}k9zP^lE zKqR6#%k{Cim}h(YH!Up}xcBlJcc1rjq`D4~fNCIwhzeD~T~G}G zY;G1uG7{wKut|Og~B%?4Kz2jGctagNQ#&#A|=vhMO1|Z1gZg5<^JoNxCLSt zViB5-pQgR>99yLw9)5kq(3xRWBhn#6mqE;2kh#P#Yv(jw7b2QgDqFUs#xk{EU4$Di*66T|{R1Dnwn-PwM&!!A#k@}#3E z!Yoi#RrAlc86_zpDx5r;LrhUO3LDGR*EaHLCC`_Y&kWXdlNuYlxAiMjEgv2kg2)MtT% p16oH?J8G4gqG{`|QD556{{`7)p*DCclOO;9002ovPDHLkV1n4+5xf8Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/css_valid.png b/media/img/icons/silk/css_valid.png new file mode 100755 index 0000000000000000000000000000000000000000..4c72ca5a409ea885dffbb3264e2366fbfcc5c910 GIT binary patch literal 661 zcmV;G0&4wR5;6> zlg~?3Q546&Z+ztBFqN8GzR{3Ep)nU)K?E*r;i@30aMiL+tNwxd7upK8ZV?mxSQH`5 z%Ar*T#@I+IrS-H4hWWva@BVt7d)~}2tqd<*&Y649=bZ03bDtB2A&#=hAu(mbu$SSx&5U`}~?nFnhY5J!9yY(*U$u({C36O#Y_4|(d vR?5yHAZy=);3Sb;#Xw~LUCvQI=hpfQ1cAs#UOhiO00000NkvXXu0mjfn^rF8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup.png b/media/img/icons/silk/cup.png new file mode 100755 index 0000000000000000000000000000000000000000..b7bfcd15fb2f7ce658185bd7ef4729815e2f18b9 GIT binary patch literal 633 zcmV-<0*3vGP)DAD_Iw@kR+3LLZX?3 zyhGkEvUzKYKpu0v_u>?yY~y}#nAbh$p6}dm6adQqK)FzXa=E-qP)ntfS|}9Md_I4Y z%jHh8*{qt$WYlyzt)^0`-M<7XmC7CwTlIP!6`0meW$j(o%*9*fiupyDJZx7&n@&K>z*>QCDhTzTp zTlnzwp?s_A3C!nn*-|JJ`k^?T&hB6^z;e07X0ws&YPAxuvwwlMjasdSU@%xy91e#I zzZYAh^udB=a16G~?^>-EC_Ew4q~Q1a4;7oucH0!-LK+*Y)he3JCK`a7P}Mc?vlj7AM;VkzMEhOwnj`hl1MBj6s4Nlz_+^kH@of;eX>V_G&2` Tt35or00000NkvXXu0mjf&s-qj literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup_add.png b/media/img/icons/silk/cup_add.png new file mode 100755 index 0000000000000000000000000000000000000000..4ecaece296e6c59fc3c208778e6d7eb5ea11c6af GIT binary patch literal 715 zcmV;+0yO=JP)n#+EeykZ4|N(vXz=Khh*^5}QRJzvJ8?K~WJw2M(8+H|N}Q?|s7nuzvyjuL8kf zu#H0s1Ok%Z@0Zrr)@FS^->lc`l~z|*C6C7=x!vxzUj)|I*E={d9*IP-xw(n0tu29k zJ}+V}mlMcjGT@?cxmeIJuLP8-+pvxpV>_=cizp9L8M#J-q9?DWDtZh2hl* zJ}pl3J4s}-SvVYyhTU%OB-=8PtJSKws5yP;kI)VFqEspg5v$cIGj3;ld3hO)Mgui2 zqJKUB?VSr4Ki`RwGlvBxx{l(_-5&8RBs)3lIE*fYcw3Pn55AlK`4VV4N$bQ-BtN`QoV22Wtl z%SY>fDx3~2U4~}qDhZSsUpq-;W@g4uR%KZh^%7b_Cm$ZfqVFYsT)NL=B+&dF8Qa0J z%V;!C^Vv42ZW>kVFI3&yhe!I0Q0uz|S^d8IyMvz}hs|c&Yq3~re8%8{)F|A4b`58T x_T#bslE_Sv_M!)W`|9}RevWOj-HiQo{tZX32x6?^3R(aF002ovPDHLkV1l2WJjnn6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup_delete.png b/media/img/icons/silk/cup_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..59a6d9c614cc3ffbde67dbefb8b228663a9fc8d1 GIT binary patch literal 731 zcmV<10wn#3P)2lh<3J$3PPi4XeC4&38aV$Tv&_9v^Ek!r4eZZ6+yO`AwsM% zsZeodoR`{6`a8@6m3cp6-ZN!2F^~W2o?8Qf5kXz}xcv7&-*>)q&bU0v1sd_Jw$>z(j;JQHrWTkCSUv@0ts+U4ct)=dKI>+5Zt7zqZ0$Y!(1<#Gb~ zd|vFCOhzD;N`Z^Q>2yXM4o901;A9mi%Y{M#nM4%tUys2wI*eDh`|#rWMS;n|ewdz) zVCn5RkBK3jPGfO#QC?VBP?2qk$dyV(1l~Ko?~j-q>c_^$h7hsa?God5J{b%K$g+$o z7nyl92;Jq=c+jQ7$cY024^OG_toMxg=a(EP7K@@JtJV6E>2$hyGMPlFR6?~{6??f{ z79eN811}qaKmZntCBQTq%@}?zvc|g)60A3lKz8XY5{ZB}PmuYfFgG_h%-Y-AkJSYz zkdF<1zaQan7@<%IG#Sdc^mqW4uHBebDPio~3FED9m`tW^tf{H#U_CpLi4=>)5RFDf zM*4P*-hiw35K3?ELiSDJ%kxWc_Uy%ss__C-DwX?r2B}u73A;o{Boc_n;{qgPJh=;B zIT`mmfWGa(%@$;a4rBVLBFOmKLLz#--bYp?NfPxE>Oy2&UV4dNS7BfWW{)(=KdvKV z4IEp|X7f0otxR>(sOqEWk6h_ N002ovPDHLkV1fdAP!RwC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup_edit.png b/media/img/icons/silk/cup_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..0b8f1e1ef51432c8171204b03b17ba5deda6c523 GIT binary patch literal 778 zcmV+l1NHogP);pE=-K9H0nZ#HcDiJQAvy_EQm%EUkhUqm|YI1TC1PYtY7P4Bc*%Uy`Dq@!7@i-!5Bk1qc!B}5|wn{Z#m7k|-uPTM{ zsRp0Bn#r9orlzLQ+uJK!EEbg#dr&balSz8pgFXY>Os*y={1W5Ox z0Dm@4>_E(Q4e9xA%zrtHsP!B?YzdqVr(k~b;u({Zlasp)P?|%=22m6d3B(@n+pakDXPGE*48Lm5kuc8wk zj|Zgj7b$?$Y6a5L(jpKLKEAvKcUKu4Z)-5xSAe-dA)@wD3_s3CBqY!t5wr1^Katcb zqBSOysaaR00%n8oJ~{%fY(09&t3B1Z@bz;_Y?+vKD=yRZlUtGtmU~#})1a?n51LMI z0@top%qhKIzu~XjSg?DYbhCJK(olIIsjuE^>QHapxY9QM0L{1vkTsmPBLDyZ07*qo IM6N<$f(Ry4Qvd(} literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup_error.png b/media/img/icons/silk/cup_error.png new file mode 100755 index 0000000000000000000000000000000000000000..68798748d2f0bd564505dc5e4b1b106bdfc6bb1d GIT binary patch literal 790 zcmV+x1L^#UP)&h=z!kfV#M-iHk8^b#X9p5(kYFB#urxC~>Px z8B8#0>Oc*OKnXOofdYvT+uFa^ANu#M_dbNEF)p0s=Dc&>{m%WqlXD1T4Er&PeVX?7 zAQFl6aCc9zQWOQ;Tf{d%@~>Fr$6PK~Xct37G8&DZ<9=MH({)&_RuDpVesaHCOqlS= zWD><dGO9=x^LY@}9{u|E3=a(olH_!esAk_yxrBv@>1u-Xryux#8hqOSxPI?*Rt9 zcc9T|)FOpK0j$1_TzC|g)_yb-zH&dcEj4{LVn`|Ru%&)xLU0W78BIx^F80yCkhB^`Fvh|T~4kbzdi{|b0g|G zKWxq$po#a;X{pMBGZ>)@3kx{`79f!{nM}~@^`MlXx;2TG?km9dS4_Wr1#@EwB)x>% zk9ol^iN$&;<<~|{5Vj_jH-9J zmXOowyyf@%!@M8JWHO+Hp%C?oEij05Ov_kfqT#M+~KmEP$HAVzJDb&E`~YK*bU&4lOS)!|(Zs4{tl6X_Mkj-CcB76>)m& zOQC6(VYI)Co^iwH^TA{?g^Wg{gvAz_cw=LOA8fpQ;*az;lwx&tm7D1GdXdmLU({+f zLZJ|X)MTKw9*UA|G-pa6%Sh(5WSv9DogDtoDVnjevcgLm9v=Qo6bi+>*XzaF+8Tnv zAm7*5*EuX%nA;txxY?cvU%(4mHe4TjqX!pSk!;NFGxCJkgQPp=1 zS6dIm?y!MQ3PVFfQj(UIc0O#t4$`r~>2#u4c?Ly7G799!k^3wG_f%KVX_2Ai^(CZB zV=$;0fJUR)PNJiuPldnE#Iv)raJ$_o6q3+mZASO#6E1vdkwQ9H0=cmP1Ct*4Y5BmqvZfD%J$-H<8Gup+=;CA(`eRKB3DR9Yz6rgQ$~*d_A(g^hJ7O= zBSAW2P(#)zPGW5ovgH!QmXmoZKJ?eOkw*TyzkCaJm65ogpML``p5oUq-p_^r0000< KMNUMnLSTZ4&}I$* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cup_key.png b/media/img/icons/silk/cup_key.png new file mode 100755 index 0000000000000000000000000000000000000000..7ae160ce25e67b62abe27c2761781d424d3df560 GIT binary patch literal 776 zcmV+j1NZ!iP)cSajUKNoTl`+$cilDl%$Sc#xP(ezRoDoTF8j7W^ zvab!B&TV?yS8iixZf-l+o8N!i$@pA(RErP(krXL;H^5)edpm<)!~~-DYi5{J-tRLmC8^g5;7(YWOjZ7bcVSaD|L1RB+S{X8{ z3ar|jkuWsDJ5Y^J@`iVmR4T2^8wh=owZY@@!0-3N=kr0>jOX<=Y$b=VxzvQs$YZS9 zn!vHmVB}?MRAFJ^;r#7_SP%t+L9i@~Kp-G~FMPO%@7{KB{;No{4d8sW;M~{N2*TkoLZJ{?`y>Jrmk`p_W1W$KTR4fdw+0(7B5v8Ad49I|97STc zU@|&7>Lf<6SS;cUg7hGKBQ>PdK5TfZz%j>R>XE|QaSXOL>DCKban-Lsk;E>-9<5e8 zLUzjweTUv(Aw56C`d0}!XC=(NM=>V9%WK|_zxpgI+PmXp((Cm_I-M@-QPpEBdLJ9i z3D7-dP(5kQsnzPDzkZFgod;SS{S{HV^N4@o^1d@W<^2FSLkhmR{)z1X0000v^zY@WzjBN@nJgmb;$k^0I zBn6_*4Q1A*OqYr?whE?mZfP)@+de(dQy!$~QeXJ+KJVxIJfG*+`zipGe}VE}1$K6J z$_V!D?QMG`60vV>ZOv|OZqA0oVf)6$hJAf~-5v}E%YGBs-Q6vxz}Wu&K8}u#kV>Tl z$H&L=OeT|pgM$N*DAv~2Vu3)QTm&dsO~J)v{OT%NhpF9wFM)X*C zZo&K4F7o+=!^1zuzBHsGO7e`FRwJ zMdV53?XwX$9^S*#Ml~$D+X8FTUA%a7U+(ro0c0{6X=!3Hqv?YM&j-iga+!<8VxZwkFl`Epi;HHZqM|}` zF2IhoCQMCDVQg#+Hk%CwgMl;g%&nNG-wY8&4NlD2q>M2wx6yWiA(B0jQU^t9{fdSOj)uE-O1>@u6 z!n4g>Pfw4Cbar-T6gpQ}WM*b2(%;{Yp`jrWh{xm5Xf)sraa-Jm+wDembv5SZ=DaL0 zI5?R7`8g`eCBoINuC8Evd%Fnq_V%Kxs!9Ut>+1zi>87`L#)6>(iTCM2l=zw0Y7n?b!)0v{Vq^X?`7X(U6OE1$_Zq(G&d~9xR{?^vk qmL+^|XlQ66sL4KIj_=rqeSZLw72dYRtc%V70000I0T{~(qIu$a8Oa`;1VJZ+NJ#? z)Z`G6Xm=;i@Oy^O@W4+X<|%s@Z9U8K%Cou=JW=N{umR|dc<1KC5j-&Bmny}u z1Gr;ImmX!ZVOvnb2Z3IG9yvhp5kdn#W^JX2LP{w9t>Mgm0h`0-w1g7ei1zafe zdny~;a&&9~i}?5QG&nFlE(hRq9e(XsJj>7i0YpGB?|)P=F8}}l07*qoM6N<$f=`l= A>i_@% literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/cut.png b/media/img/icons/silk/cut.png new file mode 100755 index 0000000000000000000000000000000000000000..f215d6f6b7c81ab344a3e53e0e5e756c58c82d90 GIT binary patch literal 648 zcmV;30(bq1P)Sxb0Y6MkDSd{nPwTp^L>b`TxVmKBiF^NLQ>My+_!0?|)hBPe_#}P$?rlUF;M20U z`oNWE|K(DrsR+gN%g)?+`OfqmmmiA8O_U(YfPnV(E$8mN{jZQVJ-L7LxzmTQJ^!PS zHqDyoKn&^H)Oq>Q$Nzns&wsn~^6P)|vPC&W#R9Kw95|FC`?q!91!~-K_R;^uDLWSs zj7A}sG%2IZxvQP(HeS-nn71T-`ku2F9(?#8KXKbp!Qe&~yaot4r%3=c-cDF`=YPn& z3!hUrzxqFO*Ny)VU;p?Y-nniMuVuI+UIUD>=B$ZZdhM^2Z-JeJcbDl-H)3?9>AG_?ve_7A86r2Wlb?y7)ShoTkzeah}rl)Oq{=a0=sekDkpZ?d4n{v>% zcgJPxg7sgx4Lmup8sO5j^?B5iYcCv|)*VgT_U6A?-trsfIcr`APCfD&B(EM;R_0K# z{lAb!kTg~UrQ ilDgypkCC?sx*7nVRiSN*cNM8!e}HvIH<9>qC z*u%>#zg$gv<}MShGjnAGJ2PkOK6By0hyU>tw;vUW?dQg807&yrQ=RMQ-E97!vNQg4 z-N*j_tUWjWKLolUYSQlg5=m36r4lDH;xu5ThU}a(Zr1-N2ys|V5M&R&;$i)N&feSq zmz{a{|DKP-|BKF6|7S?@XW}&Au#M51wR+0yLF^T(QZp|FIQ=hOeEQ!tf5-oe6~*Qr zu++b@&qD8hH!l+xRs;50>EAnPZ~Anzf$E{VUiSajXvrViWT0~Tn2ph=HZBI{xzd8= zCmhZH_X%+*U^QU6B!BX8TcaQ6fr?gZ%5MN_lGviFy#9=X>EBjP28k8wGE;1k*-!zk~CMF9Bv_3(^PCOq;$< zN?sD2BV4j9Yl`*+fsWQD?H_4>L?~r48B=l;Spkuc)A?yA6iP)R5d;DO`2BwH_g=3D z!!XcjG|+Ch%jCP5&1Rc|$N`LEvA9yN*EyX%X^loByIQT_h>#+l_9wi@{(Z?D2RE zUDq)j4#hY2{Z&BrR!Yn$4g z^!3C0RHpz#W@n--_jThHPEAe2R834DnuV#1kUlxXv}=C^n7~&>f1RO6h@8fUuT`wRE91*{Z%LW-oO8KckjTdf s77ewwyuEar+*b)ffn+a07*qoM6N<$f>LlT?EnA( literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/database_connect.png b/media/img/icons/silk/database_connect.png new file mode 100755 index 0000000000000000000000000000000000000000..3a111977cd9dcd631ce1de85d5ce82b9ed477c27 GIT binary patch literal 763 zcmV-F$IpKw}ImgOJ; z7f9UkeLqXqGzqfxt7QF3)<-1d`T2Q|JMMspFO%GpXf%2y9*-j&4kHu_f!^zMI#5*= zjYb2lR%?Ug7ES=x*VkWXGMU+li3xBVcdBjIby2NWQLEKf0>=*tFc*u({#ko6nFJ|g z?nDoqo*3BN+=QlS$mjD227?eqk(Hq9I@;|vn$0FssT2kLZQ|-id%$+QRo569<9qv% zBnjnm8M$1JiK%TxQD9jX1VLcAK49g|FTrt~4?&Sj3z0ZJ?)<=HM1kjdtcg@W0W=PK zM#c1;^}sOgal>-cAqn6)AN*Jv@9IG$QdhCIwua^9WsnCLfUZ<{=zsybx}CIan}V?0 z(jf9aq{ui*&$pQ6>FH?{i$&Pv&LM~b`VLgXi0VYFk?86scD^Y%BLayFDZKrnV|#lW zi9~`4jsobO0XnL2(RM88rUON{plT*+du<%376#5=!^`(R3b$_eU!?$QpE}}O=L(Xl zTXHla@d^=2JO_a%GalgJ`5qcOEzISoaA`8ae&guqD6-iso5p&*t_ugM(H#y2M2}E4 z!@_QpjO%X=M%RSdwJ?@atIWY8Xx%dePiIz*;vQsHA#%EP6lrG0Mp{)++EaGtq_b;C96!L6rv t?W2=fDwT$aV2XrKn)Z2danU+@{s+9Sw^uGDfpq`?002ovPDHLkV1o6HVQ&Bc literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/database_delete.png b/media/img/icons/silk/database_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..cce652e845cde732ac3ce9a4132b597301ad660e GIT binary patch literal 659 zcmV;E0&M+>P)ps_J1 zHhTmGl@tMUh=_=a3Fb%)BqZVTW3s!xH?UsxE?7A5@n+t<@6Gq#%m~l(@IOPFT;%il z03|#}Sa4nU2-$-Kn!4}FekQv@$S0FY$L9!N0g;c={9!m8K4zLG48uSu6aw$J+ii5a zT~sO+G#ZW9!I0fqFSvY9*@h|sR=YqL#x%oU@(yD@pz0* zr-R{eDEHX6V*RaK<|4rWl@GKt@8COeKZT>%ICBq4+h_I-+?Y*V28oxmqBc+Oz5 zc>4@kzJgDe<1lkKXYEtktsNC`FoTI)4qLaF!_1E&4qv>EKx`iUcee83)!MzalltZ# z3K)~8`*H_w9^uf5^9X)<39-6>(AOuJvu0IKc#FRkFoCa%ULtC>8v6bIR-H|{S~CWm zy|LB2yL+L!Vs5g8ONBz=aUzj0EX$JbfSV}a#vT*B_2)32Uc<0oLyzLS9V$=7hM4?~ znM@`|iEa~8)bZW?7q}d~l*7K(I`+@}grT|_=WaH**u tj~DMRZZpzVy^OjT85Vq(G=8XD@S91FH}kp`d7hyPh1 z5CCa%X>*RH50W(1GMNlqE*ChCgTvu4bCM)M5Co)BDTG2HvvyYjmSvI4<)A2v`CcxU zQ79BpEEdf*P56K_c;lUWy=bic9s#4IZm`yWps?HR<^;5uf_%3rLf1Uy7}ym7{u3SG zgQxL#;V@<+y-&7GK#MIB!!Xb^&5SuEhPoOV9{wDJpWonQN~qlHho`!h-y&cUDCjiw zot3{JSR;b3Z$U9V2&bDtVsaL$Qu?FFtIb;kXm<)qqyl<=9Kq@&_)r^^)N|OJWjH)_ za7i;6X_aj`duRB^h5&`toyKA^3V-E1_yb`=eg>PPj8Y+p^vFkpk)_tg?(s>=HO~R< zNVkfdL~{$}rBQI|9QHR{MrpYhcBg@2p$?h%pAnUsbBDUeKUv#oTc6-&EEZdf$Kwze zM&QwZLDd6D&pd?=1#1F{N2f6?Hf8gwvt`>|pf)ft5F|nm_AI~XywcT&?}K--v^WN? z_7vo-s3)9F{TXfF{hpqll^q2vdwBb}datvKg-yfc+gC^|#8-K5)%lB$rlxi}-rEGO xUZ|2A>wRp~(I5;*aZFyx-fDe3J-^%i_y?+(!m^mX(n$aS002ovPDHLkV1gwlT*CkW literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/database_error.png b/media/img/icons/silk/database_error.png new file mode 100755 index 0000000000000000000000000000000000000000..578221aaab1c7f6f1f5f9eb4adf02aaad93bf407 GIT binary patch literal 682 zcmV;b0#*HqP)87 z5D7ClS`>i>siY*D_Hz7r-uLe7+&8^)8l^=KKF+=8o%5aVo_ns%Fbw?9=NR3j(`lIq z&l4_j&X15iM4%;qPxcepJA`yB7SpX9o27t~=V*Q3@ApT8!5};y58Q4y#D7Im(CKtg zsZ`KtG+vYMVmuzNnu#JnAeBlzFPF=roH6NRj2XFH&PXPcD^{M}l0uuKfk5D&XAXrz zpdx3t^?;lvW4&I7%jJSB%WyiKrmxrQq19@kTCE}+4x6zP2^(duC2SE#)bB9=iVf68`kSQeakO%!CNk8ZR-m z?*w*FFTmM-3w@)sMZq=#Gl@t{bZZ!XeF5)YAM_uOFn#O_`sF9!I-5*jRo65I^~*E( zBNu?dI#%!A!!BPRgIX3|y(Et%5U{H2%16kyA-q#PaP>1aiIe;_%$~lEAY1pW-a6^s zLLj7ztD;GSyh8%7JcV!OIC$?J<@T`{kAM$r)ZhXRM9)c@I=uF`f~8C*(=8T@aDLBH z?I;- zi%TAvMLVRO5!65AQFy%kz&7qVzqz^CG<5E!W7`eUT(0v?OSAIJVzcSlpH|(e&rbmL QkpKVy07*qoM6N<$f|gM=-T(jq literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/database_gear.png b/media/img/icons/silk/database_gear.png new file mode 100755 index 0000000000000000000000000000000000000000..7c0ab2b4c643f33162c0ebd80c4b0f8418acef2c GIT binary patch literal 468 zcmV;_0W1EAP)xrrOlR+AYYd7dzkRXrG^eM& z0Ukd7oRTC-k|gQnMef{;h-hbg699m%$}xbdi0=mUTP2n)`eug$pemyB(~7A5(p8B9 zpo-`-pi=3n1vBanKvhJor`FPV@4HbW;>w}!^`!?_&$o+c)M|~!f&*g2sIl2&+nRI7 z2dg4_dK!Hio3Z4v0sAzDZropP7e%esh`Tl#_R2+_g}2LFOq{)tc4JXTKlp1=*9P-? z()(@ByuPV7UnkqEhjpwo;fJpEp5FC1>gt?lJU4c>+hFP*|&0tGt{!YG|5fRw@-UpUxK})gOY{KjH!sGG4?RHzSe!mY<6j86&kw_%0+>rt+UvTG zPNxG!QLHl_`>TN6lhf(69Pnfg>e~`ot!6OL_K}%<0mC@>2*2;ZcEFQ4iGwF{@R*{j z7!M|qd3hZgQye2(un7;}EWl(MRHj3v{mH--l93DO%KKRTaX^3MX`58z^<+{ z6<23&!!Q{PW`ItyBW>gC_$Bnz0p8cvrP&8U;E(_Zug)QpWlpZPzmjE&ksHm>&{4WL zcWMqjtuMUYDzy&;xOM)i=ubqW(I5dCx}hU{e1gb^CAKTo5EzT#!}bO?zL#36j`?8+ z3*~b8c`}*w$6_%IbOkHrWx4~^auW|u<6?Xs@2VxNZ5G?Ij>|hs<|oJSYs}?xlO%MH zkQM~t1b+*>9q#P0c*i_HG3Qv{e6_1E^9qr_9C}QDj%+r2jL4@6j4t)_BWY1InA104 gM*QcJxn<}50%n)c1HutrKL7v#07*qoM6N<$f)5Qpt^fc4 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/database_key.png b/media/img/icons/silk/database_key.png new file mode 100755 index 0000000000000000000000000000000000000000..333414767983f2db7c3d182cd6b4966cd136a255 GIT binary patch literal 764 zcmV8(Zs~5pkxC`Czx(!Sg&Qcw=J& zxm*s3L;~q_`XljO2nK`6ZG=!LG!>7>X*g{!E0s!GG#b@LMn(oHxKb?nwAIwq;D1(M zUk?)G%uc_FICawM>MCqD8?06<%x1Ih6Gai3Oa{qh5=~7_6o5SeCX)%-Y!;H

    )MG+r&du`yP}}ZLJvbw^x(mR;6BNh>hu@++lBNk%}Ml69boS(bA<2$cB@7|GY&ZL_nTv=X48^gKW54ulJrmgw)_&D2zm?%kajBixl~BYoS>4p%7ipT`%38~|!^bB+eQ2Qfxolq#ZHXrKb~^msdlMIlH#M@heuHzfxl^CL z`O+am4xwj{eX%Rqo_MM&oy0egXy9K`?JX=UZ_v@6B$`MK^C#!gBPUd?xOp<$+Z9K- zpd4D`ihnAWr>R!QIh%hCiGI-W_=}_85Q;2KpXB^6<#+e($*9$`p{+SaU%CND@t2A3 zPq0`#%_I8#pFz$THQw*!3zwP>PI|t zXcXfZ?%O%S>C2xpbnh@rSHC>$5YjLeVwVg#)<)<*g1*An@{G(Q%mI6CqnV_&~OJkmg@ z?h^WW?$Sc_=2|uyZ$^wpM3BH>wU1~^qZ(x9;xxkp5A#)SoS1T%nma@29c8WMzZiPu m_A%gPpas|h#%JCx9Q^~phlb=fp|aZm00006nP)PbXFR2Uhh z!AoddWf*|r_dn-MGD#-Mq%)JGILTy6NmJ_$#Y+{mUWy`aDikW>x~QO7UAQc$#S3&< z(XC)z=%Ugf79+LBS`BSN(=@Sd+6LNOnoC2H&Y5%0|9_toP!Zh-K95mV{*U1K_xiKN zeCCIi#=0VEKn16YOA?|eAxRSAYD5%8*f7FXL*lT?^8C%|sqxEC1*P`p(e2y1isgJigGWa?O4SfNyG!-`;x!R-I+qW86p9^wU4xmvIL`F!BC&N?>u^p;9PE7j0XE;hNhZfu zM`u=7NO0;Gg+0yRucb^_e{_{5#xQe#w=w>~}Lp1i-;n_E@Noy|P5IYZ#_mup83 zv2^k@miE{7#oA&c7Z|Q;o%&Sy*Or<`&f`&%miM!fK3lLXC}zv&wRH8x2|oDf^f#N}%^QLGijDb@-tYd1)Dmf_ib{3+PK z5noJCKutA{3B#DKd_B$vh$`X)Yb~lN!sZ;6k$#%KeuXHUr2?$3_&A^GfSM~K=O!vQ z=KE6VCd64p1W6ofW5g<{><;oj4^qlC5cnxp=Pg&}JXPe7QC0qnpZ0XWeQRlYukTFB i`FdU9Q&w(ib0000XWdO#1@0TxW)27YRHjOiB({#fm&N=PyFqwyo$v{-tKv9?%^TG?oEBylm5q6^& zI`G1Z;6MtBpi~)Nw5g6VS+!x=%-Yg*#hRo!H7#kr~q z`sw$++m{#$&Gq*L5_keUh4eh6<6v11j^kjP7M5k<8Wz$tunm(|ZL73iym>-T4)+y~ z9U4ibVgmrE+l{31P|DjglM1Okq?AbI;Yi7^`QHX|)=p865B4UaJwBG#E4WhfOW_ue z9?fuNahV718^v`Li`QtlL!;NYkx!+VlUP26Exe3jw|R$Kh2KA z%;goNR47lwCWs{hH0nDf6A@gc5JDi{xiIf(u7RdJgy!SeM4Bx-fK=-C3~;5wRf?pX zB~h8i7dp&teU2{|Oop-X-?KBx5Zx=-}qqqi%0HHy_^|O5)So{9@g%l>Xg67XkMW&JVA4HiSXb7 z0)4|2XFoS}fEV8VW;7cQpNd5Xu_c7M{^o4ff5d8DCNh2!t2{-ZN3fp1fn(YY(`Y}Y zJ@wXci_)`0$6|)I)E6y{zTl zf62>aQ%58FB9vPWQYnIdL8bUDJHKBfeDHb9KR!nDJJ>s8l;-lxhF)jINF4{z0ZdzI z<$8#>99`e>j`M^IP*qwRZN|b60Qv*PZ_aypNJ1 T>j+0@00000NkvXXu0mjfM)Ra; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/telephone_error.png b/media/img/icons/silk/telephone_error.png new file mode 100755 index 0000000000000000000000000000000000000000..d3ec3a110d943808070c97d392ffdf5ab5f2d617 GIT binary patch literal 884 zcmV-)1B?8LP)=Tne){d{WWFc< zLn7LqM=emnsA7B{*Y)vzAFt`+x-Nm^Vww(~)12U`@&4lyxWV%KZOh+sq!fxrlX2#IimnVEUqy()p{ zvvsRZsIxSAJ#O!fM>}X_bD3BsleKYe)La(V7mOI11W(tF>0I{sk)nZf&t9EwLNWo-^f;Bf2G8^p5XEUs=cUmKx3zc~Hb zxfh?H#ir%-TVM5dC*!AbnQlA-@eck`TbrgcJxt>82&w&93JHg{c+VsJ%|7|c=a#cm zJ3rW;i(rMpvPncN4tRHOQmstU)sw{3rzkx19C>Gkz9aF}*rTt#PK$lv-Dh=hsDCV# zOtD$>F(P!fS)j_+(if!fe-fIPx%AN|#FGxOTA5<3Mprs{nwBsvO;7C2?HboN_i4I4 z%*#ik|jeS9N$LBR6rP44VBIi}x{ z>>WlLS5a{od!~eVw~0h596d3~V}*^QwAi#XJrBq6DD-qt%tV+-EKnL4CEB%(234>^ zl)tP1f;1~+28xU(S3*CYJ^p~Dsyu$?ou%Bpxxuzb3^4&Oq+5Y}}oq6n&8)ZMOv z$RfH4+FeEsZ7w%8oE_1rJ8M&$Q#W7E`M><0=jjN$2)YUSd^|Jb|L|Y<;Cx-SDg8@L zsyvH%V2YR_aZDJ-#Bod%goI&;D~3o=Bq|2nUENs9=N6vzJDRJfjvj2wcD6LIOU>9N zYN#4whKM3+hzO!aEW-HY9}Pc;n>qi%#;R;4m1H)*f)nA&)OGqF>t$?WmO~G><6>pv z>UH}1_Axv>Mcck+M3kOvEt%H6^}gqUno*YYSl?C(&Z8h@tQTT_8l6K#QA-d}N$8cc zc4w20Y&}jD&-3u!{qk2!xFQKPyhM_tkM3t9Do0ciHB`Zg;#8^e3k(g75pJ*HqL|fN zoA{Te^RM(~?4!oos$?dUZAq3_dP{RTmR8n?oZy@wqQn9xpLv4r16?{ly*0JGwW-%~ zzn%5Wj9qV@{bBIPBb_hxc6CsjPO-l^!9TtA)p3G&o9@)7OpMK(|N7(CpQ9u}$&2rQ z-`-f4e!eBsNF zGe@M3$T=RU@20Qy2wTApzZXx}9X>Jo-sPds&Uj|V+vhIGiN|{qe{C6^t<@asPBSpr z&&h+YBBqE6im`Ip6>xUkNrB#1PzeCICn%R2;N6GNlZ1R5cx)W)^NDY6N8gP8=;Y?Kl<0l;wLjXh^p* z{^tmzv*T7Y4*Qe@QADvA(blvFaXxCst<{h(E`CC!5rK<%sObRxU8fk!4>NLYjOMwQ z&38=AGoD(00000NkvXXu0mjffn24? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/telephone_key.png b/media/img/icons/silk/telephone_key.png new file mode 100755 index 0000000000000000000000000000000000000000..cef5dec4e701270adfa86efa01e31106743e40cd GIT binary patch literal 881 zcmV-%1CIQOP){5M;315b@&8vmiw;+euIl zf--d?USyksqoac%ePLU-rfb@)Z>($Qnzm`1=E?K&|NYDk1CibQd@NPv|8U+NzS5Fu zZ@k_dk7ZB`R4}TTAi(nif*`=JdU&2k=z5r{i|hhFT;^d4yC z2~p(sJA=obhafj>3D?sl}CieaC3T@{V2mJY z$F(vwLMieOn5)~6T#Qag09MX~G%Lr44A_G1_kj3^=y8X**+*{LuxGKp8- zB=iF|9`53d&#auuruB=qWFnGIXAVSS4c1y=mbFKl_@N;T4aNweQO;!ZeE7l=lS}mv zt}JGX_h%>0qpGMXADz4O)Av_%I=--{`M-_+*X18R*W&oc8tjeh^6#hpo5P3SR#hxj z<-N~->+bJN&Yc*{)+geP^mfGQOxirPbMIID;w4f8r`TUzAlwsn?%%Dh8QsfT zc4hzS8^`;4;_)V8u^2sVQR*Cvr*?7|Xc>47aq~EdPQ>4(C3`R$DQ%y$N6)>l+5XvzFFbD{Y;D;gk#Z`6ebz{8z>M7L! z6U*#z=W+#8-X&(+e48H#zxnyQiw-qa-^X=*y4ve7p@XRMy5{IR@eY3RD;y_D?wZf_ z{kN#JAH}V>6x>@vjYG}SR4!k6ypfI8ClC`NA`Be~up$qM)TNpFV}~E_zQhAfB839g za+$}gt6x%MsVdJhasJqFV{7VcWozG^pWpc8^w;yh@C^R|1}DVPjf76&ul|g18afxD<+D5$i%kT?-B% zh@vP$#cHiX>433~qz+9mKZ!}K#5BpDef?HZT>9a0-hb~7=iYN4(KHSJ^Rb<$@7Hi{ z+rR>giGxM}O@%^(Dv|_2kRVYMD+1jMkjny;N*Q9gf^XRwJ|6wJjSbYC%HKs{XGiijES+(ecUJCqg00Hn^;u$HE{MPeY~`BavyWTNT3aSPUzc zErKkm7<)U7*4D)s9E@P$;yOLx63zinz0b)K@-wTEA^2KUQIZKtiVz0RhelSye%(GdXp2NHfS~7$`MjV6c8=5Hq5QQdQ^60A;4?4hz^4`um3= z6!VZp3E5-;?5m0Rp^!&A<8oLTkB9RzrfR}ZMZu@@5M>22U2`lX1=zlI4O-fo)DIKi zBdPBN^?mepANeKYvA%oP)-G=hhnfO#*enRv8UB*%%Dp$JvQ#6R%V1n9$j5sa8%KT#rtVSKZ2$&&i&!z57YeEUS@je7Df|=%WcgZNzMqE z7`%(}Od8>E7=FJWcDo$|0|Uq;KcREaPBb?+!R@LA%T!vD$)u5;qfrr6Ln`+TFP{&= zS((P}g9mW3rw`fqB>X-f+S}Xlg-_so-#PH96x>`8hYxljkw_fT1ITn-CEDrS=NKIn zyIz~QWd};{#?al}t(Q_P7Lm-A!`Bp}6q7M?wO`icDcoP)t23;DWi@b-gt_nl^)UF00000NkvXXu0mjf%`2aJ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/television.png b/media/img/icons/silk/television.png new file mode 100755 index 0000000000000000000000000000000000000000..1738a4f1061e2d50eec37aaca71fc4506daf737b GIT binary patch literal 696 zcmV;p0!RIcP)H`oW|{1}@v@LQ05MEhB<# z<4=>;WR@@@AqLtaC!HVPednGQ<4lg$g~L5?&-dMX?!97W^xd6Eo$oxkoJ>mN{Nh?T zKGK`#ALG)s`^~4%wdc0Bisi*@repfmSR`f!P$zkx{T@z?_SH!)UcKGidA1{0C>G0$ zA7?uRzSSI_Ih89GO69MgXFKNKK98zQ zodDp<&Bv*(&J#KH@!=2Cb72$}=}dR!3fra9w=bFS)4LbZ-g+@J1_uWp0QaggGoz)Y zB>|wSc<)(XUsp53%urPdg~G$}@$up0E-(~ceR!Hy^s(H0Oy=QCCAKYOhW5XAsPII%aO9W8L<_45+Wpm z3J{2(s?-F|Ih+_O=Jc>IDrA4Q#$1Wo2cBk)48vLrVrKOB_giagE2{e6@ZQ&E?>*UUmP{riNq~)w4Hgy_YKz``%3%#1@% zpUUhS8NL$7k~=>;Umibxu+IO)Jr6uPwBy#T)kdS0%uY|1CO$ivikSgykbFP=Yx&fP zLmMRfM~@7R+)}DGTdidF!nxAqmv5&4eF4BjPra3?Y~6ANv)tLUv*i!pI9vy~`@ScJ z$~(7JTg`Uz)1`Bz^WVIit}`110QW!gN@n{=p{k)f@WaGZIZa!PRJK=}tL^sBGn3_u z-@TXqvtP`Nv9Yn|fM?caW=1}rj{sDa5CV&fi)v<=8LCRN*?fL{eEe9v1{^Iv_=5cV zXl9@WAsC^p(fo?1tzf|N$%99MV-8?&a8UBs2~PeCchy*^d#=_!-5^8)4)ER!^lHqE zTnsmE7Gie|PEzG+Ev1nLA`v3j1Dpt|N?+i;$7>I~J|~Fu;6GNoSYQnn9D)H}f4Zq|7y4@}vHPWuJni?8OzpbL7CAy!iRU5wxN!S n4dUShi40T0&u5wX=ok4L@Mn!_V?Zap00000NkvXXu0mjfm9%nh literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/television_delete.png b/media/img/icons/silk/television_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..b9a58602519e2274883b9a0175b68dba4904b063 GIT binary patch literal 810 zcmV+_1J(SAP)HO)t@7&{J%4pS_+?(Ixe&5MCN6d@^ zZ=Oj#IkaObiX?q$@n&J-*uEXxuQ^kQtmM}|CPcIg}_;{=eF!I8| z-ooRLl^XSC>z6AtgO@Ixjqfv?1OR(qJ&_t7%9Ye7JwHv&72>$TP;t0aUu!mh{du-9 zfAL)W&;Md(jE|4M1H5%#W@cow*$_Zg@!nG|m(|QLGgOs&z5edR#Ke(k12|lG={@=P z(9A#$yf=JP!<+XUO$7t)p5AvDI1&J4G8xHk5d!%yoTzcD>R72d5-)@T0pOeyXlKlf zbOe1{g(&zNZpF$nDjk7y4ySE!TUrol!*|va%(DRt0YV@`U~~i# zKpe-!9@way5~JEuKoBtkVEF1u`sY6)RW4EM%`x3Z+pntP6ug0YPtAEUsQ{-&5I|x6 z6i@$go?ZK2p}T)K&4q8+adDE#JzcK{07;Utu11^~Yq6oe-Dg(_Wz^~Qb2}z>u+u_)-Ebb7&PWv03^l>Tc;N2ur2G2e`LWKHqN6!NFFPZE?(S|X zlgC+JUgp@fYmDXdIOix9i(H+XW29#*jmuxL<;&MtZ{DT>)b537$gQZe1?R}+a=f3- z@~A4RN~KaEpU-onw#Jnoz9YZAhbZi#b|>L_Il%BAikUGwI%=z{t9b7_*UUEMXCG?t ol&tVD34apuef>c`n7S>00b`kqs~MqiE&u=k07*qoM6N<$f?b+?G5`Po literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_align_center.png b/media/img/icons/silk/text_align_center.png new file mode 100755 index 0000000000000000000000000000000000000000..57beb3813973e69f535a822c2f0424fa9f560303 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%s@pN$v(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P{UFnE&ke;(6i-d4-w%bHR;j1|AyZ#v6S(amDc zlKy{I(;D%Nuye{ncOLwezxwWez>k>{<_3S*oiFG7{Xgq}=)co{r~lFaH2=T-_xf)+ f9X!fMH*zv8ak(u6{1-oD!MC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P`}`P2Tg^+n4;W0%&Nn`h_oB zXMCTNA-w1R;@9m5&b!P``2Amf(pd!#&g=F^W;hsZV)z*wDqmKyKNDyjgQu&X%Q~lo FCIDq2QD*=E literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_align_left.png b/media/img/icons/silk/text_align_left.png new file mode 100755 index 0000000000000000000000000000000000000000..6c8fcc1165a433617355ac5e182d015b389e9296 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P`}`P2Tg^~Il~8@dITHCPA-{a3!-)3Cjx%=yXx z_>8LclV7mqn+PY^{qor&o%8>H%d3``{~Y#6bGV5yoI2touNPXs5@;QRr>mdKI;Vst E04%Lf&j0`b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_align_right.png b/media/img/icons/silk/text_align_right.png new file mode 100755 index 0000000000000000000000000000000000000000..a1502571c99fb92b1579c3658bcc50c5976b8e7d GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P|9aJcmUe!yIVina{lp#RFZdm6TTlr;aYZ;9)u zJl|<{@VEV{yZaY@Fz(E|@awC#5QQ<|d}62BjvZR2H60wE-$x=jq}YqH%ujg@wF_4MbQj@OPa$ z#N&HdE16k1*nCBr=}I0g*DjHSSAtwt4sItn>RWmQ;^L}U19^Fv7BBYSby+aOzJ$YL zj>TS~{$Ts#`4N9lZ=Cye$+c~_4@}ZK$@9WkqvnrvN~H0Mvqt#~n0udf&TzD|;=Hs* zf<-9y=7rhpPXE4Zb^}|6b=Y6y(;Y{!a!g z@UQp#@Aw}>L3(}s|7f5BUjeuKZvQRjV<2U7yvu*H{aAbvQ6K!@3oKzW z-{Qa8d3gae1^)HE{~f^!v<1}u>;4xnKvUpW540I-w9J3a{{r=B3T*2g{_BH1CtaZO zpZ`6V0*V5g1e5i;`_=Z#_e=H*@8|93RG@lX;D!K7TKswwko8{x0000C#5QQ<|d}62BjvZR2H60wE-&X@N{tu(Kw&{=X`^_fnmU^23D6T z|NkHVz|OPW*vP=;@BgD8WzABvu@M{$HPs!^U|F=gR-} z&AETiZeUz-oG szv_+eu)PvwoyEX;-Tuf72ZK!v%2xjJ(h^EWKsPaXy85}Sb4q9e0Nid~c>n+a literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_dropcaps.png b/media/img/icons/silk/text_dropcaps.png new file mode 100755 index 0000000000000000000000000000000000000000..dd65786a7be028fccac7dd336804281596643f66 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=u@pN$vu{fRl=l_3uX4QtyMyG~E z2bbS{CJJSW*BHcfl8hTG_(hr>Lqe|nkKbQs_~+l>*^DmDAMWj~mUJxYIg!Y)N!CM> z*|4K5Ht^-f_7L$FCexixdjt52Tl@RZ*Uva>Q1k4JWQaI}X)BZFgk#kXYh2c7M=Y2% zb%9wMqv@UIPmXLQ3>!P=&XsNB&bzy-Rg&!qLxqHkn_JS2roP0D42$O5*ZZZ4S5#O3 zS5L7v`uFFj@zmIa?CjtFpP!!}@t6B>{l7ns$F3AI9^EO(U@`aN<^{{<{s#Js!PC{x JWt~$(695Iyd-ebT literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_heading_1.png b/media/img/icons/silk/text_heading_1.png new file mode 100755 index 0000000000000000000000000000000000000000..9c122e91e358860733eaf08fd543e5fc585d4cfd GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x=IP=XqH%ujg^j!|20W|*-XbO@ zAtBSd^khRzd{=pNv@vN)9uZDqGTXuVPf6#I=?;x2B`Y;1YQMI>>GxvE??vtn{c>{A z7MYxUVrui2JTF|YR&ldntL8M3{q7no52$4`vIX;r@S8@YTFOM5*~nV4Gk-UYI5L$} zDw(h9UDksmVjphbEsSQ?UdGUxU4Htk{EZoY&3@-Y5*_;Wwk`ZAkg@!FaC~ii{N>;; VD%(>GD}XL$@O1TaS?83{1OVXtVO9VD literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_heading_2.png b/media/img/icons/silk/text_heading_2.png new file mode 100755 index 0000000000000000000000000000000000000000..fbd87657fbe001c0a78fb095284fffc32e739497 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$ROXGNhtQ`{C(%$wdeB3 zGTnLdz~IMJtNg?T>Z(s;oVU0)KW5x*9xvq)rPF;` zY|Fc4&#rLa>Txf#@y+aKf+ac0%`STzAI(*qdYo^XFH557y+_x*JpKO5^1S9?c^6}{ zP=+&OVHtDUrGNmdKI;Vst0KHFj AM*si- literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_heading_3.png b/media/img/icons/silk/text_heading_3.png new file mode 100755 index 0000000000000000000000000000000000000000..c7836cf09e4565cc76c13bd14c13971c9e093c40 GIT binary patch literal 306 zcmV-20nPr2P)wEzGB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_heading_4.png b/media/img/icons/silk/text_heading_4.png new file mode 100755 index 0000000000000000000000000000000000000000..4e929eaf583f10cf50eb1666ff6530b9d4cc7915 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H?&;zfqH%ujg^j$;1_G=B-XbO( zon2btF4r#xDw?mmvtwaL3R_~+Yz66*rrQmiHySwec#9a-mn?F*9`VcnzTNDrbNY9( zxOA;CUb9S|sk-b7=Pc<<>lMA8+|AaBj(NoLhh2`-;+F zenR#-z6;(Syt?;Ub#DVE_OC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_heading_5.png b/media/img/icons/silk/text_heading_5.png new file mode 100755 index 0000000000000000000000000000000000000000..30cabebf7445e168a0f31b0ed68c43d54eaf017d GIT binary patch literal 304 zcmV-00nh%4P)ZVg9Hj*!Zw zxkAM~zCH&l><=6QeDdgV4l9hop+%GWq_IPV?Z641X8iiHrWJUN^2}hSiGjhsfbOLp z?d`9_MC0P3jVAVsEwEMMb0n zB0~XIzS#Ls)0t~Xm4+o)ss{0VQa0sa#lQ zId*4emlM`ngv0=W5j91YWvvw=LS5IWstQs{pJiG4EQ-Qop69~#iqI8W2WgtxU#iXf ztEXoNNs`zvs>G@%#?>c5KMuD0+hH*s#$63W7TOpnMy0?=cxd2!k;mO;x%LEZcs6dg zfiV_j+#shGjBXInk>NV>r1Qxre!Ic-t~!+zPb((S+IXVgZxH;I|A62L)aki)c<;-^ P00000NkvXXu0mjfr4WN8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_indent.png b/media/img/icons/silk/text_indent.png new file mode 100755 index 0000000000000000000000000000000000000000..9364532344e4b182fc286c4ad78c738533335d73 GIT binary patch literal 353 zcmV-n0iOPeP)A?80v9Z^YZA8as&YaOiG2qAVzYLj+o?N|k`)kPFX7%epMT)pIgD?z$ zz0k7x#eWfQHil2%e>0rE^YzTbTVLW%P1UySD{rve8ZZphV4}^gtsg#oV8j^<1D2Tp2_^}JGDwbz00000NkvXXu0mjfU=gFa literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_indent_remove.png b/media/img/icons/silk/text_indent_remove.png new file mode 100755 index 0000000000000000000000000000000000000000..1651b074ebe5f830c23c909d04ed3282cb8892aa GIT binary patch literal 351 zcmV-l0igbgP)$KO_&&&86Lj*&d?hr!$_C#5QQ<|d}62BjvZR2H60wE-$B^mK6y(Kw&{<9vg>Q9!g~ne(gm zmj4swoA@7?D86%i^8WzK9JM17E&sp&Z#dpHfz$E-U9ks&4?Z9Gyg!%0k2Q{M-Tz#> z2OnD>vrPZ*#{EHKLq)>Jcx{H|Ovdb&|4aQZWSipI{El%e^Cxx{^9vSw28s;a3IDB= TS1%U=TF&6<>gTe~DWM4fm>N^1 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_kerning.png b/media/img/icons/silk/text_kerning.png new file mode 100755 index 0000000000000000000000000000000000000000..377def645978fa0172693189c69393137030dff1 GIT binary patch literal 495 zcmVn~4Xim_?2SqtKIRdGvsr_+rar?uY zI#~heudl+IuL_?2zxRcWA;4J<4y{sW!t08%R{DH(tg2Ko8<0hyVZ0w6Zf z$@_zYgZG2j_T|^w9V@O*gF1P?yuAE;adB}40RaIA6a&)J(*qI`5*#8TA{+t&0usEv zz5fH9>|maANho&4y;law=T(4CPEb}>{?Et9Hy}KD6(BY@H}`!uHa3*N1Ub0?=w!H`EG;b+3=9nFfljUmI@v)x_6(<2Hrh002ovPDHLkV1nwT$M^sM literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_letter_omega.png b/media/img/icons/silk/text_letter_omega.png new file mode 100755 index 0000000000000000000000000000000000000000..5075ec6b850079097edb17cf4ab7507341751067 GIT binary patch literal 541 zcmV+&0^H(oRrRq(~AWF-B$wEEF_5P#dC*3bGSjS@Q@3 zQei_)I)gLJNbX1Y+g)hTjNKG;v2HedeS80F@f!fZ@EaNa9MBsQi^ldO^2n-_SKE}$nU7=6ST zj%A^9DHM*qLw7)k76O>v zuTf7_`5Xah0F7>*TE5D_Ohm>%WPlxq5|oWTQo1!ZFY##ULV=nYZt%OgV(e+qc_c%% z{Tb=j*d0hQ#As@8^JsiOjVq@T`KroCpN#z>0aw`)sMPvks&{eP44e@es_f5n<#dAT zSWmKTzGS}67BA0|aM=<|oGKoO)7DK9Gyunu1hxYSrcfFtiN^QR`AZ|)A`B5(w?wcI f^MD@U-?s4sJZ{q)Y&_-b00000NkvXXu0mjf&&BDg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_letterspacing.png b/media/img/icons/silk/text_letterspacing.png new file mode 100755 index 0000000000000000000000000000000000000000..41390f54901f8246e92a229741bac31b071c3eda GIT binary patch literal 503 zcmVIRgTm)FDCIXO8Fsi~>^CdGH3S3%D0q5${f?U>J~@nHi9roGbuh1D(9z z%gbv&l9L^@wYC4t%gZZ>i;E{<4a9_mgn)>M2nV2(9o*gB6P%r$|C^baIl$y)WMuA( zh=}axz-dClyIV_J-BL~b4e4$0H9{wt{tzw%sTk? z|AgJI|M%{A^}l1=tN+cLp8wBV{P9en#AM1%O{<>miNN=p706cqf= z&d&aynwt7QAtB*^WMt(3;NakFtX`O~`}Kc{!k}-*E6NOL+wu}_Kze%m|HQ<^|IyLW z|3gAT{`>m+{&#b8`;XUv+BMH8b3yXlhtDW7AZqG8xB>qD{{KBZJpMa6I{vq^vifgi zWb|KKTl>F?ipqaEIk}Zs4M>{#fHE&cPrXOJ0iF#vu4T=C_}`=9##IpC#Kh#kuCDHX zH8r*W^78WkB_$>Q3kwV5js^Ab)0(c;*G_|Ivb{j6W()(!!2nMa(hM;Jfqeh~002ov JPDHLkV1nKcst5o8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_list_bullets.png b/media/img/icons/silk/text_list_bullets.png new file mode 100755 index 0000000000000000000000000000000000000000..4a8672bde48f806d3d4d37db192588a9aa3eac10 GIT binary patch literal 344 zcmV-e0jK_nP)PbXFR5;6H z`2YVu10|S&DhA}te_Swi*Xsu$nk)lAnzx?+_#Z@r_~qs0*+Bfiq@?73K|#U)?Ck9S zsi~>|6A}{sM@B~e4-O9gPhA%bd?2RGd{of6>E(lvp1b6Ep>6&12TPB<{a?EDDL4@0 z;^ML+A|n0=1_u83^78uc?CkvC#>VEqiHXU7U0vP(YHDhzff&$ntDt1@;|H#l*M@2! z+U8#>h@W=vfpy*`^1J}j+`sMRe-I7g8yOj8Yin!&S5Z;VicFNp}SURRVGD{CSNFe~ni^^#wyl5uzj4je z|23%2?k#{x(*%mqe9M%mih+W%ElRQ}7!$^91> z7ymCLB=nz$hvz>#JNtiTW@gkt1Zf0eyP_){bPq%T_kY#2Z7&xs00000NkvXXu0mjf DNYA0= literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_lowercase.png b/media/img/icons/silk/text_lowercase.png new file mode 100755 index 0000000000000000000000000000000000000000..382a102e3d5598e294101172dbf2590ef91ddac2 GIT binary patch literal 709 zcmV;$0y_PPP)SW@7!&*@Ou&cdKUy?8|jDh;r$)X^FHUK0Z9A1+9pG2o*-!S zhM;u^zO3)BuYZE33E^Si48g_e7*uSeVbcIDy9BkHAFUsaL+OgJJB~W8e?K;~3e8vy1y+KZ5djw-d`1PkiUU2o zE~!@aq@v$A+XDOCER?qeXvbra_7O{>mv@!7XuJYWxue+EvBIR>t;A9Et@ZH>)ZUFj z()03Xo{1MF@|-T7)liEvXBc}JPM2ypT4<6&V$8)s<7MPra{ZvXzU(d@C!7&ndlE+$ zvy6;ZPL$F>Vh)R_uCIcso^<`z_3vf4sWW#3G|`oI>Vy8INBmQ{J-ok)6`&kmMOFvL zB(hxwjwu}oqr@7<_VWQIC4lP6WHtiJ)33-jE+f;xiKy;w`s+%|xPZen6W0f1DFIYh zS9&9i-bZniIU>kxTSAs$335va`q59Qxf#Ksb`IjYMOjh+y{?GrvKjgyb~FbQx_W7ev1R)}^n&NG}0M00000NkvXXu0mjf9u`O1 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_padding_bottom.png b/media/img/icons/silk/text_padding_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..4880c43a14ecc3cb1e29d8cddc4f387a57743615 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%s_jGX#(Kx>}(2>uk*l_t@;dN0EviS{mT zvGu&K!k84#EqwClM$Vqeq31P!wKX|r@41%rr^5Mj!bSCsndhIXFx>q4hRt2*@LPwH h>8~X2DekW?X1^%zd1ncGXCcrj44$rjF6*2UngBWCTFC$a literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_padding_left.png b/media/img/icons/silk/text_padding_left.png new file mode 100755 index 0000000000000000000000000000000000000000..b55482eee4e7b0ba2a88d4a46005567336f8ff7a GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x=;`7ZqH%udL_;nnLjl+Ll>Wz( zIeQwyH^i^8ZQrmpJYqwvw0?qe1+OEEdf{i?O@iV*XVXsY`Ty*&#mE0=XK;luxHIb9 z4YSo}n%D4fBwGjp1p#q9X9h{oRCy;FApL49`wQp091V`y_iGV}U{9{r3-4 R)q##>@O1TaS?83{1OT)EWo`ff literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_padding_right.png b/media/img/icons/silk/text_padding_right.png new file mode 100755 index 0000000000000000000000000000000000000000..106edae52ddaf5828f2c13d9a3f0b765348ca360 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x=;`7ZqH#X?&-n&<1H*t-4XiFA z|NbBT(EiX|;vdt)=eL)BYkFIjmhz*Y`Q6X|5C6~m|6fsU$^Z73Y=>6wm*9Kh(DR>v zbCQ~}+3o+zcLe_a7x%GevD>fob^b$n0Vh$N)FaE}JsaQGtK1E*H@?HT>!JMN_?D)# z5k5cKbDC@?aVGq?saOBXe{&-H#$Ak_jf_{s6YhrpH>hE3KU}$i$*n6{nBfgu*1H&+ Sq+p<989ZJ6T-G@yGywo4ifyU@ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_padding_top.png b/media/img/icons/silk/text_padding_top.png new file mode 100755 index 0000000000000000000000000000000000000000..c5c45b2d6e3485f569b4b84ad4a6eca343422381 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%s^K@|x(Kx>}@HS_I0neTeWy_X$ zzlR)kJLWKV?CK3#{b1&`=hMT^Ok|mL=jj3`8~2v|+#9v8zU8YG>i!n;jaA|1{JRO> zi*}22JWI(vtlgq0=VdiDGEr2y=g`$KCs8iH88+V&u75h~eC}h}%?j1kvz#}y_po2D hSm!GL?%~(XVeJ1s?|cxdKM8aRgQu&X%Q~loCIFXdTtEN- literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_replace.png b/media/img/icons/silk/text_replace.png new file mode 100755 index 0000000000000000000000000000000000000000..877f82feae4e68deb2af0b8a8100a141e4f9668c GIT binary patch literal 691 zcmV;k0!;mhP)%W!&uf*aR7m=b*g|(kUJU9 zp=n%1olDSG6tD^6Pm#c6n|B4fFQ*MV1`x;`99zMDR*0#E+F^m|oe836+P7h!>#yE1 zfI!Pp|0)RN)PgnUO$R@72rPJU`eo0n-Y3TD?vS-`EG)AfK{?SrAt%}ba;()aIZ6Qp z@}w&6x|k9*7g8`rL*Kdi8;ED#;QEIV91l(YIPowK+e{Jd0T~0&6kK`z6@7djhdf!w zwp#S^9d~>P!TC5WQwj!Wi!>p*WY}^u%h{eQ=zmnefl-ky`!{2#b7T1JN1S<4gx>S% z7mb%u>(n#eMi%C6?_t0)6t-JzDG!NaVz^b*qE`c@Om0%1= zpr*5B14!3kn2^D}|Au;ZM%_q;bhY%VI5ex^Fx52YQ--nur0X!-_-*q03322ghy(&cNNX?2}d-6ZV@ORut;!KHNq*K6#He9hTK Z<~I`7qRvVbo(qSIUSEps0Q zUAr;NZG^#_4#09w`|BfW=BSyYW{#RUYUZe!%aN8eSM+R$yO)9~xWneh`0_bwJ2z3R zvrY?I6E4E|7xT1sOU>o5-Te;Mw5*|^dcu`kX%q>;$_F=tdyg6kUl(HY>9E*FQ*c$& z3MlB3C=DXPUx+Ug^$VQ5Sw}K5f<(}Y&`cWm)^1Sn6&5VGT_T#eM}w!xAf8TiNJh=L z+NwumgW~8dELd=DCv~^pI^3L@@E91uoo@nRM;W|^4AqxbIW|Xz4i`!hT_{9glI)z0 z5%aN;^zQW$v0wqqva>X6a+Y1UwM!GBDKZu?k-~2uQ`kzx6c+#6H9iB|X|uV2x*{9^ O0000C#5QQ<|d}62BjvZR2H60wE-%c=IP=XqH#X?$N2_%qYIvnKN~+W z9~Ca*U!vP_U*I3(>?ZD`Y&-c@{(mg}&-h1dLFs{j0GSW-70)XEtG5VfT;0^m6lQ+J z+U3u8W~~h~6Sg>h-hYUxlQo0ukSx=`-AtkqjK0A?{?B(bVDN36-+a7&HXBFuBYQFJ z7+INr(vG4WNx=!554>o2#>TpUpG9^D-v)~d)+;_bGW>G+5&iVi|1&@rGI+ZBxvXC#5QQ<|d}62BjvZR2H60wE-%c@9E+gqH#X?$N2_%qkv$?&V++! z-fX$@sb%KG-5a$|R8J4(Tcmu7`G0cYgxS-++3#dN^zA^J(=P8r|6lx9G_LLaZ+v5S z!d9iC@)!RP{FnQmdw#}3Ee(C$|NPA#|L6YmR@fBO9w|C7oMMQ$vc`Tu(RETvC<`(>OPJ!ieM-fH~m>7>jJ-3AN;KsG}ItN_H<)YO~+biscK35gGaf`SIg^B!*iYEReM4Ple+T`TtK`;KS0!apVx86LEKKJ4Opo2 QTmS$707*qoM6N<$f=73^s{jB1 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_superscript.png b/media/img/icons/silk/text_superscript.png new file mode 100755 index 0000000000000000000000000000000000000000..2fb2a7c7483531a9f518018de41607eff409019d GIT binary patch literal 421 zcmV;W0b2fvP)CG+sNmIhtD#~2^Z#UfA#v8j z3n}v+J-{%ayuAECadGj1+}zv)X=!N(;^X5L!o$N4`1$!AaCLP(08(RLajhY2(!C4j zIhPDD3;=2l0BZh_l9KWtsCfcN45+yQsCj{njg5kJ(UkzF>T3&3GA;-hCSP#Si$AM? z;RT@04nWQSBO@dK12q@GYzATP)|&^?=RW+OJnO;#u!(m+;0yzxvnK=w2L5+*bNdgp zS%Bnd1llYB((K~m^54kFXadOwfSe7qxxm`m`oDpJ!G8q>1qY%G0ND%;umTWYQ&V#S z&;|b`BqTlv3JMw!GyrPz0g$tSnhk(99{_4T0MvYdi;L?33k!?E;LJ<_HjJTTC#5QQ<|d}62BjvZR2H60wE-$x?CIhdqH#X?$N2_%BY~9*Y!?2h z{rUe=9fy8l?U(-(m`sFEeV_iPeWNmK)A{6xz&-Zw?GGia|0}^&^gUfcv*1X`gnjmc zo{g-_np*x&^x*npDC+Wt-z8{4+sXs`@BiMP%+Rv-k;3)Ae_+S0!x%EHv-|4^N|MkDje{TP~{@MQ}vm3aX7|tvG V&AV6mZa&bt44$rjF6*2UngI1lb~69~ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/text_uppercase.png b/media/img/icons/silk/text_uppercase.png new file mode 100755 index 0000000000000000000000000000000000000000..8dcc2dbbb212b01abbf346206e933171945a3257 GIT binary patch literal 747 zcmV1EDu<7r(0?-_Pg!d!8HsIpt%b<}90x zDMxvzT_Vm56BPEut@7@FlT+>#73arAln#?v$sox)-W#`G^N1+86$@nrD76#CNgD|j z_a_)?WscsChp&t$aj>1st^u`bs5MqLl#s1q!;FNIJD-qmh$yoHoE}bqTGtMnxgu)S zXoDkAd3!f>k1ywD1<*K?IK*&k2aFt3IXm>#{>qBM7u`^M>Yl0H6}c6Tvc%1Y;s6sA z9HxNuzC9q47QaA@(}c|cs5Q3V_yPIXBVqM}o|o3=U08}fLg$kX(D3@H-r_A&K#NIFG)9+GxVtF9F!gyg1NgI2^_*(Jvebfwh#$UpQ#fHM+-?h|6-K|Xd1IR2c0OH0 zM<9&`ucZ7ZKptw|n0`Bn`>&liW-Rz_^h;c`muxh7$a4SU7qt3QsCVxIpkaa5md$b) z=lc4#I)h0xy5n!C)oc!?VVX~&&LuLtHrSbFU#h5eRzSmKd{gfhDyfxeqxM$cDzr{v zZ$Q&bDzDKi@?Ak5_0H&mj^#4nsvQ$xqLAuQeqv7mt!p*=640^H^*RT)QfvRXQe%s( z7+i6f=Tf+6=R>;!^iz_)!$+%+$3TNee%)QN^RQ4rm5qe|0_Z(bUgl1E<5dUuLu-!) zYFJ@kCg|W5)XFrt1avQ?QOhQAVSp%q1L!72J$+r&(mQKdBHsxbERuIs_xOoQ8-Z$w d$ibbN_z9tvwRADeG)w>h002ovPDHLkV1lyYRw)1g literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/textfield.png b/media/img/icons/silk/textfield.png new file mode 100755 index 0000000000000000000000000000000000000000..d37e7304e24c78f335466b07a898480a26248edd GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&9_H=O!(Kw&{<9vg>(FMnYC;$IY w3^*un^MTdn;7P{?4C|HS{~YI+WOIxGs_iP%+I;TWWS}+%Pgg&ebxsLQ0G+Tf(*OVf literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/textfield_add.png b/media/img/icons/silk/textfield_add.png new file mode 100755 index 0000000000000000000000000000000000000000..204de72316ac13eb8456bd8208f881939885d6d4 GIT binary patch literal 321 zcmV-H0lxl;P)4KV|@pIrODbY{Z;v_Aj;iCtd* zm+qN?Y5+dG>FBcmjjI#?Z@Dt{|Al9}{`c?B`XAn}`@em0*?$I*DTHuhm*@YDmnZz+ zcx}>u5a`*H`oDiq`hVMedEyd_PqpFyZCB>}M+TcNP5p14ElHdKmO0YjyLTo1Z{L*w z*4(}`0qg>x0pE!-0I0AfxJToE@2(WE%^(`Y2a5L)o#ugxJAn8T$k|Z310)Ur_h~;h TM?3Hj00000NkvXXu0mjfa9597 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/textfield_delete.png b/media/img/icons/silk/textfield_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..c7bd58b21797817803b49d3b2b53323e17fda625 GIT binary patch literal 335 zcmV-V0kHmwP)4KV{At)KG$c#_utJ;JncjQ{ugvi#ZM%3MWsnm-aQTLHB3 hKFHZ17lAZ`!~r__K9H;4^nI0$7`a(T+P4hBKZ7hk58-_j0w;$<(*=f7ic$nT z*Wgd55in08>183j3?S=MAoDDTLoLSL$!_UDxXqSf-?qdd@H%8(We~hQu&uVIo$6NV z(zMY7wn6r5i617ZGZ)-J($xXssTcN*&WujcIDRIp6J4_PqOvJ}9!p6+yo8LmAGS3~ xN#Qq?aIt$6X#&>g?8!V{ znjV^ye=2;qm;P{$`s;H$`x~a}R(xgP|G$RoO>~FD8I7fnS&nXWFMPEjPiNb7^=IwB zO%ASl$t*T|^U-%%8&{}vv|YWQef;Fc%Euzc)I$ztaD0e0suWxYs>%u literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/thumb_down.png b/media/img/icons/silk/thumb_down.png new file mode 100755 index 0000000000000000000000000000000000000000..3c832d4c83cc0f7869a83f88833699daff52fcf2 GIT binary patch literal 601 zcmV-f0;c_mP)q$gGR5;6x zld)?PVHk%KwHXvA{{RQkK^zqPQ*`Jo3NFS)5G+C!og7>$D6NEu!3M;jM7RtZQ)9g& zq2Y3PT)1!{94U9^xG!8xj6)xXFPclGw!?4uK6oB}yu5D$NbE`yI1Hp{cTP^eKY;ujW&%y5(3%q}8&Iu+Z9^2vgn!@=`cv5NLoOc^Y;-QuG-PEVz;+}o zcENrCULQOkUgTneivF3xTc}jz)O*_!j#u{k5_Y%2vSBq76X>=lfe@Sy)M^rlSN41< zFBak9y3SHYoe91;AFxb0c`@LxEMB>3K(+u^@@dlfv)n11o(YQ9DYCV@ysWAe)bA*@ zA?~zt*M)ZwRm*@RfYubyBDcy zzi@ld(BZ+WEz+fP2fGEuIfi0A$28@nAFW2*$}b-Lm=yg4isoRq;qlX-+{iBf5B^t> nvr??6H@Wu&uC1-?2Lp-UJe5p>RuR>I00000NkvXXu0mjfVs`!d literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/thumb_up.png b/media/img/icons/silk/thumb_up.png new file mode 100755 index 0000000000000000000000000000000000000000..2bd16ccf294bd944c6bf17fa0345885469980820 GIT binary patch literal 619 zcmV-x0+juUP)EAdBAPtT3aD}=*%{NbB*ZGcS?IC*5jinhDl=TC) z^a(zA>EnR9^9j#^IEMZn^!id5#SnEtL|{9h>X0|4DCpP8H?Ix=ni&xHWU$qNT21yZ z5^*RX2qmP^fMQ*vP*nzi&BkZ)YfvhI(E`_#urPuk5&HpnzVw-Gc(=*`uwjlh!P+m)3pz5ENXE;8&W2W*v~T!vOF>0KmQeQ*+S#{tWRxh00jSgfv7 zu5dK}P{{s0ADkp>$Chu@w&3}~KY;h%H7W`eKSHGHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p`EB*FHYdKr%;k=xO&(k^EfNlSiKZ>5l+xr|%SFOV@6-ysFmD2F5 ze93OiS+LaQym;|2f6tbH%~V`D+ND?vc>4J^KSLxEMifJQ`8>*~y^+pGr&o-n=LJ zGWB(yB#;DR8&Lhqi{0(#wc#SwSB~jZKzIFx`8od>2Fo-Pfe7*M8^q#qw2yTxiXzd~ zRaz|F*rr78G`JZXG*YX~5K@5k>G@0HdlBo-6v1jHye?%qRwO@+-hO7J^4LlPG>@A1#{ zQFl4x7tnG)+cz_2Mq_f*H!U)kgg{iHqxT)Yr3ec@K!`)z_%h1c0Y2Eu(dMPkrhq5v zY+bKWfx|sTiOEB71HuwS*CDzA%ReBv4*7Zy7RM0n6`5#chfOJK`ze)Y6>d6Z?UmyNHH!3DdsP-ARyDo}1HO+>7_um7 zx_gj{+_aU_OUH_~Jd?KI#ICZujD`of2mDpCv_zFGE%6}tfL|j!WGu_i-u>4%{%d{$ X7`zMSfT21V00000NkvXXu0mjfkBx0` literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/time_add.png b/media/img/icons/silk/time_add.png new file mode 100755 index 0000000000000000000000000000000000000000..dcc45cb22d734911a75bd4950e2571a16605a9cf GIT binary patch literal 827 zcmV-B1H}A^P)3?6FD7nDHK>VL42oe(*rZTUs{)lBOewOJrAS)@sgRZy z%F>hyq)^%d($a+jvbEIPma<%g&wCql)nJT?C;2jG&YAhmnKKgsAmV>?EHES~x~T7X zs+sKJY)$uZ$;sXvQYTGaS2d(|cfZX!|5t!kR#0tLbM}|5W7u4C!0-2gAiP*vG{dZu zpszlDTUwr!_ea36B)`&b5W?qi!|L|o{h$lgowKNt&7f6j$CPayE~_4jy2lXZ$7TKo zP_^Rg$&G$-I%;z7v@(FfmgKcnw*_L=0_Lcb zLkC9)hC&cDim*X}0(*PtR1HFFBT(FKf@MOAIxfq_05r`>yFTv5iHukZk`&|+%R~ULN=n0< zwMH{M2Y|s#BDvxd+>Q}6WV3z(I?H054vP{MG80A?2&__JW&z`G!!PDX?YR7GjC`?n{pDbW%Dq)z9LBVBN!qPTXY$6O9kX}RpA#Z z8F+~Dfp{9Q%Y39-UM%Mw{}$%PsxdTSK!IosPpU?dUZKMkZX^^l_4w63ngulA_kS(O zy_Z+Zxe=5L?_x@m59gd1&eSqXN&&j;A0wZRe+P0j{YEgzubTh>002ovPDHLk FV1g6?b$0*& literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/time_delete.png b/media/img/icons/silk/time_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5bf8313c6fe2d345c2e2e27e163fb9a91f902f40 GIT binary patch literal 853 zcmV-b1FHOqP)LI8ef}kKQAC1Vu3=||mNqz7>Z<*DWS(X}8({x^D&e^=6 z>88%hn5MS5Hq)H$;+)OP=KODSbNf%kRfIoX_w44(Ip*@cSPfat!hc zgGXB)iRGP)^{>KgTHcjKOPiBcMAb>{?eDTK{}mwNv&vMxjBTTO3~S3;*lbo%lm$x* zDyXD92;awUHor;8{UczA$1Ksv%3(Ddpf*_XaX^nU!8A(w-_X#b!Q|Wu^y*P`SH*$D zj7d8H5H%EBk#(lhmQ_6@3KLof_0Sk?u-F_h+cu$Iw4tF_gSKHEW)(f)KE3CxVm-Xz z1N7HrbkCE(_l0%v#X5M+N>P~mv5YNp_sZb`D!Md~Dh=r4rl2AxqQM6ks83ur8K%G$ z&0~hV?A-Cd;dFvs!@(*6+1+jkL<5k_QFz&;#MDGHs zx|ykH-tszZd6}+hsnhA4mbcBhIj@s?`p*w5Dg4rb2i|jDp5J@k!+8k+#Q$jBrm-;b zjI8KseP=m!=5saO(peF1X%Poc*5m}2mc9x+;BA8joZ_!YmwbVsN{z08NoZ6uRAxT} zk99wE9iT=K?;*?=p`#Jtp0>~VF4MrJWP?Gx#eXP*EB#nU_?@Z5Hb6Z;aLJ(mhD4DP zQ;QZDmVaP{%+R8k5WXuzSR@m*vNnW>-SB|th*3=&a_QF=ZGh@5za{pKHCNUK<JI)Ln2%+72(CGdRsrxF>Lf1A|cRp%M0f4O0fg+bJ#7z2L=@OIj}F;-Xd7 zm`%AVJ{q%W_AdV{9O#6cG;jUqG;SpF%DVmZ&DcpJw)}bi3kR9nL}HfOaR2}S07*qo IM6N<$f{5djdH?_b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/timeline_marker.png b/media/img/icons/silk/timeline_marker.png new file mode 100755 index 0000000000000000000000000000000000000000..a3fbddf88b7661e9ee2a434ad4152cc724db24c5 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%+>FMGaA|c6o&@rz!QG)Hl=lY!! z1v*=JI|P}v6PV8&74ykGbnHgML`m~0TYQt3?ajRZzjDrI(GNdQ-+es!^5)m?umAh| z_lML2hJx>}8mr}YRTjS1X5c%1=To>j zEp`{T<8b2%3kmpmE&u%$g;f!Ou2+6+ab?{tp`+Eo<@Tn7>)N`e4#yAy(KQ_jApxR2 zTwy>}5{4Z&HZE$4TztEY4eB^wEm!DE&<6VJfqm!9 Wxdqp5p1KL-FnGH9xvXIO@l#-%@K+Q7zAyIUxr7=;KLsPe99&9Qy zmp_aWYb=E&ic)qE1ceaTL3I)s3+v0Pdzpnl)xpCDFYk3f*Ymue2{3J{X-|sELAYmu z=`Mqi(_pe~fr(oVM(R_x-rovW3XC#01TV%_L0BAvr#_hKf!+|yzTW7{?3 zIuq0Vz);x1M>XE7-^4 zB)oZq-|zSSd<|RjL3Q0FaG93$Sb#=w6_iQ0NQ>FM@oa+ksPjrN7+e#)=Jk5tx!vxB zO+TG2$)d_PZTpo~g1ZG9e0&b?=MikQx3}AOy1Ns6Sn&5>og;!Hg4gVJ`{#y+hUEVS z2o4GUBDiwY}B+wa2=)lh*=g2T3C=Dq fF3wcNZJhl8^(M*LyGLEt00000NkvXXu0mjfpmtoM literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/transmit_add.png b/media/img/icons/silk/transmit_add.png new file mode 100755 index 0000000000000000000000000000000000000000..b7fd4e685f6069f24879e9f0e381bc410832a85d GIT binary patch literal 803 zcmV+;1Kj+HP)}axRi;}=4r+) z3SP6qaP>4p4@~rygl|5-8O{?hz+@M^a!I*irXQX=V9WwN`2n1{d0PXGsKiQ-wk!bGP`tWfAL4Wq9pM0Aa!>!&@_k3G$ZH8})ZLKqDf z6r6I4DxE^*iAW72CNsV^(KD;Mdin}N>CT(uX*qP|LT8q|Z-X^{j{38qRO|H;0hg7sWIJD9oKUIFk%LU;cqpfyM$l1 z?95f0L82SLaSPGaO-)V3`Fy@e(bdrq3*|=wlpYMCC;~ciBw*hUjp#1ndnAiVSGTLh znyBi2qswqg;NM=a_ZLkGXGHfC_oATSfR@7jt5+-DyP%Qne&BIFq8kw1V9||Hw=1xN znPK?o!Rd6`4UNgghQ_3y8MPNlHR_f-OQY2Qxq>y>Ai5c{m>p|Bo4`9|@`Bs#UKV({ z+*&YS)}6|eSqn2?Jk*V3kysZ+sv&ehv*oWWC2*6#3g2JC*D0=7p2qdYjO$%J>Qm!Q zr_OtmquIL_w}TG}{70Q^x7&R-o6UE=D4N09R@OfQuPti8*69L!1zr@mb**Qa%46BP h1FE*vy!x&7{{lR##&^9e`^EqO002ovPDHLkV1lG4b!Y$p literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/transmit_blue.png b/media/img/icons/silk/transmit_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..7b1142fc70adfd598ce6eac581421d7e6295f370 GIT binary patch literal 814 zcmV+}1JV46P)^~)@W#UgN8qC(979%Vy9NAeJn`# zSw2!>g&{fNR2$Okoji4(4lt5P$>r&q16P0#(CAS`X1XUkTWj$WH+~m^i1nA!c54U2@ zzUeSE3@r(@mOzU7Ss)3zO6X49?eVdR`>f= zD(&<}w=25V_BpD%QfK~{4*0vpV)<6BAI*U7!YSn(9anIo^h$1Lw4>$RCWGxdm8_qj z8-Z>jbWcRL3)o3FSHo3#4@0T!b!F!4__T7a7X3qJoMEqHkXET~kf2YcP!3qAt)$FI)g zfX4xE%Ve@IB_$;X{~G{!1n^hDt+6w}2Edy|MMdmC0|1`~><4@={vu#`et!O#R4P65 s*8sp^b=iB(8ZE$Cxw*NSsD#+rPu4uZkAluh`2YX_07*qoM6N<$g1stv`v3p{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/transmit_delete.png b/media/img/icons/silk/transmit_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..3d72be2a385aa6afa5b281c13484cf3d90b31509 GIT binary patch literal 827 zcmV-B1H}A^P)ekg)Uh$P6M7p$3e-P5^%^+?xyvUjfULliT5YM76F4isfFHVDK9*4g2!%XFN6B*Af7DCpQ@vNCUc%g&VBcXI4QMNi;bDnJ*DdLIMWZQy5shaeM7Kb6JE_U+#I?VGid_*n zlNM1Lui=p?icA`X8&)XXx7ksvMbED5nrXDor_Rzx%SEWof?J2=eGDoR`zYBypJKCF zLg2<8C|GS%ME4b)HKViDpD>DU9p3YZu7}E06W0<=qU*t(E?r~mC|Ymi!WzU3a-v@- zqB~5dY}u2g9~wkAh&uz(H3b5J1XWd6h^~p!IJmerNd8I#XO_dwBNDLqt0KC?s8zC< zgZg%jRHW#-1JoYfDDZE;-~Ws9q-~=6j=UJKE;W*~WOTH%QG<$X_cgb(5#6BZhKp{j zzFmRcJomwydw4t^mzuipR7XPO2fsNi)E*bE^<^y317w7XT}MSXT^18L_SpoUEu9Cw zUT;X?koVlaZ@tIY4G*>02)(?^k6H_X!!aX0$up~!Nx!m`z~usKeCmOZ0a|v>At*2< zvVH3;xE#f&qD}ZV8~Ub#R|!0#cXqj4s?+II{pRU}o;L9R^CfRC`Z$vU1ojI&B=C)~ zvz8q*e|)bx00R9ysqk6qU4{YQ7DN9;I8NYxfzSSb{wQT$eplMEkq_1=22M}sZQ3** z#D{5jw-|E91qfUzaKco3QBxM2y0dl0M_pSwzt>^?{0|*1#N18>$qoPj002ovPDHLk FV1iAqe^3Ab literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/transmit_edit.png b/media/img/icons/silk/transmit_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..eb9a3dd593055d8fd4fde39679d2845bfc27f857 GIT binary patch literal 848 zcmV-W1F!svP)k7R5;6p zl3h%jWf+FPgoK2|WJfztW3~|@Mx95@cm$)1#$hld8v!Mv87aty5y)6sfdT;niq)#r zvI=Zz3&F1AXGM^(Rah9KN){MD5xql~|FQAII6~;OxZW!%=>vrfjgR4NrnVY}6 zV89wq|G6H99dOenn=Q~?gG_~v5@^#wrvW@4L%SZnOzXjt9R5#%$6~@OaHycSHXxuz zbR!;2YCaW#O{>{-Bn79NQ<>?kVzluU#>~&93v52fx1R+VZjp)A0XoX|(O&eJ=vIpE z5RU92Y$qz0x}H9S9ME1)$O zT28X%N?~=PWZVDiWtRJEQODZ|%nvegUi*h4y3-6f?w!qbIzn_W;x31#bSKu-xK-z& zg4K!Q?Vvh{`cn?Kzk81#>={fpq@x;Mm{CO6&yd`*Q>Hnx!$eob{w|z59yi%{s(f|) zEJ5E5wr1bPw~)sAl%9nzVo@(>K_9uMh_0W(MzCu`w;Mry3e+d9-25cQu>8I5KAev4 zmpA!+qKH|uX5D9a=C7ksd|*S7+nwQ30ivr?mlTdEA-22X@ncipoDK%nYxw3exV!Kc zYhp5EK5}>V!xy6jT%;x@R4}Pf|Hk{Go5|;idqPjvko{D~WVfEN9ute+WVYtgxIJ3P zk9F}Y)5ez~A3SaGfjCLBvh!;?KR5#G^GsWhkvG=Kg@Cwq(1yx_Yy;v^46G1u2L325a7Vma8=h!7E11fLnJkQeeBl z8-<01ZU0-~cDrA5I-QF)o2_`~MuE%n^78s~a&lh&&jNw10>A#SvxXvYVpdjGf+Xzk awLby|YpCk5}c2Js~YM`9qo4TXYEl}>_8GtDHExt)FXIcM+fLqIzDV7;yNufj-%8896dxBf(rBK;5UT)oM+zt>(+FuO&~Y*I!aB_-5bY^12z~1tpDBqa5h1r2Wl0lEc{9ojPl~QfenCC?-TFN z02VR5X~-XHx5$FE0h8^nMJnVU7z6G={;ELGVwl#>ViVbU6^nM z6`Vwej}b`F@*JLc4=cQ#K>owPJr2c-3LWl^q5NaSdmX%+AiYDFAR-E{(AArvu>!UQ zvDALN)uTxHC{iAxd~Jr!I~ z{X({JY(!&`@}D3Y0@+gdjRTDT)IYm@Z2X~3|HhK?vXkiRLDkRFH+&qa%}L|v5{vTy zi!r?BDMVEe$ZvS%YyjkDXJ zV~l_O2^;Wzf09O_tG_2sqSr&!uY=L3=6NzBC#=FRlkd!L8F+Z#t8)!|WAV()%#bgd zugKDMFzsPFqPX}|f!rKuyrXoJ!E|Iix8XboB`w8j{7$A9B{rVyOPF>n9?002ov JPDHLkV1m^Io}B;y literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/transmit_go.png b/media/img/icons/silk/transmit_go.png new file mode 100755 index 0000000000000000000000000000000000000000..10137e55cada13d8591c84070a0998b4ae2c2bef GIT binary patch literal 842 zcmV-Q1GW5#P)L|NP$Peb4zTfbw6BwM9vp8L_@# ztVP3P(Rf(@g5fJ>`Y%Q;Jiibw5O9WPy)ZQ-<%ZXTFyVmF7I0mdLCr5%95B|VWAw%_ zlil#jC5NqWzZU5VgXPd)1Va~LWeNZzpG- z9($&dj&u!|ggJ7-vfn%(Fw(M#CruiYJ<_p8W3VEEfzoB7TP?aix^sQlGpey2U&f83 z2(BO0P-TibgGTMnjS7#=7Q7vzX9?;W87K;;uV9*cRnVIcJ!j;39&CrFY1$V~z0oKk za4QX}W6X-^zQfl&KbxyiFS>oWFC)4tZO05WA2x`tiX%(9#`RGbtEX}cVg@BqZxqp; z#V1=<^Mfx#M0W;94x(%D`~8VtuXm&98j9?(WOl|t#pV!7*Msw{1g!a@i0&-jc3Dhj zaJzbJDM8&&^qO`H{L|y{{Gc@{;aq!6;IjJ!DK>#i*3OSs7Wq|??SA0y1w?m7bakQ| z7u>GNxd&5sEV=e=WVA=ml?^1L`Wq?iJ48amO6F>}1_NXS+i{cVX31j0{(Ls+ygbjb zgTYs=+n8|?L4uy_jTdRj-0b1&O#LbX6y z3il~0?`2~fuOjXCZq{8=W|xAa-EMav_2vfdJh$MSG}Gm)qhq30Le5|vuO!QvKxDb{ zHoRETFA5OYqpIrnBi1!@`x?Uo@eL~iyXwQ{(mQw3I#xl3V=ocq%G9c2C3Mkc68M0? zAMJK~*}~w>Rl08{yW&|}68c_X-IBLa;5LC1m)eUce_mZ0!s(ohgW1{HA%EWg0w992 U9AQtx`2YX_07*qoM6N<$g6IB+8vpa8B{-MRO+d-q3;Nq=BQ5k|pUEm)WqMHu)e1HsCoBnZl&D2fWC zaQI+^Ypcj~qlqjN+KQ~b2pMEyMH{Ql+1>s2yE7NkMta~2=N!)coZtD~5&$KI!t?Ad z$MG3K5aJfgx?{!872ITuZRI#lqksTdtyb{7RJQ~`I$^U_K{Co%zhNU}Spi{>7Y)dA z2T(yWOq>p(RuxZ;w1ML7gxm{mzWemI`nN(<|yr*`feZQuYV#H)Ari z1=G>vINi|>i=~44z?}aDs8rU})cijABZaAtpP*_$DD;f_AnVU~YcQ}?MFF~@lnxDf zyNq(_WL&)Po|mVtd(wFiQob0&DT1hhg-xfS-QxYqH-fm1@dyFt8i e#x0i4_uw}&{+U-AleQoL0000l0ldN literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user.png b/media/img/icons/silk/user.png new file mode 100755 index 0000000000000000000000000000000000000000..79f35ccbdad44489dbf07d1bf688c411aa3b612c GIT binary patch literal 741 zcmVz1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_add.png b/media/img/icons/silk/user_add.png new file mode 100755 index 0000000000000000000000000000000000000000..deae99bcff9815d8530a920e754d743700ddd5fb GIT binary patch literal 746 zcmVR5;6} zkbg*1Q547RkCGx=+ZrJV#zL@SQK$qJV#CSW)Px1IG~1R7@Ce7&_JfOHMV?!rlp(uU_DLu%oT329{ zvd}^m>Zu}~l!lF)$vj*+!9ivWYi3=6E`B>+7|Su$tH+R~2!#ne6eorwU&M#{7<<90 zO$iMuFlR;n2z>v9nKwp!?XQQ|aSfBtZ^J)10wQ zP}rH=KSJQ4N-!Ms3A?4X%~8iSR-zylzlSXd_?|M%f3%_Vax4V#xlec^^VT&5JP8rX z6}RO@h&}Lqo`s_<751_e20DK|@e2`2FToK$y2KTlwyhFyPdYY*B{>w4$%B}fnn&9d zQ0xQp-T@b00q1)Ft+NxwMg`RMry#!}42Vk(RW1t-$ePmK0V@&mp4&IBO>%w~~-qNFem8*NKi5C3*h;eH{=}2kRqEdNlF-|c6B{jNg1xE|{xZ_qq=T?P)vCi#|P&Xm-dkucwL z3)87{8iWe96huvPHfK`KOdC2Z({T6vJ9pwDx$D4>d(Pqff6w7Lmj{5i6;ZyPPpPN; zroaW=6d#@oL2Fa53F~$Su10(RG%K0p3VTuP3?Z=nBA8z$uq+XLUL^QrC74`bU|!e| zr>hK{)%Q!vdmIO5Z3JIvaOyjOX`X@c8-ua03`Q&)f&%p*{(A$q`ZTTjk%q_T7>v^J zu!R-a9fFLScYlKkNBP_Cob=9m9JLVoC-?c{)eOtMnh7qNN{ejy2sM{pS^mgFHJm@(buuM4>=<5Vr$&Kzw{B?uPr; z(1Yf=#g)zADkWnx=MR%ykl| z3Ui42k+O2{bCn)01-s5Sxp|z{G2di&KT(_M6;$EI zDL57JFf}cw4bP1P$pgTRKH$0@h|~aA>j`qZ2*kU5t2EVD5#~@VNhqx{vz8ethDD-=+1vnemftUBA zF;N!Q%PBB5B=KLB#QO(CHe?;R+-C8M?ppDW>R$5`cCPq@YpusFRTaH1i9Kv;l<>I( Ze*oTy+;kdDB`N>_002ovPDHLkV1l3CM+g7_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_delete.png b/media/img/icons/silk/user_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..acbb5630e51a12a1cd30ea799d659b309e7041cd GIT binary patch literal 767 zcmV!wMF|0iq|AK>&MHw6~-ksQ9RtH+=$?!G=zinz|BNIO*d}XYdmm2K>Qw%i9j?X9SgRBJn4W5%uAclWG_T7f?M4s9q5$`w5b| z31S}-Tq~-?NahjDw3mU5cfqF5z)+g+pPplGDyLv1f8WAnTQ+Xiw;{fhcBLH^j|gI# z2~IT;7{m9#PQ$2>16f?4#0x*vLFksSJ~;)W1wO>uQ-rAG1{C+&5Zw%%))Pc(2_k9< z`smoi)Pkk!SK)SAcOy>0d#x(Rl;b_GP?XFE#P>r%M^9Kn>j@#I>kHsrS$qYvKE>lwZZUsXcw4nFNHZZ~?%71a&2u7&aV|47ZvJKBUVO{)!ekB`ACp}1 xSnjsa#jtYM{A~v!cV^R$X2;lcpKyd7^}lwPp>~q=QF{OY002ovPDHLkV1lJ{Vb%Zu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_edit.png b/media/img/icons/silk/user_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..c1974cda745278a404b9e29fa91e0503a84accb1 GIT binary patch literal 833 zcmV-H1HSx;P)wKwNApj*j?`*x8fjj}+T^cdNV;=~VOf{An4CI`(Q%x}`$a=uBQ`IcOG~+O zhFmpv$jQAVt#pVn<-FwXyxzC#)@;^BTYr4EXV3Qe?Ah}?KRp0?|HEG!QT7K}`6R>T z0?GlfNd&N5h)SxRamGIduGtwfO1+4h$^b)DXu0o8M7BEtF^>B+6kDUTT?1tl0&27( zTPtN#enUj2hcV)v4ROVeu()d=+i@S-%91h3XQQ_&2GLH&h;==J>*q}oafY~7o8YOx zW1up~WKKQv35z{tnCiF(G50p)FLR-gi@=FATO4h+zckVifX~k}G4#+4;u7niZGj@H zRkx!55oQOPpc>+6Y1FM1A`bW&7GI~k7+8?J0DewkUh)LOJkrdTe3;U(*Zgc$Er)&@ zD+5(f%bInl-ZwzNw#9d8%I4~~7EHgs3zhUKHpaRkt%*?UWMg-Zz7eUOc8t^s*~Buq zNnU77^3>6u=K_U{g-umARHHXA*H6dCx-dv81Ap`v`JB`FJi0MFsY3lE z5Gw;{eLz-+019a$Hq}BXzXU@)LB-NA6Y>hD8BxCLDcvPn`&N6q`mxc}yMb~sKo@Ed zDbOI5^9}?Dhz0FQMoKPVwk00IILo!IfS6^eQMBJdKtv5PI+Tbj;^0Fo6JmY=Cj0!M zlv6P`lmJPo4+6tWG2fYveukB1DzkD{lX z41Nw7E`C*@hclIfDYh$GCw<#Tk~h)}QkWS=$Gv&wY2h|l6&7Q)uMmBi&Zxg?1_yGk z;>5+4_M6eEhsL=ygB_>Q-+`#k4z^f-l|x?d%y)UiW7wGPG|s;O<^@R5;6} zlU-<1VHn33^g%H_Q)k_G9ovjfnFiK+H+Wv4;+`mU!eP_1WYT1cBMG4+b^?L6?AK< zB&!jFQPqM`i@@k4u(!!^rBRBL3hHN70i&#iOH+^0u48x?v*GiYACKJzT+r-=qk+oz zUpus;svxs4gSf1jroEXH?t1wdY3Aof0-iGMy6$K8JD3_XyAT<+1dUmit6yK(! zNF_M9n(Bm#E9}vQx7n3q{&nCY)~18Vynj^W_e>bi@1BCANxml61a_7c$XmJMZk?*# z;GcZLxX)MuKlTCU=6xU;ncBCjL?Amju!Wp&&M@$uZ9p#m5yGvf5Ue8*EJF}(aLDzJ zAlPvPBtx=PWAE0I3CKlubR6lS2?)Vw;GM(ZEgZ6)VF+v#S+fswc_vu$Vh-L#8KE%#xl>f)!T)$#yRmO>TTOvB+HZ zV8!UbBF$h)Z%6VHiyt@rn*}fK8xy1uKWEQR=pEqAk+P7{#x6 x&>pVMG)#i!=x;v%@<9vjT^KNkD*ncQ;SaYr!-X7+DklH{002ovPDHLkV1noBEY$!2 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_go.png b/media/img/icons/silk/user_go.png new file mode 100755 index 0000000000000000000000000000000000000000..0468cf08f3760dc13e44aed69f4f15cedc93b503 GIT binary patch literal 793 zcmV+!1LpjRP)a8r-1c`3+>owstQ*9I-_ekzW(ohmYMY`{P6ZeF5{f*M765oC3mgQisOM;QQbX@ggAS2KgDM2gcqZA9XdZ>iF!~Vl<60PAsYul3 zdO@$k{dkx0EmyGNDt9}0CpW25-SK_A4lC2`W(<=`JkE57@PX&*6@@GQDqw`DDAt^o zq{Ey(Out`(COaJJ>@YJM^^2KrxFq*RzAhRU<&M8e2tg%w*9#|$0B%$xx&b3n#4 zkf!uOYO^O28&82>e-b(E7tlIZg-q>P1XbD?eadJSW`T2LeMI1S3A7{YkWT@r!zKv( zO-N}zjVBW|c%-j32i0RzNc%F;I4prs$%aP>#pqIKVL?pfIIhp@vQS;GLtGb-&KrG^L94A_pU%f6M3**AM

    gJ6i>thi*In%G< z11qR?nZ<5fV+Cs0?EF;*rjKIYInQ$Ka$^8kIXfoF@SaV-aWlw~zZ}ip35JN+^=tnJ XxNVQ!&Csrn00000NkvXXu0mjfj)-I{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_gray.png b/media/img/icons/silk/user_gray.png new file mode 100755 index 0000000000000000000000000000000000000000..8fd539e9cb04111e950ac9b0cce82676f12f67d4 GIT binary patch literal 706 zcmV;z0zLhSP)%zf?XuhjnHwp)vDVV-Nit=+l<1e_j@md!Ei+v5AT8J`SE{vdFuew{g2kYyx=h3 z4xieMNJl*eP72^_-v!pJyZ=`JAM1)mw9ObhdlWZSJ22`#g1!y`+|mPJoz{^J0U@Ip zqqZgtkkAd&ArfvtoH-0%$6gp(_f$3noIl=(%W5IUuV^sBo`C&WBd!{oVQoJMrfnxi z`p#^x2^duFTU~s97sdAz`2P9<<{$Or>$7WEm>ok@v;XI(hZnch1SA}-?@Du%ST1C- z@^Ol2n(j;UQ@G<16>3&!ll!(xrPAzppcCc7J*<9tO11JKgUNwTh{fV3qSNQLtqV{p zl?^JDic_oANTpKf>FL455JRQWXy~0zr{ni=;uWj`kl?0ZFnEhM@}^`m39HqLY&MHb zCIgengyG>~csw3-cXwB0GT9)3Y_0-G@Dj_iNT<^<7z{8Pjj-G8$mMd#=ku^wEYNDT zu-R;gMx$`M-4(f9-d6=I3^o5=o*hIu90td6)Z}nDKqjN(GYkW-*9(`+1;5{qVlIle z{VnAxU@_8CDZRK(4T(g8f=DH5<}3B~_974nARdoX*pHVS=7PdX74Z47KQtd|`sH*w zq1WrFkyk7hqy71*_%rE`uC6XDL`7wi;nuvu(zLIhbZjEe_=@yhBIB183I%xaA+i=F o63H90*)04vGrr7ApigX07*qoM6N<$f`O4mr~m)} literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/user_green.png b/media/img/icons/silk/user_green.png new file mode 100755 index 0000000000000000000000000000000000000000..30383c2de517fd22945a87b0528d2821ec4d49ce GIT binary patch literal 722 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 XHe4|Dt4X literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/vcard_add.png b/media/img/icons/silk/vcard_add.png new file mode 100755 index 0000000000000000000000000000000000000000..2a68453811f26444e2d04da5713c9c757dc999c0 GIT binary patch literal 661 zcmV;G0&4wR5;6} zlgmp~VHCiBGxv_KMl&C2qkCXb}Wq zf!ZRmAV?dcl3`5C9`u^&j*R%u>z&8;KPY{YWGtbfuK$a=ExUB}iH8 zEPs4~N^jt-Zswr3g){Ci_UZ~2!Wmr0Ma#WbhXyeU7+*w?FH!AkTK)!xHA(%V`3nWCtofZB~;xy1Wp zclf$8!*6>HJGqJf=sC(o!*&OC`_`CUEJs$9bD*XGd(Ea)E&#^XnS(ZgInMBG4q?C+}4skYc8sQWiIn=|m_d^&hoje?QvJHqv zqa+duDl02#Y;2^Yq$CGiSe?h^a1&_01i;l(w|V?-kc=Ef7eagphr`W62s%1C9HCH1 z#bU9%U$?rx%&ZwAVonn5xl8}}1&XvnG^ef{ySYZA*K@tzyT7lq^#o0|ZG4^&6PlhR v_HFfsW4GsQ^m_V%%Rnix4h+5;FoS;pMlVc!y2FYE00000NkvXXu0mjf;fN;k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/vcard_delete.png b/media/img/icons/silk/vcard_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..b194b971b398c3d81cdb3daefe3fc4c5ba959eaa GIT binary patch literal 651 zcmV;60(AX}P)#u+p-Y`QM29X# z5S}9c5Y@7+BwJFTy>-o9T}AP^yYJ2Wb+BDs>L55U%nZzY=R3oUp|$2H;^T;NWB|3Y zvN8%>1@Jr%tu>zKRj7#kWB=+iBb`pWEiEl3z`=c#{QudKpGYJ`X|2twswy7FgrdF8 z#`pJVX9r(v568pj8EW`JBobkCauYjW#NI7p=N(?$j36SWI@q=E+auicCzdRW#jK4U zn*+dc940Q+;(68Ou>eE_RSE!{whLVB?clOsG4uH=3DYbmPEAc!EN^gda1TI4_KIDP zkC~GwwLwEu6S3j|xm+F^_5h;MXt{fdbp?Y>Yk}7ASzf9>a=(hy1pTz{ESD4GPbToi zUn8p)5(v_D?Jm;XyU(DbevA3_0A4V_u{J;Xtvroh7N{lr_9?AvF}iMyP#r$U?%X8F zndca7OBl&yQg?TESIlSIHibf=OnLrJl!5Cb)c$-2%hS*tU`?GN_F-Y4fn`}_G8sal z5S^W!)Ya9M0cF*qracTp_x3Mv`~+%q9VH^kcs$-CBJ}t78?&>sI+aRQUSD$%`^y{Z zU)`p#`x_hB-ZF6;1FmtHZ=4?P822~UkDUs+O8HW3XI&OoO>y%2zH!)ho*6zpx|2)a lGQ~I}re4d+k;eSjU9UZ+4 z90QP2;y4ac$|Wv@_#^)I2TCfH$_D}g6<{%&x%_W&E|0}xLUSBPb-Uf%j0$Yy8`JSu zIJqCV%4?_y)^fz#Pbd`P^79OaX=7w<3^T{$(;h0T?8^6sNPyezP`j= zwjWIh@oP9Qd7EC1rcL85DIsd_W@^d=?=OJ*&@}nP1cmEP;0x{~GgM8_i-!vgGKoIQ zgH=4y>X`a$v%;^l>PHd)EBy@BisRqBhpB-cbj7B)WEI}h$^`~%ie~AWEJgZDDXY{m zXHAOb1ZuV$&E1Qy>LAwWBXp0#$cJ8}qm%SCE&!ZA+%SI&!!WQc3u`h#f!T>~QwwJD z4lX^9+q;1x=L>;DHyCK|#x)0!NF<0xqYMuZlQ-P2qCDiuU8_Gh+~hpQQ;Y9Yg04!_ZE%SemW!igKchx4WJa+_9IUqH2;IpT3(}`$+Aj z_Rhbl@sAabH~F)5Rh8PVnjntbie%Fhr;c9#IQTC){{(bKa?t*>JG%e?002ovPDHLk FV1hfYVB7!z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/vector.png b/media/img/icons/silk/vector.png new file mode 100755 index 0000000000000000000000000000000000000000..a1291c2dfad75b289f88ab762a3a32ccb436c1ed GIT binary patch literal 481 zcmV<70UrK|P)SXcnW4?r|Fc?Kd3cm$;%kZi#G`Sa_VnwmC}YZ26Y zhXbnt^XAQKXm4+SUQ}H6r(?sz`|0x@O--EjU}EI72kk(5e$=!F(*t|%| zOO`#}*s$)|C0u^?YPrGY(Rf4Gt^S&sOU+enjCclWzS^+v`E5dh=Tv=F*rDQzDn?3c zT=(o=$L8ms2^j#wwxyStFa(R1K0Y&H$BX|!zZw%`2!=rX%m*7M?R@p$v*kt(Sq6Bw z+-#h<SXcnW4?r|Fc?Kd3cm$;%kZi#G`Sa_VnwmC}YZ26Y zhXbnt^XAQKXm4+SUQ}H6r(?sz`|0x@O--EjU}EI72kk(5e$=!F(*t|%| zOO`#}*s$)|C0u^?YPrGY(Rf4Gt^S&sOU+enjCclWzS^+v`E7KK`BNfm@}@+5O6&9g zAKBvY$)m!m&7tCoDn?3cT=(o=$L8msku_)Z2R1aWPW->+%GCcCp6&YIzdP%Hc)#v{ z^K7YJ3?~*XeSBuZju-!del>=P#kRYA-*|b#|Bcrs{Re@bJ*ofu_oM?2ko=BeK>W-H z8z=32_20AQMh;BOr`quUwkvb~BZEzsrh*K>3?%QCn~f89y!;>7dus_y%rZy%d-txS z|LwaHz?$24Cg64fFlxNpH$DHKxA@UB$BHX#ATglAmf#+Z|Gm3Xz&3+u5FaSsgJA$L zYJ@6RJ^fR$>hXWu(o2CbaiHQ3ApQh$Hk9rFi30!(_NEBmXg+EH00000)+jEP)SXcnW4?r|Fc?Kd3cm$;%kZi#G`Sa_VnwmC}YZ26Y zhXbnt^XAQKXm4+SUQ}H6r(?sz`|0x@O--EjU}EI72kk(5e$=!F(*t|%| zOO`#}*s$)|C0u^?YPrGY(Rf4Gt^S&sOU+enjCclWzS^+v`E7KKMKBsqYa+IO%4@TR54OoCBdg;l!e)kIzil@!~(wuf{O3oi5CGzX3J>pXB@hf4SiQ|80u@Uw1kD2a4arFd%;B zgN>7RzWVRkaw7*O26Fblv+MpNgZK3k|3Tsy26(sJY@E2`<^RCmTT9?BaAkh{Wp48S z|3FPY${7B?1LB7n%>RMnPcRGsMvZs-rsx0j7C(CCSaF37Bz8Dls^Mgc>hEXeivM3# zvi`rD!uWr$FUy}DuFO>!1^}Z*sB+cQKNYJU|F(9002ovPDHLkV1gG5LN)*Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/wand.png b/media/img/icons/silk/wand.png new file mode 100755 index 0000000000000000000000000000000000000000..44ccbf812879c42cb1f9587d865bcfc337ce6361 GIT binary patch literal 570 zcmV-A0>%A_P)hUn2-Navsqo?5A8 zh}}V^=%7@_%C;=H{tGpIj5CMu*>5J=i;m^t2QTySd)}9aAppozC}++wDz`eOViU-dbRRoz=JsVlZk>N%^azhi%=xTCt9`LQjtqNFW~e|R=r9= z`@I3J^#z@aD5yBuq2DLQO#|4uFW6R5kzPZ+h&6Af&5}POarL&lA~3t5R1i7uh*ffDw@qEs=HBW ze?CI~MkvG6H-MF7r{Yv4kw_q&PNP^XqFgTHXlH@RpLO}3aV{T{Ez=8lo;PHV$Ads1 zfOtF(s5%5V>3qE|&{lueV1Y1j%GF zXt&#NI-LlGLPN>_18TJzN~Mxf*f6pY5Dteo^|P&3>(H{!KTr&_wGRQWb^rhX07*qo IM6N<$g7V1&P5=M^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/weather_clouds.png b/media/img/icons/silk/weather_clouds.png new file mode 100755 index 0000000000000000000000000000000000000000..3f73eaa1445abf43c729c134b24e3a308b61a6a4 GIT binary patch literal 581 zcmV-L0=oT)P)51y3fE zx%w@DD2lfa4>~OCGd7Nm`OJhY_mM~>Zhr}oW%;_>?Rs0S*4L#qhyF>!#}6{}`ym$d z3Buv0; zoaA!3@5yAc6buI6aLmp%8cvFa6)*`v ziL2Gh4c=@vXTXaSngz8JkH?=c0QGwP-E1~<4=IuM)DpQMAbqXrbn2ezx(?O?e*s`O z?^U&04K$n0HG?_ja+xm{i>-7zeF}v_$5<>TF=>%V>`OVZD3%CgcZ}Xt#Wg= zUCanah`Li2Ew%ac_+ze_E?0efU+V~mRRp_uc%SF+e!k!Da}GxaK(>>T4DI=W17hEb zu#d!kJhZ_Kg#K8IP*XU*AP=RXAqbZ8^O3bd!-`Yik7OY#iXX4v$>~@UAY_yh#iTjP;@L2+%MCJ7r@Gr-(5aIBgd$2Y2*5kXT|8YNXTYnvze#aoh;qkzSx~sZp6HHb!| z&}cLsiGbhl-|zK$N8D~V?{qqO^0GX3yWMNGTC--eIcqc;1A4taq}6JhYPH&TkcSOXkRtuF%1?6%Xf*>H5%fVnUI3xklXq2s1tLXK5Xt&#_*Xt-03dra4NTpIp zBoZhVi_q)!r#hXE(`vOVbAUh~(Cl`*sMTt7LeUvSID)|-#MY3>WDtwRpwVc!Ie<8< zrg&z(600PURQ)9u2MUhk;C8!_&1RuitH*Nyr_;$2A?cMslF8((I&qRtry*_y;(TVV z2u!6?%{#DKt;=S!nYGz$c4g1-OHe=x}~H^(oS?qTl%zP(Xk+PIAm zi7Sv2N&-eHdh2kohT|P}R-N2O+Yj-6<1!Wk_Mg+|M4OL3ZP3__(-;ePXX44`y@g`Q zuS{Zxzck!`eFt0X)OZk~m@@;0Jau6^O0Dj`x`B6LDzZo@2@tEP-iD~7eo&@5i}b1=~CRSYnKceL_LH+CwnM`4yJ49kFhue97LB6 z_K?9#hng$~K`Gt*7nH_0PE<*@PCxEP->Gh}a5DvZ@bOOX?)&t;cXtx!9NlEZ&<)3} z>lQkl&f_2mb^%X(-$#JYfKT;${d9hx^sf@y?Y1DlD;A5}>2w+qLeO|TM!K$l1CbYv zM&oqBLATpo1JXWV2e4Wym2M}KNn}}8C?MwLa(TPo@9)C)MFCLW&*$^6Gnovclp@db zkYN~TW>xO?6B;iCv@h#RTlL^Y@a$^28a*VLCJsb}IoNX+I9LEWT6h#Ta7(sb zMx&7sIEnNC1daxSL0HPn%~ya7cr+{FJ3s+E1e`!)4;PNHrk%Zs$w*-oVG&)AW5$^> z@i``hDW1zPC0ucA^76~UCXSTw{P^d}Rz6X61K!$PO;j&z(%QHiubvx0>%pCP_1A^p zDnQ=6^bY=#BM#~x&)yTtWjA2dCtSuJqcmVp0;9xdasUzfD7y}QrGMDMk+-mS^yA+8 za$G&Ph*nr$QVk=}3M)&hc^PQ;*Al8_5^a4Wr2_fwJo(zI{9j+=Zxg9)Ryp#|fB*mh M07*qoM6N<$f`IP5ud|Np1|AOBzfzx2!k2P6f@r4BdjzqS>RTgk>`sn)j`siZP2nD{M|4%RQ;YX*@ nOhCtIA&IFQT>*yuM8zfmxfCmlqf70K00000NkvXXu0mjfD8iim literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/weather_sun.png b/media/img/icons/silk/weather_sun.png new file mode 100755 index 0000000000000000000000000000000000000000..0156c266e4e1fbcd1263fab2c2dd1f3712553d14 GIT binary patch literal 623 zcmV-#0+9WQP)Wtv3@TMo36t?!us(ut2(qE`#u;Y2=pT zq@2~2T~yXyeA(Qqy5;+9o4@n>4e8r+MnSPzjxHXahjaKm&-eRqP6dF9|A~@^;+?rt z=H0jE_T4vTwd@82LFU{PN7lpd$oktP$3Gho==lu{2>(S8IKK0m@1#{_mk%-f(Z z+<+0WLyL4{ZOnvyEl7}LBImWjh~I^nZG{LlL-;RKT!Im`W9MTdQZ5xqr;6nfwX(

    &09}?3!+0xOT@w2!VY%$ zj|Qoisx?Xewm&q%SbjiFY^0(I!gmV#q77T0t|0EJMfe#*$tA9gs83{GdZFA;x{o96 zB^%K$7%@AxKer&}ti|FWs}2pYzTg0Ry6;OQZ&K!w#ON`Q%*5Js144tWhd>1Tnd7f7 zk-!t=?~tr%T0tsJ(--<#x2)&;s)i5r7k+}jpgM|^Wqqb{;s;8N-ZpQB0Ez$r002ov JPDHLkV1fyHAhiGh literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/webcam.png b/media/img/icons/silk/webcam.png new file mode 100755 index 0000000000000000000000000000000000000000..af71c30610862c76f07e948d8c28433c7d338f9a GIT binary patch literal 728 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/world_add.png b/media/img/icons/silk/world_add.png new file mode 100755 index 0000000000000000000000000000000000000000..6d0d7f74c0d89a5d1975eb65c3e048ace0290daf GIT binary patch literal 940 zcmV;d15^BoP)%?%c;Y_xOF9QVIY7fRV}JLEt>l17rXb zC;_)rpe}tj`1Q{K005d&3V@NxVG|ey-h3^0CX$Y2uaOh_TG3L)SA z^5q{Y0Gd*Yk;&l@aHG5N$^I8}&tW+cTs)R7jj)QaYX>Od5yNKFonUrjc24->neX1Z zQqlo{(Nhh_`Ujf3DM$}r*APOdD#F-=DYy}~ofvDS5RWFFraSw1hv)j=0~p1#4+emb z-#PZGF)#Poq)IgqRGb6_H-zOte!Wa-f1gNt7p*Q&Ut=5B7iU_(xixy%=p8=!>AB|K z6PgiYQx~9`I4Bd`-ZH2}_By5ADbi^dQ@DgQMMO6+E7$01>qP33 z&Vy%>nonQ*X>`xY>R-KbdE9gTpT-w&@@z{Nbw&;8L_l3wQX6(ihFpr3Ekas?*N>kE z;DZ;w;BZq1Ku8DhUH{!*^LOU{T=|Q0Z9TN6Ob)~qjYgRU-KJPBvam75g{wmVTo@nX z-u4`Tqba2Tcl#FWG)4l2eAPSU$OVbxOKKviB!WMq6%|BL%)*6IvUcN65jTSPSg8@k z+Knw0t;7~vY{ZsSl2SuT(wNjF)5&CJGIx?Y_woPtcT-F8EDwi|v-vco6!&IyVq_3F z4jcel028PJmsOxX{b=yZpYPpk{{coPMoeG~c>d|!P$U~`!Ll2$JrL4CP~d$2tdK(f zB7}VL^C!RCybBne7zqKt_BQY8Kbkv?87OV4qzxtsGdSGIqBd2HI~8`<~a zaC_fw&4`iL1*lf;lL@XC4C;=~%*rM~v_fRt4cycm#h`*&k?d~D=~owL8%^LqF4e)5 zy-G2v^RV#%0fMD9567vKZc|u|GlquGnJ&O>whNqkRaOr?~jDezniMGiA0Is1o?7E6$y z7w9TQdrO^UZ4hh4$6*rR`x}%(2%(u$1ZB&!I+~0O$><|27fl>LL^v8D+8X2LLJ8+e zhQY#Vj^=+Lw*C)WsTidVi4;NA6u$U#v3#pzM?A;5+Y@BsI|v&&e8)x^8N!Jy2NzFq zEHueOuf0X2YZvuvLua}r|9ZzWT3E~(Z4u$a@=$MpT=h{@>oX?X`_K`A|M@>q{0r#kV|&6 zK(wt3j-P?|%kcIB=GH86Up1QmzU#koVQ%V@Tle-3?>oeeH4~$%5LyjC(6LjE*i%2! zaOO?i`fY5WW*JC>)w?o1@yX*!;fs^Pmq%Xhf89j3p;R1A*T_wuAT@oF&PE?oU#3}1)g%qIqTsXPaq-^2FjA^a Tq%@q400000NkvXXu0mjf^C!N( literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/world_edit.png b/media/img/icons/silk/world_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..00794d4088a00c6baf0c26268ce127cc2c0277a8 GIT binary patch literal 945 zcmV;i15W&jP)wbexvw|;D@Bpf2#?5tPj)lD7w%noq+*50?iyU*w6AgL1SN!I(xtJI>ioRNhm3 z8y=*@c8$zNJK5S0C$-Jo_k6|Ll7+?aK9-_;S@0|HYf>1rjrX%u;FB{MepKXNWhx3c)tdmO*|ZNArkPMxVZ889e0pvz1Z#dze2>G{HV zh$91qls28kbG1mEJG7MiMzhUrQU&Dok7h|F~{5T*SG)I#1Af~Z4$+Bm-QZ|{agwxOcT_6 zh)MA>qt$8jm2IcNd=z7-0Y$4cDTf3vJ@HICtF~=Qxv<4hB7Kb&OBE~D3aq8uXgl}{ z-NV&r%qNoKYI3vS#s7WdzhrEE;bGanS0DGEO{4DI*0mjq%?Tm=CKwQ8KRy394wBI; Te6@B!00000NkvXXu0mjfI-kC4 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/world_go.png b/media/img/icons/silk/world_go.png new file mode 100755 index 0000000000000000000000000000000000000000..aee9c97f8232fd21bdd23804c83eb721ff597a96 GIT binary patch literal 944 zcmV;h15f;kP)Vt{;GNX|PV@wQxfRAQ-FeWBO z_okAVsCzMc+6+1!88|n0#f5DY;>y+0w55ffp3Cpz=VNHC0RRA)nx7m4J_e2fEr1D> zf$Li7b6<{q_X_|3fT6VpU}}ES1g3#EU(cKfCPFP#tOhI>gtQSn;qulcA%*-^2>JFm zr+(T4FtpZ8%})k^KL(S1BPTO2QL%$KxGYx;>U5BTrO?79gvFL~m7AM47lbE{|M1p@ zvJU{5KHA(pGTJssQM!0O10j6WL>(4&6rCX3c8K+IfcD4>45pqv>^k0$0RGbW>L~Ep z>F(G3_hpqWYSffq&yG-Z0#t0sZtPO7RtY8w81XE_$%9;8ywUmn_33;5p~)j(OtcLh zGW;R7d;;`7T4jV=PyEzuAB!7%sQMDYjz>7LEO}MJEJ+SEXMDFFKWs9AW0_c*yVfT8 zdLO<111JQ!Z5P|F5l?92}SW-(dg4!8-@ngsi3V^Oiyy@FAt+W#MZLO z+G>n8Cxq}c`;$Ecm+#=&HP9L%gkegdiWRq#ZuU14t$&X7yov1vXjLB(4@;a4kKLRg z-PA=-YKUFC%EJ2Z6sr?Rp~|N4#O=q$)pS=l!*Bo1(-`ie&YwXjm+`*$kXj*?M4{O% zuhGAMggv*$Cl@{hx*zyFSA6yJ!&%W0X~DEMC>Q=Dk#Mkui`0r-AY6 ziYp9c#&{<6JiCE=qrPunJwM|*-o=^4Szb&J5cfBbh$w7fBc$M|SUag$2d(i=0{##! z(KNT$=DD_V!?IjrCV=O7?_9~=opWmL;fW*1d9-cvk8qg2_BpO{v4zWlWG};=C;2-! z$Cag7CoJ20md|EuhSnN@SH6BZDm-yscyj#Rk@rnx3a!H!K7(Yu!lxHc)7Lu8)up-J z2HoDfaAs*8z|dL)001y@X6Owm(^b;|pVbz=yzjpaJj$ zhrpuriKefui_0DvN;1Ymq&%nwWg*IrK!Xz^eJWuq3u2H~0ra?EC@ge%+`A>6mV z9{TYo{=G6 zt@5m|4G+Q2zKv;Ch@O;`PfWArmB5n3gvMsxV&Iu>97{a!2kL74wd@!f_AP^O%_&ND zm}1c*+F;TcH^{p$P_|akvD5o7vmT>HCkP;z;;&+8tDBI;koi9eX`W!oH4`pYaHlFZwV;$>vvfQTw zM-`m&R_SPIBa^FUasC0GCCh%{h`$~db`z&-lFX#%(f>H6JD6Z(sIW`RKE+xOL+?+uQ%q z){?+F%=6pqEH{6=NzusC-*<`PZYiLCGyKD}Z8^V8ul-K=AV@SE1t4~D2*b1(9UUc= zN-;Dv#Ngl{rd7e$ZUPXC##BFmV>$26ZQi?6Po#@{4gllsPbku3Vq${Y+FAf~T}OJb zGWEz9{(zcvI&CUaN&p7GcqMG4&7ULx##68M4k(F4l7Q+Xm&>uSv4N&(w6?a=)YOC{ zoYLN-J?7@-9xGBx007$C+kK7w_2Z$(k&l}jo2#`dO;J#Ipsbc$pS#^Dy3Q&nSeE5x fGMT)t>sS8=`naU3reLNz00000NkvXXu0mjf)bGN+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/wrench.png b/media/img/icons/silk/wrench.png new file mode 100755 index 0000000000000000000000000000000000000000..5c8213fef5ab969f03189d4367e32e597e38bd7f GIT binary patch literal 610 zcmV-o0-gPdP)^jb z4`0v}DG1te)wmeb(>p90leRz?_mO+^JKy=v&2<29Od6?F%9%(c8los#f*@G`-%W&* z$)uBj2i@u-@SgX}gtyWPe6d*|w6h%R? zScK2#Yn%$sum0cy>90DmY*i{1XqpClEtktsRTZ)lCUe z<FogV^*tm>8*AlX za4oiR!&85LrobG57qUHUX#{>Vz(RHpB5|@>9O6N$jqB8>%($0wxE5R3)b>Y~xtCo$ zCgEk&A?_#IxHdN)9tqre^o{ho4{?hmPuf@^@I3-wncaRd%|~O3xbrKY=&TiwPYkJroM{;WUQTuMY8vpg}f4o)2%U3C;eEDoiEh?94d(rV57VIF#8VqzW$HrDC|#U`x@QDbgi zVl)t9GGz&YY#D?gc%>hISA+_EBpnXt#pnC`p6@xw0$8TCbULjhlgVx(kuc)%xbgqq zR5+DNDFRN0!y)7Gm}oT0i39}h4h928qY?Rho^UvPGJ#kuW|-Amtrn`Pmd&+bFo@sp z$LI4IQw7BG?|#2ewOS<<3VjL$0=lMY^m;wqZujv5kx1l%Sl;V&Iy4#$ip3&@LV2!7vhhN=PCz%^9v24`qb(+m4W?!q-&~=?ssf5GfnAmJKV;3bvpDm0(NhahZ=&^sqo6Odj6>)Dq_3p~4~ zvb`d3Mydwjt&Df^hVmLtI2x=U&h9(JVYX-!y~z3zi;1>=LY;o(bL$(Yf$lf)dMf0-u^0HrpTG Wk@)HE*94aU0000bIQ51&Z_netrMv_Rp78XH7kbsJXXkj5}*6(u}EhTgM}6% zXkjYBJE8$&k~wo`@3r>&j3NkPH_uZ^ViYwasu@xD+Wi&rA0B~OklZnY)C53B^)gIkMV>GH?=z$pP9!b^~gFb~W{_8@s7 zn@ApH3${&lY5Pu>P3I0z@#xhCrw>lCHYnVEy2^#)v-HL*#3sS3_XC!e*SK_YH_3zB zOW%mrsFOQ`6wFR_h=7T)nl=}D;}tg-zEA;I?|o!$=Q#6wdhFRg&fZ;!k6*8I_RtK2 z6x?|5nPj3F79?nfg^+mpuFr>+gaktqkuvpKo3SFEEU(k4DoxZ-T^G9a+^gWR+NFF2;*@NUk_P{(a7gho*!b8mMm|*eFTe|BT zPMZtUlO6I{#iUi(gmAAgudxtTL@9v>ln5k{_^sM^<%Nc=BNLGVWk(h$707`~APeMz h2>w+`ViYwa`U&8QX@yPWti%8S002ovPDHLkV1mwr|55+| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/xhtml_add.png b/media/img/icons/silk/xhtml_add.png new file mode 100755 index 0000000000000000000000000000000000000000..bbaf784f2181f9953c961d15f8d1f16cb500a353 GIT binary patch literal 703 zcmV;w0zmzVP)(EGn5{?^v(DSQN?@3iQqlt zV&qP6UdRh0^GcozDbv<>l=;IDH9{~%4GD%9!>i)G;YIO5DMUGQ=L;#nP1J;-AZkcZ ziePwAycmTjP6CBDoG67?=2lYjs*o~m`eK( zTRpi~G!x>?2@l_7tXn#ptB=R1FGcLz+De*4R9(P;%mq|olYn_Jl2)*0FGI2X}|BG5GvEE%ROx^&B6uon6g*`0gmY;zV)Y zC`56h6rwa~FMD=uha_g#ii7ms-bX^r`OCM6Cnklw2sG3uG|WzDDkn5o5?U$=t(BCv z#u7iOUnoTtcC9$bFTFiySlZS}6noO|x#!f)kC->qDOL#P6>|X!#e%YI)fmI00}PEm z;Lx_Sob2CAeKHHv5|NqlFWmBxr8jdaZK;`QgJ3_N?lhqvQ>k(u#7x(_Tk l3G4?NfJxx=;Hl9=KLOX-UDpSegn0k}002ovPDHLkV1k-NLT3N~ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/xhtml_delete.png b/media/img/icons/silk/xhtml_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..157b5201d0cfc97af349384e73f5edd3711b03ea GIT binary patch literal 696 zcmV;p0!RIcP)vB`%|NH-brpS$=_W49+#!Tdxp&T<5pS}6j_zO|Rd&P<1 zJ)~l!PHjhqty7=OZRvz<|UBRAJ-t+5A+U3OFCIB#@g- zjm;~XcrsLB+v?fWoO1rwD9#(nRKN_9sX*o770Sm~GqAJB(2->*nL|e|4ZO__fM#dbOSDYx$ z8<{9hluVQZ{kzzG^aQ21eK6V&bLR3b?%=_L*Tj{okY<6VVxFunqUa-hy&)3eC5Km| zCHX*cK_~1w$!~G@LKg6ycr5i?x<86}L!DxoU|um7AX6+TTMI4JUf!eO&M{p2i5gI? z|N{EUV<6Kr2qqFjqyc|6X(o;fr(CfH;s zUVf@EFkI%)w)r?w`Ul3)JWy~V)SNP>R74eKG!)2vq`5KS{H?Dfz^SXFTz|2Lk;-1$ zXB&&#o5+KrnNY}_@Z^2Q#_kqw4vy2*kZ`nb9%(V5>LLbYE>aiI!nS1`>0igsEW?F} zWs$U+8@O5&V z_k?IX9ImjwYbIt;bpnl^9V-qJO^F&&j4$O;RxR8@)#nV2ZYI&oq`zu`i+8?Jb&(TS zMsT9IU=$0UXv(J_?+7Z020{!}+yrYEZKWD&jQ8y)txO2HkF+)w@eK)0AtB5##(W)# z!u(mCh(@9*U&|xREp;$7`iQ3=h8cf&fu#G`bF1fq1w)-;Ua+8S*?pM0_jvWx#nauk zoSv?oJR5n;-B*KTPtRi2PLluq#+7FZ*@n*EmVvkTK6_>Rmvi<8_ zQ%h@8K@|Sx-ZT$MQld?(Bp9R$QmIlwlExsMGBFkk5EJsf=392fG_LNsZZ$7WYF<_ zEPr2t6OKcQ6k_q_NgUpjT9;EpDosJUC<%qsSZck+eC-yrVmQ6?4&rPG_vU^g)}yt2 zN!jt2q`)mvSu!Woauj3PoA!LQk;B%sLeP=j0H+S5QCVzbax{&mAK}UC2BweXkcu@18R6Y`Y4g#v(kZ;fa03-hOr^_hi;}|KV zP}mm7uE8V%K|S*%950l3^V!3p;VpRnu7PA9!7+D1#p$UF$Z`PLEUNg-l zn-{_91R4_~8O(od;l%!|Rdb{KjT|&Qax`ONP|@bYmkz$JhW2cY>?-7NngORP(|A>F z!F8B5c1V>OFq7Fx@VE&8Dyfd&)a?G0i(w1a~i{jWpGb(#8fDK=L zuh#;SY-=JTH+w=OpA!<%{*waR$$u8x>~rp|Kh9U4T}Uu~^#A|>07*qoM6N<$f)0&A A%>V!Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/zoom.png b/media/img/icons/silk/zoom.png new file mode 100755 index 0000000000000000000000000000000000000000..908612e394525fc2e52a7e9b94689c25ce167381 GIT binary patch literal 692 zcmV;l0!#ggP)m+BBgry{~j2fHLegbHP( zrgXNbr0}2;^nywdjLjZe?uxtrd3D(pZH@fFFc0{BW_~jxoO1w7-VX;6vK@ROA$$R6 zEmo;Ht-Mj|>5jUy{bQ^V5@53LRI8AgLpUm|m+15sqcz@QtVSo|oz7ArM8?pIn+>gN z0b=4_b5O|4A*;Q+vc9Vqr~%3V155*NV~@gTz}KSUiKB-uJzjMZ>5%Q#n24H!V{ zTY(LLAE*NAHZ}C#wnj%Bw5OFIkRhkkAW#kDC3j9Wm0YXRaXlyyp>#mVfYG)eC;@ab zDb=T-BCAY4LI(Z@GOTr2V_A{pRwSmz+8Be>CjAw(=gnbVWAeguvZa93JmL(EDxv1m z0OP4q=fpAK1Mq!C2`OkEn37o;m#wF#(t(8Pu#S?2f#x<~4EO{@fmm`p9veD6RZ_jp z@Au4};q&`XuKEYgIiB4((kgxOs#YdqJw0fY>9^K_agEu5+$#k;w#%I2N>n_?)YIqu z`tq&#_^p?-%K*U0^}|7+9U(&k0?s;=r=uCZ%)H9_edH8wK}gB(nUB1FFk+2Ol%BXV zHoFY`D~2x|2m%7v+TE=2L@ zAc44q=tejYU5HLZGooZ=NXsV%)bU*sTokj@jZSo^9&w{ke7#VNQ*1zG!rIRk_@ zCqOr;g6B6CM1oPv1(~U4k@Gd+5tN0(j@GA*K*busv3Lb0UyXuowiRkTRZ#85JN!eC z_8ZVW>+upx5C#N|BTv2dK_EW@%(@F6yu1sZv>T3gm&*mIkvej1R4=RyYw#mS zx}c)#2z<)=VQ1|=ux>5PwjVE+J!Q84EQyG-j9SFYV*6AQj$Gb(7!KJE!k5iQ@O3K$ z@0NQZ)>b7&TaFd~Ciolk*Q(7cL+9cB`Y;G@rr`tk5Hdjv+))zSdlF#gI!>6`zB<@i zaKYP!9!Pl&5VMjydlq1x&}37{RQY+SSBXX-w?kCLKK%bXFYU6{?d+nH00000NkvXX Hu0mjfTSP*+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/zoom_out.png b/media/img/icons/silk/zoom_out.png new file mode 100755 index 0000000000000000000000000000000000000000..07bf98a79cfea526e250703356dbefdb6b80d166 GIT binary patch literal 708 zcmV;#0z3VQP)TNkCP1&*^7LC~A?iZQEu_hKZoQoXI zA7tfTv}|~Fb8b^XuP>qvDk=)P)vYKtT12;}bKn-mwHWl`1Bb)&{XXC4IY$Nnvj5@N zfekg1Y}gcI!)Cq|u?lR+A{2&=d~S$}&0ei1|7pO6jkZ$6%&{R8TNpk>=dV#j&aWqO zgE~4pNU_-giktFkY-J5_XDlv`7+j?n3mXtxgadILp+c<9cr~t!x1LM6m69Z~V#pLL z22Cs~BoIdtZHTjo7Q|_U0a2OmSF=gCGFB$RVZIP(pixmBqE!^15yd!#9Z{Wh)zB%o zikBFa!WJPvMB(noe(U;k1e~Y|r$}@wh*Ymykd6>E3t69z5DT&Jq-fSG-dPdU{SG;i zbSb3<`RfKgJD|lQC`6(Cdut1PbDV&$M=Y?U)x)A(0iQN+gAeOBg2Z6fr$_Is!%M70 z=n*z7{*s%3rO7yazIO)}qa&~o@WZ=R>!b#mOSR zlCR8M*iRy2j7!PmWiiegA>Og~W1?FLk0*NI^}`$RW820{WIL5$m z>_5Xf28MJ08Llxf++$#P&cN`V0i^jqSnHfQ{{D2yWccsI@IQ#*e=@`WQ7{?; zgFXai&YY?ElZ6qKkaa*=0hA{gIOZ|@=M<4xkl@J8EX>Da(0HhYfkRX+#o}S2ODBtJ zMoULwVoN_GLx)J^M1_{gin0a;3=5v@XW&n2OL5qo+B(~u+2n>~5F<0InI*?sfrNui zY__5b8+I<#yvV{W)Z*fBby*v)REOLRsY?xwOU1NOBvx-d(729`?NMQuIyJi*!b8)?keS8019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-Xo-U3d6}OWA{QqyyY?UzQXosSO zFvsOfmn1G8jg%;8G*S7cGiTKYi4V<<8V(y7dn^tg;P*@r7Fd4%NPu~6Cbw5M;uBJQ%;*=c;-mrfqa?98EsECMQ+egzQ&sH$(A)v;bg=8B@zv~Vr=Wh p(*&~}l+xBE&9N+gR?i0X+RO{a3!g8m{sMFpgQu&X%Q~loCIBujRZai^ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/bomb.gif b/media/img/icons/things/bomb.gif new file mode 100755 index 0000000000000000000000000000000000000000..40c03831bb9affae2073fc434a092c7b49b40054 GIT binary patch literal 913 zcmZ?wbhEHb6krfw_|5+|!0?|z2b2>)d4ho>kKsS3jEBKN`(_qlIhTM13{0(DvUV*V8xAlw3oDv! z@d!+CW?*D6u~}evpn;LesY_+%h64;ttQ?NMQuIyJi*!bAE1GExUfkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&$;PZ!6Kid##Ack{I>@aR6%Q(L!g zo!YuT!Zje+uzL0CYJJy^6Nj^l{DZPzHqT??5qu~+gWIL-rSSalPBDk9hyPTyf@}(d z+4s9}G-f=Qa^}0%O$lM2?zLP{>{GDs+$z@1 zBzU~=$K2Qn*Hi2lF4&Me`}!7RRrlSUH64WsrYm_jHrp32UN9voarm8mML_xT*TP+h}E+vRI(s89ZJ6T-G@yGywp9a*S&L literal 0 HcmV?d00001 diff --git a/media/img/icons/things/briefcase.gif b/media/img/icons/things/briefcase.gif new file mode 100755 index 0000000000000000000000000000000000000000..3f0266ea99af102d3bb14a0236a65439f8a75c94 GIT binary patch literal 915 zcmZ?wbhEHb6krfw_|CwPY{)RDSYXbaIZLZG*S1)0of5QlPV(NR)yKB>9NW9}+_|m) zN5NE9xF*i0WIoZx2v?AtYk*XJqLGr1d&Pj{T&NdH}x^Z%|y8jf` vCN5bm5!J@U9+Q<^Ef=i3yxcF4ZHCuYt) literal 0 HcmV?d00001 diff --git a/media/img/icons/things/briefcase.png b/media/img/icons/things/briefcase.png new file mode 100755 index 0000000000000000000000000000000000000000..849d8815fd7b3dc305e5aa39908dc5bee59aebc9 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!WnDRG4!lvI6(hI$V z1qXk#yGwjqW7)GvAZ3Ghhc2@jLm8u)y)cvU`9JK^=bBERZ(;C|KQT2y|Ie>qZ7IwF zhaQ+OWdpKj1u<)UJ!Ias*Wf~;gQw1fxk8Dab6JlmiXQmH$>8uLsQOemPYlqR44$rj JF6*2UngFGSW5xgg literal 0 HcmV?d00001 diff --git a/media/img/icons/things/calendar.gif b/media/img/icons/things/calendar.gif new file mode 100755 index 0000000000000000000000000000000000000000..f7affd9033c966e4c7f371d4c0bca0c5fe9f70c3 GIT binary patch literal 927 zcmZ?wbhEHb6krfw_|Cv!XlR(6oIHntVa}X6*REZ=ckkZw=g;52fB*ga_y40{Gz5lq z2+W*0Q}HJYBLl;K1|0?<0Obh=jv5A54jGRP4;q>{IOTk16fiWfa0+$T;8 ze=q9L-ZM{G{w?NMQuIyJi*!Wl#7wq|E02JaZ z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCijkdAc};RNP9QbMnB4`He9K#cIsL zH)kzuNMepilaw}|V_Dpm(yOMX#*=9v{^#G{*^0KdvOS%tiz^r-8$!$$Z`}Ct|K95F zliskVr>D1V*<#Yded^Sy12ZDbO80IkdmA-ruYimU&o?ISGe_RN%iG|RnW-6=^QtQG z-kwU8YDG;=&WEf5?J)_SL BUPS-^ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/cart.gif b/media/img/icons/things/cart.gif new file mode 100755 index 0000000000000000000000000000000000000000..ea5b2362e30f21e12b624e3d255fc81b421f2043 GIT binary patch literal 905 zcmZ?wbhEHb6krfw_|CwP3`EJvbLPxBckbM^YuBDXfBydc`|sbs{~raTAu!xSVCKx3 zia%Kx85sUE=r8~QC{HkOq%r*Gl=0ZG;9xU{FcX7;!b68P-v6vKJT^W$(jg?6ap!~~ z!!ZVS76}1Og(n{U%*+xR8#bjfPSXe$6L4@iaAuZau+WW@#p&m!i0NDD{P>*c$l%JX Z<6>2)>DI{1=Fp?{Rnu{G7&8-tH304j9wz_* literal 0 HcmV?d00001 diff --git a/media/img/icons/things/cart.png b/media/img/icons/things/cart.png new file mode 100755 index 0000000000000000000000000000000000000000..d77ef1c738b8b93d59e443c1b99605457ce6b04c GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!WllJ|_JFspTy2 zh%9Dc;1&X5#!GkW{s0A8(j9#r85lP9bN@+X1@gCgx;TbZ+*%rRoA9wWt;;d*O+H4w zsR@X`80G(2^vMgCJn7V?b^kgKO=7p;T6{X}^<1W2`*knVB@P9w|0bLHMZQJg#o^rB l*B`TQv08m_qH_3u2Bu{7IMbAylYkyz@O1TaS?83{1OUfaYySWM literal 0 HcmV?d00001 diff --git a/media/img/icons/things/caution.gif b/media/img/icons/things/caution.gif new file mode 100755 index 0000000000000000000000000000000000000000..7b9e4a0e22d2471fbae0eb094e02ae3c83a7bdd6 GIT binary patch literal 912 zcmZ?wbhEHb6krfw_|CwPoSZyo&Yb^C8UC+j_`jFo|1pOD=NSH9WBC7^;s1Mv|KAz@ z{|BN`Fd72GFa&1KoT>Peg^_{bKZ6bf5PYn{0?NMQuIyJi*!Wn?eT(Z9fI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%oPZ!6Kid$;~HVPhA;1RLQcbTgi zv|P;ipg^RO>Dt#iiBYVY?22XrHGS{?2`s38$?C$QtDqE_y)yi=YVj}cCBAWri`9*s zwV8TcxBeDpxxL5i=)64*4WC;+ zPssnHgwwuV2iG1=D`#128XYFj{aP+2qFUeiWRl+FyPrk+zl+>F6xf)O=r?`w!6$o; h7#q$_`tSUJRq29aE5JP7#g;2?rUOh5ue@yXxz!%M2`s+V)BWE^?lzEXrq6A+Y#XBlDwG Iyc`VH02Kl%pa1{> literal 0 HcmV?d00001 diff --git a/media/img/icons/things/clock.png b/media/img/icons/things/clock.png new file mode 100755 index 0000000000000000000000000000000000000000..f4f6da26251136beb6cf629b2f6a0c45fc50eafd GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!Wn~)DOp90t#^! zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6SCE)dv6jEv1_somf_|uv7nI)ieE%1(V_*{V!9TH1)=@d9wLSI3#9I`xg+E bnl8U)<5$Z?&R>~<-emA}^>bP0l+XkK*e!%v literal 0 HcmV?d00001 diff --git a/media/img/icons/things/comment.gif b/media/img/icons/things/comment.gif new file mode 100755 index 0000000000000000000000000000000000000000..6ee62f795a7ef7d566c7d619ccadefdab3e2608d GIT binary patch literal 915 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrC_!+%a0j|~qT7&wHrSOgwCXlxfymP`1-e}Ivh(J1Rm#sLOr z23cz{1A|Q|$NO2ia$;r*r7|+?NMQuIyJi*!WmPX9(LL0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-JJY5_^DsC;EY{=K5AmFNaQ@W5_ znp;|$TPoKhC -mzT5GY}+=uBf^P?-uW;cysNsnQ0Nekq+I;Zg6A^TLi+Pfe2ZtQ zv?P?q7V9`1TwYMl^lN!$)09Gu9z%}kX{|P~UY(nRxTZc(mpR_p9U3~3;ePcm_G?i( z*Gg3xQzMr#x&}@F3Nckg-rhE`!RGvBu1z|-*ESpuZD9YkPu={tM4MtoW3~FSo-3uX zCyo~$u`~-}IP>|B_=fk^*|(=DF1*0J_+(KaH%$bTmSr{1@{xj%+asnt%FmR+Z{O6SUq2IvJ#KFmykYJ#AsFg=T zt|X$M(Up~3N{wfMf}=ZwtSKMQ1O`VY1`Wn3B9aV^-Yg6W`&NnfopADA2mPIzpC>g~1vC_mK}f literal 0 HcmV?d00001 diff --git a/media/img/icons/things/detour.png b/media/img/icons/things/detour.png new file mode 100755 index 0000000000000000000000000000000000000000..f082e1e609a13a4468a5f0ecd5e260ba551dfddc GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!Wo3vsd}`0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhCo-U3d6}Q$--pJRYAiz4mPUpW% zZf^ZnAlUo$YV~n7CjSE4rygoTk9<0qTv*aAo*${!zh=EmW?8sk@V$*nr9XR{HhXC1 zD>Rs_ca4Y>l5t_sw=*Y|_cTiiiaww8iciDH@#29aGwwGi>5KgNBCcVi yRPoR@87@w{{8#^a}57S!Dt8!_Yjyl zbEe`?7Dfh!{|q_|Kmf`U3>G73{2f({24ww z1R5Iq6->L9{5YS?$gJ+)^~7RB!|CblTu0{I*vP;*+k#U@;lL)9#`zA--&hz*4)`x- zVdIfan6ff>vG+`_ic=*k8&-$2C&+efeH}K5VNccD$V&?%CowUvh&^4F=)k~W4FG~8 BEyn-= literal 0 HcmV?d00001 diff --git a/media/img/icons/things/document-new.png b/media/img/icons/things/document-new.png new file mode 100755 index 0000000000000000000000000000000000000000..aec66924bd0df51977821498e9713c6c56ad5ca5 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!Y-L+Im)60);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lheo-U3d6}OWA{Qqyy%(GSMt)OOA-g06qp?(G(O0yTO4k1JU_=$_()QM)3%4_=iA@d_%ENW zZLaQ#$T~tEa9+;yCUzCQB6P{e;D&3&$5HkKd&c9En~aM zs`G;F0ki&+`OP8=I~GcO`2IegEr`)mPr{VJIzdI%{18J?UW(&%1-1j5jevf=^6aYN U5uOMKpo1AaUHx3vIVCg!0DO&JUjP6A literal 0 HcmV?d00001 diff --git a/media/img/icons/things/document-txt-new.gif b/media/img/icons/things/document-txt-new.gif new file mode 100755 index 0000000000000000000000000000000000000000..19c2c9e28aadf173a452582d6eb97df49b71fec7 GIT binary patch literal 925 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^a}57S!Dt8!_Yjyl zbEe`?7Dfh!{|q_|Kmf`U3>;Mq|2bJ4HYglqW??NMQuIyJi*!Y-qpLr|X0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;^JzX3_DsC;Eyq>SwK;YPV&ZOeo z#%~0*1UOij9D_Ptww(`Q5i)FaRw{J%J9j>ppCPfNr#^dU&l_)#mtTL~?VqNcd;5@r z;t>-=k53XVXBvaJ<`jS8(_;Qw(pVNMe!)$1X%%yJ+`@I)9+QrQNLzeiU8p4ARkupg zC2&dZ{n+ofmLHjFBE2LtOKm}tm3EH;k8|$thh;6#UmEsJlE2QmNyk{oq4b@`FPSL~ zhTE!o%M-LR1*0WQe3>ifCGTfqaomu%fTQNVJ8xExgRYosqg2JbcIh4Ke#<*XPFvCV x*kVUx?(NweC#L1en7ns;UHwqJckP{*tm%7JZ2ukJ(*g88gQu&X%Q~loCIDmyg<}8! literal 0 HcmV?d00001 diff --git a/media/img/icons/things/document-txt.gif b/media/img/icons/things/document-txt.gif new file mode 100755 index 0000000000000000000000000000000000000000..d71bf8aa84f592717647995f24fb267c666741f1 GIT binary patch literal 916 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDQ!+%Z|hYbr3GBB~rMV#26$k4*Y>@i2<;(^003_KY+2@T5b z-2(qpmw0SEaI}#%NGM?Dr4$baRu4awf*_T~*(_{#u6TY{Wt=I*euc$g!HSEEo!J?9 k6%?NMQuIyJi*!Y+k&vw+-0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lfwo-U3d6}OgNUdz|2Aj4X4r$)KC zF+oA#4hKt9W5R{>O#;0pN)xv?6&`(Cm!E#`^vxT8lz&$~bDLbO_I=IkUosB6)+wLf zWb!t^p~SZm61N|NKvZ@$LNSq2NHtjbPU z+uATih}o&*zx0wR9mRZ1k1Zat&H22m{=wdMhGZV*!v_y|2%@aOK{y iZ=a7&wORLRqBNW4l!QNFrZ<6ZXYh3Ob6Mw<&;$U+G;_iL literal 0 HcmV?d00001 diff --git a/media/img/icons/things/document.gif b/media/img/icons/things/document.gif new file mode 100755 index 0000000000000000000000000000000000000000..605b37c000aa1b47f02e8b2ed349854fdcb07dc5 GIT binary patch literal 916 zcmZ?wbhEHb6krfw_|CwPoSZyo&YWx4uHCzL@A>oR@87@w{{8#^Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDQ!+%Z|hYbr3GBB~rMV#26$k4*YD>K2P@X_HG2A+&NCq6!M zU}kmb;)y))*q(tkXjM$6kZL27e)6&$&jriQ&Nj*ByWp9Sewxv`k?F1F1N8t#Cw7Iu knhRD2FJ+3dn)@n5>*`81f2liMhKUX96Ar8Ka4=W{0H8`Jd;kCd literal 0 HcmV?d00001 diff --git a/media/img/icons/things/document.png b/media/img/icons/things/document.png new file mode 100755 index 0000000000000000000000000000000000000000..6d5f24ceb5e9c30238d551ae7a12f61290fe0c53 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!Y-D-`I4X1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;`o-U3d6}OWA{Qqyy%(GS+iVuJ6#&(HY{`5YJ*vjyC4*kAvjuT-DM omsvvdY_HA>p(6|xVQfqc7J}K?&NeX-KnoZ=UHx3vIVCg!0O?3Mo&W#< literal 0 HcmV?d00001 diff --git a/media/img/icons/things/documents.gif b/media/img/icons/things/documents.gif new file mode 100755 index 0000000000000000000000000000000000000000..de2cff84ed3a7d68d11ba9d619ffd507017abbf1 GIT binary patch literal 923 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW}S&Rx59?cTk6&!0bk|Ni~=@8AEAg3%Bd?jbO9 z=1j$(EQ|~c{~2@`fB=*y7&s~z{&UKBY*^sf$RMP}Q}98afki->DIr7PKx4PKppVLm zfQ1bVj669m5`l{tn3XiGj?54|aGXgwyop6Kh=Fm27UKe!$OUN(OoogiGb9<7H83(a tiD@`IP`j|0sYyuTm&rn}c8|?!e=9^^GpvY~F57bJgM8owc4j69YXE^xBO?F+ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/documents.png b/media/img/icons/things/documents.png new file mode 100755 index 0000000000000000000000000000000000000000..914674000df1f54a3fca36abd5bed733df392be6 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!Y-*?F@O$fI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%vPZ!6Kid#!3+w!$22(%V%R)5I# zB_zx&B`s%WXO-u8CJCMU>~d^|ilUob+rj4{ya#G!j%O)fFLkZGznynls;7`da=4G?-#Dg( zd;h0C(mJ>;*VC!T#&`1k$FpZhGNi3#-ym2L`#6YG_o#I9t{+BzqB@6zJEYg>+O?K!r0&bec2&z;-) ze-w;{z%UJgnKNf9{$ycfVEE6V!vF-JJi)-x!0`Vsv%`i2hDHuyCWQkN6dRg3S(z*x zHa==>V&P{BIIwYX6N`+aTE&jQC&wqqd8$R66mmR0RYmXwkAX0w?`#eaIfDejgN*a- z_1PE_7Oc3q*v(Tc;?$G_LCd{8&E|MbWjM(gu{rCkS5U+C^$Gj!WI8skacpF~v?_MB M*`nLq85tR@0UK#1+yDRo literal 0 HcmV?d00001 diff --git a/media/img/icons/things/folder.png b/media/img/icons/things/folder.png new file mode 100755 index 0000000000000000000000000000000000000000..c3a2ad5e394ca8e67a2ad17c62c8271c2c523f58 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!URD+?jWM1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;yo-U3d6}OWA{Qqyy%%P(p)M{|y zfPQaS+m{xgTe~DWM4f`GZpZ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/gear.gif b/media/img/icons/things/gear.gif new file mode 100755 index 0000000000000000000000000000000000000000..e1c8b03d33a2085487a404118bc88a51443873e5 GIT binary patch literal 925 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW}S&Rx59?cTk6&!0bk|Ni~=@8AEAg3%Bd?jbO9 z=1j$(EQ|~c{~2@`fB=*y7&xjJ{&UK3EJ$c*?NMQuIyJi*!URLqPDD>4iw@n z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCilSd%8G=RNU$f-pJKrz?0kmTlv4| z!K()y+1X`TVp;7^-7hF94R~=^TV;vq^6v^WrXNx94SqexSZb3_vil?zHQ(UXNB5rL zeO77aUy&UeC}?p$_$%w(2OJaDUwr%fo$D*Z_J42BT&#CwKVJCby#ddfY#WBuMS9zE zlP~UA!?)2OXw$Y_%fi^}|Mr~T6!Yd&S-*8WF!xANr>vFx*36=FFLjKUo+- z30{W*2tav)fg_pWKc|exh6M+k*%=u)90C*%x3TkBgk(H8aHvg`*F$GP;G@I!3>H!k zG=h>FyA`-s#GL%}#GQd9z` P4tA$rudneA3=Gx)C1n>2 literal 0 HcmV?d00001 diff --git a/media/img/icons/things/heart.png b/media/img/icons/things/heart.png new file mode 100755 index 0000000000000000000000000000000000000000..17cf06d3d099a5092d73e808a262139deea6c85e GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!UQQdD!!|0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lido-U3d6}Og7+AG+gz|-3KJnvj$ zvvKP&OPRyRjtQ<=t8<~^NVn3F`FCn3FyB{ZJXoFo&*h_ct!V*6-SM3();y8h>Y%Wc zF-4&N&z9|LH?NzL<~`%J!FJ!`C*7Vb^X>LKgat~yWzl^i>%(7B!k*9cq~GOyNUGht z3UZ(8$QbA)q$JV&h}iUT$fV0)tIY4o^@DUS(4`(Xo+{QNpA` zQuyFu77j510fq*~=DD`Ud}mH3H2N?0XytNQ!0@tZxvRLw-{VuBU1pA0+H{5^q>*V2 oyNJ)(6$*{l*GC-9^F6RlH)5-^;VD-JG3686Dn2Xma4=W{02EXxE&u=k literal 0 HcmV?d00001 diff --git a/media/img/icons/things/house.png b/media/img/icons/things/house.png new file mode 100755 index 0000000000000000000000000000000000000000..7e30a532f1781b3f52dcffd3448e46833f3b8b18 GIT binary patch literal 406 zcmV;H0crk;P)X`w{45Iq000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0003cNkl(FbV#6r4B6`;TL)#&#{}#lV}^c1hYlS&q>x|eUvx0YTgG$p?7+ z`YeQ?V07-d#Lwq5vMj3vaY+=_igj)A)9IuIF3{UzFo2NKaApJ&KOPSF4<0y2SeVcl zol;EmQDy#d3;zBC{c+X_qtU^Zh4;L zbNmgA`vn_-?gSU-T%vDzO{f_J=^e1!0sB2R)BfM~XMxFCtTrtjROY>@RkXXT8LUTN zz^J&~51k{m8nmI&Adcf!13SkU&=2B+5Yqeh3xUiI5rCauRsaA107*qoM6N<$f)Aym A%m4rY literal 0 HcmV?d00001 diff --git a/media/img/icons/things/icons.gif b/media/img/icons/things/icons.gif new file mode 100755 index 0000000000000000000000000000000000000000..97d8ca3699f5039303255c601708ec7bd0a6b7be GIT binary patch literal 943 zcmZ?wbhEHb6krfw_|CwL~*mBR3m(WRMNOd(+9 zrUlIGa*|304GYwKJ9z!P3=V8w-q^$?a%73af)@>oSQOMQST0z3nUR%WL_%x9s!&D& w?iV})3=Y@VvFjVLIBe5l=#cv_nRDV=;-L;E-cznC0v<+ht$6*9n}fj`07_X98UO$Q literal 0 HcmV?d00001 diff --git a/media/img/icons/things/icons.png b/media/img/icons/things/icons.png new file mode 100755 index 0000000000000000000000000000000000000000..1d9d8c31e67861dddaf9fe419d071ffafec198f3 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!URP5^r_I1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhIo-U3d6}RS2Runp9AmD1wb6C_M zhViN#<55wA6<3linAzs9km_ULYWC;NkXgi@!JGDSo66*rU2~nR_P_Ki`@ipH3Zvjc z{~#}uV+z}E+iaV0?LwZfTRF@7kG^%UI7GK_apVX|#5H$#r#u^FkuPxFi>5tbDH5<_Oym`n*Ch?3%ffVF5Fjf-)Oy&t>O-g+O{3G xTfQf}x%-{{?Pc#d2aKV5r7c1PbvI~j4uc|TXD>jOQ{;OXk;vd$@?2>^{=hA995 literal 0 HcmV?d00001 diff --git a/media/img/icons/things/key-yellow.gif b/media/img/icons/things/key-yellow.gif new file mode 100755 index 0000000000000000000000000000000000000000..772f315e87a1e1a5568dd6d89e1adfdb7c4402b2 GIT binary patch literal 900 zcmZ?wbhEHb6krfw_|CvEXU?2+a~S@gWB7lK;s0}n|L+<8e`omrABaZ5Xb24R5STf0 zrs7W)Mh1re3_1)z0Ll{#9ElA7Ib}RHEI8QAA*>Z6u^^Fwfs0wjz~H0eAqG|+lQS?NMQuIyJiIE3UyHXnTX9w@|F z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`0N_H=O!skn7E*qZOK0?*Mvy%59a zLNj->tqVDE%X0dOs4JJZXg_V;q3DvSwDHQM)SSo9`Dg6;zNlr@q8IxaR{VURv$pMF zi=daLmCFGE`7|NzwzCqC&HH*d#h;d*tLitp{+%QAnAkl>$!VJ|_T?}K{8p~;NdFKe zb1h2W`1VHuXVy)eMOQYqrmf40(K~eP*OU1xiyn!|GEAIkDWThFd2;%s;=83?zwB%l zUY^bP(b#Hr`G4z=dJDc^nfQw&GWf|hu+vav8&0{~x4 B83O?NMQuIyJi*!UPUFAKD}1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LhMo-U3d6}OfK8}c18;3-*U*U+;^ z`P8{{=@m@(HLUk{uvnkuju15F-n_Bd(RY^1lzAmZZ;zx~dx|PK^%VqUUZ^lQrlHZu zdh84HY}-QjJ3`k_7{0fCR-ODY^V7r%q0>rcde>dJrdmoK-L(JbJN?d*mk#`o=2nQE z{wEyuBKW&jnd-?m_h&J+8gIC?t(W~q*8H3Ps`>`pPqTe)?sD7uMe*y>goZ}pd-oL^ zGJP&w6^nSFZ1h;lJvQKJe1PbMD1G6AbARbP0 Hl+XkKXUup} literal 0 HcmV?d00001 diff --git a/media/img/icons/things/mail.gif b/media/img/icons/things/mail.gif new file mode 100755 index 0000000000000000000000000000000000000000..b5cb608203db044ddb2c735d61a8549cc4cc695f GIT binary patch literal 933 zcmZ?wbhEHb6krfw_|CwPoSZyo&YXMCpWl1_{y7l62ZHbKzk|X5Q7{?;!#M?NMQuIyJi*!UQvat=HX1PXB$ zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<%JzX3_DsC+e4&*vyz~h^0erxVF ze$ko2?9LN@8VUpo{(b3tJul!lm+tKs5vBZ2v!1Bt-kPGhG=np&dy}csZjZ|*KQszu zf+wk*k;rhAekI;;-ZFey?Q9<16l?8TyRIG97ua&mvxRcaH9MNkD?2&lHpzPW%5ndB zobq0~Aw;fNXj3uM?dfm0Og71$c>Q-#mU9>W7i@u$Pg3EK> zxL3DRa=x)FOpsvndAM&)(`31?H+_{i&wqJ8u4uRpXl&x1A2|Y M)78&qol`;+0I6VgE&u=k literal 0 HcmV?d00001 diff --git a/media/img/icons/things/musicnote.gif b/media/img/icons/things/musicnote.gif new file mode 100755 index 0000000000000000000000000000000000000000..b35f5e7b03d93a895a5acf29efe5c01d73cdedc7 GIT binary patch literal 889 zcmZ?wbhEHb6krfw_|CwPoSZyo&YY!7m#$sAcJJQ3$BrF4ckbN(Q7{?;BOnB3&YY?E zlZBCi;Xi{80}z1n1OrDH!+%a04S@#7W;PBjmV^b0jBQ+;MkWOYiAS15q@(uy=vQ>< zW46s>;aqUQeS)lf-xH3611G!LxH&3zUT|n+WXxzQnNhsdWwu4Bm&yg?NMQuIyJi*!UP&rk%fK1Qg;d z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik6;@0I*w-ru3T{PF4B*DWY041mA{kIv2wfUw(Zw$@En^lpJlD7uv5XE``Sj6I4#qk z&9Q#!!&()Q-TpC}N#VQSiGS0YwI_bKB`A@o8IWBYv0#c(tvuhvY3`awlX|L|w%BZ# z7j!Fo;e8u{LMM*pSNEDS3tarY%Id)S`J8%7rnJ|-|GVW^zykS4U4OzK-2N^YGqI81 Y&OG7FH244aflg-dboFyt=akR{0B_%Cj{pDw literal 0 HcmV?d00001 diff --git a/media/img/icons/things/people.gif b/media/img/icons/things/people.gif new file mode 100755 index 0000000000000000000000000000000000000000..9e53180b0a7f97223a025f171635b0c8589313fe GIT binary patch literal 907 zcmZ?wbhEHb6krfw_|Cw4*|%n+B@|2btmHY{*#V&{{vi1^UZ#KI-1 zX0jlmk%>i6+AidWz+?NMQuIyJi*m$iC|8@8m0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Li1o-U3d6}OfK-xh6F;NhK@cSI&u z+2_Llb%NIlc;_Cdw|3m0S+SL)G5PjtOO0puX1j!*v;4t+d8N+cIsDnVub*j4uzlK8 zoFh}?>$0xqp8C@#wzJ@S4vflG7+ESCn zn8Z4Bc8>oILwQSg&+Zi`>qY55(vEmS(SD^be8t_qTdt1@sn!r>mdK II;Vst0B_BA`2YX_ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/person.gif b/media/img/icons/things/person.gif new file mode 100755 index 0000000000000000000000000000000000000000..14632c2047e85716f7e7325ca8e2e83eb828a67f GIT binary patch literal 907 zcmZ?wbhEHb6krfw_|Cw3@c;{~7lFXE^tN&YU^_lNtV>WB7lM;s0}n|Nnt# z6pV(z@C<>OGiNIPWMO1r_|KpN%nHC9A;7@Ek-_kvQzm0ULSrL`pp?ad3kMFiun4L+ zT=?NMQuIyJi*m$j#c@6C>fI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%6PZ!6Kid)G){{OdU4x7WaWI@HV zGc*4et~|W!b20cHEah= z-IhJv(wk_x%rSxaz^vMj87}Oz(+~0gTe~DWM4fhZbM! literal 0 HcmV?d00001 diff --git a/media/img/icons/things/picture.gif b/media/img/icons/things/picture.gif new file mode 100755 index 0000000000000000000000000000000000000000..6bae7b7a9263aaab22f6961a7173ea1aa90abcfc GIT binary patch literal 902 zcmZ?wbhEHb6krfw_|CwPeg^_{bKZ6c1 zD*$tZ00RR@GQ)pP8IKJM4mPu~Ys8!gczA%3Ny%%DL?J_Cy#TAojfjRt4BZl@MPGh= zOgh%9;@#$>DVXBc&yd7apt)JCfx$d|)|t-D>i*O1YL6Z9G}bsjTfxvQrYcaOae2UE NJ6Dgd@eT|O)&RygA2k2~ literal 0 HcmV?d00001 diff --git a/media/img/icons/things/picture.png b/media/img/icons/things/picture.png new file mode 100755 index 0000000000000000000000000000000000000000..71071c223334943e4a347c56d58b5d2446769376 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$i4k3P%a0Tkja z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCikDJY5_^DsC+ecH}#tz%lu#{73bg z$-jm3ld3LgS{QGO3rO<5tkB`{qxrG;ZiQ{mUMEvkpYy~nnB;$I-^JGEj_u8C2Y>Rt zIdQ<-j7j++@6PlGb9aeWury~)5HjEw$+EM#63WJCJ~h;oX|?RZa z;Tr-oXUCM@Si~km=%CILV$sRqmtqOUulO83mlu6*tH@~Y?NMQuIyJi*m$j(93%A7fI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%!PZ!6Kid#n~ALKo(z~fqY)a^|Q z-<_K+%x|XjI^_AzI?}1p81qXd<@Aqw10e^Ou8r5$om4P%Tfr%&g9%Mqk8X)o z^54!6@UmnviaVQ<|C(*ahic)geR~D>e9vmx>AvUTf3^=_%%zfl2sce@m5ey^k=M~{ VrnzpQ7SO#644$rjF6*2UngF(3Xf6N% literal 0 HcmV?d00001 diff --git a/media/img/icons/things/popcorn.gif b/media/img/icons/things/popcorn.gif new file mode 100755 index 0000000000000000000000000000000000000000..ade3c2bddcfd56ef788eea6cfb5624e8dcf2c56d GIT binary patch literal 952 zcmZ?wbhEHb6krfw_|CvE2Z-j(S<1k$mVsd_1H)bhhGPs2=YVJq!?|RZap&SA;XUA;SON=zI=4oV!BK`Bg)d~zlU0t-`5GqSKS zSp0n7*gTa>L_#AV;Q+%-6Ip|V4GsqxnOQjguowg@_$~IBYLx0VdBwT8hN*r_XFfP^ zah~_~OMlW6miw=b7X5U_%Jl7lCCs?NMQuIyJiWO&5Ys(5Oy0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%LiPo-U3d6}RRFI|?0A;PJ7lTX6q^ za_!{zFU-Gi);9Y$B(InI+jK99iKTIy)>)p-0%hWp7*&)axXWFck}Hi`TFy!K8qVlQ zQaBvP!gQ?CY2g#gY~7W5!snMre1Ej-jHbWuuJcR%6V6R`Z|L-H*fFihN$*I^l&*hL z9s30J<^1Jrd%Ne|De(E-;_q9PE1^Ql$lFJhC$Ql2_uUfzeK=>O{yNuTDDRe0-Fw;VlpX|`p^-~=*wi;T&3dR z;25~btzSqYs-%HwxxX`?#Dl_BS67EiGI1y@Sbcpxlg7W>y9yEyH!@sW6})Iy)&TBlBEA3s literal 0 HcmV?d00001 diff --git a/media/img/icons/things/rss.png b/media/img/icons/things/rss.png new file mode 100755 index 0000000000000000000000000000000000000000..a229016613c4236ca5089c87c75ecaca70e6b669 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*m$k9r9QTM1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lg3o-U3d6}OWA{QqyytlGeO%p&`c z#}?1@%V|bSmM%3s#LJLr=4Y&S?^fhXp3M>x|C)IcZIaJ?xNi~IpR#=Z+fv3q+b$vfvB`o7($>A_-1wLSV&>WY;eBYX zWZ+?|V`|j&>Cl?U&HtpCgT*&8SZW#{G7>%^ki^@N>1NmvbHHU{o&p1d+pEb>*KFnM Q0s4=@)78&qol`;+025qsnE(I) literal 0 HcmV?d00001 diff --git a/media/img/icons/things/write.gif b/media/img/icons/things/write.gif new file mode 100755 index 0000000000000000000000000000000000000000..790d9270441f7e62a69670f1e7c97f8ff1d8584b GIT binary patch literal 930 zcmZ?wbhEHb6krfw_|CwPoSZyo&YW{|7_MErcJJQ3=g*(NfB*jb_wWDDG5r4zM5ACd z1cq%0%$zw>@h1x-1H*p?9R?r( zgQpG*mYgCL8VwE?n;1Aw$XGte^krh+lvSE_?NMQuIyJi*mx~fuciF#2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6_9N|f0>UImV-kZ|zIQi1!XlNz( zA%i>SP690VnD!bTTDQC5|B>xZ%Nz9GW^7P3h~lmkV>?sMsKyKo0R~T3KbLh*2~7a2 C?NMQuIyJi*!Z}me;D)e0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lh0o-U3d6}OfKpB6kSAku4Yb*U+L znwZoAwWteCt!yES8T5VDee9grv)Rz%`3`%HV-;^0_A7d7p4N8iXclNk{+EGx~uM}{Zx$U4nLI1>%=kNWzOeGTwz{MYtDbZ^ZL+jjXA}>=9?H@ z3T1hi-q&vSchV?%dC0ft>(Ny!E^vnUCmA(*AG=|~o9yGsXxsZK*ksD3JyF@SGhH_C vXSjGp@%mBetPM;O*B<$^8UNXKMf_jsgqqzuj?In(`h>yL)z4*}Q$iB}m=JFA literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/cloudy.gif b/media/img/icons/weather/cloudy.gif new file mode 100755 index 0000000000000000000000000000000000000000..641755bf249034870219831a1973535cabf1b373 GIT binary patch literal 936 zcmZ?wbhEHb6krfw_|CvEXHLtxbLXCa|NkC{{{R2}|NsAFhX3an{@-Kx|D56fdxro2 zfoK$rhQKfkftfRBD*j|)WMKHupu+$Jpgh6A(aP|jQ|8Bc2ZkmNPAQ87gN07a97<9d zF9ed9SUDx+e0B&lHnDOEWVr13z|h2^;o28caUkW$G!afFh6|gPHO`b~Wl9K0NIN}~ zS%TpN=Yocdj1Jr%WL6bBG&1@v^lG&dX=qp(G~a8j)`HiejK;f_Qh%M#3ZKK6#&)|M988tNH&KASPf4BiIyVkj@AZCQv`|AC4F z<&9^VFq}Pm7VdA6M*FOlIkOEaW2bB+#$B2cQ zGu!`v{{5dM4AKLN5oReVj{l(vDF1*0J_3`1b%%$bTmSr{1@{xj$RvjQ+j2rw{k^fCPB{FA<5L1QC_uvEl?2MG=B z>_T=iHw+Fmc8jq`**IK0aI|02yeK7O1H-WnMy?f0Iv5%mr)oJ1DI^#)o}Ov!%p_sJ z(9k%ImEA#vL!p6zfr;lvNv5EKOC!4+n+C_1hRZz+{~~>VUS7(`6w#UW_2yNFV=e#Z f$Z34I>~O6m|FTd?B*VJ{JLE3Dx;o21fx#L8lK3sk literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/extreme-weather.png b/media/img/icons/weather/extreme-weather.png new file mode 100755 index 0000000000000000000000000000000000000000..5b7ff1fe09f1a0d289cbf2135a8126cb299779f1 GIT binary patch literal 427 zcmV;c0aX5pP)f&uIWGQhQ0K(9jr8T%l)|K8^r zTl)Tzzz`ASh~5+%Xvx4ocsbfcJ3nr-*!S|@wrvu%)&e4$oqz^eEX8=AlN8>279kZe zTtX2P>(T*+ox@c`oK%lD>@W)o|3Jl$aU2tiUcAp-OUh%KrV$r0Myi~1rt3PGrb)O= zVr!s6&-1wCfN{Qli2CpA7t}yIt8dq{ocDb%Og)gMpaUCQ3HTfvaNx^Q)-r}+kVKAG z82ymA9{U557JJ>mLn}hsziFuZ+JW4JEp7AJ|c?Y&p VVIYSo v@d#+}=$B+}QRxs$Ix$(2oz1|~NcHS2f%HQ?mIdnPXIcbr>#;OZV6X-N8?NMQuIyJi*!VakZ3S!|1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lg+PZ!6Kid#n~U*v5t;BZ-4s2ohqTc?QFn%DA- z9GA_+1vfrpklA!`zhiy=iaCsDIXtFy%@4?ucqd@nlhtreUSOR@U{5$psQlu8J-;3L uCp>G|a4P@H9s>#E+n1v>7L@I%VC@WV*)^ME;#;7z7(8A5T-G@yGywo!=U4Oq literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/raining.gif b/media/img/icons/weather/raining.gif new file mode 100755 index 0000000000000000000000000000000000000000..d3a0b11e0871a309209f995a421ef65f47753fb7 GIT binary patch literal 920 zcmZ?wbhEHb6krfw_|Cw{7@S2c)Wqt&Ek*&wK1P2BNYXH{~C*uGB literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/raining.png b/media/img/icons/weather/raining.png new file mode 100755 index 0000000000000000000000000000000000000000..d8c066f6a6ccff802be512959dd70317d5a23f55 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!VcOcCM?n1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6Z-=^T(SyC|)_xN@61Z2zdz{-j=V%o7 zF^L-EfJs7L6O~#HR0jz^5u33_MQzF=A$?)b5Z|NsTUMtV^gWJWv@N$-d+PVNUu$1i z-4=QEn^W)i>LbrLo-OR$_dfmdjgt!{_{}UcTaU^)^+g`=P8KtYZ>*Xab zX7KQ+ohJ76dIl-o?UpWX?~ahYhpMvv0{LC_MLUV{&5qD_N+)z`)pM S^d;lcgNsf6noc|%4AuZ)RvT0R literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/star.png b/media/img/icons/weather/star.png new file mode 100755 index 0000000000000000000000000000000000000000..6b94cc7d79ea2fa34e75df3f15809b9ea60259de GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!bA>m`q!hfkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&%!PZ!6Kid)Hl{{OdUR&C&1pJVm- zf8^%0huaySFs-rRJ;id#IQ`t8es9@2@jq&Z_$_k(x3zrS(bTGRyRkt~hWo&QLlZKc zlfo0T=A_z8R@Bw)6});=zvDp0y@OwVC)-GPMM~#l literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/stormy.gif b/media/img/icons/weather/stormy.gif new file mode 100755 index 0000000000000000000000000000000000000000..3931d49f9f68d8d708e813ea320a2a28b3ecbfa7 GIT binary patch literal 934 zcmZ?wbhEHb6krfw_|CwPoSZyo&YY!7m#$sAcI(!yd-v`=H;3WexpV)|G5o*B@c%u- z|NlTV3PwX<7>2;inKKoCvM@3*{AbW%00K~+VBlzG_|IwLaG~KqGY7v^#DW74>=^|3 zRaiD`NIb&K&fp=kV&fvl9tC5sD-{Qn9eY?^>~sPaC^50HacoFg`BAa4i8Ddy#?H-Z z42%xEPgFQe9yu~FGD%c$8YlTSN^0u0N`882-y;$)^k%1E;>ne4ED^pPg)193axCHr000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0003bNkl-m*I&cHJ5}djKT!5$v6<}tL5==k=QUeYgI=ujLS${{%d4=xI zf94}#*~hL{I>xA2!RgCGlCe>%J9;Qz7@IEV1RF2!x~|*6)>>tZ(K`S>vPQx<5lJlP z9G)XXG+Ll!d=!qd0^_S?X9!i&Y{@kxAo+$GT$W`ai@kVF&Mk4A-L@@N5kiPf-}ibL z2DPqho`l>$2(i+;O(go^gYI9JcL8|%c~f6GHqWz|2DN}H5U942+dv#H_e=9ZLO z=*EfU5cU({Noa8r6J!e}hyY-^&!4o8wLB$^QpjNrry`E2ls+S`&gI00000NkvXXu0mjf{Rp4V literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/sunny.gif b/media/img/icons/weather/sunny.gif new file mode 100755 index 0000000000000000000000000000000000000000..d342295e0a2c5ee6566786735c700c7df35cee5e GIT binary patch literal 913 zcmZ?wbhEHb6krfw_|Cv^?%cWm$qfI`G5o*A@c$me|K|+<-!uIG&hY;~5RHP-5E#xO zFmvWi#h)yU3=IDnbQpjDlqVQC@)-Ve%6M#8;MmB>AY&qt;Bct*KNCwwgu+6XR#xT^ zlYjxN literal 0 HcmV?d00001 diff --git a/media/img/icons/weather/sunny.png b/media/img/icons/weather/sunny.png new file mode 100755 index 0000000000000000000000000000000000000000..35daea892131eb87617fe2dbb331a7fbcfca68bc GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>?NMQuIyJi*!bAl9ol96fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU&&2PZ!6Kid#!3o#i@Yz;pbzrd-Y3 zUp}8DS>&BsV!!#kJ$QJJpAF|c8y?q*vr1mRxxOmnq5E{zv-ZA+w_bZQKQv{p_qwS; zm8@$NJUOG859lqul3eJzB4b0g-0wwQN>`KDuR4F=OIj!OFzbv2i1IqX-Nqf#@2`Su=D17@`Y!aJDFA8>`#uFz5yb}INI zCv@XoSJlBAT(&n7A2@n$`|Bv|+eQaD3-mUFr>mdKI;Vst0FUj9zW@LL literal 0 HcmV?d00001 diff --git a/media/img/reader/resize_north.png b/media/img/reader/resize_north.png new file mode 100644 index 0000000000000000000000000000000000000000..b266fa4bbe2a69f302353f8bd36ec46b2770bceb GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0y~yV15B)b8)Z%N%i9;AAl4~v6E*A2N2Y7q;vrJoCO|{ z#XvPcIj#?kPHRkN00m`ATq8a>QWe}Xi&D$;i?WLqoP&*LTytXv zsypQA;uumf=k1+^Yg-%y8XhV-F5I|7w1R7isMH}LE{muG8w$?HGS0c-{_gjc6Zd`9 zX6KmpJ+=mFY*@5v&Sqv=Ad74D`qx@_feZ%w^>*hsmoPIF9Nx9g@O-h03(sMJ+WX>q zObq)1pU?3&XJ9bbIV}`>z4qCZpodBf52U{q$}E*;Xpo+@taDqgvQpCh?;9>NKDa6K zg5g7e=F%J6-WuP2$?zfP>g%tcxt{nAtUCy!{5` OGI+ZBxvX@s zPZ!6KiaBrZ*mgBD2(Vr7ym88JgK&<>o`&nf>mRk|9F5xWneCrSE)yrqrn8&!6S^9Y zpDAzJSrS{GecSBZ=bpzFN%z0s*!Fhi?|uE*H4zFNP2`~m@~!s$hfRD9`;t{Wg+fDJ zXDwTA&UaWKa++(P$VQ#h`YAcH)UK8GR?bsC|M|P*>s@`Dbmqsss4bUbaTFjE9sJMm ZK10v;v~{}qVqj1(c)I$ztaD0e0szo*dvgE) literal 0 HcmV?d00001 diff --git a/media/img/reader/resize_west_small.png b/media/img/reader/resize_west_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0c02d4dfe911a80cf9a82f0bd2746b22aa859f GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^EDQ|HFF4qMte^Aar9cA3PM#qgKv2Vx(gEai7I;J! zGca&{0AWU_H6}BFf-)tp5hcO-X(i=}MX3yqDfvmM3T~N2spa`a*~JRZ!NxPLxiJIP z1$eqRhE&XXd%{qV!GMFsVBN9%hTKdq;yCxF_^95TdGp;pmFicDEdov)#1M5I+$Z0Q VWazkkkOrE~;OXk;vd$@?2>{JVI~f1~ literal 0 HcmV?d00001 diff --git a/media/img/reader/taskbar_background.png b/media/img/reader/taskbar_background.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef71471477c6346fcde93c9e556b58df01f0bd4 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^&Oj{3!3HGDZ!L}jQY^(zo*^7SP{WbZ0pxQQctjR6 zFmQbUVMeDlCNqG7G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^B#xt(DF$2|o z@pN$viD-R$?O^T^1%cLw@)Blw`rBnLcg!v^{@BJ?bYSDM=DUY~>uqymTfCfc;;_=h;a(yf9TJr0R1yZYE)^(fTV)~z>5V_J~cx812;t!VBHONQjI zqO2XaV>gE}ez>(EY-X+RRHF%(V&jhrZ*SVYG1Y=ShxyOOXR{tlv0u41GlyZ$fftki zJ$%BFR{Qtz>A!J%?mUjt{eJlv!@P=fH}V(GocL+$yPwX+%nvSJ|6Z>W-^a6G=Ee)4 P{~0`8{an^LB{Ts5TR@iq literal 0 HcmV?d00001 diff --git a/media/img/reader/user.png b/media/img/reader/user.png new file mode 100644 index 0000000000000000000000000000000000000000..93b1805adbd037923fdf29d4a86d49c0e95c2c43 GIT binary patch literal 513 zcmV+c0{;DpP)rl0SU0|R<^W^7-2h0A(c#Q z?6>i|Soi@9A%$8lcGIL+@Cyj0iGgG!WHL9I_w3d+WHDA=xYa%U?zxu({O=O?4SK!a z#cH*B?Y)0st-WbBo8#$pTAT#v_xl%%#UhX6IF(YOEK7LrKXy8u7kQrZU2SxafyZ$i zr`>KBLI{KqFq_Su19%AF>t6xRx$oY4SZg7KfcGBGx!M>b54A@DQc9tef>H`Zg#CUG zrBqN#g+nbJ0~lipBC4g7kWzw(5Jk~OYyI;ifVK9EQtF18K}4vk3eLHSG3MJzfXQUC zv(~<6W(Xm`%xE+kAI9VHX(wb^b{;}_)oQh%ltPjuVCL&A%gztAw>cONhlZK2nE7R0 z*Uyq9={n~?MDX5Yv)Q01iXT$SPg?7DTI+l?8dU-S27|$qvMk>iV;;qE3~McvQV`;I z&O!*-?RMC1w^*;&sH*C-bM9IKK$@m+lO%cCZnxo_Lli|IA`lUT5VtL*gw`6)IfM|- zmdoW?1OR1OUe4!p6h-mJ=0gW}om5o?X1+Z3!+)w@aEGH>#7SnS00000NkvXXu0mjf Dsp#NZ literal 0 HcmV?d00001 diff --git a/media/js/facebox/README.txt b/media/js/facebox/README.txt new file mode 100644 index 000000000..d4fc2d5e8 --- /dev/null +++ b/media/js/facebox/README.txt @@ -0,0 +1,4 @@ +Please visit http://famspam.com/facebox/ or open index.html in your favorite browser. + +Need help? Join our Google Groups mailing list: + http://groups.google.com/group/facebox/ diff --git a/media/js/facebox/b.png b/media/js/facebox/b.png new file mode 100644 index 0000000000000000000000000000000000000000..f184e6269b343014f58694093b55558dd5dde193 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^fG6i5I7 literal 0 HcmV?d00001 diff --git a/media/js/facebox/bl.png b/media/js/facebox/bl.png new file mode 100644 index 0000000000000000000000000000000000000000..f6271859d51654b6fb2719df5fe192c8398ecefc GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4IeWS|hDcma=HTLr;y)tIk;ta7 zu_vN6xFht2)0#siNuslamwx#F|G&b~zelu8RJ{}@J*sQsnrJe^+4cq#uT_A>dUgiy Xt!wnnwn>Kojbre1^>bP0l+XkK7z`$3 literal 0 HcmV?d00001 diff --git a/media/js/facebox/br.png b/media/js/facebox/br.png new file mode 100644 index 0000000000000000000000000000000000000000..31f204fc451cd9dd5cfdadfad2d86ed0e1104882 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4IeWS|hDc29J+)AjL4m_HaN4IG z$D^BEUx=k`c-1!J#J_^urVqIKIty1DUX{oyG4)ejx5`MhFFt0jm0SWdC(DBaZ!X9M X+pW>R{=Die&^QK9S3j3^P6E z)6+9$%9N0hkg%|@J9q8`1qGcvc``6CFd`x%G&JWG1!QZ}p`}_Crt5>gn{ra_R z*|PBP@I{Lj`S|$w`}?P*rG5YY{qEhnXU?2SNJyxzu3ors;h#T$K79Ca@7}$foSdy& zxBmY9d+OAwXV0EJb?Q__MaApauf4s!A3S&vA0NMS=g#~0?{C?%rLC>4pr9Z*Ir-_+ zr;{d4>gecLxpHM*Uf%TS)ARH5uU@^{*Vp&5E2E;KQc_ZUeSM3Ii__E7r%jvI-roNB@nb(fzs$_c+qZ95RaO1} z|Nq~=e++a1ia%Mv_UM2}P@FKZ|8IzCYHn$5Ywzgn>h9_7>+gx3Gn5iiIZY<+?`^k#V9jLtyr*r!J=422f09{b+Ju)CUT+TQ$(XUHpFrqp3WW>wX1uv zuMxADYt*_`D!j~cc9U4RqaSdy#4<#mnaaTWAexn73fF5^{TRmAubUT3M$0pEhL|XZa-W~L|(gBwDDiyC{R^)5V?SdhX{^V3U3;)26b z9`PG&9vg+2LK~Ub)t*kN@Dpm%WzyoDVKHUWf+~JK$+ZDZ@~kR1)Kp$5Zt9+<`%Y)- z>yw)=g|fzKY2BzS@eXpHy5ookQ(^-%AM<|&o|T%JuT^(X?uuf%wX|uMuC&0ET*U<& zn5MV|N-Q);aBAjTtM<^<-0=N0@0#5*3?I(E@i^2b=>KSu3P#TbT%XyyED9)8M!}zkkRC?kPTh mHXNSne@Ka2Tq>lLlg+!}=2PuWCXYMo(tpiJ>u+RWum%8KFq1q0 literal 0 HcmV?d00001 diff --git a/media/js/facebox/facebox.css b/media/js/facebox/facebox.css new file mode 100644 index 000000000..230664f9f --- /dev/null +++ b/media/js/facebox/facebox.css @@ -0,0 +1,95 @@ +#facebox .b { + background:url(/media/js/facebox/b.png); +} + +#facebox .tl { + background:url(/media/js/facebox/tl.png); +} + +#facebox .tr { + background:url(/media/js/facebox/tr.png); +} + +#facebox .bl { + background:url(/media/js/facebox/bl.png); +} + +#facebox .br { + background:url(/media/js/facebox/br.png); +} + +#facebox { + position: absolute; + top: 0; + left: 0; + z-index: 100; + text-align: left; +} + +#facebox .popup { + position: relative; +} + +#facebox table { + border-collapse: collapse; +} + +#facebox td { + border-bottom: 0; + padding: 0; +} + +#facebox .body { + padding: 10px; + background: #fff; + width: 370px; +} + +#facebox .loading { + text-align: center; +} + +#facebox .image { + text-align: center; +} + +#facebox img { + border: 0; + margin: 0; +} + +#facebox .footer { + border-top: 1px solid #DDDDDD; + padding-top: 5px; + margin-top: 10px; + text-align: right; +} + +#facebox .tl, #facebox .tr, #facebox .bl, #facebox .br { + height: 10px; + width: 10px; + overflow: hidden; + padding: 0; +} + +#facebox_overlay { + position: fixed; + top: 0px; + left: 0px; + height:100%; + width:100%; +} + +.facebox_hide { + z-index:-100; +} + +.facebox_overlayBG { + background-color: #000; + z-index: 99; +} + +* html #facebox_overlay { /* ie6 hack */ + position: absolute; + height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); +} diff --git a/media/js/facebox/facebox.js b/media/js/facebox/facebox.js new file mode 100644 index 000000000..9fb96b339 --- /dev/null +++ b/media/js/facebox/facebox.js @@ -0,0 +1,319 @@ +/* + * Facebox (for jQuery) + * version: 1.2 (05/05/2008) + * @requires jQuery v1.2 or later + * + * Examples at http://famspam.com/facebox/ + * + * Licensed under the MIT: + * http://www.opensource.org/licenses/mit-license.php + * + * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ] + * + * Usage: + * + * jQuery(document).ready(function() { + * jQuery('a[rel*=facebox]').facebox() + * }) + * + * Terms + * Loads the #terms div in the box + * + * Terms + * Loads the terms.html page in the box + * + * Terms + * Loads the terms.png image in the box + * + * + * You can also use it programmatically: + * + * jQuery.facebox('some html') + * + * The above will open a facebox with "some html" as the content. + * + * jQuery.facebox(function($) { + * $.get('blah.html', function(data) { $.facebox(data) }) + * }) + * + * The above will show a loading screen before the passed function is called, + * allowing for a better ajaxy experience. + * + * The facebox function can also display an ajax page or image: + * + * jQuery.facebox({ ajax: 'remote.html' }) + * jQuery.facebox({ image: 'dude.jpg' }) + * + * Want to close the facebox? Trigger the 'close.facebox' document event: + * + * jQuery(document).trigger('close.facebox') + * + * Facebox also has a bunch of other hooks: + * + * loading.facebox + * beforeReveal.facebox + * reveal.facebox (aliased as 'afterReveal.facebox') + * init.facebox + * + * Simply bind a function to any of these hooks: + * + * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... }) + * + */ +(function($) { + $.facebox = function(data, klass) { + $.facebox.loading() + + if (data.ajax) fillFaceboxFromAjax(data.ajax) + else if (data.image) fillFaceboxFromImage(data.image) + else if (data.div) fillFaceboxFromHref(data.div) + else if ($.isFunction(data)) data.call($) + else $.facebox.reveal(data, klass) + } + + /* + * Public, $.facebox methods + */ + + $.extend($.facebox, { + settings: { + opacity : 0, + overlay : true, + loadingImage : '/media/js/facebox/loading.gif', + closeImage : '/media/js/facebox/closelabel.gif', + imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], + faceboxHtml : '\ +

    ' + }, + + loading: function() { + init() + if ($('#facebox .loading').length == 1) return true + showOverlay() + + $('#facebox .content').empty() + $('#facebox .body').children().hide().end(). + append('
    ') + + $('#facebox').css({ + top: getPageScroll()[1] + (getPageHeight() / 10), + left: 385.5 + }).show() + + $(document).bind('keydown.facebox', function(e) { + if (e.keyCode == 27) $.facebox.close() + return true + }) + $(document).trigger('loading.facebox') + }, + + reveal: function(data, klass) { + $(document).trigger('beforeReveal.facebox') + if (klass) $('#facebox .content').addClass(klass) + $('#facebox .content').append(data) + $('#facebox .loading').remove() + $('#facebox .body').children().fadeIn('normal') + $('#facebox').css('left', $(window).width() / 2 - ($('#facebox table').width() / 2)) + $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') + }, + + close: function() { + $(document).trigger('close.facebox') + return false + } + }) + + /* + * Public, $.fn methods + */ + + $.fn.facebox = function(settings) { + init(settings) + + function clickHandler() { + $.facebox.loading(true) + + // support for rel="facebox.inline_popup" syntax, to add a class + // also supports deprecated "facebox[.inline_popup]" syntax + var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) + if (klass) klass = klass[1] + + fillFaceboxFromHref(this.href, klass) + return false + } + + return this.click(clickHandler) + } + + /* + * Private methods + */ + + // called one time to setup facebox on this page + function init(settings) { + if ($.facebox.settings.inited) return true + else $.facebox.settings.inited = true + + $(document).trigger('init.facebox') + makeCompatible() + + var imageTypes = $.facebox.settings.imageTypes.join('|') + $.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i') + + if (settings) $.extend($.facebox.settings, settings) + $('body').append($.facebox.settings.faceboxHtml) + + var preload = [ new Image(), new Image() ] + preload[0].src = $.facebox.settings.closeImage + preload[1].src = $.facebox.settings.loadingImage + + $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() { + preload.push(new Image()) + preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') + }) + + $('#facebox .close').click($.facebox.close) + $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) + } + + // getPageScroll() by quirksmode.com + function getPageScroll() { + var xScroll, yScroll; + if (self.pageYOffset) { + yScroll = self.pageYOffset; + xScroll = self.pageXOffset; + } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict + yScroll = document.documentElement.scrollTop; + xScroll = document.documentElement.scrollLeft; + } else if (document.body) {// all other Explorers + yScroll = document.body.scrollTop; + xScroll = document.body.scrollLeft; + } + return new Array(xScroll,yScroll) + } + + // Adapted from getPageSize() by quirksmode.com + function getPageHeight() { + var windowHeight + if (self.innerHeight) { // all except Explorer + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowHeight = document.body.clientHeight; + } + return windowHeight + } + + // Backwards compatibility + function makeCompatible() { + var $s = $.facebox.settings + + $s.loadingImage = $s.loading_image || $s.loadingImage + $s.closeImage = $s.close_image || $s.closeImage + $s.imageTypes = $s.image_types || $s.imageTypes + $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml + } + + // Figures out what you want to display and displays it + // formats are: + // div: #id + // image: blah.extension + // ajax: anything else + function fillFaceboxFromHref(href, klass) { + // div + if (href.match(/#/)) { + var url = window.location.href.split('#')[0] + var target = href.replace(url,'') + $.facebox.reveal($(target).clone().show(), klass) + + // image + } else if (href.match($.facebox.settings.imageTypesRegexp)) { + fillFaceboxFromImage(href, klass) + // ajax + } else { + fillFaceboxFromAjax(href, klass) + } + } + + function fillFaceboxFromImage(href, klass) { + var image = new Image() + image.onload = function() { + $.facebox.reveal('
    ', klass) + } + image.src = href + } + + function fillFaceboxFromAjax(href, klass) { + $.get(href, function(data) { $.facebox.reveal(data, klass) }) + } + + function skipOverlay() { + return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null + } + + function showOverlay() { + if (skipOverlay()) return + + if ($('facebox_overlay').length == 0) + $("body").append('
    ') + + $('#facebox_overlay').hide().addClass("facebox_overlayBG") + .css('opacity', $.facebox.settings.opacity) + .click(function() { $(document).trigger('close.facebox') }) + .fadeIn(200) + return false + } + + function hideOverlay() { + if (skipOverlay()) return + + $('#facebox_overlay').fadeOut(200, function(){ + $("#facebox_overlay").removeClass("facebox_overlayBG") + $("#facebox_overlay").addClass("facebox_hide") + $("#facebox_overlay").remove() + }) + + return false + } + + /* + * Bindings + */ + + $(document).bind('close.facebox', function() { + $(document).unbind('keydown.facebox') + $('#facebox').fadeOut(function() { + $('#facebox .content').removeClass().addClass('content') + hideOverlay() + $('#facebox .loading').remove() + }) + }) + +})(jQuery); diff --git a/media/js/facebox/loading.gif b/media/js/facebox/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..f864d5fd38b7466c76b5a36dc0e3e9455c0126e2 GIT binary patch literal 2767 zcmeH``%_bA0*1eHPVNawNVtR;Fkp-nQj8edfS`v<5L7TgR6wi;WfgH-0}4fE+c_uU zB6tf6auF}FAcDdgg|bMU&H)LR5jARM!8$tuwd$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9 z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I= zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8 zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_} zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$ zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+` z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80 literal 0 HcmV?d00001 diff --git a/media/js/facebox/tl.png b/media/js/facebox/tl.png new file mode 100644 index 0000000000000000000000000000000000000000..d99c8f6c6eaa12d7b49a20f41f08a5006f3ea8b7 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4d3(AzhE&|@J-3jTL4n65aGKJa zi>kXgB~~zHg^Zp{CM0mn90WqNOPra}*Z0{kiIv{o~-b=GT*r10o|L fZ$xJ3$neauD_x^sx!G?E&{zgfS3j3^P6f4xp=xbhE&|@J+)AfL4k+GVA`V_ zi@i$(ZI&5dnZ|p1@qvOp9o~Wy8Q7coxO9zA=N|uQu;Ab0z?&8~c9@!JNn1)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
    ","
    "]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

    ";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
    ";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
    ").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
    ';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/media/js/jquery-ui-personalized-1.6rc6.js b/media/js/jquery-ui-personalized-1.6rc6.js new file mode 100755 index 000000000..0c82130de --- /dev/null +++ b/media/js/jquery-ui-personalized-1.6rc6.js @@ -0,0 +1,2736 @@ +/* + * jQuery UI 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;(function($) { + +var _remove = $.fn.remove, + isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9); + +//Helper functions and ui object +$.ui = { + version: "1.6rc6", + + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + + contains: function(a, b) { + return document.compareDocumentPosition + ? a.compareDocumentPosition(b) & 16 + : a !== b && a.contains(b); + }, + + cssCache: {}, + css: function(name) { + if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; } + var tmp = $('
    ').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body'); + + //if (!$.browser.safari) + //tmp.appendTo('body'); + + //Opera and Safari set width and height to 0px instead of auto + //Safari returns rgba(0,0,0,0) when bgcolor is not set + $.ui.cssCache[name] = !!( + (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || + !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))) + ); + try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){} + return $.ui.cssCache[name]; + }, + + hasScroll: function(el, a) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ($(el).css('overflow') == 'hidden') { return false; } + + var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', + has = false; + + if (el[scroll] > 0) { return true; } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1; + has = (el[scroll] > 0); + el[scroll] = 0; + return has; + }, + + isOverAxis: function(x, reference, size) { + //Determines when x coordinate is over "b" element axis + return (x > reference) && (x < (reference + size)); + }, + + isOver: function(y, x, top, left, height, width) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); + }, + + keyCode: { + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38 + } +}; + +// WAI-ARIA normalization +if (isFF2) { + var attr = $.attr, + removeAttr = $.fn.removeAttr, + ariaNS = "http://www.w3.org/2005/07/aaa", + ariaState = /^aria-/, + ariaRole = /^wairole:/; + + $.attr = function(elem, name, value) { + var set = value !== undefined; + + return (name == 'role' + ? (set + ? attr.call(this, elem, name, "wairole:" + value) + : (attr.apply(this, arguments) || "").replace(ariaRole, "")) + : (ariaState.test(name) + ? (set + ? elem.setAttributeNS(ariaNS, + name.replace(ariaState, "aaa:"), value) + : attr.call(this, elem, name.replace(ariaState, "aaa:"))) + : attr.apply(this, arguments))); + }; + + $.fn.removeAttr = function(name) { + return (ariaState.test(name) + ? this.each(function() { + this.removeAttributeNS(ariaNS, name.replace(ariaState, "")); + }) : removeAttr.call(this, name)); + }; +} + +//jQuery plugins +$.fn.extend({ + remove: function() { + // Safari has a native remove event which actually removes DOM elements, + // so we have to use triggerHandler instead of trigger (#3037). + $("*", this).add(this).each(function() { + $(this).triggerHandler("remove"); + }); + return _remove.apply(this, arguments ); + }, + + enableSelection: function() { + return this + .attr('unselectable', 'off') + .css('MozUserSelect', '') + .unbind('selectstart.ui'); + }, + + disableSelection: function() { + return this + .attr('unselectable', 'on') + .css('MozUserSelect', 'none') + .bind('selectstart.ui', function() { return false; }); + }, + + scrollParent: function() { + var scrollParent; + if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + } +}); + + +//Additional selectors +$.extend($.expr[':'], { + data: function(elem, i, match) { + return !!$.data(elem, match[3]); + }, + + focusable: function(element) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr(element, 'tabindex'); + return (/input|select|textarea|button|object/.test(nodeName) + ? !element.disabled + : 'a' == nodeName || 'area' == nodeName + ? element.href || !isNaN(tabIndex) + : !isNaN(tabIndex)) + // the element and all of its ancestors must be visible + // the browser may report that the area is hidden + && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length; + }, + + tabbable: function(element) { + var tabIndex = $.attr(element, 'tabindex'); + return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable'); + } +}); + + +// $.widget is a factory to create jQuery plugins +// taking some boilerplate code out of the plugin code +function getter(namespace, plugin, method, args) { + function getMethods(type) { + var methods = $[namespace][plugin][type] || []; + return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods); + } + + var methods = getMethods('getter'); + if (args.length == 1 && typeof args[0] == 'string') { + methods = methods.concat(getMethods('getterSetter')); + } + return ($.inArray(method, methods) != -1); +} + +$.widget = function(name, prototype) { + var namespace = name.split(".")[0]; + name = name.split(".")[1]; + + // create plugin method + $.fn[name] = function(options) { + var isMethodCall = (typeof options == 'string'), + args = Array.prototype.slice.call(arguments, 1); + + // prevent calls to internal methods + if (isMethodCall && options.substring(0, 1) == '_') { + return this; + } + + // handle getter methods + if (isMethodCall && getter(namespace, name, options, args)) { + var instance = $.data(this[0], name); + return (instance ? instance[options].apply(instance, args) + : undefined); + } + + // handle initialization and non-getter methods + return this.each(function() { + var instance = $.data(this, name); + + // constructor + (!instance && !isMethodCall && + $.data(this, name, new $[namespace][name](this, options))._init()); + + // method call + (instance && isMethodCall && $.isFunction(instance[options]) && + instance[options].apply(instance, args)); + }); + }; + + // create widget constructor + $[namespace] = $[namespace] || {}; + $[namespace][name] = function(element, options) { + var self = this; + + this.namespace = namespace; + this.widgetName = name; + this.widgetEventPrefix = $[namespace][name].eventPrefix || name; + this.widgetBaseClass = namespace + '-' + name; + + this.options = $.extend({}, + $.widget.defaults, + $[namespace][name].defaults, + $.metadata && $.metadata.get(element)[name], + options); + + this.element = $(element) + .bind('setData.' + name, function(event, key, value) { + if (event.target == element) { + return self._setData(key, value); + } + }) + .bind('getData.' + name, function(event, key) { + if (event.target == element) { + return self._getData(key); + } + }) + .bind('remove', function() { + return self.destroy(); + }); + }; + + // add widget prototype + $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); + + // TODO: merge getter and getterSetter properties from widget prototype + // and plugin prototype + $[namespace][name].getterSetter = 'option'; +}; + +$.widget.prototype = { + _init: function() {}, + destroy: function() { + this.element.removeData(this.widgetName) + .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled') + .removeAttr('aria-disabled'); + }, + + option: function(key, value) { + var options = key, + self = this; + + if (typeof key == "string") { + if (value === undefined) { + return this._getData(key); + } + options = {}; + options[key] = value; + } + + $.each(options, function(key, value) { + self._setData(key, value); + }); + }, + _getData: function(key) { + return this.options[key]; + }, + _setData: function(key, value) { + this.options[key] = value; + + if (key == 'disabled') { + this.element + [value ? 'addClass' : 'removeClass']( + this.widgetBaseClass + '-disabled' + ' ' + + this.namespace + '-state-disabled') + .attr("aria-disabled", value); + } + }, + + enable: function() { + this._setData('disabled', false); + }, + disable: function() { + this._setData('disabled', true); + }, + + _trigger: function(type, event, data) { + var callback = this.options[type], + eventName = (type == this.widgetEventPrefix + ? type : this.widgetEventPrefix + type); + + event = $.Event(event); + event.type = eventName; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if (event.originalEvent) { + for (var i = $.event.props.length, prop; i;) { + prop = $.event.props[--i]; + event[prop] = event.originalEvent[prop]; + } + } + + this.element.trigger(event, data); + + return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false + || event.isDefaultPrevented()); + } +}; + +$.widget.defaults = { + disabled: false +}; + + +/** Mouse Interaction Plugin **/ + +$.ui.mouse = { + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if(self._preventClickEvent) { + self._preventClickEvent = false; + return false; + } + }); + + // Prevent text selection in IE + if ($.browser.msie) { + this._mouseUnselectable = this.element.attr('unselectable'); + this.element.attr('unselectable', 'on'); + } + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + + // Restore text selection in IE + ($.browser.msie + && this.element.attr('unselectable', this._mouseUnselectable)); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if (event.originalEvent.mouseHandled) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + // preventDefault() is used to prevent the selection of text here - + // however, in Safari, this causes select boxes not to be selectable + // anymore, so this fix is needed + ($.browser.safari || event.preventDefault()); + + event.originalEvent.mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this._preventClickEvent = true; + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}; + +$.ui.mouse.defaults = { + cancel: null, + distance: 1, + delay: 0 +}; + +})(jQuery); +/* + * jQuery UI Draggable 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.draggable", $.extend({}, $.ui.mouse, { + + _init: function() { + + if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position"))) + this.element[0].style.position = 'relative'; + + (this.options.cssNamespace && this.element.addClass(this.options.cssNamespace+"-draggable")); + (this.options.disabled && this.element.addClass(this.options.cssNamespace+'-draggable-disabled')); + + this._mouseInit(); + + }, + + destroy: function() { + if(!this.element.data('draggable')) return; + this.element.removeData("draggable").unbind(".draggable").removeClass(this.options.cssNamespace+'-draggable '+this.options.cssNamespace+'-draggable-dragging '+this.options.cssNamespace+'-draggable-disabled'); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + + var o = this.options; + + if (this.helper || o.disabled || $(event.target).is('.'+this.options.cssNamespace+'-resizable-handle')) + return false; + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) + return false; + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css("position"); + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + if(o.cursorAt) + this._adjustOffsetFromHelper(o.cursorAt); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + //Call plugins and callbacks + this._trigger("start", event); + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.helper.addClass(o.cssNamespace+"-draggable-dragging"); + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + + _mouseDrag: function(event, noPropagation) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + this._trigger('drag', event, ui); + this.position = ui.position; + } + + if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; + if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + dropped = $.ui.ddmanager.drop(this, event); + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + self._trigger("stop", event); + self._clear(); + }); + } else { + this._trigger("stop", event); + this._clear(); + } + + return false; + }, + + _getHandle: function(event) { + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + $(this.options.handle, this.element) + .find("*") + .andSelf() + .each(function() { + if(this == event.target) handle = true; + }); + + return handle; + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element); + + if(!helper.parents('body').length) + helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + + if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) + helper.css("position", "absolute"); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left; + if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top; + if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body && $.browser.mozilla) //Ugly FF3 fix + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) { + var ce = $(o.containment)[0]; if(!ce) return; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } else if(o.containment.constructor == Array) { + this.containment = o.containment; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass(this.options.cssNamespace+"-draggable-dragging"); + if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return $.widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function(event) { + return { + helper: this.helper, + position: this.position, + absolutePosition: this.positionAbs, //deprecated + offset: this.positionAbs + }; + } + +})); + +$.extend($.ui.draggable, { + version: "1.6rc6", + eventPrefix: "drag", + defaults: { + appendTo: "parent", + axis: false, + cancel: ":input,option", + connectToSortable: false, + containment: false, + cssNamespace: "ui", + cursor: "default", + cursorAt: false, + delay: 0, + distance: 1, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false + } +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options; + inst.sortables = []; + $(o.connectToSortable).each(function() { + // 'this' points to a string, and should therefore resolved as query, but instead, if the string is assigned to a variable, it loops through the strings properties, + // so we have to append '' to make it anonymous again + $(typeof this == 'string' ? this+'': this).each(function() { + if($.data(this, 'sortable')) { + var sortable = $.data(this, 'sortable'); + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache + sortable._trigger("activate", event, inst); + } + }); + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid' + if(this.shouldRevert) this.instance.options.revert = true; + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper == 'original') + this.instance.currentItem.css({ top: 'auto', left: 'auto' }); + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, inst); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + var dyClick = this.offset.click.top, dxClick = this.offset.click.left; + var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left; + var itemHeight = o.height, itemWidth = o.width; + var itemTop = o.top, itemLeft = o.left; + + return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth); + }; + + $.each(inst.sortables, function(i) { + + if(checkPos.call(inst, this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + this.instance.fromOutside = inst; //Little hack so receive/update callbacks work + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance._mouseDrag(event); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + this.instance.options.revert = false; //No revert here + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(event, ui) { + var t = $('body'), o = $(this).data('draggable').options; + if (t.css("cursor")) o._cursor = t.css("cursor"); + t.css("cursor", o.cursor); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if (o._cursor) $('body').css("cursor", o._cursor); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(event, ui) { + var o = $(this).data('draggable').options; + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $('
    ') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(event, ui) { + $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data('draggable').options; + if(t.css("opacity")) o._opacity = t.css("opacity"); + t.css('opacity', o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if(o._opacity) $(ui.helper).css('opacity', o._opacity); + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(event, ui) { + var i = $(this).data("draggable"); + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); + }, + drag: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { + + if(!o.axis || o.axis != 'x') { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if(!o.axis || o.axis != 'y') { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(!o.axis || o.axis != 'x') { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(!o.axis || o.axis != 'y') { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(i, event); + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options; + i.snapElements = []; + + $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != i.element[0]) i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options; + var d = o.snapTolerance; + + var x1 = ui.absolutePosition.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.absolutePosition.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) { + if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= d; + var bs = Math.abs(b - y1) <= d; + var ls = Math.abs(l - x2) <= d; + var rs = Math.abs(r - x1) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + + var first = (ts || bs || ls || rs); + + if(o.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= d; + var bs = Math.abs(b - y2) <= d; + var ls = Math.abs(l - x1) <= d; + var rs = Math.abs(r - x2) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + }; + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(event, ui) { + + var o = $(this).data("draggable").options; + + var group = $.makeArray($(o.stack.group)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || o.stack.min) - (parseInt($(b).css("zIndex"),10) || o.stack.min); + }); + + $(group).each(function(i) { + this.style.zIndex = o.stack.min + i; + }); + + this[0].style.zIndex = o.stack.min + group.length; + + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("draggable").options; + if(t.css("zIndex")) o._zIndex = t.css("zIndex"); + t.css('zIndex', o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("draggable").options; + if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex); + } +}); + +})(jQuery); +/* + * jQuery UI Resizable 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.resizable", $.extend({}, $.ui.mouse, { + + _init: function() { + + var self = this, o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + proportionallyResize: o.proportionallyResize ? [o.proportionallyResize] : [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Opera fix for relative positioning + if (/relative/.test(this.element.css('position')) && $.browser.opera) + this.element.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $('
    ').css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent(); + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + if ($.browser.safari && o.preventDefault) this.originalElement.css('resize', 'none'); + + //Push the actual element to our proportionallyResize internal array + this.proportionallyResize.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }); + if(this.handles.constructor == String) { + + if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw'; + var n = this.handles.split(","); this.handles = {}; + + for(var i = 0; i < n.length; i++) { + + var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; + var axis = $('
    '); + + // increase zIndex of sw, se, ne, nw axis + //TODO : this modifies original option + if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + + //TODO : What's going on here? + if ('se' == handle) { + axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se'); + }; + + //Insert into internal handles object and append to element + this.handles[handle] = '.ui-resizable-'+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + target = target || this.element; + + for(var i in this.handles) { + + if(this.handles[i].constructor == String) + this.handles[i] = $(this.handles[i], this.element).show(); + + if (o.transparent) + this.handles[i].css({ opacity: 0 }); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(this.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + if (!o.transparent) + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) + continue; + + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $('.ui-resizable-handle', this.element); + + if (o.disableSelection) + this._handles.disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!self.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .hover(function() { + $(this).removeClass("ui-resizable-autohide"); + self._handles.show(); + }, + function(){ + if (!self.resizing) { + $(this).addClass("ui-resizable-autohide"); + self._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + destroy: function() { + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + this.wrapper.parent().append( + this.originalElement.css({ + position: this.wrapper.css('position'), + width: this.wrapper.outerWidth(), + height: this.wrapper.outerHeight(), + top: this.wrapper.css('top'), + left: this.wrapper.css('left') + }) + ).end().remove(); + } + + _destroy(this.originalElement); + + }, + + _mouseCapture: function(event) { + + var handle = false; + for(var i in this.handles) { + if($(this.handles[i])[0] == event.target) handle = true; + } + + return this.options.disabled || !!handle; + + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element; + + this.resizing = true; + this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix for http://dev.jquery.com/ticket/1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left }); + } + + //Opera fixing relative position + if ($.browser.opera && (/relative/).test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + if (o.preserveCursor) { + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + } + + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (this._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!this._helper && this.proportionallyResize.length) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this._trigger('resize', event, this.ui()); + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var o = this.options, self = this; + + if(this._helper) { + var pr = this.proportionallyResize, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + if (this._helper && !o.animate) this._proportionallyResize(); + } + + if (o.preserveCursor) + $('body').css('cursor', 'auto'); + + this._propagate("stop", event); + + if (this._helper) this.helper.remove(); + return false; + + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (data.left) this.position.left = data.left; + if (data.top) this.position.top = data.top; + if (data.height) this.size.height = data.height; + if (data.width) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height * this.aspectRatio); + else if (data.width) data.height = (csize.width / this.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var isNumber = function(value) { + return !isNaN(parseInt(value, 10)) + }; + + var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height); + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + + var o = this.options; + if (!this.proportionallyResize.length) return; + var element = this.helper || this.element; + + for (var i=0; i < this.proportionallyResize.length; i++) { + + var prel = this.proportionallyResize[i]; + + if (!this.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + this.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + + if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length))) + continue; + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + }; + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $('
    '); + + // fix ie6 offset TODO: This seems broken + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() + pxyoffset, + height: this.element.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper.appendTo("body"); + + if (o.disableSelection) + this.helper.disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n != "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +})); + +$.extend($.ui.resizable, { + version: "1.6rc6", + eventPrefix: "resize", + defaults: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + cancel: ":input,option", + containment: false, + delay: 0, + disableSelection: true, + distance: 1, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + preserveCursor: true, + preventDefault: true, + proportionallyResize: false, + transparent: false, + zIndex: 1000 + } +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options; + + _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) { + self._revertToRelativePosition = true; + el.css({ position: 'absolute', top: 'auto', left: 'auto' }); + } + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"); + + //Opera fixing relative position + if (self._revertToRelativePosition && $.browser.opera) { + self._revertToRelativePosition = false; + el.css({ position: 'relative' }); + } + + $(this).removeData("resizable-alsoresize-start"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr) pr.css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = o._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (self._helper ? co.left : 0)) { + self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (self._helper ? co.top : 0)) { + self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = self._helper ? co.top : 0; + } + + var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options, pr = o.proportionallyResize, cs = self.size; + + self.ghost = self.originalElement.clone(); + self.ghost + .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass('ui-resizable-ghost') + .addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +})(jQuery); +/* + * jQuery UI Progressbar 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.progressbar", { + + _init: function() { + + var self = this, + options = this.options; + + this.element + .addClass("ui-progressbar" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all") + .attr({ + role: "progressbar", + "aria-valuemin": this._valueMin(), + "aria-valuemax": this._valueMax(), + "aria-valuenow": this._value() + }); + + this.valueDiv = $('
    ').appendTo(this.element); + + this._refreshValue(); + + }, + + destroy: function() { + + this.element + .removeClass("ui-progressbar" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all") + .removeAttr("role") + .removeAttr("aria-valuemin") + .removeAttr("aria-valuemax") + .removeAttr("aria-valuenow") + .removeData("progressbar") + .unbind(".progressbar"); + + this.valueDiv.remove(); + + $.widget.prototype.destroy.apply(this, arguments); + + }, + + value: function(newValue) { + arguments.length && this._setData("value", newValue); + + return this._value(); + }, + + _setData: function(key, value){ + switch (key) { + case 'value': + this.options.value = value; + this._refreshValue(); + this._trigger('change', null, {}); + break; + } + + $.widget.prototype._setData.apply(this, arguments); + }, + + _value: function() { + var val = this.options.value; + if (val < this._valueMin()) val = this._valueMin(); + if (val > this._valueMax()) val = this._valueMax(); + + return val; + }, + + _valueMin: function() { + var valueMin = 0; + + return valueMin; + }, + + _valueMax: function() { + var valueMax = 100; + + return valueMax; + }, + + _refreshValue: function() { + var value = this.value(); + this.valueDiv[value == this._valueMax() ? 'addClass' : 'removeClass']("ui-corner-right"); + this.valueDiv.width(value + '%'); + this.element.attr("aria-valuenow", value); + } + +}); + +$.extend($.ui.progressbar, { + version: "1.6rc6", + defaults: { + value: 0 + } +}); + +})(jQuery); +/* + * jQuery UI Effects 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ +;(function($) { + +$.effects = $.effects || {}; //Add the 'effects' scope + +$.extend($.effects, { + version: "1.6rc6", + + // Saves a set of properties in a data storage + save: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); + } + }, + + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function(element) { + + //if the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) + return element.parent(); + + //Cache width,height and float properties of the element, and create a wrapper around it + var props = { width: element.outerWidth(true), height: element.outerHeight(true), 'float': element.css('float') }; + element.wrap('
    '); + var wrapper = element.parent(); + + //Transfer the positioning of the element to the wrapper + if (element.css('position') == 'static') { + wrapper.css({ position: 'relative' }); + element.css({ position: 'relative'} ); + } else { + var top = element.css('top'); if(isNaN(parseInt(top,10))) top = 'auto'; + var left = element.css('left'); if(isNaN(parseInt(left,10))) left = 'auto'; + wrapper.css({ position: element.css('position'), top: top, left: left, zIndex: element.css('z-index') }).show(); + element.css({position: 'relative', top: 0, left: 0 }); + } + + wrapper.css(props); + return wrapper; + }, + + removeWrapper: function(element) { + if (element.parent().is('.ui-effects-wrapper')) + return element.parent().replaceWith(element); + return element; + }, + + setTransition: function(element, list, factor, value) { + value = value || {}; + $.each(list, function(i, x){ + unit = element.cssUnit(x); + if (unit[0] > 0) value[x] = unit[0] * factor + unit[1]; + }); + return value; + }, + + //Base function to animate from one class to another in a seamless transition + animateClass: function(value, duration, easing, callback) { + + var cb = (typeof easing == "function" ? easing : (callback ? callback : null)); + var ea = (typeof easing == "string" ? easing : null); + + return this.each(function() { + + var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || ''; + if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */ + if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; } + + //Let's get a style offset + var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove); + var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle)); + if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove); + + // The main function to form the object for animation + for(var n in newStyle) { + if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */ + && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */ + && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */ + && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */ + && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */ + ) offset[n] = newStyle[n]; + } + + that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object + // Change style attribute back to original. For stupid IE, we need to clear the damn object. + if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr); + if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove); + if(cb) cb.apply(this, arguments); + }); + + }); + } +}); + + +function _normalizeArguments(a, m) { + + var o = a[1] && a[1].constructor == Object ? a[1] : {}; if(m) o.mode = m; + var speed = a[1] && a[1].constructor != Object ? a[1] : o.duration; //either comes from options.duration or the second argument + speed = $.fx.off ? 0 : typeof speed === "number" ? speed : $.fx.speeds[speed] || $.fx.speeds._default; + var callback = o.callback || ( $.isFunction(a[2]) && a[2] ) || ( $.isFunction(a[3]) && a[3] ); + + return [a[0], o, speed, callback]; + +} + +//Extend the methods of jQuery +$.fn.extend({ + + //Save old methods + _show: $.fn.show, + _hide: $.fn.hide, + __toggle: $.fn.toggle, + _addClass: $.fn.addClass, + _removeClass: $.fn.removeClass, + _toggleClass: $.fn.toggleClass, + + // New effect methods + effect: function(fx, options, speed, callback) { + return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: options || {}, duration: speed, callback: callback }) : null; + }, + + show: function() { + if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0]))) + return this._show.apply(this, arguments); + else { + return this.effect.apply(this, _normalizeArguments(arguments, 'show')); + } + }, + + hide: function() { + if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0]))) + return this._hide.apply(this, arguments); + else { + return this.effect.apply(this, _normalizeArguments(arguments, 'hide')); + } + }, + + toggle: function(){ + if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0])) || (arguments[0].constructor == Function)) + return this.__toggle.apply(this, arguments); + else { + return this.effect.apply(this, _normalizeArguments(arguments, 'toggle')); + } + }, + + addClass: function(classNames, speed, easing, callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + toggleClass: function(classNames,speed,easing,callback) { + return ( (typeof speed !== "boolean") && speed ) ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames, speed); + }, + morph: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + }, + switchClass: function() { + return this.morph.apply(this, arguments); + }, + + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + +/* + * jQuery Color Animations + * Copyright 2007 John Resig + * Released under the MIT and GPL licenses. + */ + +// We override the animation for all of these color styles +$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){ + $.fx.step[attr] = function(fx) { + if ( fx.state == 0 ) { + fx.start = getColor( fx.elem, attr ); + fx.end = getRGB( fx.end ); + } + + fx.elem.style[attr] = "rgb(" + [ + Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0],10), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1],10), 255), 0), + Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2],10), 255), 0) + ].join(",") + ")"; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent']; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend($.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert($.easing.default); + return $.easing[$.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); diff --git a/media/js/jquery-ui-personalized-1.6rc6.min.js b/media/js/jquery-ui-personalized-1.6rc6.min.js new file mode 100755 index 000000000..86a30786c --- /dev/null +++ b/media/js/jquery-ui-personalized-1.6rc6.min.js @@ -0,0 +1,50 @@ +/* + * jQuery UI 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ (function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.6rc6",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n){return}for(var m=0;m
    ').addClass(j).css({position:"absolute",top:"-5000px",left:"-5000px",display:"block"}).appendTo("body");c.ui.cssCache[j]=!!((!(/auto|default/).test(k.css("cursor"))||(/^[1-9]/).test(k.css("height"))||(/^[1-9]/).test(k.css("width"))||!(/none/).test(k.css("backgroundImage"))||!(/transparent|rgba\(0, 0, 0, 0\)/).test(k.css("backgroundColor"))));try{c("body").get(0).removeChild(k.get(0))}catch(l){}return c.ui.cssCache[j]},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=true;this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/* + * jQuery UI Draggable 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * ui.core.js + */ (function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.cssNamespace&&this.element.addClass(this.options.cssNamespace+"-draggable"));(this.options.disabled&&this.element.addClass(this.options.cssNamespace+"-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass(this.options.cssNamespace+"-draggable "+this.options.cssNamespace+"-draggable-dragging "+this.options.cssNamespace+"-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is("."+this.options.cssNamespace+"-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass(c.cssNamespace+"-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body&&a.browser.mozilla)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c)}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.leftthis.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent();this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});if(b.browser.safari&&h.preventDefault){this.originalElement.css("resize","none")}this.proportionallyResize.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=h.handles||(!b(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var j=this.handles.split(",");this.handles={};for(var e=0;e');if(/sw|se|ne|nw/.test(g)){f.css({zIndex:++h.zIndex})}if("se"==g){f.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(o){o=o||this.element;for(var l in this.handles){if(this.handles[l].constructor==String){this.handles[l]=b(this.handles[l],this.element).show()}if(h.transparent){this.handles[l].css({opacity:0})}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var m=b(this.handles[l],this.element),n=0;n=/sw|ne|nw|se|n|s/.test(l)?m.outerHeight():m.outerWidth();var k=["padding",/ne|nw|n/.test(l)?"Top":/se|sw|s/.test(l)?"Bottom":/^e$/.test(l)?"Right":"Left"].join("");if(!h.transparent){o.css(k,n)}this._proportionallyResize()}if(!b(this.handles[l]).length){continue}}};this._renderAxis(this.element);this._handles=b(".ui-resizable-handle",this.element);if(h.disableSelection){this._handles.disableSelection()}this._handles.mouseover(function(){if(!d.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}d.axis=i&&i[1]?i[1]:"se"}});if(h.autoHide){this._handles.hide();b(this.element).addClass("ui-resizable-autohide").hover(function(){b(this).removeClass("ui-resizable-autohide");d._handles.show()},function(){if(!d.resizing){b(this).addClass("ui-resizable-autohide");d._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var c=function(d){b(d).removeClass("ui-resizable ui-resizable-disabled").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){c(this.element);this.wrapper.parent().append(this.originalElement.css({position:this.wrapper.css("position"),width:this.wrapper.outerWidth(),height:this.wrapper.outerHeight(),top:this.wrapper.css("top"),left:this.wrapper.css("left")})).end().remove()}c(this.originalElement)},_mouseCapture:function(d){var e=false;for(var c in this.handles){if(b(this.handles[c])[0]==d.target){e=true}}return this.options.disabled||!!e},_mouseStart:function(e){var h=this.options,d=this.element.position(),c=this.element;this.resizing=true;this.documentScroll={top:b(document).scrollTop(),left:b(document).scrollLeft()};if(c.is(".ui-draggable")||(/absolute/).test(c.css("position"))){c.css({position:"absolute",top:d.top,left:d.left})}if(b.browser.opera&&(/relative/).test(c.css("position"))){c.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var i=a(this.helper.css("left")),f=a(this.helper.css("top"));if(h.containment){i+=b(h.containment).scrollLeft()||0;f+=b(h.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:i,top:f};this.size=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalSize=this._helper?{width:c.outerWidth(),height:c.outerHeight()}:{width:c.width(),height:c.height()};this.originalPosition={left:i,top:f};this.sizeDiff={width:c.outerWidth()-c.width(),height:c.outerHeight()-c.height()};this.originalMousePosition={left:e.pageX,top:e.pageY};this.aspectRatio=(typeof h.aspectRatio=="number")?h.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);if(h.preserveCursor){var g=b(".ui-resizable-"+this.axis).css("cursor");b("body").css("cursor",g=="auto"?this.axis+"-resize":g)}this._propagate("start",e);return true},_mouseDrag:function(c){var f=this.helper,e=this.options,k={},n=this,h=this.originalMousePosition,l=this.axis;var p=(c.pageX-h.left)||0,m=(c.pageY-h.top)||0;var g=this._change[l];if(!g){return false}var j=g.apply(this,[c,p,m]),i=b.browser.msie&&b.browser.version<7,d=this.sizeDiff;if(this._aspectRatio||c.shiftKey){j=this._updateRatio(j,c)}j=this._respectSize(j,c);this._propagate("resize",c);f.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this.proportionallyResize.length){this._proportionallyResize()}this._updateCache(j);this._trigger("resize",c,this.ui());return false},_mouseStop:function(f){this.resizing=false;var g=this.options,k=this;if(this._helper){var e=this.proportionallyResize,c=e.length&&(/textarea/i).test(e[0].nodeName),d=c&&b.ui.hasScroll(e[0],"left")?0:k.sizeDiff.height,i=c?0:k.sizeDiff.width;var l={width:(k.size.width-i),height:(k.size.height-d)},h=(parseInt(k.element.css("left"),10)+(k.position.left-k.originalPosition.left))||null,j=(parseInt(k.element.css("top"),10)+(k.position.top-k.originalPosition.top))||null;if(!g.animate){this.element.css(b.extend(l,{top:j,left:h}))}if(this._helper&&!g.animate){this._proportionallyResize()}}if(g.preserveCursor){b("body").css("cursor","auto")}this._propagate("stop",f);if(this._helper){this.helper.remove()}return false},_updateCache:function(c){var d=this.options;this.offset=this.helper.offset();if(c.left){this.position.left=c.left}if(c.top){this.position.top=c.top}if(c.height){this.size.height=c.height}if(c.width){this.size.width=c.width}},_updateRatio:function(f,e){var g=this.options,h=this.position,d=this.size,c=this.axis;if(f.height){f.width=(d.height*this.aspectRatio)}else{if(f.width){f.height=(d.width/this.aspectRatio)}}if(c=="sw"){f.left=h.left+(d.width-f.width);f.top=null}if(c=="nw"){f.top=h.top+(d.height-f.height);f.left=h.left+(d.width-f.width)}return f},_respectSize:function(j,e){var r=function(o){return !isNaN(parseInt(o,10))};var h=this.helper,g=this.options,p=this._aspectRatio||e.shiftKey,n=this.axis,s=r(j.width)&&g.maxWidth&&(g.maxWidthj.width),q=r(j.height)&&g.minHeight&&(g.minHeight>j.height);if(f){j.width=g.minWidth}if(q){j.height=g.minHeight}if(s){j.width=g.maxWidth}if(k){j.height=g.maxHeight}var d=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height;var i=/sw|nw|w/.test(n),c=/nw|ne|n/.test(n);if(f&&i){j.left=d-g.minWidth}if(s&&i){j.left=d-g.maxWidth}if(q&&c){j.top=m-g.minHeight}if(k&&c){j.top=m-g.maxHeight}var l=!j.width&&!j.height;if(l&&!j.left&&j.top){j.top=null}else{if(l&&!j.top&&j.left){j.left=null}}return j},_proportionallyResize:function(){var h=this.options;if(!this.proportionallyResize.length){return}var e=this.helper||this.element;for(var d=0;d');var c=b.browser.msie&&b.browser.version<7,e=(c?1:0),f=(c?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++g.zIndex});this.helper.appendTo("body");if(g.disableSelection){this.helper.disableSelection()}}else{this.helper=this.element}},_change:{e:function(e,d,c){return{width:this.originalSize.width+d}},w:function(f,d,c){var h=this.options,e=this.originalSize,g=this.originalPosition;return{left:g.left+d,width:e.width-d}},n:function(f,d,c){var h=this.options,e=this.originalSize,g=this.originalPosition;return{top:g.top+c,height:e.height-c}},s:function(e,d,c){return{height:this.originalSize.height+c}},se:function(e,d,c){return b.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,d,c]))},sw:function(e,d,c){return b.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,d,c]))},ne:function(e,d,c){return b.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,d,c]))},nw:function(e,d,c){return b.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,d,c]))}},_propagate:function(d,c){b.ui.plugin.call(this,d,[c,this.ui()]);(d!="resize"&&this._trigger(d,c,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}));b.extend(b.ui.resizable,{version:"1.6rc6",eventPrefix:"resize",defaults:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,cancel:":input,option",containment:false,delay:0,disableSelection:true,distance:1,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,preserveCursor:true,preventDefault:true,proportionallyResize:false,transparent:false,zIndex:1000}});b.ui.plugin.add("resizable","alsoResize",{start:function(d,e){var c=b(this).data("resizable"),f=c.options;_store=function(g){b(g).each(function(){b(this).data("resizable-alsoresize",{width:parseInt(b(this).width(),10),height:parseInt(b(this).height(),10),left:parseInt(b(this).css("left"),10),top:parseInt(b(this).css("top"),10)})})};if(typeof(f.alsoResize)=="object"&&!f.alsoResize.parentNode){if(f.alsoResize.length){f.alsoResize=f.alsoResize[0];_store(f.alsoResize)}else{b.each(f.alsoResize,function(g,h){_store(g)})}}else{_store(f.alsoResize)}},resize:function(e,g){var d=b(this).data("resizable"),h=d.options,f=d.originalSize,j=d.originalPosition;var i={height:(d.size.height-f.height)||0,width:(d.size.width-f.width)||0,top:(d.position.top-j.top)||0,left:(d.position.left-j.left)||0},c=function(k,l){b(k).each(function(){var o=b(this),p=b(this).data("resizable-alsoresize"),n={},m=l&&l.length?l:["width","height","top","left"];b.each(m||["width","height","top","left"],function(q,s){var r=(p[s]||0)+(i[s]||0);if(r&&r>=0){n[s]=r||null}});if(/relative/.test(o.css("position"))&&b.browser.opera){d._revertToRelativePosition=true;o.css({position:"absolute",top:"auto",left:"auto"})}o.css(n)})};if(typeof(h.alsoResize)=="object"&&!h.alsoResize.nodeType){b.each(h.alsoResize,function(k,l){c(k,l)})}else{c(h.alsoResize)}},stop:function(d,e){var c=b(this).data("resizable");if(c._revertToRelativePosition&&b.browser.opera){c._revertToRelativePosition=false;el.css({position:"relative"})}b(this).removeData("resizable-alsoresize-start")}});b.ui.plugin.add("resizable","animate",{stop:function(g,l){var m=b(this).data("resizable"),h=m.options;var f=h.proportionallyResize,c=f&&(/textarea/i).test(f.get(0).nodeName),d=c&&b.ui.hasScroll(f.get(0),"left")?0:m.sizeDiff.height,j=c?0:m.sizeDiff.width;var e={width:(m.size.width-j),height:(m.size.height-d)},i=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,k=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;m.element.animate(b.extend(e,k&&i?{top:k,left:i}:{}),{duration:h.animateDuration,easing:h.animateEasing,step:function(){var n={width:parseInt(m.element.css("width"),10),height:parseInt(m.element.css("height"),10),top:parseInt(m.element.css("top"),10),left:parseInt(m.element.css("left"),10)};if(f){f.css({width:n.width,height:n.height})}m._updateCache(n);m._propagate("resize",g)}})}});b.ui.plugin.add("resizable","containment",{start:function(d,n){var r=b(this).data("resizable"),h=r.options,j=r.element;var e=h.containment,i=(e instanceof b)?e.get(0):(/parent/.test(e))?j.parent().get(0):e;if(!i){return}r.containerElement=b(i);if(/document/.test(e)||e==document){r.containerOffset={left:0,top:0};r.containerPosition={left:0,top:0};r.parentData={element:b(document),left:0,top:0,width:b(document).width(),height:b(document).height()||document.body.parentNode.scrollHeight}}else{var l=b(i),g=[];b(["Top","Right","Left","Bottom"]).each(function(p,o){g[p]=a(l.css("padding"+o))});r.containerOffset=l.offset();r.containerPosition=l.position();r.containerSize={height:(l.innerHeight()-g[3]),width:(l.innerWidth()-g[1])};var m=r.containerOffset,c=r.containerSize.height,k=r.containerSize.width,f=(b.ui.hasScroll(i,"left")?i.scrollWidth:k),q=(b.ui.hasScroll(i)?i.scrollHeight:c);r.parentData={element:i,left:m.left,top:m.top,width:f,height:q}}},resize:function(e,l){var p=b(this).data("resizable"),g=p.options,d=p.containerSize,k=p.containerOffset,i=p.size,j=p.position,m=g._aspectRatio||e.shiftKey,c={top:0,left:0},f=p.containerElement;if(f[0]!=document&&(/static/).test(f.css("position"))){c=k}if(j.left<(p._helper?k.left:0)){p.size.width=p.size.width+(p._helper?(p.position.left-k.left):(p.position.left-c.left));if(m){p.size.height=p.size.width/g.aspectRatio}p.position.left=g.helper?k.left:0}if(j.top<(p._helper?k.top:0)){p.size.height=p.size.height+(p._helper?(p.position.top-k.top):p.position.top);if(m){p.size.width=p.size.height*g.aspectRatio}p.position.top=p._helper?k.top:0}var h=Math.abs((p._helper?p.offset.left-c.left:(p.offset.left-c.left))+p.sizeDiff.width),n=Math.abs((p._helper?p.offset.top-c.top:(p.offset.top-k.top))+p.sizeDiff.height);if(h+p.size.width>=p.parentData.width){p.size.width=p.parentData.width-h;if(m){p.size.height=p.size.width/g.aspectRatio}}if(n+p.size.height>=p.parentData.height){p.size.height=p.parentData.height-n;if(m){p.size.width=p.size.height*g.aspectRatio}}},stop:function(d,l){var n=b(this).data("resizable"),e=n.options,j=n.position,k=n.containerOffset,c=n.containerPosition,f=n.containerElement;var g=b(n.helper),p=g.offset(),m=g.outerWidth()-n.sizeDiff.width,i=g.outerHeight()-n.sizeDiff.height;if(n._helper&&!e.animate&&(/relative/).test(f.css("position"))){b(this).css({left:p.left-c.left-k.left,width:m,height:i})}if(n._helper&&!e.animate&&(/static/).test(f.css("position"))){b(this).css({left:p.left-c.left-k.left,width:m,height:i})}}});b.ui.plugin.add("resizable","ghost",{start:function(e,f){var c=b(this).data("resizable"),g=c.options,h=g.proportionallyResize,d=c.size;c.ghost=c.originalElement.clone();c.ghost.css({opacity:0.25,display:"block",position:"relative",height:d.height,width:d.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof g.ghost=="string"?g.ghost:"");c.ghost.appendTo(c.helper)},resize:function(d,e){var c=b(this).data("resizable"),f=c.options;if(c.ghost){c.ghost.css({position:"relative",height:c.size.height,width:c.size.width})}},stop:function(d,e){var c=b(this).data("resizable"),f=c.options;if(c.ghost&&c.helper){c.helper.get(0).removeChild(c.ghost.get(0))}}});b.ui.plugin.add("resizable","grid",{resize:function(c,k){var m=b(this).data("resizable"),f=m.options,i=m.size,g=m.originalSize,h=m.originalPosition,l=m.axis,j=f._aspectRatio||c.shiftKey;f.grid=typeof f.grid=="number"?[f.grid,f.grid]:f.grid;var e=Math.round((i.width-g.width)/(f.grid[0]||1))*(f.grid[0]||1),d=Math.round((i.height-g.height)/(f.grid[1]||1))*(f.grid[1]||1);if(/^(se|s|e)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d}else{if(/^(ne)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d;m.position.top=h.top-d}else{if(/^(sw)$/.test(l)){m.size.width=g.width+e;m.size.height=g.height+d;m.position.left=h.left-e}else{m.size.width=g.width+e;m.size.height=g.height+d;m.position.top=h.top-d;m.position.left=h.left-e}}}}});var a=function(c){return parseInt(c,10)||0}})(jQuery);;/* + * jQuery UI Progressbar 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * ui.core.js + */ (function(a){a.widget("ui.progressbar",{_init:function(){var b=this,c=this.options;this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a('
    ').appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow").removeData("progressbar").unbind(".progressbar");this.valueDiv.remove();a.widget.prototype.destroy.apply(this,arguments)},value:function(b){arguments.length&&this._setData("value",b);return this._value()},_setData:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change",null,{});break}a.widget.prototype._setData.apply(this,arguments)},_value:function(){var b=this.options.value;if(bthis._valueMax()){b=this._valueMax()}return b},_valueMin:function(){var b=0;return b},_valueMax:function(){var b=100;return b},_refreshValue:function(){var b=this.value();this.valueDiv[b==this._valueMax()?"addClass":"removeClass"]("ui-corner-right");this.valueDiv.width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.6rc6",defaults:{value:0}})})(jQuery);;/* + * jQuery UI Effects 1.6rc6 + * + * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Effects/ + */ (function(d){d.effects=d.effects||{};d.extend(d.effects,{version:"1.6rc6",save:function(g,h){for(var f=0;f');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}});function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:i.duration;h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(arguments[0].constructor==Function)){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h= 0) webkitAvailable = false; + } catch(err) {} + var mozillaAvailable = false; + try { + mozillaAvailable = (document.body.style.MozBorderRadius !== undefined); + /* Firefox 2 corners look worse */ + var versionIndex = navigator.userAgent.indexOf('Firefox'); + if (versionIndex >= 0 && parseInt(navigator.userAgent.substring(versionIndex+8)) < 3) mozillaAvailable = false; + } catch(err) {} + return this.each(function(i,e){ + $e = jQuery(e); + if ($e.hasClass(doneClass)) return; + $e.addClass(doneClass); + var classScan = /{(.*)}/.exec(e.className); + var s = classScan ? parseOptions(classScan[1], settings) : settings; + var nodeName = e.nodeName.toLowerCase(); + if (nodeName=='input') e = changeInput(e); + if (webkitAvailable && s.webkit) roundWebkit(e, s); + else if(mozillaAvailable && s.mozilla && (s.sizex == s.sizey)) roundMozilla(e, s); + else { + var bgColor = backgroundColor(e.parentNode); + var fgColor = backgroundColor(e); + switch (nodeName) { + case 'a': + case 'input': + roundLink(e, s, bgColor, fgColor); + break; + default: + roundDiv(e, s, bgColor, fgColor); + break; + } + } + }); + + function roundWebkit(e, s) { + var radius = '' + s.sizex + 'px ' + s.sizey + 'px'; + var $e = jQuery(e); + if (s.tl) $e.css('WebkitBorderTopLeftRadius', radius); + if (s.tr) $e.css('WebkitBorderTopRightRadius', radius); + if (s.bl) $e.css('WebkitBorderBottomLeftRadius', radius); + if (s.br) $e.css('WebkitBorderBottomRightRadius', radius); + } + + function roundMozilla(e, s) + { + var radius = '' + s.sizex + 'px'; + var $e = jQuery(e); + if (s.tl) $e.css('-moz-border-radius-topleft', radius); + if (s.tr) $e.css('-moz-border-radius-topright', radius); + if (s.bl) $e.css('-moz-border-radius-bottomleft', radius); + if (s.br) $e.css('-moz-border-radius-bottomright', radius); + } + + function roundLink(e, s, bgColor, fgColor) { + var table = tableElement("table"); + var tbody = tableElement("tbody"); + table.appendChild(tbody); + var tr1 = tableElement("tr"); + var td1 = tableElement("td", "top"); + tr1.appendChild(td1); + var tr2 = tableElement("tr"); + var td2 = relocateContent(e, s, tableElement("td")); + tr2.appendChild(td2); + var tr3 = tableElement("tr"); + var td3 = tableElement("td", "bottom"); + tr3.appendChild(td3); + if (s.tl||s.tr) { + tbody.appendChild(tr1); + addCorners(td1, s, bgColor, fgColor, true); + } + tbody.appendChild(tr2); + if (s.bl||s.br) { + tbody.appendChild(tr3); + addCorners(td3, s, bgColor, fgColor, false); + } + e.appendChild(table); + /* Clicking on $('a>table') in IE will trigger onclick but not the href */ + if (jQuery.browser.msie) table.onclick = ieLinkBypass; + /* Firefox 2 will render garbage unless we hide the overflow here */ + e.style.overflow = 'hidden'; + } + + function ieLinkBypass() { + if (!this.parentNode.onclick) this.parentNode.click(); + } + + function changeInput(e) { + var a1 = document.createElement("a"); + a1.id = e.id; + a1.className = e.className; + if (e.onclick) { + a1.href = 'javascript:' + a1.onclick = e.onclick; + } else { + jQuery(e).parent('form').each(function() {a1.href = this.action;}); + a1.onclick = submitForm; + } + var a2 = document.createTextNode(e.value); + a1.appendChild(a2); + e.parentNode.replaceChild(a1, e); + return a1; + } + + function submitForm() { + jQuery(this).parent('form').each(function() {this.submit()}); + return false; + } + + function roundDiv(e, s, bgColor, fgColor) { + var div = relocateContent(e, s, document.createElement('div')); + e.appendChild(div); + if (s.tl||s.tr) addCorners(e, s, bgColor, fgColor, true); + if (s.bl||s.br) addCorners(e, s, bgColor, fgColor, false); + } + + function relocateContent(e, s, d) { + var $e = jQuery(e); + var c; + while(c=e.firstChild) d.appendChild(c); + if (e.style.height) { + var h = parseInt($e.css('height')); + d.style.height = h + 'px'; + h += parseInt($e.css('padding-top')) + parseInt($e.css('padding-bottom')); + e.style.height = h + 'px'; + } + if (e.style.width) { + var w = parseInt($e.css('width')); + d.style.width = w + 'px'; + w += parseInt($e.css('padding-left')) + parseInt($e.css('padding-right')); + e.style.width = w + 'px'; + } + d.style.paddingLeft = $e.css('padding-left'); + d.style.paddingRight = $e.css('padding-right'); + if (s.tl||s.tr) { + d.style.paddingTop = adjustedPadding(e, s, $e.css('padding-top'), true); + } else { + d.style.paddingTop = $e.css('padding-top'); + } + if (s.bl||s.br) { + d.style.paddingBottom = adjustedPadding(e, s, $e.css('padding-bottom'), false); + } else { + d.style.paddingBottom = $e.css('padding-bottom'); + } + e.style.padding = 0; + return d; + } + + function adjustedPadding(e, s, pad, top) { + if (pad.indexOf("px") < 0) { + try { + //TODO Make this check work otherwise remove it + console.error('%s padding not in pixels', (top ? 'top' : 'bottom'), e); + } + catch(err) {} + pad = s.sizey + 'px'; + } + pad = parseInt(pad); + if (pad - s.sizey < 0) { + try { + console.error('%s padding is %ipx for %ipx corner:', (top ? 'top' : 'bottom'), pad, s.sizey, e); + } + catch(err) {} + pad = s.sizey; + } + return pad - s.sizey + 'px'; + } + + function tableElement(kind, valign) { + var e = document.createElement(kind) + e.style.border = 'none'; + e.style.borderCollapse = 'collapse'; + e.style.borderSpacing = 0; + e.style.padding = 0; + e.style.margin = 0; + if (valign) e.style.verticalAlign = valign; + return e; + } + + function backgroundColor(e) { + try { + var c = jQuery.css(e, "background-color"); + if ( c.match(/^(transparent|rgba\(0,\s*0,\s*0,\s*0\))$/i) && e.parentNode ) + return backgroundColor(e.parentNode); + if (c==null) + return "#ffffff"; + if (c.indexOf("rgb") > -1) + c = rgb2hex(c); + if (c.length == 4) + c = hexShort2hex(c); + return c; + } catch(err) { + return "#ffffff"; + } + } + + function hexShort2hex(c) { + return '#' + + c.substring(1,2) + + c.substring(1,2) + + c.substring(2,3) + + c.substring(2,3) + + c.substring(3,4) + + c.substring(3,4); + } + + function rgb2hex(c) { + var x = 255; + var hex = ''; + var i; + var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/; + var array=regexp.exec(c); + for(i=1;i<4;i++) hex += ('0'+parseInt(array[i]).toString(16)).slice(-2); + return '#'+hex; + } + + function parseOptions(options, settings) { + var options = options || ''; + var s = {sizex:5, sizey:5, tl: false, tr: false, bl: false, br: false, webkit:true, mozilla: true, transparent:false}; + if (settings) { + s.sizex = settings.sizex; + s.sizey = settings.sizey; + s.webkit = settings.webkit; + s.transparent = settings.transparent; + s.mozilla = settings.mozilla; + } + var sizex_set = false; + var corner_set = false; + jQuery.each(options.split(' '), function(idx, option) { + option = option.toLowerCase(); + var i = parseInt(option); + if (i > 0 && option == i + 'px') { + s.sizey = i; + if (!sizex_set) s.sizex = i; + sizex_set = true; + } else switch (option) { + case 'no-native': s.webkit = s.mozilla = false; break; + case 'webkit': s.webkit = true; break; + case 'no-webkit': s.webkit = false; break; + case 'mozilla': s.mozilla = true; break; + case 'no-mozilla': s.mozilla = false; break; + case 'anti-alias': s.transparent = false; break; + case 'transparent': s.transparent = true; break; + case 'top': corner_set = s.tl = s.tr = true; break; + case 'right': corner_set = s.tr = s.br = true; break; + case 'bottom': corner_set = s.bl = s.br = true; break; + case 'left': corner_set = s.tl = s.bl = true; break; + case 'top-left': corner_set = s.tl = true; break; + case 'top-right': corner_set = s.tr = true; break; + case 'bottom-left': corner_set = s.bl = true; break; + case 'bottom-right': corner_set = s.br = true; break; + } + }); + if (!corner_set) { + if (!settings) { + s.tl = s.tr = s.bl = s.br = true; + } else { + s.tl = settings.tl; + s.tr = settings.tr; + s.bl = settings.bl; + s.br = settings.br; + } + } + return s; + } + + function alphaBlend(a, b, alpha) { + var ca = Array( + parseInt('0x' + a.substring(1, 3)), + parseInt('0x' + a.substring(3, 5)), + parseInt('0x' + a.substring(5, 7)) + ); + var cb = Array( + parseInt('0x' + b.substring(1, 3)), + parseInt('0x' + b.substring(3, 5)), + parseInt('0x' + b.substring(5, 7)) + ); + r = '0' + Math.round(ca[0] + (cb[0] - ca[0])*alpha).toString(16); + g = '0' + Math.round(ca[1] + (cb[1] - ca[1])*alpha).toString(16); + b = '0' + Math.round(ca[2] + (cb[2] - ca[2])*alpha).toString(16); + return '#' + + r.substring(r.length - 2) + + g.substring(g.length - 2) + + b.substring(b.length - 2); + } + + function addCorners(e, s, bgColor, fgColor, top) { + if (s.transparent) addTransparentCorners(e, s, bgColor, top); + else addAntiAliasedCorners(e, s, bgColor, fgColor, top); + } + + function addAntiAliasedCorners(e, s, bgColor, fgColor, top) { + var i, j; + var d = document.createElement("div"); + d.style.fontSize = '1px'; + d.style.backgroundColor = bgColor; + var lastarc = 0; + for (i = 1; i <= s.sizey; i++) { + var coverage, arc2, arc3; + // Find intersection of arc with bottom of pixel row + arc = Math.sqrt(1.0 - Math.pow(1.0 - i / s.sizey, 2)) * s.sizex; + // Calculate how many pixels are bg, fg and blended. + var n_bg = s.sizex - Math.ceil(arc); + var n_fg = Math.floor(lastarc); + var n_aa = s.sizex - n_bg - n_fg; + // Create pixel row wrapper + var x = document.createElement("div"); + var y = d; + x.style.margin = "0px " + n_bg + "px"; + x.style.height = '1px'; + x.style.overflow = 'hidden'; + // Create the pixel divs for a row (at least one) + for (j = 1; j <= n_aa; j++) { + // Calculate coverage per pixel (approximates arc within the pixel) + if (j == 1) { + if (j == n_aa) { + // Single pixel + coverage = ((arc + lastarc) * .5) - n_fg; + } + else { + // First in a run + arc2 = Math.sqrt(1.0 - Math.pow(1.0 - (n_bg + 1) / s.sizex, 2)) * s.sizey; + coverage = (arc2 - (s.sizey - i)) * (arc - n_fg - n_aa + 1) * .5; + } + } + else if (j == n_aa) { + // Last in a run + arc2 = Math.sqrt(1.0 - Math.pow((s.sizex - n_bg - j + 1) / s.sizex, 2)) * s.sizey; + coverage = 1.0 - (1.0 - (arc2 - (s.sizey - i))) * (1.0 - (lastarc - n_fg)) * .5; + } + else { + // Middle of a run + arc3 = Math.sqrt(1.0 - Math.pow((s.sizex - n_bg - j) / s.sizex, 2)) * s.sizey; + arc2 = Math.sqrt(1.0 - Math.pow((s.sizex - n_bg - j + 1) / s.sizex, 2)) * s.sizey; + coverage = ((arc2 + arc3) * .5) - (s.sizey - i); + } + + addCornerDiv(s, x, y, top, alphaBlend(bgColor, fgColor, coverage)); + y = x; + var x = y.cloneNode(false); + x.style.margin = "0px 1px"; + } + addCornerDiv(s, x, y, top, fgColor); + lastarc = arc; + } + if (top) + e.insertBefore(d, e.firstChild); + else + e.appendChild(d); + } + + function addCornerDiv(s, x, y, top, color) { + if (top && !s.tl) x.style.marginLeft = 0; + if (top && !s.tr) x.style.marginRight = 0; + if (!top && !s.bl) x.style.marginLeft = 0; + if (!top && !s.br) x.style.marginRight = 0; + x.style.backgroundColor = color; + if (top) + y.appendChild(x); + else + y.insertBefore(x, y.firstChild); + } + + function addTransparentCorners(e, s, bgColor, top) { + var d = document.createElement("div"); + d.style.fontSize = '1px'; + var strip = document.createElement('div'); + strip.style.overflow = 'hidden'; + strip.style.height = '1px'; + strip.style.borderColor = bgColor; + strip.style.borderStyle = 'none solid'; + var sizex = s.sizex-1; + var sizey = s.sizey-1; + if (!sizey) sizey = 1; /* hint for 1x1 */ + for (var i=0; i < s.sizey; i++) { + var w = sizex - Math.floor(Math.sqrt(1.0 - Math.pow(1.0 - i / sizey, 2)) * sizex); + if (i==2 && s.sizex==6 && s.sizey==6) w = 2; /* hint for 6x6 */ + var x = strip.cloneNode(false); + x.style.borderWidth = '0 '+ w +'px'; + if (top) x.style.borderWidth = '0 '+(s.tr?w:0)+'px 0 '+(s.tl?w:0)+'px'; + else x.style.borderWidth = '0 '+(s.br?w:0)+'px 0 '+(s.bl?w:0)+'px'; + top ? d.appendChild(x) : d.insertBefore(x, d.firstChild); + } + if (top) + e.insertBefore(d, e.firstChild); + else + e.appendChild(d); + } + + +} diff --git a/media/js/jquery.hotkeys.js b/media/js/jquery.hotkeys.js new file mode 100644 index 000000000..15f1ce438 --- /dev/null +++ b/media/js/jquery.hotkeys.js @@ -0,0 +1,244 @@ +/* +(c) Copyrights 2007 - 2008 + +Original idea by by Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ + +jQuery Plugin by Tzury Bar Yochay +tzury.by@gmail.com +http://evalinux.wordpress.com +http://facebook.com/profile.php?id=513676303 + +Project's sites: +http://code.google.com/p/js-hotkeys/ +http://github.com/tzuryby/hotkeys/tree/master + +License: same as jQuery license. + +USAGE: + // simple usage + $(document).bind('keydown', 'Ctrl+c', function(){ alert('copy anyone?');}); + + // special options such as disableInIput + $(document).bind('keydown', {combi:'Ctrl+x', disableInInput: true} , function() {}); + +Note: + This plugin wraps the following jQuery methods: $.fn.find, $.fn.bind and $.fn.unbind + +*/ + + +(function (jQuery){ + // keep reference to the original $.fn.bind and $.fn.unbind + jQuery.fn.__bind__ = jQuery.fn.bind; + jQuery.fn.__unbind__ = jQuery.fn.unbind; + jQuery.fn.__find__ = jQuery.fn.find; + + var hotkeys = { + version: '0.7.8', + override: /keydown|keypress|keyup/g, + triggersMap: {}, + + specialKeys: { 27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', + 20: 'capslock', 144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del', + 35:'end', 33: 'pageup', 34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', + 112:'f1',113:'f2', 114:'f3', 115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', + 120:'f9', 121:'f10', 122:'f11', 123:'f12' }, + + shiftNums: { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&", + "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<", + ".":">", "/":"?", "\\":"|" }, + + newTrigger: function (type, combi, callback) { + // i.e. {'keyup': {'ctrl': {cb: callback, disableInInput: false}}} + var result = {}; + result[type] = {}; + result[type][combi] = {cb: callback, disableInInput: false}; + return result; + } + }; + // add firefox num pad char codes + if (jQuery.browser.mozilla){ + hotkeys.specialKeys = jQuery.extend(hotkeys.specialKeys, { 96: '0', 97:'1', 98: '2', 99: + '3', 100: '4', 101: '5', 102: '6', 103: '7', 104: '8', 105: '9' }); + } + + // a wrapper around of $.fn.find + // see more at: http://groups.google.com/group/jquery-en/browse_thread/thread/18f9825e8d22f18d + jQuery.fn.find = function( selector ) { + this.query=selector; + return jQuery.fn.__find__.apply(this, arguments); + }; + + jQuery.fn.unbind = function (type, combi, fn){ + if (jQuery.isFunction(combi)){ + fn = combi; + combi = null; + } + if (combi && typeof combi === 'string'){ + var selectorId = ((this.prevObject && this.prevObject.query) || (this[0].id && this[0].id) || this[0]).toString(); + var hkTypes = type.split(' '); + for (var x=0; x)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Make sure an element was located + if ( elem ){ + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem ); + ret.context = document; + ret.selector = selector; + return ret; + } + selector = []; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's .push method, not like a jQuery method. + push: [].push, + + find: function( selector ) { + if ( this.length === 1 && !/,/.test(selector) ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) ? + jQuery.unique( elems ) : + elems, "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] !== undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) + return cur; + cur = cur.parentNode; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild, + extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
    " ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and + + + + + + + + + + + + + + + + + + {% block header %}{% endblock %} + {% block content %}{% endblock %} + + + + + + diff --git a/templates/globals.html b/templates/globals.html new file mode 100644 index 000000000..eaae56cc1 --- /dev/null +++ b/templates/globals.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/templates/opml_import/import.xhtml b/templates/opml_import/import.xhtml new file mode 100644 index 000000000..409e08815 --- /dev/null +++ b/templates/opml_import/import.xhtml @@ -0,0 +1,23 @@ +{% extends 'base.html' %} + +{% block content %} +
    + +
    + Paste the OPML file here: + +
    + +
    + + +
    +
    + + +
    + + +
    + +{% endblock %} \ No newline at end of file diff --git a/templates/reader/feeds.xhtml b/templates/reader/feeds.xhtml new file mode 100644 index 000000000..2c2d1c9e8 --- /dev/null +++ b/templates/reader/feeds.xhtml @@ -0,0 +1,46 @@ +{% extends 'base.html' %} + +{% block content %} + +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + +
    + + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activate.html b/templates/registration/activate.html new file mode 100644 index 000000000..f87d519b3 --- /dev/null +++ b/templates/registration/activate.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %} +registration_form.html | {{ block.super }} +{% endblock %} + +{% block header %} +

    activate.html

    +{% endblock %} + +{% block content %} +You are now activated. +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt new file mode 100644 index 000000000..9a31eba3b --- /dev/null +++ b/templates/registration/activation_email.txt @@ -0,0 +1,3 @@ +Activate your account in {{ expiration_days }} days... +{{ site }}{% url registration_activate activation_key %} + diff --git a/templates/registration/activation_email_subject.txt b/templates/registration/activation_email_subject.txt new file mode 100644 index 000000000..50bcb400c --- /dev/null +++ b/templates/registration/activation_email_subject.txt @@ -0,0 +1 @@ +[django-registration] Activation email \ No newline at end of file diff --git a/templates/registration/login.html b/templates/registration/login.html new file mode 100644 index 000000000..2b6efca70 --- /dev/null +++ b/templates/registration/login.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} + +{% block content %} + +{% if form.errors %} +

    Your username and password didn't match. Please try again.

    +{% endif %} + +
    + + + +
    {{ form.username.label_tag }}{{ form.username }}
    {{ form.password.label_tag }}{{ form.password }}
    + + + +
    + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/registration_complete.html b/templates/registration/registration_complete.html new file mode 100644 index 000000000..7ea57e097 --- /dev/null +++ b/templates/registration/registration_complete.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %} +registration_complete.html | {{ block.super }} +{% endblock %} + +{% block header %} +

    registration_complete.html

    +{% endblock %} + +{% block content %} +Thank you for signing up. An email with the activation code has been send to your inbox. +{% endblock %} \ No newline at end of file diff --git a/templates/registration/registration_form.html b/templates/registration/registration_form.html new file mode 100644 index 000000000..17bebf263 --- /dev/null +++ b/templates/registration/registration_form.html @@ -0,0 +1,56 @@ +{% extends "base.html" %} + +{% block title %} +registration_form.html | {{ block.super }} +{% endblock %} + +{% block header %} +

    registration_form.html

    +{% endblock %} + +{% block content %} +
    + + + + + + + + + + + + + + + + + + + + + +
    Username: + {{ form.username }}
    + {% for error in form.username.errors %} + {{ error }} + {% endfor %} +
    Email: + {{ form.email }}
    + {% for error in form.email.errors %} + {{ error }} + {% endfor %} +
    Password: + {{ form.password1 }}
    + {% for error in form.password1.errors %} + {{ error }} + {% endfor %} +
    Password (again): + {{ form.password2 }}
    + {% for error in form.password2.errors %} + {{ error }} + {% endfor %} +
     
    +
    +{% endblock %} \ No newline at end of file diff --git a/urls.py b/urls.py new file mode 100644 index 000000000..8c8f21972 --- /dev/null +++ b/urls.py @@ -0,0 +1,26 @@ +from django.conf.urls.defaults import * +from django.conf import settings + +# Uncomment the next two lines to enable the admin: +from django.contrib import admin +admin.autodiscover() + +urlpatterns = patterns('', + (r'^$', include('apps.reader.urls')), + (r'^accounts/', include('apps.registration.urls')), + (r'^reader/', include('apps.reader.urls')), + (r'^opml_import/', include('apps.opml_import.urls')), + (r'^admin/doc/', include('django.contrib.admindocs.urls')), + (r'^admin/(.*)', admin.site.root) +) + +if settings.DEBUG and settings.PRODUCTION: + urlpatterns += patterns('', + (r'^media/(?P.*)$', 'django.views.static.serve', + {'document_root': '/home/conesus/newsblur/media'}), + ) +if settings.DEBUG and settings.DEVELOPMENT: + urlpatterns += patterns('', + (r'^media/(?P.*)$', 'django.views.static.serve', + {'document_root': '/Users/conesus/Projects/newsblur/media'}), + ) \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/cache/__init__.py b/utils/cache/__init__.py new file mode 100644 index 000000000..4bfec3f25 --- /dev/null +++ b/utils/cache/__init__.py @@ -0,0 +1,2 @@ +from manager import CacheManager +from base import CachedModel diff --git a/utils/cache/base.py b/utils/cache/base.py new file mode 100644 index 000000000..1e623e774 --- /dev/null +++ b/utils/cache/base.py @@ -0,0 +1,166 @@ +from django.db.models.manager import Manager +from django.db.models.base import ModelBase, Model +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned +from django.db.models.fields import FieldDoesNotExist +from django.db.models.options import Options +from django.db.models import signals +from django.db.models.loading import register_models, get_model +from django.dispatch import dispatcher +from django.utils.functional import curry +from django.conf import settings + +from django.core.cache import cache + +import types +import sys + +from manager import CacheManager +from utils import get_cache_key_for_pk + +DEFAULT_CACHE_TIME = 60*60*60 # the maximum an item should be in the cache + +# Signals rundown: +# .cache(expire_on=['create', 'update', 'delete']) +# use namespaces possible so the cache key becomes key_name:expire_namespace(not always present):hash + +# for example, a call with no expires: +# db_table:hash + +# a call with a delete expires +# db_table:0,0,0:hash + +# the numbers represent our current namespace level for the 3 expiration methods +# in order to do this, we'd have to actually store another cache key per model +# and to support threading, query that cache key everytime we do any cache queryset +# hit +# e.g. cache.get('ns:db_table') = 0,0,0 + +# when a new row is created, we'd set that to 1,0,0 +# which would invalidate anything that had a create expiration set because the key is +# now invalid, because the namespace changed. + +# if you only had create expirations set +# your namespace would be :0: -- its all about the queryset call, you still have to +# call it the same way throughout your code + +# We can also add a table namespace, which says "delete everything" so our +# cache key now becomes db_table:ns_count:0,0,0:hash +# where the 0,0,0: is optional + +# ns_count would be stored in the same ns:db_table key and starts at 0 +# this would most likely only be incremented if you did a push to your site +# and needed to say wipe all articles because the dataset changed. + +class CachedModelBase(ModelBase): + # TODO: find a way to not overwrite __new__ like this + def __new__(cls, name, bases, attrs): + # If this isn't a subclass of CachedModel, don't do anything special. + try: + if not filter(lambda b: issubclass(b, CachedModel), bases): + return super(CachedModelBase, cls).__new__(cls, name, bases, attrs) + except NameError: + # 'CachedModel' isn't defined yet, meaning we're looking at Django's own + # Model class, defined below. + return super(CachedModelBase, cls).__new__(cls, name, bases, attrs) + + # Create the class. + new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')}) + new_class.add_to_class('_meta', Options(attrs.pop('Meta', None))) + new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {})) + new_class.add_to_class('MultipleObjectsReturned', + types.ClassType('MultipleObjectsReturned', (MultipleObjectsReturned, ), {})) + + # Build complete list of parents + for base in bases: + # TODO: Checking for the presence of '_meta' is hackish. + if '_meta' in dir(base): + new_class._meta.parents.append(base) + new_class._meta.parents.extend(base._meta.parents) + + + if getattr(new_class._meta, 'app_label', None) is None: + # Figure out the app_label by looking one level up. + # For 'django.contrib.sites.models', this would be 'sites'. + model_module = sys.modules[new_class.__module__] + new_class._meta.app_label = model_module.__name__.split('.')[-2] + + # Bail out early if we have already created this class. + m = get_model(new_class._meta.app_label, name, False) + if m is not None: + return m + + # Add all attributes to the class. + for obj_name, obj in attrs.items(): + new_class.add_to_class(obj_name, obj) + + # Add Fields inherited from parents + for parent in new_class._meta.parents: + for field in parent._meta.fields: + # Only add parent fields if they aren't defined for this class. + try: + new_class._meta.get_field(field.name) + except FieldDoesNotExist: + field.contribute_to_class(new_class, field.name) + + new_class._prepare() + + register_models(new_class._meta.app_label, new_class) + # Because of the way imports happen (recursively), we may or may not be + # the first class for this model to register with the framework. There + # should only be one class for each model, so we must always return the + # registered version. + return get_model(new_class._meta.app_label, name, False) + +class CachedModel(Model): + """ + docstring for CachedModel + """ + __metaclass__ = CachedModelBase + +# objects = CacheManager() +# nocache = Manager() + + # Maybe this would work? + @classmethod + def _prepare(cls): + # TODO: How do we extend the parent classes classmethod properly? + # super(CachedModel, cls)._prepare() errors + opts = cls._meta + opts._prepare(cls) + + if opts.order_with_respect_to: + cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True) + cls.get_previous_in_order = curry(cls._get_next_or_previous_in_order, is_next=False) + setattr(opts.order_with_respect_to.rel.to, 'get_%s_order' % cls.__name__.lower(), curry(method_get_order, cls)) + setattr(opts.order_with_respect_to.rel.to, 'set_%s_order' % cls.__name__.lower(), curry(method_set_order, cls)) + + # Give the class a docstring -- its definition. + if cls.__doc__ is None: + cls.__doc__ = "%s(%s)" % (cls.__name__, ", ".join([f.attname for f in opts.fields])) + + if hasattr(cls, 'get_absolute_url'): + cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url) + + cls.add_to_class('objects', CacheManager()) + cls.add_to_class('nocache', Manager()) + cls.add_to_class('_default_manager', cls.nocache) + dispatcher.send(signal=signals.class_prepared, sender=cls) + + @staticmethod + def _get_cache_key_for_pk(model, pk): + return get_cache_key_for_pk(model, pk) + + @property + def cache_key(self): + return self._get_cache_key_for_pk(self.__class__, self.pk) + + def save(self, *args, **kwargs): + cache.set(self._get_cache_key_for_pk(self.__class__, self.pk), self) + super(CachedModel, self).save(*args, **kwargs) + + def delete(self, *args, **kwargs): + # TODO: create an option that tells the model whether or not it should + # do a cache.delete when the object is deleted. For memcached we + # wouldn't care about deleting. + cache.delete(self._get_cache_key_for_pk(self.__class__, self.pk)) + super(CachedModel, self).delete(*args, **kwargs) diff --git a/utils/cache/exceptions.py b/utils/cache/exceptions.py new file mode 100644 index 000000000..fec786bdf --- /dev/null +++ b/utils/cache/exceptions.py @@ -0,0 +1,19 @@ +class CachedModelException(Exception): pass + + +# Our invalidation classes +class CacheInvalidationWarning(CachedModelException): pass + +class CacheMissingWarning(CacheInvalidationWarning): + """ + CacheMissingWarning is thrown when we're trying to fetch a queryset + and it's missing objects in the database. + """ + pass + +class CacheExpiredWarning(CacheInvalidationWarning): + """ + CacheExpiredWarning is thrown when we're trying to fetch from the cache + but the pre-expiration has been hit. + """ + pass diff --git a/utils/cache/manager.py b/utils/cache/manager.py new file mode 100644 index 000000000..f64e0bdc7 --- /dev/null +++ b/utils/cache/manager.py @@ -0,0 +1,28 @@ +from django.db.models.manager import Manager +from query import CachedQuerySet + +class CacheManager(Manager): + """ + A manager to store and retrieve cached objects using CACHE_BACKEND + + -- the key prefix for all cached objects on this model. [default: db_table] + -- in seconds, the maximum time before data is invalidated. [default: DEFAULT_CACHE_TIME] + """ + def __init__(self, *args, **kwargs): + self.key_prefix = kwargs.pop('key_prefix', None) + self.timeout = kwargs.pop('timeout', None) + super(CacheManager, self).__init__(*args, **kwargs) + + def get_query_set(self): + return CachedQuerySet(model=self.model, timeout=self.timeout, key_prefix=self.key_prefix) + + def cache(self, *args, **kwargs): + return self.get_query_set().cache(*args, **kwargs) + + def clean(self, *args, **kwargs): + # Use reset instead if you are using memcached, as clean makes no sense (extra bandwidth when + # memcached will automatically clean iself). + return self.get_query_set().clean(*args, **kwargs) + + def reset(self, *args, **kwargs): + return self.get_query_set().reset(*args, **kwargs) diff --git a/utils/cache/query.py b/utils/cache/query.py new file mode 100644 index 000000000..28264cf84 --- /dev/null +++ b/utils/cache/query.py @@ -0,0 +1,303 @@ +from django.db.models.query import QuerySet +from django.db import backend, connection +from django.core.cache import cache +from django.conf import settings + +from utils import get_cache_key_for_pk +from exceptions import CacheMissingWarning + +# TODO: if the query is passing pks then we need to make it pull the cache key from the model +# and try to fetch that first +# if there are additional filters to apply beyond pks we then filter those after we're already pulling the pks + +# TODO: should we also run these additional filters each time we pull back a ref list to check for validation? + +# TODO: all related field calls need to be removed and replaced with cache key sets of some sorts +# (just remove the join and make it do another qs.filter(pk__in) to pull them, which would do a many cache get callb) + +DEFAULT_CACHE_TIME = 60*60*24 # 24 hours +GET_ITERATOR_CHUNK_SIZE = 100 + +class FauxCachedQuerySet(list): + """ + We generate a FauxCachedQuerySet when we are returning a + CachedQuerySet from a CachedModel. + """ + pass + +class CachedQuerySet(QuerySet): + """ + Extends the QuerySet object and caches results via CACHE_BACKEND. + """ + def __init__(self, model=None, key_prefix=None, timeout=None, key_name=None, *args, **kwargs): + self._cache_keys = {} + self._cache_reset = False + self._cache_clean = False + if key_prefix: + self.cache_key_prefix = key_prefix + else: + if model: + self.cache_key_prefix = model._meta.db_table + else: + self.cache_key_prefix = '' + self.cache_key_name = key_name + if timeout: + self.cache_timeout = timeout + else: + self.cache_timeout = getattr(cache, 'default_timeout', getattr(settings, 'DEFAULT_CACHE_TIME', DEFAULT_CACHE_TIME)) + QuerySet.__init__(self, model, *args, **kwargs) + + def _clone(self, klass=None, **kwargs): + c = QuerySet._clone(self, klass, **kwargs) + c._cache_clean = kwargs.pop('_cache_clean', self._cache_clean) + c._cache_reset = kwargs.pop('_cache_reset', self._cache_reset) + c.cache_key_prefix = kwargs.pop('cache_key_prefix', self.cache_key_prefix) + c.cache_timeout = kwargs.pop('cache_timeout', self.cache_timeout) + c._cache_keys = {} + return c + + def _get_sorted_clause_key(self): + return (isinstance(i, basestring) and i.lower().replace('`', '').replace("'", '') or str(tuple(sorted(i))) for i in self._get_sql_clause()) + + def _get_cache_key(self, extra=''): + # TODO: Need to figure out if this is the best use. + # Maybe we should use extra for cache_key_name, extra was planned for use + # in things like .count() as it's a different cache key than the normal queryset, + # but that also doesn't make sense because theoretically count() is already different + # sql so the sorted_sql_clause should have figured that out. + if self.cache_key_name is not None: + return '%s:%s' % (self.cache_key_prefix, self.cache_key_name) + if extra not in self._cache_keys: + self._cache_keys[extra] = '%s:%s:%s' % (self.cache_key_prefix, str(hash(''.join(self._get_sorted_clause_key()))), extra) + return self._cache_keys[extra] + + def _prepare_queryset_for_cache(self, queryset): + """ + This is where the magic happens. We need to first see if our result set + is in the cache. If it isn't, we need to do the query and set the cache + to (ModelClass, (*,), (*,), ). + """ + # TODO: make this split up large sets of data based on an option + # and sets the last param, keys, to how many datasets are stored + # in the cache to regenerate. + keys = tuple(obj.pk for obj in queryset) + if self._select_related: + if not self._max_related_depth: + fields = [f.name for f in opts.fields if f.rel and not f.null] + else: + # TODO: handle depth relate lookups + fields = () + else: + fields = () + + return (queryset[0].__class__, keys, fields, 1) + + def _get_queryset_from_cache(self, cache_object): + """ + We transform the cache storage into an actual QuerySet object + automagickly handling the keys depth and select_related fields (again, + using the recursive methods of CachedQuerySet. + + We effectively would just be doing a cache.multi_get(*pks), grabbing + the pks for each releation, e.g. user, and then doing a + CachedManager.objects.filter() on them. This also then makes that + queryset reusable. So the question is, should that queryset have been + reusable? It could be invalidated by some other code which we aren't + tieing directly into the parent queryset so maybe we can't do the + objects.filter() query here and we have to do it internally. + """ + # TODO: make this work for people who have, and who don't have, instance caching + model, keys, fields, length = cache_object + + results = self._get_objects_for_keys(model, keys) + + if fields: + # TODO: optimize this so it's only one get_many call instead of one per select_related field + # XXX: this probably isn't handling depth beyond 1, didn't test even depth of 1 yet + for f in fields: + field = model._meta.get_field(f) + field_results = dict((r.id, r) for r in self._get_objects_for_keys(f.rel.to, [getattr(r, field.db_column) for r in results])) + for r in results: + setattr(r, f.name, field_results[getattr(r, field.db_column)]) + return results + + def _get_objects_for_keys(self, model, keys): + # First we fetch any keys that we can from the cache + results = cache.get_many([get_cache_key_for_pk(model, k) for k in keys]).values() + + # Now we need to compute which keys weren't present in the cache + missing = [k for k in results.iterkeys() if not results[k]] + + # We no longer need to know what the keys were so turn it into a list + results = list(results) + # Query for any missing objects + # TODO: should this only be doing the cache.set if it's from a CachedModel? + # if not then we need to expire it, hook signals? + objects = list(model._default_manager.filter(pk__in=missing)) + for o in objects: + cache.set(o.cache_key, o) + results.extend(objects) + + # Do a simple len() lookup (maybe we shouldn't rely on it returning the right + # number of objects + cnt = len(missing) - len(objects) + if cnt: + raise CacheMissingWarning("%d objects missing in the database" % (cnt,)) + return results + + def _get_data(self): + ck = self._get_cache_key() + if self._result_cache is None or self._cache_clean or self._cache_reset: + if self._cache_clean: + cache.delete(ck) + return + if self._cache_reset: + result_cache = None + else: + result_cache = cache.get(ck) + if result_cache is None: + # We need to lookup the initial table queryset, without related + # fields selected. We then need to loop through each field which + # should be selected and doing another CachedQuerySet() call for + # each set of data. + + # This will allow it to transparently, and recursively, handle + # all calls to the cache. + + # We will use _prepare_queryset_for_cache to store it in the + # the cache, and _get_queryset_from_cache to pull it. + + # Maybe we should override getstate and setstate instead? + + # We first have to remove select_related values from the QuerySet + # as we don't want to pull these in to the dataset as they may already exist + # in memory. + + # TODO: create a function that works w/ our patch and Django trunk which will + # grab the select_related fields for us given X model and (Y list or N depth). + + # TODO: find a clean way to say "is this only matching pks?" if it is we wont + # need to store a result set in memory but we'll need to apply the filters by hand. + qs = QuerySet._clone(QuerySet(), **self.__dict__) + self._result_cache = qs._get_data() + self._cache_reset = False + cache.set(ck, self._prepare_queryset_for_cache(self._result_cache), self.cache_timeout*60) + else: + try: + self._result_cache = self._get_queryset_from_cache(result_cache) + except CacheMissingWarning: + # When an object is missing we reset the cached list. + # TODO: this should be some kind of option at a global and model level. + return self.reset()._get_data() + return FauxCachedQuerySet(self._result_cache) + + def execute(self): + """ + Forces execution on the queryset + """ + self._get_data() + return self + + def get(self, *args, **kwargs): + """ + Performs the SELECT and returns a single object matching the given + keyword arguments. + """ + if self._cache_clean: + clone = self.filter(*args, **kwargs) + if not clone._order_by: + clone._order_by = () + cache.delete(self._get_cache_key()) + else: + return QuerySet.get(self, *args, **kwargs) + + def clean(self): + """ + Removes queryset from the cache upon execution. + """ + return self._clone(_cache_clean=True) + + def count(self): + return QuerySet.count(self) + count = cache.get(self._get_cache_key('count')) + if count is None: + count = int(QuerySet.count(self)) + cache.set(self._get_cache_key('count'), count, self.cache_timeout) + return count + + def cache(self, *args, **kwargs): + """ + Overrides CacheManager's options for this QuerySet. + + -- the key prefix for all cached objects + on this model. [default: db_table] + -- in seconds, the maximum time before data is + invalidated. + -- the key suffix for this cached queryset + useful if you want to cache the same queryset with two expiration + methods. + """ + return self._clone(cache_key_prefix=kwargs.pop('key_prefix', self.cache_key_prefix), cache_timeout=kwargs.pop('timeout', self.cache_timeout), cache_key_name=kwargs.pop('key_name', self.cache_key_name)) + + def reset(self): + """ + Updates the queryset in the cache upon execution. + """ + return self._clone(_cache_reset=True) + + def values(self, *fields): + return self._clone(klass=CachedValuesQuerySet, _fields=fields) + +# need a better way to do this.. (will mix-ins work?) +class CachedValuesQuerySet(CachedQuerySet): + def __init__(self, *args, **kwargs): + super(CachedQuerySet, self).__init__(*args, **kwargs) + # select_related isn't supported in values(). + self._select_related = False + + def iterator(self): + try: + select, sql, params = self._get_sql_clause() + except EmptyResultSet: + raise StopIteration + + # self._fields is a list of field names to fetch. + if self._fields: + #columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields] + if not self._select: + columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields] + else: + columns = [] + for f in self._fields: + if f in [field.name for field in self.model._meta.fields]: + columns.append( self.model._meta.get_field(f, many_to_many=False).column ) + elif not self._select.has_key( f ): + raise FieldDoesNotExist, '%s has no field named %r' % ( self.model._meta.object_name, f ) + + field_names = self._fields + else: # Default to all fields. + columns = [f.column for f in self.model._meta.fields] + field_names = [f.column for f in self.model._meta.fields] + + select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns] + + # Add any additional SELECTs. + if self._select: + select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()]) + + if getattr(self, '_db_use_master', False): + cursor = connection.write_cursor() + else: + cursor = connection.read_cursor() + cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params) + while 1: + rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE) + if not rows: + raise StopIteration + for row in rows: + yield dict(zip(field_names, row)) + + def _clone(self, klass=None, **kwargs): + c = super(CachedValuesQuerySet, self)._clone(klass, **kwargs) + c._fields = self._fields[:] + return c diff --git a/utils/cache/utils.py b/utils/cache/utils.py new file mode 100644 index 000000000..7e950664a --- /dev/null +++ b/utils/cache/utils.py @@ -0,0 +1,2 @@ +def get_cache_key_for_pk(model, pk): + return '%s:%s' % (model._meta.db_table, pk) diff --git a/utils/dateutil/__init__.py b/utils/dateutil/__init__.py new file mode 100644 index 000000000..8b4ac7dc8 --- /dev/null +++ b/utils/dateutil/__init__.py @@ -0,0 +1,9 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" +__version__ = "1.4.1" diff --git a/utils/dateutil/easter.py b/utils/dateutil/easter.py new file mode 100644 index 000000000..d7944104b --- /dev/null +++ b/utils/dateutil/easter.py @@ -0,0 +1,92 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different easter + calculation methods: + + 1 - Original calculation in Julian calendar, valid in + dates after 326 AD + 2 - Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3 - Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + EASTER_JULIAN = 1 + EASTER_ORTHODOX = 2 + EASTER_WESTERN = 3 + + The default method is method 3. + + More about the algorithm may be found at: + + http://users.chariot.net.au/~gmarts/eastalg.htm + + and + + http://www.tondering.dk/claus/calendar.html + + """ + + if not (1 <= method <= 3): + raise ValueError, "invalid method" + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g+15)%30 + j = (y+y//4+i)%7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e+y//100-16-(y//100-16)//4 + else: + # New method + c = y//100 + h = (c-c//4-(8*c+13)//25+19*g+15)%30 + i = h-(h//28)*(1-(h//28)*(29//(h+1))*((21-g)//11)) + j = (y+y//4+i+2-c+c//4)%7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i-j+e + d = 1+(p+27+(p+6)//40)%31 + m = 3+(p+26)//30 + return datetime.date(int(y),int(m),int(d)) + diff --git a/utils/dateutil/parser.py b/utils/dateutil/parser.py new file mode 100644 index 000000000..5d824e411 --- /dev/null +++ b/utils/dateutil/parser.py @@ -0,0 +1,886 @@ +# -*- coding:iso-8859-1 -*- +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +import datetime +import string +import time +import sys +import os + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +import relativedelta +import tz + + +__all__ = ["parse", "parserinfo"] + + +# Some pointers: +# +# http://www.cl.cam.ac.uk/~mgk25/iso-time.html +# http://www.iso.ch/iso/en/prods-services/popstds/datesandtime.html +# http://www.w3.org/TR/NOTE-datetime +# http://ringmaster.arc.nasa.gov/tools/time_formats.html +# http://search.cpan.org/author/MUIR/Time-modules-2003.0211/lib/Time/ParseDate.pm +# http://stein.cshl.org/jade/distrib/docs/java.text.SimpleDateFormat.html + + +class _timelex(object): + + def __init__(self, instream): + if isinstance(instream, basestring): + instream = StringIO(instream) + self.instream = instream + self.wordchars = ('abcdfeghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_' + 'ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ' + 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ') + self.numchars = '0123456789' + self.whitespace = ' \t\r\n' + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + if self.tokenstack: + return self.tokenstack.pop(0) + seenletters = False + token = None + state = None + wordchars = self.wordchars + numchars = self.numchars + whitespace = self.whitespace + while not self.eof: + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + if not nextchar: + self.eof = True + break + elif not state: + token = nextchar + if nextchar in wordchars: + state = 'a' + elif nextchar in numchars: + state = '0' + elif nextchar in whitespace: + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + seenletters = True + if nextchar in wordchars: + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + if nextchar in numchars: + token += nextchar + elif nextchar == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + seenletters = True + if nextchar == '.' or nextchar in wordchars: + token += nextchar + elif nextchar in numchars and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + if nextchar == '.' or nextchar in numchars: + token += nextchar + elif nextchar in wordchars and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + if (state in ('a.', '0.') and + (seenletters or token.count('.') > 1 or token[-1] == '.')): + l = token.split('.') + token = l[0] + for tok in l[1:]: + self.tokenstack.append('.') + if tok: + self.tokenstack.append(tok) + return token + + def __iter__(self): + return self + + def next(self): + token = self.get_token() + if token is None: + raise StopIteration + return token + + def split(cls, s): + return list(cls(s)) + split = classmethod(split) + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (classname, ", ".join(l)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), + ("Wed", "Wednesday"), + ("Thu", "Thursday"), + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z"] + PERTAIN = ["of"] + TZOFFSET = {} + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year//100*100 + + def _convert(self, lst): + dct = {} + for i in range(len(lst)): + v = lst[i] + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + if len(name) >= 3: + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + if len(name) >= 3: + try: + return self._months[name.lower()]+1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + return self.TZOFFSET.get(name) + + def convertyear(self, year): + if year < 100: + year += self._century + if abs(year-self._year) >= 50: + if year < self._year: + year += 100 + else: + year -= 100 + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year) + if res.tzoffset == 0 and not res.tzname or res.tzname == 'Z': + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class parser(object): + + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, + ignoretz=False, tzinfos=None, + **kwargs): + if not default: + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + res = self._parse(timestr, **kwargs) + if res is None: + raise ValueError, "unknown string format" + repl = {} + for attr in ["year", "month", "day", "hour", + "minute", "second", "microsecond"]: + value = getattr(res, attr) + if value is not None: + repl[attr] = value + ret = default.replace(**repl) + if res.weekday is not None and not res.day: + ret = ret+relativedelta.relativedelta(weekday=res.weekday) + if not ignoretz: + if callable(tzinfos) or tzinfos and res.tzname in tzinfos: + if callable(tzinfos): + tzdata = tzinfos(res.tzname, res.tzoffset) + else: + tzdata = tzinfos.get(res.tzname) + if isinstance(tzdata, datetime.tzinfo): + tzinfo = tzdata + elif isinstance(tzdata, basestring): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, int): + tzinfo = tz.tzoffset(res.tzname, tzdata) + else: + raise ValueError, "offset must be tzinfo subclass, " \ + "tz string, or int offset" + ret = ret.replace(tzinfo=tzinfo) + elif res.tzname and res.tzname in time.tzname: + ret = ret.replace(tzinfo=tz.tzlocal()) + elif res.tzoffset == 0: + ret = ret.replace(tzinfo=tz.tzutc()) + elif res.tzoffset: + ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False): + info = self.info + if dayfirst is None: + dayfirst = info.dayfirst + if yearfirst is None: + yearfirst = info.yearfirst + res = self._result() + l = _timelex.split(timestr) + try: + + # year/month/day list + ymd = [] + + # Index of the month string in ymd + mstridx = -1 + + len_l = len(l) + i = 0 + while i < len_l: + + # Check if it's a number + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Token is a number + len_li = len(l[i]) + i += 1 + if (len(ymd) == 3 and len_li in (2, 4) + and (i >= len_l or (l[i] != ':' and + info.hms(l[i]) is None))): + # 19990101T23[59] + s = l[i-1] + res.hour = int(s[:2]) + if len_li == 4: + res.minute = int(s[2:]) + elif len_li == 6 or (len_li > 6 and l[i-1].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = l[i-1] + if not ymd and l[i-1].find('.') == -1: + ymd.append(info.convertyear(int(s[:2]))) + ymd.append(int(s[2:4])) + ymd.append(int(s[4:])) + else: + # 19990101T235959[.59] + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = _parsems(s[4:]) + elif len_li == 8: + # YYYYMMDD + s = l[i-1] + ymd.append(int(s[:4])) + ymd.append(int(s[4:6])) + ymd.append(int(s[6:])) + elif len_li in (12, 14): + # YYYYMMDDhhmm[ss] + s = l[i-1] + ymd.append(int(s[:4])) + ymd.append(int(s[4:6])) + ymd.append(int(s[6:8])) + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + if len_li == 14: + res.second = int(s[12:]) + elif ((i < len_l and info.hms(l[i]) is not None) or + (i+1 < len_l and l[i] == ' ' and + info.hms(l[i+1]) is not None)): + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + if l[i] == ' ': + i += 1 + idx = info.hms(l[i]) + while True: + if idx == 0: + res.hour = int(value) + if value%1: + res.minute = int(60*(value%1)) + elif idx == 1: + res.minute = int(value) + if value%1: + res.second = int(60*(value%1)) + elif idx == 2: + res.second, res.microsecond = \ + _parsems(value_repr) + i += 1 + if i >= len_l or idx == 2: + break + # 12h00 + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + break + else: + i += 1 + idx += 1 + if i < len_l: + newidx = info.hms(l[i]) + if newidx is not None: + idx = newidx + elif i+1 < len_l and l[i] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + i += 1 + value = float(l[i]) + res.minute = int(value) + if value%1: + res.second = int(60*(value%1)) + i += 1 + if i < len_l and l[i] == ':': + res.second, res.microsecond = _parsems(l[i+1]) + i += 2 + elif i < len_l and l[i] in ('-', '/', '.'): + sep = l[i] + ymd.append(int(value)) + i += 1 + if i < len_l and not info.jump(l[i]): + try: + # 01-01[-01] + ymd.append(int(l[i])) + except ValueError: + # 01-Jan[-01] + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + else: + return None + i += 1 + if i < len_l and l[i] == sep: + # We have three members + i += 1 + value = info.month(l[i]) + if value is not None: + ymd.append(value) + mstridx = len(ymd)-1 + assert mstridx == -1 + else: + ymd.append(int(l[i])) + i += 1 + elif i >= len_l or info.jump(l[i]): + if i+1 < len_l and info.ampm(l[i+1]) is not None: + # 12 am + res.hour = int(value) + if res.hour < 12 and info.ampm(l[i+1]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i+1]) == 0: + res.hour = 0 + i += 1 + else: + # Year, month or day + ymd.append(int(value)) + i += 1 + elif info.ampm(l[i]) is not None: + # 12am + res.hour = int(value) + if res.hour < 12 and info.ampm(l[i]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i]) == 0: + res.hour = 0 + i += 1 + elif not fuzzy: + return None + else: + i += 1 + continue + + # Check weekday + value = info.weekday(l[i]) + if value is not None: + res.weekday = value + i += 1 + continue + + # Check month name + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + i += 1 + if i < len_l: + if l[i] in ('-', '/'): + # Jan-01[-99] + sep = l[i] + i += 1 + ymd.append(int(l[i])) + i += 1 + if i < len_l and l[i] == sep: + # Jan-01-99 + i += 1 + ymd.append(int(l[i])) + i += 1 + elif (i+3 < len_l and l[i] == l[i+2] == ' ' + and info.pertain(l[i+1])): + # Jan of 01 + # In this case, 01 is clearly year + try: + value = int(l[i+3]) + except ValueError: + # Wrong guess + pass + else: + # Convert it here to become unambiguous + ymd.append(info.convertyear(value)) + i += 4 + continue + + # Check am/pm + value = info.ampm(l[i]) + if value is not None: + if value == 1 and res.hour < 12: + res.hour += 12 + elif value == 0 and res.hour == 12: + res.hour = 0 + i += 1 + continue + + # Check for a timezone name + if (res.hour is not None and len(l[i]) <= 5 and + res.tzname is None and res.tzoffset is None and + not [x for x in l[i] if x not in string.ascii_uppercase]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + i += 1 + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i < len_l and l[i] in ('+', '-'): + l[i] = ('+', '-')[l[i] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + continue + + # Check for a numbered timezone + if res.hour is not None and l[i] in ('+', '-'): + signal = (-1,1)[l[i] == '+'] + i += 1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + res.tzoffset = int(l[i][:2])*3600+int(l[i][2:])*60 + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + res.tzoffset = int(l[i])*3600+int(l[i+2])*60 + i += 2 + elif len_li <= 2: + # -[0]3 + res.tzoffset = int(l[i][:2])*3600 + else: + return None + i += 1 + res.tzoffset *= signal + + # Look for a timezone name between parenthesis + if (i+3 < len_l and + info.jump(l[i]) and l[i+1] == '(' and l[i+3] == ')' and + 3 <= len(l[i+2]) <= 5 and + not [x for x in l[i+2] + if x not in string.ascii_uppercase]): + # -0300 (BRST) + res.tzname = l[i+2] + i += 4 + continue + + # Check jumps + if not (info.jump(l[i]) or fuzzy): + return None + + i += 1 + + # Process year/month/day + len_ymd = len(ymd) + if len_ymd > 3: + # More than three members!? + return None + elif len_ymd == 1 or (mstridx != -1 and len_ymd == 2): + # One member, or two members with a month string + if mstridx != -1: + res.month = ymd[mstridx] + del ymd[mstridx] + if len_ymd > 1 or mstridx == -1: + if ymd[0] > 31: + res.year = ymd[0] + else: + res.day = ymd[0] + elif len_ymd == 2: + # Two members with numbers + if ymd[0] > 31: + # 99-01 + res.year, res.month = ymd + elif ymd[1] > 31: + # 01-99 + res.month, res.year = ymd + elif dayfirst and ymd[1] <= 12: + # 13-01 + res.day, res.month = ymd + else: + # 01-13 + res.month, res.day = ymd + if len_ymd == 3: + # Three members + if mstridx == 0: + res.month, res.day, res.year = ymd + elif mstridx == 1: + if ymd[0] > 31 or (yearfirst and ymd[2] <= 31): + # 99-Jan-01 + res.year, res.month, res.day = ymd + else: + # 01-Jan-01 + # Give precendence to day-first, since + # two-digit years is usually hand-written. + res.day, res.month, res.year = ymd + elif mstridx == 2: + # WTF!? + if ymd[1] > 31: + # 01-99-Jan + res.day, res.year, res.month = ymd + else: + # 99-01-Jan + res.year, res.day, res.month = ymd + else: + if ymd[0] > 31 or \ + (yearfirst and ymd[1] <= 12 and ymd[2] <= 31): + # 99-01-01 + res.year, res.month, res.day = ymd + elif ymd[0] > 12 or (dayfirst and ymd[1] <= 12): + # 13-01-01 + res.day, res.month, res.year = ymd + else: + # 01-13-01 + res.month, res.day, res.year = ymd + + except (IndexError, ValueError, AssertionError): + return None + + if not info.validate(res): + return None + return res + +DEFAULTPARSER = parser() +def parse(timestr, parserinfo=None, **kwargs): + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = _timelex.split(tzstr) + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + i = j + if (i < len_l and + (l[i] in ('+', '-') or l[i][0] in "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1,-1)[l[i] == '+'] + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, + (int(l[i][:2])*3600+int(l[i][2:])*60)*signal) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i])*3600+int(l[i+2])*60)*signal) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2])*3600*signal) + else: + return None + i += 1 + if res.dstabbr: + break + else: + break + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + i += 2 + if l[i] == '-': + value = int(l[i+1])*-1 + i += 1 + else: + value = int(l[i]) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i])-1)%7 + else: + x.day = int(l[i]) + i += 2 + x.time = int(l[i]) + i += 2 + if i < len_l: + if l[i] in ('-','+'): + signal = (-1,1)[l[i] == "+"] + i += 1 + else: + signal = 1 + res.dstoffset = (res.stdoffset+int(l[i]))*signal + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',','/','J','M', + '.','-',':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + i += 1 + x.month = int(l[i]) + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.weekday = (int(l[i])-1)%7 + else: + # year day (zero based) + x.yday = int(l[i])+1 + + i += 1 + + if i < len_l and l[i] == '/': + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2])*3600+int(l[i][2:])*60) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + x.time = int(l[i])*3600+int(l[i+2])*60 + i += 2 + if i+1 < len_l and l[i+1] == ':': + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2])*3600) + else: + return None + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + return res + + +DEFAULTTZPARSER = _tzparser() +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +def _parsems(value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + +# vim:ts=4:sw=4:et diff --git a/utils/dateutil/relativedelta.py b/utils/dateutil/relativedelta.py new file mode 100644 index 000000000..562a7d3c4 --- /dev/null +++ b/utils/dateutil/relativedelta.py @@ -0,0 +1,432 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +import datetime +import calendar + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + +class relativedelta: + """ +The relativedelta type is based on the specification of the excelent +work done by M.-A. Lemburg in his mx.DateTime extension. However, +notice that this type does *NOT* implement the same algorithm as +his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + +There's two different ways to build a relativedelta instance. The +first one is passing it two date/datetime classes: + + relativedelta(datetime1, datetime2) + +And the other way is to use the following keyword arguments: + + year, month, day, hour, minute, second, microsecond: + Absolute information. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative. + + weekday: + One of the weekday instances (MO, TU, etc). These instances may + receive a parameter N, specifying the Nth weekday, which could + be positive or negative (like MO(+1) or MO(-2). Not specifying + it is the same as specifying +1. You can also use an integer, + where 0=MO. + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + +Here is the behavior of operations with relativedelta: + +1) Calculate the absolute year, using the 'year' argument, or the + original datetime year, if the argument is not present. + +2) Add the relative 'years' argument to the absolute year. + +3) Do steps 1 and 2 for month/months. + +4) Calculate the absolute day, using the 'day' argument, or the + original datetime day, if the argument is not present. Then, + subtract from the day until it fits in the year and month + found after their operations. + +5) Add the relative 'days' argument to the absolute day. Notice + that the 'weeks' argument is multiplied by 7 and added to + 'days'. + +6) Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, + microsecond/microseconds. + +7) If the 'weekday' argument is present, calculate the weekday, + with the given (wday, nth) tuple. wday is the index of the + weekday (0-6, 0=Mon), and nth is the number of weeks to add + forward or backward, depending on its signal. Notice that if + the calculated date is already Monday, for example, using + (0, 1) or (0, -1) won't change the day. + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + if dt1 and dt2: + if not isinstance(dt1, datetime.date) or \ + not isinstance(dt2, datetime.date): + raise TypeError, "relativedelta only diffs datetime/date" + if type(dt1) is not type(dt2): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + months = (dt1.year*12+dt1.month)-(dt2.year*12+dt2.month) + self._set_months(months) + dtm = self.__radd__(dt2) + if dt1 < dt2: + while dt1 > dtm: + months += 1 + self._set_months(months) + dtm = self.__radd__(dt2) + else: + while dt1 < dtm: + months -= 1 + self._set_months(months) + dtm = self.__radd__(dt2) + delta = dt1 - dtm + self.seconds = delta.seconds+delta.days*86400 + self.microseconds = delta.microseconds + else: + self.years = years + self.months = months + self.days = days+weeks*7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if type(weekday) is int: + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31,59,90,120,151,181,212,243,273,304,334,366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = ydays + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError, "invalid year day (%d)" % yday + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = self.microseconds//abs(self.microseconds) + div, mod = divmod(self.microseconds*s, 1000000) + self.microseconds = mod*s + self.seconds += div*s + if abs(self.seconds) > 59: + s = self.seconds//abs(self.seconds) + div, mod = divmod(self.seconds*s, 60) + self.seconds = mod*s + self.minutes += div*s + if abs(self.minutes) > 59: + s = self.minutes//abs(self.minutes) + div, mod = divmod(self.minutes*s, 60) + self.minutes = mod*s + self.hours += div*s + if abs(self.hours) > 23: + s = self.hours//abs(self.hours) + div, mod = divmod(self.hours*s, 24) + self.hours = mod*s + self.days += div*s + if abs(self.months) > 11: + s = self.months//abs(self.months) + div, mod = divmod(self.months*s, 12) + self.months = mod*s + self.years += div*s + if (self.hours or self.minutes or self.seconds or self.microseconds or + self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = self.months//abs(self.months) + div, mod = divmod(self.months*s, 12) + self.months = mod*s + self.years = div*s + else: + self.years = 0 + + def __radd__(self, other): + if not isinstance(other, datetime.date): + raise TypeError, "unsupported type for add operation" + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth)-1)*7 + if nth > 0: + jumpdays += (7-ret.weekday()+weekday)%7 + else: + jumpdays += (ret.weekday()-weekday)%7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __add__(self, other): + if not isinstance(other, relativedelta): + raise TypeError, "unsupported type for add operation" + return relativedelta(years=other.years+self.years, + months=other.months+self.months, + days=other.days+self.days, + hours=other.hours+self.hours, + minutes=other.minutes+self.minutes, + seconds=other.seconds+self.seconds, + microseconds=other.microseconds+self.microseconds, + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=other.second or self.microsecond) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + raise TypeError, "unsupported type for sub operation" + return relativedelta(years=other.years-self.years, + months=other.months-self.months, + days=other.days-self.days, + hours=other.hours-self.hours, + minutes=other.minutes-self.minutes, + seconds=other.seconds-self.seconds, + microseconds=other.microseconds-self.microseconds, + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=other.second or self.microsecond) + + def __neg__(self): + return relativedelta(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __nonzero__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + + def __mul__(self, other): + f = float(other) + return relativedelta(years=self.years*f, + months=self.months*f, + days=self.days*f, + hours=self.hours*f, + minutes=self.minutes*f, + seconds=self.seconds*f, + microseconds=self.microseconds*f, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return False + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + return self.__mul__(1/float(other)) + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("%s=%+d" % (attr, value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + +# vim:ts=4:sw=4:et diff --git a/utils/dateutil/rrule.py b/utils/dateutil/rrule.py new file mode 100644 index 000000000..4c21d2d1d --- /dev/null +++ b/utils/dateutil/rrule.py @@ -0,0 +1,1097 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +import itertools +import datetime +import calendar +import thread +import sys + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30+ + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = range(1,30), range(1,31), range(1,32) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = range(-29,0), range(-30,0), range(-31,0) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0,31,60,91,121,152,182,213,244,274,305,335,366) +M365RANGE = (0,31,59,90,120,151,181,212,243,273,304,334,365) +WDAYMASK = [0,1,2,3,4,5,6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = range(7) + +# Imported on demand. +easter = None +parser = None + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + if n == 0: + raise ValueError, "Can't create weekday with n == 0" + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + +class rrulebase: + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = thread.allocate_lock() + self._cache_gen = self._iter() + self._cache_complete = False + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(gen.next()) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxint, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = gen.next() + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penality. + def count(self): + if self._len is None: + for x in self: pass + return self._len + + def before(self, dt, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def between(self, after, before, inc=False): + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + +class rrule(rrulebase): + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + rrulebase.__init__(self, cache) + global easter + if not dtstart: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + if wkst is None: + self._wkst = calendar.firstweekday() + elif type(wkst) is int: + self._wkst = wkst + else: + self._wkst = wkst.weekday + if bysetpos is None: + self._bysetpos = None + elif type(bysetpos) is int: + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + if not (byweekno or byyearday or bymonthday or + byweekday is not None or byeaster is not None): + if freq == YEARLY: + if not bymonth: + bymonth = dtstart.month + bymonthday = dtstart.day + elif freq == MONTHLY: + bymonthday = dtstart.day + elif freq == WEEKLY: + byweekday = dtstart.weekday() + # bymonth + if not bymonth: + self._bymonth = None + elif type(bymonth) is int: + self._bymonth = (bymonth,) + else: + self._bymonth = tuple(bymonth) + # byyearday + if not byyearday: + self._byyearday = None + elif type(byyearday) is int: + self._byyearday = (byyearday,) + else: + self._byyearday = tuple(byyearday) + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if type(byeaster) is int: + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(byeaster) + else: + self._byeaster = None + # bymonthay + if not bymonthday: + self._bymonthday = () + self._bynmonthday = () + elif type(bymonthday) is int: + if bymonthday < 0: + self._bynmonthday = (bymonthday,) + self._bymonthday = () + else: + self._bymonthday = (bymonthday,) + self._bynmonthday = () + else: + self._bymonthday = tuple([x for x in bymonthday if x > 0]) + self._bynmonthday = tuple([x for x in bymonthday if x < 0]) + # byweekno + if byweekno is None: + self._byweekno = None + elif type(byweekno) is int: + self._byweekno = (byweekno,) + else: + self._byweekno = tuple(byweekno) + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + elif type(byweekday) is int: + self._byweekday = (byweekday,) + self._bynweekday = None + elif hasattr(byweekday, "n"): + if not byweekday.n or freq > MONTHLY: + self._byweekday = (byweekday.weekday,) + self._bynweekday = None + else: + self._bynweekday = ((byweekday.weekday, byweekday.n),) + self._byweekday = None + else: + self._byweekday = [] + self._bynweekday = [] + for wday in byweekday: + if type(wday) is int: + self._byweekday.append(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.append(wday.weekday) + else: + self._bynweekday.append((wday.weekday, wday.n)) + self._byweekday = tuple(self._byweekday) + self._bynweekday = tuple(self._bynweekday) + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = (dtstart.hour,) + else: + self._byhour = None + elif type(byhour) is int: + self._byhour = (byhour,) + else: + self._byhour = tuple(byhour) + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = (dtstart.minute,) + else: + self._byminute = None + elif type(byminute) is int: + self._byminute = (byminute,) + else: + self._byminute = tuple(byminute) + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = (dtstart.second,) + else: + self._bysecond = None + elif type(bysecond) is int: + self._bysecond = (bysecond,) + else: + self._bysecond = tuple(bysecond) + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY:ii.ydayset, + MONTHLY:ii.mdayset, + WEEKLY:ii.wdayset, + DAILY:ii.ddayset, + HOURLY:ii.ddayset, + MINUTELY:ii.ddayset, + SECONDLY:ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY:ii.htimeset, + MINUTELY:ii.mtimeset, + SECONDLY:ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and minute not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday + and -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday + and -ii.nextyearlen+i-ii.yearlen + not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal+i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + while True: + hour += interval + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + if not byhour or hour in byhour: + break + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + while True: + minute += interval + div, mod = divmod(minute, 60) + if div: + minute = mod + hour += div + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + filtered = False + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute)): + break + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399-(hour*3600+minute*60+second)) + //interval)*interval) + while True: + second += self._interval + div, mod = divmod(second, 60) + if div: + second = mod + minute += div + div, mod = divmod(minute, 60) + if div: + minute = mod + hour += div + div, mod = divmod(hour, 24) + if div: + hour = mod + day += div + fixday = True + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + break + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365+calendar.isleap(year) + self.nextyearlen = 365+calendar.isleap(year+1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + #no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst)%7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst)%7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1,1,1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst)%7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen+ + (lyearweekday-rr._wkst)%7)%7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst)%7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and + (month != self.lastmonth or year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday)%7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday)%7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return range(self.yearlen), 0, self.yearlen + + def mdayset(self, year, month, day): + set = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + set[i] = i + return set, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + set = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + set[i] = i + i += 1 + #if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return set, start, i + + def ddayset(self, year, month, day): + set = [None]*self.yearlen + i = datetime.date(year, month, day).toordinal()-self.yearordinal + set[i] = i + return set, i, i+1 + + def htimeset(self, hour, minute, second): + set = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + set.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + set.sort() + return set + + def mtimeset(self, hour, minute, second): + set = [] + rr = self.rrule + for second in rr._bysecond: + set.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + set.sort() + return set + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + + class _genitem: + def __init__(self, genlist, gen): + try: + self.dt = gen() + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def next(self): + try: + self.dt = self.gen() + except StopIteration: + self.genlist.remove(self) + + def __cmp__(self, other): + return cmp(self.dt, other.dt) + + def __init__(self, cache=False): + rrulebase.__init__(self, cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + def rrule(self, rrule): + self._rrule.append(rrule) + + def rdate(self, rdate): + self._rdate.append(rdate) + + def exrule(self, exrule): + self._exrule.append(exrule) + + def exdate(self, exdate): + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate).next) + for gen in [iter(x).next for x in self._rrule]: + self._genitem(rlist, gen) + rlist.sort() + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate).next) + for gen in [iter(x).next for x in self._exrule]: + self._genitem(exlist, gen) + exlist.sort() + lastdt = None + total = 0 + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exlist[0].next() + exlist.sort() + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + ritem.next() + rlist.sort() + self._len = total + +class _rrulestr: + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO":0,"TU":1,"WE":2,"TH":3,"FR":4,"SA":5,"SU":6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError, "invalid until date" + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwarsg): + l = [] + for wday in value.split(','): + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: n = int(n) + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError, "unknown parameter name" + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError, "unknown parameter '%s'" % name + except (KeyError, ValueError): + raise ValueError, "invalid '%s': %s" % (name, value) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + s = s.upper() + if not s.strip(): + raise ValueError, "empty string" + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and + (s.find(':') == -1 or s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError, "empty property name" + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError, "unsupported RRULE parm: "+parm + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError, "unsupported RDATE parm: "+parm + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError, "unsupported EXRULE parm: "+parm + exrulevals.append(value) + elif name == "EXDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError, "unsupported RDATE parm: "+parm + exdatevals.append(value) + elif name == "DTSTART": + for parm in parms: + raise ValueError, "unsupported DTSTART parm: "+parm + if not parser: + from dateutil import parser + dtstart = parser.parse(value, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + raise ValueError, "unsupported property: "+name + if (forceset or len(rrulevals) > 1 or + rdatevals or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + set = rruleset(cache=cache) + for value in rrulevals: + set.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + set.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + set.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + for datestr in value.split(','): + set.exdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + if compatible and dtstart: + set.rdate(dtstart) + return set + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/utils/dateutil/tz.py b/utils/dateutil/tz.py new file mode 100644 index 000000000..0e28d6b33 --- /dev/null +++ b/utils/dateutil/tz.py @@ -0,0 +1,951 @@ +""" +Copyright (c) 2003-2007 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +import datetime +import struct +import time +import sys +import os + +relativedelta = None +parser = None +rrule = None + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"] + +try: + from dateutil.tzwin import tzwin, tzwinlocal +except (ImportError, OSError): + tzwin, tzwinlocal = None, None + +ZERO = datetime.timedelta(0) +EPOCHORDINAL = datetime.datetime.utcfromtimestamp(0).toordinal() + +class tzutc(datetime.tzinfo): + + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def __eq__(self, other): + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class tzoffset(datetime.tzinfo): + + def __init__(self, name, offset): + self._name = name + self._offset = datetime.timedelta(seconds=offset) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + def tzname(self, dt): + return self._name + + def __eq__(self, other): + return (isinstance(other, tzoffset) and + self._offset == other._offset) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + `self._name`, + self._offset.days*86400+self._offset.seconds) + + __reduce__ = object.__reduce__ + +class tzlocal(datetime.tzinfo): + + _std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + _dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + _dst_offset = _std_offset + + def utcoffset(self, dt): + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if self._isdst(dt): + return self._dst_offset-self._std_offset + else: + return ZERO + + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + #>>> import tz, datetime + #>>> t = tz.tzlocal() + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRDT' + #>>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + #'BRST' + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRST' + #>>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + #'BRDT' + #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + #'BRDT' + # + # Here is a more stable implementation: + # + timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second) + return time.localtime(timestamp+time.timezone).tm_isdst + + def __eq__(self, other): + if not isinstance(other, tzlocal): + return False + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + return True + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", "isstd", "isgmt"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, `value`)) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return False + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt) + + def __ne__(self, other): + return not self.__eq__(other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + +class tzfile(datetime.tzinfo): + + # http://www.twinsun.com/tz/tz-link.htm + # ftp://elsie.nci.nih.gov/pub/tz*.tar.gz + + def __init__(self, fileobj): + if isinstance(fileobj, basestring): + self._filename = fileobj + fileobj = open(fileobj) + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = `fileobj` + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + + if fileobj.read(4) != "TZif": + raise ValueError, "magic not found" + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + self._trans_list = struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4)) + else: + self._trans_list = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + self._trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + self._trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt) + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now + if leapcnt: + leap = struct.unpack(">%dl" % (leapcnt*2), + fileobj.read(leapcnt*8)) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # ** Everything has been read ** + + # Build ttinfo list + self._ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + # Round to full-minutes if that's not the case. Python's + # datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 for some information. + gmtoff = (gmtoff+30)//60*60 + tti = _ttinfo() + tti.offset = gmtoff + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + self._ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + trans_idx = [] + for idx in self._trans_idx: + trans_idx.append(self._ttinfo_list[idx]) + self._trans_idx = tuple(trans_idx) + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + self._ttinfo_std = None + self._ttinfo_dst = None + self._ttinfo_before = None + if self._ttinfo_list: + if not self._trans_list: + self._ttinfo_std = self._ttinfo_first = self._ttinfo_list[0] + else: + for i in range(timecnt-1,-1,-1): + tti = self._trans_idx[i] + if not self._ttinfo_std and not tti.isdst: + self._ttinfo_std = tti + elif not self._ttinfo_dst and tti.isdst: + self._ttinfo_dst = tti + if self._ttinfo_std and self._ttinfo_dst: + break + else: + if self._ttinfo_dst and not self._ttinfo_std: + self._ttinfo_std = self._ttinfo_dst + + for tti in self._ttinfo_list: + if not tti.isdst: + self._ttinfo_before = tti + break + else: + self._ttinfo_before = self._ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + laststdoffset = 0 + self._trans_list = list(self._trans_list) + for i in range(len(self._trans_list)): + tti = self._trans_idx[i] + if not tti.isdst: + # This is std time. + self._trans_list[i] += tti.offset + laststdoffset = tti.offset + else: + # This is dst time. Convert to std. + self._trans_list[i] += laststdoffset + self._trans_list = tuple(self._trans_list) + + def _find_ttinfo(self, dt, laststd=0): + timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400 + + dt.hour * 3600 + + dt.minute * 60 + + dt.second) + idx = 0 + for trans in self._trans_list: + if timestamp < trans: + break + idx += 1 + else: + return self._ttinfo_std + if idx == 0: + return self._ttinfo_before + if laststd: + while idx > 0: + tti = self._trans_idx[idx-1] + if not tti.isdst: + return tti + idx -= 1 + else: + return self._ttinfo_std + else: + return self._trans_idx[idx-1] + + def utcoffset(self, dt): + if not self._ttinfo_std: + return ZERO + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if not self._ttinfo_dst: + return ZERO + tti = self._find_ttinfo(dt) + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.delta-self._find_ttinfo(dt, laststd=1).delta + + # An alternative for that would be: + # + # return self._ttinfo_dst.offset-self._ttinfo_std.offset + # + # However, this class stores historical changes in the + # dst offset, so I belive that this wouldn't be the right + # way to implement this. + + def tzname(self, dt): + if not self._ttinfo_std: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return False + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + def __ne__(self, other): + return not self.__eq__(other) + + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._filename`) + + def __reduce__(self): + if not os.path.isfile(self._filename): + raise ValueError, "Unpickable %s class" % self.__class__.__name__ + return (self.__class__, (self._filename,)) + +class tzrange(datetime.tzinfo): + + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + global relativedelta + if not relativedelta: + from dateutil import relativedelta + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset+datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + def utcoffset(self, dt): + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if self._isdst(dt): + return self._dst_offset-self._std_offset + else: + return ZERO + + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def _isdst(self, dt): + if not self._start_delta: + return False + year = datetime.datetime(dt.year,1,1) + start = year+self._start_delta + end = year+self._end_delta + dt = dt.replace(tzinfo=None) + if start < end: + return dt >= start and dt < end + else: + return dt >= start or dt < end + + def __eq__(self, other): + if not isinstance(other, tzrange): + return False + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + +class tzstr(tzrange): + + def __init__(self, s): + global parser + if not parser: + from dateutil import parser + self._s = s + + res = parser._parsetz(s) + if res is None: + raise ValueError, "unknown string format" + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC"): + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + def _delta(self, x, isend=0): + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset-self._std_offset + kwargs["seconds"] -= delta.seconds+delta.days*86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._s`) + +class _tzicalvtzcomp: + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto-self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + +class _tzicalvtz(datetime.tzinfo): + def __init__(self, tzid, comps=[]): + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + dt = dt.replace(tzinfo=None) + try: + return self._cachecomp[self._cachedate.index(dt)] + except ValueError: + pass + lastcomp = None + lastcompdt = None + for comp in self._comps: + if not comp.isdst: + # Handle the extra hour in DST -> STD + compdt = comp.rrule.before(dt-comp.tzoffsetdiff, inc=True) + else: + compdt = comp.rrule.before(dt, inc=True) + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + self._cachedate.insert(0, dt) + self._cachecomp.insert(0, lastcomp) + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + return lastcomp + + def utcoffset(self, dt): + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "" % `self._tzid` + + __reduce__ = object.__reduce__ + +class tzical: + def __init__(self, fileobj): + global rrule + if not rrule: + from dateutil import rrule + + if isinstance(fileobj, basestring): + self._s = fileobj + fileobj = open(fileobj) + elif hasattr(fileobj, "name"): + self._s = fileobj.name + else: + self._s = `fileobj` + + self._vtz = {} + + self._parse_rfc(fileobj.read()) + + def keys(self): + return self._vtz.keys() + + def get(self, tzid=None): + if tzid is None: + keys = self._vtz.keys() + if len(keys) == 0: + raise ValueError, "no timezones defined" + elif len(keys) > 1: + raise ValueError, "more than one timezone available" + tzid = keys[0] + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError, "empty offset" + if s[0] in ('+', '-'): + signal = (-1,+1)[s[0]=='+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2])*3600+int(s[2:])*60)*signal + elif len(s) == 6: + return (int(s[:2])*3600+int(s[2:4])*60+int(s[4:]))*signal + else: + raise ValueError, "invalid offset: "+s + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError, "empty string" + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError, "empty property name" + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError, "unknown component: "+value + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError, \ + "component not closed: "+comptype + if not tzid: + raise ValueError, \ + "mandatory TZID not found" + if not comps: + raise ValueError, \ + "at least one component is needed" + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError, \ + "mandatory DTSTART not found" + if tzoffsetfrom is None: + raise ValueError, \ + "mandatory TZOFFSETFROM not found" + if tzoffsetto is None: + raise ValueError, \ + "mandatory TZOFFSETFROM not found" + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError, \ + "invalid component end: "+value + elif comptype: + if name == "DTSTART": + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError, \ + "unsupported %s parm: %s "%(name, parms[0]) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError, \ + "unsupported TZOFFSETTO parm: "+parms[0] + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError, \ + "unsupported TZNAME parm: "+parms[0] + tzname = value + elif name == "COMMENT": + pass + else: + raise ValueError, "unsupported property: "+name + else: + if name == "TZID": + if parms: + raise ValueError, \ + "unsupported TZID parm: "+parms[0] + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + else: + raise ValueError, "unsupported property: "+name + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, `self._s`) + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", "/usr/lib/zoneinfo", "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + +def gettz(name=None): + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name == ":": + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + if name.startswith(":"): + name = name[:-1] + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ','_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin: + try: + tz = tzwin(name) + except OSError: + pass + if not tz: + from dateutil.zoneinfo import gettz + tz = gettz(name) + if not tz: + for c in name: + # name must have at least one offset to be a tzstr + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = tzutc() + elif name in time.tzname: + tz = tzlocal() + return tz + +# vim:ts=4:sw=4:et diff --git a/utils/dateutil/tzwin.py b/utils/dateutil/tzwin.py new file mode 100644 index 000000000..073e0ff68 --- /dev/null +++ b/utils/dateutil/tzwin.py @@ -0,0 +1,180 @@ +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct +import _winreg + +__author__ = "Jeffrey Harris & Gustavo Niemeyer " + +__all__ = ["tzwin", "tzwinlocal"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + +def _settzkeyname(): + global TZKEYNAME + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + try: + _winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + +_settzkeyname() + +class tzwinbase(datetime.tzinfo): + """tzinfo class based on win32's timezones available in the registry.""" + + def utcoffset(self, dt): + if self._isdst(dt): + return datetime.timedelta(minutes=self._dstoffset) + else: + return datetime.timedelta(minutes=self._stdoffset) + + def dst(self, dt): + if self._isdst(dt): + minutes = self._dstoffset - self._stdoffset + return datetime.timedelta(minutes=minutes) + else: + return datetime.timedelta(0) + + def tzname(self, dt): + if self._isdst(dt): + return self._dstname + else: + return self._stdname + + def list(): + """Return a list of all time zones known to the system.""" + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + tzkey = _winreg.OpenKey(handle, TZKEYNAME) + result = [_winreg.EnumKey(tzkey, i) + for i in range(_winreg.QueryInfoKey(tzkey)[0])] + tzkey.Close() + handle.Close() + return result + list = staticmethod(list) + + def display(self): + return self._display + + def _isdst(self, dt): + dston = picknthweekday(dt.year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + dstoff = picknthweekday(dt.year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + if dston < dstoff: + return dston <= dt.replace(tzinfo=None) < dstoff + else: + return not dstoff <= dt.replace(tzinfo=None) < dston + + +class tzwin(tzwinbase): + + def __init__(self, name): + self._name = name + + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + tzkey = _winreg.OpenKey(handle, "%s\%s" % (TZKEYNAME, name)) + keydict = valuestodict(tzkey) + tzkey.Close() + handle.Close() + + self._stdname = keydict["Std"].encode("iso-8859-1") + self._dstname = keydict["Dlt"].encode("iso-8859-1") + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + self._stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + self._dstoffset = self._stdoffset-tup[2] # + DaylightBias * -1 + + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + + def __init__(self): + + handle = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + + tzlocalkey = _winreg.OpenKey(handle, TZLOCALKEYNAME) + keydict = valuestodict(tzlocalkey) + tzlocalkey.Close() + + self._stdname = keydict["StandardName"].encode("iso-8859-1") + self._dstname = keydict["DaylightName"].encode("iso-8859-1") + + try: + tzkey = _winreg.OpenKey(handle, "%s\%s"%(TZKEYNAME, self._stdname)) + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + tzkey.Close() + except OSError: + self._display = None + + handle.Close() + + self._stdoffset = -keydict["Bias"]-keydict["StandardBias"] + self._dstoffset = self._stdoffset-keydict["DaylightBias"] + + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:6] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:6] + + def __reduce__(self): + return (self.__class__, ()) + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """dayofweek == 0 means Sunday, whichweek 5 means last instance""" + first = datetime.datetime(year, month, 1, hour, minute) + weekdayone = first.replace(day=((dayofweek-first.isoweekday())%7+1)) + for n in xrange(whichweek): + dt = weekdayone+(whichweek-n)*ONEWEEK + if dt.month == month: + return dt + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dict = {} + size = _winreg.QueryInfoKey(key)[1] + for i in range(size): + data = _winreg.EnumValue(key, i) + dict[data[0]] = data[1] + return dict diff --git a/utils/dateutil/zoneinfo/__init__.py b/utils/dateutil/zoneinfo/__init__.py new file mode 100644 index 000000000..9bed6264c --- /dev/null +++ b/utils/dateutil/zoneinfo/__init__.py @@ -0,0 +1,87 @@ +""" +Copyright (c) 2003-2005 Gustavo Niemeyer + +This module offers extensions to the standard python 2.3+ +datetime module. +""" +from dateutil.tz import tzfile +from tarfile import TarFile +import os + +__author__ = "Gustavo Niemeyer " +__license__ = "PSF License" + +__all__ = ["setcachesize", "gettz", "rebuild"] + +CACHE = [] +CACHESIZE = 10 + +class tzfile(tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + +def getzoneinfofile(): + filenames = os.listdir(os.path.join(os.path.dirname(__file__))) + filenames.sort() + filenames.reverse() + for entry in filenames: + if entry.startswith("zoneinfo") and ".tar." in entry: + return os.path.join(os.path.dirname(__file__), entry) + return None + +ZONEINFOFILE = getzoneinfofile() + +del getzoneinfofile + +def setcachesize(size): + global CACHESIZE, CACHE + CACHESIZE = size + del CACHE[size:] + +def gettz(name): + tzinfo = None + if ZONEINFOFILE: + for cachedname, tzinfo in CACHE: + if cachedname == name: + break + else: + tf = TarFile.open(ZONEINFOFILE) + try: + zonefile = tf.extractfile(name) + except KeyError: + tzinfo = None + else: + tzinfo = tzfile(zonefile) + tf.close() + CACHE.insert(0, (name, tzinfo)) + del CACHE[CACHESIZE:] + return tzinfo + +def rebuild(filename, tag=None, format="gz"): + import tempfile, shutil + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + if tag: tag = "-"+tag + targetname = "zoneinfo%s.tar.%s" % (tag, format) + try: + tf = TarFile.open(filename) + for name in tf.getnames(): + if not (name.endswith(".sh") or + name.endswith(".tab") or + name == "leapseconds"): + tf.extract(name, tmpdir) + filepath = os.path.join(tmpdir, name) + os.system("zic -d %s %s" % (zonedir, filepath)) + tf.close() + target = os.path.join(moduledir, targetname) + for entry in os.listdir(moduledir): + if entry.startswith("zoneinfo") and ".tar." in entry: + os.unlink(os.path.join(moduledir, entry)) + tf = TarFile.open(target, "w:%s" % format) + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + tf.close() + finally: + shutil.rmtree(tmpdir) diff --git a/utils/dateutil/zoneinfo/zoneinfo-2008e.tar.gz b/utils/dateutil/zoneinfo/zoneinfo-2008e.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..65e4175f4a4bb008acd62264e3bee1ca9b2c01fa GIT binary patch literal 163209 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⋘MY7B(kDpNCaGsH~1=v&bK#fELA~DkB zLc!pug+}OLX^(XSx?c#D$<(0yB^4ozx5=43Qk&8d%0rGUNH+J2qo|k0V{>bXOCz`P z7*KXyJKSTaV4mtwodMc=;lUIGsm<&hb0G8PY}RX3<8*q zZTsT9{CBGGE?50cEBTsC#6x;72<$GCkzylBv&Of>*B2uf;cAIY@1P=BjOPi0@&XgA z=ns@2j+N)Y}Vl zdvmt~kWLenkO`gzn|W+Av-Y=c{*x=c=v-y$BR$9X!Vu@9QGs@tSbR`r0D4fF)6U0% zNvUzm<*q+3i*AMgVk16qT1}U(KD~J4pNT@=$e$|5oSDpPfv?TH!9E(WK7%SP_U7|l ze9VLSH^FDNjWLK}K8?@eU(CncJk*Sw9C$44FXPpMmLp^(j9jo5616aO8fk@2PNAhn zk&&cyXhah#d1NXRlykcE4d!`34jy{#IfH!~X^wcq{=KtPZvC}=F$FrJ6!z%<0*}EA zwoQr;9-a@ZiH)5eQ;VU zPvuCaZiF_z;;HgVH7PyOYc?2tdE%2=Ao@N%^zlgg>+x3uMJhTE zdh6JnoQ$6tDUDwb}8TXH~p378Eql+klM_fM+xdV41G-^%|c_IMy21OXTzhOL3w(KdgyTz_6PE&u9Ycs@KZ7|bZRBI8%wyjI|UkVaGQyWLy z*T&J|Vsi8`B;uOZ)1~Tw_}aHuRVq-~?4>*MeqVb;FHOi+l#s!Eo8LESedi})EF+X~ zWb+og=q#`$_0LO_;`&j$LOhqD!e9<_MeWeG zBvB5(ztHLH3$c^NTIjyi*+=)d^}yibLL5~)3;NlT?>2v>iB4uLym!exz7Bf{{>zDrY-52ZoFRRXMjV-s}E4h^7PetUcYdTv(=S4 z82++KD?MjqVJD8K#Z@MSv*6E;Ke8E&=n0ONA#Dk)eTA$16wX4)n0%k<->2AIS*2qp z7Ce&pNL=NYa27V1cygwHpJQ|7m5v{=gpwj?E3N5=~}cQjU!^ zS5nesVG$vXXIY9gOoFqh%EYrVDSwGIf2pL&%2G=jZ;q#2CCzOl6VJn>oDysPN=frE ziwIeKE}rr@oW()g+i)Jv;w%#{!laxLyGpnk&&D!^QG1G~jDnk^!_6_^=2&oZ9Jo0i z+#DZnP5?J2f}4}T&B@^A4}O|EQo_w2!p&)<9qHia3~+NMxH&W2oE2`)1~+Gin{&X; zx!~qJaC2U`IUn3y0B$Y>Hy44Mi%C05z|Ezk9bdrBW#Q)XaC1etxiZ{b1#Yfds9Y;S z5-(2@uSycHLlSR95^q5g?|@$GP7?2rUK>IZ4<6=8B#F-;iO(a6FCmGq%#vI=S5Tr* zR1#FQwtj$<##|$FlaK}bm zR?uCtB-bq_sA=OM{0cBHzX*idk(bd+Z6SeW5>z|DWQ-qQOqWAnzJ6Ma&DfNLo!a~@$6DFZcUid<% zKvcu+*=6>_z81<*K}?h9zj30gE1X3>XbDLjTC6<}=5cz1`0#86hO;pE9xu9@*YtT!Z5@f9 zRz$#J8opeh(|1w4n}uU>G{3h^O^Y*X-hocAX>`9X3fL}eBRqAne%&kRz*q~@Z{TOc zqHh82;>|ro-~p6R9PRmS-sVHZzQAS6@=gnp&5y-UK1BObbfI7{L+u&cCGUIg%U=>B zEins|a3tc=0r&Esk?SAzsIg!K${q9aE4}2Rm7*tx6y>+JqyA7q>}sD;jOM|bdzT%C ztSvmX0_{iK5-w=X@j0}YiER@tWs-mI2RJm+ox_lebcZw}r9lgZ9%#4Ye=-)U**Gzp zN1T~1=TJA!4ZZ?hfit2he-0@B!-2h)AiT{&zM(zP2&6hx)NB32AmxOCny8{!R9Dl% zf{6}1xSdKuqdm9^OJC$!_X=#j?{gnz`$qC`qOW|#3ome>&w5tZ$6BVf&=cFx?FF)f zyhG?C$NmrO>H$9kjM)panzoX&#jg}ZXr8ltWV1HIBU-t@3r

    nsLfe{fO&1=1%|-_JhSe@9*!LjqKV$c9xkKAx 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 V5-{>7NBo>pO&&Kgl`>J0`X7o!tu+7u literal 0 HcmV?d00001 diff --git a/utils/diff.py b/utils/diff.py new file mode 100644 index 000000000..bfabf7c5f --- /dev/null +++ b/utils/diff.py @@ -0,0 +1,145 @@ +"""HTML Diff: http://www.aaronsw.com/2002/diff +Rough code, badly documented. Send me comments and patches.""" + +__author__ = 'Aaron Swartz ' +__copyright__ = '(C) 2003 Aaron Swartz. GNU GPL 2.' +__version__ = '0.22' + +import difflib, string + +class HTMLDiff: + + def __init__(self, a, b): + self.original = a + self.revised = b + self.diffText = None + + self.num_delete = 0 + self.num_insert = 0 + self.num_replace = 0 + + self._textDiff(a, b) + + def getDiff(self): + return self.diffText + + def getStats(self): + return (self.num_insert, self.num_delete, self.num_replace) + + def isTag(self, x): return x[0] == "<" and x[-1] == ">" + + def _textDiff(self, a, b): + """Takes in strings a and b and returns a human-readable HTML diff.""" + + out = [] + a, b = self.html2list(a), self.html2list(b) + s = difflib.SequenceMatcher(None, a, b) + + for e in s.get_opcodes(): + if e[0] == "replace": + self.num_replace += 1 + out.append(''+''.join(a[e[1]:e[2]]) + ''+''.join(b[e[3]:e[4]])+"") + elif e[0] == "delete": + self.num_delete += 1 + out.append(''+ ''.join(a[e[1]:e[2]]) + "") + elif e[0] == "insert": + self.num_insert += 1 + out.append(''+''.join(b[e[3]:e[4]]) + "") + elif e[0] == "equal": + out.append(''.join(b[e[3]:e[4]])) + else: + raise "Um, something's broken. I didn't expect a '" + `e[0]` + "'." + + self.diffText = ''.join(out) + + def html2list(self, x, b=0): + mode = 'char' + cur = '' + out = [] + for c in x: + if mode == 'tag': + if c == '>': + if b: cur += ']' + else: cur += c + out.append(cur); cur = ''; mode = 'char' + else: cur += c + elif mode == 'char': + if c == '<': + out.append(cur) + if b: cur = '[' + else: cur = c + mode = 'tag' + elif c in string.whitespace: out.append(cur+c); cur = '' + else: cur += c + out.append(cur) + return filter(lambda x: x is not '', out) + + +from difflib import SequenceMatcher + +class TextDiff: + """Create diffs of text snippets.""" + + def __init__(self, source, target): + """source = source text - target = target text""" + self.nl = "" + self.delTag = "%s" + self.insTag = "%s" + self.source = source.replace("\n", "\n%s" % self.nl).split() + self.target = target.replace("\n", "\n%s" % self.nl).split() + self.deleteCount, self.insertCount, self.replaceCount = 0, 0, 0 + self.diffText = None + self.cruncher = SequenceMatcher(None, self.source, + self.target) + self._buildDiff() + + def _buildDiff(self): + """Create a tagged diff.""" + outputList = [] + for tag, alo, ahi, blo, bhi in self.cruncher.get_opcodes(): + if tag == 'replace': + # Text replaced = deletion + insertion + outputList.append(self.delTag % " ".join(self.source[alo:ahi])) + outputList.append(self.insTag % " ".join(self.target[blo:bhi])) + self.replaceCount += 1 + elif tag == 'delete': + # Text deleted + outputList.append(self.delTag % " ".join(self.source[alo:ahi])) + self.deleteCount += 1 + elif tag == 'insert': + # Text inserted + outputList.append(self.insTag % " ".join(self.target[blo:bhi])) + self.insertCount += 1 + elif tag == 'equal': + # No change + outputList.append(" ".join(self.source[alo:ahi])) + diffText = " ".join(outputList) + diffText = " ".join(diffText.split()) + self.diffText = diffText.replace(self.nl, "\n") + + def getStats(self): + "Return a tuple of stat values." + return (self.insertCount, self.deleteCount, self.replaceCount) + + def getDiff(self): + "Return the diff text." + return self.diffText + +if __name__ == "__main__": + ch1 = """Today, pythonistas raised in the shadows of the Cold + War assumes responsibilities in a world warmed by the sunshine of + spam and freedom""" + + ch2 = """Today, pythonistas raised in the shadows of the Cold + War assumes responsibilities in a world warmed by the sunshine of + spam and freedom.""" + + differ = TextDiff(ch1, ch2) + + print "%i insertion(s), %i deletion(s), %i replacement(s)" % differ.getStats() + print differ.getDiff() + + html_differ = HTMLDiff(ch1, ch2) + print html_differ.getDiff() + print html_differ.getStats() + \ No newline at end of file diff --git a/utils/django_command_extensions/LICENSE b/utils/django_command_extensions/LICENSE new file mode 100644 index 000000000..e2e53d56b --- /dev/null +++ b/utils/django_command_extensions/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2007 Michael Trier + +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. \ No newline at end of file diff --git a/utils/django_command_extensions/MANIFEST.in b/utils/django_command_extensions/MANIFEST.in new file mode 100644 index 000000000..c2b0b7ecb --- /dev/null +++ b/utils/django_command_extensions/MANIFEST.in @@ -0,0 +1,3 @@ +recursive-include django_extensions/conf *.tmpl +recursive-include django_extensions/templates *.html +recursive-include django_extensions/media * diff --git a/utils/django_command_extensions/__init__.py b/utils/django_command_extensions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/build/lib/django_extensions/__init__.py b/utils/django_command_extensions/build/lib/django_extensions/__init__.py new file mode 100644 index 000000000..bf4897d3f --- /dev/null +++ b/utils/django_command_extensions/build/lib/django_extensions/__init__.py @@ -0,0 +1,10 @@ + +VERSION = (0, 4, 'pre') + +# Dynamically calculate the version based on VERSION tuple +if len(VERSION)>2 and VERSION[2] is not None: + str_version = "%d.%d_%s" % VERSION[:3] +else: + str_version = "%d.%d" % VERSION[:2] + +__version__ = str_version diff --git a/utils/django_command_extensions/build/lib/django_extensions/admin/__init__.py b/utils/django_command_extensions/build/lib/django_extensions/admin/__init__.py new file mode 100644 index 000000000..fe45c2355 --- /dev/null +++ b/utils/django_command_extensions/build/lib/django_extensions/admin/__init__.py @@ -0,0 +1,122 @@ +# +# Autocomplete feature for admin panel +# +# Most of the code has been written by Jannis Leidel and was updated a bit +# for django_extensions. +# http://jannisleidel.com/2008/11/autocomplete-form-widget-foreignkey-model-fields/ +# +# to_string_function, Satchmo adaptation and some comments added by emes +# (Michal Salaban) +# +import operator +from django.http import HttpResponse, HttpResponseNotFound +from django.contrib import admin +from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import ugettext as _ +from django.utils.text import get_text_list + +from django_extensions.admin.widgets import ForeignKeySearchInput + +class ForeignKeyAutocompleteAdmin(admin.ModelAdmin): + """Admin class for models using the autocomplete feature. + + There are two additional fields: + - related_search_fields: defines fields of managed model that + have to be represented by autocomplete input, together with + a list of target model fields that are searched for + input string, e.g.: + + related_search_fields = { + 'author': ('first_name', 'email'), + } + + - related_string_functions: contains optional functions which + take target model instance as only argument and return string + representation. By default __unicode__() method of target + object is used. + """ + + related_search_fields = {} + related_string_functions = {} + + def __call__(self, request, url): + if url is None: + pass + elif url == 'foreignkey_autocomplete': + return self.foreignkey_autocomplete(request) + return super(ForeignKeyAutocompleteAdmin, self).__call__(request, url) + + def foreignkey_autocomplete(self, request): + """ + Searches in the fields of the given related model and returns the + result as a simple string to be used by the jQuery Autocomplete plugin + """ + query = request.GET.get('q', None) + app_label = request.GET.get('app_label', None) + model_name = request.GET.get('model_name', None) + search_fields = request.GET.get('search_fields', None) + object_pk = request.GET.get('object_pk', None) + try: + to_string_function = self.related_string_functions[model_name] + except KeyError: + to_string_function = lambda x: x.__unicode__() + if search_fields and app_label and model_name and (query or object_pk): + def construct_search(field_name): + # use different lookup methods depending on the notation + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + model = models.get_model(app_label, model_name) + queryset = model._default_manager.all() + data = '' + if query: + for bit in query.split(): + or_queries = [models.Q(**{construct_search( + smart_str(field_name)): smart_str(bit)}) + for field_name in search_fields.split(',')] + other_qs = QuerySet(model) + other_qs.dup_select_related(queryset) + other_qs = other_qs.filter(reduce(operator.or_, or_queries)) + queryset = queryset & other_qs + data = ''.join([u'%s|%s\n' % ( + to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except: + pass + else: + data = to_string_function(obj) + return HttpResponse(data) + return HttpResponseNotFound() + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + return _('Use the left field to do %s lookups in the fields %s' % + (model_name, get_text_list(searchable_fields, _('and')))) + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): + """ + Overrides the default widget for Foreignkey fields if they are + specified in the related_search_fields class attribute. + """ + if (isinstance(db_field, models.ForeignKey) and + db_field.name in self.related_search_fields): + model_name = db_field.rel.to._meta.object_name + help_text = self.get_help_text(db_field.name, model_name) + if kwargs.get('help_text'): + help_text = u'%s %s' % (kwargs['help_text'], help_text) + kwargs['widget'] = ForeignKeySearchInput(db_field.rel, + self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super(ForeignKeyAutocompleteAdmin, + self).formfield_for_dbfield(db_field, **kwargs) diff --git a/utils/django_command_extensions/build/lib/django_extensions/admin/widgets.py b/utils/django_command_extensions/build/lib/django_extensions/admin/widgets.py new file mode 100644 index 000000000..77c53874e --- /dev/null +++ b/utils/django_command_extensions/build/lib/django_extensions/admin/widgets.py @@ -0,0 +1,76 @@ +from django import forms +from django.conf import settings +from django.utils.safestring import mark_safe +from django.utils.text import truncate_words +from django.template.loader import render_to_string +from django.contrib.admin.widgets import ForeignKeyRawIdWidget + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + """ + A Widget for displaying ForeignKeys in an autocomplete search input + instead in a box. + """ + # Set in subclass to render the widget with a different template + widget_template = None + # Set this to the patch of the search view + search_path = '../foreignkey_autocomplete/' + + class Media: + css = { + 'all': ('django_extensions/css/jquery.autocomplete.css',) + } + js = ( + 'django_extensions/js/jquery.js', + 'django_extensions/js/jquery.bgiframe.min.js', + 'django_extensions/js/jquery.ajaxQueue.js', + 'django_extensions/js/jquery.autocomplete.js', + ) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + obj = self.rel.to._default_manager.get(**{key: value}) + return truncate_words(obj, 14) + + def __init__(self, rel, search_fields, attrs=None): + self.search_fields = search_fields + super(ForeignKeySearchInput, self).__init__(rel, attrs) + + def render(self, name, value, attrs=None): + if attrs is None: + attrs = {} + output = [super(ForeignKeySearchInput, self).render(name, value, attrs)] + opts = self.rel.to._meta + app_label = opts.app_label + model_name = opts.object_name.lower() + related_url = '../../../%s/%s/' % (app_label, model_name) + params = self.url_parameters() + if params: + url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) + else: + url = '' + if not attrs.has_key('class'): + attrs['class'] = 'vForeignKeyRawIdAdminField' + # Call the TextInput render method directly to have more control + output = [forms.TextInput.render(self, name, value, attrs)] + if value: + label = self.label_for_value(value) + else: + label = u'' + context = { + 'url': url, + 'related_url': related_url, + 'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX, + 'search_path': self.search_path, + 'search_fields': ','.join(self.search_fields), + 'model_name': model_name, + 'app_label': app_label, + 'label': label, + 'name': name, + } + output.append(render_to_string(self.widget_template or ( + 'django_extensions/widgets/%s/%s/foreignkey_searchinput.html' % (app_label, model_name), + 'django_extensions/widgets/%s/foreignkey_searchinput.html' % app_label, + 'django_extensions/widgets/foreignkey_searchinput.html', + ), context)) + output.reverse() + return mark_safe(u''.join(output)) diff --git a/utils/django_command_extensions/django_extensions/conf/app_template/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/app_template/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/app_template/forms.py.tmpl b/utils/django_command_extensions/django_extensions/conf/app_template/forms.py.tmpl new file mode 100644 index 000000000..6b477f9e4 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/app_template/forms.py.tmpl @@ -0,0 +1,3 @@ +from django import forms + +# place form definition here \ No newline at end of file diff --git a/utils/django_command_extensions/django_extensions/conf/app_template/models.py.tmpl b/utils/django_command_extensions/django_extensions/conf/app_template/models.py.tmpl new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/app_template/models.py.tmpl @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/utils/django_command_extensions/django_extensions/conf/app_template/urls.py.tmpl b/utils/django_command_extensions/django_extensions/conf/app_template/urls.py.tmpl new file mode 100644 index 000000000..5d79a9fdb --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/app_template/urls.py.tmpl @@ -0,0 +1,3 @@ +from django.conf.urls.defaults import * + +# place app url patterns here \ No newline at end of file diff --git a/utils/django_command_extensions/django_extensions/conf/app_template/views.py.tmpl b/utils/django_command_extensions/django_extensions/conf/app_template/views.py.tmpl new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/app_template/views.py.tmpl @@ -0,0 +1 @@ +# Create your views here. diff --git a/utils/django_command_extensions/django_extensions/conf/command_template/management/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/command_template/management/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/command_template/management/commands/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/command_template/management/commands/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/command_template/management/commands/sample.py.tmpl b/utils/django_command_extensions/django_extensions/conf/command_template/management/commands/sample.py.tmpl new file mode 100644 index 000000000..eb9df1b9a --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/command_template/management/commands/sample.py.tmpl @@ -0,0 +1,7 @@ +from django.core.management.base import {{ base_command }} + +class Command({{ base_command }}): + help = "My shiny new management command." + + def {{ handle_method }}: + raise NotImplementedError() \ No newline at end of file diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/sample.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/sample.py.tmpl new file mode 100644 index 000000000..d84800b18 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/sample.py.tmpl @@ -0,0 +1,8 @@ +from django_extensions.management.jobs import BaseJob + +class Job(BaseJob): + help = "My sample job." + + def execute(self): + # executing empty sample job + pass diff --git a/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl b/utils/django_command_extensions/django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/db/__init__.py b/utils/django_command_extensions/django_extensions/db/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/db/fields/__init__.py b/utils/django_command_extensions/django_extensions/db/fields/__init__.py new file mode 100644 index 000000000..24ee4dc33 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/db/fields/__init__.py @@ -0,0 +1,199 @@ +""" +Django Extensions additional model fields +""" + +from django.template.defaultfilters import slugify +from django.db.models import DateTimeField, CharField, SlugField +import datetime +import re + +try: + import uuid +except ImportError: + from django_extensions.utils import uuid + +class AutoSlugField(SlugField): + """ AutoSlugField + + By default, sets editable=False, blank=True. + + Required arguments: + + populate_from + Specifies which field the slug is populated from. + + Optional arguments: + + separator + Defines the used separator (default: '-') + + overwrite + If set to True, overwrites the slug on every save (default: False) + + Inspired by SmileyChris' Unique Slugify snippet: + http://www.djangosnippets.org/snippets/690/ + """ + def __init__(self, *args, **kwargs): + kwargs.setdefault('blank', True) + kwargs.setdefault('editable', False) + + populate_from = kwargs.pop('populate_from', None) + if populate_from is None: + raise ValueError("missing 'populate_from' argument") + else: + self._populate_from = populate_from + self.separator = kwargs.pop('separator', u'-') + self.overwrite = kwargs.pop('overwrite', False) + super(AutoSlugField, self).__init__(*args, **kwargs) + + def _slug_strip(self, value): + """ + Cleans up a slug by removing slug separator characters that occur at + the beginning or end of a slug. + + If an alternate separator is used, it will also replace any instances + of the default '-' separator with the new separator. + """ + re_sep = '(?:-|%s)' % re.escape(self.separator) + value = re.sub('%s+' % re_sep, self.separator, value) + return re.sub(r'^%s+|%s+$' % (re_sep, re_sep), '', value) + + def create_slug(self, model_instance, add): + # get fields to populate from and slug field to set + populate_field = model_instance._meta.get_field(self._populate_from) + slug_field = model_instance._meta.get_field(self.attname) + if add or self.overwrite: + # slugify the original field content and set next step to 2 + slug = slugify(getattr(model_instance, populate_field.attname)) + next = 2 + else: + # get slug from the current model instance and calculate next + # step from its number, clean-up + slug = self._slug_strip(getattr(model_instance, self.attname)) + next = slug.split(self.separator)[-1] + if next.isdigit(): + slug = self.separator.join(slug.split(self.separator)[:-1]) + next = int(next) + else: + next = 2 + + # strip slug depending on max_length attribute of the slug field + # and clean-up + slug_len = slug_field.max_length + if slug_len: + slug = slug[:slug_len] + slug = self._slug_strip(slug) + original_slug = slug + + # exclude the current model instance from the queryset used in finding + # the next valid slug + queryset = model_instance.__class__._default_manager.all() + if model_instance.pk: + queryset = queryset.exclude(pk=model_instance.pk) + + # increases the number while searching for the next valid slug + # depending on the given slug, clean-up + while not slug or queryset.filter(**{self.attname: slug}): + slug = original_slug + end = '%s%s' % (self.separator, next) + end_len = len(end) + if slug_len and len(slug)+end_len > slug_len: + slug = slug[:slug_len-end_len] + slug = self._slug_strip(slug) + slug = '%s%s' % (slug, end) + next += 1 + return slug + + def pre_save(self, model_instance, add): + value = unicode(self.create_slug(model_instance, add)) + setattr(model_instance, self.attname, value) + return value + + def get_internal_type(self): + return "SlugField" + +class CreationDateTimeField(DateTimeField): + """ CreationDateTimeField + + By default, sets editable=False, blank=True, default=datetime.now + """ + + def __init__(self, *args, **kwargs): + kwargs.setdefault('editable', False) + kwargs.setdefault('blank', True) + kwargs.setdefault('default', datetime.datetime.now) + DateTimeField.__init__(self, *args, **kwargs) + + def get_internal_type(self): + return "DateTimeField" + +class ModificationDateTimeField(CreationDateTimeField): + """ ModificationDateTimeField + + By default, sets editable=False, blank=True, default=datetime.now + + Sets value to datetime.now() on each save of the model. + """ + + def pre_save(self, model, add): + value = datetime.datetime.now() + setattr(model, self.attname, value) + return value + + def get_internal_type(self): + return "DateTimeField" + +class UUIDVersionError(Exception): + pass + +class UUIDField(CharField): + """ UUIDField + + By default uses UUID version 1 (generate from host ID, sequence number and current time) + + The field support all uuid versions which are natively supported by the uuid python module. + For more information see: http://docs.python.org/lib/module-uuid.html + """ + + def __init__(self, verbose_name=None, name=None, auto=True, version=1, node=None, clock_seq=None, namespace=None, **kwargs): + kwargs['max_length'] = 36 + if auto: + kwargs['blank'] = True + kwargs.setdefault('editable', False) + self.auto = auto + self.version = version + if version==1: + self.node, self.clock_seq = node, clock_seq + elif version==3 or version==5: + self.namespace, self.name = namespace, name + CharField.__init__(self, verbose_name, name, **kwargs) + + def get_internal_type(self): + return CharField.__name__ + + def create_uuid(self): + if not self.version or self.version==4: + return uuid.uuid4() + elif self.version==1: + return uuid.uuid1(self.node, self.clock_seq) + elif self.version==2: + raise UUIDVersionError("UUID version 2 is not supported.") + elif self.version==3: + return uuid.uuid3(self.namespace, self.name) + elif self.version==5: + return uuid.uuid5(self.namespace, self.name) + else: + raise UUIDVersionError("UUID version %s is not valid." % self.version) + + def pre_save(self, model_instance, add): + if self.auto and add: + value = unicode(self.create_uuid()) + setattr(model_instance, self.attname, value) + return value + else: + value = super(UUIDField, self).pre_save(model_instance, add) + if self.auto and not value: + value = unicode(self.create_uuid()) + setattr(model_instance, self.attname, value) + return value + diff --git a/utils/django_command_extensions/django_extensions/db/models.py b/utils/django_command_extensions/django_extensions/db/models.py new file mode 100644 index 000000000..2aad09d19 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/db/models.py @@ -0,0 +1,17 @@ +""" +Django Extensions abstract base model classes. +""" + +from django.db import models +from django_extensions.db.fields import ModificationDateTimeField, CreationDateTimeField + +class TimeStampedModel(models.Model): + """ TimeStampedModel + An abstract base class model that provides self-managed "created" and + "modified" fields. + """ + created = CreationDateTimeField() + modified = ModificationDateTimeField() + + class Meta: + abstract = True diff --git a/utils/django_command_extensions/django_extensions/jobs/__init__.py b/utils/django_command_extensions/django_extensions/jobs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/jobs/daily/__init__.py b/utils/django_command_extensions/django_extensions/jobs/daily/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/jobs/daily/cache_cleanup.py b/utils/django_command_extensions/django_extensions/jobs/daily/cache_cleanup.py new file mode 100644 index 000000000..68bff5e85 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/jobs/daily/cache_cleanup.py @@ -0,0 +1,23 @@ +""" +Daily cleanup job. + +Can be run as a cronjob to clean out old data from the database (only expired +sessions at the moment). +""" + +from django_extensions.management.jobs import DailyJob + +class Job(DailyJob): + help = "Cache (db) cleanup Job" + + def execute(self): + from django.conf import settings + import os + + if settings.CACHE_BACKEND.startswith('db://'): + os.environ['TZ'] = settings.TIME_ZONE + table_name = settings.CACHE_BACKEND[5:] + cursor = connection.cursor() + cursor.execute("DELETE FROM %s WHERE %s < UTC_TIMESTAMP()" % \ + (backend.quote_name(table_name), backend.quote_name('expires'))) + transaction.commit_unless_managed() diff --git a/utils/django_command_extensions/django_extensions/jobs/daily/daily_cleanup.py b/utils/django_command_extensions/django_extensions/jobs/daily/daily_cleanup.py new file mode 100644 index 000000000..b85d08f2e --- /dev/null +++ b/utils/django_command_extensions/django_extensions/jobs/daily/daily_cleanup.py @@ -0,0 +1,22 @@ +""" +Daily cleanup job. + +Can be run as a cronjob to clean out old data from the database (only expired +sessions at the moment). +""" + +from django_extensions.management.jobs import DailyJob + +class Job(DailyJob): + help = "Django Daily Cleanup Job" + + def execute(self): + # TODO: Remove the old way when Django 1.0 lands + try: + # old way of doing cleanup (pre r7844 in svn) + from django.bin.daily_cleanup import clean_up + clean_up() + except: + # new way using the management.call_command function + from django.core import management + management.call_command("cleanup") diff --git a/utils/django_command_extensions/django_extensions/jobs/hourly/__init__.py b/utils/django_command_extensions/django_extensions/jobs/hourly/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/jobs/monthly/__init__.py b/utils/django_command_extensions/django_extensions/jobs/monthly/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/jobs/weekly/__init__.py b/utils/django_command_extensions/django_extensions/jobs/weekly/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/management/__init__.py b/utils/django_command_extensions/django_extensions/management/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/management/color.py b/utils/django_command_extensions/django_extensions/management/color.py new file mode 100644 index 000000000..f3de0518a --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/color.py @@ -0,0 +1,13 @@ +""" +Sets up the terminal color scheme. +""" + +from django.core.management import color +from django.utils import termcolors + +def color_style(): + style = color.color_style() + style.URL = termcolors.make_style(fg='green', opts=('bold',)) + style.MODULE = termcolors.make_style(fg='yellow') + style.MODULE_NAME = termcolors.make_style(opts=('bold',)) + return style diff --git a/utils/django_command_extensions/django_extensions/management/commands/__init__.py b/utils/django_command_extensions/django_extensions/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/django_command_extensions/django_extensions/management/commands/clean_pyc.py b/utils/django_command_extensions/django_extensions/management/commands/clean_pyc.py new file mode 100644 index 000000000..d01a87269 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/clean_pyc.py @@ -0,0 +1,41 @@ +from django.core.management.base import NoArgsCommand +from django_extensions.management.utils import get_project_root +from random import choice +from optparse import make_option +from os.path import join as _j +import os + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--optimize', '-o', '-O', action='store_true', dest='optimize', + help='Remove optimized python bytecode files'), + make_option('--path', '-p', action='store', dest='path', + help='Specify path to recurse into'), + ) + help = "Removes all python bytecode compiled files from the project." + + requires_model_validation = False + + def handle_noargs(self, **options): + project_root = options.get("path", None) + if not project_root: + project_root = get_project_root() + exts = options.get("optimize", False) and [".pyc", ".pyo"] or [".pyc"] + verbose = int(options.get("verbosity", 1))>1 + + for root, dirs, files in os.walk(project_root): + for file in files: + ext = os.path.splitext(file)[1] + if ext in exts: + full_path = _j(root, file) + if verbose: + print full_path + os.remove(full_path) + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/compile_pyc.py b/utils/django_command_extensions/django_extensions/management/commands/compile_pyc.py new file mode 100644 index 000000000..05296a152 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/compile_pyc.py @@ -0,0 +1,40 @@ +from django.core.management.base import NoArgsCommand +from django_extensions.management.utils import get_project_root +from random import choice +from optparse import make_option +from os.path import join as _j +import py_compile +import os + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--path', '-p', action='store', dest='path', + help='Specify path to recurse into'), + ) + help = "Compile python bytecode files for the project." + + requires_model_validation = False + + def handle_noargs(self, **options): + project_root = options.get("path", None) + if not project_root: + project_root = get_project_root() + verbose = int(options.get("verbosity", 1))>1 + + for root, dirs, files in os.walk(project_root): + for file in files: + ext = os.path.splitext(file)[1] + if ext==".py": + full_path = _j(root, file) + if verbose: + print "%sc" % full_path + py_compile.compile(full_path) + + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/create_app.py b/utils/django_command_extensions/django_extensions/management/commands/create_app.py new file mode 100644 index 000000000..3fcf7e605 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/create_app.py @@ -0,0 +1,72 @@ +import os +import re +import django_extensions +from django.core.management.base import CommandError, LabelCommand, _make_writeable +from optparse import make_option + +class Command(LabelCommand): + option_list = LabelCommand.option_list + ( + make_option('--template', '-t', action='store', dest='app_template', + help='The path to the app template'), + make_option('--parent_path', '-p', action='store', dest='parent_path', + help='The parent path of the app to be created'), + ) + + help = ("Creates a Django application directory structure based on the specified template directory.") + args = "[appname]" + label = 'application name' + + requires_model_validation = False + can_import_settings = True + + def handle_label(self, label, **options): + project_dir = os.getcwd() + project_name = os.path.split(project_dir)[-1] + app_name =label + app_template = options.get('app_template') or os.path.join(django_extensions.__path__[0], 'conf', 'app_template') + app_dir = os.path.join(options.get('parent_path') or project_dir, app_name) + + if not os.path.exists(app_template): + raise CommandError("The template path, %r, does not exist." % app_template) + + if not re.search(r'^\w+$', label): + raise CommandError("%r is not a valid application name. Please use only numbers, letters and underscores." % label) + try: + os.makedirs(app_dir) + except OSError, e: + raise CommandError(e) + + copy_template(app_template, app_dir, project_name, app_name) + +def copy_template(app_template, copy_to, project_name, app_name): + """copies the specified template directory to the copy_to location""" + import shutil + + # walks the template structure and copies it + for d, subdirs, files in os.walk(app_template): + relative_dir = d[len(app_template)+1:] + if relative_dir and not os.path.exists(os.path.join(copy_to, relative_dir)): + os.mkdir(os.path.join(copy_to, relative_dir)) + for i, subdir in enumerate(subdirs): + if subdir.startswith('.'): + del subdirs[i] + for f in files: + if f.endswith('.pyc') or f.startswith('.DS_Store'): + continue + path_old = os.path.join(d, f) + path_new = os.path.join(copy_to, relative_dir, f.replace('app_name', app_name)) + if os.path.exists(path_new): + path_new = os.path.join(copy_to, relative_dir, f) + if os.path.exists(path_new): + continue + path_new = path_new.rstrip(".tmpl") + fp_old = open(path_old, 'r') + fp_new = open(path_new, 'w') + fp_new.write(fp_old.read().replace('{{ app_name }}', app_name).replace('{{ project_name }}', project_name)) + fp_old.close() + fp_new.close() + try: + shutil.copymode(path_old, path_new) + _make_writeable(path_new) + except OSError: + sys.stderr.write(style.NOTICE("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new)) diff --git a/utils/django_command_extensions/django_extensions/management/commands/create_command.py b/utils/django_command_extensions/django_extensions/management/commands/create_command.py new file mode 100644 index 000000000..367799204 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/create_command.py @@ -0,0 +1,78 @@ +import os +from django.core.management.base import CommandError, AppCommand, _make_writeable +from optparse import make_option + +class Command(AppCommand): + option_list = AppCommand.option_list + ( + make_option('--name', '-n', action='store', dest='command_name', default='sample', + help='The name to use for the management command'), + make_option('--base', '-b', action='store', dest='base_command', default='Base', + help='The base class used for implementation of this command. Should be one of Base, App, Label, or NoArgs'), + ) + + help = ("Creates a Django management command directory structure for the given app name" + " in the current directory.") + args = "[appname]" + label = 'application name' + + requires_model_validation = False + # Can't import settings during this command, because they haven't + # necessarily been created. + can_import_settings = True + + def handle_app(self, app, **options): + directory = os.getcwd() + app_name = app.__name__.split('.')[-2] + project_dir = os.path.join(directory, app_name) + if not os.path.exists(project_dir): + try: + os.mkdir(project_dir) + except OSError, e: + raise CommandError(e) + + copy_template('command_template', project_dir, options.get('command_name'), '%sCommand' % options.get('base_command')) + +def copy_template(template_name, copy_to, command_name, base_command): + """copies the specified template directory to the copy_to location""" + import django_extensions + import re + import shutil + + template_dir = os.path.join(django_extensions.__path__[0], 'conf', template_name) + + handle_method = "handle(self, *args, **options)" + if base_command == 'AppCommand': + handle_method = "handle_app(self, app, **options)" + elif base_command == 'LabelCommand': + handle_method = "handle_label(self, label, **options)" + elif base_command == 'NoArgsCommand': + handle_method = "handle_noargs(self, **options)" + + # walks the template structure and copies it + for d, subdirs, files in os.walk(template_dir): + relative_dir = d[len(template_dir)+1:] + if relative_dir and not os.path.exists(os.path.join(copy_to, relative_dir)): + os.mkdir(os.path.join(copy_to, relative_dir)) + for i, subdir in enumerate(subdirs): + if subdir.startswith('.'): + del subdirs[i] + for f in files: + if f.endswith('.pyc') or f.startswith('.DS_Store'): + continue + path_old = os.path.join(d, f) + path_new = os.path.join(copy_to, relative_dir, f.replace('sample', command_name)) + if os.path.exists(path_new): + path_new = os.path.join(copy_to, relative_dir, f) + if os.path.exists(path_new): + continue + path_new = path_new.rstrip(".tmpl") + fp_old = open(path_old, 'r') + fp_new = open(path_new, 'w') + fp_new.write(fp_old.read().replace('{{ command_name }}', command_name).replace('{{ base_command }}', base_command).replace('{{ handle_method }}', handle_method)) + fp_old.close() + fp_new.close() + try: + shutil.copymode(path_old, path_new) + _make_writeable(path_new) + except OSError: + sys.stderr.write(style.NOTICE("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new)) diff --git a/utils/django_command_extensions/django_extensions/management/commands/create_jobs.py b/utils/django_command_extensions/django_extensions/management/commands/create_jobs.py new file mode 100644 index 000000000..16ece2c92 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/create_jobs.py @@ -0,0 +1,54 @@ +import os +import sys +from django.core.management.base import CommandError, AppCommand, _make_writeable + +class Command(AppCommand): + help = ("Creates a Django jobs command directory structure for the given app name in the current directory.") + args = "[appname]" + label = 'application name' + + requires_model_validation = False + # Can't import settings during this command, because they haven't + # necessarily been created. + can_import_settings = True + + def handle_app(self, app, **options): + app_dir = os.path.dirname(app.__file__) + copy_template('jobs_template', app_dir) + +def copy_template(template_name, copy_to): + """copies the specified template directory to the copy_to location""" + import django_extensions + import re + import shutil + + template_dir = os.path.join(django_extensions.__path__[0], 'conf', template_name) + + # walks the template structure and copies it + for d, subdirs, files in os.walk(template_dir): + relative_dir = d[len(template_dir)+1:] + if relative_dir and not os.path.exists(os.path.join(copy_to, relative_dir)): + os.mkdir(os.path.join(copy_to, relative_dir)) + for i, subdir in enumerate(subdirs): + if subdir.startswith('.'): + del subdirs[i] + for f in files: + if f.endswith('.pyc') or f.startswith('.DS_Store'): + continue + path_old = os.path.join(d, f) + path_new = os.path.join(copy_to, relative_dir, f) + if os.path.exists(path_new): + path_new = os.path.join(copy_to, relative_dir, f) + if os.path.exists(path_new): + continue + path_new = path_new.rstrip(".tmpl") + fp_old = open(path_old, 'r') + fp_new = open(path_new, 'w') + fp_new.write(fp_old.read()) + fp_old.close() + fp_new.close() + try: + shutil.copymode(path_old, path_new) + _make_writeable(path_new) + except OSError: + sys.stderr.write(style.NOTICE("Notice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.\n" % path_new)) diff --git a/utils/django_command_extensions/django_extensions/management/commands/describe_form.py b/utils/django_command_extensions/django_extensions/management/commands/describe_form.py new file mode 100644 index 000000000..4aa34919c --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/describe_form.py @@ -0,0 +1,64 @@ +from django.core.management.base import LabelCommand, CommandError +from django.utils.encoding import force_unicode + +class Command(LabelCommand): + help = "Outputs the specified model as a form definition to the shell." + args = "[app.model]" + label = 'application name and model name' + + requires_model_validation = True + can_import_settings = True + + def handle_label(self, label, **options): + return describe_form(label) + + +def describe_form(label, fields=None): + """ + Returns a string describing a form based on the model + """ + from django.db.models.loading import get_model + try: + app_name, model_name = label.split('.')[-2:] + except (IndexError, ValueError): + raise CommandError("Need application and model name in the form: appname.model") + model = get_model(app_name, model_name) + + opts = model._meta + field_list = [] + for f in opts.fields + opts.many_to_many: + if not f.editable: + continue + if fields and not f.name in fields: + continue + formfield = f.formfield() + if not '__dict__' in dir(formfield): + continue + attrs = {} + valid_fields = ['required', 'initial', 'max_length', 'min_length', 'max_value', 'min_value', 'max_digits', 'decimal_places', 'choices', 'help_text', 'label'] + for k,v in formfield.__dict__.items(): + if k in valid_fields and v != None: + # ignore defaults, to minimize verbosity + if k == 'required' and v: + continue + if k == 'help_text' and not v: + continue + if k == 'widget': + attrs[k] = v.__class__ + elif k in ['help_text', 'label']: + attrs[k] = force_unicode(v).strip() + else: + attrs[k] = v + + params = ', '.join(['%s=%r' % (k, v) for k, v in attrs.items()]) + field_list.append(' %(field_name)s = forms.%(field_type)s(%(params)s)' % { 'field_name': f.name, + 'field_type': formfield.__class__.__name__, + 'params': params }) + + return ''' +from django import forms +from %(app_name)s.models import %(object_name)s + +class %(object_name)sForm(forms.Form): +%(field_list)s +''' % { 'app_name': app_name, 'object_name': opts.object_name, 'field_list': '\n'.join(field_list) } diff --git a/utils/django_command_extensions/django_extensions/management/commands/dumpscript.py b/utils/django_command_extensions/django_extensions/management/commands/dumpscript.py new file mode 100644 index 000000000..703978607 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/dumpscript.py @@ -0,0 +1,515 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +""" + Title: Dumpscript management command + Project: Hardytools (queryset-refactor version) + Author: Will Hardy (http://willhardy.com.au) + Date: June 2008 + Usage: python manage.py dumpscript appname > scripts/scriptname.py + $Revision: 217 $ + +Description: + Generates a Python script that will repopulate the database using objects. + The advantage of this approach is that it is easy to understand, and more + flexible than directly populating the database, or using XML. + + * It also allows for new defaults to take effect and only transfers what is + needed. + * If a new database schema has a NEW ATTRIBUTE, it is simply not + populated (using a default value will make the transition smooth :) + * If a new database schema REMOVES AN ATTRIBUTE, it is simply ignored + and the data moves across safely (I'm assuming we don't want this + attribute anymore. + * Problems may only occur if there is a new model and is now a required + ForeignKey for an existing model. But this is easy to fix by editing the + populate script :) + +Improvements: + See TODOs and FIXMEs scattered throughout :-) + +""" + +import sys +from django.db import models +from django.core.exceptions import ObjectDoesNotExist +from django.core.management.base import BaseCommand +from django.utils.encoding import smart_unicode, force_unicode +from django.contrib.contenttypes.models import ContentType + +class Command(BaseCommand): + help = 'Dumps the data as a customised python script.' + args = '[appname ...]' + + def handle(self, *app_labels, **options): + + # Get the models we want to export + models = get_models(app_labels) + + # A dictionary is created to keep track of all the processed objects, + # so that foreign key references can be made using python variable names. + # This variable "context" will be passed around like the town bicycle. + context = {} + + # Create a dumpscript object and let it format itself as a string + print Script(models=models, context=context) + + +def get_models(app_labels): + """ Gets a list of models for the given app labels, with some exceptions. + TODO: If a required model is referenced, it should also be included. + Or at least discovered with a get_or_create() call. + """ + + from django.db.models import get_app, get_apps, get_model + from django.db.models import get_models as get_all_models + + # These models are not to be output, e.g. because they can be generated automatically + # TODO: This should be "appname.modelname" string + from django.contrib.contenttypes.models import ContentType + EXCLUDED_MODELS = (ContentType, ) + + models = [] + + # If no app labels are given, return all + if not app_labels: + for app in get_apps(): + models += [ m for m in get_all_models(app) if m not in EXCLUDED_MODELS ] + + # Get all relevant apps + for app_label in app_labels: + # If a specific model is mentioned, get only that model + if "." in app_label: + app_label, model_name = app_label.split(".", 1) + models.append(get_model(app_label, model_name)) + # Get all models for a given app + else: + models += [ m for m in get_all_models(get_app(app_label)) if m not in EXCLUDED_MODELS ] + + return models + + + +class Code(object): + """ A snippet of python script. + This keeps track of import statements and can be output to a string. + In the future, other features such as custom indentation might be included + in this class. + """ + + def __init__(self): + self.imports = {} + self.indent = -1 + + def __str__(self): + """ Returns a string representation of this script. + """ + if self.imports: + sys.stderr.write(repr(self.import_lines)) + return flatten_blocks([""] + self.import_lines + [""] + self.lines, num_indents=self.indent) + else: + return flatten_blocks(self.lines, num_indents=self.indent) + + def get_import_lines(self): + """ Takes the stored imports and converts them to lines + """ + if self.imports: + return [ "from %s import %s" % (value, key) for key, value in self.imports.items() ] + else: + return [] + import_lines = property(get_import_lines) + + +class ModelCode(Code): + " Produces a python script that can recreate data for a given model class. " + + def __init__(self, model, context={}): + self.model = model + self.context = context + self.instances = [] + self.indent = 0 + + def get_imports(self): + """ Returns a dictionary of import statements, with the variable being + defined as the key. + """ + return { self.model.__name__: smart_unicode(self.model.__module__) } + imports = property(get_imports) + + def get_lines(self): + """ Returns a list of lists or strings, representing the code body. + Each list is a block, each string is a statement. + """ + code = [] + + for counter, item in enumerate(self.model.objects.all()): + instance = InstanceCode(instance=item, id=counter+1, context=self.context) + self.instances.append(instance) + if instance.waiting_list: + code += instance.lines + + # After each instance has been processed, try again. + # This allows self referencing fields to work. + for instance in self.instances: + if instance.waiting_list: + code += instance.lines + + return code + + lines = property(get_lines) + + +class InstanceCode(Code): + " Produces a python script that can recreate data for a given model instance. " + + def __init__(self, instance, id, context={}): + """ We need the instance in question and an id """ + + self.instance = instance + self.model = self.instance.__class__ + self.context = context + self.variable_name = "%s_%s" % (self.instance._meta.db_table, id) + self.skip_me = None + self.instantiated = False + + self.indent = 0 + self.imports = {} + + self.waiting_list = list(self.model._meta.fields) + + self.many_to_many_waiting_list = {} + for field in self.model._meta.many_to_many: + self.many_to_many_waiting_list[field] = list(getattr(self.instance, field.name).all()) + + def get_lines(self, force=False): + """ Returns a list of lists or strings, representing the code body. + Each list is a block, each string is a statement. + + force (True or False): if an attribute object cannot be included, + it is usually skipped to be processed later. With 'force' set, there + will be no waiting: a get_or_create() call is written instead. + """ + code_lines = [] + + # Don't return anything if this is an instance that should be skipped + if self.skip(): + return [] + + # Initialise our new object + # e.g. model_name_35 = Model() + code_lines += self.instantiate() + + # Add each field + # e.g. model_name_35.field_one = 1034.91 + # model_name_35.field_two = "text" + code_lines += self.get_waiting_list() + + if force: + # TODO: Check that M2M are not affected + code_lines += self.get_waiting_list(force=force) + + # Print the save command for our new object + # e.g. model_name_35.save() + if code_lines: + code_lines.append("%s.save()\n" % (self.variable_name)) + + code_lines += self.get_many_to_many_lines(force=force) + + return code_lines + lines = property(get_lines) + + def skip(self): + """ Determine whether or not this object should be skipped. + If this model is a parent of a single subclassed instance, skip it. + The subclassed instance will create this parent instance for us. + + TODO: Allow the user to force its creation? + """ + + if self.skip_me is not None: + return self.skip_me + + try: + # Django trunk since r7722 uses CollectedObjects instead of dict + from django.db.models.query import CollectedObjects + sub_objects = CollectedObjects() + except ImportError: + # previous versions don't have CollectedObjects + sub_objects = {} + self.instance._collect_sub_objects(sub_objects) + if reduce(lambda x, y: x+y, [self.model in so._meta.parents for so in sub_objects.keys()]) == 1: + pk_name = self.instance._meta.pk.name + key = '%s_%s' % (self.model.__name__, getattr(self.instance, pk_name)) + self.context[key] = None + self.skip_me = True + else: + self.skip_me = False + + return self.skip_me + + def instantiate(self): + " Write lines for instantiation " + # e.g. model_name_35 = Model() + code_lines = [] + + if not self.instantiated: + code_lines.append("%s = %s()" % (self.variable_name, self.model.__name__)) + self.instantiated = True + + # Store our variable name for future foreign key references + pk_name = self.instance._meta.pk.name + key = '%s_%s' % (self.model.__name__, getattr(self.instance, pk_name)) + self.context[key] = self.variable_name + + return code_lines + + + def get_waiting_list(self, force=False): + " Add lines for any waiting fields that can be completed now. " + + code_lines = [] + + # Process normal fields + for field in list(self.waiting_list): + try: + # Find the value, add the line, remove from waiting list and move on + value = get_attribute_value(self.instance, field, self.context, force=force) + code_lines.append('%s.%s = %s' % (self.variable_name, field.name, value)) + self.waiting_list.remove(field) + except SkipValue, e: + # Remove from the waiting list and move on + self.waiting_list.remove(field) + continue + except DoLater, e: + # Move on, maybe next time + continue + + + return code_lines + + + def get_many_to_many_lines(self, force=False): + """ Generates lines that define many to many relations for this instance. """ + + lines = [] + + for field, rel_items in self.many_to_many_waiting_list.items(): + for rel_item in list(rel_items): + try: + pk_name = rel_item._meta.pk.name + key = '%s_%s' % (rel_item.__class__.__name__, getattr(rel_item, pk_name)) + value = "%s" % self.context[key] + lines.append('%s.%s.add(%s)' % (self.variable_name, field.name, value)) + self.many_to_many_waiting_list[field].remove(rel_item) + except KeyError: + if force: + value = "%s.objects.get(%s=%s)" % (rel_item._meta.object_name, pk_name, getattr(rel_item, pk_name)) + lines.append('%s.%s.add(%s)' % (self.variable_name, field.name, value)) + self.many_to_many_waiting_list[field].remove(rel_item) + + if lines: + lines.append("") + + return lines + + +class Script(Code): + " Produces a complete python script that can recreate data for the given apps. " + + def __init__(self, models, context={}): + self.models = models + self.context = context + + self.indent = -1 + self.imports = {} + + def get_lines(self): + """ Returns a list of lists or strings, representing the code body. + Each list is a block, each string is a statement. + """ + code = [ self.FILE_HEADER.strip() ] + + # Queue and process the required models + for model_class in queue_models(self.models, context=self.context): + sys.stderr.write('Processing model: %s\n' % model_class.model.__name__) + code.append(model_class.import_lines) + code.append("") + code.append(model_class.lines) + + # Process left over foreign keys from cyclic models + for model in self.models: + sys.stderr.write('Re-processing model: %s\n' % model.model.__name__) + for instance in model.instances: + if instance.waiting_list or instance.many_to_many_waiting_list: + code.append(instance.get_lines(force=True)) + + return code + + lines = property(get_lines) + + # A user-friendly file header + FILE_HEADER = """ + +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# This file has been automatically generated, changes may be lost if you +# go and generate it again. It was generated with the following command: +# %s + +import datetime +from decimal import Decimal +from django.contrib.contenttypes.models import ContentType + +def run(): + +""" % " ".join(sys.argv) + + + +# HELPER FUNCTIONS +#------------------------------------------------------------------------------- + +def flatten_blocks(lines, num_indents=-1): + """ Takes a list (block) or string (statement) and flattens it into a string + with indentation. + """ + + # The standard indent is four spaces + INDENTATION = " " * 4 + + if not lines: + return "" + + # If this is a string, add the indentation and finish here + if isinstance(lines, basestring): + return INDENTATION * num_indents + lines + + # If this is not a string, join the lines and recurse + return "\n".join([ flatten_blocks(line, num_indents+1) for line in lines ]) + + + + +def get_attribute_value(item, field, context, force=False): + """ Gets a string version of the given attribute's value, like repr() might. """ + + # Find the value of the field, catching any database issues + try: + value = getattr(item, field.name) + except ObjectDoesNotExist: + raise SkipValue('Could not find object for %s.%s, ignoring.\n' % (item.__class__.__name__, field.name)) + + # AutoField: We don't include the auto fields, they'll be automatically recreated + if isinstance(field, models.AutoField): + raise SkipValue() + + # Some databases (eg MySQL) might store boolean values as 0/1, this needs to be cast as a bool + elif isinstance(field, models.BooleanField) and value is not None: + return repr(bool(value)) + + # Post file-storage-refactor, repr() on File/ImageFields no longer returns the path + elif isinstance(field, models.FileField): + return repr(force_unicode(value)) + + # ForeignKey fields, link directly using our stored python variable name + elif isinstance(field, models.ForeignKey) and value is not None: + + # Special case for contenttype foreign keys: no need to output any + # content types in this script, as they can be generated again + # automatically. + # NB: Not sure if "is" will always work + if field.rel.to is ContentType: + return 'ContentType.objects.get(app_label="%s", model="%s")' % (value.app_label, value.model) + + # Generate an identifier (key) for this foreign object + pk_name = value._meta.pk.name + key = '%s_%s' % (value.__class__.__name__, getattr(value, pk_name)) + + if key in context: + variable_name = context[key] + # If the context value is set to None, this should be skipped. + # This identifies models that have been skipped (inheritance) + if variable_name is None: + raise SkipValue() + # Return the variable name listed in the context + return "%s" % variable_name + elif force: + return "%s.objects.get(%s=%s)" % (value._meta.object_name, pk_name, getattr(value, pk_name)) + else: + raise DoLater('(FK) %s.%s\n' % (item.__class__.__name__, field.name)) + + + # A normal field (e.g. a python built-in) + else: + return repr(value) + +def queue_models(models, context): + """ Works an an appropriate ordering for the models. + This isn't essential, but makes the script look nicer because + more instances can be defined on their first try. + """ + + # Max number of cycles allowed before we call it an infinite loop. + MAX_CYCLES = 5 + + model_queue = [] + number_remaining_models = len(models) + allowed_cycles = MAX_CYCLES + + while number_remaining_models > 0: + previous_number_remaining_models = number_remaining_models + + model = models.pop(0) + + # If the model is ready to be processed, add it to the list + if check_dependencies(model, model_queue): + model_class = ModelCode(model=model, context=context) + model_queue.append(model_class) + + # Otherwise put the model back at the end of the list + else: + models.append(model) + + # Check for infinite loops. + # This means there is a cyclic foreign key structure + # That cannot be resolved by re-ordering + number_remaining_models = len(models) + if number_remaining_models == previous_number_remaining_models: + allowed_cycles -= 1 + if allowed_cycles <= 0: + # Add the remaining models, but do not remove them from the model list + missing_models = [ ModelCode(model=m, context=context) for m in models ] + model_queue += missing_models + # Replace the models with the model class objects + # (sure, this is a little bit of hackery) + models[:] = missing_models + break + else: + allowed_cycles = MAX_CYCLES + + return model_queue + + +def check_dependencies(model, model_queue): + " Check that all the depenedencies for this model are already in the queue. " + + # A list of allowed links: existing fields, itself and the special case ContentType + allowed_links = [ m.model.__name__ for m in model_queue ] + [model.__name__, 'ContentType'] + + # For each ForeignKey or ManyToMany field, check that a link is possible + for field in model._meta.fields + model._meta.many_to_many: + if field.rel and field.rel.to.__name__ not in allowed_links: + return False + + return True + + + +# EXCEPTIONS +#------------------------------------------------------------------------------- + +class SkipValue(Exception): + """ Value could not be parsed or should simply be skipped. """ + +class DoLater(Exception): + """ Value could not be parsed or should simply be skipped. """ diff --git a/utils/django_command_extensions/django_extensions/management/commands/export_emails.py b/utils/django_command_extensions/django_extensions/management/commands/export_emails.py new file mode 100644 index 000000000..c95b82400 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/export_emails.py @@ -0,0 +1,114 @@ +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth.models import User, Group +from optparse import make_option +from sys import stdout +from csv import writer + +FORMATS = [ + 'address', + 'google', + 'outlook', + 'linkedin', + 'vcard', +] + +def full_name(first_name, last_name, username, **extra): + name = u" ".join(n for n in [first_name, last_name] if n) + if not name: return username + return name + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--group', '-g', action='store', dest='group', default=None, + help='Limit to users which are part of the supplied group name'), + make_option('--format', '-f', action='store', dest='format', default=FORMATS[0], + help="output format. May be one of '" + "', '".join(FORMATS) + "'."), + ) + + help = ("Export user email address list in one of a number of formats.") + args = "[output file]" + label = 'filename to save to' + + requires_model_validation = True + can_import_settings = True + encoding = 'utf-8' # RED_FLAG: add as an option -DougN + + def handle(self, *args, **options): + if len(args) > 1: + raise CommandError("extra arguments supplied") + group = options['group'] + if group and not Group.objects.filter(name=group).count()==1: + names = u"', '".join(g['name'] for g in Group.objects.values('name')).encode('utf-8') + if names: names = "'" + names + "'." + raise CommandError("Unknown group '" + group + "'. Valid group names are: " + names) + if len(args) and args[0] != '-': + outfile = file(args[0], 'w') + else: + outfile = stdout + + qs = User.objects.all().order_by('last_name', 'first_name', 'username', 'email') + if group: qs = qs.filter(group__name=group).distinct() + qs = qs.values('last_name', 'first_name', 'username', 'email') + getattr(self, options['format'])(qs, outfile) + + def address(self, qs, out): + """simple single entry per line in the format of: + "full name" ; + """ + out.write(u"\n".join(u'"%s" <%s>;' % (full_name(**ent), ent['email']) + for ent in qs).encode(self.encoding)) + out.write("\n") + + def google(self, qs, out): + """CSV format suitable for importing into google GMail + """ + csvf = writer(out) + csvf.writerow(['Name', 'Email']) + for ent in qs: + csvf.writerow([full_name(**ent).encode(self.encoding), + ent['email'].encode(self.encoding)]) + + def outlook(self, qs, out): + """CSV format suitable for importing into outlook + """ + csvf = writer(out) + columns = ['Name','E-mail Address','Notes','E-mail 2 Address','E-mail 3 Address', + 'Mobile Phone','Pager','Company','Job Title','Home Phone','Home Phone 2', + 'Home Fax','Home Address','Business Phone','Business Phone 2', + 'Business Fax','Business Address','Other Phone','Other Fax','Other Address'] + csvf.writerow(columns) + empty = [''] * (len(columns) - 2) + for ent in qs: + csvf.writerow([full_name(**ent).encode(self.encoding), + ent['email'].encode(self.encoding)] + empty) + + def linkedin(self, qs, out): + """CSV format suitable for importing into linkedin Groups. + perfect for pre-approving members of a linkedin group. + """ + csvf = writer(out) + csvf.writerow(['First Name', 'Last Name', 'Email']) + for ent in qs: + csvf.writerow([ent['first_name'].encode(self.encoding), + ent['last_name'].encode(self.encoding), + ent['email'].encode(self.encoding)]) + + def vcard(self, qs, out): + try: + import vobject + except ImportError: + print self.style.ERROR_OUTPUT("Please install python-vobject to use the vcard export format.") + import sys + sys.exit(1) + for ent in qs: + card = vobject.vCard() + card.add('fn').value = full_name(**ent) + if not ent['last_name'] and not ent['first_name']: + # fallback to fullname, if both first and lastname are not declared + card.add('n').value = vobject.vcard.Name(full_name(**ent)) + else: + card.add('n').value = vobject.vcard.Name(ent['last_name'], ent['first_name']) + emailpart = card.add('email') + emailpart.value = ent['email'] + emailpart.type_param = 'INTERNET' + out.write(card.serialize().encode(self.encoding)) diff --git a/utils/django_command_extensions/django_extensions/management/commands/generate_secret_key.py b/utils/django_command_extensions/django_extensions/management/commands/generate_secret_key.py new file mode 100644 index 000000000..e4a494d6e --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/generate_secret_key.py @@ -0,0 +1,10 @@ +from random import choice +from django.core.management.base import NoArgsCommand + +class Command(NoArgsCommand): + help = "Generates a new SECRET_KEY that can be used in a project settings file." + + requires_model_validation = False + + def handle_noargs(self, **options): + return ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]) diff --git a/utils/django_command_extensions/django_extensions/management/commands/graph_models.py b/utils/django_command_extensions/django_extensions/management/commands/graph_models.py new file mode 100644 index 000000000..aa72af1f4 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/graph_models.py @@ -0,0 +1,60 @@ +from django.core.management.base import BaseCommand, CommandError +from optparse import make_option +from django_extensions.management.modelviz import generate_dot + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--disable-fields', '-d', action='store_true', dest='disable_fields', + help='Do not show the class member fields'), + make_option('--group-models', '-g', action='store_true', dest='group_models', + help='Group models together respective to there application'), + make_option('--all-applications', '-a', action='store_true', dest='all_applications', + help='Automaticly include all applications from INSTALLED_APPS'), + make_option('--output', '-o', action='store', dest='outputfile', + help='Render output file. Type of output dependend on file extensions. Use png or jpg to render graph to image.'), + make_option('--layout', '-l', action='store', dest='layout', default='dot', + help='Layout to be used by GraphViz for visualization. Layouts: circo dot fdp neato nop nop1 nop2 twopi'), + ) + + help = ("Creates a GraphViz dot file for the specified app names. You can pass multiple app names and they will all be combined into a single model. Output is usually directed to a dot file.") + args = "[appname]" + label = 'application name' + + requires_model_validation = True + can_import_settings = True + + def handle(self, *args, **options): + if len(args) < 1 and not options['all_applications']: + raise CommandError("need one or more arguments for appname") + + dotdata = generate_dot(args, **options) + if options['outputfile']: + self.render_output(dotdata, **options) + else: + self.print_output(dotdata) + + def print_output(self, dotdata): + print dotdata + + def render_output(self, dotdata, **kwargs): + try: + import pygraphviz + except ImportError, e: + raise CommandError("need pygraphviz python module ( apt-get install python-pygraphviz )") + + vizdata = ' '.join(dotdata.split("\n")).strip() + version = pygraphviz.__version__.rstrip("-svn") + try: + if [int(v) for v in version.split('.')]<(0,36): + # HACK around old/broken AGraph before version 0.36 (ubuntu ships with this old version) + import tempfile + tmpfile = tempfile.NamedTemporaryFile() + tmpfile.write(vizdata) + tmpfile.seek(0) + vizdata = tmpfile.name + except ValueError: + pass + + graph = pygraphviz.AGraph(vizdata) + graph.layout(prog=kwargs['layout']) + graph.draw(kwargs['outputfile']) diff --git a/utils/django_command_extensions/django_extensions/management/commands/mail_debug.py b/utils/django_command_extensions/django_extensions/management/commands/mail_debug.py new file mode 100644 index 000000000..78532dfeb --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/mail_debug.py @@ -0,0 +1,41 @@ +from django.core.management.base import BaseCommand +import sys +import smtpd +import asyncore + +class Command(BaseCommand): + help = "Starts a test mail server for development." + args = '[optional port number or ippaddr:port]' + + requires_model_validation = False + + def handle(self, addrport='', *args, **options): + if args: + raise CommandError('Usage is runserver %s' % self.args) + if not addrport: + addr = '' + port = '1025' + else: + try: + addr, port = addrport.split(':') + except ValueError: + addr, port = '', addrport + if not addr: + addr = '127.0.0.1' + + if not port.isdigit(): + raise CommandError("%r is not a valid port number." % port) + else: + port = int(port) + + quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' + + def inner_run(): + print "Now accepting mail at %s:%s" % (addr, port) + server = smtpd.DebuggingServer((addr,port), None) + asyncore.loop() + + try: + inner_run() + except KeyboardInterrupt: + pass diff --git a/utils/django_command_extensions/django_extensions/management/commands/passwd.py b/utils/django_command_extensions/django_extensions/management/commands/passwd.py new file mode 100644 index 000000000..8296f92fc --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/passwd.py @@ -0,0 +1,37 @@ +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth.models import User +import getpass + +class Command(BaseCommand): + help = "Clone of the UNIX program ``passwd'', for django.contrib.auth." + + requires_model_validation = False + + def handle(self, *args, **options): + if len(args) > 1: + raise CommandError("need exactly one or zero arguments for username") + + if args: + username, = args + else: + username = getpass.getuser() + + try: + u = User.objects.get(username=username) + except User.DoesNotExist: + raise CommandError("user %s does not exist" % username) + + print "Changing password for user", u.username + p1 = p2 = "" + while "" in (p1, p2) or p1 != p2: + p1 = getpass.getpass() + p2 = getpass.getpass("Password (again): ") + if p1 != p2: + print "Passwords do not match, try again" + elif "" in (p1, p2): + raise CommandError("aborted") + + u.set_password(p1) + u.save() + + return "Password changed successfully for user", u.username diff --git a/utils/django_command_extensions/django_extensions/management/commands/print_user_for_session.py b/utils/django_command_extensions/django_extensions/management/commands/print_user_for_session.py new file mode 100644 index 000000000..6c8fda8f7 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/print_user_for_session.py @@ -0,0 +1,49 @@ +from django.core.management.base import BaseCommand, CommandError +from django.contrib.auth.models import User +from django.contrib.sessions.models import Session +import re + +SESSION_RE = re.compile("^[0-9a-f]{20,40}$") + +class Command(BaseCommand): + help = ("print the user information for the provided session key. " + "this is very helpful when trying to track down the person who " + "experienced a site crash.") + args = "session_key" + label = 'session key for the user' + + requires_model_validation = True + can_import_settings = True + + def handle(self, *args, **options): + if len(args) > 1: + raise CommandError("extra arguments supplied") + if len(args) < 1: + raise CommandError("session_key argument missing") + key = args[0].lower() + if not SESSION_RE.match(key): + raise CommandError("malformed session key") + try: + session = Session.objects.get(pk=key) + except Session.DoesNotExist: + print "Session Key does not exist. Expired?" + return + + data = session.get_decoded() + print 'Session to Expire:', session.expire_date + print 'Raw Data:', data + uid = data.get('_auth_user_id', None) + if uid is None: + print 'No user associated with session' + return + print "User id:", uid + try: + user = User.objects.get(pk=uid) + except User.DoesNotExist: + print "No user associated with that id." + return + for key in ['username', 'email', 'first_name', 'last_name']: + print key+': ' + getattr(user, key) + + + diff --git a/utils/django_command_extensions/django_extensions/management/commands/reset_db.py b/utils/django_command_extensions/django_extensions/management/commands/reset_db.py new file mode 100644 index 000000000..fadb0764a --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/reset_db.py @@ -0,0 +1,117 @@ +""" +originally from http://www.djangosnippets.org/snippets/828/ by dnordberg + +""" + + +from django.conf import settings +from django.core.management.base import CommandError, BaseCommand +from django.db import connection +import logging +from optparse import make_option + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--noinput', action='store_false', + dest='interactive', default=True, + help='Tells Django to NOT prompt the user for input of any kind.'), + make_option('--no-utf8', action='store_true', + dest='no_utf8_support', default=False, + help='Tells Django to not create a UTF-8 charset database'), + ) + help = "Resets the database for this project." + + def handle(self, *args, **options): + """ + Resets the database for this project. + + Note: Transaction wrappers are in reverse as a work around for + autocommit, anybody know how to do this the right way? + """ + + if options.get('interactive'): + confirm = raw_input(""" +You have requested a database reset. +This will IRREVERSIBLY DESTROY +ALL data in the database "%s". +Are you sure you want to do this? + +Type 'yes' to continue, or 'no' to cancel: """ % (settings.DATABASE_NAME,)) + else: + confirm = 'yes' + + if confirm != 'yes': + print "Reset cancelled." + return + + engine = settings.DATABASE_ENGINE + + if engine == 'sqlite3': + import os + try: + logging.info("Unlinking sqlite3 database") + os.unlink(settings.DATABASE_NAME) + except OSError: + pass + elif engine == 'mysql': + import MySQLdb as Database + kwargs = { + 'user': settings.DATABASE_USER, + 'passwd': settings.DATABASE_PASSWORD, + } + if settings.DATABASE_HOST.startswith('/'): + kwargs['unix_socket'] = settings.DATABASE_HOST + else: + kwargs['host'] = settings.DATABASE_HOST + if settings.DATABASE_PORT: + kwargs['port'] = int(settings.DATABASE_PORT) + connection = Database.connect(**kwargs) + drop_query = 'DROP DATABASE IF EXISTS %s' % settings.DATABASE_NAME + utf8_support = options.get('no_utf8_support', False) and '' or 'CHARACTER SET utf8' + create_query = 'CREATE DATABASE %s %s' % (settings.DATABASE_NAME, utf8_support) + logging.info('Executing... "' + drop_query + '"') + connection.query(drop_query) + logging.info('Executing... "' + create_query + '"') + connection.query(create_query) + elif engine == 'postgresql' or engine == 'postgresql_psycopg2': + if engine == 'postgresql': + import psycopg as Database + elif engine == 'postgresql_psycopg2': + import psycopg2 as Database + + if settings.DATABASE_NAME == '': + from django.core.exceptions import ImproperlyConfigured + raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file." + if settings.DATABASE_USER: + conn_string = "user=%s" % (settings.DATABASE_USER) + if settings.DATABASE_PASSWORD: + conn_string += " password='%s'" % settings.DATABASE_PASSWORD + if settings.DATABASE_HOST: + conn_string += " host=%s" % settings.DATABASE_HOST + if settings.DATABASE_PORT: + conn_string += " port=%s" % settings.DATABASE_PORT + connection = Database.connect(conn_string) + connection.set_isolation_level(0) #autocommit false + cursor = connection.cursor() + drop_query = 'DROP DATABASE %s' % settings.DATABASE_NAME + logging.info('Executing... "' + drop_query + '"') + + try: + cursor.execute(drop_query) + except Database.ProgrammingError, e: + logging.info("Error: "+str(e)) + + # Encoding should be SQL_ASCII (7-bit postgres default) or prefered UTF8 (8-bit) + create_query = (""" +CREATE DATABASE %s + WITH OWNER = %s + ENCODING = 'UTF8' + TABLESPACE = pg_default; +""" % (settings.DATABASE_NAME, settings.DATABASE_USER)) + logging.info('Executing... "' + create_query + '"') + cursor.execute(create_query) + + else: + raise CommandError, "Unknown database engine %s", engine + + print "Reset successful." diff --git a/utils/django_command_extensions/django_extensions/management/commands/runjob.py b/utils/django_command_extensions/django_extensions/management/commands/runjob.py new file mode 100644 index 000000000..897f3f106 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/runjob.py @@ -0,0 +1,59 @@ +from django.core.management.base import LabelCommand +from optparse import make_option +from django_extensions.management.jobs import get_job, print_jobs + +class Command(LabelCommand): + option_list = LabelCommand.option_list + ( + make_option('--list', '-l', action="store_true", dest="list_jobs", + help="List all jobs with there description"), + ) + help = "Run a single maintenance job." + args = "[app_name] job_name" + label = "" + + requires_model_validation = True + + def runjob(self, app_name, job_name, options): + verbosity = int(options.get('verbosity', 1)) + if verbosity>1: + print "Executing job: %s (app: %s)" % (job_name, app_name) + try: + job = get_job(app_name, job_name) + except KeyError, e: + if app_name: + print "Error: Job %s for applabel %s not found" % (app_name, job_name) + else: + print "Error: Job %s not found" % job_name + print "Use -l option to view all the available jobs" + return + try: + job().execute() + except Exception, e: + import traceback + print "ERROR OCCURED IN JOB: %s (APP: %s)" % (job_name, app_name) + print "START TRACEBACK:" + traceback.print_exc() + print "END TRACEBACK\n" + + def handle(self, *args, **options): + app_name = None + job_name = None + if len(args)==1: + job_name = args[0] + elif len(args)==2: + app_name, job_name = args + if options.get('list_jobs'): + print_jobs(only_scheduled=False, show_when=True, show_appname=True) + else: + if not job_name: + print "Run a single maintenance job. Please specify the name of the job." + return + self.runjob(app_name, job_name, options) + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/runjobs.py b/utils/django_command_extensions/django_extensions/management/commands/runjobs.py new file mode 100644 index 000000000..2b658b857 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/runjobs.py @@ -0,0 +1,90 @@ +from django.core.management.base import LabelCommand +from optparse import make_option +from django_extensions.management.jobs import get_jobs, print_jobs + +class Command(LabelCommand): + option_list = LabelCommand.option_list + ( + make_option('--list', '-l', action="store_true", dest="list_jobs", + help="List all jobs with there description"), + ) + help = "Runs scheduled maintenance jobs." + args = "[hourly daily weekly monthly]" + label = "" + + requires_model_validation = True + + def usage_msg(self): + print "Run scheduled jobs. Please specify 'hourly', 'daily', 'weekly' or 'monthly'" + + def runjobs(self, when, options): + verbosity = int(options.get('verbosity', 1)) + jobs = get_jobs(when, only_scheduled=True) + list = jobs.keys() + list.sort() + for app_name, job_name in list: + job = jobs[(app_name, job_name)] + if verbosity>1: + print "Executing %s job: %s (app: %s)" % (when, job_name, app_name) + try: + job().execute() + except Exception, e: + import traceback + print "ERROR OCCURED IN %s JOB: %s (APP: %s)" % (when.upper(), job_name, app_name) + print "START TRACEBACK:" + traceback.print_exc() + print "END TRACEBACK\n" + + def runjobs_by_signals(self, when, options): + """ Run jobs from the signals """ + # Thanks for Ian Holsman for the idea and code + from django_extensions.management import signals + from django.db import models + from django.conf import settings + + verbosity = int(options.get('verbosity', 1)) + for app_name in settings.INSTALLED_APPS: + try: + __import__(app_name + '.management', '', '', ['']) + except ImportError: + pass + + for app in models.get_apps(): + if verbosity>1: + app_name = '.'.join(app.__name__.rsplit('.')[:-1]) + print "Sending %s job signal for: %s" % (when, app_name) + if when == 'hourly': + signals.run_hourly_jobs.send(sender=app, app=app) + elif when == 'daily': + signals.run_daily_jobs.send(sender=app, app=app) + elif when == 'weekly': + signals.run_weekly_jobs.send(sender=app, app=app) + elif when == 'monthly': + signals.run_monthly_jobs.send(sender=app, app=app) + + def handle(self, *args, **options): + when = None + if len(args)>1: + self.usage_msg() + return + elif len(args)==1: + if not args[0] in ['hourly', 'daily', 'weekly', 'monthly']: + self.usage_msg() + return + else: + when = args[0] + if options.get('list_jobs'): + print_jobs(when, only_scheduled=True, show_when=True, show_appname=True) + else: + if not when: + self.usage_msg() + return + self.runjobs(when, options) + self.runjobs_by_signals(when, options) + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/runprofileserver.py b/utils/django_command_extensions/django_extensions/management/commands/runprofileserver.py new file mode 100644 index 000000000..5eed35dd6 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/runprofileserver.py @@ -0,0 +1,213 @@ +""" +runprofileserver.py + + Starts a lightweight Web server with profiling enabled. + +Credits for kcachegrind support taken from lsprofcalltree.py go to: + David Allouche + Jp Calderone & Itamar Shtull-Trauring + Johan Dahlin +""" + +from django.core.management.base import BaseCommand, CommandError +from optparse import make_option +import os +import sys + +def label(code): + if isinstance(code, str): + return ('~', 0, code) # built-in functions ('~' sorts at the end) + else: + return '%s %s:%d' % (code.co_name, + code.co_filename, + code.co_firstlineno) + +class KCacheGrind(object): + def __init__(self, profiler): + self.data = profiler.getstats() + self.out_file = None + + def output(self, out_file): + self.out_file = out_file + print >> out_file, 'events: Ticks' + self._print_summary() + for entry in self.data: + self._entry(entry) + + def _print_summary(self): + max_cost = 0 + for entry in self.data: + totaltime = int(entry.totaltime * 1000) + max_cost = max(max_cost, totaltime) + print >> self.out_file, 'summary: %d' % (max_cost,) + + def _entry(self, entry): + out_file = self.out_file + + code = entry.code + #print >> out_file, 'ob=%s' % (code.co_filename,) + if isinstance(code, str): + print >> out_file, 'fi=~' + else: + print >> out_file, 'fi=%s' % (code.co_filename,) + print >> out_file, 'fn=%s' % (label(code),) + + inlinetime = int(entry.inlinetime * 1000) + if isinstance(code, str): + print >> out_file, '0 ', inlinetime + else: + print >> out_file, '%d %d' % (code.co_firstlineno, inlinetime) + + # recursive calls are counted in entry.calls + if entry.calls: + calls = entry.calls + else: + calls = [] + + if isinstance(code, str): + lineno = 0 + else: + lineno = code.co_firstlineno + + for subentry in calls: + self._subentry(lineno, subentry) + print >> out_file + + def _subentry(self, lineno, subentry): + out_file = self.out_file + code = subentry.code + #print >> out_file, 'cob=%s' % (code.co_filename,) + print >> out_file, 'cfn=%s' % (label(code),) + if isinstance(code, str): + print >> out_file, 'cfi=~' + print >> out_file, 'calls=%d 0' % (subentry.callcount,) + else: + print >> out_file, 'cfi=%s' % (code.co_filename,) + print >> out_file, 'calls=%d %d' % ( + subentry.callcount, code.co_firstlineno) + + totaltime = int(subentry.totaltime * 1000) + print >> out_file, '%d %d' % (lineno, totaltime) + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--noreload', action='store_false', dest='use_reloader', default=True, + help='Tells Django to NOT use the auto-reloader.'), + make_option('--adminmedia', dest='admin_media_path', default='', + help='Specifies the directory from which to serve admin media.'), + make_option('--prof-path', dest='prof_path', default='/tmp', + help='Specifies the directory which to save profile information in.'), + make_option('--nomedia', action='store_true', dest='no_media', default=False, + help='Do not profile MEDIA_URL and ADMIN_MEDIA_URL'), + make_option('--use-cprofile', action='store_true', dest='use_cprofile', default=False, + help='Use cProfile if available, this is disabled per default because of incompatibilities.'), + make_option('--kcachegrind', action='store_true', dest='use_lsprof', default=False, + help='Create kcachegrind compatible lsprof files, this requires and automatically enables cProfile.'), + ) + help = "Starts a lightweight Web server with profiling enabled." + args = '[optional port number, or ipaddr:port]' + + # Validation is called explicitly each time the server is reloaded. + requires_model_validation = False + + def handle(self, addrport='', *args, **options): + import django + from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException + from django.core.handlers.wsgi import WSGIHandler + if args: + raise CommandError('Usage is runserver %s' % self.args) + if not addrport: + addr = '' + port = '8000' + else: + try: + addr, port = addrport.split(':') + except ValueError: + addr, port = '', addrport + if not addr: + addr = '127.0.0.1' + + if not port.isdigit(): + raise CommandError("%r is not a valid port number." % port) + + use_reloader = options.get('use_reloader', True) + admin_media_path = options.get('admin_media_path', '') + shutdown_message = options.get('shutdown_message', '') + no_media = options.get('no_media', False) + quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' + + def inner_run(): + from django.conf import settings + + import hotshot, time, os + USE_CPROFILE = options.get('use_cprofile', False) + USE_LSPROF = options.get('use_lsprof', False) + if USE_LSPROF: + USE_CPROFILE = True + if USE_CPROFILE: + try: + import cProfile + USE_CPROFILE = True + except ImportError: + print "cProfile disabled, module cannot be imported!" + USE_CPROFILE = False + if USE_LSPROF and not USE_CPROFILE: + raise SystemExit("Kcachegrind compatible output format required cProfile from Python 2.5") + prof_path = options.get('prof_path', '/tmp') + def make_profiler_handler(inner_handler): + def handler(environ, start_response): + path_info = environ['PATH_INFO'] + # normally /media/ is MEDIA_URL, but in case still check it in case it's differently + # should be hardly a penalty since it's an OR expression. + # TODO: fix this to check the configuration settings and not make assumpsions about where media are on the url + if no_media and (path_info.startswith('/media') or path_info.startswith(settings.MEDIA_URL)): + return inner_handler(environ, start_response) + path_name = path_info.strip("/").replace('/', '.') or "root" + profname = "%s.%.3f.prof" % (path_name, time.time()) + profname = os.path.join(prof_path, profname) + if USE_CPROFILE: + prof = cProfile.Profile() + else: + prof = hotshot.Profile(profname) + try: + return prof.runcall(inner_handler, environ, start_response) + finally: + if USE_LSPROF: + kg = KCacheGrind(prof) + kg.output(file(profname, 'w')) + elif USE_CPROFILE: + prof.dump_stats(profname) + return handler + + print "Validating models..." + self.validate(display_num_errors=True) + print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE) + print "Development server is running at http://%s:%s/" % (addr, port) + print "Quit the server with %s." % quit_command + try: + path = admin_media_path or django.__path__[0] + '/contrib/admin/media' + handler = make_profiler_handler(AdminMediaHandler(WSGIHandler(), path)) + run(addr, int(port), handler) + except WSGIServerException, e: + # Use helpful error messages instead of ugly tracebacks. + ERRORS = { + 13: "You don't have permission to access that port.", + 98: "That port is already in use.", + 99: "That IP address can't be assigned-to.", + } + try: + error_text = ERRORS[e.args[0].args[0]] + except (AttributeError, KeyError): + error_text = str(e) + sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n') + # Need to use an OS exit because sys.exit doesn't work in a thread + os._exit(1) + except KeyboardInterrupt: + if shutdown_message: + print shutdown_message + sys.exit(0) + if use_reloader: + from django.utils import autoreload + autoreload.main(inner_run) + else: + inner_run() diff --git a/utils/django_command_extensions/django_extensions/management/commands/runscript.py b/utils/django_command_extensions/django_extensions/management/commands/runscript.py new file mode 100644 index 000000000..ebd25c234 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/runscript.py @@ -0,0 +1,95 @@ +from django.core.management.base import BaseCommand +from django.core.management.color import no_style +from optparse import make_option +import sys +import os + +try: + set +except NameError: + from sets import Set as set # Python 2.3 fallback + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--fixtures', action='store_true', dest='infixtures', default=False, + help='Only look in app.fixtures subdir'), + make_option('--noscripts', action='store_true', dest='noscripts', default=False, + help='Look in app.scripts subdir'), + ) + help = 'Runs a script in django context.' + args = "script [script ...]" + + def handle(self, *scripts, **options): + from django.db.models import get_apps + + subdirs = [] + + if not options.get('noscripts'): + subdirs.append('scripts') + if options.get('infixtures'): + subdirs.append('fixtures') + verbosity = int(options.get('verbosity', 1)) + show_traceback = options.get('traceback', False) + + if len(subdirs) < 1: + print "No subdirs to run left." + return + + if len(scripts) < 1: + print "Script name required." + return + + def run_script(name): + if verbosity > 1: + print "check for %s" % name + try: + t = __import__(name, [], [], [" "]) + + if verbosity > 0: + print "Found script %s ..." %name + if hasattr(t, "run"): + if verbosity > 1: + print "found run() in %s. executing..." % name + # TODO: add arguments to run + try: + t.run() + except Exception, e: + if verbosity > 0: + print "Exception while running run() in %s" %name + if show_traceback: + raise + else: + if verbosity > 1: + print "no run() function found." + + except ImportError: + pass + + + for app in get_apps(): + app_name = app.__name__.split(".")[:-1] # + ['fixtures'] + + for subdir in subdirs: + for script in scripts: + run_script(".".join(app_name + [subdir, script])) + + # try app.DIR.script import + for script in scripts: + sa = script.split(".") + for subdir in subdirs: + nn = ".".join(sa[:-1] + [subdir, sa[-1]]) + run_script(nn) + + # try direct import + if script.find(".") != -1: + run_script(script) + + + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/runserver_plus.py b/utils/django_command_extensions/django_extensions/management/commands/runserver_plus.py new file mode 100644 index 000000000..f1bf4beda --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/runserver_plus.py @@ -0,0 +1,75 @@ +from django.core.management.base import BaseCommand, CommandError +from optparse import make_option +import os +import sys + +def null_technical_500_response(request, exc_type, exc_value, tb): + raise exc_type, exc_value, tb + +class Command(BaseCommand): + option_list = BaseCommand.option_list + ( + make_option('--noreload', action='store_false', dest='use_reloader', default=True, + help='Tells Django to NOT use the auto-reloader.'), + make_option('--browser', action='store_true', dest='open_browser', + help='Tells Django to open a browser.'), + make_option('--adminmedia', dest='admin_media_path', default='', + help='Specifies the directory from which to serve admin media.'), + ) + help = "Starts a lightweight Web server for development." + args = '[optional port number, or ipaddr:port]' + + # Validation is called explicitly each time the server is reloaded. + requires_model_validation = False + + def handle(self, addrport='', *args, **options): + import django + from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException + from django.core.handlers.wsgi import WSGIHandler + try: + from werkzeug import run_simple, DebuggedApplication + except: + raise CommandError("Werkzeug is required to use runserver_plus. Please visit http://werkzeug.pocoo.org/download") + + # usurp django's handler + from django.views import debug + debug.technical_500_response = null_technical_500_response + + if args: + raise CommandError('Usage is runserver %s' % self.args) + if not addrport: + addr = '' + port = '8000' + else: + try: + addr, port = addrport.split(':') + except ValueError: + addr, port = '', addrport + if not addr: + addr = '127.0.0.1' + + if not port.isdigit(): + raise CommandError("%r is not a valid port number." % port) + + use_reloader = options.get('use_reloader', True) + open_browser = options.get('open_browser', False) + admin_media_path = options.get('admin_media_path', '') + shutdown_message = options.get('shutdown_message', '') + quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' + + def inner_run(): + from django.conf import settings + print "Validating models..." + self.validate(display_num_errors=True) + print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE) + print "Development server is running at http://%s:%s/" % (addr, port) + print "Using the Werkzeug debugger (http://werkzeug.pocoo.org/)" + print "Quit the server with %s." % quit_command + path = admin_media_path or django.__path__[0] + '/contrib/admin/media' + handler = AdminMediaHandler(WSGIHandler(), path) + if open_browser: + import webbrowser + url = "http://%s:%s/" % (addr, port) + webbrowser.open(url) + run_simple(addr, int(port), DebuggedApplication(handler, True), + use_reloader=use_reloader, use_debugger=True) + inner_run() diff --git a/utils/django_command_extensions/django_extensions/management/commands/set_fake_emails.py b/utils/django_command_extensions/django_extensions/management/commands/set_fake_emails.py new file mode 100644 index 000000000..e0baa1c9a --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/set_fake_emails.py @@ -0,0 +1,76 @@ +""" +set_fake_emails.py + + Give all users a new email account. Useful for testing in a + development environment. As such, this command is only available when + setting.DEBUG is True. + +""" +from optparse import make_option + +from django.conf import settings +from django.core.management.base import NoArgsCommand, CommandError + +DEFAULT_FAKE_EMAIL = '%(username)s@example.com' + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--email', dest='default_email', default=DEFAULT_FAKE_EMAIL, + help='Use this as the new email format.'), + make_option('-a', '--no-admin', action="store_true", dest='no_admin', default=False, + help='Do not change administrator accounts'), + make_option('-s', '--no-staff', action="store_true", dest='no_staff', default=False, + help='Do not change staff accounts'), + make_option('--include', dest='include_regexp', default=None, + help='Include usernames matching this regexp.'), + make_option('--exclude', dest='exclude_regexp', default=None, + help='Exclude usernames matching this regexp.'), + make_option('--include-groups', dest='include_groups', default=None, + help='Include users matching this group. (use comma seperation for multiple groups)'), + make_option('--exclude-groups', dest='exclude_groups', default=None, + help='Exclude users matching this group. (use comma seperation for multiple groups)'), + ) + help = '''DEBUG only: give all users a new email based on their account data ("%s" by default). Possible parameters are: username, first_name, last_name''' % (DEFAULT_FAKE_EMAIL, ) + requires_model_validation = False + + def handle_noargs(self, **options): + if not settings.DEBUG: + raise CommandError('Only available in debug mode') + + from django.contrib.auth.models import User, Group + email = options.get('default_email', DEFAULT_FAKE_EMAIL) + include_regexp = options.get('include_regexp', None) + exclude_regexp = options.get('exclude_regexp', None) + include_groups = options.get('include_groups', None) + exclude_groups = options.get('exclude_groups', None) + no_admin = options.get('no_admin', False) + no_staff = options.get('no_staff', False) + + users = User.objects.all() + if no_admin: + users = users.exclude(is_superuser=True) + if no_staff: + users = users.exclude(is_staff=True) + if exclude_groups: + groups = Group.objects.filter(name__in=exclude_groups.split(",")) + if groups: + users = users.exclude(groups__in=groups) + else: + raise CommandError("No group matches filter: %s" % exclude_groups) + if include_groups: + groups = Group.objects.filter(name__in=include_groups.split(",")) + if groups: + users = users.filter(groups__in=groups) + else: + raise CommandError("No groups matches filter: %s" % include_groups) + if exclude_regexp: + users = users.exclude(username__regex=exclude_regexp) + if include_regexp: + users = users.filter(username__regex=include_regexp) + for user in users: + user.email = email % {'username': user.username, + 'first_name': user.first_name, + 'last_name': user.last_name} + user.save() + + print 'Changed %d emails' % users.count() diff --git a/utils/django_command_extensions/django_extensions/management/commands/set_fake_passwords.py b/utils/django_command_extensions/django_extensions/management/commands/set_fake_passwords.py new file mode 100644 index 000000000..2a65ef4d4 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/set_fake_passwords.py @@ -0,0 +1,44 @@ +""" +set_fake_passwords.py + + Reset all user passwords to a common value. Useful for testing in a + development environment. As such, this command is only available when + setting.DEBUG is True. + +""" +from optparse import make_option + +from django.conf import settings +from django.core.management.base import NoArgsCommand, CommandError + +DEFAULT_FAKE_PASSWORD = 'password' + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--prompt', dest='prompt_passwd', default=False, action='store_true', + help='Prompts for the new password to apply to all users'), + make_option('--password', dest='default_passwd', default=DEFAULT_FAKE_PASSWORD, + help='Use this as default password.'), + ) + help = 'DEBUG only: sets all user passwords to a common value ("%s" by default)' % (DEFAULT_FAKE_PASSWORD, ) + requires_model_validation = False + + def handle_noargs(self, **options): + if not settings.DEBUG: + raise CommandError('Only available in debug mode') + + from django.contrib.auth.models import User + if options.get('prompt_passwd', False): + from getpass import getpass + passwd = getpass('Password: ') + if not passwd: + raise CommandError('You must enter a valid password') + else: + passwd = options.get('default_passwd', DEFAULT_FAKE_PASSWORD) + + users = User.objects.all() + for user in users: + user.set_password(passwd) + user.save() + + print 'Reset %d passwords' % users.count() diff --git a/utils/django_command_extensions/django_extensions/management/commands/shell_plus.py b/utils/django_command_extensions/django_extensions/management/commands/shell_plus.py new file mode 100644 index 000000000..9672349fa --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/shell_plus.py @@ -0,0 +1,77 @@ +import os +from django.core.management.base import NoArgsCommand +from optparse import make_option + +class Command(NoArgsCommand): + option_list = NoArgsCommand.option_list + ( + make_option('--plain', action='store_true', dest='plain', + help='Tells Django to use plain Python, not IPython.'), + make_option('--no-pythonrc', action='store_true', dest='no_pythonrc', + help='Tells Django to use plain Python, not IPython.'), + ) + help = "Like the 'shell' command but autoloads the models of all installed Django apps." + + requires_model_validation = True + + def handle_noargs(self, **options): + # XXX: (Temporary) workaround for ticket #1796: force early loading of all + # models from installed apps. (this is fixed by now, but leaving it here + # for people using 0.96 or older trunk (pre [5919]) versions. + from django.db.models.loading import get_models, get_apps + loaded_models = get_models() + + use_plain = options.get('plain', False) + use_pythonrc = not options.get('no_pythonrc', True) + + # Set up a dictionary to serve as the environment for the shell, so + # that tab completion works on objects that are imported at runtime. + # See ticket 5082. + from django.conf import settings + imported_objects = {'settings': settings} + for app_mod in get_apps(): + app_models = get_models(app_mod) + if not app_models: + continue + model_labels = ", ".join([model.__name__ for model in app_models]) + print self.style.SQL_COLTYPE("From '%s' autoload: %s" % (app_mod.__name__.split('.')[-2], model_labels)) + for model in app_models: + try: + imported_objects[model.__name__] = getattr(__import__(app_mod.__name__, {}, {}, model.__name__), model.__name__) + except AttributeError, e: + print self.style.ERROR_OUTPUT("Failed to import '%s' from '%s' reason: %s" % (model.__name__, app_mod.__name__.split('.')[-2], str(e))) + continue + try: + if use_plain: + # Don't bother loading IPython, because the user wants plain Python. + raise ImportError + import IPython + # Explicitly pass an empty list as arguments, because otherwise IPython + # would use sys.argv from this script. + shell = IPython.Shell.IPShell(argv=[], user_ns=imported_objects) + shell.mainloop() + except ImportError: + # Using normal Python shell + import code + try: # Try activating rlcompleter, because it's handy. + import readline + except ImportError: + pass + else: + # We don't have to wrap the following import in a 'try', because + # we already know 'readline' was imported successfully. + import rlcompleter + readline.set_completer(rlcompleter.Completer(imported_objects).complete) + readline.parse_and_bind("tab:complete") + + # We want to honor both $PYTHONSTARTUP and .pythonrc.py, so follow system + # conventions and get $PYTHONSTARTUP first then import user. + if use_pythonrc: + pythonrc = os.environ.get("PYTHONSTARTUP") + if pythonrc and os.path.isfile(pythonrc): + try: + execfile(pythonrc) + except NameError: + pass + # This will import .pythonrc.py as a side-effect + import user + code.interact(local=imported_objects) diff --git a/utils/django_command_extensions/django_extensions/management/commands/show_urls.py b/utils/django_command_extensions/django_extensions/management/commands/show_urls.py new file mode 100644 index 000000000..d026f28e0 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/show_urls.py @@ -0,0 +1,45 @@ +from django.conf import settings +from django.core.management.base import BaseCommand +try: + # 2008-05-30 admindocs found in newforms-admin brand + from django.contrib.admindocs.views import extract_views_from_urlpatterns, simplify_regex +except ImportError: + # fall back to trunk, pre-NFA merge + from django.contrib.admin.views.doc import extract_views_from_urlpatterns, simplify_regex + +from django_extensions.management.color import color_style + +class Command(BaseCommand): + help = "Displays all of the url matching routes for the project." + + requires_model_validation = True + + def handle(self, *args, **options): + if args: + appname, = args + + style = color_style() + + if settings.ADMIN_FOR: + settings_modules = [__import__(m, {}, {}, ['']) for m in settings.ADMIN_FOR] + else: + settings_modules = [settings] + + views = [] + for settings_mod in settings_modules: + try: + urlconf = __import__(settings_mod.ROOT_URLCONF, {}, {}, ['']) + except Exception, e: + if options.get('traceback', None): + import traceback + traceback.print_exc() + print style.ERROR("Error occurred while trying to load %s: %s" % (settings_mod.ROOT_URLCONF, str(e))) + continue + view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns) + for (func, regex) in view_functions: + func_name = hasattr(func, '__name__') and func.__name__ or repr(func) + views.append("%(url)s\t%(module)s.%(name)s" % {'name': style.MODULE_NAME(func_name), + 'module': style.MODULE(func.__module__), + 'url': style.URL(simplify_regex(regex))}) + + return "\n".join([v for v in views]) diff --git a/utils/django_command_extensions/django_extensions/management/commands/sqldiff.py b/utils/django_command_extensions/django_extensions/management/commands/sqldiff.py new file mode 100644 index 000000000..3e722346c --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/sqldiff.py @@ -0,0 +1,276 @@ +""" +sqldiff.py - Prints the (approximated) difference between models and database + +TODO: + - seperate out PostgreSQL specific introspection hacks, to facilitate easier + writing backend specific code. (like the constrains check's) + - general cleanup + - better support for relations + +KNOWN ISSUES: + - MySQL has numerous problems with introspection. It's not recommanded to use + sqldiff in conjuction with MySQL. But if you do, expect to see a hole lot + of false positives. Mainly: + - Booleans are reported back as Integers, so there's know way to know if + there was a real change. + - Varchar sizes are reported back without unicode support so there size + may change in comparison to the real length of the varchar. +""" + +from django.core.management.base import AppCommand +from django.db import transaction +from optparse import make_option + + +class Command(AppCommand): + option_list = AppCommand.option_list + ( + make_option('--all-applications', '-a', action='store_true', dest='all_applications', + help="Automaticly include all application from INSTALLED_APPS."), + make_option('--not-only-existing', '-e', action='store_false', dest='only_existing', + help="Check all tables that exist in the database, not only tables that should exist based on models."), + make_option('--dense-output', '-d', action='store_true', dest='dense_output', + help="Shows the output in dense format, normally output is spreaded over multiple lines."), + make_option('--output_sql', '-s', action='store_true', dest='sql', + help="Outputs the differences as SQL when available"), + ) + + help = """Prints the (approximated) difference between models and fields in the database for the given app name(s). + +It indicates how columns in the database are different from the sql that would +be generated by Django. This command is not a database migration tool. (Though +it can certainly help) It's purpose is to show the current differences as a way +to check/debug ur models compared to the real database tables and columns.""" + + output_transaction = False + + def handle(self, *app_labels, **options): + if options.get('all_applications', False) and not app_labels: + from django.db import models + app_labels = [app.__name__.split('.')[-2] for app in models.get_apps()] + super(Command, self).handle(*app_labels, **options) + + def handle_app(self, app, **options): + from django.conf import settings + self.is_pgsql = settings.DATABASE_ENGINE.startswith("postgresql") + self.is_sqlite = settings.DATABASE_ENGINE.startswith("sqlite") + self.is_mysql = settings.DATABASE_ENGINE.startswith("mysql") + self.handle_diff(app, **options) + + @transaction.commit_manually + def handle_diff(self, app, **options): + from django.db import models, connection + from django.core.management import sql as _sql + + app_name = app.__name__.split('.')[-2] + + try: + django_tables = connection.introspection.django_table_names(only_existing=options.get('only_existing', True)) + except AttributeError: + # backwards compatibility for before introspection refactoring (r8296) + try: + django_tables = _sql.django_table_names(only_existing=options.get('only_existing', True)) + except AttributeError: + # backwards compatibility for before svn r7568 + django_tables = _sql.django_table_list(only_existing=options.get('only_existing', True)) + django_tables = [django_table for django_table in django_tables if django_table.startswith(app_name)] + + app_models = models.get_models(app) + if not app_models: + return + + try: + from django.db import get_introspection_module + introspection_module = get_introspection_module() + except ImportError: + introspection_module = connection.introspection + + cursor = connection.cursor() + model_diffs = [] + for app_model in app_models: + _constraints = None + _meta = app_model._meta + table_name = _meta.db_table + table_indexes = introspection_module.get_indexes(cursor, table_name) + + fieldmap = dict([(field.get_attname(), field) for field in _meta.fields]) + try: + table_description = introspection_module.get_table_description(cursor, table_name) + except Exception, e: + model_diffs.append((app_model.__name__, [str(e).strip()])) + transaction.rollback() # reset transaction + continue + diffs = [] + for i, row in enumerate(table_description): + att_name = row[0].lower() + try: + db_field_reverse_type = introspection_module.data_types_reverse[row[1]] + except AttributeError: + # backwards compatibility for before introspection refactoring (r8296) + db_field_reverse_type = introspection_module.DATA_TYPES_REVERSE.get(row[1]) + kwargs = {} + if isinstance(db_field_reverse_type, tuple): + kwargs.update(db_field_reverse_type[1]) + db_field_reverse_type = db_field_reverse_type[0] + + if db_field_reverse_type == "CharField" and row[3]: + kwargs['max_length'] = row[3] + + if db_field_reverse_type == "DecimalField": + kwargs['max_digits'] = row[4] + kwargs['decimal_places'] = row[5] + + if row[6]: + kwargs['blank'] = True + if not db_field_reverse_type in ('TextField', 'CharField'): + kwargs['null'] = True + + if fieldmap.has_key(att_name): + field = fieldmap.pop(att_name) + # check type + def clean(s): + s = s.split(" ")[0] + s = s.split("(")[0] + return s + def cmp_or_serialcmp(x, y): + result = x==y + if result: + return result + is_serial = lambda x,y: x.startswith("serial") and y.startswith("integer") + strip_serial = lambda x: x.lstrip("serial").lstrip("integer") + serial_logic = is_serial(x, y) or is_serial(y, x) + if result==False and serial_logic: + # use alternate serial logic + result = strip_serial(x)==strip_serial(y) + return result + db_field_type = getattr(models, db_field_reverse_type)(**kwargs).db_type() + model_type = field.db_type() + + # remove mysql's auto_increment keyword + if self.is_mysql and model_type.endswith("AUTO_INCREMENT"): + model_type = model_type.rsplit(' ', 1)[0].strip() + + # check if we can for constraints (only enabled on postgresql atm) + if self.is_pgsql: + if _constraints==None: + sql = """ + SELECT + pg_constraint.conname, pg_get_constraintdef(pg_constraint.oid) + FROM + pg_constraint, pg_attribute + WHERE + pg_constraint.conrelid = pg_attribute.attrelid + AND pg_attribute.attnum = any(pg_constraint.conkey) + AND pg_constraint.conname ~ %s""" + cursor.execute(sql, [table_name]) + _constraints = [r for r in cursor.fetchall() if r[0].endswith("_check")] + for r_name, r_check in _constraints: + if table_name+"_"+att_name==r_name.rsplit("_check")[0]: + r_check = r_check.replace("((", "(").replace("))", ")") + pos = r_check.find("(") + r_check = "%s\"%s" % (r_check[:pos+1], r_check[pos+1:]) + pos = pos+r_check[pos:].find(" ") + r_check = "%s\" %s" % (r_check[:pos], r_check[pos+1:]) + db_field_type += " "+r_check + else: + # remove constraints + model_type = model_type.split("CHECK")[0].strip() + c_db_field_type = clean(db_field_type) + c_model_type = clean(model_type) + + if self.is_sqlite and (c_db_field_type=="varchar" and c_model_type=="char"): + c_db_field_type = "char" + db_field_type = db_field_type.lstrip("var") + + if not cmp_or_serialcmp(c_model_type, c_db_field_type): + diffs.append({ + 'text' : "field '%s' not of same type: db=%s, model=%s" % (att_name, c_db_field_type, c_model_type), + 'type' : 'type', + 'data' : (table_name, att_name, c_db_field_type, c_model_type) + }) + continue + if not cmp_or_serialcmp(db_field_type, model_type): + diffs.append({ + 'text' : "field '%s' parameters differ: db=%s, model=%s" % (att_name, db_field_type, model_type), + 'type' : 'param', + 'data' : (table_name, att_name, db_field_type, model_type) + }) + continue + else: + diffs.append({ + 'text' : "field '%s' missing in model: %s" % (att_name, model_type), + 'type' : 'missing-in-model', + 'data' : (table_name, att_name, db_field_type, model_type) + }) + for field in _meta.fields: + if field.db_index: + if not field.attname in table_indexes and not field.unique: + diffs.append({ + 'text' : "field '%s' INDEX defined in model missing in database" % (field.attname), + }) + if fieldmap: + for att_name, field in fieldmap.items(): + diffs.append({ + 'text' : "field '%s' missing in database: %s" % (att_name, field.db_type()), + 'type' : 'missing-in-db', + 'data' : (table_name, att_name, field.db_type()) + }) + if diffs: + model_diffs.append((app_model.__name__, diffs)) + + if model_diffs: + NOTICE = self.style.NOTICE + ERROR_OUTPUT = self.style.ERROR_OUTPUT + SQL_TABLE = self.style.SQL_TABLE + SQL_FIELD = self.style.SQL_FIELD + SQL_COLTYPE = self.style.SQL_COLTYPE + SQL_KEYWORD = self.style.SQL_KEYWORD + modify_command = self.is_pgsql and "TYPE" or "MODIFY" + + if self.is_mysql: + print ERROR_OUTPUT("""\ +Using sqldiff in conjuction with MySQL has known problems. +Please see the explanations about these problems in source +code of sqldiff.py. + +Use at your own risk, and but sure to tripple check every +result. This program will continue in 5 seconds. + """) + import time + time.sleep(5) + + if options.get('sql', False): + lines = ["", SQL_KEYWORD("BEGIN;")] + + for model_name, diffs in model_diffs: + for diff in diffs: + if not diff: continue + if not diff.get('data', False): continue + + if self.is_sqlite and diff['type'] == 'param': + lines.append(NOTICE('-- %s' % diff['text'])) + lines.append(NOTICE('-- SQLite does not feature type alteration on columns')) + continue + lines.append('%s %s' % (SQL_KEYWORD('ALTER TABLE'), SQL_TABLE(diff['data'][0])) ) + if diff['type'] == 'missing-in-db': + lines.append('\t%s %s %s;' % (SQL_KEYWORD('ADD'), SQL_FIELD(diff['data'][1]), SQL_COLTYPE(diff['data'][2]),) ) + if diff['type'] == 'missing-in-model': + lines.append('\t%s %s;' % (SQL_KEYWORD('DROP COLUMN') , SQL_FIELD(diff['data'][1]) )) + if diff['type'] in ['type', 'param']: + lines.append('\t%s %s %s %s;' % (SQL_KEYWORD('ALTER'), SQL_FIELD(diff['data'][1]), SQL_KEYWORD(modify_command), SQL_COLTYPE(diff['data'][3]))) + lines.append(SQL_KEYWORD("COMMIT;")) + + print "\n".join(lines) + else: + dense = options.get('dense_output', False) + if not dense: + print NOTICE("+ Application:"), SQL_TABLE(app_name) + for model_name, diffs in model_diffs: + if not diffs: continue + if not dense: + print NOTICE("|-+ Differences for model:"), SQL_TABLE(model_name) + for diff in diffs: + if not dense: + print NOTICE("|--+"), ERROR_OUTPUT(diff['text']) + else: + print NOTICE("App"), SQL_TABLE(app_name), NOTICE('Model'), SQL_TABLE(model_name), ERROR_OUTPUT(diff['text']) + diff --git a/utils/django_command_extensions/django_extensions/management/commands/sync_media_s3.py b/utils/django_command_extensions/django_extensions/management/commands/sync_media_s3.py new file mode 100644 index 000000000..92f242f91 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/sync_media_s3.py @@ -0,0 +1,249 @@ +""" +Sync Media to S3 +================ + +Django command that scans all files in your settings.MEDIA_ROOT folder and +uploads them to S3 with the same directory structure. + +This command can optionally do the following but it is off by default: +* gzip compress any CSS and Javascript files it finds and adds the appropriate + 'Content-Encoding' header. +* set a far future 'Expires' header for optimal caching. + +Note: This script requires the Python boto library and valid Amazon Web +Services API keys. + +Required settings.py variables: +AWS_ACCESS_KEY_ID = '' +AWS_SECRET_ACCESS_KEY = '' +AWS_BUCKET_NAME = '' + +Command options are: + -p PREFIX, --prefix=PREFIX + The prefix to prepend to the path on S3. + --gzip Enables gzipping CSS and Javascript files. + --expires Enables setting a far future expires header. + --force Skip the file mtime check to force upload of all + files. + +TODO: +* Make FILTER_LIST an optional argument + +""" +import datetime +import email +import mimetypes +import optparse +import os +import sys +import time + +from django.core.management.base import BaseCommand, CommandError + +# Make sure boto is available +try: + import boto + import boto.exception +except ImportError: + raise ImportError, "The boto Python library is not installed." + +class Command(BaseCommand): + + # Extra variables to avoid passing these around + AWS_ACCESS_KEY_ID = '' + AWS_SECRET_ACCESS_KEY = '' + AWS_BUCKET_NAME = '' + DIRECTORY = '' + FILTER_LIST = ['.DS_Store',] + GZIP_CONTENT_TYPES = ( + 'text/css', + 'application/javascript', + 'application/x-javascript' + ) + + upload_count = 0 + skip_count = 0 + + option_list = BaseCommand.option_list + ( + optparse.make_option('-p', '--prefix', + dest='prefix', default='', + help="The prefix to prepend to the path on S3."), + optparse.make_option('--gzip', + action='store_true', dest='gzip', default=False, + help="Enables gzipping CSS and Javascript files."), + optparse.make_option('--expires', + action='store_true', dest='expires', default=False, + help="Enables setting a far future expires header."), + optparse.make_option('--force', + action='store_true', dest='force', default=False, + help="Skip the file mtime check to force upload of all files.") + ) + + help = 'Syncs the complete MEDIA_ROOT structure and files to S3 into the given bucket name.' + args = 'bucket_name' + + can_import_settings = True + + def handle(self, *args, **options): + from django.conf import settings + + # Check for AWS keys in settings + if not hasattr(settings, 'AWS_ACCESS_KEY_ID') or \ + not hasattr(settings, 'AWS_SECRET_ACCESS_KEY'): + raise CommandError('Missing AWS keys from settings file. Please' + + 'supply both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.') + else: + self.AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID + self.AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY + + if not hasattr(settings, 'AWS_BUCKET_NAME'): + raise CommandError('Missing bucket name from settings file. Please' + + ' add the AWS_BUCKET_NAME to your settings file.') + else: + if not settings.AWS_BUCKET_NAME: + raise CommandError('AWS_BUCKET_NAME cannot be empty.') + self.AWS_BUCKET_NAME = settings.AWS_BUCKET_NAME + + if not hasattr(settings, 'MEDIA_ROOT'): + raise CommandError('MEDIA_ROOT must be set in your settings.') + else: + if not settings.MEDIA_ROOT: + raise CommandError('MEDIA_ROOT must be set in your settings.') + self.DIRECTORY = settings.MEDIA_ROOT + + self.verbosity = int(options.get('verbosity')) + self.prefix = options.get('prefix') + self.do_gzip = options.get('gzip') + self.do_expires = options.get('expires') + self.do_force = options.get('force') + + # Now call the syncing method to walk the MEDIA_ROOT directory and + # upload all files found. + self.sync_s3() + + print + print "%d files uploaded." % (self.upload_count) + print "%d files skipped." % (self.skip_count) + + def sync_s3(self): + """ + Walks the media directory and syncs files to S3 + """ + bucket, key = self.open_s3() + os.path.walk(self.DIRECTORY, self.upload_s3, + (bucket, key, self.AWS_BUCKET_NAME, self.DIRECTORY)) + + def compress_string(self, s): + """Gzip a given string.""" + import cStringIO, gzip + zbuf = cStringIO.StringIO() + zfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=zbuf) + zfile.write(s) + zfile.close() + return zbuf.getvalue() + + def open_s3(self): + """ + Opens connection to S3 returning bucket and key + """ + conn = boto.connect_s3(self.AWS_ACCESS_KEY_ID, self.AWS_SECRET_ACCESS_KEY) + try: + bucket = conn.get_bucket(self.AWS_BUCKET_NAME) + except boto.exception.S3ResponseError: + bucket = conn.create_bucket(self.AWS_BUCKET_NAME) + return bucket, boto.s3.key.Key(bucket) + + def upload_s3(self, arg, dirname, names): + """ + This is the callback to os.path.walk and where much of the work happens + """ + bucket, key, bucket_name, root_dir = arg # expand arg tuple + + if root_dir == dirname: + return # We're in the root media folder + + # Later we assume the MEDIA_ROOT ends with a trailing slash + # TODO: Check if we should check os.path.sep for Windows + if not root_dir.endswith('/'): + root_dir = root_dir + '/' + + for file in names: + headers = {} + + if file in self.FILTER_LIST: + continue # Skip files we don't want to sync + + filename = os.path.join(dirname, file) + if os.path.isdir(filename): + continue # Don't try to upload directories + + file_key = filename[len(root_dir):] + if self.prefix: + file_key = '%s/%s' % (self.prefix, file_key) + + # Check if file on S3 is older than local file, if so, upload + if not self.do_force: + s3_key = bucket.get_key(file_key) + if s3_key: + s3_datetime = datetime.datetime(*time.strptime( + s3_key.last_modified, '%a, %d %b %Y %H:%M:%S %Z')[0:6]) + local_datetime = datetime.datetime.utcfromtimestamp( + os.stat(filename).st_mtime) + if local_datetime < s3_datetime: + self.skip_count += 1 + if self.verbosity > 1: + print "File %s hasn't been modified since last " \ + "being uploaded" % (file_key) + continue + + # File is newer, let's process and upload + if self.verbosity > 0: + print "Uploading %s..." % (file_key) + + content_type = mimetypes.guess_type(filename)[0] + if content_type: + headers['Content-Type'] = content_type + file_obj = open(filename, 'rb') + file_size = os.fstat(file_obj.fileno()).st_size + filedata = file_obj.read() + if self.do_gzip: + # Gzipping only if file is large enough (>1K is recommended) + # and only if file is a common text type (not a binary file) + if file_size > 1024 and content_type in self.GZIP_CONTENT_TYPES: + filedata = self.compress_string(filedata) + headers['Content-Encoding'] = 'gzip' + if self.verbosity > 1: + print "\tgzipped: %dk to %dk" % \ + (file_size/1024, len(filedata)/1024) + if self.do_expires: + # HTTP/1.0 + headers['Expires'] = '%s GMT' % (email.Utils.formatdate( + time.mktime((datetime.datetime.now() + + datetime.timedelta(days=365*2)).timetuple()))) + # HTTP/1.1 + headers['Cache-Control'] = 'max-age %d' % (3600 * 24 * 365 * 2) + if self.verbosity > 1: + print "\texpires: %s" % (headers['Expires']) + print "\tcache-control: %s" % (headers['Cache-Control']) + + try: + key.name = file_key + key.set_contents_from_string(filedata, headers, replace=True) + key.make_public() + except boto.s3.connection.S3CreateError, e: + print "Failed: %s" % e + except Exception, e: + print e + raise + else: + self.upload_count += 1 + + file_obj.close() + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + optparse.make_option('-v', '--verbosity', + dest='verbosity', default=1, action='count', + help="Verbose mode. Multiple -v options increase the verbosity."), + ) diff --git a/utils/django_command_extensions/django_extensions/management/commands/syncdata.py b/utils/django_command_extensions/django_extensions/management/commands/syncdata.py new file mode 100644 index 000000000..e6e5dcd02 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/commands/syncdata.py @@ -0,0 +1,221 @@ +""" +SyncData +======== + +Django command similar to 'loaddata' but also deletes. +After 'syncdata' has run, the database will have the same data as the fixture - anything +missing will of been added, anything different will of been updated, +and anything extra will of been deleted. +""" + +from django.core.management.base import BaseCommand +from django.core.management.color import no_style +from optparse import make_option +import sys +import os + +class Command(BaseCommand): + """ syncdata command """ + + help = 'Makes the current database have the same data as the fixture(s), no more, no less.' + args = "fixture [fixture ...]" + + def remove_objects_not_in(self, objects_to_keep, verbosity): + """ + Deletes all the objects in the database that are not in objects_to_keep. + - objects_to_keep: A map where the keys are classes, and the values are a + set of the objects of that class we should keep. + """ + for class_ in objects_to_keep.keys(): + + current = class_.objects.all() + current_ids = set( [x.id for x in current] ) + keep_ids = set( [x.id for x in objects_to_keep[class_]] ) + + remove_these_ones = current_ids.difference(keep_ids) + if remove_these_ones: + + for obj in current: + if obj.id in remove_these_ones: + obj.delete() + if verbosity >= 2: + print "Deleted object: "+ unicode(obj) + + if verbosity > 0 and remove_these_ones: + num_deleted = len(remove_these_ones) + if num_deleted > 1: + type_deleted = unicode(class_._meta.verbose_name_plural) + else: + type_deleted = unicode(class_._meta.verbose_name) + + print "Deleted "+ str(num_deleted) +" "+ type_deleted + + def handle(self, *fixture_labels, **options): + """ Main method of a Django command """ + from django.db.models import get_apps + from django.core import serializers + from django.db import connection, transaction + from django.conf import settings + + self.style = no_style() + + verbosity = int(options.get('verbosity', 1)) + show_traceback = options.get('traceback', False) + + # Keep a count of the installed objects and fixtures + fixture_count = 0 + object_count = 0 + objects_per_fixture = [] + models = set() + + humanize = lambda dirname: dirname and "'%s'" % dirname or 'absolute path' + + # Get a cursor (even though we don't need one yet). This has + # the side effect of initializing the test database (if + # it isn't already initialized). + cursor = connection.cursor() + + # Start transaction management. All fixtures are installed in a + # single transaction to ensure that all references are resolved. + transaction.commit_unless_managed() + transaction.enter_transaction_management() + transaction.managed(True) + + app_fixtures = [os.path.join(os.path.dirname(app.__file__), 'fixtures') \ + for app in get_apps()] + for fixture_label in fixture_labels: + parts = fixture_label.split('.') + if len(parts) == 1: + fixture_name = fixture_label + formats = serializers.get_public_serializer_formats() + else: + fixture_name, format = '.'.join(parts[:-1]), parts[-1] + if format in serializers.get_public_serializer_formats(): + formats = [format] + else: + formats = [] + + if formats: + if verbosity > 1: + print "Loading '%s' fixtures..." % fixture_name + else: + sys.stderr.write( + self.style.ERROR("Problem installing fixture '%s': %s is not a known "+ \ + "serialization format." % (fixture_name, format)) + ) + transaction.rollback() + transaction.leave_transaction_management() + return + + if os.path.isabs(fixture_name): + fixture_dirs = [fixture_name] + else: + fixture_dirs = app_fixtures + list(settings.FIXTURE_DIRS) + [''] + + for fixture_dir in fixture_dirs: + if verbosity > 1: + print "Checking %s for fixtures..." % humanize(fixture_dir) + + label_found = False + for format in formats: + serializer = serializers.get_serializer(format) + if verbosity > 1: + print "Trying %s for %s fixture '%s'..." % \ + (humanize(fixture_dir), format, fixture_name) + try: + full_path = os.path.join(fixture_dir, '.'.join([fixture_name, format])) + fixture = open(full_path, 'r') + if label_found: + fixture.close() + print self.style.ERROR("Multiple fixtures named '%s' in %s. Aborting." % + (fixture_name, humanize(fixture_dir))) + transaction.rollback() + transaction.leave_transaction_management() + return + else: + fixture_count += 1 + objects_per_fixture.append(0) + if verbosity > 0: + print "Installing %s fixture '%s' from %s." % \ + (format, fixture_name, humanize(fixture_dir)) + try: + objects_to_keep = {} + objects = serializers.deserialize(format, fixture) + for obj in objects: + object_count += 1 + objects_per_fixture[-1] += 1 + + class_ = obj.object.__class__ + if not class_ in objects_to_keep: + objects_to_keep[class_] = set() + objects_to_keep[class_].add(obj.object) + + models.add(class_) + obj.save() + + self.remove_objects_not_in(objects_to_keep, verbosity) + + label_found = True + except (SystemExit, KeyboardInterrupt): + raise + except Exception: + import traceback + fixture.close() + transaction.rollback() + transaction.leave_transaction_management() + if show_traceback: + traceback.print_exc() + else: + sys.stderr.write( + self.style.ERROR("Problem installing fixture '%s': %s\n" % + (full_path, traceback.format_exc()))) + return + fixture.close() + except: + if verbosity > 1: + print "No %s fixture '%s' in %s." % \ + (format, fixture_name, humanize(fixture_dir)) + + # If any of the fixtures we loaded contain 0 objects, assume that an + # error was encountered during fixture loading. + if 0 in objects_per_fixture: + sys.stderr.write( + self.style.ERROR("No fixture data found for '%s'. (File format may be invalid.)" % + (fixture_name))) + transaction.rollback() + transaction.leave_transaction_management() + return + + # If we found even one object in a fixture, we need to reset the + # database sequences. + if object_count > 0: + sequence_sql = connection.ops.sequence_reset_sql(self.style, models) + if sequence_sql: + if verbosity > 1: + print "Resetting sequences" + for line in sequence_sql: + cursor.execute(line) + + transaction.commit() + transaction.leave_transaction_management() + + if object_count == 0: + if verbosity > 1: + print "No fixtures found." + else: + if verbosity > 0: + print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count) + + # Close the DB connection. This is required as a workaround for an + # edge case in MySQL: if the same connection is used to + # create tables, load data, and query, the query can return + # incorrect results. See Django #7572, MySQL #37735. + connection.close() + +# Backwards compatibility for Django r9110 +if not [opt for opt in Command.option_list if opt.dest=='verbosity']: + Command.option_list += ( + make_option('--verbosity', '-v', action="store", dest="verbosity", + default='1', type='choice', choices=['0', '1', '2'], + help="Verbosity level; 0=minimal output, 1=normal output, 2=all output"), + ) diff --git a/utils/django_command_extensions/django_extensions/management/jobs.py b/utils/django_command_extensions/django_extensions/management/jobs.py new file mode 100644 index 000000000..6515375d4 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/jobs.py @@ -0,0 +1,154 @@ +""" +django_extensions.management.jobs +""" + +import os +from imp import find_module + +_jobs = None + +def noneimplementation(meth): + return None + +class JobError(Exception): + pass + +class BaseJob(object): + help = "undefined job description." + when = None + + def execute(self): + raise NotImplementedError("Job needs to implement the execute method") + +class HourlyJob(BaseJob): + when = "hourly" + +class DailyJob(BaseJob): + when = "daily" + +class WeeklyJob(BaseJob): + when = "weekly" + +class MonthlyJob(BaseJob): + when = "monthly" + +def my_import(name): + imp = __import__(name) + mods = name.split('.') + if len(mods)>1: + for mod in mods[1:]: + imp = getattr(imp, mod) + return imp + +def find_jobs(jobs_dir): + try: + return [f[:-3] for f in os.listdir(jobs_dir) \ + if not f.startswith('_') and f.endswith(".py")] + except OSError: + return [] + +def find_job_module(app_name, when=None): + parts = app_name.split('.') + parts.append('jobs') + if when: + parts.append(when) + parts.reverse() + path = None + while parts: + part = parts.pop() + f, path, descr = find_module(part, path and [path] or None) + return path + +def import_job(app_name, name, when=None): + jobmodule = "%s.jobs.%s%s" % (app_name, when and "%s." % when or "", name) + job_mod = my_import(jobmodule) + # todo: more friendly message for AttributeError if job_mod does not exist + try: + job = job_mod.Job + except: + raise JobError("Job module %s does not contain class instance named 'Job'" % jobmodule) + if when and not (job.when == when or job.when == None): + raise JobError("Job %s is not a %s job." % (jobmodule, when)) + return job + +def get_jobs(when=None, only_scheduled=False): + """ + Returns a dictionary mapping of job names together with there respective + application class. + """ + global _jobs + # FIXME: HACK: make sure the project dir is on the path when executed as ./manage.py + import sys + try: + cpath = os.path.dirname(os.path.realpath(sys.argv[0])) + ppath = os.path.dirname(cpath) + if ppath not in sys.path: + sys.path.append(ppath) + except: + pass + if _jobs is None: + _jobs = {} + if True: + from django.conf import settings + for app_name in settings.INSTALLED_APPS: + scandirs = (None, 'hourly', 'daily', 'weekly', 'monthly') + if when: + scandirs = None, when + for subdir in scandirs: + try: + path = find_job_module(app_name, subdir) + for name in find_jobs(path): + if (app_name, name) in _jobs: + raise JobError("Duplicate job %s" % name) + job = import_job(app_name, name, subdir) + if only_scheduled and job.when == None: + # only include jobs which are scheduled + continue + if when and job.when != when: + # generic job not in same schedule + continue + _jobs[(app_name, name)] = job + except ImportError: + pass # No job module -- continue scanning + return _jobs + +def get_job(app_name, job_name): + jobs = get_jobs() + if app_name: + return jobs[(app_name, job_name)] + else: + for a, j in jobs.keys(): + if j==job_name: + return jobs[(a, j)] + raise KeyError("Job not found: %s" % job_name) + +def print_jobs(when=None, only_scheduled=False, show_when=True, \ + show_appname=False, show_header=True): + jobmap = get_jobs(when, only_scheduled=only_scheduled) + print "Job List: %i jobs" % len(jobmap) + jlist = jobmap.keys() + jlist.sort() + appname_spacer = "%%-%is" % max(len(e[0]) for e in jlist) + name_spacer = "%%-%is" % max(len(e[1]) for e in jlist) + when_spacer = "%%-%is" % max(len(e.when) for e in jobmap.values() if e.when) + if show_header: + line = " " + if show_appname: + line += appname_spacer % "appname" + " - " + line += name_spacer % "jobname" + if show_when: + line += " - " + when_spacer % "when" + line += " - help" + print line + print "-"*80 + + for app_name, job_name in jlist: + job = jobmap[(app_name, job_name)] + line = " " + if show_appname: + line += appname_spacer % app_name + " - " + line += name_spacer % job_name + if show_when: + line += " - " + when_spacer % (job.when and job.when or "") + line += " - " + job.help + print line diff --git a/utils/django_command_extensions/django_extensions/management/modelviz.py b/utils/django_command_extensions/django_extensions/management/modelviz.py new file mode 100644 index 000000000..5a9454bf7 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/modelviz.py @@ -0,0 +1,287 @@ +#!/usr/bin/env python +"""Django model to DOT (Graphviz) converter +by Antonio Cavedoni + +Make sure your DJANGO_SETTINGS_MODULE is set to your project or +place this script in the same directory of the project and call +the script like this: + +$ python modelviz.py [-h] [-a] [-d] [-g] [-i ] ... > .dot +$ dot .dot -Tpng -o .png + +options: + -h, --help + show this help message and exit. + + -a, --all_applications + show models from all applications. + + -d, --disable_fields + don't show the class member fields. + + -g, --group_models + draw an enclosing box around models from the same app. + + -i, --include_models=User,Person,Car + only include selected models in graph. +""" +__version__ = "0.9" +__svnid__ = "$Id$" +__license__ = "Python" +__author__ = "Antonio Cavedoni " +__contributors__ = [ + "Stefano J. Attardi ", + "limodou ", + "Carlo C8E Miron", + "Andre Campos ", + "Justin Findlay ", + "Alexander Houben ", + "Bas van Oostveen ", +] + +import getopt, sys + +from django.core.management import setup_environ + +try: + import settings +except ImportError: + pass +else: + setup_environ(settings) + +from django.utils.safestring import mark_safe +from django.template import Template, Context +from django.db import models +from django.db.models import get_models +from django.db.models.fields.related import \ + ForeignKey, OneToOneField, ManyToManyField + +try: + from django.db.models.fields.generic import GenericRelation +except ImportError: + from django.contrib.contenttypes.generic import GenericRelation + +head_template = """ +digraph name { + fontname = "Helvetica" + fontsize = 8 + + node [ + fontname = "Helvetica" + fontsize = 8 + shape = "plaintext" + ] + edge [ + fontname = "Helvetica" + fontsize = 8 + ] + +""" + +body_template = """ +{% if use_subgraph %} +subgraph {{ cluster_app_name }} { + label=< + + +
    {{ app_name }}
    + > + color=olivedrab4 + style="rounded" +{% endif %} + + {% for model in models %} + {{ model.app_name }}_{{ model.name }} [label=< + + + + {% if not disable_fields %} + {% for field in model.fields %} + + + {% endfor %} + {% endif %} +
    {{ model.name }}{% if model.abstracts %}
    <{{ model.abstracts|join:"," }}>{% endif %}
    {{ field.name }}{{ field.type }}
    + >] + {% endfor %} + +{% if use_subgraph %} +} +{% endif %} +""" + +rel_template = """ + {% for model in models %} + {% for relation in model.relations %} + {% if relation.needs_node %} + {{ relation.target_app }}_{{ relation.target }} [label=< + + +
    {{ relation.target }}
    + >] + {% endif %} + {{ model.app_name }}_{{ model.name }} -> {{ relation.target_app }}_{{ relation.target }} + [label="{{ relation.name }}"] {{ relation.arrows }}; + {% endfor %} + {% endfor %} +""" + +tail_template = """ +} +""" + +def generate_dot(app_labels, **kwargs): + disable_fields = kwargs.get('disable_fields', False) + include_models = kwargs.get('include_models', []) + all_applications = kwargs.get('all_applications', False) + use_subgraph = kwargs.get('group_models', False) + + dot = head_template + + apps = [] + if all_applications: + apps = models.get_apps() + + for app_label in app_labels: + app = models.get_app(app_label) + if not app in apps: + apps.append(app) + + graphs = [] + for app in apps: + graph = Context({ + 'name': '"%s"' % app.__name__, + 'app_name': "%s" % '.'.join(app.__name__.split('.')[:-1]), + 'cluster_app_name': "cluster_%s" % app.__name__.replace(".", "_"), + 'disable_fields': disable_fields, + 'use_subgraph': use_subgraph, + 'models': [] + }) + + for appmodel in get_models(app): + abstracts = [e.__name__ for e in appmodel.__bases__ if hasattr(e, '_meta') and e._meta.abstract] + abstract_fields = [] + for e in appmodel.__bases__: + if hasattr(e, '_meta') and e._meta.abstract: + abstract_fields.extend(e._meta.fields) + model = { + 'app_name': app.__name__.replace(".", "_"), + 'name': appmodel.__name__, + 'abstracts': abstracts, + 'fields': [], + 'relations': [] + } + + # consider given model name ? + def consider(model_name): + return not include_models or model_name in include_models + + if not consider(appmodel._meta.object_name): + continue + + # model attributes + def add_attributes(field): + model['fields'].append({ + 'name': field.name, + 'type': type(field).__name__, + 'blank': field.blank, + 'abstract': field in abstract_fields, + }) + + for field in appmodel._meta.fields: + add_attributes(field) + + if appmodel._meta.many_to_many: + for field in appmodel._meta.many_to_many: + add_attributes(field) + + # relations + def add_relation(field, extras=""): + _rel = { + 'target_app': field.rel.to.__module__.replace('.','_'), + 'target': field.rel.to.__name__, + 'type': type(field).__name__, + 'name': field.name, + 'arrows': extras, + 'needs_node': True + } + if _rel not in model['relations'] and consider(_rel['target']): + model['relations'].append(_rel) + + for field in appmodel._meta.fields: + if isinstance(field, ForeignKey): + add_relation(field) + elif isinstance(field, OneToOneField): + add_relation(field, '[arrowhead=none arrowtail=none]') + + if appmodel._meta.many_to_many: + for field in appmodel._meta.many_to_many: + if isinstance(field, ManyToManyField) and getattr(field, 'creates_table', False): + add_relation(field, '[arrowhead=normal arrowtail=normal]') + elif isinstance(field, GenericRelation): + add_relation(field, mark_safe('[style="dotted"] [arrowhead=normal arrowtail=normal]')) + graph['models'].append(model) + graphs.append(graph) + + nodes = [] + for graph in graphs: + nodes.extend([e['name'] for e in graph['models']]) + + for graph in graphs: + # don't draw duplication nodes because of relations + for model in graph['models']: + for relation in model['relations']: + if relation['target'] in nodes: + relation['needs_node'] = False + # render templates + t = Template(body_template) + dot += '\n' + t.render(graph) + + for graph in graphs: + t = Template(rel_template) + dot += '\n' + t.render(graph) + + dot += '\n' + tail_template + return dot + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "hadgi:", + ["help", "all_applications", "disable_fields", "group_models", "include_models="]) + except getopt.GetoptError, error: + print __doc__ + sys.exit(error) + + kwargs = {} + for opt, arg in opts: + if opt in ("-h", "--help"): + print __doc__ + sys.exit() + if opt in ("-a", "--all_applications"): + kwargs['all_applications'] = True + if opt in ("-d", "--disable_fields"): + kwargs['disable_fields'] = True + if opt in ("-g", "--group_models"): + kwargs['group_models'] = True + if opt in ("-i", "--include_models"): + kwargs['include_models'] = arg.split(',') + + if not args and not kwargs.get('all_applications', False): + print __doc__ + sys.exit() + + print generate_dot(args, **kwargs) + +if __name__ == "__main__": + main() diff --git a/utils/django_command_extensions/django_extensions/management/signals.py b/utils/django_command_extensions/django_extensions/management/signals.py new file mode 100644 index 000000000..e3e763d61 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/signals.py @@ -0,0 +1,9 @@ +""" +signals we use to trigger regular batch jobs +""" +from django.dispatch import Signal + +run_hourly_jobs = Signal() +run_daily_jobs = Signal() +run_weekly_jobs = Signal() +run_monthly_jobs = Signal() diff --git a/utils/django_command_extensions/django_extensions/management/utils.py b/utils/django_command_extensions/django_extensions/management/utils.py new file mode 100644 index 000000000..c757988dc --- /dev/null +++ b/utils/django_command_extensions/django_extensions/management/utils.py @@ -0,0 +1,7 @@ +from django.conf import settings +import os + +def get_project_root(): + """ get the project root directory """ + settings_mod = __import__(settings.SETTINGS_MODULE, {}, {}, ['']) + return os.path.dirname(os.path.abspath(settings_mod.__file__)) diff --git a/utils/django_command_extensions/django_extensions/media/django_extensions/css/jquery.autocomplete.css b/utils/django_command_extensions/django_extensions/media/django_extensions/css/jquery.autocomplete.css new file mode 100644 index 000000000..27a58523e --- /dev/null +++ b/utils/django_command_extensions/django_extensions/media/django_extensions/css/jquery.autocomplete.css @@ -0,0 +1,43 @@ +/***************************************************************************** + * jQuery autocomplete + ****************************************************************************/ +.ac_results { + padding: 0px; + border: 1px solid #ccc; + background-color: #fff; + overflow: hidden; + z-index: 99999; + text-align: left; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results li { + margin: 0px; + padding: 3px 5px; + cursor: default; + display: block; + font: menu; + font-size: 12px; + line-height: 14px; + overflow: hidden; +} + +.ac_loading { + background: white url('../img/indicator.gif') right center no-repeat; +} + +.ac_odd { + background-color: #eee; +} + +.ac_over { + background-color: #999; + color: white; +} diff --git a/utils/django_command_extensions/django_extensions/media/django_extensions/img/indicator.gif b/utils/django_command_extensions/django_extensions/media/django_extensions/img/indicator.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.ajaxQueue.js b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.ajaxQueue.js new file mode 100644 index 000000000..bdd2e4f82 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.ajaxQueue.js @@ -0,0 +1,116 @@ +/** + * Ajax Queue Plugin + * + * Homepage: http://jquery.com/plugins/project/ajaxqueue + * Documentation: http://docs.jquery.com/AjaxQueue + */ + +/** + + +

      + + */ +/* + * Queued Ajax requests. + * A new Ajax request won't be started until the previous queued + * request has finished. + */ + +/* + * Synced Ajax requests. + * The Ajax request will happen as soon as you call this method, but + * the callbacks (success/error/complete) won't fire until all previous + * synced requests have been completed. + */ + + +(function($) { + + var ajax = $.ajax; + + var pendingRequests = {}; + + var synced = []; + var syncedData = []; + + $.ajax = function(settings) { + // create settings for compatibility with ajaxSetup + settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings)); + + var port = settings.port; + + switch(settings.mode) { + case "abort": + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return pendingRequests[port] = ajax.apply(this, arguments); + case "queue": + var _old = settings.complete; + settings.complete = function(){ + if ( _old ) + _old.apply( this, arguments ); + jQuery([ajax]).dequeue("ajax" + port );; + }; + + jQuery([ ajax ]).queue("ajax" + port, function(){ + ajax( settings ); + }); + return; + case "sync": + var pos = synced.length; + + synced[ pos ] = { + error: settings.error, + success: settings.success, + complete: settings.complete, + done: false + }; + + syncedData[ pos ] = { + error: [], + success: [], + complete: [] + }; + + settings.error = function(){ syncedData[ pos ].error = arguments; }; + settings.success = function(){ syncedData[ pos ].success = arguments; }; + settings.complete = function(){ + syncedData[ pos ].complete = arguments; + synced[ pos ].done = true; + + if ( pos == 0 || !synced[ pos-1 ] ) + for ( var i = pos; i < synced.length && synced[i].done; i++ ) { + if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error ); + if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success ); + if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete ); + + synced[i] = null; + syncedData[i] = null; + } + }; + } + return ajax.apply(this, arguments); + }; + +})(jQuery); \ No newline at end of file diff --git a/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.autocomplete.js b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.autocomplete.js new file mode 100644 index 000000000..5ad9178f8 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.autocomplete.js @@ -0,0 +1,759 @@ +/* + * Autocomplete - jQuery plugin 1.0.2 + * + * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $ + * + */ + +;(function($) { + +$.fn.extend({ + autocomplete: function(urlOrData, options) { + var isUrl = typeof urlOrData == "string"; + options = $.extend({}, $.Autocompleter.defaults, { + url: isUrl ? urlOrData : null, + data: isUrl ? null : urlOrData, + delay: isUrl ? $.Autocompleter.defaults.delay : 10, + max: options && !options.scroll ? 10 : 150 + }, options); + + // if highlight is set to false, replace it with a do-nothing function + options.highlight = options.highlight || function(value) { return value; }; + + // if the formatMatch option is not specified, then use formatItem for backwards compatibility + options.formatMatch = options.formatMatch || options.formatItem; + + return this.each(function() { + new $.Autocompleter(this, options); + }); + }, + result: function(handler) { + return this.bind("result", handler); + }, + search: function(handler) { + return this.trigger("search", [handler]); + }, + flushCache: function() { + return this.trigger("flushCache"); + }, + setOptions: function(options){ + return this.trigger("setOptions", [options]); + }, + unautocomplete: function() { + return this.trigger("unautocomplete"); + } +}); + +$.Autocompleter = function(input, options) { + + var KEY = { + UP: 38, + DOWN: 40, + DEL: 46, + TAB: 9, + RETURN: 13, + ESC: 27, + COMMA: 188, + PAGEUP: 33, + PAGEDOWN: 34, + BACKSPACE: 8 + }; + + // Create $ object for input element + var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass); + + var timeout; + var previousValue = ""; + var cache = $.Autocompleter.Cache(options); + var hasFocus = 0; + var lastKeyPressCode; + var config = { + mouseDownOnSelect: false + }; + var select = $.Autocompleter.Select(options, input, selectCurrent, config); + + var blockSubmit; + + // prevent form submit in opera when selecting with return key + $.browser.opera && $(input.form).bind("submit.autocomplete", function() { + if (blockSubmit) { + blockSubmit = false; + return false; + } + }); + + // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all + $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) { + // track last key pressed + lastKeyPressCode = event.keyCode; + switch(event.keyCode) { + + case KEY.UP: + event.preventDefault(); + if ( select.visible() ) { + select.prev(); + } else { + onChange(0, true); + } + break; + + case KEY.DOWN: + event.preventDefault(); + if ( select.visible() ) { + select.next(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEUP: + event.preventDefault(); + if ( select.visible() ) { + select.pageUp(); + } else { + onChange(0, true); + } + break; + + case KEY.PAGEDOWN: + event.preventDefault(); + if ( select.visible() ) { + select.pageDown(); + } else { + onChange(0, true); + } + break; + + // matches also semicolon + case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA: + case KEY.TAB: + case KEY.RETURN: + if( selectCurrent() ) { + // stop default to prevent a form submit, Opera needs special handling + event.preventDefault(); + blockSubmit = true; + return false; + } + break; + + case KEY.ESC: + select.hide(); + break; + + default: + clearTimeout(timeout); + timeout = setTimeout(onChange, options.delay); + break; + } + }).focus(function(){ + // track whether the field has focus, we shouldn't process any + // results if the field no longer has focus + hasFocus++; + }).blur(function() { + hasFocus = 0; + if (!config.mouseDownOnSelect) { + hideResults(); + } + }).click(function() { + // show select when clicking in a focused field + if ( hasFocus++ > 1 && !select.visible() ) { + onChange(0, true); + } + }).bind("search", function() { + // TODO why not just specifying both arguments? + var fn = (arguments.length > 1) ? arguments[1] : null; + function findValueCallback(q, data) { + var result; + if( data && data.length ) { + for (var i=0; i < data.length; i++) { + if( data[i].result.toLowerCase() == q.toLowerCase() ) { + result = data[i]; + break; + } + } + } + if( typeof fn == "function" ) fn(result); + else $input.trigger("result", result && [result.data, result.value]); + } + $.each(trimWords($input.val()), function(i, value) { + request(value, findValueCallback, findValueCallback); + }); + }).bind("flushCache", function() { + cache.flush(); + }).bind("setOptions", function() { + $.extend(options, arguments[1]); + // if we've updated the data, repopulate + if ( "data" in arguments[1] ) + cache.populate(); + }).bind("unautocomplete", function() { + select.unbind(); + $input.unbind(); + $(input.form).unbind(".autocomplete"); + }); + + + function selectCurrent() { + var selected = select.selected(); + if( !selected ) + return false; + + var v = selected.result; + previousValue = v; + + if ( options.multiple ) { + var words = trimWords($input.val()); + if ( words.length > 1 ) { + v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v; + } + v += options.multipleSeparator; + } + + $input.val(v); + hideResultsNow(); + $input.trigger("result", [selected.data, selected.value]); + return true; + } + + function onChange(crap, skipPrevCheck) { + if( lastKeyPressCode == KEY.DEL ) { + select.hide(); + return; + } + + var currentValue = $input.val(); + + if ( !skipPrevCheck && currentValue == previousValue ) + return; + + previousValue = currentValue; + + currentValue = lastWord(currentValue); + if ( currentValue.length >= options.minChars) { + $input.addClass(options.loadingClass); + if (!options.matchCase) + currentValue = currentValue.toLowerCase(); + request(currentValue, receiveData, hideResultsNow); + } else { + stopLoading(); + select.hide(); + } + }; + + function trimWords(value) { + if ( !value ) { + return [""]; + } + var words = value.split( options.multipleSeparator ); + var result = []; + $.each(words, function(i, value) { + if ( $.trim(value) ) + result[i] = $.trim(value); + }); + return result; + } + + function lastWord(value) { + if ( !options.multiple ) + return value; + var words = trimWords(value); + return words[words.length - 1]; + } + + // fills in the input box w/the first match (assumed to be the best match) + // q: the term entered + // sValue: the first matching result + function autoFill(q, sValue){ + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + // if the last user key pressed was backspace, don't autofill + if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) { + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(lastWord(previousValue).length)); + // select the portion of the value not typed by the user (so the next character will erase) + $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length); + } + }; + + function hideResults() { + clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + var wasVisible = select.visible(); + select.hide(); + clearTimeout(timeout); + stopLoading(); + if (options.mustMatch) { + // call search and run callback + $input.search( + function (result){ + // if no value found, clear the input box + if( !result ) { + if (options.multiple) { + var words = trimWords($input.val()).slice(0, -1); + $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") ); + } + else + $input.val( "" ); + } + } + ); + } + if (wasVisible) + // position cursor at end of input field + $.Autocompleter.Selection(input, input.value.length, input.value.length); + }; + + function receiveData(q, data) { + if ( data && data.length && hasFocus ) { + stopLoading(); + select.display(data, q); + autoFill(q, data[0].value); + select.show(); + } else { + hideResultsNow(); + } + }; + + function request(term, success, failure) { + if (!options.matchCase) + term = term.toLowerCase(); + var data = cache.load(term); + // recieve the cached data + if (data && data.length) { + success(term, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + + var extraParams = { + timestamp: +new Date() + }; + $.each(options.extraParams, function(key, param) { + extraParams[key] = typeof param == "function" ? param() : param; + }); + + $.ajax({ + // try to leverage ajaxQueue plugin to abort previous requests + mode: "abort", + // limit abortion to this input + port: "autocomplete" + input.name, + dataType: options.dataType, + url: options.url, + data: $.extend({ + q: lastWord(term), + limit: options.max + }, extraParams), + success: function(data) { + var parsed = options.parse && options.parse(data) || parse(data); + cache.add(term, parsed); + success(term, parsed); + } + }); + } else { + // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match + select.emptyList(); + failure(term); + } + }; + + function parse(data) { + var parsed = []; + var rows = data.split("\n"); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + row = row.split("|"); + parsed[parsed.length] = { + data: row, + value: row[0], + result: options.formatResult && options.formatResult(row, row[0]) || row[0] + }; + } + } + return parsed; + }; + + function stopLoading() { + $input.removeClass(options.loadingClass); + }; + +}; + +$.Autocompleter.defaults = { + inputClass: "ac_input", + resultsClass: "ac_results", + loadingClass: "ac_loading", + minChars: 1, + delay: 400, + matchCase: false, + matchSubset: true, + matchContains: false, + cacheLength: 10, + max: 100, + mustMatch: false, + extraParams: {}, + selectFirst: true, + formatItem: function(row) { return row[0]; }, + formatMatch: null, + autoFill: false, + width: 0, + multiple: false, + multipleSeparator: ", ", + highlight: function(value, term) { + return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1"); + }, + scroll: true, + scrollHeight: 180 +}; + +$.Autocompleter.Cache = function(options) { + + var data = {}; + var length = 0; + + function matchSubset(s, sub) { + if (!options.matchCase) + s = s.toLowerCase(); + var i = s.indexOf(sub); + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + function add(q, value) { + if (length > options.cacheLength){ + flush(); + } + if (!data[q]){ + length++; + } + data[q] = value; + } + + function populate(){ + if( !options.data ) return false; + // track the matches + var stMatchSets = {}, + nullData = 0; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( !options.url ) options.cacheLength = 1; + + // track all options for minChars = 0 + stMatchSets[""] = []; + + // loop through the array and create a lookup structure + for ( var i = 0, ol = options.data.length; i < ol; i++ ) { + var rawValue = options.data[i]; + // if rawValue is a string, make an array otherwise just reference the array + rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue; + + var value = options.formatMatch(rawValue, i+1, options.data.length); + if ( value === false ) + continue; + + var firstChar = value.charAt(0).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[firstChar] ) + stMatchSets[firstChar] = []; + + // if the match is a string + var row = { + value: value, + data: rawValue, + result: options.formatResult && options.formatResult(rawValue) || value + }; + + // push the current match into the set list + stMatchSets[firstChar].push(row); + + // keep track of minChars zero items + if ( nullData++ < options.max ) { + stMatchSets[""].push(row); + } + }; + + // add the data items to the cache + $.each(stMatchSets, function(i, value) { + // increase the cache size + options.cacheLength++; + // add to the cache + add(i, value); + }); + } + + // populate any existing data + setTimeout(populate, 25); + + function flush(){ + data = {}; + length = 0; + } + + return { + flush: flush, + add: add, + populate: populate, + load: function(q) { + if (!options.cacheLength || !length) + return null; + /* + * if dealing w/local data and matchContains than we must make sure + * to loop through all the data collections looking for matches + */ + if( !options.url && options.matchContains ){ + // track all matches + var csub = []; + // loop through all the data grids for matches + for( var k in data ){ + // don't search through the stMatchSets[""] (minChars: 0) cache + // this prevents duplicates + if( k.length > 0 ){ + var c = data[k]; + $.each(c, function(i, x) { + // if we've got a match, add it to the array + if (matchSubset(x.value, q)) { + csub.push(x); + } + }); + } + } + return csub; + } else + // if the exact item exists, use it + if (data[q]){ + return data[q]; + } else + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var c = data[q.substr(0, i)]; + if (c) { + var csub = []; + $.each(c, function(i, x) { + if (matchSubset(x.value, q)) { + csub[csub.length] = x; + } + }); + return csub; + } + } + } + return null; + } + }; +}; + +$.Autocompleter.Select = function (options, input, select, config) { + var CLASSES = { + ACTIVE: "ac_over" + }; + + var listItems, + active = -1, + data, + term = "", + needsInit = true, + element, + list; + + // Create results + function init() { + if (!needsInit) + return; + element = $("
      ") + .hide() + .addClass(options.resultsClass) + .css("position", "absolute") + .appendTo(document.body); + + list = $("
        ").appendTo(element).mouseover( function(event) { + if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') { + active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event)); + $(target(event)).addClass(CLASSES.ACTIVE); + } + }).click(function(event) { + $(target(event)).addClass(CLASSES.ACTIVE); + select(); + // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus + input.focus(); + return false; + }).mousedown(function() { + config.mouseDownOnSelect = true; + }).mouseup(function() { + config.mouseDownOnSelect = false; + }); + + if( options.width > 0 ) + element.css("width", options.width); + + needsInit = false; + } + + function target(event) { + var element = event.target; + while(element && element.tagName != "LI") + element = element.parentNode; + // more fun with IE, sometimes event.target is empty, just ignore it then + if(!element) + return []; + return element; + } + + function moveSelect(step) { + listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE); + movePosition(step); + var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE); + if(options.scroll) { + var offset = 0; + listItems.slice(0, active).each(function() { + offset += this.offsetHeight; + }); + if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) { + list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight()); + } else if(offset < list.scrollTop()) { + list.scrollTop(offset); + } + } + }; + + function movePosition(step) { + active += step; + if (active < 0) { + active = listItems.size() - 1; + } else if (active >= listItems.size()) { + active = 0; + } + } + + function limitNumberOfItems(available) { + return options.max && options.max < available + ? options.max + : available; + } + + function fillList() { + list.empty(); + var max = limitNumberOfItems(data.length); + for (var i=0; i < max; i++) { + if (!data[i]) + continue; + var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term); + if ( formatted === false ) + continue; + var li = $("
      • ").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0]; + $.data(li, "ac_data", data[i]); + } + listItems = list.find("li"); + if ( options.selectFirst ) { + listItems.slice(0, 1).addClass(CLASSES.ACTIVE); + active = 0; + } + // apply bgiframe if available + if ( $.fn.bgiframe ) + list.bgiframe(); + } + + return { + display: function(d, q) { + init(); + data = d; + term = q; + fillList(); + }, + next: function() { + moveSelect(1); + }, + prev: function() { + moveSelect(-1); + }, + pageUp: function() { + if (active != 0 && active - 8 < 0) { + moveSelect( -active ); + } else { + moveSelect(-8); + } + }, + pageDown: function() { + if (active != listItems.size() - 1 && active + 8 > listItems.size()) { + moveSelect( listItems.size() - 1 - active ); + } else { + moveSelect(8); + } + }, + hide: function() { + element && element.hide(); + listItems && listItems.removeClass(CLASSES.ACTIVE); + active = -1; + }, + visible : function() { + return element && element.is(":visible"); + }, + current: function() { + return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]); + }, + show: function() { + var offset = $(input).offset(); + element.css({ + width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(), + top: offset.top + input.offsetHeight, + left: offset.left + }).show(); + if(options.scroll) { + list.scrollTop(0); + list.css({ + maxHeight: options.scrollHeight, + overflow: 'auto' + }); + + if($.browser.msie && typeof document.body.style.maxHeight === "undefined") { + var listHeight = 0; + listItems.each(function() { + listHeight += this.offsetHeight; + }); + var scrollbarsVisible = listHeight > options.scrollHeight; + list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight ); + if (!scrollbarsVisible) { + // IE doesn't recalculate width when scrollbar disappears + listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) ); + } + } + + } + }, + selected: function() { + var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE); + return selected && selected.length && $.data(selected[0], "ac_data"); + }, + emptyList: function (){ + list && list.empty(); + }, + unbind: function() { + element && element.remove(); + } + }; +}; + +$.Autocompleter.Selection = function(field, start, end) { + if( field.createTextRange ){ + var selRange = field.createTextRange(); + selRange.collapse(true); + selRange.moveStart("character", start); + selRange.moveEnd("character", end); + selRange.select(); + } else if( field.setSelectionRange ){ + field.setSelectionRange(start, end); + } else { + if( field.selectionStart ){ + field.selectionStart = start; + field.selectionEnd = end; + } + } + field.focus(); +}; + +})(jQuery); \ No newline at end of file diff --git a/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.bgiframe.min.js b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.bgiframe.min.js new file mode 100644 index 000000000..7faef4b33 --- /dev/null +++ b/utils/django_command_extensions/django_extensions/media/django_extensions/js/jquery.bgiframe.min.js @@ -0,0 +1,10 @@ +/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $ + * $Rev: 2447 $ + * + * Version 2.1.1 + */ +(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='

      ={4^ZidAM3m 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/date_delete.png b/media/img/icons/silk/date_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..969a6b7239275cbafd223931e3fdc9b1eb482e22 GIT binary patch literal 716 zcmV;-0yF)IP)>S9ti-HZasiwT2Zq>OIr z=IlZz8_bQi*}hUMa6)amu~;i{Bi6px`S-rZZ7iJjz<=*~-sgFK@Bi$aBLX0zA|X~P zl~X#M&aY4?E|Hw2dlj)Nm1@FZFnDMW-K)*fpAcC*L;d$fi-$F`?lc1IcXncJWCSk<24EW;L|87zUVlG!dwa1% zK<4&#EVQ&>MJh#{I64AI%VhX5K90oL7`~5=B1T}*;bH6%P?&&1eSP>!T!p&2aKN(v z0(?Fn%H{I0DwRse<#K{(&^1o&|SzZ9pdrYNLzbK^s&!i5r*(@Aa&*1l~ zTL2l#YeYyAMei}Ns+n&BK(E)s;c&p^ay8cc419OaAwD~VpN}O7-xg!-vJ@6I^F#n> ywOTj%jB%3QYHncV$|+)70`s&C#=Ghio&5{95~Nu0qnc;{0000 z@XyTPsyR0SRfgYWB;#@lX7&;LFB_CN(vlFNpK`2z!)0~roDYPN22vGz@NlK4CUscB_jiDRu&dAGht6p$FI~> zSP4iSACK2DG3bwuhMQFMA7DK>8NZ8*v0PLHPeB1(1m?)jhMj;G2*{R}23tucX1lIq zzNa3h4;L`;Ccjbw@H~%TFnFZ4x3{q(bi*@TgO#a%V0{VxsjuK(mM$L(2m}H!7!2_F ze9-IlFpW0BYkq<)S1&w2USMOIK~T_Qx}#b=6hO@?l}g%q-8}@K`7w4jwAfg<2e1A< zte>hd*?tGw#>=Pv0Z_vpgkc!0F0t@UKf;d4Az-V7=&Zn+r4~Zx74So<{hxRcu&17n zb?_K!Lgrf#9XGIQu7mA;8RiY&!ExNtfF*MeW(FUSvNaIxRoHai#0sf|nm7H6(tV)E z3}0mmAjTbPwrILAGf<1kZ%tU_%Mq|wz-xMlxz(OF(|4Fu*JQ_7OwArVn5X(bJ(SSusOn}JF5z(;QjVNh};HlMM5^1N4#l=N# zS=O1*x8`|y=`lahceoJY6E&h%#wk*-*OANRpzAtv*#&H^K0{YH0rTf3oRm4~D@Szo4obB7?WV%I}Ul zsL@;v5;B?C?ET_fc*9Y21$M!$JsOq^*;kqfgZ1S!*hF#;olA&QQ&S^RsZ z!Dvj@5{+4Gn!L@-#FEX1Kp=p3B)&;c$9h^CqeV6wOLjX`qiYrufW+>$0PnN2F|E&SS6qp0`e6X;{(~1kH^D0 zhx0eU<#Hh&kEc{D7DF@|Wkd&^qn?z2NF)M}$AgWH4Y=KII2;aKosi(Nx*9)Y(fM_Fc7960CGx%0 zJTTLN+opEhG`65ee-V9#R*cN|$(D;)3QFs{8j~^5q1mCkc>Br8aVn@h??$XP~qz j9lZnHOfHwp{nYy#Q$vKsy(sM?00000NkvXXu0mjft$0VR literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/date_link.png b/media/img/icons/silk/date_link.png new file mode 100755 index 0000000000000000000000000000000000000000..9f0aada7140f32ce4712e2b03025da8edd62a6c8 GIT binary patch literal 764 zcmV;Ru)A>AdQ$FlwxQIMIuQLq#R2`6HmQ(^~UI1 z=C`5Bp-?E2NF-A1!*8QFaVZ-NdW*e|j_`J61;0;Ep>1s74gLw+l;dN#mY2~uJ40`M zUD!OjZjcNl>|{|CSZp>71_Mmn?U*zgVV5MKW^yrGt->}rGXwJwm}8~k9cEcZu3Q#Q z`C<_ofplhP(V3pcz-&e?pBJ`Vp)dx(h+_%RY?S@y{5*=C4wfjpo2W??p!fUesw#fb zStfm_X$aBzNcJT_lK-#ZgVPDW#R9$8gGx>sD}k8^=>5b5ymT5!mHT@<66m;!bULl8 zs`{$-`+fcC=}9OHzi|x5%6LJ#-7d1(EIb|$N~MzEetUb1)z#I}$j2hR1i-dGKq(W2gKuXadIW8R0_>z6C1Q#GBvx=XyBBV&FOT0dj`Ocl}ZI)HaD@iw8f_ybVp>h{H}350{GgG2;``m*9heF= u2qu$BWS*seg72+XOH{x#=&sT6CI55DN5t*xzxdh4vruFz3HIvUK)W=dVA z1o40|dZg;=BsS%8?0UUYjIPu$!FmrQ=#bRL0 zW^8nKBi`AGcv~BS&COs;rgDt*dw&yrZEwfw@Gxfj`{5cKL}Xw9(Y`+H_w-NE-^wtn&EU!_>XU`YVWUJMR z1^XH-o(RH;ETYK*_{cF(vQ;u%Hk^yuFwI3u^hNq9s#nu?Og`bvkS04)%_N@TrQ;3>2FkW`ei1Ll5n!` zNhKT%5dNIc8u^Izie_;dQ#_-tWX zI-P!8C=@<(4xcUSPN#3Z2ta*tr~b@E06&A0H#Uw}hz7xQ1&rT!GnahHABnXf%pet0iY23wD!ZNL2O^w!J0B9`u#p^+C1$66v3^K z3vWMOpwzu#gmp3=homj{V9!jrsKap3jSnX_o*aI9sfxvQa>bKKlc+ WlT<+U@H$xl00000x$iEP)-YXOeA2OND zefrk;?i5-sm%CFe7T>cE-}!O!&{P!hgS}Q(aAj@|t@U+yi;Eb;iLfoQx{8UJ8GPT^ zK!0ID+R{QOszSm}MkE3w7K7`$7>dU+7z!b-suDW6=)=R(HaIc@{gjwv)zdR{O~X#J zDV?hIIy@q2kB*`}Gz3@Iu~V%|+fJ<(5Ww%T0eCUWzBxIGdb^Ej%ATUuR02w;6Mnm>~baaII`Fa1z15qy`;NZQzJq*+2 zXJ==TN~I8uMnRba_(VYkZ$FuM{(2W~-^QC~H_>Xf;4e$1QUNUxs1;d_bFP0$u=!2F za`_7;5@EEOzyB)JG);Ikc@922Jd|ffP{G|NA0I52JdBS;pwYrOoilcJ;&y1YW#(iu z$;%_F)9BTBpsEqZt8vP#sRFj;!0lKvc#&3_3G(?o40>A5%E9~l`vH+0qIuAL*s7Xn z|FmHDT(~_)8hwOl4_I>roOx<$3cX%WwgmsLdi3C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/disconnect.png b/media/img/icons/silk/disconnect.png new file mode 100755 index 0000000000000000000000000000000000000000..b335cb11c4d1a397b307883adcfe1e00c4cf8e6a GIT binary patch literal 796 zcmV+%1LOROP)h5&w{Y-QlBkdy7eSyz8|k(w=syt3MbOGZFmTy2f|dnI3kj6Sz)H!` z%1hM3FiovS8#Qs98Rxs5^PSs#9S4da6*};44(Iv3@B5rb3BwQ$Is?0$0ilY#Q^EELL=6SfS*Ly93GR<|lPYvfPXoM^)HN1)!-B@N5Zi(e|Ge`rl{XLurIiz-D}wH~H+MJzd|s z^YP1Hc07G_>)Lgir!F1{Qn4GcTg%?koHo<=1qRN{}nPDolOeI^o4N5I>! zU$N=L=sg~ zDx#dOA*B0N~cqPsWI(^rbbkh)DS0_H_UN0C4l_kvWIm2#Kyy6%BCh z(yIUf003&1xdx>t$*eR2ZvXxT0001Z_R$y3Iju92q*wg58};}zm(OaAH=p|y0002M zh5O5#fxp|~jc?yi@+7$`d4Q6Hl%z;WiWG??NXR{Hx%)pMd~SE0000OQI literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/disk_multiple.png b/media/img/icons/silk/disk_multiple.png new file mode 100755 index 0000000000000000000000000000000000000000..fc5a52f5e4a7e8eb54bcd59728e88a2db5f046ed GIT binary patch literal 691 zcmV;k0!;mhP)h|XiB@gI zjUjC!t---iaHXP+)r{6Ojx+c3eOp)#T8qGEea`PZ=iwYN#&8(f07GMovvqMO`yt0_ zV{GIqh=SUrg*L*EVuk5U_QA?{|KdLZm9oqA&I{b?sAXd2Gmr0G+E?`AZ62*91#}$* zh%tuyPiAI&x-YV_mTQj!pIA(Bw8r7bRXMZUbwz}06c5|lmvZ$Nsq_x5imrlk>1*KX6(-bq8O z2^19ECQj9aBx7KUR8RS!t_)7SYimBz-4JgeVb>Gt0MQyT5n9SDtu2!)2FyRdD{|O( Z{ssThAulbFM%4fS002ovPDHLkV1fh$IWzzO literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/door.png b/media/img/icons/silk/door.png new file mode 100755 index 0000000000000000000000000000000000000000..369fc46ed259191014664e8a16bea76e7513f8b6 GIT binary patch literal 412 zcmV;N0b~A&P)%thM>W-PO4z!6ryTDvQjnlZlgy>*`kliP$?n1x#3mBv=H* zZvSv|{Wk%bFo}=%C%C=cB-|2gZto+r=@*a)F<})kF(DFGf{cEF%qX{I6ar>BlQ09$ zKtwM=E70{BMdbz}7ZEfCIhx`>6H;PlIK|!Y1xVX8?flcwAM>e&;Vo+vaG^ z2pyX9GZt*w3IyWpBqouZ9TBDUCjj71ahpsggwSp?!_6p~6Ug^zToTz0k=O|cA@C)B z=4SI+2S7F9CYUB%6Rwf$PD%xpU1zsvH^-J3qhIec&_95xadrGMyZiUG;F`#)xFk#y zurJ!PJ?Af*(aYIc}SHy&e#bYkLxyZiN`;lMHCXuWKOBa9QbyiY}R8)+l!c;Lu zGC@p$z~K6Ij22J0)wsbx511;JB7MDISvY@^uJR9Nq@bi~L`zglHEQK03t2do(0Qs6*PW_{1G!HjEs!rv9U46 z$HzPJ|EKO<)u6Ypk6L#x)$Sg;sx@Y2o4k8D`Z@f|JD)qaVu_iqHj_a!UF&Z3Ql+}r bBu@VX$p^JhV-$eD00000NkvXXu0mjfw@)|D literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/door_open.png b/media/img/icons/silk/door_open.png new file mode 100755 index 0000000000000000000000000000000000000000..64bab57ddd0e95ad9a73a3828ec29b5d0b4dd675 GIT binary patch literal 508 zcmVjv0zFqT|_}Gg5c7fH`2AZ7W59X^b!J!cjQKk5f=?+6Od?2ip|XV za}o2aVlr?zXY)SuzK59<5o~(S-oAM4Zm-OARNqAS>D|jO?sih$KIXi4#zC#p8KB*6 zhr2T^Gn@5ikAoUcb$HCpdndR#asC03%nV>=v|23yQc6ob;v>x`Pk}_f8e)=(a71(& zuqvL;W`>(lMgvR>P$S&_bg(E|oK*{Mf@#6E0Euv?l<^#(s{aI-7D5%5GI0madt{~$%;b@oK6JNMtzMm)GS2eE@_I zS~TaE^z1tT1me$mOd>fuB1*9ukjYHe@2!~sjG5tP)N7xSr3G9P+3oKa++V)SLaGru zn`QvjgqvWRa7{oUyOUDA37GDE%9f3r>9Muk`Z$59p<W>iYj7vxikNWw_8sK+%_fnobvCa5%KNOO6e%CReDLPLmVwdHp%H5J z8cVW-n2=oPDz8D+5J{LSmLlCXMPg`l3MX6KVJNMw&n~!g&9zA<=CHFVyLz1l^k+DTiboyDIuKD~MJE&R)Oo;bO6gPHCylVLL*a<{&sTsdkI7k&ZU WO{4dBd(FK70000k8yT(1{FYQ%eS|; zm`o-RZoVTR{e-VIhqwI*@698e;uMa`17cSLjDP=8fDVU4RsnS8Z94N(YF@*3(F0$4 zfa7WccWVI`$$I$2KUI8TegR;jN^7ao%gZYfmZXUHr+K`!3i#+L;%mCJVqO6-QJb`Wzkm6y zdWlr63*W^xBEov}S^$&R>(#p5?x)3Kp>&7LPwULD0+^gmrwKcHWY#OW8%2BFWlgZRE7!1(s^(^f!rJbe79GNxG aJ%0hDwGFRvSa|pV0000lQkd! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drink_empty.png b/media/img/icons/silk/drink_empty.png new file mode 100755 index 0000000000000000000000000000000000000000..a40211ed412d95be06d475239a37c35fea158538 GIT binary patch literal 433 zcmV;i0Z#sjP)awcLgG1Ps>cqvbu;_Vq%$)JuarzB@HWl1!ZPF;C7L( zfnnMp{=@G#I2=L#pCCC))^Xy>1k(9bGie+eiDo<>3#hIg$F>C#B&%FfLPtmE4jr9a zG;-_{Q4m3n>C>c45seEj&?r%+MTanmAQ|J49v^ggr_Bq`JW!*DM#w+}NzbLsGCexH z(&UkQs(hlcVXn_1f*?uzfvMA@#REld=}z(wK;rh8c|(_Lw3$2sh-%+83%t?gYAR0w zBx>IpebHxQ^qXe@vKcLNP9XT_ljCh!!_LrUl~Y!8E6yeB4A{0s@_S@RP$z*(3_rfS z*ERu>_6-ID8Z@Z$!T^IKJgo@`D=KGHs4-;769x8Jz^zQ(5VWl+{_JvPk$HSoZ`Px@ bZR7F{-p6Gno?>^M00000NkvXXu0mjfT}81Z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive.png b/media/img/icons/silk/drive.png new file mode 100755 index 0000000000000000000000000000000000000000..37b7c9b27d39acaaecf06951b024ac08afbfd4d2 GIT binary patch literal 346 zcmV-g0j2(lP)`6pHR4C7- zkv&QTK@f$%UVGNSAB4p~7X&kJu`rW(3s2w)1kd9QoMeZ&fx$)tn+OJimk zjCT$JD?{UrQ?3~v=-g&C?-zWP;E3TkpyGrhTDFaQSzpwKU?tq9Uh&CO=Y?-R7%>t` z!bl_(!*h(_r3OLS;FuM!k+?!xBDEihL=?r53TBrP2>202N!*Y~*dL6MvS5Ku!P&n9 sT@vv>?encL=G!4ixo5^&>-PTUFAyGx1U4B=kpKVy07*qoM6N<$g0$g{=l}o! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_add.png b/media/img/icons/silk/drive_add.png new file mode 100755 index 0000000000000000000000000000000000000000..29a35d5aa8d270d0cc2e2fb29de8c8b5a82022d0 GIT binary patch literal 623 zcmV-#0+9WQP)JieWo?|tumGdpatSl}!}!5N1pKRTVx zYtQov9GK7Nn9XJZrqgMF$z(#YQ7)H@#ADO~CtouR!$~HSBI(}|Zd2EFIF5r}uUD*8 zDh=U)D?W_J;}{GEFikTcg^Bdt@Anal#gNHlNOYYqH(0CH66%RW0;AFBgk5Tdh>S6) zsw&i@(I_I327D}hnA}^In5vQP$D)maB4FVOQ z0hf5YdVgCqA3E{(5>wnYI+BvLk;4J;Fx*1L!MP-8z)TFztX+(o=;@1Xf{ z8zaR&EeYiS+`6&~Pw{a1dUSK7c$Mb_%(D;egYqi>H=r0SR#1Hd3 zbY|nm@?BBzL2(N&Tbo$0>hYiWzmcyj9o@cp-I~M4TIne^cJIJaO+4GKx~F$XWFb(ha-_q6-cG~B>a{s~x5BE5t9KSg>n~%S){RQIedSx-2#tZ-e002ov JPDHLkV1g!V6x{#- literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_burn.png b/media/img/icons/silk/drive_burn.png new file mode 100755 index 0000000000000000000000000000000000000000..80fd79f982e772844d58a90c9fdcf751c0181120 GIT binary patch literal 608 zcmV-m0-ybfP)tfHeA#B@4EsZ>I@+pVj_wGl1!`;fAZ@BPyc*{%{DQ6l*Sduq6YK_q`$aad3fgM z_ekw|u=PEl%wY6A95^RJ9cwfir`*e7?3P6{#i4zSea*qf&Ng&+6F8!a!yEs&#rMg> zOSbMY{eHn3+8ew!u><|u0$y@(gU6WP*mpM{*FPp7qvaX!cXz}sg}~)M{7V417_C?E um_6W6ZUPfY#aDvu>=s~f6Xp literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_cd.png b/media/img/icons/silk/drive_cd.png new file mode 100755 index 0000000000000000000000000000000000000000..1850b701cf20400207e7c4ce777940ec1645f43c GIT binary patch literal 734 zcmV<40wMj0P)D#T)oK}@`dJc1(dv;c^7(ug?CMS@EEn0?c*sF z3P%K-mYq3^jLc5Vc7U&qeYB>sSiC!n&6bXU$Aw?*ANcTP2ld^3TsrOB+sG!&+U=d3nBC^}~9=5(gAg^T*vPof+XAnft!b-uy=-!z-7P+jc zv~mVcbAF0*g7f+PkE=Ip+Rv11s(S3Gv~3AI6Wa!(4~vFDNf>(bM7aita;@NCt)OQH%@Lt=~vM!s(GvByx=5c=nMq9A|(cadvYV nf7)x?G!(;T;jb-r_;_P+#g$MH7vfLQmHX~h5`qmw zX%SqwFr*kv!PKM2!+a za=FeGc#O|esT54pL?jaNK|vs`yWK95$s}}LC(;csU1yC(gR`g8X;_wZPA-i?K*ktk zS?27CL;|r`4Ap8C?RLAU5IaeyS*b`>Rqld4sD$ElI>l%-LO!2Iv)SBGh-o++qTlcH z0}@4am=wicfoP;@8n4S{vxF%q#7eW0(+6^D zK*hm7u-N;I^p71#?@ZXq1st#5=VS8*0!W}-F6T=oFy*6rAF+f3tUP>zh<*#FUu)Rg z*}{#Z=vf2$17g0QT){rre2<%@$58hTVEZNJ=2N(?Eo0^T7bxC|Rx6dtTHu!XQTW>L zL#T^7aPR5gEBs;!^Y+QvP5htL?kGQ3*B@Mq9elv})WnIGJGNwe+ehz0k7@48)wj)0 z+s?016qX#q(SV`dW3EU2nqBlc@2+dlhJ(XLvdflTdDin#Z|>HdSAPI_FMg8I(Y~ty O00008>xgSt#M+4&ytoi#D*N41Z+^B#|P?m6e)_e2b?4zY&OB_}=DAs^R7#8!Y=OY%G)-&ea=GZxpJUOcs;X$US{MulrCP1l zj1&;#EnU|!8jTQ(#pa+zAg_nRAu^c^^7%ZI-k|NK=yW;}dp4VeX_~v_vK0mjAt1|g z#GX#4kxVAhXf)98_e%=1vvl^#hvM;g6c6fKNRybU<6(bF!;fGm( zXAbWw%ru!yU>HVJAZ84L0Nc|HimNAZc{zn=uZOsK_2jO)JZ>3y5u9IAMtJqZ@6xbyTAC>K0R6i|e-w$hhSe<|P&aDrLuIK1~Z zY~O<{sSJU@j%f8L}k)_ncR%Yp;$U*>^^d=_ENrHe3iQt_Z2vVu}yz dAF*M&_z5zVZIKEdNDEf2-s&}Y^ic31co00R|9}S-FA@q~ z1q;#;e^rr&XrtIjwGF1}(zLNg!zP<;)}57vSQHN(80NjleBU?o-Wz5Z26kf{c4@Zy zBArgpZf|dgO^2@Qs8*{D*EFr+l}d$TEE0)~5{^*|CitW%it(aPq3QK719D!Rt zgstUQNX^{WYy>KmO33H))&)^=tyTkFCPmsiYYBvUG&l|%N8$5Fh)jdi)eU#&9vcya zNr{LEWVU3L%yGY8*w?y(qr)xm^p2ylHVv_jA@g<-Rh>ihotZ|e)GIj=)SdPn!V<=Y z1$g?-qMW+}CVYe7aDrEJsO+D>X32n!2504-Zjlga{h}HSj&$6nW`5U+~3(a=n wM2C8~*KZr{mthE%IdwgMapK0pmw!#;FKVxMw^?5FRsaA107*qoM6N<$f)5QvuK)l5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_error.png b/media/img/icons/silk/drive_error.png new file mode 100755 index 0000000000000000000000000000000000000000..309f63962c0e70dfab9154b1d241e63a7a70ac96 GIT binary patch literal 705 zcmV;y0zUnTP);h;AU9E{Nf?}n4dHXi&Fj3?{Kq#TSk zQPapp!o`EsHbz1ei)l$XP&pV;1eRsjdDDQc;nqpMyxGls@B7|+Gt9Cq9A`;5=2AwR zYPI@yI2F7lgTWZOu8-00_bC=KnM{g!j7s3-%XYiH7z_r*q5s$6GHo^+ip3)8 z^?E9s%@%|Mu6SS5G&Gw{I2?{K=`fM@jYb1ruNRR>ghZG5?*c2A%R=4n_oLlzAF)fN z5RowkS(b&m$K!#^Dd%^s_SSPi%=8=Zns;wqy$M)q7NeRl7wYR zI+*ZTt&TwA61=AtG4<&g?3h7!7(h52CQec!RjQRh2}YoAm9-Ie?!gn#Fl@iV>4iJ+ z>01~Y`gp`5!H7hbW3d>b(I{qTBbX1hFf)Gx=xw9)bPaB;3$^Q8Kog(@ zqtOZc`T|X#g2(rVtMBq|^1l4uL}ck628C6eoK6duESJl@;k8^lbjvW%ySU)n#6s#e zRNH%)dgI_SFdJl70{c4>)?aR5v+2*XNsnp!@zUME-1SGHb55>W;*NA|z4(kodJarJ z0XVPX!;_WomT6v@n4t9VVk3TQEi6lWu#6vc8;-m`*?AuOm5=!P`oVK$(hD>Cy1KoZ n?ph}A1#i|rSmOwamKFL7N2-X}^&G=H00000NkvXXu0mjf#EU~5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_go.png b/media/img/icons/silk/drive_go.png new file mode 100755 index 0000000000000000000000000000000000000000..fc53379efcda49dc4b2fc0eb7bc12bf908425a53 GIT binary patch literal 661 zcmV;G0&4wR5;6} zQ_E@-Q5gPaa(xuUD*8Dh=U) zD{du|NeqWWL?V$HXdX!Y!C-(yB7saML!ujex*;{2O`)Djr7#|kPuQhW2q;Ms0)c=~ zkH_PP#bVGj4c%_H7$kMFPPNjeXf!IqSD$x6*>zo*ripw$k5;R-5hNwUFfba8!~yx6 z=rAe!W9?@Z6U#s;`2>;BIVg%EToOTn*l9o@UXrjZ%kl{a6J?6!^cr66Z{p$NQ>dy+ zm_m?Lsa6Uipdf-Tsn=YYU!iM*@iq1QD%O^6;K(%ay#ENB>Pu0!An<`?HJ8hY-2KIH zcfAb9D}@EUQ{QK< v0Jmp<;WRC~B^izzSeUp@_IuU)>d*fH-<_8fCSRm-00000NkvXXu0mjf03lk8@*o6WkjbwgV1sRJML-eYFIZ)SIxWm!0haX6s~?x9+( zzBf%XWdpgTa7&F_X!pDUVSLcJiXv>n%kh5hv)VO}6Rrcu*>p&}cN$ z*=)AxD6knHhe9Dpk_4a6H%^*Nq;s>`geZ!L#bQLdWIq>KxmRlJO3asib}Wl10= zMNuHjvNIqG9*stzVUl<6VtW-=pfBJA{vDXxH?tGP_G@_N?1IAz zxY2L>-wnbtbW~Tik=vSvplMnmpU+>P_{$t0<+qR!zvIl!JFxV(U}hJeUv*)2WbpQk zalI$JMDWVR3!6@-^ZR^0hgrbsbb{mYc#Ff~ zaEq6h7tG~UDiykfVW_fn~}VltVi=>K&uQzDT-rBZ>xU=T^C(`9175WnkmI+)F7 zAd|^%P4|tsAB{$!(P+T!b|dH$dtBz4%_gB63ncKeA(q}^@@i^YNr5{l4F%)(iC zhG(AVL8Vd=OB@i!>3F~bCW$DEM4|@4j=<;gCrG!@K&R8ea5$_r8jZG6 zAQ>OHu8Z+_49l{Tq|HQHk47VGZEeBxJR&`iuiLEK?JD+ME{ExK`kP#`LWztq=(?`h z9mhc?lR>N1!eB6{abhRw(fsn76!D&H|3dpiyy(@l<;Q-O67NiUbn zY9@U89>6pWgno!vw!setY_1~|TzyXp&<6hU?M;q=Spa`EfKdc9r) zPauILKg43Oaj{sW^Z88o;39xw7&IDpQ zluRb6R4UPOxopepp_oi25Ak?>TqqQ1zu&74SkNwrLI~0{O;tBdlM;yp4F&^RtyVQ% zzNeE;r_~z~6pcoeaCLttIB&Nb9gjyUm&-Jt&)Yhx91aKC?RI3_wnu<)2Ot3`0$bO0 z%49Oij|5dzp3P>eRVL#Jp-{+605bal3|!t-b^e}wK2N99Nd-fY6h3?@&jB`ku$iax zzssqrikyIF!UN?uYaE8@$J?8@%;1CV^G|G XPW_rzx-w*Y00000NkvXXu0mjf+4B7p literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_rename.png b/media/img/icons/silk/drive_rename.png new file mode 100755 index 0000000000000000000000000000000000000000..2a9f38b447dfe58b6e7e4f4dd19e51c606c01956 GIT binary patch literal 494 zcmVs8_uTX4Y-kx0Zb3`2sxi@(iqI1I;eFrUw>rfCj@fm`tmI1lXe8A$nG9B|)eT*?LZDI#!C+9TClU$7<8j!wjp=k+4X}DD zm6Bc=6pO{A3KM3tSWRjB3u3Y&vbW!FM!Ds*80#CD*ylh07*qoM6N<$f^*j1_y7O^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/drive_user.png b/media/img/icons/silk/drive_user.png new file mode 100755 index 0000000000000000000000000000000000000000..0b4751ce423771231ff45a8703c639e4f06ad7c2 GIT binary patch literal 712 zcmV;(0yq7MP)MFsn&r|Epyjypv6#aTeRpe$bx~OS(J+u ziKs+K&9O<-nNg&9`o@MFKSrPWdgqp6fvY)iIQPDHf9H38=iJLll7yp}0!K8}Xpzh1 zB7?zTS$6dMeTbqs_Fk_y_HMUJF&YR2{Dk93f(*W_(P(0JyPX~S-zH_M)oR3IF_cOr ze=rz~vI=Cz`xc7@JkLX`)s8`vKw4KS6_`vWxLhtGU6DUWxlAU**lji&8jZ$3<&qQv zavTSxQpwnjMkDlkJ;LEI3Wb7SMeI~MX{AFtosRj4z0>L7?enKNOufY6P~KZl;o99* z_+_}f9qy)>v zL>mIhl32+K#h(fDsR-ug-LRRBq#I_(G1P@T%yKUXt0Gp?N=^yLDFLyQ85~aB3|xnP zMu&s?E>s2^Uazl1{5xuvU<4$P*Xw1GoaB7itzk16$C;%in5=Wy*~%j&=x|d0KTbds zpai4Qjrx#Ir?ItNM092W@wNAuRRhI?Su`ar5{U$>nhS+OZ)7c3CT({sQJ54y?Thu~E`U_x6Nu+_cBE@$l?6fBdTRU0H+XuR5x7B4VVArq=3l>9ie- z;>Z5f$7Habi0|)YP_F!d)oO*??Pg$)#{+RNM0xWw^d@6UH7$W;b>8NF)*lrM-)}Yd us~6=;4J0j@Ob#l1ePdzK{+P2k^1lIQD~Yof+B8c500004{FP;YV zAe~^`&|0W3;HDm2rM4TZb!vv~wlvL4?Jtm$#e;!|=lT8ed_T`iLJbB3*q^(v7c(<~ z@PkSILi|{vuz&oyS#LG(Kgz5X?YWd4Fce?AK6Cl$oNs|W?7Q%_dj{R34t^+))r}9r z?c$y1ryyf?;(5RS;jA~sHgyf#e}HEPB3{y4h=#(9*Wp^V=QH+;*|XDA@8lXhS_&I` z61396N&y8py@JBWZ+Fp$2XAycM^r8y9CO;iJn^fXJ4Zcs@1AcsZ<8L zKSesENH~&epvE{HeD^><+(VoL>bt+_LZL9o=kvlTz)(Eza5&P*WD-|AS?uh;MJ7b! zl2^mrIR!V9Tlms`kEPT-WV2ZW0)cccmrIXEP*rus=kuZ6ZX-NCiHqa6P~2XFs=Wfk z_VKaR!i}j#@Le8_Mg#G99QAsAc_@8BmCNOMp654Xu^2j?4*LE6$cA8$&rDGiXqpDg zvY42dfYa%OAP59@l~ELBB^V51=#3`Oefa zrqC4IA@)(sosif75R%{TA62p@n9C!vb)m!}k;n+JUMiIq%$BSpS!3&%mafPy UGkGjIO#lD@07*qoM6N<$f+^-cqW}N^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/dvd.png b/media/img/icons/silk/dvd.png new file mode 100755 index 0000000000000000000000000000000000000000..9d94de5df00c518c84b400de7176f15843af7f4b GIT binary patch literal 764 zcmVMI6@>P|2u(tv7b=KIl+wsgV@<@e*jCUY7=e;6+2+<% z=39E)&Y3&g&fIj=+>6`P?QFX`&qGIYeyIZ&_j7LU>vx{}ex9QMp!i!3hoiz`v1q5J zrk2OX#(tU2=D5jZ;*3V)&^yD>+0y!>h12O&N@ks8&IN-(#9}e*?d>6x$sn0b!tHip z=;c#!Sl4IJY6i-V0sff3@H~%Vv513%0}zNH2#7|b$mjDY=Jz4)bFfUm$BX9=Yyo#%fy_^Vi~$?>=7ebQy10Lgqx+IAtGPE$iF zm7BanwY5CZL_29lFjQ zCM5tP8H3V#SK46~Hk%C{9UVGFd3ibhRb(~<9FNE0^ZC%$*0xFk48y?V@xX4kL$BA< zViH545Y5XuGFZRgk3b-RNF;)mmX;_5kRsVcAVef5=jG_w@MD4TQnA7|E;L`+Jpmw+ z&7}Y}T982`mbNgn%46mSkGahVUVR)#&H2WW{~Dre(~oa! zJ}e1wsLs_D)K%4|=|$3LG&-x*ibz5_%J3Ro!V1=Xi&*h2V2O2L(fu7Bo}&X4B2n~f zU!$_RZsh1D4h{|~`=0eqfB0;K@28tW2w>SWk0ox7LRddTk8gBz6qV|#NtH^aJoYp7 z^zhOb?3 uWiDU67;9>7h&43TGxZI%!;-n8wEj1TbK{B5NGa9;0000WP)`Q5?tj59obeby-AUR|b{@bs>~!*$bhSkC@X$Ba2>;$TV}|${4yOb`fp`t(z$+ zx$R;$S<3Q-`M9_C;-=G4b8l|W?V0=boKugO-gw~4@0=g!`#Hb!CITSZDU-=mWH11dn0G4IpbUHCHF@eFs zK{}bl<>h6X7jooay22ojA8KM9(NiY!z5y=U8A(|Gvm||U2cHasvR9sox z10WL2I{{_PS+po_qV9DWZb(Ydq3lFS*(K|qEeIeIg)MZxeT-+H8GK>;Ft?&bkM1_E z_8h}0=BQ;~hgkLe42I_4V8|+?S1i@vLXTdI!o~w>`jBKYnS6YF9Kk4ml>rN^zFEwB zeqh!)g=xD9=Ub0slzoStZP?OB0Ds@JR4UEuc+sx^G^~Q>myJRQV8%I#X~%aI-#LVC zZ4J7#)zsWIRxMPJ+Wt&!ZEbmvS|1EFG}m#OF*PRVzfp+AZAR-rJu0M!@k(1uS0<5+ zd4N>3`+GJwH=V3&sO`UAQ^j7sb}?LDQ5r5SKgSj`M`jBf4<2fm!&`SJUH&hMQ6|8M|s4oam`l_?a8 zQJGA(B$Z0HBoawLEEXF@BGK6U$+7ao_4|QZtoE5EX=+?JI5{d9$^Q@V&pd6hSdhtN5R1h?A$GeRKA#WibQ+m-6sf2Y3i$`Tc-E^N z8Ge$#51>0!b26C(9jR0bbZs`95exJ+ zVRv_zLELUP35;7nW*0U~>L|vUNd)@cj$~eRU<19i?SvPp`y8LK0B+{Y*^HqnGALhu2t7= z9|2Hh%?ANJ6=$KSFM_;+i`m-KnBjNh^3@xp_@TD`VV_o9M^CuA{W(asd?n|*u7NIeySlb!R7aSacz5>WE;9^0o}X8BMf<9{cu`u(_0YD- e&Q5Bk^?w15=i8y;o%>k;0000F>2yJ z#Jp50{XIN9>>L~%)JY@~QNLJpYVZ1;fl8%fkg$-1!xoDL4u=D7w;Mj64=$Gr8qEqs zFB&3k!g{fQ-;}&dunm7OnM{bs;|K%-pd@Cq8JnA%h(@D`NBxNSb&$(mqNTawb5mnY z@{WMonS#UNFsLUIiGZ3LjYbdzK}$pap9p$a5DOYGKH7`A$7Nz#K*Gn#wqstemj*l@ z4=u6TY|v`8pz6_R1U{D*A+Lt+B24B^`SsYnyEoI4NLXmKT0upp)6o!hW=dqY+v#yA z=pqGbxK;}=n*yw!3nM_JeO~wD@_N61RPgQ_edJlMPa4rquQ!_V03)E^g z^m;uM3I+Q5`e=Z9udlDu^|4nK__g>DA?pb2@)r1)-y*uEAiKC4rv=oa1Vl-wP&F#0 z=a0dmu0hPNfZucrTVKnd5tm}A_Zlu2{A5s5mU>K#EV&nu_P@g z+nzySwG=^15eTvqgNTC}r4rxFPNbjV##ro(6ZA#m^ZCN*>1k{bR!mEI_&!>N#j$5t zSLVaFT8OQMO6c3q;)hxZ^Ts9`1zlifa65KxB9F&o)IY704U9-I*vtgnYtXjmVXEpN zzO<6NwlJYt_z0)diSF)hFj?&J^z?MbuAiy4ww6&@eZQmr%29;o1PCdgL)mZ|LpKg# zW=agnn;vkuoG^>U5+>kXf<*F99tbs-q{L)RoVer(J5pSbN#vZ%QfK9G+DJHU@A^Mv W{p7H4O;zsz0000C6`ri7_|ADA6V43{+Gs zb#88rbi*Xa-rS3u(~UXzqTAie-S+9+TZ$>sg%9W4!+oA}zUQ990l?WGwOXAkm&=7y zQ&WrM4e|!$M*I%B9RC}p%4rP zJ;dFw=(i$%zfjPg`Iq1iJZZIBkxr)(jYh#p91aJ3J|B|FB+^L=G-ZN(dH}CG>Xq$n zjhTA_W@ZLXBobgAnx?_LTPzj?gF#jrr#27^>ye7B;Oj&$nqOA-vjPHNB+E{P!(kTK z+1X(w>+9<<8jWDalSvwpkP-2)fn7y{q^9~&s`lxVTn>RnYiny@VltUnh^d(ox!rEI zACHBIKu16)>2Hx0#-UUyQC?my;$&xM0GrK*va+%zR-n`A zU^bhfQmN3_*T+Ik>vFkZHZDUq@c>&ZQrH%{VYl0{y1ELF#{({x>th8BybCcBCd?R< zmYQqWG)O>)EzpnLg;qO@d7TAD#|DZ^ZfzYBFxiF8%PMFFiV)izLu{i9e(N|E$LgWd zJMcwoL_yI_{h<!UH6!rXb6HALP zz&_J}xVI0Kr3`azIfy#y5wuNUq4zfO3ky?u`PVP82T33hh!hG1JVEj+*MCB9*J4Rp ziU8TT=xQw@<~zT$a*veq1`dS)!s=Y@-bw82?9AY|Hcx*VmB8jTK=(}u$6OcU9x*$6 zWQ9vgILo$_tpb#L1PcCXucGN>*4|~}@pu`}8tQr;S3RWF-FcvVR>b`?hr&E2o*0N;1=MDdx4(VVfd(+ZMTq zMxvM+sMBSwG<3O3Zn)`mluoDfvYY?TduXCb(1Abi^FBQP-+7+*oRjYdpOO~LJUW5vA)*P<4k9WPN* zlp!xHc<8$dAa5pSr_%}YxLhuf{m94&W@l$i}u&e1VoRsd|PV%JRO$laDX2ICl7>Kl5Eo~w* z6VT-3Bpo}JZ4^L78BJ6?O?BviTrLNP!x1o8EEfJ(s>s@8EZ6j1!28IX}GtKt%RwlH=ftg21UejD!~~WWSAtR9TMn*AWOU+l8i2 z0|<*aH@sm4FDOM62wA@XZ@yO0##hQRly#(|{$nwcB%wH3unni9!s`Edh}WojiTP<; z8j4y|kl&IBUK1O+%^XyA=OMl>1p9Ls9{NY(^ZA0Vt}a++sZVJh#ISJyan%RW__+*{ zz9*NVusautk}&Lhuw`j?CWA!-N=r+bd5?2D8sCXw_^GBL(L#TmDc^%r z&vqiDWIL|Z9)qBZhXhe5{4;$VeyPkO>n;uddO?1iLOVKyfjUmGq4CHh#${#IPAKMB7KAG_Zz-$NU2qgPyRYDi-8^{UGW@v7L1(bmYAaBFzvS(ShGCfDAq g&DfF2@LOB|8#4yVi|tZ9MgRZ+07*qoM6N<$g0=sL_y7O^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/dvd_key.png b/media/img/icons/silk/dvd_key.png new file mode 100755 index 0000000000000000000000000000000000000000..da9307f66d45c824e1dab3417fc1fc2cca1348c1 GIT binary patch literal 816 zcmV-01JC@4P)_EVp2MD zq8T=|l(FsRwsdn&ZLNL1eYtJ#?sIgK3emyC=edW^>vhj__qiMZIe*9E;$pGUXdIZH zo?g}K^*<&iCVuI3I!de6szx=c(xdwi5|hc4%fd<)PPyG~1Ofqs!(qf?F@!=PSgjVQ z2D=%xvP(0d=*>GM_yfOpI-SU7vxvvzAd;=EE%^O@q|<3+(=-^Gg3&OBr+xS5d!IbY zI}ng36F8Mhfm{s3fZRJA4g`ZiPMV~5kce84No-(h@-;diH)}Wn3m36%XQI(42Sg$f zPU7`?VYAsl>ghCtSjdKC)XH^{Vx#qLW9DAlo#Gr8R(d=hkf11vgUHN8~=dA z78WovGQt65-QM2j>Ll+ForHg>1x#cKz8Nt#m)}4n68Sj+*~CLcLW0!zx_x#Kd&W92 zK@Eat8T_B6aE@L@dtF)Nn1BQi^L59&W+VgSNbE?F*d0P}O$ypA!}>sJ=GX|lh^+hw zvo9MFb@qYYyp6cK4fOXLpzXC-lAcce^Ce!X$cLf-99G9JB1~Ney>SU~rwB0{f%DN* zb3)1;B!xnuoSU1&Zjk+y-gQ{EzQXcp0Crt1+o~EdM-6C7h?VDOu_hP7)Ga{EPd`KkCCG}0W)I%K= u`(M<;>`YHdMsn?pr>eSA&BDb;_x}cBh2mUtnJEDP0000S}P$VM)Y%`)vL%rt*x{`~HJUuLZBW(OY5bH3;Ke%|MO&UtwNcz=e^=WFtKJY&nt z%l@UMrJsw7i^;jUxzP0VwCnAZ>(<}(SIOq)W*sp*iMbey#gIrOkWQzO%jJ+tr4S5m z!!>Rxy>yzV#vDWS*8soGA9r_mQLR>y&*woQ(P$L$cpT+&8P)OyN*5t`R%T$cKK2eh zds=@5pes{zu~-DXN~IF$b2uEv`T0467A}r)ncYU^@&`VBcmq@a{V4_@=9{GLN;aEi zhD;{IAV)_>;5ZIcFPBTmr8pF_LDof)gid>}@<6X{;t{j+;NSo>LZJ{d(LGbp$;k=J z3zsPZ2oPh8h1!O3J2dwYA3$z)#{AP@*(XJ-c+8ylFM zoMgrHet3Au^qNKo8;L})zrT;u(^K^H^u!r}7S&7?LW62Gy>|C~kKjun%z}#^L)zJO z_77lUVgj?Xv#{B0EZ6JxSYKa9V`C#MLsq6)pW870dIo}yPVU+k*4Eb0+}sSi-OgI1 zpOR`8iv_*Cz2L}@sYW}bHA0d2+do6pXf*I|Z9yy+LnstNp-{l#aKLCZvRp)TW51a} zbUIyz{Ya$1Nmm-Qn%Qa;;O9Q0t?f2eS6AWp``I?!ZZ`x10W9`c3}7;u@(eIMJX~iU zG_5>(qDP;mj{zPU^k{8uC6G2qrBW6&Z)s_PL?Ve(0QnD+SBGg}V4zN+l)sbSl~zYz zjAGtBkA;N=xLhu1wOSYq29{HeoX*6^$VifGGkEQ2HZ(Nc=4iA18bTrRJu)T*jV xr6Ql}&Y?uw@m{S~=SbwqyKH-VdxQ*}{|kdM&x8`N2Uq|A002ovPDHLkV1f$qd6fVF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/email.png b/media/img/icons/silk/email.png new file mode 100755 index 0000000000000000000000000000000000000000..7348aed77fe6a64c2210a202f12c6eccae7fcf24 GIT binary patch literal 641 zcmV-{0)G98P)Az`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E? zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_ zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{ zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L( zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7RvVeTifTlZGEZNAHZ7i+XD6HF1R0l=P zfyscSl7Z{b3aDs0m6Ms>RMQy=_$j(NqsYBiu(n~MBTC@sVniQ-D7XOPL4s1%z@zCE z#9N|hjR!nUwAQdZiP;?yq&uRRc&DJEnrMqqk0|m)F^Qn8x?}}ytx;sVA|RXQQLVw6 z-Q)+esR)vZ5Jso+9>FEb93>v#dzD8l7V^#ng}-dn>P-cNcgHd->U2#00Q?OKQ zcz8OiAj99uA_H|SPuZW&3N@X~?e9Wq4Gk3w0(oB67DQMxk;EU&)A-1l*) zwF(-Bfg`;q0Oz2az;d{^L@9A{Qbthn!_By>J%pVcu5B})M)9MP!_mWskZ#$7$!|}P z`+5u2Qa>-D{OhOAee6jGom7INCCqpO8QNurRMbW%$JB@W*x%C&Mj3iL2f>JmzJ2}B zsxKVD*jQa0xIB>v$lMc?Cfaft8sNECd2?0Pr~ovTHJW zhZo`7;X$R(W_se*OR8zHHsnH0(1X6wG?qmLRW8mX3QWjrC&-BgIgP4H4{F0Mkd5YX zg_2gTCQGcXb|K(*;@R7zNic|RhAfL84ObVj(rhejztEEy?Phh8hQPIXFT%&D_;M|!65~o_|==)((s!ROj<^0mjv8#Q4o4cZdw^<0!s>!kTS(r+Q&T!<%0QV&g zIu#0QcaBCa&9OMfMn}lB|3q?Wdf_{a%k)2VbaYTb5FW(i@x0&f7rVN;9<{f((^xEK z{hdR$x{ZuHCd=}H&d$yd%ex|q;;s4ldFSBZVDV4VRt`4A$DK~+WLsMsjYgxE&EJ0k Xsy$=Xcu`==00000NkvXXu0mjfruKII literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/email_delete.png b/media/img/icons/silk/email_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..a9932b1ad5ee05b4aa191ace4d859609098568cd GIT binary patch literal 756 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/email_link.png b/media/img/icons/silk/email_link.png new file mode 100755 index 0000000000000000000000000000000000000000..2c49f78a657c1ba1ec0ca6a28455721b20d4ec50 GIT binary patch literal 821 zcmV-51Iqk~P)@&xZvixulsk-;T#44a~v_p20ZGUos{+e ziqz?x2bDc`a!X|=H&x$AMYoNVcg>OOowMZH)34;Je1??Brir-Kni02|lNTF@eWxU< zNk%>3@}$y)izYH)GssfVp3xDiE3_bkWMX`Nts^t6W3>pK-9Ht?o9O^7?i6NLjsQv?P*iV0iU-X5Sd9M&!sd>k z-}n)V&Ti=SdNj)vcx!UOwiJe3ap)x zhTreU^71mwW;2vMYG|~5SX^`qp4Dm_$qtT$Tu~De0*V@+3QHb<@Jz?l?%DX)jK3n%GeMWMRG`GqGK;aY9f#^aZ zOePZ?4hJk23kC-Vah~@swT#Cppt+@$Wc};h+}xV#>gq5Bl$Mr`=jZ3Ai;9XMkw^s5 zntHTH0W_NhILR;mh%Tj488#RUA*0aU)W&v_?a!!auqSM92 z#VeJSmGRoz+9WTwtgP$?uL8c_qaN+i49)%pyygIR5QP`^00000NkvXXu0mjf)cSaJ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/email_open.png b/media/img/icons/silk/email_open.png new file mode 100755 index 0000000000000000000000000000000000000000..7b6f9813d41f1d95c8f1cf1495c2314dcf16d3fb GIT binary patch literal 783 zcmV+q1MvKbP)FGA|gUiBpPKsNC^f4AtjM-BOo6I z6r`2%Aq86cL2037X}jIFyW8#V&zXS`i5Q*a$xLSEecpE_F9(1-jh2z%g|>+>+9xA0 zkA`ml?cS-I4VJBEmYFboVFjV6ilGGo&n=#={}R-6x+aGgB1p&v)GVM86wScQ&nTXB zxV()Yx6hm^cssa#jvorBcDDqH1WO7Kif0)qmB@%>Gn58D97J7@zwm_MRj>bE`@}Bp zw=N%IUV^D*3FYq{D0}w<#cynQ*tSI0c9ar2tzlGk`gkVb2Lt-h!U1+kCK~*&K_&Eg zBa1QAcKdbiwZ-XEGCIUmmSv@bUpq<3R0cN(WOi1<+aaYj^vwovvBKizD$OfKf^3*t zR*wY-2^CREWpg+t!?!14)f;1Hg^#T$ZeGF0j);QBIfEujA4UQ4w zNg^VWy=WTlU;>5#6gAADc`ObgsZas9yG=GGSPAOrw~1)(ceCIa2^Lcs1{H>cG-|sx z&^i^zCubH1(vjd+-8>UG_jIg=bbMYEQ2D`$>W=jjJZN)b-Xmkum1P_Y3Lece!FpJS z!>?lC`#zZ!Ci@+_*F777byLAt?~&jo5nMJ|NvG*p4yY_Uy|}ik{~@5z3VKO`8J7Yf zK`WRCms>h+q)5+>IRvcjsPGB~y!!?`1Q)?g*ou&Kgj7kMY4<4@AgvzQmr(HHo5AH2 zwR@tHqVEVPBc9SA${J~94M{}<6;sj#nUXm~5M|xA5s~vvmM!jVVbes;o!;2_ve8U# z#kiJNIi=-SS+z^mR_#j7w05;_TDwNLUVq4q`svKor(cqJzj!aV1D~<*HB>(T#!&X?LweP`h!V z#f5ew2F#+kh=_`{(2cDWLBy7tHkri1Wb7oF$^3io``&etX-G&e+`Bj&F87>!L{-_T zzWA|n)Q0xwK!hlEuby~r@XH;Es=BQ|oSK=Ky1b~fiyf`hx;lOJKmBOx*5ppyZNQnY zZ~pS#)g`UB6YVg?ZhbEqmlQM~s!=ZT#ob{;{A zoFhq;@h1;+eW88s^ed&e?78U$KQ^2*kB{~9*UT+WJUhs~LIDwr0&yZF>u%v)#Hr6O z@xq}3d-JPrPJB~-!^Z8k`SC}FO5IqAV@F|cf$GPfk;!B>jF!OSY(VC<nfc3_W}hQUTZitf6w{8c71n-2vV^f1S5q93fvQmQ1tj zB^?@`daTGwy+Hz`LksuJ_dS8xX&mZOe^A|Uz zL^d@{{_qFm&m3WNIEVD|XPdoO*#Jg|a-^R=%mY)Gt002ovPDHLkV1h-Zv9=jZ#r=d=hWyU?P}@^H?N!+D;^s4D+csb3rJhKW>ZSD{se zW>rw(t_Xc9oXqah$=UN}_66>SX;I;fY3wMNTr--k1NCS;f-gNFdDT@E;ZW@!9rz94 z`pq8AwOk4o9wZJjJRP{n{DzRK$no}>V__jrL&E}+cikkP2KLq;(930j?KgF*42Eki zL=ueSr;C(^N<6$hhAJ${3x(x^$utsX*6`)d;Yktl4F`2J08pVl$ahAX21$za_Y|qA zNoZ-!uw|RFG(W-3>jpRe1fRU2a#d#}o_2r$K!i3^yBV1-qAq6p?pnTsEn&(6ux0BA zYA11H_eteeBA&Lg3L-R-sYc>4UO%n{lLhmOJgTT0WpUj#Ai;YIWq=B?y6H6DQJ3FH z<-FyXApCh>JX4<@q2s-viU{G43p_<^ybjV-MKRe0D+p2*KLNZ=@Sm?@f=a}vunDhc z|De~7Jiw$I36cTq*AKvKhbngb4Sc>xs(LN)$RKux-m;9POQv3gx6$Tvk=PfwsX@YA z8x^??pq^y-7BlZp6V6?Psou%pl_QhRvTXe^9WEPb_@ddDs^8H)r*SWY6S&eneEb1* z)0kA2FuM-VGD^>{QhM39e?zDC{AT5$^Ja&5PE|E^6w>on6I28s4wrbQhFJN+t=`k@X24nQI!m9kbZt8EmoWWHeFN=fO8(U#im?Cy002ov JPDHLkV1hIwPW%7> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/emoticon_grin.png b/media/img/icons/silk/emoticon_grin.png new file mode 100755 index 0000000000000000000000000000000000000000..fc60c5e1cd0dfd034d9e755302c9cd163d317a9b GIT binary patch literal 714 zcmV;*0yX`KP)1zIPd!!Rpoyw`fI~IH*r;ZRp=I> zLlsmQ7a^s>^~6cdZk{)rFL2LIrwX@BeP5$VcA&8uP><%8@Rxe=(cb`W z#GKM(=U}koJX*00zcGn~%c#qPDI+Lr#@K-H^8><#(bIM3^idIDM@)?>Gm+MNaS7J& z`83#Xhzn7l{{a!jl-3g|ZRP9O#jFSoJJ0J%0H8u|(9j>(7)Y1~x6a7pC6EI60xzC{ z*eq`C9X|X>#lHTyczOW>013a6 ziYkcELTMF}TV?ufHJAjLU*u6m-3q&Fo&q7>(^v$kkW-hB;T<&%?Nrq6!32@5`{G$& zc!RDDfhrIuS8 z?8Y3h*`bPE`v}YTiB=sTw={z-FjSN=Gid5W_!K{KCoc9qZheMGvWJpn8>lB-d`V&U zCXw=8n5yH){1jit2GY)Qx&5l9{+I=T+1n;A wo<0$}y{E$!z*)wfCFLvwhp+u5O#f2f0aLAAZZV~`sQ>@~07*qoM6N<$g0=}oVE_OC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/emoticon_happy.png b/media/img/icons/silk/emoticon_happy.png new file mode 100755 index 0000000000000000000000000000000000000000..6b7336e175438cf27c9bcae4669f9711e09304e0 GIT binary patch literal 731 zcmV<10wn#3P)l%u5=V2goM%QPGY7PBv-7BC^0g7Fa2Kgj6IQyYY!iS>F3t^;Y z{`dVv-isd(F{Bofw-%8$vKIg>me+{)A@}VXl%+GsE>t2jcM|EqamZ6;kUSPnE=BU) zeuy6|$S$@a+)Ca8AoGfHhCIrBUVy*v68!x);UCyy{SEN-)*vyqhXD>Owvbo=q+gJz zCkOfU^N3FMBN+)mjLmJb^;pE?#E-YTSlnhTG?QEa@O-`cN-qPdAue>|r>37@WzWyjAHen>@2_o+^B&_t+-Fms#M`L_^0`U`~aor)ql1d5Pg z6owrVjF7Of7j1n54cD~V+Wq~W=b7nXZIaQU<}$-D^Wh8g9iyuJPn7-MaF0z&l@1k7 zi;z(T6-GoDP~qCfbDCc}Z`LYsk4>`*H%xtJgQ?D-@mf%i7IOIIQNnlKSrOW6T6Aa~ zzzv!ft#0lKwzQ#%D*U(CNVtT$BA5z-ik%o65YF5q{4ms7cV2r-06S=ERhf?MznhZa zGrpJw`vq|!>WixoQA~L~vGVh0X>qPIVC$n@kA zgAe9Vv7m|wv0n;2S!@A_bF_Ik?_SL^JGp@R5EaWzcA1Gc%VZkUm>_}pGHl31$w(sf z+uZ2Ept_z!a-O424U9dTV*JG{cuTUO^>-YP_8i z`v#vMN1_$fg^2rkMu;VMV$!FWzJD?AEISTe*2Mszrd1b3X#X~G3v?T?bR#BKi;99M zL3}eC>Q11E<1D@G!$!0px~z-qtUQ0moD|RXF?n)b7)X-x9v-g}ON5Q~a~p7C&aIOn|YYgCp0srauA_td0R8BpPn z2tBHx!h{GTDqKz<)yndDvwQ>h)by!v&Ey9=O|}P3tOoUHEyR~z5ls#kL^zW>rq6x@ zxKVRVvwio1b*ItfDtz?~5`95k9ZV}h>t>7%h(6vSDn2{jeoF5*0d~}^R%JTYeJdqF z8DB4eT|!)h`uY!uD5fP(tfiZ;V`nQOZ0tC#3ju%%1Hs0jlqNu;0=RFCJ_tb?;2S)D z0%9w;@@stbp5)e{lz0XJ0ss+?m|QPXFQBf5isiuJm8e+MTlV)=P>E1m!7aWdp520Y zjx<#eVH+(Oq_&8PrMl#q|D0fPp$$dJroWO)7ikF^s0)Dz@9As;RH&(|C-4q@gW^n_ z)P@t}_jLmhPQNCcy2|=o5hVasM2P)7!BfE2fCMU*g)b}U=;|ezSxYjrmX5AoN=s`{ zX<&jR;^WwespUU-WW!gOL>?8$<*Lk1j#DkqQ7z9gJ2_4^Sp*G;XLe8vr?CwlHDxT_ zGwmXLNcG-GiG52YoFbfyu~<%n3Yp|Qx#SFO*$zzRAkz=eRh(tht_wQfG}8QSb0Xf} zf2TEn9AZnj(hGcT26c5zJWVXU6VE0}Zyr;6H*#|Kkly{x%Ck33zj&^+Z5!-Ntl3Vm zA^>r?$n$OX9iPXB3(j(W&qW>iV-^5DT{kK542p2bdwN_0oMpmUMx14M@1?(l>0jzQ Xr>}D#C{Y5K00000NkvXXu0mjf8wo&0 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/emoticon_tongue.png b/media/img/icons/silk/emoticon_tongue.png new file mode 100755 index 0000000000000000000000000000000000000000..ecafd2ffc542f88ec6e42eb7c57ee253ee7a3fcc GIT binary patch literal 727 zcmV;|0x127P)@Qs&9_62n*m}Y|JO&A-Hy&om}^zi7~6MB0IV8=~|D%HZa>m>>1 z@o5F@0^%~%r{5u>m|_=&;x^`akX^RiP9H-~-}B*?Y=@Dk2nqIPg@kNiRh7>~2S0hPs5$m6+LgMb;RDO$<}@1QWC( zKE!6cS$>1Nwl;~0x=;c2IqED?vnOk$Xp-X=5+rO8uG~&it73ER{s4F`HC|kZab<#N zJ*Yt?qrA$|v}K;RGj*!-bF4qyi59mr{rEy`GcNrUq?sG$Sh#jzw7Kgj6c%vxr}*Rp z>QYQtrcmz1vyuACd(>Zz9p5pmH-C%r^ffaep35tGhPtEGTM3#15Qob=i_@?8_++Hw zEN6F~)3HBx0buH?DT!xDgah8w=W=kC31=B|mXTfO|5B!Z(Kjm{e&X4d%*g-%002ov JPDHLkV1iW*MF{`^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/emoticon_unhappy.png b/media/img/icons/silk/emoticon_unhappy.png new file mode 100755 index 0000000000000000000000000000000000000000..fd5d030ef773ddbd3f18925487a870ae7679b08b GIT binary patch literal 723 zcmV;^0xbQBP)nI31uuPEx(b2EPDKzMg2IC! z1S@@jQACFdqKw6YEZj=hS9jm{d7haL#U>dYYEHv2^W)FV{Ee#eKT-30!OfVgDx)f# z5TQ>MRCpr7vK;P}hO60nz*0M4#`U-gZXsRsl9|a;nTHdTwPU zDB&vwuq%j*P+$205yhlhNu+vMo;@3i(AGSxUjqOYMuWBsSxtgO1#qk6CyO94_?QRx zKx~LBy}(EB$aG%Fif0rc01#o&H1#8u0_w`BSPq^{qhe8SIWQ2S5}`K4Ej^>AaW~=_ zTo33X)quFA>X3>>U5xtpXKqm+BT*5E@SgVS8C58&t0eIbd`!4p;>FWBO5Z{dM}5Z7 z-Q7SY zRRtnU+2Zp(L1QcF+PCx%bW&eiMtlYJ5j$IwVVpI!Vv~gw2mV%qCO3uhz5jFCglR^LI?Ip4kMsCGM^*WsD)?OphMkxyJu0+| zkWd8`MnxD>;n9Ixn%>>-?4BSPc3M<;;#Bw6I;9CTQVwcSvx?mq!~4=dFG6=&hkn=x z2;Ms#TH5m3J=%p9AHrs*5N{0)a^Mu=7M{ZKUA%=?cq<<|D{t$Y9f1GdDOcrd=)#Mb zxLXXr93+)AoVj=iRGA*%B3=oXub(Fry}iDe-e@Z;FD_(}?B9Za^K;gRD$1?D@#%a+-~0vqwuU8or-y0ZV_*kR)~P8Gy0f#- zK#vhR*o+e@M@2ytHxegYc@-^gWo_auexB~edz#v3<>Yhcnphr})b-XzD$e1CU66pl zvt*JpERXch2R?V3?(5JWvjDL8)QO3uSA=$JNd$Qad`1JGp}?pA(u2Q*>0jyxXpdYZ THlv1D00000NkvXXu0mjf4(Upu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/emoticon_wink.png b/media/img/icons/silk/emoticon_wink.png new file mode 100755 index 0000000000000000000000000000000000000000..a631949b5126181d03d2cc657dcc36c0f2c3ae48 GIT binary patch literal 712 zcmV;(0yq7MP)(qcS7fXtvA0;;08>+3O7teOQp%zqTvQmk4Dq@*%u_^?FA9et#8o5RRGs- z8Z=*jFWAS8b%g3KO_4M^U0l1vRYZa%HuO90z%HmEX@+J8GM!8d$d z06T}c1obiBW)^t)JmNrICHXBid>uMJFT&34P5LEvxyN0giU_IY6+8uOR1G02mTbO^AXBl*H0onaP>T38HsKXOu((2x zoqmA{D^LOV^%1CB1+X)Nq}LuKnx4QG=~)JNIu=IS=5aZKu$aPt&Jo3_ zUXu6SXvsk)AGXcggpL(P`gF&fOm9BgnW<=m)EsX1DL#6Sx)_trk;+x$*~RQ=FSBEP zrw+C1-Bnheyk(Ax=UQ1+OJ%rmAHkXc#NiUp_sKCn47C@W<>KK>+V{s_0C;!PWX01W u!ZGiubwzNNC(hF6EbTRy|ME=#5eOSYYtbpBV}~vsBnU!_?2tr-P=|^T zED%wc9ezHgW@NMb!^uT_|SvCpFLJylbx zY%bpaTGI8IYXMN$9w<3j9VkA~NYOKEQXsj?6a9_hcwfU$acAhJhB)zb_w@MVUEy@S zX&I>K-R!bhu3?(6bHWIg$HEl7{9g>>&l_qdd+UYb(1~BCo9LptNq&8>!yoJ3Ui(i5 zRJ|XnYBklL!{@$-7=3mJ>P@1c=7Oc79e-V7yf+%lD2!I;Y&nXBZ>=B!5?CB>LvEx6 znI%n)qqi$#X#wKB(U7XP2P=+4{b@j#r%9-K(8UqtSDk>0UKzf*HM9yqMZ1D!$2MdZ zR=`U>0zhOH1XqN?nY@AQqB7)Fp4{v&dKXvb43hZKvnN8;Po;+jY*}~*Z|W9Q0W%{D z^T}Cc<|r(Su=1K=P5>Z4 zg`et&Va}tdzBS-G-ZcO)zCWpJvGQwrHZ`@wpM420ac@bI5~KkTFfGEM3sPWO8co4^fI6lPnA)Y{ef%@{+SnoUk0+dW+*{8WvF8}}l07*qoM6N<$g7cXs A&j0`b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/error_add.png b/media/img/icons/silk/error_add.png new file mode 100755 index 0000000000000000000000000000000000000000..4c974840e957a8f7a012410b90ff06a055534a5a GIT binary patch literal 710 zcmV;%0y+JOP)0|UoKa{= z&8FsYq_B&mZpt0E>87*hKHb{)+V{Wr9ETXWS}*)~Iqy0D-}9XJoR~5ld`QhI}Rf=kyg=`}az> z6_9YbOIPpz>6=3??LutnEEWbESt4dJveA!-IcBl=q-xF5yQ};Uf$LrUNN8S3D*2Ff zbrXRM%i3cFK@;Lu8FI-LxMy#JR_##yCLrM|r?xJW&qR@l7?7~ZSV6+xhV{>4L`-L( zn{2|(zGhrfoy7SL5v1)r)uzDtw(e8d{ETdz8%bvu5>_b@G;hAb=-4UTd36Cgx(8oe z6x7q#AXZnSLC#e&;p3i}R`Shb;0q98XrPydIV-D^%tSm zUxq-=O>rEfd`H~zffeL4LBfv>vcV0=+KF3yOwj$zREm=3`CK2oDueOV3ra~_rl z55P9C4@*z?V6ksEOpkZMsH}wOdL_E3Rw$?zHmsOxVLK4Yx!IzJX)B~s$7$t$JfPax s%FN7MvwKjApdjfaM3}Y5P)NtNS4FfTR?fV zd-U$^Je{j6ms;sQ$x0W9{2-vej@j?m;OyLe^1lK^PMq$}3&x@WMEwRh-t6*Cz1o?$ z>cF%nuOm281Az}gh&nMld>8cd%-U52h@9bipA$oD9`n;Rh6YFOJ#egzJJ9aSS18Hcm)GW2(nZvGY^a*Dk@ixapIxS$TyUW9VEi<~naf zFm{1`b{2!D6IX6cV&K;Zm@nFVL~V~yKksY`|V;Z_*$Z^m%-M)Z`*z%-lyh!i<5!3<%tf`X=mVpsf`mZDQ^xca3$ zm2*@k!+lW(Yxx>{D3kJC#nh!$1>$^GBwf%HQ#P_}ft=~M93TG)8Pw_BIl6BR00000 LNkvXXu0mjf|4UE) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/error_go.png b/media/img/icons/silk/error_go.png new file mode 100755 index 0000000000000000000000000000000000000000..caa1838d7f1deb211954f417f44196d131762a33 GIT binary patch literal 734 zcmV<40wMj0P)B81U&hml7ftTkzJn#82Ff)=N+_m4tia#>Z zED;~bI?|((@r+mjthjMa_A%$0tfL-QbPg*LnU_WAg~uA`bk8XfVKMue{f|q-zK6T5 z$+$@!kfN4#c5k}DXoQw#g?X#j%8Ke&msn`eT!P~gh zHx954K@vhr&4ZG+`hMNW>{NV8fvu^oY$D5Q1iV26C?>7a-M}^ zf+7V1!ylPMVQx91B8Cg`?xBTxqe=5WDy=kaC@M|QuY#QKhWa@G0EkNg#f0(jFm#fT zq(fIa<`(Bsvbh3LeZkN_`bKD^)UAxX(*OX?;)Z5%EeUj&Ln?`^^>#>7P)wMLOu%Z% z#{0>)_#PZZQ_%FyFws`rLW<6?B9I~^a*dRT3jsj_aVg-iIZ@^~jCT_~7#@6%x*tZE zq`GHV=^FpWu6ko=kNu#n>&wdlL2&yUSp1p7YT&3fgcO-N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/eye.png b/media/img/icons/silk/eye.png new file mode 100755 index 0000000000000000000000000000000000000000..564a1a9714ff37aee1c8758109113e434eff7862 GIT binary patch literal 750 zcmVWW=I5Rl}zuENrQ28Pt;CX(qKOcDU|M8F&Z%jVGSZA7t& zSX&s1bi|{*v*DgAz3ST9+K6Us3~0Q9*~BWe6PID=&0x|wWdf!IWgI(}6lv9v-FpSS zw1U9OL{Ex%ACuJL>=wxTZg0 zEf8`!jsrze5UvA~SqG-HeEY!{P)iC{?3#nq?S616TB~hnMW{0-6j9tLvf?&u+XiC{ z?O_E0jiYQZlqIojGL$5a1qk9N)mlxpmZq1W6gHT`ec`8K>j$jl3}`WfukS z{=!u2#P1a^U!H8Xl5T`7??NT1t zUc_pqB=&-xQ}oxwg~5^6HaUDuDLGXE;y3!@QP_pOFSc-kKKIu gX8xa5{%_a#2W_ovs9z>%07*qoM6N<$f|edvg8%>k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed.png b/media/img/icons/silk/feed.png new file mode 100755 index 0000000000000000000000000000000000000000..315c4f4fa62cb720326ba3f54259666ba3999e42 GIT binary patch literal 691 zcmV;k0!;mhP)bpQb1=l6TxbDZwj&S={?7%qx-u`rsG(Zp`-rh=e^=%((1yvsuf5d=&62Zj)Y zH&JviNS_F4_Hj|T(1j4$p-!}kixP9&dB4uv^MveG?dGf%sUCoc2!IFxD6wHRA2^dX zXRVk!-qSfk(jcaUKn#RP48(whfPlJUpApdrA!TQi_4D+fVoM;3I0gZ8{=Xv~Po;geVA+Em9@0Wq2 zr>OTZEGR05L=gf1T;ucCxq6Q6EgJiH@@-lVaAlQyw`jIF^c=&IVnj|95hHbE_cnt| zTzZQ?F4Ne@(bH(~&3nM%m)I@ID{@jJ2qZPjr)jhpe9hViOwH5k&|T#EmmL3(vHeUQ zq^!t^Al6JD;=mHq^Bg?J-8-zG2Od7gZbknG;K9czYjPqG*xjPo0k(c4%lPXTpw(qq z@aGMnxtFS(np+2kC} z7P02O874ZkJH$v#nCUVx$({yDN`IX@o2wyvTD#e`qN`_w5<}$3F+_TL{y z@MRP|R@VB<7X5M7OKHel5p5DuZd2LP^mcc@yZiO|gzD2e3w_4ri~)#<0Ehs9I+h%+ zEqXIo=rgYW-Z7;;BzagiGdi95D<_xSo(Ra@Z~W%Ib%wDs3!CdlVJHbR%eNk zBqEX^M6!%x7d^Y_IX0F9NuJokZTkWHNjLfP1ZTdWv4KFAA#mwDEmzYdY9iz)pX1ad z3)5__kZA_mImnE!wn$VIw_7&<^lA9oyNc7ih}sMe`f zNgGs%A|iT+dHj9uJH*Y8vcAB#udp};?0$yQ5Y;M`I%%C6Q4l|SsS&cb zW%eCnah?PrkZ)t>0dBa5jSGDIoa4EYZ#K%-HZMxcYew7JJu&^6oF)X4jFFeg7g_v) z*`ss~P%Qa8DVZ&l?c001>#pke-RVz!I)Bni>sArOjP4z58>V}J>-Vz$FQ+EKoZg`pMkVv{y%udh7U8T9PdaStfa-U#H$HMqJrX zp-9Zw+CxW)&Jr=Iq^YUZ-)%2#w_5(&+UBw!=T6$Sv^Eo}59loP8rN$~6LnNjLk$(w td8e)2N9}FOF=%aOMlM%>d42BE=>H4U@GgW~M}PnT002ovPDHLkV1nQTVmkl; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_delete.png b/media/img/icons/silk/feed_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5e332b4cc4fdc60e44e5f3a5c2068bfb24100241 GIT binary patch literal 746 zcmVR2Ufr z!QE?>bpQb1=l6Tx_juY4x@=z=P6pe>%4jL0NnK<&eL_if5qT#RMdU$*Zh{&81L95L zO&DD_7+8@}CSp)*WlCA;?EgkB#DS5 z2$7NHSuX2M+-b(b(YnIc}V#wT?hhAaHw`@?Erv+6XC|OI(>`_97dr zWS!jm98aEN*Ek^1Xi#g=%*jbb#K7hfS3e>K(n$9xqleisz(YrwIn9l8)SKjW8ZBx> z5fS}kyzn89z01(Etj+S}TP$1v_Ps*iDD^tECXFUJQ5zBhvQBzNc;IE8I7QbW)9*8X z9yoB6VjHyvjTSYch=9K@^XZ#RpJro~tb<41rg9G#PO`pCslwi8s5NP{$w@`TNDE_&;5My3+ZMQK`iLm%dRncM%eu@YyWU%63k71W9ZRZb;@!wh^O-N1*>(YP6xI2d_Rfq-Kd)d)PS06D7 zF*ASds+dKMWW&FI73P)_-R<_JP=8!kso#WtRc$m;LyjCZG+DIW-1>&R6=X?aXDlua ct+b#19|+d#a=?|~qW}N^07*qoM6N<$g8W@n0ssI2 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_disk.png b/media/img/icons/silk/feed_disk.png new file mode 100755 index 0000000000000000000000000000000000000000..a158c998dfcbbe2f8620b0f54f7a8a6fc3c9a858 GIT binary patch literal 738 zcmV<80v-K{P)`Ew}GIDXe~09L=$a8VrKH@y}8$OLiM7__PonVT>udg01*JtVAJZb=e4pu z@3Q+J>zZArXc0?7AO=Dt24X-#KtLX``F*$j@inDV*X%M?!Q2W3wtwcIbz-E5h!hBs zoSB$nW{H_=-4YZnVuy#%0?tw&@Y@tUKj7w99PH2< z=fP)r>Mf3)0R-xr!n?u1=*Z1|{o#gtCfYW)PYLmqiLpY;!JUnP3xoHS5)=fq#+hDVdcokc z>mEP-fM=E_eE7{RuRgZ`0N(jx$7;GNiU_#9!6z5EeuaY_{i=3*zX5AM{0-o+VXtCm zcPNCU6cHmiGT5f~Ia}X}@th)4kCHdfFG(rOC}d+LRaMzL7%C+Q6qz$G)0&|7rOvO> zVO4wmy+6c2GfL7Z$;dgA8EYjah?(h!IJN@hMw14rQKN`0WWh)XK~7oDNz>GZ!$t`N z2HVtqT4U_|ZofaR6-wuyKB7rOL^3%fowDtXcYFTbJ5U-THyH8hC0a-6Z5X9j6k3vj zx7S}XH8wAZcKUxhx3Vhg=vPCfTUKp;+cmR72cw!3CzacU6LZW??0e$mX_M{aM0O94 zn;CD6wJAdoswYjh=Ug_YE1|(5FQiq2`<6}KHK|kHtx2_zl8{GI==-I2)AnBNe~SJJ U?f9j-VE_OC07*qoM6N<$f^rf`ssI20 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_edit.png b/media/img/icons/silk/feed_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..f1fde7a9ceeb500d97e5618ee9c0deb9d38519fc GIT binary patch literal 801 zcmV++1K#|JP)e=rfe*WBnrlp8ZPW$Jjl(9T(mJHUQ8Ae6R(RN zBt&l>IH@82B_<96Vnjt@==hy+8Qa*{9D{Z1*RJ(>qRN|EGex6fB>({d0096{!>qAn z+Q~RmG-~%tC7na0(u9~OB1A-i5D_Azh!CN%$?UJC%(rL7VkMnJR8ka%Nnzn{9$X;= zQUQS!qClfTa~mB8=r~)7K`KqiGB^Slp}NNHAGq@kn~xFEXdvRhd9qJYC#WNeDbF$S zB~uq!TO^%h-%(!ui0uaf5!EUiRcZ+dv49X!p5yxGgorrMHo(9!@77$_iD&M_LM?ZT< z$hGsr`!>ekQb|3O?|wyP?u<-RkCYeGk2M1jwxrUY~Lxr z>xhker-V#Ry17g4(KT&NyJc4&i`5|_)!^U>(#=etH-GL!`UZ9MAGLAs6CqubtoB&C zbk(+Ut86YNA%M`Jy`SyFwD+2?HLP^@>*zZong3KO(@Ncz`@31ufv*L~yrMGS)^8}ll)QBZ$)Ue6-@47m9$7{zw zbMwpzw=P_=rMO>Mnli9blU_W>jce34X~_`?W{jErh2}Q$oo?T~FZt_hJ^K&I<@UJ$ z$E3c_r)B#N(A`68Gc7r$Cde3zDlcoz6pSh;sq@C=R{Og<4e#x-HCfPm^SY+>gakDt fh>bpQb1=l#8B^Gr88*5;<+!eZ${N?VekMPBtm7fM%AcU^T;2fL6Uvi^hcrtqea zx-AeYL1q~@RuFPxN)I?AR_Wji15$M4tkWP^9KhNqp-&;}3?01yBG6*@jEmVDY6 zo_4~_;kL;+@*zTlEF)xOfshe0Kt4ohvhOJ1DCIhf=eYJg^%^o#LdNPXnvW0(BC-bEn_T{mzkgwU zg`rJ6b%a+>vi$%cqb%u{R0RbM0U@J%lfS+uWHbWfd)fOo4^8v@`z)N|+BpUl#elM= zPeVY!)P7!Ub8m^x0!#D!bey?&t&cR_j~$bfd*qAf8B~-N1wn+I3`3iknB|$bc;zIm zo#Mh5?q2yyv$eh<5;pV&%OQxHH%OzdI%ekNwwanRb@s)rRYb9W)x?vJ`R_qTcXWgNlNl{j zBL{4mVR)2~EH2+LefYT0$Yn!2gywFK?t4LK?v@Qdp|NR3KK8ilo%4&?;AO4hDJM*6 zi>SCT`LsHcVv_18#VExj#U#Zj#U!OzrIddEA0e?C7b@lbXaE2J07*qoM6N<$g0=E( A_W%F@ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_go.png b/media/img/icons/silk/feed_go.png new file mode 100755 index 0000000000000000000000000000000000000000..f2eed1ecf085b18d5f4f9679392fd5d9226c63a5 GIT binary patch literal 761 zcmVNYz3XHMWKZ)I$ZA9z+8kMGt~U9g5&Zh(&K+f_RX4 zs)%?{ECm;+D8`7410u4FBqL8ri3Nm+&1KHNLx_k2J)?|1$<6@|KhMH67f;j4Njqc( z2|++WbBrh6=7CqZ?J?Fa^ZARkXMlsx(l<({Lz0u_q{K?75uv_=y@Tu>WN3ofSDAm4 zvUF_jW$VeBH>v@RWQ(jIAqa@@&sjcsj`?XeR;h32zL)5}iJ2)$*0HZ=&{O3FX(uBq zNr?r7Ko!_pq5TER-)XJ=s;Y8nnMw0Z|DFQ|n}=ObHaxmD=VWKZwv<>25w(i(7pQmB z{!;$mc@GXht*A;xStwPOu3dGf2epB*_zbk?Xr*KwcJ#s53&)mg0vtj-1GZeqOi>`m*%{;`>0#nZ5pPc&ck*!nkF^1l*o}F rMT!JD!$YjA`D(r}P@rKdS#tb;x8Nj$twIaT00000NkvXXu0mjf9~xne literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_key.png b/media/img/icons/silk/feed_key.png new file mode 100755 index 0000000000000000000000000000000000000000..156bfa97196cf588f37d632622df97ebe44e33ff GIT binary patch literal 771 zcmV+e1N{7nP)$D~!L#YUl~BZHvq649ZAxf5_EO z>2z#tE(pVArP0&Yr$1tCNned9B4GVGQ*U$iJe3u4-8}O?J^S6ed`@fYlEP!hRc=p7 ziX+yts>RSFiinXcvb)T}6|TI;?H|c?^Yj_DG$=grl6G}YS7}JvP5IfwD#s5?bs&&r zoH#?ShlQV*`JB=SJ%iHw%9Q@l1O1p>RvG^^ygS^39y{hqBmzj)x}YqG}oLVMd^Qx&;Z zUDDXKFE{ML>NTkbvKHEWcbZ&*h3hK4T}scruCe-wG%c9DRM9=(abU1dXz!I2`iLYS z98y%?bHe?H$oCL4`UX^O+w)K_t#z|MZ0W6*Jo?B1u`4g8Ip%M$xi}f>FDT~ACX|iq zpoJQDiu+X`KB%^~qxk!*;q4t-Xdp%2WbLlA{{tv__{?i0Ac+6~002ovPDHLkV1g3t BZaV+~ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_link.png b/media/img/icons/silk/feed_link.png new file mode 100755 index 0000000000000000000000000000000000000000..c45a534597a9bc21d7763c6672e5ab3a7fdf2659 GIT binary patch literal 806 zcmV+>1KIqEP)e)p@r>Lu`Vf5 zW#SyQDjfx$ew|kj^TZG!BFm^}G#fNX1cZpk6@LGk5Rn8HuVdYtELhHS2e^EMYo|z? zG*Yq_b%KC^{>|+DitV59)GlTwIQ;=P&H@|WrL>MTrQRfK(jaIFFaZQp)z9II3+#>U3nY^;)ikkhxug~^8Nm4EFS z9(L^0_ne=c(?2j^?b@{_9?iLU@Sy4GXov$;llOAY$&WU&k*g6bhicdd8VQ z8-|C66^li)v$Lwzs-s7bDnCEy7ZiFIN;Hr+(K2xVoSz>JfYHnIwAu}$qoWFi0;tt$ z@@8iA#6>&a*{XW$rud^lz53@5DGr)HzuVdIY3W>Q)%qcG&JOe z?b{8k81&cpRoBL^Jc!bl^>+3f(XZTUF*)1gv)h|>FL_eOye{pWJ$HVvFq?C1=`O7( k$kMudm8qEpGY@wD4`V|Pq6VErV*mgE07*qoM6N<$f-*aKT>t<8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/feed_magnify.png b/media/img/icons/silk/feed_magnify.png new file mode 100755 index 0000000000000000000000000000000000000000..3023695d8c6c1e1bae579de69a9c03bae48cb968 GIT binary patch literal 737 zcmV<70v`Q|P)Wh5E$7yrg zg2#?^OdKI;5K}@R20|nTVn9MbKwYu=Tc`QMX{l7l#1XQD$vF~q|K!dhF_J_?5`;)y zGcrbdmiFmR3X%qKkZ0xr^AtN=KgZG;s%-@78i9@53_eJosE?4cyTii#dlM8xDA zuYSu5pYrHQHkbMNLsotPW=}COLzdAiDN1rueMkss3^RU^@q-+i=kjMR-7Iwfxo$ff zFwl5YYxWJtFT5@m6+KcB0e7!(_8r=Xd19X7ahJwU*(`=UJvAb2B)a!<8(W!+kAL7; z?k{f%d3w>q+v8oKznINzKvsX^gOP zk;QLpw?5HqHk4VZUz3%!!8B3UDP=`Y3S!OpVW#GQy5#CvL+ysVs1y}tzXo++cV~yP zCMN=cy>*IRVEqPJ=D^-HTYHt!eW{_r)O|w@Yj+Fvf7h&T-J>Lxqb^bL<9jq(tXv^0 zJ@v;|mNrki@z9I1T9k;(ZX~Cq9K1%eEBS#MkKBI*XX`r^Xa>XhWCbuJe`$z&$u+?!#3$#k($ zYR7OtSWq_`d@g`$Q!*K&ZitJ+5!`(XL1V(834FnW{-jyU1<<@%I!hcMIOuP83PwdK z*l+r5lmxLch5Ar*ZfG!cXl4Sq?@jccD}`>kRWP^o1)w)Y=bn%cFn5jGRP`5i>mIDv z2FzDFu0Fd+ofzKNG34TD{s_Gn3P1j6BN;?lB8iM7+R5OhhUVH){t}gE0;iXy(&+6F zVe2~Ed}_rA#R-PYEZsRSiN$aE&zM0T3!L_-$#*xTexwFS&LebIg|Kz|gm0{WzxgAP z+8bw8?LkA+?uyz}@w3IXZ=L$e>JLp?JK9_dQ16R#s!!&07-##4dm(}|53Gf@6rdFA z8GuCfNuhL&K=dI04?tQ!smiP_tF4idL}xi0;rP>1z;BVkXSJz1o%8PH0@!<3s4|Hq c@8sS41@Sp1TCQ_Hr~m)}07*qoM6N<$f@uN`6aWAK literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film.png b/media/img/icons/silk/film.png new file mode 100755 index 0000000000000000000000000000000000000000..b0ce7bb198a3b268bd634d2b26e9b710f3797d37 GIT binary patch literal 653 zcmV;80&@L{P)WO3(`_cf+b25@DJ#zdQm}8GzWtq2-QnZ8W6mB^kfeK5f%S{ zUW%tGMCwrwic~ZrQcG=4f?5bkV+3dRk8hw6bk~y$KX#b!y*J4EJ~>;dRASqrSu;ZpM>?P}K~6AT zWv6Dmq?v&9LdXC(m%WCO6ma_di$R(v$@ad_>@R41N3N5lSJq9@6CGhX84-$%Xrd_6 z;){?{E|Ytt5$S-&Au>t4wDlIxdkfe-a22LMj``McG};r8@{GsRPm*+8fFey6C)@ifDBXVyTw(N@Xd41b45OFg6x_QA zpwLiigyy~cVoPxW^r~C7ZQpr%>1$*HKmv~AY-qJw4;gUecS--wnqslISSS=^KA&Ic n@BK|Onfz#3R%n{$a)0j^sqv5F(1NTL00000NkvXXu0mjf3S}fX literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_add.png b/media/img/icons/silk/film_add.png new file mode 100755 index 0000000000000000000000000000000000000000..40d681feba594596c64e0947b8cae5ce9086f919 GIT binary patch literal 739 zcmV<90v!E`P)GL6il?1Z7P2*|7g?{OO9$@TbH1?j^i>BB&)xBSKKI=BdzS+s=YPijNo#8> z*V5AR)9?3h9JknJv&E~ct9MK$)0#*?;BA_wANhPfI2?{62Z2#lRW+c~=~hJo0)xOm zJRVPmX1?&(C%^N7u`S*k-QpKxJ^Z(|9^Pm)X0%%ELPbRdL;|nZyG-C)6h(2$>2CPu zHV}LVG)@CAV;R;g61NZ@w6lP;HQ#_4pj`q>&t7&BZ`>!@b{&p2>% z;uFft%U6_2<&0b|Pl^NtP7rvQyz7!PR)fwp2bz|(sCys8g|R5kjl@7;mcYXji6kKs z)YjH=1P+m;7l+bqc)r<%r<)y!q^=_J`7#F6mmrhL*y7^iP(eWfClc80_O#V%Wl0vt zwop`5#OLSdv$?ssX_0`yoW)`Zk)#&_^V?|u0JO~k^enKn{t&OHI?)`q?>5}4fxY|e zuBk)XbwFS?n-d0uVVESnbhw2(ueuR>LE$YI0sECfc%li8@ENF@PxkK%^m=`=va)i9 zBrR&;%I)(Q{dgav@drZx=%4f;JlQA+e(wti%o3O;Nv|Gm!E!^6DEAou9&c76g5d9W zURG8Hg+eh;lK%B18OT0MwP%M?*Rq2fby;=r6z($h=w)1caPPQFyo1ux(o9K72}LBL z^bM2>7yD0RfN}3VS(t_E0~tuA()Gf^!c1OX-ojCTB3az0XgskiY+KQ=H}?tm{{Txk VbfZtx1EK%`002ovPDHLkV1hC*Sxo={ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_delete.png b/media/img/icons/silk/film_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..23a2508c5cb8bdba45e6472961b91d29efae0f42 GIT binary patch literal 730 zcmV<00ww*4P)LxFQii)DB zo36qj!ATU1Fr*8$5YuuNd_J?HeSTut3w2Y&E!&h!7B=Q$6DS(b(Wx$L<^ zG#dS2nx>EV-rn9GC{!E{hX-|C4@fCTJ3BkKFB4F(!Z3`-#K}k`Qm`!wXK5q$t?Gb+ z4&o5mbx%{9EV4Nuqy=FDr#v^Yr5I>D*JGz}J+UK~v*ivH93XBJ!@cTVp5n9I=5%w5 zyLkdN+{Guk5aJW@kmz640R>BldP2I?KEzY+P^a90&8S3I@*w(Wsv*P)NpC+wxC#k$ zB0&$Uy$)b^X)$I*GZxY{NX~{ZJnzZQZxY!W?9LT#B@~m_{|d;ik-$$VZ!_0Ws~v~KDE}>)eEA-mz6>LD=A!2C zS7C7=rVhrtuXOKKQ?@*TO85!(XA5UBqkp8%fW=oaRMa0v(dXA-kB-7Q`V3{hQpIA{ z`TP-PiKoQrm0KuDj-hD1AJ`xL_YYj!0L5fw`6C1=e2ggD87JaXVPL z?*-O8Z$@Tu5^1WRpHpBc7|$0_R==ld+Jjij)Uxj{*iNkLiNjaQVOLblPfLtVF~fp& zi{*ajU@$mDf^uSDWMrgnk literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_edit.png b/media/img/icons/silk/film_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..af66b73f2097d34f01d86c6a4a4d7f1980f94dd8 GIT binary patch literal 855 zcmV-d1E~CoP)l$D+s&Mu=$; z6r}`(5yA|KE~bWoW;aJ}R+>6%H+7ruIos)3N#vy$exDxx|L1+4|NC;~<>l`pkw_}x zs;sOuW0q4~T>L>4MYAMHj>g8ujDKq?5~hd4;oHRF($Z3SHUknzsUQlb*Hk2oA-0pd zm~^N@idDpbNitXjIFfW73$#Gl$yODK*Abc14HP7NOH>i|*Zd7(T<{4BjX{tFgWyEA zpc94!#@J`#7ST211|&=%))A79@5GDo4lGw*g(7T$&Akm>UMmh{s`e*ofS6s+}$NBwN{M(cm^&sus=E*n>5JUWHdv~ zX&}Lbaoq@zat9Gk#7)MqCqEFkck{OSf*}t&(-L@{7JO=|y&N@2AhsHf#vI$3fmt$8 zU}Z)yWBY@gIqQU8ON|p-^%LGb63`k+fMLTI203SI>Br@{5K zZIq1$3YVUG()oKpy1tL7C-`UzMf7saVi|VKd5+|)Enq{nP^x82_*2o}+!~RBf$YVn z+dKZoNS$*?yqic{Z%CDu-QSU`+Q3O%G6uV^L7%Kf$h`nxn_EI96gu?j z&qES>{}`s6JjBIWFwoIGcD~;E<$k-XlK#xk=?0uEPyK);Yv%@+E;6cCWSAiH6R(1< hk%NVo-a7D~^9#54wyk$25e)zU002ovPDHLkV1gTsf-L|5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_error.png b/media/img/icons/silk/film_error.png new file mode 100755 index 0000000000000000000000000000000000000000..88f3d69bcaa67e9674375232e16f385ff7370776 GIT binary patch literal 800 zcmV+*1K<3KP)4(U?CVpBcg61u#2F`i-AOS z6QvhHNLC1TSx})FYT3sYZjgqW&d*JEK6^$g!|lM27vA^%|ITyH^S+GV@BgYONDo6x~8MxPFa?p66bwBpPETP;UsND-NrQ?1@%M&*+qL( zn`F@FAxJ6&1-M{u$M$UC?Bx$S3Re=v8wDB)4ioo@U?2OCi*fUu#%SYI&c=n|<}BO< zCkVnX;xRFlRsjXgL?t0v*g?FDeL}hR9yGE8z0u8xe!oH__wZ=~niN(AdusV2WHClaC`8Qi7ueDPg%J_)Y_c{U zwpaV_j4Wjmn2Do2&zJUI9Z&0kp4FhKHYabFr;#~PJ-L`kut0Q&!(qvBv%8F=E{HN9 zP(zz+4`7Q$U@(?2=FNLi<*^vQcO9#6HoWLx?*jeVETWLmeoWlPf;Ix$z61VyS2TW@f zloF?jf`hhv)yWm86()~*Xy!Mpc^)Y7VahI}%?zsk|}Qna-_RO@suqG?RMAG|+MmOpXj9_^S0eqpIl_@crGgX;oH?s-jZ)N($=w eh~%iM1OEW6IIf4)XAG_Y0000s+KnkY`Eo6h&V=bWA+7NR@wyLq4U|DET3pYsaU)z#lsRm~+9=1NbpotRP@QR?BSgMY-(!CUtKd&Fi%mGr^Lm|%1SMffWkU;#IdzCBL&UGNwUk% z3w3;hXa?gNmU=Q(-80<)DkYZ9q5-ko%lN?eIUdbj+ zNQ|)`L?h9?t^*3D5`Kc)lD^?%tP?)NJ&4LSybYf~_iP~;JICqkrwCgjflLIcSm-hX zC7Z06WmSkScoB}2V{qQ7?_VYKcURCGd(G=TlEDO~ z(CBCi0p}ZRwi-}gR@J|x$~&{u^2NTfu7%?dax5>aMwTT;I$0A5atT96>=BBk3YfJF zh@+)=F+%g#I1b!O-j!j`Lw@>R%*SKs{{1;xde?4ixgL({f}|CJkYXH0d-x8DlCQz4 zG8`#53q@0*s0vhQ7>|siFmpemY*G9g`VjHn7VY{LBE)mzioa$e3H2M{(9cMCAqXOR#lX@1Tgnr->YYTBeqS6v!3>T6kRG3WqCo3x$(B3 zLi6Ce2?`$`uhseluh-j80yoh!G&JN(G)7612HZE7ww8Df;r(Fq7~K;+Jh1#9Xj;Mx rxbAV+2r)%9SQb^qJz1*-|E>Q8ss6iyye%@B00000NkvXXu0mjfIy`F+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_key.png b/media/img/icons/silk/film_key.png new file mode 100755 index 0000000000000000000000000000000000000000..58921624ea7ad94f49d7503917298b534f9dba65 GIT binary patch literal 835 zcmV-J1HAl+P)!JGa#`+3sF6FCXg_P*h=nl zVSS5|%jbY8I+zCREckVFm@dO7|=`h%V0s3!wCy#g@Q7qq;a6=GBi#`J7dsP z`Ca`gZvDuOsu!8@kEiD~^tBrXTun{Q2#KQ(hhuRp7Ry!wdV71n`Io4%#>VO*$ywObA>YN&Z~)`FsN&kB7Njt}b2I@tY5~s-I=Xj_awxP5R^J z3U#HsK<9aW=? N002ovPDHLkV1n_Ef++w1 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/film_link.png b/media/img/icons/silk/film_link.png new file mode 100755 index 0000000000000000000000000000000000000000..0f24e86e4028717876f6650558d2451ec644bd4e GIT binary patch literal 830 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 D3;i%v literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/flag_pink.png b/media/img/icons/silk/flag_pink.png new file mode 100755 index 0000000000000000000000000000000000000000..5f15e526c0a3244f5dca94d7d6f0eb8f28e99c7c GIT binary patch literal 651 zcmV;60(AX}P)d+j7)2IFP!RM|;6qPprtQl^u+-aqSi}MFlnvfmsk?R-o-Gupj{b7%)rcR2bHge)vq!@bbYa3An=n z<*|lTk-eWn&pM#_2J}#jh5#E?Hqhx1em|E7pr|gu(nJS3ZXcC^EDmV1+m9pV!$%HW z@&OeT^{bRbZCeSMpit4>t>x{(+5)(Ts-WgpT|2$oPW9&jRr7pUO!00L?qAWVA3t`b!EDVfFf(juaajm2ewGR{_!ijCMa-%ku z>$op!<~*r02llbqYHiJS(kyd+tkv+ibN;>WSsXOT3wQD7h4Y^0$MYPXQv{%>ko@_!-JTr^1YfBMxRMTQ8AJL!*9Aeer6K*nRJ;@dF@_iub z17@P6i(vxv1F@bA`kEO6Us?`4JQ! z+XpBxssP=ppWO*3a76=;vz89E!L&k7RBB#s#=4x|`{;RWi+t!IE^*bqWO#wVi zZaDrJ`239IDQR~A@SPN4Q)MLfe0(Ho6*XLA>R!qE%?Pz?(Q&$j0%Z!&arDJqo0|XS zU@}q{la?&y6AStZF0gbbNC9Iwvjvd{hnLO2;v)S6++;8BDhT)x)T;{uW2MxECPn{*ELdZ1op0xyVpxzDdhz3h^YVPo^S(T97!Wp}{CC5s zOO0&MCbYN{*S_u5sKy(UFm7-Lr)M|odnZ1F`|tp z;QLC~;7ZS9V!0QqC_yL9nVW1CJTMZN4M(R$+ zOTZBsFr_4h`&3JNv0I_O8fwI~`z}0v3|$@I8UFpf@&;uE8s7DoF&~bRfJhmzX*a6< zs}(O~Kx~cpZxH}pS*S{qZRPWYW?G`zW8AQcn3#1@S*BcNV6f!zir{5lPjYZSt>eR~E27PJ0+es0y~s0ch&nN;M*NkCc% zXiQ#beHkC&om4IpK8qPut?)aNVjs<%39&#|d3=N1!OZi|I!ONj#Vr@M%?lVEC`+Fg zAQwL{?FfzVoB-$9WC=Ju7r^r86-w*!nR~wgLM67#gs;7-00000NkvXXu0mjfgI^=` literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/flag_yellow.png b/media/img/icons/silk/flag_yellow.png new file mode 100755 index 0000000000000000000000000000000000000000..14c89a5430dd9e34b445564c972634474d0aebf9 GIT binary patch literal 671 zcmV;Q0$}}#P)h~F3KnqFOq_yZYrcmh=dA~yr_$e+EQlLNOGM%Ml;i# zU7Vw6Zfq9mSh}^jHcU1p^JCLZD)&8iwzFjZJLh0y1$p5v{=642&yVMMd0qklkxl-4 z(M8=Y*1b6uGPP|>4YuT`RLb%n4=(L%zJGQLxM;W>UlFiB6XECJF0cUu7*7+ty}2;F z$iZSFgb#K51w;U7TAHJ!%Yznj4XknkpGg9?Cj=tncaV(Pu*kZQi0HutwHVN~Vz#dy z?bmnnK*b+mb6>}?_`=jZ#9R*%o32OVJB?(ZAJO?1uu&s|o*D$)H=w90g!f}38ZYGW zz$O8p=(;nXx{H4CfX`SUBs_Xqz?h(#i-rRvaF3io=dD6abXW1kNIxP?iIpSj?Wx$b z3_jBy_|1Dc;0l--67ewKMJxQCo0xJ+mkbSu;p!Ft4Rlf0oS|{aQrJ-ezvUp8Lx_x3 zf|*qy86QQ=Pa*1S#uu{;V{K(HlSg^LnFh2}S$JV`x&48y2sa2SQ(^A?I@lE=Sas)EyF>d_)lVCHYIEUy zbsEa6J9wZZ4XE4CdrjneSRacpBp1O#uEo2il0@cCa0R6=D|ZSVWX`|hBK-r%dTNTZ z0=`-mC$j>CVtvDr^a`&E=)8S^2dY;CJYW8W{JA0X?l;dl(LPG4VetR}002ovPDHLk FV1l@oDiix(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWg@#5J*h%>dq^uaFBvVQ$3&c*y#>&P@VnG_z zkezqQ&je1b~~$O}L9 zo^;|X_f#3CS5n-cFHBf|3c+u^PpWoka6G0Rsr|AOXUJ zbHD{5nUGu>5YB96PUmjGgM{$-j5TbT8bBGbz2R zHjvpHkWu0*cCs9&;{|Ugi`d3|T+)Vj%kXX`qqQ>4W)|B!_mMlW`2x#YyU0W#8Pyvn z-<;pE4zUG8k-yYxmFW4%eIAbtF|hR_$8YW;YMMc&ZY1$9z5S(QZA)e!-q6)Y`+^>Z zzdYprlOaC7jZYg%{Ey!L(s5u9Pz1(+vk%UU4EzNDb1nO~@as(g0000WdP)hGNhxyAUiWDzvzAp&MOTEEMdb z-KY>(MO>5!t%8VV7Yo%QYGN8YNyf}*Cds_{bMJfa-s57@1`%R=;N!qq{J!tNIfw}V zSC>!nb?#@X*H7?^&ws3+j;XJ@K4fRgr*T&=dxA;QrFmAo*X`tIwBNtPka>1QBzs=m z{g0)1*_R&2(GuTpzQa)xj3mu(+O)`;Va<)v(SK@8z+Ic0Zlmda4xjavYPGDY5 zFf%&E-w*RNuZ&sW32iN4H3Sv-bCerFjl4%J8W&=wzo+`*5{ckf*7fdTVFFB8ACmlrB(d?gOB#nOp>jh}F32Bg8Hs zHo)l@AP#XFT#cr*Cf(hD*f!GL1B^eu#=Y0Fn7|<7VqEkJi5Kb+XFy^QgSaYUE4Vm7 zYye8VbvHhth{7Uq5sByPvI|SFI6!O(u@%H=oXG;{e*qG@xwtyp6qQpMT*ebgg3Exk zBh~;R;?=wIELLlg(3vHGHsAjBk| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_brick.png b/media/img/icons/silk/folder_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..5dea9769a2c160625e9858f79e3ae16006df4a08 GIT binary patch literal 735 zcmV<50wDc~P)X=_7qeB4SLW3qiVT!56v^ahZ*4{{+FMqC1zm7hMQ0y6_JWp?^RP z)}pkQwqUW9(#A)lX)>AV%w+C4E}~V7^#_Lo7w+e9?lr2)zf!B!ysfRRVh{wQBj`uX7Aw8)BgFv&O-ky7BrtfQQkXqB>oLV@q_ip*Uq9`#gONJQNYY5h)(}H`T@yzctU-I Raqs{D002ovPDHLkV1j*fRJs5F literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_bug.png b/media/img/icons/silk/folder_bug.png new file mode 100755 index 0000000000000000000000000000000000000000..4f791b684b7b97da5d64472b33d5820f762abdf1 GIT binary patch literal 829 zcmV-D1H$}?P)_96=|(GO{L8?@n2w;q7vUL+;Fb_ma5X+-J+XMx7AJc51J)}zACp) z%^6jl5wPj|7Z%1!Udmz84g)tm_X&z4LmRChyo@%_A)3v(n%e49GdfuRb({LGe>e`S-g&F#K>GgZ z@7yWn=_};uY}~;|XFsLxhGc#|n;kMYzg>H|c3xAHG1F%H{E|6zz1KSQ>|T;#fqpwj z@8~@`m$p-F319y93x5@cnC~Xvwu~kk8#+!^8)HBLlm=s{zrKb{Y7v))2e>v?VDGXm zT)KCGl~1)(E;!V>W`&6SVG*f^1hf2+kBNgSNX)~S6t6zLoo_Dp;FySQ>6QGM`<1ns zS9tI96TIHEVC4NHcdr7*A~Xq=fHfN$x)l@PWTSBrjmxNbh@S=U{sm|t6Ol7MJ1o_tkW@mo8YBg}5RH8x zKoga05;3vosRrUt13druz{%auqr8YA#iK$2b1^{lv#HYG;1s0PmeerU00000NkvXX Hu0mjf;2(pv literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_camera.png b/media/img/icons/silk/folder_camera.png new file mode 100755 index 0000000000000000000000000000000000000000..c9519416dd4c314413210b2cf30d803e0be7b4f0 GIT binary patch literal 729 zcmV;~0w(>5P)9iwQ23rWgy{SU?|b1z@kNMgD|5I z+C&Q%F0?XIQ!9zYvT|nLd-uKj?)|p#M`Y2aFB}e>#o=%`UnL^^&-uHB!NI{H;L5hK zi0r@^!|?F1>hJFttu>>gqe|^gFfcG6y}i9GEG$r|R2Ul@xrU><>lpfesbOYjhPJjgYHMrh?(XKzmo}{m@jUWhESy>^U&l3bevp@g1 zW4fyL=uxFS0E)$9w6?bL=tDhE-+MrglMRiuA3n^)!~|VkUChnR(b(9CF(&6L@s2c| zxSLfP>8tAq)-W zav6~t!~>O4h^JUvTO$m^zZe+hiA%6a4spWz`Z}u%lU%Etrb*_1>*rh#zx%1cYGg(X$qqQbU60+GW`RY9+;};3T5MvBJ#=|ch zV1MUT_IElCMiEsx!}x;{#Kr(<9bi+9wVLeS3$z1MQ&RxrK1M{W#)U5tyMY(JB@x5v z6Z;USQA%*eA=V<+P-y94@%9a7XJ^&s5@SSMiZfr3bOV%+*a}Dr5+mXvHo&E2#Fjy+ zT~kg(6c$OpA?c4z*bOAz*y1u`ONb2+r*ZK|0KH=%iTj?0>(!=`E8>ctNETcXWZzZ? z3F2+C@+?+sk;KKn40JrSbgTC`LJx}KKVMG(^&-K^y=_VT?>qklwf%D)EyQ}q00000 LNkvXXu0mjfDN{)R literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_database.png b/media/img/icons/silk/folder_database.png new file mode 100755 index 0000000000000000000000000000000000000000..5193e2eff36d6624e9712baebb81da20959056bc GIT binary patch literal 687 zcmV;g0#N;lP)l`516uN0Cy%QCn*#P zN4+?XnV6U$gm4+)tOVYBPqW#iR4O4NG#U+RwHhG=0M1IFaU5fYPBd9i&QF= zBOt%>{_2-vWqR6}e=Q|zuYC{Uu?29>0nqF9j!t;*`+!k9HF4uzWQ+mrU&a`G`uoz? z#gBS;ID~+64r9zo0Iw1eXI_!I(0|i?-!<9Z@v?#tyr}>L)YYlM;xxzWB zci)1-?#>Q-`)#}rhzPl%F?4Yb=iJRf0!x1A0_U$k1q4)4Y2){ok#wD5&4{9uo~C&1 zQXYT84`6>h%AjLt$N-1h{%&j_q^YWt>=;P1=igr4zlL%fL;19?jRI!bA-Ztb`U~VH VYY-ljn{ogE002ovPDHLkV1lweE*Ss- literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_delete.png b/media/img/icons/silk/folder_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..112b01638e6f3b5995ff11a07c7ef9e3e50b2780 GIT binary patch literal 666 zcmV;L0%iS)P)#NXU(rVJZ0_Z7&gXp3z2_(q;VkBGMmsaW16Y~9 zp7fgr29!F<6RP>ub)&O4fa*V43V`C3yGz;wP~!A;4tPPFm}sl;XZ|Jd$pb)31sm2?QX#5xu zDMxIG3FC+rZ21>aF->7BLCkLhiNJ=4Xh0M6jm8n%ee?z>@vSZsmO#QHQGTDG?-71; z|3Slt3Z$mMI}gV3jscN_SKq?<{>Mjwg2jd#=*TQ%RKcRuE)beKot?IvC(#|lF1=DdvMQ?PApSc z(OerDrLOlX<;5AkFU)$g!?9p2(@mCY5j}K^A z`%F()Gos|V2Oy!%=+bUOREP)Iz!8ao4L~j+rb@K)1;4cy?z}jjz=<|ot9ojHO7-2^ z`+I{3!zhCP=C$6fDzWuJ*>mjD0&07*qoM6N<$f)0Et AfB*mh literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_edit.png b/media/img/icons/silk/folder_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..ad669cc7814eb52a0990c156e4358bd8d523089c GIT binary patch literal 733 zcmV<30wVp1P)Ln`3m6cBjUs{~SZF1Q|l+PQ4$F&BPWU{LQ5Rm}%Yp+9Uy#II9~vucwq!AZ0U3VS=&d(VjEIGJ6F` zxEYZ+Do*Dgo&xS90WcC^bwyaXLaY<13Xc{ys@jsg}$ z5G+=Y;0}5=7O5P92480MbaXQ7%}6B`AYHKOFX}h+}d5}LKg{F2q&8;J?*AuZJvty1~9)ANwocD zyswqfv|ByYH|QiPmSI$m{Oe0B$hidL4Saj?irNjUNTgedgFr;v@FyS$FAiPZ+kvpX z-^tbQJARF~w@xzf^f?uc>#?PNS(q}q__!blpq^>0+$ab5#~RNbYmZJJIiAFc>3MLM zPag)Sv-P!|JI?j?{%Z?=0rqdL^*1#yN_MoZL{i~%zgRlF`+VQf|HkwKvQRq#2{xLW P00000NkvXXu0mjfz!^#T literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_error.png b/media/img/icons/silk/folder_error.png new file mode 100755 index 0000000000000000000000000000000000000000..1af8809513d4c9d70db4b7b91b28ccc8e960fd7c GIT binary patch literal 727 zcmV;|0x127P)k#I6Z`-y*Ux@M08f%%l`nO z@l-64O`xJk`4{0rj^gBNYW$6$A&5oQ0giObg#;?wmNmerFRqL&f!YPa!aV7gQ~33* zfT5J{XKv&rjcsR%B~qAp1|l#14-k69lZ|9rPcN;iD1z8A!apyV{{Def^AYlcmq^zM z{^pAiC{+MejVefK5RK;0sDQdzB%ERX_b_W4yQtl`hv6@eNyHcMHGr_%2LY<$kZ=mI zQ;5wWHis>aF*}hXy&*$1-$TQ$)67hSNE9p|b`fAz4H4@8pl%us^QfCAA3&5LZg$f(DBDB;xHPT~|VaAD}{1e9QKZbBw*~ zMXcCm4YU$mAHIFO9iJnQ!&w5gNgG!mb-C4wrL6ZgL^9&m+c z>c7)*W<%?-n@u~DM8!T-E$^RwWp8&YCbk}uhk1AJ(xi%Xt_bM6v43>;$w!-F-cQuc zP~~L6BbLmP`#iu<@71UAl|IY`*6+XDT~<+4q$+i}B7&+m{RPs0S{LgvUQz%6002ov JPDHLkV1mJ{Oh^C# literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_explore.png b/media/img/icons/silk/folder_explore.png new file mode 100755 index 0000000000000000000000000000000000000000..0ba939184d5e2257e380004ed799f00f66a49277 GIT binary patch literal 679 zcmV;Y0$BZtP)|B!lwB?F)%&66ocFx{jBe!85I&EQ#75Y65B5(Mx_0d{Cg3j-*JeIvt~v(9 ztY`S8F>>s+V~sTmN;}4H=Z!HS)(DKjt$rUaPhR;f5G}c|OUlyu`rOm=z&+MjoL2Ek zTm0^)e6oN~%J`&=(gmjK2N~YhK_xcK zEoV5BWBb;K=H{^+EtW(wWXLTdS4FOhvL)n}sIMf1VICJdydZX>U~@QG{;*1X#WjC) zr1dbuM}d?FAAx%5Xv>qN8EFR2i(h1**=X>G)oOfg_U7?X#32k3>qH~N`C9QvE@}^n zGhqY6++vD;yw#&i6Q>Sed3?u6;$N;m{5aHRIk}}XyzB+bjo7>Llo{{)Y8o@oYqL`? z&lySlkNcO8o-Otluk{V>>wfd%Vbe(Bf8CuZo#-Fld&_&*ZX~f0KLJ#yHcZ$RnzjG{ N002ovPDHLkV1gJ z|Dc7=n2G635A>de;xc@E0j2M7@H(t5!rCkp!6?yvUBi##N-2;Uj8ZU_h2kts&Oq;J zIC=x#-G;d=3|@e@3y=pxC{>(o@>d=Z*%;^yN~LK5XljM_0a%;>=V0Ixe7FyNry#Yr z=72zHahAv?5GUB&EZ*`Lf_OJ>I*aHrB-nttEU{D@QY~O!U8H-@dGIg>CCx6}zq1} z;{+Te_dkL{0bV{?a)uE@AR>2Fx75VHCIjaZip zz4c^JPNZ>ZEfNQp2HA;3K41}DyOoZJ{IZC3{+2-1AN~69++l>1DANDjT>;dj#mUp( Zp8hoRQY~32;;v|2 z6e-B2B zCE(hxS3dK-rRD4TH?wNZx>((BtjuOJ_pgyBGdA>1yDCbtXz88 ZdJfaffI=X}!C?RZ002ovPDHLkV1kN7cwztm literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_go.png b/media/img/icons/silk/folder_go.png new file mode 100755 index 0000000000000000000000000000000000000000..34a736f70261338c9bca98c38b78193740fa83a0 GIT binary patch literal 694 zcmV;n0!jUeP)N@Zw27r|iugjyK_i?%mf=ZN1k*q&Uedp~2B7g_+fS`hk+Nr1A{hI)z0`VHB6Nndl zX$Di6C%-U4JXr@~z-vS-U`e(1B@n-FV+JTmdRsylL39C=TOrljOR~Cct>JYCvg#mK z1ulqf0!%<`#~!NMu5Ba=9u&fmP-Zhc6E?!yaAE01t20W#1|(JmqlC- zu^GHsMqCzbhR}vI*0gbTWQ<2wA~0LlNQ8*Dc(aJuEaI~Cy?zX0(B7i0rEb>&+G>xJ z3k&o-xX8WohAjXsqHu`)jo1ugGgz-V-_eT`kMj#kXL{&TC&D=t zDS)urCatsVt!&16hZE0Sc81**wR}pC@@4w{a?#MB{`E|khgw{yHQH-JtJz=E5u9kb zz}Ukc-s|q!`(``1y|H=m(r1&lJyin$Xxq0vwCmG)?a3aY8mvDz{qFmxE%s(BuO5DJ zao=8%%g&`=etrMina`JM0D#h8Jll;L2^RBAyP%^_Ir7+%R=MGUyuLc0fTceq_VSCIxlQXj!^EtWD%$RJW zX!AVkD?c8*u(*8SKuQ%@sC2qF_E=cn!Sx&DIVH#~lNqxqs}H+#{({Zn-5=@{)nku5 zf3}-aBFOu1S^wxm_pI)=v}cv8*Vq`5TY6m%JnGJ+i+=z5+uz2M$%)!Lrb^SB-TFjs zI#kR0$JPvgy5YYwXYD@xvV|(KJ<;r3^2e!42m{A`)tOG6Dc~%w|7dJ^j)lfdl{m00<<522?CW@PXKACkTpQB_fKD)<(q6!a}sL(AX*3`zS0F zw6d`gQ6nNMK~Z8t%sab#@63NJ?$yLsPBCXV|NLj>KQK-b|H7&B_YQ%s0xN|BLAfl% zK+1oi+h>k$?dokba4tnaZVoGI#E^0B%H#h38c1|CdK&a!zQu;VzF&Ic9iQI5;=<{E zOk$B2fcGhV>({Ym=PnYT;FAj8dn$>?49pfWFbM-XI%?E9m%txc2@y@C?;dP_QCqrs zvvdCUvJMaop1&SuR6~Utiv&Ku`O2}q5X?xO{KmC=Zd9CGkhF8ehj);`CslmXQ3g;_ zrG|hIjFg}jmUXm;2Z&h$eksn?3DH0>GBo(tcq2oDp#9|0NXea-WyGwCOjz?1`Rq5& zZX2Qb>=8GQ7%)_3U|1H(c2}F=Izu#4oN5-DWOJZwmVA1O`o?2a8>?8cdKu2SVl1iP zq|WCjCz6WKVvL$h$vtUjFUvNa1PmmEu_XV<`@sjqFpI?*6lRb$srDY{%ZD*8-Mv39 zIGmD8iY;vJC5n?MPNOhEx5ioCJqcl=)TdCKrE^V6r8aC2uN`dwq_mMNVEHHtlf~gM zQSQf4m@1nK11UgzKG2j*azqrqmyP9(zs#oRo2^xh85S5Qv+*!D)|Jmx>sZ}O6|g#} z2gNp!Az!fbk=SZUnYHH)TJ4J;uOHlj*oULO*xx{adzxXo{Zsk@(!pF(RdX`D00000 LNkvXXu0mjftamTb literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_key.png b/media/img/icons/silk/folder_key.png new file mode 100755 index 0000000000000000000000000000000000000000..fb9b4c2bbc2c94a4f777e5c3d953dea265f7b846 GIT binary patch literal 720 zcmV;>0x$iEP)Q5eU6=iGPZUQ_QKgBcNt&>&x>Nl_%pLP-{EP)t*^8f(^47Ru^ckc9;ncG5Hn z$wpF4h8c|SG30W;@4WAM&pD699qz1jPo2)`>HL4s|2+Mbh|tP9Dmzt|fpo_ES>$xI?G%C|#pH zn}?`QbvjO|i96e#XR_G*pNXHuZEC>1g@^^m2zk1LbU5d@t~JhF6b7+`hZK{t7K-?yV@KHLV-Bua}n zIMa@JjjMfT=Er@!`GHDJkxF+n{-BQP>|t@&D5Olg4rKYi0iz`2?F^<4VrnFnGGXrt zy0)$bpl!h*TLzl5QNet0I%onCO)#&A`Rn=t4F%tdx$F`wuIO+;;LkporSoW zoq$9{T!gQWHXgeQVvG2sfVdLa;%vQ)xEe?d$()Q3BjPPS`Pt~?N{B7a-V3vx%l`l( z7UH=8BcgDK{XHuzHf_5SVk=Ftj~d^!a{yv|!Pb9uB-Qp1A8L^{@FB<|#KnL?bmLUo z;i5>y__zs(;tTIDAL>Kciz57QrUg)s4PLJQE&Txw*NhpH^5>@j0000@MUe#( zhB3noqr8rL=gzt3o^$T+_gLKVGSl!Zzde1v-@eZys>*CLbp3cx>})$+C}a+0vUa(; zuwcV+YbPt!dL_CU);O`^z@_&x8(`$t=}cRPf4N=GyxD zM7%!<;-;UA>YyV;ukYgOS;P-;jT&Ai#gq+xelxcE1taS9c5OWuhzKZvGWqrn(d)|; z*X9Ktw2Ufd(- zSc~Tru{k7FvWquRAB?Cx?Ekpz=)En5w3Xd83sde7sJ?tMy_A8OEe){Z=%X@#!FfKO zPwm|x$@m9cTxb5KeRQnbk04ZQio?gb2F?ZK3nf1F@A!=}G(qrLuSvntR6siqXN@Md(3YB z1Q!9`v^tHZE^EUI$Rb1p@KN8JdR-7aKtKgB*r+xG5XX0i&+OcSw)XxzzjmB^@Jsp$ Xg^DuH;4UY{00000NkvXXu0mjf{%TnI literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_link.png b/media/img/icons/silk/folder_link.png new file mode 100755 index 0000000000000000000000000000000000000000..b9b75f6c398044761b2e211639a3b3ea5dffda06 GIT binary patch literal 785 zcmV+s1Md8ZP)aL6K`V-vR#JLK(X*jEKVNlbHxH0QOXN4CTjfvGt40I|M#Ku+)Yiq8d z;L28c;TGg(*&-*FfRgVFU3!q0bKn5y+w&YMOEeLrM3go2};w-m?^(jqeZAz2= zL*$E|+nBzw5`1~&d{HnejR`pp>Gc7meprxN9t68G0wK!~R}w-lLD(()XLo=+p9zi1 z=86KRES~3g$*>K{#fON0>%{i-Rcw831>-k@nY{~UrUN@)b%g6=XPXGQk0pwNVJV+w zqhRK2*zxsX)1w8u`H8F=|Ghf>#)>;2#|sV1xT0X_I4_<*pC+(CE+r1;*Z|TI8@M$i z*d-lO3zv}$G$5CpN9eh9kKmasBji}*;vbP^#=-v_K_>cy4EBLtz6Ex%6{+9_B)^|S z!hagM#0)}%dj*eV={z3?zdeTC)u(vt>V&z^2#3Rg-flhS-!~vKtwevfR?M0Edok2? zHY=CQ4-^D8DJSp@k{b>@wzk4zu^<|aA{-9Gfx%$lO768pBDvDi(!x+d zeSQ6SO-&82P$*DWS0_Sanxi!;puHu6!{kw^RP$!DnQ=Ou+itfTcDo&IZEa|8Zx>^l zqcz$?drJi6<>mXTtE;POYipO9nwpXtjfNv+)M|Aj;S`DEG)HT+hxYyg@Y?10VPWjL P00000NkvXXu0mjfBPD6B literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_magnify.png b/media/img/icons/silk/folder_magnify.png new file mode 100755 index 0000000000000000000000000000000000000000..0a3e7985c183ffe1e5547ae02e56c2f160a9f3c0 GIT binary patch literal 686 zcmV;f0#W^mP)D5KR;Vfzpb!Z%f>egXcc4dbT1v5p6tGa?~4~cr@F?*lxpV^g36B#KYBzmnZT=P ztU#cJlp8~0$(9F7oRNX)Cvl||NCS*gXn$uoxwwWOL_|iRZDU%Zz_0slQ_$jLLxRmY zYQN^Gtv{u{{(_hrr|*biyHKPvp-87(y3%oSyAf`6gSqQdvkem?<%kV2VFIy&t*;YR z^XwItnC$Lnb@LeS)+TUb3F<+F@;111vPk~infZG&LxGEul+|^@8c0|rs+7r$%#!LE zr5D8z0$30Mgs&^xY<*ag!SRckT)wd25;?dXeRPlB*e?_;Hrzy)UL(dsw1?<2V)huH zyi4xws{Xj*>4;d`B@z+iV{2a;#ioMj5;iI##sghy=F5nwf&>hoN|`HnUZxu!1c+FT zjea*e84uB==DyhMT;3-T(Gavh~9-=EPu=N`}Ih&YW^IR@kVBB2dh1b*<~=i`|vgv%&02Yx*P)SD11&;F(U0?j>H Ur1R|wc>n+a07*qoM6N<$g6sr4fB*mh literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_page.png b/media/img/icons/silk/folder_page.png new file mode 100755 index 0000000000000000000000000000000000000000..1ef6e11438f3226f88bdc457f55d677d1f2f8409 GIT binary patch literal 688 zcmV;h0#E&kP)CVGc zN?Hxg{(SJp>2>GN9JetoZ(aZH;Ije%0FdZ{S!LRVX%}YG;=d8L^N!mJkCd*SBx($jgG)S}+Le)f;q=GIn30YFNh3ZW|nh}2rL)`=3ju9K*d z<&~Gte>sT=5|RjR+}A(|O&3gS5t&*G5h0Um$c5IgEgxJl_8nzY#B+YU^|Fhvzo-^U z6fNn3(lBMcl9{Silx)4RpURdFw}1BZ?>}8S&h8fk5`hjKW@sP$LJL*otPOMf+jp$? zcC^*PiL>vkTOZln=wuc^%A^$j`TU&aa3ETVYE{(r=bgN835`stIePGw{uwD`7K9Y) z=4)VDHnkl3YL%JeLce6>Uubzae&kQ4(g>C+WwLc_Qfq*FlK?}j&#@fb05W&WX zs7RER>}K7~?sqveuf<-nYKRA3hB+LbdC!>{CyArNId=s(54dp(7#BBzuaY8?jufy` zmStgPnpU3Y+S=OM1eO4Q9AMSVG#Cuj?RM2}x7BPmWoGL4``X^#-UOE1F)gf`*=sW+ z#)z3w6a|Zmi<6o(O>cSr6G@Wby(dW$vMi(1>CkGm4j~_2th}9>UtV@@nkAk+xY-;z zAxV<4E1Ywf*&)EmU%$NexaOQ2%~;?ZS9y7HsvVLf!8teCPXL&5Vwn{`9ump~{5;Mz z@X5m8Gx-NJ1XRw)P+&z3MNzfi)BpaF#%_}@J99_@SqVgZeE}3mPMzk`-KQgf(~Lq+ zHE^grpz4XUYa1-47pTvjWcrrICx3pvKJCDh&Yol8#yuc{goqS7_vxoKQ21lGv)3LW zi4Z~$2q~4MkQ4jwQ0So0MYd02b*e#*$A(}6F$T)kF1@{P%ChV>&`c?iq7kc~$T~xa z?Ngt1kh!5F8K^?BqTZ-6lX;W$X4pb0IRdg4vi+e#2jXA^>!R=rg##3GP!2ZvRHQ0n z+xmO;s&}G6Ym@RLIIS>4_D^{q3B6vEDiyAvGHkpeHC#BN8{LcEx^4hiFz_l Z{RV0XY_dNf>kh&a;2ZlkWYymR@qWf#HF|^E)s7jy`z}ZOho~ zD6RPe)NA9ojzH4Gk3xn@`KmX4>cNY-Qnjj-!{4&mf-ec!j7O*V1huJity15lFO^;S z6LWhgn1tsBYPgD`r^MO0_0f-fr4$J3gp1!EX7%ws^!t{uxyE8+x<6QRRo`Hh9wi)U zgR+2l9$F%7l8qPN#Uw5`CA>`qF8p{F-$vZGdxCrK+3WbOLoS@*SmPWcw{Icz^ZdGU z{gg+l9I*)|$sks+y*d-sHl5`LdU=s(W(uFbM8NI>(3<4CYj>Uh;_URR9!hdn_vkDv z6EDqRlP+$y%*fLpqEO8L@)J4JCGY3ZCM9+Xw7xpZiEn;BaQyV;IgixA%iqS(!><7r zL=YRITW7G*Rm!;zjm0KylOn3irm>^^>Gc%tHwKP!zct0o0iUE1$CA4>1~l0uATp(*OVf07*qoM6N<$g6ge~ A^#A|> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_picture.png b/media/img/icons/silk/folder_picture.png new file mode 100755 index 0000000000000000000000000000000000000000..052b33638eaa0f870a255bfdd5df5b79fb01a89e GIT binary patch literal 713 zcmV;)0yh1LP)Sp5G=H^urQrsC0eOy7edOd zZ7d~Lu~=e+5HQOw5_MxTbLZpEz4x5+{#{`tTev=tN#ehp|LXfMhP~b!qlMPY3^O+5 zlq{J!O})4fIKi;rd-I*MTbsRJ-?(RkrCAgCdT00TzzNEVZm-w3>$fIc-v5w|;a^m3 zm#KyF08Pzpe zb7ryOZdEg)0T~jLaO1mYch`nz&X^V4BRa)fD-uj=XaCldc=sB!STP zt;b%x&@nR*M+9c1pMS(1#*56;r$6GE{SWx%#sTA(KPSb605cl~l4`u|Hh+9WZdaff zVm1Js!Vp(~d!HC1SK5~L;STM!*NHK5?u9Ez5QtXDTXMUKT=?RE#qB-LTE(49d%VXn zE5Ley^+2!)QW-FW3lrJU+(Od^V#BJ zAQpu6Q*3UZXLH;6hw_9p`2lbCfQaG@q-RZ^I>Hr@UQU`nhdI;qPXi?DsEmmZ5T}!Pu vECtogXE(on?K#A&7z6%~0K44cy2R4oP`hnXtk|+}00000NkvXXu0mjf(HBcn literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/folder_star.png b/media/img/icons/silk/folder_star.png new file mode 100755 index 0000000000000000000000000000000000000000..448e46fd5ac04933a1121e0d07748d2894e93940 GIT binary patch literal 755 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 FV1mw881w)D literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/font_add.png b/media/img/icons/silk/font_add.png new file mode 100755 index 0000000000000000000000000000000000000000..b709ebaef4f32cf6551275bbcc3413ed5f51b75a GIT binary patch literal 634 zcmV-=0)_pFP)JJns=rXO>fi=YdvYp=OyIuL^83ysEIf(LtP34vHf@P1syLa4L>s)tjLDRY?|E+S*&m<}gEDA3wCC|S1 zC~n%F`=*)aLx8xUX62**Ryh}!5;VXx>jJY=!}V2J^Y4E*NjsaSAA6F^IPpwJ<+6wW zU8=5LQujKb`Z+F#fckUgU8t^YpU|s(=Orx83-p>b9R3rvXOE zXGG&B-+ooO{Lz1}<{Ou-vd(X^%s98zwd(4Pig^qE=T46QpVsI9KeEN)lV^oq4T=E< zv8NgBOD@j_`PDq_3`$^y)HdH}T%GuT%ay7BFFf1zzkheu|L}g@|K{0}Jzxd;F{ikI z(c@COKW(O z#rEI&moVY>|A6M}Z?yxC^eQ{;6;QI@qowV8c#%)F;s0${=KMznn=VZS89-cmx6G0L z-n}d7fBUWku;%ui38*e0gnR5;6H z`2YVu10|S&W(GL4-*9m5zR~L0cWa7s=goeHmKzfsTW-vJJns=rXO>fi=YdvYp=OyIuL^83ysEIf(LtP34vHf@P1syLa4L>s)tjLDRY?|E+S*&m<}gEDA3wCC|S1 zC~n%F`=*)aLx8xUX62**Ryh}!5;VXx>jJY=!}V2J^Y4E*NjsaSAA6F^IPpwJ<+6wW zU8=5LQujKb`Z+F#fckUgU8t^YpU|s(=Orx83-p>b9R3rvXOE zXGG&B-+ooO{Lz1}<{Ou-vd(X^%s98zwd(4Pg-vb$w*;&H+vCLYZ>KBsBOtCoF~A`9 zG^2gV<=G&=nx~yX39Po5?5pQXZ2o`W+WY_CwH^Pzt|v5TWziw`K>00000NkvXXu0mjfI;~OA literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/font_go.png b/media/img/icons/silk/font_go.png new file mode 100755 index 0000000000000000000000000000000000000000..75eba80d629fdc8279afbd40369813bae7548a52 GIT binary patch literal 700 zcmV;t0z>_YP)!+vDhPTEsU#vi5`}*=t3m zOG=I7^=;SgcAeD!1Q6)vqouCPiA6pkZI#eMm0J!{NC4PUm?hpST<@&f1R)!bRM!&q z1%jTh#a^c`HkBT$^xp|cDKystTu4&1uL89tXYt`@A7Z}-1r^Nk?%}ew0N})}Vd5!p zh06{&eLcPN&jvf|?%j_t-4wV@q*jnhLO~T6xa3&3{~%b}h$K&2L(~1#$j-4MH9=4J!Xg9B zNTQXxa^zxPJ{1%~3KZm(p)l_d4to5^GPB{!Eykz00Sx@;|CVORC)<_j>Qld@jDaZz zDi|uf)y66RB@EBLNAE=UC=&?9!`deQ+r~h(G`SI(6vnfMgxg){D+Lwutc1Si0swhN#FwOv#}l83ts6rCW;r!9Q9l zl<41549yYiq6clJ;(J(YgF_14nmKFB@QK(mo6I~sr{BJxJ$rsp0HSt^ntND0Z;o48 z>O2Ckm9}n?$F`*>$L{;{zT>f+bCm7tpaqw^4q@%k z&cHHt3=3xZmt6rQ_dtDM#)Xwp66-Thu=<9?(zFvpy0gAr0U4Z3smE5f@pZNr!NoqT zEjSPuCQzMw(H;?yvf{+e;!7(;4hv)+d%cjKFiBL%egy0aeCof8z<>rLEjMsF|CBRH z86WcxAYvS6H;Yq)jY1Z-rrjWiu~m;clLmJlDAE7UhMJ*jBxp}s&nQkrZvqDXxsiv3 zSJ78>4W2GFIu$$+Ic&5Pq{1?zhIy(24enCZy35e>z6~XgVx$x%k(+>tPw)9SL~R?4 zs${`1bqjTFC3F)dxIIw>)!QP7$vk+;^#2c5r{lsjtwKYnfnn+j{~{GK;|I8rvPFU z5NbS#W7m)ofjNER&&ggR6fXi0xd4%4143#8JZlhXW+2TN#8b=5@L&-EUlY^cTT=>w zb_~+jfcRCYfdj}H0J49#sP#gtxE~%YBJiQ3AjMgoQJKuMITA}Iz|zizG7pw|7R*XF j=$D`QjOCK>V3B}dL4UFUkhgq600000NkvXXu0mjf1x-zB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/group_add.png b/media/img/icons/silk/group_add.png new file mode 100755 index 0000000000000000000000000000000000000000..06c5350cb197e64439aa1d0b1aa438b013c2f4a1 GIT binary patch literal 807 zcmV+?1K9kDP)mo3jW}i{%_@b6dHYnoXT!P3L{yXgdAxrsZYf zWtGn6Fta7-gNCWosY{E%J)~Q2p<+ThPn(n)hWUlVmmfdQ=X*FL0HnPnjy}$wR(mbZ zx1PY9#(k}c=g|-q=yB-J|DI-E_(_Vj+1;_w=7ycBOZBYY7odT8j9BROhpm@`AH$Wf z>4LGKJq3%}^ZUL4s_3JYc5^Qlhg4WIKg05S73L>;&|mCl-4}ow9>bk!$=q0)?0{po z6Dt-y>;nXf60Yk03E+~w*h+TjBEcX-#iFbw(|yMXVd_u2j*qWhg|HiPFH0JTB?qXs01CQi` z;2Ti-Qit3|Ed+!H^&_hgDCQAga(%sPx*A;3V83xD&;twuaL1LRd=9a^ zDBPBMqtckTdD*pHZzn)X`rMop)Kf&w4y3i{{nJN5&YN;-8f5V#Lb6Tpyz#;+&q^#v l5PBP&h9y_*-@Dw^-!JB5sxM9&*;W7m002ovPDHLkV1kg{c8>r6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/group_delete.png b/media/img/icons/silk/group_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..4489ca238aa5ca3fa16cca8789fbeb1907750dba GIT binary patch literal 827 zcmV-B1H}A^P) z^gW64MQdglX6sW?C*VL5#6(%7Cn_gWAsZ9nu_h6Dnj|#6l_NnJ2bU-(VpkyL(wpA* zDE1YmNMWFG><;oZLS&C5;O z(5&@-0`51qAgw|Hp`;4WhBqOUE~1fXvARLRkgx!e1^I}EFAv?(=}DcZ(7ekyocNCQ z_BjJ`W&!>%5Znv+cK}=k$@Bx=9%e9VTCsO6XPhF>O^uYP9LMd^<`M{A=n|`AZJDm8A+@B2c=23){C>RO^S&eiq`i_&3*gLFg*Ys& z$Fa~9xYfuDs*ec|I`rp#PnbtNL71BZJ=V5k*qxfRVDY{L_3R@Ot11jObuwJzWw0ru zU~NAMT~+Yvz65gG;WE2M4abNaTbifX7?s2Fz88Z}&YAZmh^5AH^(~n{*R=|G3@SKv zov;r{kjJ{D^efayZSe;Q|wDjs1pP)Sc{BUjR zEvRx6p>NAZE1wPtlR$L}1+T|g_&S$^&E;XJyT=(6E)4a4>E9#$sPVQ5aoWE~SGS`+216GGRQb4p}yUaTmb-qIPCF$G%mQ53R6(O+~O4MjS-Hi@Y*UVP^F;y2&VGtc+Y0id%HQI2~lo!JJn!zKG5 zFVI!z2kGV7Tj_24^S@y@$ZkJrpjdZ#q;wC~^2A@Cu_-|=c{g*U+yV-r4~T|TD0ns) zDLa6!Z2g%{30RK1Qk88&%+|A@ZY#vx2Ns4~1&}0|4Qxu_V0WD=V~4JMZ|7pUyBw;n z3Mi#a#NRl}`>%j%Ye31OoSS8O*n;IrQu{iaHZvpqmy|pjhAQKrtcpfmP5_Sh7z-@J zOm?gjkZlfaFk}aeN~X|Y+m=& z_X^5my&x-%LJ7?YOb-&C2V6j>n2f1j4usO1NNEWL=W{NCD*|EdYsp#_WIF3}dL?E5 z6jqaS5fj~PsDJdKqw*Tk>b*g4^aF+E2|3Gtd1YYaBx67niN*0E5PcNXCYxb?FaqD?0yJfwlr?6Y*r~mO zu3e6kQxIQO)xC^F8Q{|dP$X(p7x`jFQ{4R5+faRR`Ax5fW)%hoYnZ5iU>>6tbR=5* zZ00@&?UfQ_AwaHJ!NbCG4A!P$aWq>yUDfNZS;1WU5^_Hf%1YEGn2y!N85`*gWSmiO zlS1Gc(*Wul&Gc$OoOv0MGh30ynW&|AjTR-*hY3xH5YY_?QG`D6E?n>ZFMQg< UUKwzvZ2$lO07*qoM6N<$g6uMT`~Uy| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/group_gear.png b/media/img/icons/silk/group_gear.png new file mode 100755 index 0000000000000000000000000000000000000000..2544f2e637a3d3891b482d994a99b11a65526958 GIT binary patch literal 824 zcmV-81IPS{P)FgJR)_jt=7u%giVi!tIp5Wsn{YCIwmH&0TjuHt39I@th`siH>$zv2L%>B60ntAn%xs1DdBd8TgzSlHr59J zWINVeCV1=;6sKJ^{uhuz31`V!*H$D93KVzZeH>cEu;fYBPmhs@FC9X7I{9$a-^T^^ zIU*|W{GlBHX6)&BIqSN=Hid%iYOKkHR9TAdZUSbr866W^l-Y_AAvmkP$U76V1*oB2 zc0A`KqP^%Y+%1LB@u)C76~JmCpdG4!-EK#3Z!g3SA@s%;JTp`yh7+aO0?26O))||A zM`2d071Ptxu-R;IyWN2#vCwG~345S5jc8)pm- z4uUV{W9h}szkvN$#QC!P?5)B!7rkCDL?RLH8R*E=(;=&qVt#%e1VNy@y!?-OU#uZL zi8r!p_X48VM(`W;(CKu6;<_<6HwTqUg+p=5kl?OdE?=IQn1E8L1e?tUDKw#;O3gK| zbx!(G>IT?@K$;y$eftA~<`E1G44|i{2XaNdPbQNscXf54udff;+1aW9;0VcC8u@Fu zO$y!{511B!XXf$v*96O9v%V!u~mfrM_A(pRtvLg z6HJ#;mP>i&#lFtwyMMiJ3G=*7X)`Ly>RiQPY))aMg=|}bVy3ZtuFetjt!#Yl%f`Ic z4Re~Km?*ILye$Fgzdu_)(u##{63Zh>EcTF?ecgig6uX&i3H-coa3;$itbG}+#p+ZY zmL_!2cgP_Lxv2f8fJ3!n<+Cm=$b+dMLutzq44Xmu!^rP?Egv5mlA&)Dp-XWWXW6G) zoMO-H`$NEVv!vy-JXU3aRBTR(l!x5HRAlCfkoY7P4R6Yk)-HjK*t*P?e|+zTK+3T1 zdKPgFbxC2EtPn!Yr$Zi0gM#aU(h(t|)UIHc+97=)8Z~c=5v_}YON0}-A;@D`)Vy!k z{8gAHo(k!39Kw~3NN&0bhT;U`dbwbcp_nFp|6dqSeF67W=fG7ufK_Y@VLcty138GP zxr)ouLkN&EFkj^JTd>0+N029o+9)hi^!Uz zi4}t4t)SC+%}b3_t4N&$*!@6A2M}0v5>@>&s0|BL_GF=?JHsHkgMv;8IBG9YM8qc( z0bxswr8=$**5-m=uLrXgVCvQos9D4H0&`r+F$GO}5N?kTAf(h4k07*qoM6N<$f?!vBasU7T literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/group_key.png b/media/img/icons/silk/group_key.png new file mode 100755 index 0000000000000000000000000000000000000000..257f111ca8b746ca6dcfc618cff50450c5b528b0 GIT binary patch literal 813 zcmV+|1JeA7P)^BE6mGC3Yb4)(b)otU zX3K2MrEJ?`KUdphf9?l9vwhD}G?g}6i#4aQI|Z?J*@ps(nWsdHP0rA&B0zL!LMwO2 zqRa}T`F1}J1xSKVX6lAiSp6)4d8izQP6-wUThW$sS#u~L(D!cSSk<%bwc$o=jW@wK zs)Vjxgk*-Nd|x1vY|qML-Ch-iks%4En4?1+`$R8df9m8M%)fpGU2_sTq>tegak14U z-r>YQ0Mq>(C6DE`l}#sOcS^F@$Sn{cL(GLT*B|38G}I`<;mEsCc8PQT_zsX2a;2j% z+8<5)hZw8jqMAd6D2xJWlov{exM+Dp#c~fDWp zm@JVDx#}L4K8C@(Qi+vOK9;+9n5YQAP@2d83rkN4MyJ9Lo8RlOq2*yiUx<}q9*8+U zrlg*KfumP*62u8{dkS-)K1W4~57uYWL41pWX^sOz!vrx!ML*xoL;^rM;$HhGkkfBy z*8{?OIg(0bh!>Tiwrv2t)lpE(Lk(+_3=q?PFwM|moS>qg?_{b7wWg75e5F(>yT#Z% zz6HS;5b*_Iv;)HW7JMoT2QgOwc#t1bo`+H$O^uY(x#!GQP%3g~tZR6&*&?F=i6ogry*ZfP4+pMu8g zM&x^d^%h_#fi49bn@d6%C-0y;#{<2>o7iuyq{+%Cx7OsqL|1B+()md*$UHU3yb+|O rzC?FX0Nx3`%|&ru4YQ>*`hLJ~_forVmOT^)00000NkvXXu0mjfWV&c+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/group_link.png b/media/img/icons/silk/group_link.png new file mode 100755 index 0000000000000000000000000000000000000000..c77ed8812e4523f5dffd636de73f257c5905ad5d GIT binary patch literal 858 zcmV-g1Eu_lP)`6pHR5;6x z&|6HBVHgK+>Y|If=&FlO7iNcxvUSio=LLOXuJAyRCe1uhAOkGKFHur7QOPVqJ`K#x zLsO(w5L;u_=1fOTr;z2bHRU1|*VatUY%2YWZ|k&L^Wwifd*1i?ZO_91!1!PC;{%1QW1meMY0UgO z|Ed+fQ5zPA?C?ILph-Sv{U?w{>=E1%9G|0-2pCgYE0TnuekxnG?6s13*Io$kLp7XL z={P9b?+D2{u;~vVC44vQjv&HUo=D*L)avD^xLb@Hm1-2+%0l~aBT70o2+H4Ae~8?> z@h6~9IO439oQCb%MT|7%!A!=3N@Af(9D%xlJeb_sxb0G))Rl>ru^MF9FCk14V*CkI zCIq&;?X>)LFw0c}dUpcatE?2YwYA7s zXXEBmC2l@fqTqTi-779Ff*@Z2k16UGu>Pn)MP;WiSE!Og1GlTK*addTcL9NY$ zQcGfFY?$sjolg4CC6^E#9Rra_1d5`dQmN=V zDk^G~&*wY*2uYG383F97_;~rF#fPIl@YUrgEY{M%S^F0pi#Umnjt;opZgh8d!)mpH z$z(2YIGl}sK%>ztFGNk3Ci@9Ft^xYv)N!WnV?W8kdu=`*Zy8}bMptC zPB$A96En(q(;yCWXn0pc;~VY4@?H>`4xHj9;(|y5sq8YO()6#SFsZFNm#>w{Wb@y% kBoqoivDs|T_jL|^1L{1O_lxzn82|tP07*qoM6N<$g0nk}s{jB1 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/heart.png b/media/img/icons/silk/heart.png new file mode 100755 index 0000000000000000000000000000000000000000..d9ee53e590a68a95a9fa9483f0ebd14f3f25bb72 GIT binary patch literal 749 zcmV{UrO36YoGex>*KgTU04Sb0lNGJEiq?mmQbVHD$?08PR{#RY@(Jtf90i82`&dI!dW7jO<!P=IT3`*tHLxxjwl=}>+*)uJ zQXzyPPN^^yrLNn-L6|)gDrKnEAdbPP1a+KXt(F*+N-)2L{Eb_PQs+ab)QQT6Pw(ST zBha=K(orHRSCfHi4O9%(3e<(Lb`^!uF>+VB$3*L{zr`0-_;)Y*n?E-k7dr!rf-5ve?cY>d<{Q2T>(phfG`V$89Qfr0$5PaI$GcI;T;lseVaJa_ff4eP;K@^|hsa{cCz zXuY%j{{3s?^}(OQ^lJ0wCa2U<(RxpI&Wzye%Qu%q>x1omeM7&Az4w3Z$LrQ@df3^y f|6iKmf8+cE7K65BSFA1B00000NkvXXu0mjfxAtvo literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/heart_add.png b/media/img/icons/silk/heart_add.png new file mode 100755 index 0000000000000000000000000000000000000000..d4195ff80251f62483a2759d15559b4393fdf7bd GIT binary patch literal 820 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 Hu0mjf$tY@` literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/hourglass_go.png b/media/img/icons/silk/hourglass_go.png new file mode 100755 index 0000000000000000000000000000000000000000..b2d3a98bc4688cdfa1dc3ae3723a5a65e0e0df9b GIT binary patch literal 866 zcmV-o1D*VdP)EzKo)jY&y1zSlD`B1nde zmwy#mhVwyd0QaI z|0IfHZz3l>9_idFYXd<4)DCI{(lIq=m)5YN(P4E>hdI?c`X*M;CSS(ztQxWzHOkv( zkX|_~*eDwS`Uv}%ONIR^-3VD$u4*wczlMRyRSc1$`0FAvg`>Jx6~iT)%Ub~Y@H!Uk z%R1&|pJhuJ{h^`Dm7R0Q5XuMBDu(R;EN=sBq_9cR&@NY^ZFmVxfn21Y`E$;x?z8OR znP+4AUqErww4`%P2`K@jl@B%OXWlG3RW$!LT(geDg?ZTYuYf}Fv;(hIA@3etLLk=> z0dLO3k9`JSdA5isy@hwJsR(}Wf-5Npw2n!8&9(qI4O6@i&C|Le#R~ls4Ycx>BnbTR ztkMTjd@saQ_##Ub3%7!cuzEtRQ$;mB*4%~()b;;_VsVWwYjwb#+!J`)!T`7VCD=`g z$QQ>G$U|g`V&KEQ3d=}JaWIs!rCsP1W}#6chUCjE#%7kWpwi$*<`G;=Jp`we{kV{{ z2Oca3WYkCD9>*ES!i?1Bp_KJDnf~R1-P4`$WIN$hxG_RJc1bteXwaD`EF%gle=AJ8 sKor&zg_Twjl+Gf22ZHXJMsL>n7d!LPMJ&Eto&W#<07*qoM6N<$g0UNkpa1{> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/hourglass_link.png b/media/img/icons/silk/hourglass_link.png new file mode 100755 index 0000000000000000000000000000000000000000..ecc59b0abe2c63a263c3c1ff9cf35a88575c129a GIT binary patch literal 871 zcmV-t1DO1YP)Oo{xzq%%#lJ z5=G}XEzwPzy2?K1rp|e`oX6$dN zltkh~-UIZBZXYRxZq~-QYh>l)iwarDxtQF*vrYh5G%RYEnClY5JS4-4wgPLq8mvxK z!!lBaMO7h8?{h)6i7{C#0Ff68Io}nOfN%(=YoARV3zo;qD9W)kT!MuG8RoikK(=N; z-;fM#Sprm9A&ej|XR@c3qzmy4yd(3t&J+~WfX^9Kxxz! zG^7TgRGJQHU6->%KtFvmhuvfI2Uy#-Vein6eVZNYJ3ldH-ovPI7lyS1kgEr1*Q`R? zY3M!D_nA=^gtVHEi8Kf_cjZ{n9>Wsi6An4-_d)_JR(B{ABo)fTmUZ-K9;t zMSdi=VcIxk!ky#mC{!9}BptIZzlZ-298*8EGN>_HF>2U`tlOyi+sr=&jYG@Beb6Pn+cQYO>;Z4va(TGS&7uN3?!HLEeNFw-^9d3lJ2FYrETzdyr-_N zu4f$K+CfWe6R~K|m6jquKOYv01tdvgU|<00uXB<3Di8Y4UykS=K@iLgo6XK-!quuJ zWshzh^3Gleg+gd_I*7&T@bmKnhr@wHB7s04U}|4B+a44Y)JaPc5)!sp4Lv&Nx1KIqEP)v;U&v3%|^C`Ga3?LtY&4dQB4Oz;1v;J%z!D&%WRH@BZ?x; z3)8@IUIv@hG|@IwyHLC`l{1<4BK>wam95g|i|?Cfzt876&-Zx_0f5*l-9`IJI&mHu zE6$@xB)6N}7VeR;!X8D!TAw;;&0Bsj?A071cO>X3K0wl7WZ1;Tg!4LHyNcnzoeQ7t zNW`aSlm8WXYkek&ir$13=ngczvf zV0vnjNpCF&K8px}dunv+`LIb-sOC$_jD(;IBI$xC|7`(+9cA>Vir_V#z{?k7SX^Ah z^71m~W@q439Ycqfhi7+gp#A14n1n1!e>$EdeATG|f798Y=ggzwEKH2Q!qU2QA(Se?dwqG69%>n$6rtE z%F(845Az8c{w(XgimJg96!jLMz?zS6I1HUm2baqQx7&@nx;lhHA!r6vs2|fqJETOu zLxeu2OQ(3(au%dg>AcZsWI(zXn9XJg1cLe8k~0h0wOL=&HK}7X k{AKr*U4z7Szv)i%9gTgghwgU$Q~&?~07*qoM6N<$g31kYk^lez literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/house_go.png b/media/img/icons/silk/house_go.png new file mode 100755 index 0000000000000000000000000000000000000000..5457dbd3cdfea5274b7c38c9373f4e838993416b GIT binary patch literal 861 zcmV-j1ETziP)XFYYOQsT3iq4v1n+*XGK$uN_ml6wuh-}MeSh~Q01%s{EBOdX$6CW< zSZmUq$gTEm39ESwqbA*Pu_w!UQJa0#sLgdF|4X1waUf~Xq?55Q-js;f%_-2AhoZ0G zn5nPOll-SZljcbFWICIM3lC zEEtmy)1j{jgI45)$6{~jDx)ygB0#?)5-ogB>R!4Bxk1pIqzj_-#Z594E_n3B5+myaFFO8t#FTCz}2nMbp zxtjxyA`V8Q5uw#K2vqEWU+FG*$*d4pe;ieVLU0=WVJF&w@Y(=4@$A17^yGm+h3{uC zp}XNE&x;Da8uXRR<$jPzB#=s_pnE}aaWNe7x364K`oT8Ga>ZTXFhRrL4qUPsAh!CZ nf5t{Y%+1%WmpxfLca*mw0K_85Qj7(Qf zhc;c}922^zIU~GfWrBWCw_J`0J^kKa7w|$a9C$d-dCvR1=Vbw4?T4%U1l6aETXC!7 zqXW8xsHf)iil^=jb(r=5(N}Sjq6b4hD<4yxa=d#|fk2BGL-nblAxj$dUjw%)o*K|5 zgvM+FOm``1s4(5FLGW1({Ei|F)Tf8shIHys1GnZBHK0a0{7;Xq41f=)fXY9Tzgxp?#X71r0+vAMa4h51=@YR|!G z6v2B>frnM+VJ(OYTZFL`Ysio?9%#Gx=baLII2%)wZ?Unl!3_V!{M;-Y(lp#x=AgH+ z7_HJw)No?PS#+{|k0pJ_*DgVyk-hur#@ANjK;=BhNF97xm;ewX0wm(F)*9WTMmZAWBP1i2yR049(5W%od~; z2nCSH3%7_#rMmJviyr=}?7xB9kxGav_%PL*7z46;PEHQIUN0slCgAh=(9_d{Y#tYN zUNy6Y!DIl7zIo(=o%1Ebm^_|ZkQ|kj$##iBNl6K~TrPM#9>iiX15$Ii9EggAAz~mc zlm6V3!EySCM4}Hin{BhJt83lqbTV&OsZ`8QkeYC$M>Isc#~>yq=15jnRzhxW?vhk0 ujVKg~D2*QyiR226Y`XqNIMO2;qWuMC>Xau@Fa^s10000aI= literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/html.png b/media/img/icons/silk/html.png new file mode 100755 index 0000000000000000000000000000000000000000..55d1072eafda48abb0a5fcecb98b114d866077b9 GIT binary patch literal 578 zcmV-I0=@l-P)dis)>+`f+#3Rv=dSV4I&~|Vk?LiBG~#L1X~NSQGbAyogj#ie_$n8 z*oYwUieR#5zw>=_v)By?+NE%sVPM|5yzfjE5$wfk_Go)9(A<0e{hvFiJ0eb2MFf%t zDJxl&RDw>Nl#~WweRba-&_F#fn|ifCG!S=00#QfIDe64k{5mZFusu=CnSq>Qvt$j5 zI$4b(K~|@Tvozn3#yaJ|Be;BKfh@+AwFR!7UF7D*61OfavvGQ!VN-Ga+zO*%#qEoS z8E0dX4NpRyRS|XCrXq{e4r(61{zg^7gBPDUwmjg}k(Q%NLkD6fm6*tZ=)6^ARRw9CNHr!!-b)EovamKwdDMpr>=!|-tf?S+boQE&JP}G_9P5@nR zSOjlBPI$jHA&U_KsTjQko(uJ_ROpKn!K^ckXTHmZd+_Mh7C&~BUYvvb=Xi2w6%i+L zP+hwJF0QUE^66)$h?CXHvdjEbu3a_69GS^`e5Gac*$0~K9VHcGVKhe>RE(rT+Ca5J zv_?D-3(OpKFrQAl`$E;pyKkaTN=V?@iK2u!kqwFy=F?aM-2b}R>c4;EZ`t2+*gqpJ QK>z>%07*qoM6N<$f@8}2CIA2c literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/html_add.png b/media/img/icons/silk/html_add.png new file mode 100755 index 0000000000000000000000000000000000000000..f1c08b7d6895600e813d05db9ff339f56289b9da GIT binary patch literal 698 zcmV;r0!96aP)GYch2$-=^h zQVJ0^k`=iwScsT0WZcd--+ABnd7lTRY!o%WUt(rVM9KuEOi*_8;z#2zM3oQ}Cqf8N zh*3Df1)=ap9+aXGGJaax+r}S;s1c(fYDhGK7(tZ~j37#giWlX~?NKs*`!+5_1yMty z;-e8n31WCroJ4#uoG3mhoz;w@A*B4IW(@Y#a3QjxzsA<(9qd@y$nHnKc$&TqGsvA_1`Q{e zLGB`|#<`p4>6!C@!GR@oclL7U*=6oOy+D2X3zD_Rp4+DW4&IJAd{CSyE*M@ECyE!P zT@SKl<2op%Y+kgVp<8<>k#gbEHPUb2g~CT_ttD!cO0>6?=%|*cS4&K*W^_#{^QAFL zIjORF(SCk8xb_V5yZT7dKsHtcPF{V71w)-;Ua+8;i{KTDO3&iYJR82pqv5+88a&7G z8@p&NRWL1+m>K`FY~QS7-SgTHujpGv?~Hz4zJJKQ$9H-A>g!NqX8ez3`(_;n_5wBF gJ8Bpk0QT%*y_loy;s5{u07*qoM6N<$f-kT=jQ{`u literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/html_delete.png b/media/img/icons/silk/html_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..1bd28489e55af96b73429471606072a80143216b GIT binary patch literal 688 zcmV;h0#E&kP)P}pU>|WE!{&llBw4ut;O*J;G z?4X<_99Tb_)^ftJ&2y={NW(?62&7JgAW9`ma6zfGq}+P;gCv0~55KdZ*20SU6}qZr z+RG_R=2Xa=ks>IX3t8@jrYMz`go7JvWNAX~1T&-VBC626yaNN8L8&(*4IgnK#qvm6 zFAV3E!YkJv58_2>G!+B#W+a;N{%eB|cdxVd-d5i2Yv)Msc9wm-jXF>EtMD{^8)i&S zhWaGuE~09@zH^nG>2o$6K2BxnDvEbc`Oy1}x7Hxpa_OV(T{DYsqYfVwCyEPyoS!(? z;l5q$IeD74&o80B4`$3{BwNgrC!fg1#)ZO1I$KNlmW0-j5Gsa9LXec8Ml~Oxb>33g zb>{B}UYO53ev*wAfg6wev0$iE%nKG2a}m5^QQ2Cq(s=WT_6MhM#UKq}e5}MsQX`p4 z8vA;>E|fdl&n>J;mZjeq9~Qn0m11bx`DChbe$}(+Y(6@0q7;+Gv1I)QH+MXh%fA7S WOLjj|mpRh_0000a3s>5r;x& z)rla24@6K9wNMI$woo;;iYcWgx##Y)_gZ@`GY~rIK*;wM?#@D#EKtb;Ri}RV+xZ`A zhKLbW5rLpih)NVCB&QZ51f^o$_?kuh$5C@~cGMirj;JGMh&ZB#WFx6@>CS5^-kI$x z*+9+FY^3an8lp~8BWfmz6V*s!vxAJU1LZp>H^%BYH{(W(lf7_Huti#Mk!3i$5YD@KNTS-ZT&g}Yxe zHM@_MZK#_}5W{MvtfSJX(dsQYuycs2EU2U6?sQ_t493?C5H&F}yq=?%x6n<2C>gIa zRVO$x86g?xufOKlC~WES-NBtwM=&7 z)yx#_fo1&o;yw@m_=SJ(ougQF?1?u)ad9jfo)i~jV)6)0N+e4(npicwfo)@Zc|7%i zTR%Udes~7&j8eEe@8jcd%X;hRXN&LtcKfeneE#yR|H{0=-FY8lCyP2;&*ETtZ2GJ} a<(;=eRf2_>Pt-a90000 zlh11tK@`Wovq_Uwo0hbVwIoqQhQVnOkuXz^e{MG*vVUi||+dlBkEy;#AUC>|=7 zf?$Pu5)ttv6zruGW7H~Y+hl*t%+C0oNdv`8rNb_7c4j{Beczk6!di>1jIoC&E-I}j zga0{vb>>p_^3=Iw8{l!mPbve0C9#n?I)01xKABiqJSL(S+| zhYX|#jfW+z)dw)reao-^_+3J8mqFCfEeD2$Jaw>$>Gyvyez*tuj=%}wV=-Tg@#fPS z&L8Q=)3?Bd(LPMfd_kc@z(k6vXze5Avx4~=58r>a3?YEqGhb2d>%hLjJSx38Y|jPQ zUCyH!r-*pgG^wDOXvEF|JzhE9hio9=*4*_rk`$~dYt-cgAtuxy9Qxu0u+0=fBeF;& z^Wl5v#W$aC7#k0`NGTnCTne#J4+*7kZ4=Q!tSn3-5v)WKF=4mSiVQ~9>)%d+#l4qx z{9MysLHD){Ca(=cac&a}aq{N8Jv&lD?NH*Ie}D8_lU}{{dpp^$#|VDB0)4P3h)NUdleE mCFsAYz*qF2A-4KEx5r->H>;=VK>mmT00000oSgT$J*kO*Aq9I~CW*s{G*(t$KS{OS+#aO%?udUme<*TTEO`Fr@r_QT zk=#}u-n~>Vm!+9S1PE{@3<)G~CPb<$Za;W?3+O}|+q)?*Pn355=}S(XIZmEANjZci zf5 zj<%@MX^bD1^BwlS^+AD|$dm-1wial0hwPI;CDM?Y9SXW#@w-UF0SQ8OgplRTleOB2 zUjkDS|0U9pI|lSN*EvXUa~*UIclJdZ#)Npbwh9>YT?Z;=B8|l&^t~P~om?<5Lre$+ z;%`P>SL7`djY#8Y9$wv9dv|3p)9Ovu3r^Sp@>J&i__b$%mxew<#AEK)K4_tuGzR_Dj zPEIW+13!^2!Lpmfum?NCj6AtX3WL`1|z0WJO$R6%tkR)SoHv)7)V z2J!;SiNK5OjY!w+2h{D`h38lT^}tkNg#0yvV}#EiXX)>`NH!2DT1ckB7?;L|{Tz(8 z;ur_j0K^3mj0hqIV+lr?y8Vsi$6LOTA8J(bfmHy@>b zcO$Rop0fUa(vNo6-E;xeS_D{{pDQU43O%OnNC$xlI9%J##D`I$O)boS8oT7?XD#2H zp@F_)^gFKH=_e!=bR0Mbz~#1kjL!}OW4;TpGi>5Em#V5QmwXEgf`!BCTAaDqG;d>5 z^tO*M_~HzHzE&w0V25WOoga94ESc3NYfJ6YaewCBwAXT|mGRkO%EV>r%_P8({OdYL nyXyvlE}#-v1%_wt#(IAOCI8(qh6s|AZQ;I8AMQ)(8AgTxri_~QH!8j7P*R` zMc^VU=$D{HL=sFyKO~Ajq>MlFfA48AXxr=Z6VbHN*b1^Vu&p;5ljX0cxTq=?a5f!hw>Y;n!k*~vFnseWh_8s^dl9C`3w#?js<@l-uiyFgp|$5{ nCx+WSD{<@TkixBf{e_-iDvsiFH^U=e00000NkvXXu0mjf5N;`P literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/image_edit.png b/media/img/icons/silk/image_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..0aa4cc6512ea19fbb5241bc67ba90a9f8243c960 GIT binary patch literal 783 zcmV+q1MvKbP)5LVcnTf5GZ5SK z3kX3yRAdV+P=@A0X4ocLjyN{1GvCa2Zx4f0Mm_b1^KcIL{`sAI&kt=e|j1aOt8IKFRjAQ%V;Axt!&Q}+Z~gVtlY#!Wcv zuDrJsNE(EPTsx2x5C_g)V`_dDwxMvf4bqPkBtr@eDfrsf%!$MMiMv9iS{R9elqSVR z)0tPc5JaRzZGN<2CWLZG!mX&0p=0>~b`OL3$D@B9k<{xM9y~l^u8U0nz0Se4#tee$N z){M2pzFo)T6MSiGBQmVDbov*_F?_8-8Xlx!C&Nsmz|%-Y$y>6D))DQ#gs}Rt(lhX? zJ}!P(GQ9L)ZM*!P;CBTF9ZtvJrWbUN$aV3ZxD%gJ#8B!E^50fauc z(%JeF*;-Bc6HoVctJ% z#J}bQxxs95eQ_-5U|T|`2qxI_#-5W8myg8t{8iDA-)X%=;eu5}di&_8f3NTO4h{EI zwYbm%fNg=-My|PRb|Kn|y%-Jk?%Hsw>EplF`6o(16g6JqaoYd@ N002ovPDHLkV1gC;Y5M>G literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/image_link.png b/media/img/icons/silk/image_link.png new file mode 100755 index 0000000000000000000000000000000000000000..4bdb3541ecb728c1e2b0bef1b0546fa0878c99fa GIT binary patch literal 773 zcmV+g1N!`lP)a^7G6T^gLQYt)lJ)S*4dqT-(Sy@A_4#a000000OYX$@Tp_vAnm)d zTn=Ab0RTV+0E`r@8*%c}_x2php{&yWw_e!Z+|X>MlyZSU1(FCNs6Z$OtDbrDi-S0n z!PBFmCmmdyTk*4u|()Gt$l9F|wevfQ0pZ+G_t zlWJK_L`lj?NtTk7GFg@xs%5GQfE=JgQ4AX%SxW=}000Pq069Q~{%TLZcb$|(RH`Ud zRVE=K)KY1%x-6mskOM?;d8zI1OH2CIKozBbR~D?6w@H8v#Z}k4OGE}B2Z-R}!VQKl z^neJWDWV79su3411OUjPLIhcD4HaekjK=C8S{rWh``jhH%@0e%ql)vNnc33t$;lIL zjwq(4rs_FB1W}b1fBoFOw}w3j59oHgw$9D@>WA<3t+DT^#}z}lPN!qd(9gqP{{%Ixgy^BE)% z9@>7F#!c(NYp=hf-yhh!cdyCGNi#Durl+U%2Ln$(`!X0E9W8QLHfXNm{_+qP}1jg5^>)a&)r ztyZg96h#f$;^N|Sm~S*1r!lm$vQoC&?aSS6_lf@j6IvVn17&DY00000NkvXXu0mjf DgX?L9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/images.png b/media/img/icons/silk/images.png new file mode 100755 index 0000000000000000000000000000000000000000..184860d1e0b16cdd0698a884186aa27c3b685106 GIT binary patch literal 661 zcmV;G0&4wR5;6p zlih36P#lKyR|!_HEbWGst|FC=iQ<@LbGEBn!qA~>^`=bSiulnBr?QncO;#pi6;Zs= zE5Qp<+)W8it;X7qG?~p1m)CPnztUmZ#RJJX$@_cqa>9+wNjCzsvg!_rnj_d^tc!C} z)Q@x?#ZBGNBVH`Zj(sOsLg54o9R~-vBzft{d=Q_JF@P(P4aH z5rNrN_=Fq|1VyW#8F!Fu(8+xAESBFc;{Lk?9=^Ycld&v_8TK+`0d=x@@j(PDA8%px zLle(T2Gs0LSit9aqRaK$cs>_Jscym*k~J1kA&H)AE}TlnF?=b7!Sg8)Ww^pQID;9u zC$aGm@=IlOFc!dpyQG98;>{t z;K|p&h|8~-wr?s6WqcIHcEDgr+$@!=(1_vy38012hx0`X`ENTN=o;1bhSJE71W+tD z;G84@$9QRBXj*jSA^cvU--B7JvbhUf_1^bP? vP|eszjZh`mO}g5B1MG#;NxNxl+u!*If$Q>9A-BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;LeP!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*qrt0hl7pI`Dr$rJ)1%#!m}(}?)Q8C%hu~P z&*$@ZsT)vdK!&|8zes6Pj1N&eUReJ`yuV>;nnucw0cwRZqU);x5X_mKSbSEdYhBl; z0GJP%irE%X*WG{_OK!=Ch zOWQ$|ChD2{a5$vx_S-*#TZ9g))rvNojk!lrL~$Hb5CpB*=SGmFLUCD^mceefGw-9( z=tP6QkAZYflEgU9dV%b_cLe+t2B0bK>f?^+)j$Bo<1y*ArlKh97|`KY1}?y4GBI6U z5vSAX{{X@;G!77-A;&D8M}xOCP49p%jzo#BYdscH_X9`;wbP{~X{rDK002ovPDHLk FV1mD6$SME; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ipod_cast.png b/media/img/icons/silk/ipod_cast.png new file mode 100755 index 0000000000000000000000000000000000000000..6f6d3406cb1062c517d384639dd27c4cc22eb48d GIT binary patch literal 711 zcmV;&0yzDNP)D!zG=Q}^X1IIGPP@%!z!@w<+I){Owi4hXU{7EgS}yl zc|){1MO6fra^Nn5rN9@UeQ+WWuYp1y7AD>y#AR;0_H6)^>LFI00w6c8@D^I}-8gM` zEiQFih+>?Dsa7V36-q&PdkRr}vYO!I%cG!&i0^b*o=}v$gIIDN>EFi$7uFJdKzL74 zejS1MNqwV3W=NrfrVz^SBARq4&VpBJM+=FO--#s~DCEJhAym^$G2e+0XHb4Svt#|# z?RS_S>9SGY>fMDo2;46OrQ3vSisXLvu{6^{KHI|dk3QnNipbJ+lsm}cv?RI>+)^rp za2votPy%0wkv(lWOY8B)+VdS+>rSN`i*4Im0{)d?5lAKy2@;9KM)=}? t0ZOTKI-PD)O4XNtV67Ik)}J@}{{WOyO8m_F|55+|002ovPDHLkV1m*nKHUHS literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ipod_cast_add.png b/media/img/icons/silk/ipod_cast_add.png new file mode 100755 index 0000000000000000000000000000000000000000..c3257f5f1e2987bc9ee17954cb2623367578f778 GIT binary patch literal 796 zcmV+%1LOROP)MUvn@5JJ+GVOV$(UKosaQ4~Q%!7dWiGJCPo3{GAL5i_55R32!XGq!Wm^*YDRxAkYq2tC!GUUX}>pbx9cO zbYt8Eyte^d2jF2rT>)n;V808v6u@XJ;HUw*F1pc?oAd|3X;pYj#R9;micz7Ibdxtb znah%)FP7p(Q4BVM8A}268Fn4uZ_9-LNetm$DrRG_*QLQBPa$0e=>}me38MR|0=j|} zXwRqN>A4vCDgouO7+7frgOOGh_%6~@3%XL+?xez6IftP}z)}vFZ_!-=bjaqQKAnok zC!_?SF$#gE9F`&7j|iLAXR}r%lWr|s^%2rF;8~so?J^1J8eq5{f$C@lT8`{O!{Jr* z(irlrX@+!{5vDEoQ#WJD_8HE3^Ml{+2!%pld7cNyaq#>72oCjs9(50}sL$R;g$wAt z4cywa)Z08BISe^ww6zy^Su{UN5#tb^QK0Oynj z?>>2<9KHsbG85UwyPFdL!n_-RPX3FSyobjz5K&=ZhJGYE&Av-e`YsEAp9uh;&nE(+ z(dcGQR%c;wN{hdbeNrO;kO1&_JR)FzejXDO6JjK#d-2G70S(@KvADsL|9=CQ%e4@{ zeT}UiXPftd^%jbqgLXx_EI{ zrKMEGW9*{2Sf;_Sa^d}jOm<7w~Tld8ZU$6A~+4uS^^E1pz4T=@&l270ZN6D*P^TeJVsR%^+Gpl?xn|BQJ6CH zJUpsWFJR`=P`X>50eJ5w;=QfnuN7rk#c?H$hQer}YY@5}m@_+gblgDYp=c`h$8l$m zN?k78*sdb$6C_$njQFaAUa6+5r~X1L_S^tX*T9+$kI#rR2g=g|lf^*S0lJ3D{)d_ELK!Rz(X(PaD5>Uttmv_4D}hp9aa1*=CS zp*u;(1E|i>wj1g1^tDe-P4U0DTu+~ozg9=#nvvjWmlA$TV!H#>HmjX_?S2 z8|nk|^1)U@>%QgF9)0+vbMFeqMVXRR$ccfXc!r8M}+M35Z(54=eI0P!Lo3Z>vVl!7-Qw}2O= z3LZ5%NiC?SQc6r%jpSp4>1IE(`+PH-w{Ah=0JUDw(Ftl#gmTCG;c22qy~8EyUh2pEt2jNHcp_?KUsWyEB^ z5r7+Dz_H9s0DuogpjS(CNP_FSRM%d7dJhcq{p_o?Us8a|b@RgEt_9njF(`+UVdtY6 ziN^$8oJ=OrzW?NT3fvWaY;5qOOM!%`o=i%H3k&idDVPrj0fQ6j?;?ziH@0K19FBVz ze_X$_NDLA&0FPI;hwdKzeqIwMoc!=Q*1UYP0+w}JLS4cf$ANCQ3!0`8-8wcZd`>=*&{n(n(H&ZS7D9~VA-qjs07hjXczMlGufO!-eHz~S57b({Ty!0 z^|sa|9GsAVnvr&^)e3>|OaNfBx#s55PVQ6(oXK0-#3%zC7L54L4{ueldkJW1R95TUzXcT$G-|YwZ3uzC7C+PJG?~lg zv_tF}9Lz9`k3b+0_INxX0$taGolfVSr|u82E+>M?WOC7HG|+4|1%cb`#%MGOIbj_M zI2hS%mi2l)L9kpdg&$2I%d&`!F+pIF98JJ?fOI--`g}g{MGB{HPUg5ozHumu0!fn4 zYPI0^`%mkDgH5_o(=;ga86JN7P;YOp@%r+`{n@dDa=9GlLEG(iGIue5Fc`$0xxvNb z6PU4NE4`ciE`KK9QmM;Qsg$<~sF({%i$^+^?KoQxsb_Z&~CSx=zu3>E?rbA z6%vtHm{mkRo6W?TzSB98NQh{UKnc2aI2_s_t8l*)3rD)3UuzRkk`jD2k+1;!akJU{ xbDN;s?V?_<+oCyiON~@Sqwc?8=JcFTu|F2lW40ifwh{mU002ovPDHLkV1k___RjzS literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/joystick_add.png b/media/img/icons/silk/joystick_add.png new file mode 100755 index 0000000000000000000000000000000000000000..77e710772f40faddcc2c3fa16c4a92a07347d052 GIT binary patch literal 669 zcmV;O0%HA%P)oJ(_x`dc-QTAF>c@ApwG7GW}(_5=eGiNtt&dmG7Q5)@Rc)nG6f z4g>>;+%e5AmkXUvhgYD}>4XD~uO24u{cfHuTv>!2!Pu^1Ezg>ZnyVj0mdBudbHYQy5W6F+U%V?2A(Bf)G0G#ZTy zB-Ye%v)PP%J`eJpSbARI_>eT8e!{xN;mgh2FdB`%Qvg~_YO9800000NkvXXu0mjf Dt8y)8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/joystick_delete.png b/media/img/icons/silk/joystick_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..5d44b592503becbcba424255921ffdad0390417d GIT binary patch literal 671 zcmV;Q0$}}#P)*h{!Z>@B+0F%S_t zL=uExOSA(;co2~&X01@7)osa8#~DW*r#FwZkU4B0e0;;q_x;{`|M@>+nkFVAnM?)^ z!`SHcdP2Y7ho))Y6h(<95(#;-*8!W*b^W2=?-$%|H!MJ z@qh}+(t2kXwjxr+A&MfLPA5vG61-mT|LuS_o7Rf5EJIW~xVW>8jgt$;U%q*tj%Kc}BY*Or!!q*AGSOef1o)-bJdI2`7) z*(?f$0;<(2JNK$M4{_lHw4Ws?o3GLRwGGw14`pp?eR;hWWdKUkBasMC0cf>aY>>Kd zoc;IDFjLRt*x3u1nwy7K%Hf0b3QhUbEp`Oj#8c}clgU^nVuGovItHBn_ynhJ+=c7Q z8$h}b_W=)%3bQC|ns*$3L}RNq8V&Y58timBtnSwpxO{WK`Q^XjtsVw9B*JJ13=j&1 z*gv<7^KaFEJcn9*iRl;Dp=))hmfc$%3=UfiU48N3^HqQ=65>v_*`zV_8SgXU*zS6%{~AC002ovPDHLk FV1lFjDy{$k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/joystick_error.png b/media/img/icons/silk/joystick_error.png new file mode 100755 index 0000000000000000000000000000000000000000..b32149e27a37adb1c567ba71ff61364f380138c2 GIT binary patch literal 711 zcmV;&0yzDNP)d&Xs0pH>F-Fp)`Pg*#IlEx0A%{E|26ktDGjHbqIK~+IPb?O* z$g=!ik|bNV+eNF@`qpSPR>I-1*dIHJ0jJaHJeir9u?d0z6;LP?%=vu&G5xyMA3HJ# zP_Ngg)9ExanT!U|>-DJBYL-E<0|69_jg1YiR4QqJcDt?F&;Xw2HP3OJ2KWmZ8bC8Z zC=_BwqY*Sn&D3v018Cy#dcB}QBAdJa~xOCSge{VTu}$c;~!UA}|8w@<<3_TdoK1a)ZDYE=U?>NVK)IT$Txp)|9U z+rq+i7Zm9SsWJzf?nmX^MrbE*gmZ6|p*GkKoxa?X?hD9M+@sRvFH{EqYA??u6x z2pu{uGnrwz*>rh zfvUA@7b#acN?M*mBG3rQV?e^+0R5m3YXWyRZL5Bt@3vAw{9JaEW$}=f4bXO52yBH{ z;G~ZN|GLn>k~{On3Swd-Sy(gFkOdyw-RP%&exwl01RJRp))TI*SsngruhZksQ*NT%!X?K00007oX;fYS5fR?a$bad^&iuHSu~`3%VTtO}r!shMd`!61c%6R9aJGSh8X%)P*raU)hwAiO6D z)GH7M>Os=K8*y(FIo?C~yJ{<%*U%nBM$Zz%Wh5q=k@+A)HgpoHzyZX@8&HV#!QWjA z`_+cv-}i0Xg^24s7I-VE#u4*AQoR#N?{>t-#LOH})WMk9;P)owvi_IE6!o^=Lf3R#&PVCy|Gc4obnhMMwvBLinP_YpwW)P1ST? zrfe04-x)FNzro&t&e;ir^8^J56p&nqIY_fO@GcRuAKQt!4<44sunkb-j=jm5S_@$&_dyonDz^$r}kLbDn<^FJI)(KksQ7G*l%&dIcv63Kcm5d9~ zQDnp25a#b;Oe2ojja#pmUoF|#dr&8W-hPZ#rZfF!J@DLVkx!Vn%)K#giqbQ`G;LE> ldR%0)iYQ5Amu3}R{|RMS>3;1N)RF)I002ovPDHLkV1l&ZPDKC! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/key_delete.png b/media/img/icons/silk/key_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..00dec80d84e295960ce1dc1e67697a8069cb7a81 GIT binary patch literal 724 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/layers.png b/media/img/icons/silk/layers.png new file mode 100755 index 0000000000000000000000000000000000000000..00818f63635ef3b3c04260c0d8f160b19570cb62 GIT binary patch literal 597 zcmV-b0;>IqP)62!*BTExOSjY%3)*jT5svJpGKf=$3CUqKK-1RDzx8ymlZ zwS;W;-7_=ySiHB1u9f68hg;0tAIzK-5q6bH&%Yeqk1(r}i84|~$mldU469wb{r=gf zuYVfkh}abCXHiD56XS1@m(?2&*9kHq6O|^j@r%)9WR;gBSR*+^{BUiAhv zLTNl5-SWcMf`$Z#q6Tzk02$5(j=VTsw!_ijI|?3O5Ws14CO8uvli9}fO~g1=Dv?Sg z6QM+>P3O~zsHL}l?cjL#8yuEVU~n|V*x($S*`2dri>5x}hU56pjd4M7=H5jVf&jnh_YoHFW1pQh33@EE+GcT-uHR1*sID5Hzvg z6g2}hp<@K+0FD7#ACek+3k!>iLhA`|uU)j;i__)Z&Fgb3t?v-b7s4*agaQ+5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/layout.png b/media/img/icons/silk/layout.png new file mode 100755 index 0000000000000000000000000000000000000000..ea086b0428b38a89060a9a375185955b46ef8a16 GIT binary patch literal 480 zcmV<60U!Q}P)bIK^Vv3-yA1LIIsp&s02Z_@K!5`#FX}eq)v)_0l`)ftgN*V#4liHAy(R@)k5$_ zz+fRLk_!vjJvlS)-*?c3MK>79^8`s8M#QZ=d~*vp16%_xfrJQ{sH#8}z|64B_Dt0J z`P0WPW8(JB3js+iKY0CE|LOkIcXC92S;ReA+hk1aZ*^gg4_~%hT%<6a;!6vI(h<04K{gA?%Sd&@y6=YWeinIdj=VUB~cY!neEQ@}0VeaXlS6Fk3nozGu) zn5I8Ji!4)AIGIuW7!!BH}EWfPj0kw!x&q?jF;~BwWO0 zvkjpC_R$R{_2*~VkEAVJq{#Mc>CUTjlCENQ+$@0%Sw@yX8JQsokiZ5|y~hPf9L7(i W;q(Z^C>$XG00001r;P) zZezzV10q@u{(~D3H{r}Lkl<_rHY2+rym24G3$cBt|B)I7p>=x@2E_E70t<%J@A>aj zyX(JK%`Pzi-qR0QF<5QQPJ{u`T_?bT4rSZ_H!r*R-=cUM+<@2bzoB550l^j95C%kb z90v;;=WY34xAek)y_`)b20VN7_5YfKEB}|wO!%MH=l?&k%j>^yc@dHe+Kz%X=%laz zU%KGzf9;gDCcszBu1x)Z;n}YL{kyaNhxhCLH_w*rfw-XU2;6{@`IrWP zY}|Nx!vBreCV|C!_N4yr-;)k9;5*oWh^9mTUl0tqi6&npJ$x10^Z5HznC|jkhtXU{*?AXX+vSK$&lqrKo z4P`-MYRWlh-uHXoo+plGVQMtjm29&SnPTept1G}>;1qBiY)nF?X%bBWNhny_l)Z3d z&-N3@T)lWSVVldhUf%V8y7}mh3o^f*rno=*oe{IP>4|aPep(t*WGZD`whRe#WKrpOeww^A5*|8>ZEI3iJG3d@;ddSaaQQiv*3SWXm^*Pk(vkYVP=SQ%7gX+6s4|5yBQ}3^T_6XQ zZDbP)D!Ze~6zXIkQ9PYpWTZE?jfD>%Y1@{Swk5itNez`{Q)G&e7J>b9cP_BngG&!t zi|rp2nJV;T^4jymwofAMkUFri0;>ZDmaq-jpk-+0DUxkA;uk8$FcGE_?o$8&002ov JPDHLkV1i%8-68-0 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/layout_delete.png b/media/img/icons/silk/layout_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..4bd45f1316a102817972acb897d940ca07bfec05 GIT binary patch literal 608 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 RNtOTr002ovPDHLkV1g5*h$sL6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lightbulb_delete.png b/media/img/icons/silk/lightbulb_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..f4781daa84ce5f06b6064ea1098fe50803d84bb9 GIT binary patch literal 857 zcmV-f1E&0mP)q$gGR5;6R zl37SpVHk!DMysr;XmK|eDC@AeE|5Z7h|Z2W;Eq> z%yfxic{HE14`%YV?o_L_BVlx@OOdg;-}}Pqst>T*FAY4^0GFi~!s;)GoE{QyfMA~j zKU)uLOFR~;Z)z>=ihvCOM*nT6V@5TwMt4DU8i;hnJPDBLq7tNNY4!2Ht^E z1zQ)}mHWH^hq@?-H`bB{6GVQ7R0@({2PCIQl3*jSF}Rj%0nrNc_jpjBZr6JO%fs1} z%Qi-OXUL>kNG=O8EqRO{xoGlDM*xjP72r*S&=j2Iynv-2&z&MW3xVl_zz&o6Y7%=K z!paCS43Hgk!?n^3-uxb%DG8#(fT^70k{4iUPc%9g`^oePaK;y8LKbXa@55Fnhpjdi zma+(NR3;eB9jwv0;0%M9&O7lhfu&QKZR^V;aV_BV3Yd!n!Rk|po`TWJNlnIF)()&r zhCz}vFnvyhwm7203$XWO$QJA5Q>zoDWPuvcAI^HrEcFPCAqK222@CmqAu^p<{#gli z#!;TCN<6&b9?)&d!1>B(dUd=E_Ns?}0c5h<%<7(CI^#5Y?jAzxB^g?-Znrdr`YJa7 z+%h+%oYa;-n4c>N1J@o7aqcoiQxNp|=P;Ul23*}+Na{u~6-gM3KPEH>%MyGxU(Js4 z*Wrb)V%I(vrlBbJJl>?ALd~^ZV2K$8k$_@1kmV0L_ad4?e6{}p+j(v|?l<9j_Vt*tPdX$%bwqdsa693`;;G4ZKBSR&HPeL?m> zZ3$>8&yKlq{R$Hr8X^S+U68V)0$lxZN5naWKg`ek@H=iB+9G8_W2kT1mVm9)ee0l- jOq_McCe`RRyU+gs*;)rnB`lAt00000NkvXXu0mjfi8g(R literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lightbulb_off.png b/media/img/icons/silk/lightbulb_off.png new file mode 100755 index 0000000000000000000000000000000000000000..e95b8c5b1244a41c9dfacd733ec652a532052a45 GIT binary patch literal 700 zcmV;t0z>_YP)!y2hX0`01t+}>V>!L2Ii?(iJ%bC$d(ON6}*wnOwG9V2N zOG`{7!B5mwL_|_S2m}#C`CdG|@7W+M+U(-lIXipb-}9Vv-Vy*Mg_?2)&x|dud>nH6 z+Pg4Y7{H$F@$4DL`b~nbIs5knvB+k zHj8ub763Kx9CrFf76K8`6xv9LChyt?+yu)3H}{cgBtWFDjV( zT46G1p#RVaN{MFkER1%KNN}rd=ywA89=YD?5^*~T(5|_U4sv3(jyQy?qF#!I-YIcK zeuGD!Ck%N2HSJIh+U=tYeo@e&trgAm(x7tzP$_D_zeF>F>u*g-I^VNp4(M<9KQ~%~ z3}FWb=nBN{ra3RFTFeCC z!$l`CCu*vADm$NUP}Jde?Il#nFW_p845!NWW$Et^{&SQIRV}^fRyMzZQmIB=eG~3I zc!HA^Wx-;#MFG+)=LYmWJqQGXuvo_MLh%Zf$0hUI2Iy7tvy~@~#>&eNWlKvX*<(i} i@%N3@m$wc0AN>MB3Mf9{XhoL*00003kp_oQM4NsQ6$aEKj6mx0hg})10sT;E2V;K zUHNY7qG&TIJ`gc&M*EmdrgP_>>zSLTO=}7j2M*`nnfbo+_|8cvrSLzG(R^{I&fHg| z3Nfi70*Jk=pS3m4lD_qhO!oanz~FpWe?InrjDM6H7D@P(w+NOTuL0gfPQ>)8EiKPO>RV|@%G(EApK7|ni6$Or7s}#zN5D2fFuoW z?SUp(cysDe%D^FVRe!-fK+o2zXp zH&*H~_``&05AX{CqjQ9Pq)Pw`p&~+e-<5=lgjH9A;4MsYR*p|Xp3o{VtL6Q8vD&1u z_TBwgt>E(`Zp(h8_8f=r&cr~-uy!|BC|zGKq17aQeR}wL=f1PUhPjus5Lo&7j={xc zCLhQZ=E~bn;<}`gh7Bu?>ih@P+*yw5-^u2k8!el-HG?lt4o$V&*`tbh^4#JtCOgRB z@^-thiGaZ!P|20J4^o7;v)78_|FldDe9Z$i&;9^|y&bKi-n=y{JsccrzVF2T076QP UWao5~B>(^b07*qoM6N<$g7%3ha{vGU literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lightning_add.png b/media/img/icons/silk/lightning_add.png new file mode 100755 index 0000000000000000000000000000000000000000..dac3c9050cd1ec973e93370f917bca2f06fe420c GIT binary patch literal 746 zcmVR5;6} zQr}BcVHoxg@IIoOz{C_FkX>Oj)x$T^-or(4Io9&zA%s>3`~3neJ;|LkE5gf`w#IA;av{V4EB^<#! zB9FzGXNbCPfwSa+H6BHf#)#PK5HOXKbU9p~WGQh8yucGQ8oav^+(a%yW7!A{W{T3i-_H?PT9GgX0%t6b6(YvG zq>c)N#`6#y$-xRaAD($6fPXtRdwEB98b8;yhqu2^Q3`7 zkmJqYbtXWB*0u8ty9G#BGaV zK{OtC+@mjqTUP*k$1cC^?T#%4_tMd8d4-LuXQEjk*aS{?bW1STnFeyYZv8&<#_`)JidW z8<_=K;UmF(%&0xoDfK!!&HLVSPXE0+I8C$bz{h{ifA9DGuX7|J1pa3!=?87N=Dy(K zqA4mk2RK=_zPFItGyc7}Zm8rR0V20<^R}86VCIi(69z+c`4i%6zHo~Cm%#GiiJPjc z+y)A)Yn>3f0j}#1Nga0gImB1TO)?|0D?O-fGdgc~Za)YXov@+_eI0i986?AVh^_j- z8L!OjfhDl?@%VXrjz@*0f2t}U)ON1Ic^&`_+1t|JGN}q@kg0WGv z0h_~vSa8zJ;Hsx#nZvs##F&JRXNybQYTLfuOD@Qxo7; zb1kfuU+@D zT1Z*wnCp24V^Ky$O(PuMeTa>|#FuxkSa4#z&6ce(lts1Ta3iub3eDezK;P%Jaw0pY zdm(kSAZMl%r6q;3kVKo3N&eckf7t0NLpU&is5Z4iVtWzg0p|`cP=96f4cyoXnMKzs{AvK_${3I2JB+KxN0Ufu@$4=bzE&*^yIyyx1BT6wnTq{7MmcwQ@C bH~oJAm=C4+@afe?00000NkvXXu0mjf4;oKi literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lightning_go.png b/media/img/icons/silk/lightning_go.png new file mode 100755 index 0000000000000000000000000000000000000000..29039e6a8b40f6ed99cae87f21ea8bf7650f265b GIT binary patch literal 739 zcmV<90v!E`P)ZgH#N0snj1RZ=5O!&o^!gea_a6n@WA=tJm=FUBKRM1W*hOrV~>U9f`~wv z0Tu|Y=)%0J6Hoe^LggC>gr#M3MGJ%lAchdF!VuE253mxEF{r-t40G)#`jbf6HD_`WwU$M6V#vcM2*Q#qvS~OkA~o z2X+9Mdw=9?o+sdf%>_z*h8O~qfunFgSf^kugh83b=D^9J(VPUr{K(}ELQD!`%%7PJ z?Ct=T=ZB$^(QAR`p;x)CV4LkdROfK{`n>)VP_cHf(h#k|mIYVoX~ZK>M2OYH#R7NA zC|vQRGY(=1aUytrq|_-S?Jn~~ebu-#6>{G$ z;Iu>2K>%gc%R!i`>EriVc(@Y%d9-x~vXMRtlG+efgGAvu^>|a(&{& zi#?t96Q26xH5Wm`ASN&bGl?jQ3$~$m>`Ow7tFbhel@i4YmQkqm)z}W~Y{bXOcjySeo>2x3)2;HwxvuqoCi6>( zE1z8&OJ>Jv@7Yr}`zB9kxMNB&8m3!icqK{XA4Z;5)n(h+sJMkx;HE>i-atjR|2L6A V!PJ$`dXYaZs9=SbAto%g@>T~?_bH&lTUn@`uo|1bXE{eSR(AO)ESb=V4`uk}mK|39Px&03WLbv~pzk+s7D@lK^ zn+aB+sp)&Y_x-B3>;6ywU--WQNUr<8>TU0P-|L#1U&;A)67w(+> pDf@fM7q9#F25QXo3rUI;002ro52U44e~JJA002ovPDHLkV1l;_q@Mr) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/link_add.png b/media/img/icons/silk/link_add.png new file mode 100755 index 0000000000000000000000000000000000000000..00be352c5783c0f009db7286bb4ac86f306634db GIT binary patch literal 570 zcmV-A0>%A_P)O?!~#Vdl*A~_RMaJeHZc^62(la$ zXNk(f!J;Kx`k;bWQJvnEklKv4E*yUMoqNvtUEX^F0D`|j@Q(r{5=p1oY+msBe7DJD z5^lHq%4)R^@aW?E8gVou4QYP_h{fV|l}fb|4u?^%*HNq0P$(4O@pvv=E?2Qytv(Z1 zDwRMQ(vqhcAQFj2>~{NorBb;y7z}$#rSi>WG9eO)!0B{?dg5r7N~NwyOP=o=ta!a% zE*g!p8jYqyDwRIw^LdoZWfY4=WHK2LM>EopmORY>hGAw|mc5I|PN#3O*(?%?1Z*}N91cgL4{iEji;aEEtZ88I z%HD_Pm~b;dC=|BwEA}fCic6!>_++tII36#0y?%nn(Cp&Gi)U*JyQeW6UFQ%wFhd_= zFktBpwDhgV{lnb$$vU>rBA^N!nh-iRQgVr8yH8%}^ zZn9za?@#`2175f^8t6qZXKdU|Cq1|P4!%N`c|6eCU*|IMpHVxOJgs;lasU7T07*qo IM6N<$g1>>Oks2`oIPl8XEc) z7Z-oHdiCnNh=_=7-rnASQd3j^Pnt9-52PSJKmR|74-yB-uUN6-AxJ$)AIt?^O-)VT zCr_T74pjKb-rk;L@7}!}=gytu04X?h=n%)+wQD(m;%Y$oCm?ko^&ov<19WwDGt<-4 z-%p!1tt2QYXs4s2<1aTixBr2Gf&W1YfV4h{4-yB-gVcf4gYO zty=YV-MV%Er%#{$zp$_nY(Pat1(**K2g!rffz*TafelboQ)31?&%n#e>wZc~%9rfy z?C(JQGdw&z4x}IUyRt?v{0wJ6^R0W@A*Z8= z&I?WjSJx&^y7yBz?2M*SZ18QRLbAs(#0rsh%4F{kwbCf;j=k00000NkvXXu0mjf-HSTy literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/link_delete.png b/media/img/icons/silk/link_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..f66e2974efabf02bc8537899e25594978da8eadf GIT binary patch literal 600 zcmV-e0;m0nP)PbXFR5;7s zQbA~vVHh@k7qp$ajUZx&gbqS_iCr|e_8-)LqL<%OF#5$(JDAmU3Z>uMWC-Hc^m(S-Bi9|X+pYImKESqKGXh#~-{uQ9t>n~cZ)~J`?O(xSR&-1X`?Ps8wINFhhwB(rt++ar#gb&GNvR^C~zm>~np74t45QQ4l*wv8+v6+o86(g*3M%S_5fp9@M!XJD7zzCD0++nw0<1$_~** zQs@V3kR!#AEgGBVrfuf78Z(%>=H@rs#?$wWE?sQUtrs46dEOr$UY?f*fc7t-{U-~m ztE=~RcXwac>-8C@(+Q16GbfYDDoN}o^903FHL8c|{bK=>$=u!4)YNY>nUG4QkVqup z_xqvMYQLz}>OedmU#GZWFbLP+Rm7eOF#TMQ@keY-*h<@J<>loU6bi+1G#bqa1Ojhk zW8S z`FuW%jg27?2*B-jL)lqDWTH0WI?f;+(O@edL_Q%ydh`mWo`?`0Y+D*N^XRl=WHdK7PZ^EItjpy} zdpsUE91h6ka@Y()WFjhT5h1M22tmxZVr8-yGmhG&kH&Ll+ef6+>AOhTWgHGCDHe-Y zdwO~Z5{0{Rrgiay^7n8%h`G!7@kxzoYu#$ZP;t7b54?Q`E>6Bt6t?mK5J?f%=i9JM zDw(#`=VJp^M~WKhVb@_%)Z2@R*Z1&kqy=lqR;0&o;IozWJ!Y&b`KuFMx9fqGS;QV( z!f@|FyuaT7zwXpR*id-;a3jFMu%@C#&gw_4uqA~^s6002ovPDHLkV1m3RKd%4) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/link_error.png b/media/img/icons/silk/link_error.png new file mode 100755 index 0000000000000000000000000000000000000000..ab694b1ac4d7f1b68677912cd1ec0f99018d0dcf GIT binary patch literal 698 zcmV;r0!96aP)8OAT^C6!q-hsL7qc;vnlp1n2-QX8u+%$OL$pGNEQCpFO@jD}SYymh zC~6e=WjY5HWgF#|xz8nyvQ6D!+wouYbj|`RMY{T^^4I*=!bqARrQn zz;3svtyXI^nM{^gE*6V{X_%IIY5=KJddzG#FD4R+f>x^?Q7V-`+S}XV^?G5kSm5qD zkMINS&kH(jXkcIL;VAliKD}D4-Yl2Pmw28>JRZkrG=#)cJ@TmlCLf*h zFb&f(PYocENG|I2`i0)!-j24mwr5REO%;Vg0gXn3TU{qGKh=lo@-!v_n(8oT^Dr&* z)ByE#sZ^?|o}QkC!NI|NFc^g2?}x)?!g$~$O7o9V`szkOc!KcVGnM0N)ko&30mNeQ zCfasGOH0d)PN!Qo8jVGh$yg5GQIF-4LnwW5AbNctD)}MAxn}g+51E<5Hw*OPik~~M@=5zUQfKKX zH;{>VG3Jt8-4O8hw%nMBx>3&hSF5k2PSX)&t2;>>K)yXhv`g|mV&AiST>x!wmgEGK z3p`45^bO_$YhoDHr4N{W*@x#=abR5lZ7&z=ZXl!1y@XaGv=Vu7t)7Ih>>|`ec*{=0 gckUpe%iBkP0k>nXO;Ji58vp+WKzZym|j?YHA+l_EP7bFIf1E~S2MKQq0 z$cW9y$ER!J#EJi3ym;~d?%lip4<0=Dzp=6LUUhZ#p_?~v{s4&`IdbGbNDW9WNDtfq zLqkKq;^N{DSFc`u7ZDM$&D-1iPikuF|4EZ3{jaR7{10M-#6WT@R;+jkQVY_9?1HYQ zrl#+cCr?iI_xIVNnQjsGCEAU$vcG=ad^ z*Y|pFZ}0n6t5&^Tw{G44{H3=4a~E0sPhVj2KWVPv|C;ro|5u%!_`hVe|9{s$iGP~f z8d`7z)YR0NfzCGY^76W$l9KWzJ3IS(_G0t@8_rGpzxM1Du*MaqC;XqVr{w>_<6ZwV zmb(2nZD;?j+sw#_Gk%kS{sn37+m-*nb4T|7)@^D38#X8YZ`zvvf5xHa|1k?}{;SqA z{KRQM^lZ)lD^E@Mzw|`!|Aoi8{?9ww0W>7*|MWvm|I?Ow{8y}HxGr7Ez=_j4b?z7aYu(NNH*UVw|7iys{wFPV`!8S1a8a_7ft{qJtliA`I)0(^fB9;LGeFI3 pB$Rr>${ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lock.png b/media/img/icons/silk/lock.png new file mode 100755 index 0000000000000000000000000000000000000000..2ebc4f6f9663e32cad77d67ef93ab8843dfea3c0 GIT binary patch literal 749 zcmVe|tv9>?g+k#9o0pTxd@;_sq{kwlU;^VvV*?BV8P@}BoaZTQUROpWV6|-M`|^n&)=+8tHo3*<<$NU zU`%V~ZF;?hBSYsjJ6%JzV}E(D{pOLqQklliUf9um_tGl-wty`y*p?eYNW56P>X@1s zZs7KrRZKtmV7Lqj^5Fgr7_`LjhdJK@ltF&O`j7?*NUM$KvmNGz)3WjM?V$vHlPT0AFyF?kLE<#HZabCSW3-oa*6;Z zrXD`Ulwd<^2glP%1Y1Kc1Ij%DU^=ME(jKf6APNlA$Uu;J4bVilQHSWX5uJ$9Zsp4M z0%!@LvyTxz=Z6stxlichODIY+yNGt%RM;m`>H4LOKLFs9Y%b5aUN|2|{0Zw|<_~i} fmXz*V19AKYaD# zqJ;$!L?LRd}e49w&t(~$j)WaBu0@9%c*o7Cy&!r|R_?)koZzV9A^F^1ALJUm>k z>-uF))7mI1DM0aqVnS8b!JeL;<rL6_6GkUAaFSyzVmv$^|CA@kw_qu$?)4DNfMk+r%@LUhi56*+}GEa@Z5ADr7_&ySe%yVMuuAZa>R&dhFhLUY|yB)Du3cf5wWt^UJH@SAv{y6^y!r3!*jPK9NF%|U4$$flqzeSn<%3|-B_Ru=%13nc{9B6NO} zjGv)5q;nk{P3=fL9VC1WHg)*%WHN^Frs(C$?Nu9cAlhtC5?qmKw=Y&mrvUEPQAJ(WZm`O>-V zqM`fJ!CUawH1n;sC_$0Q1Dy=w9)w`Bucsq2QZiFsrP)|OXnq{;=f`lxe+O5eorcw9 z;n4gl0heH@Jqz1r69luR_=F<8gs$P_*9~|v^&IWZ`|x=BCd~BuW5H1lygsnSYr-p8LY@h*(vx=xS@d5|3BLf^$(>I_TlFFU0000F?<1APhrPm6@3t=I7^Y-uqpp zyJtoLmzlB>Ksqs;7m*vqVzEDpBBrOOsnu$T2xi7Wx^eZ$)Yx5M190O1xfOtj40m^T zZ+FfyJ3ITvdw*C&{t*#=y?1fAtG+M}yaG05rfm5;fcJi1E|+6&ZVu<%iII_!w*bwf z!ExXcaP`X2_~m>)e|zElc^exWJGdIKJ`6*u)hgcmzZ0H50KZ?@d-hhayxi>U?4(|= zKl(=EyZe9G!?{5|e##;uoc!@IDRY>3%*XAVaP8S1RF#cwiyYtln8DLegE)a1zx;fN zfRG@SCEyrn0O>ZsKpf($oExfvIsjf@fAH0Ti3be7@E7UKI)We%+5*`Em_q#%vh<3m z@d5R9vi&1i)Jy=p2Q`q0O8E(4xQ4>c{k*?3j_C$^4-8RxSte>M(%#pFnP4tT0vwoO z;wTL6AZ%R+fg(-e`9hXnA_~QRKG!msuY>6dAOtYyFcT2R;)`cg%8wxQ=x3$bXo5vl zW~QmkzKhpY#hgnda4x1wL}8$hRPF}|BewnaC)=EdrH^zLduUy1i4&-;21KBW`iM%o zOe)t7ZFxwyf_hl0&{+HzSF6(A+kv6++DU+!klAvI?A8=PYbJieumw~gYS7-OBCd(4 z#J;>w0HP*uZjQz-yvMxz(thPcB>q?;@m&Rg{{XvsrAoLsMFs!>002ovPDHLkV1mrW BXp#T` literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lock_delete.png b/media/img/icons/silk/lock_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..ecb50a93fd53c590b260ce9bbf88341386f7b0cf GIT binary patch literal 815 zcmV+~1JL}5P)5&PNmf`5mIF?X(>Nr_OzAky>%LC^xjHsh2Y&83|M~y#eBXD@6&Pcv9797xHKu7^ zH4LMjVgm&zeo~C-x<1g;)AOscUZ?~Jg+e>2`EEl)gWv6TLli~O8pUD}sZnrfJSVp4c1)t9s z&@>IvXmlo<%_=mv@!<2Rsi`>*OzZ+AC0Op0%M(hryId~BVlhzD(O@u`sF0fI@9*zO zBoYxtQLNhk0n~HNbQ+(>@z>xv&W_g*+xj&g%)UCq#$v6Q&p0j3$J)jrF%8Vn!SvN{fuF<+_4FOc_Bsec4HZ@aP7kF`AfJJ;^aX0+8%#Y9r#}d$mMQ>Y|L@r?0{8Z$n|?5h5=~G1^ge$$AHj+-1zLv@U!O6N`8BLUfo#6Qx24@sY;} z9O#B4_6)+{Nw{Y2L20T56WC?B48XNAlHl2@KyuX*fQsf*=h3X`cyeMGj!k~x@RikT zm9P6CnS!zcpppkB8N@x9B!G2*gN&4Il-D7-?Z}58qWZx_V)Pw(>d7uiFeJ>a0&ofT z#aB_TViqb@}g8~$BiXmB+@3yzMZ{VN7WC4D^zmAgoT`rf$ZnuMFS=o7-ne@ z=zLdKSKvPYCEIB8v)Ajb5=9ZwXcRop>!*X`I5?e7XDfBVd{17oh+bK*PKiy_4nC-jk;Xt zueW*fk~5~DKa!!CX?1tRMiZ} zo>R!oKY_5qVCh>5Qd(R|3mZo{kck&B90vmyjLAatX+UMjooz_PhLK4G;PAF0J@*J~ zzKlFu1yQha_(W5=5ir=J99ke8o=Gnas2Yy`-|!W=1KRFoY&N68Pt=E)G(Jy;nW zMVep2;f_h8ovdCaRJsd_h{VJw62TEHL?*Es&!DWP72-lKO!*oz>lKI%e1h}jHK57nhq2wufGe;=lf)bV^ltWZi);*ZOL}(uO9zQ_izDih2&1l;1BOiW3;*%(J zQ~4yykev(AC75^LfTh9&e~Z~@A=yq~k|qjJgd{16#M}AB@4vbhi=h?^Ed(L}K&wJD|>xJihJn!@Tp5O2HzLI5G*jhtFLq5|q zdpPGE6hR75tWt~{hVihwyE~5^OWFb$92{(==8@{^>O+3N9}b5D^bbwbkjZ4QM2mnf z_4f8o{{ukHKHB_LS65fh7(+UpMxjs;(;>?;!r`!8oJ=McDAy8?$4grP4)LJm?MNh2 zuj@MI=H?bvRgKcOON98Iot<3~z{IYeq{Ox}ki~4dlrZm5*%LAIDh ze^&wvPv8BKASQ`IhAmtV7%euqo82;HJ7LTmQ(G@Ncf0xg}; z3}!bgKj)#F1_A2Osb;;bqILgCmM>%|B_gF*g;{RgO- z+hE^v%Lw|aFqIy|SZeeOSxe3ofCnT5KKEmO4ItiK#(#uOKPCdB_$>BjJ`xS|T6UQF$ z^2RB!G8RXAV0&R-9DOs4-*38M$U9ZMTziF)0^Jw^yt#e>9x2Gxz6Fgs00000NkvXX Hu0mjf94>kU literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lock_open.png b/media/img/icons/silk/lock_open.png new file mode 100755 index 0000000000000000000000000000000000000000..a471765ff1432092e7113e56b42f2798968b443f GIT binary patch literal 727 zcmV;|0x127P)rLKlJyH=-*k3W|aiVYC~e{STzB+=%NyKm^5w z3m4+bm8cXnzG}0Gw2c^Ol0K$0_ity0#@^}dhsl97GUJu9lkxh`Okt_0|=(|h`!tol*)tahk*i! zgS8GLCq{|Gd7N1T=a4u`0gM4BU}M^~w|L$b3WtyL{rO$Q?PPfL6z$J7;&2In&vryC zqT@6`g9u_Zg@Xt1vO7RIY-D-g8eo{1!oIz%ujUZ52IBq#JOI%e5ertc^kIf}?KOA? zx9*6-2qdQcN5WDRs@&WP6I?Nxm{No*quRTbIBKa{opLb zA%3`w)e+)sGB0CNfHFvOi&e6QxioJs_E&O>(i(H5HPdeu45xa7-3Gh;%9Wh4nr0hffOdNC-?LD$p>QUytZsFT-LsVDm- zkkSuK6Kx&cjl{J`-nH0(5h`dBM1#Fu?T7^`3P5)5#Nmi=+?@y~3iOBukAMi~N&`d$ z;nBbdW?w(fN{^ns%ib@_e0kqddisx3UCQcxgClhAKEkK3ZBvskK4+6J=duqo6B*0Z z`QiTU4DIirW#!`(Ko${HDwSbi45$P5fJ;R`n&p9uvCp3Qf^#rZhr`|b(6_bjBcSYSnl@17o0 z)pF+)RYBDvVi7U3XstoS#P(n4-TRk-s+O?SZ#U-- z)uGNa_H`=zYUj&~Kt|x~lMf81CQ;)Mqo`42MrV0VSw3O~Bc64YMQmPO#FhK~#Q+g& zXE?Du&d;pTaAb>yqyOehmQ`|mY#Y(V0i&PCsjeu(8q2JJvj#Qku+h#oIx!g|#bS-c ziX%BTMcU{e0b{07G2|4MWE_{!c_(24iWf`S(m^_V9x;_3r|*R!TCfs0LU3^RChxt& zIfwTSAENUNhk1oQi}g9Zn{Y$;-|Kn4Z@$Iqxp_zk5y&5xNH2$q6FF-#i1j9?bWg>zm73!<7nwNua&|TB_w2 XJTQQHJy`Yt00000NkvXXu0mjf949vz literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lorry_delete.png b/media/img/icons/silk/lorry_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..66217f52624e760da3f2d580396f1c90a259cb66 GIT binary patch literal 683 zcmV;c0#yBpP)%;e;!*Jc25-JmCI%BTIqI9dck*$7$fCUN^nZ8d@iAQQ zX#k5NvAFI%c=`S=fDFO4kr~92YhWuN%V5i(G-vU_sv?jhSW?u7f;buu;{Nk@r2r6c zE{)#Zli0|a^(8y7FZ~ZLEDPa6q7fwp2D1yxI8YOWvkqATaTaV-{-Dba3fYX2 zBf*!%I#QOm2&~-%lSOWEdB$<_ofq;iz)*5Hw)PtC_Em(FaoExdw5FQ?oP#-Y{D`Uw zLb(R&&?ca>q35f9OhXM3TIwnUu_xGXn(-J(%EPua zT=d_40N{xU=U0S*6PLF>(2YuXVrtEH!W3x_%(Zl%uPOR5f^=#D8vxc;J;dUe-&U9k zOUs8ozn!3;n*~_)c42wRV0zxL0uRl0;~eeYd*#!eLm_g8C7!sOgbzQEt?#Ao=_5Tn^=QTAA5Q0H44#5pbGC^d5$hc_@ z1iISyrOiM_;pCM388t6*xtEU8Qgn%oEH_%6H*x=JA6=nL4a!wF&J5f-&}Nq@=9M-5 zw^r8Qiz`Pf!MH#qHgCJzIdX%JQv{b^P9PMW1JgJRjUo_?B(wI1%D&=a`4H_(u&JmJ z6-6%GelobqEJ4?kIK6rRadm1bWt~#gtn>xfk?j_66*nR}+l{GdFG|MElT&lkSRhfh{ zHwWz33*>J;hWMvf_->SdL`)I156nQkX{An33x#aslBIdL&W-&?&H;-740k+7^{Gox zV?%h{5rjHvC-)OjpZ0uEK1TJhYeO~GZrO`aOi8S-Y{0hdm8hxN4W}y(o(zMS!RFtg zxb^~?s}_)@eR=)oQ$FtZ```L}zFu0N?Cb3r+*vR^ms3~{9v>y&1ggBH;93+8$2dGY zyl8347?qAny3Z77t38|RIe0IBVJK^*fBipOW+}dn1u@=r?U_B@t22_CBk;hR5cKLyQ7s6|!W3KN{|4Nj Vo8&VeC8+=a002ovPDHLkV1kBFM!o<5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lorry_flatbed.png b/media/img/icons/silk/lorry_flatbed.png new file mode 100755 index 0000000000000000000000000000000000000000..8b20f55034322d068b664b01e5a99098b64f5541 GIT binary patch literal 450 zcmV;z0X_bSP)|Gy8kTQ_kj z#DMGb3pZSzo%8?PwABA6CdB+d)D`@HSCi-e&DHk**OZw2Uy`Hse_om*$jSeY-gx_e z_MV6T_g{JaUn6<}!~l@yXXjVL@uQOq|KHs|`TxzWt^cpCuYqHblMh^Z^MCK9*Z+52 zeDz-?Y!1YLcwgK9vEEkyqdm?4N4lB(4|6g2AL69@KgeG5e}Jvpe?M#G|2~$A|Fx`x z{%cwV{@1Vw_^)p6|6k3_4-p2Mnws}gQd0isE4dEz%xDk41~1Rl9;{Q|l4}F|eS8iylz4ix#b- z2uqU?YoWCXGkb`pw@3`F?Edff&CJ*0s+)=e2ZqC$#o^2uCJG@im&#&}mD7Lg^oXjK znklM+sz<~l;%3o%hlp!C(A2s2Hvv^GE!?(`5R{-sFu_a-Dg^bI3PFVz_ipa_qXQ9- znUJ1L5>znpnEDKg!^E**@p7)^wQ%M9lc1ugsEU`9U6=M>&k=DHRUiE4uG-l_WV+R*P#2>v#(a#4 zCl<$wf+|`&chd82bXFk8xfm74{Jf$};*v@J>bEvRw#S*^Ci*GOUrklQ$TRAAyBfB<)5DYUT1S3pi>G1@+YmTA8P*aS+=gAQg3k!Mn;W52KPl+|XB{bNz8ymlY4I5ZeT<8K)pAK?919}}r@hQ7XM!^$13DXAltFdl^vsIIQw z4zvI%;0AE2_6%DOtv`X7BBp3CK1~jjzo?j(AG>+<`r%inG(>-Uro&e&EOriOj#wO( z1vSx@iaqoUchf%5_Sp#y$>z`({qHxfYs#9cE341#9B3bPMnkeWyaD)cfr`dxN-aA# hWm@s2ISkIse*qhAp}qdd4(I>?002ovPDHLkV1g_sL3#iH literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/lorry_link.png b/media/img/icons/silk/lorry_link.png new file mode 100755 index 0000000000000000000000000000000000000000..5e6663e5c4abc40cc076fe45ee627e332d8e4412 GIT binary patch literal 775 zcmV+i1Ni)jP) zss$BMK`ojTfnEp>@j@`Sskt1w&-de;({q-MqM!?3czDip&iQ>j=RHReLSQFf4R-jc z^N+418Do1nXJE{vFkqT8^lCN?Io98tycs+37l8z~gd-4wK`;)%O-M39WP-?eC7YOe zK6(6~4x|bvkhYnwY~-?*K$%HhhSl!HMB{BdxbdF0kW-Vq8s_Er-TsHFwCD*A{I^#Y zdxvZ14uNrj}_2nYw(>XAm!_-NE!qix`-tV)46rq~}2mKCowL5U{ z@n>hH1;fyA(H%#zW@+29K^FC@eOd2n_G2V@81@DQORHG~S{*QS162Y}r_A)yHqfX7 zWft4#ApwTTkx1rIB3D%cT`yOFb&a0NiI+=dB$o0>6&vAd@nSW-h$EH~6up4hvq^Yc zn(<|31Ffoto}M0?IvM{4@o|Fw1P2!!tj>XB{bw+A;VcS;0+Pvnc>U@Hx@xC!YG4=* z_4Qa;SwX#Z8gIYbuPgE@2ZO=Ia5&svEEeH*yT$q8Vdc))7`C>ygwN+wLZMIvl*wd} zPN!kF+c7#iifA;t`RghVO-)UGnwy*Z>U26yIWaps`yrptmj(w1(cRsRNF;*3zCPq~ zIVRWSo~EWIt11VHL?TYr^UL zR(^kt)XIU5j*h3jy}f(d+S<6Ps?N2wH7qPFz-qO^@At#w@zA?4HK_Ee zZ1H-%AySM|?`{HF?yH002ovPDHLk FV1k}6a9;ob literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/magifier_zoom_out.png b/media/img/icons/silk/magifier_zoom_out.png new file mode 100755 index 0000000000000000000000000000000000000000..81f28199ac1c979f440f0586e6e0da48672e74a4 GIT binary patch literal 657 zcmV;C0&e|@P)8VI0S0!CoiyA}k0DS`b78y(oGU6a>AkUK9~n*^7|=kr7cwRFWv6%Z}9bXJxHq zv!bQ7t!|lawm;5>vpILy?iOC&HfG!Hc8BBJ-HKqfMb?WCJa0aq=l6SfssL2|4?ho1 zYF_hZS|)5^i5(2(3eSVtLjTwt+viCU4@P*+9|NQ!zmCYHkC8wnWH2cSOj5$smpmL3 zY1}4f$SympsTgoXWWvkj!KP${W<>az96Yfc0&EV^Sqav$1oSUxqGI6Xq{vddRFu7n z`2LdsHzi;=Dtr$y0$QI$*opyl-1%;k%_tFkSWDaJm;MHp-}I<6Z; z`=uSavTxAsh-+>P#z@O32VYD;@Uw_<1$Q)qo>w&5O)gAWuE2V33*Ucwqps{ny7nxp zX|aTf%a1~AQ*W?v_D-PC*yD@0=#7-ucnX}S5B~d&FdbXR-#fBe_gkP615I1CPtR;N z4-*FwcN*ZjSr5aZ75rZZR34vLukCGEW45>LLezQ{#QvpNP(bBYeXX{uZkgF|xEA`o r)y)eIsC4dIvZ!Ov;+nFL_^*5eZM*&99gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3FJNMp+(Bt!=q9U!ZZOlw$c zuAy5i+nTd|<_>NivLu&tYWf+obh7aHN%Hi45`pBR)x`tA#^U98gM4FFC6h~&)aWQw>e5Y84Gj%C?Fa5wL3#v12nvm3<6OafjJt}U((Qj zn8!nMmXr-qoCO7XcZRS8(x9RlIA>F^1(GoPldw}sc)rpQ>IL9yYf!7MN);5mno3dL zFr9-f3^@5I0h2d@QBNW#I`RB4IwvonO1T#W1?;?jrZNjp_!1ar;E|a)8g&BH^;Scq zt%uAgf}pb+yKn5ouFDnCJb}hGpY=s(m>77B`PIn4hUqw48S;@<+#YViwZYT4_>vEC z?=frJc<3Fn+HA3jXTwUklhgJ-dYkmNL^YBTW!uzZM O0000v4+f|_@RWw>5)RM`NuV&uI^xiO$D8`6BxXk0tJ?EWs<_-8>2;-) zWKcp3o`T%Jbv8DZ00H?+2@8dyT21gt$m6G*2l$?iC6Iztstut4r2wd-3P8bM5!|^x z6MJ9rp47dzLZAW(K~IDt2)_Q5!O~ibDk+Onsseb-MV?(yFmrC!xqLisbKh@i`-x=iJSj(h!<$+YCJC zMh+7C(a}Ik*keF=COGS#EATV${Oe*7f!k~yXly>8nc$8|D~`n~7tbU)p80iOW6x*> zfhd3a=HED-HQ7{p(#WSK4HSf6DS~k8V+{yoc_aZyUS8kc%l3kxbZR=z9LMhG;Wrw3 z8^CWiKHr1Xmw!h<2Y=(jgSQm?7a{$E6f%b+jDrMKM)1nw&G3%||GEwVKPFC*l;udx P00000NkvXXu0mjfxkDO? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/map.png b/media/img/icons/silk/map.png new file mode 100755 index 0000000000000000000000000000000000000000..f90ef25ec7f1cb0fdae38d9fe2d9edeee9928ef1 GIT binary patch literal 804 zcmV+<1Ka$GP)mbpQb1@7I~O+ue5CWtZi#AZox@gcwb{Xkx^Rf;Ty8yn6DWhJV4kC*wg94<7Vt zlteKm5+jKLV^qM1yt2HO4YZw^&a^Wfzb_m+@y40e_0^+M6ajz$03Zl}fU=sqfA9W} z@#^~O(a%3QB{YI^J_A4y)M^1_vjjn1H`Mc5t@6>y50A!C6seTL>`UqQ7p$DgY@K|> zQm^as;HM{#Qwj<3}(>R-AM4&+cd0t49%y2X`UaCBJg8YmB)K#uA{Z>9n zOp8>WCg#&r06`o8oz6gaIn`fY2FR)ssCr@3rc|5f%`bIJO$zbt__PK3gH51Sff`H}0ZWac9&q~*( zO@qNscV0VSU%X#sYO9)Qx4M=(eR(m}UFhondELHSnO2hr&mMO3 zv6gmw!P2y#u0c!?LPO88NyxOTj>XWm>*77F&55fo9Z?)iynObdfA;SdwVRl$W~G3* zEGt!2+1T-%ja32&!XdoMS_mM#IQK#{6D_nvjYu`GlvO3XdE)qYJJ;7%4Eq2Gf?M=uT9%H^ z8mm>^ym`Tm?6?O@iCV4h@k*i;m#t2+H|C_oG_K0ZUyH!)t9 zyt~8Xrz-|8Z%~=;n(eJ9SD&=DQc@l%Yqok=B@hunr_+_CEy-%4IhOnPSvp_*rN}#? z-f5k7s@KhQvedAb2_T3AV03gswVoNT*FpKMEk-{$FV3H`v2jgjv~5%Mipt26Ui+?6 z^tOOF0GdfAO}ohay70)oeq{YKx#v#Yv~V!Xh2@6AiwZM}BW3p*+TVj&2qPds6D z&~>@ha<^ADH96(czF^dCwVE49N@+h}!!>jVp_u}(=ED!IB0$PL2Qr=e?sTvy{x27_t zx~6K&d}8zc1xwkAa;SP^`+MNXzT=*r*{LuT5rhz_sjG&XNnj=^34AL7flM9_nKD# O0000rXG#NL7kjUIN;Xf(FQ!U7F;#?Ic#SV*+6vCtSr zB4QNKU_yitIYM&0)PsZLfW4iWo!Q;F@%zI3(O1sQ%*`CER;vIY000OAAYfRmd-&kt zFVW20%)!q;IU!Vn;rajoK~O3MkPc!5Wm!?Kmr8~AkH2>?s#dECLt*fhlksHmlF(cJx=(n%j-lt7;=P-L#K20u=(tvRo3UI%^%>@xtT1WMAG?7MV)_ zq^uX~=ZP$dt@jfF1W^Dq8k3r>M7z}jwKsNZ96K*6p0Z`;s;tqowRuH-WJSMsTeb40 zfG7aEokSexNL*Z6_RpYVWchn(3)&%ZGwPCx`Bwy=Sy@-~QJ>P~Y{O-j$y$oIhjtlcoxkW$DjUSh9EwYSUC5sZBq?VwWhl=bbF<0 zadMyV>e0hLZkU^Wxmt@51V8`)JfGaM{q98*St1@Cv)JD2>~Pbm{{g6=P22q_L-GIs N002ovPDHLkV1gmUl12ak literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/map_edit.png b/media/img/icons/silk/map_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..93d4d7e5ff6c719515b90f39169103a252592951 GIT binary patch literal 876 zcmV-y1C#uTP)<~|mI`fywX|v|Ht`@Blg5Km<3)}{Z-f&EHT($e=$1y4^7g5>CQYRjDG3sv zr}oVZU6(`3r}omBbGUo=I&-x%+%Nm&axM=yeUxcYsYSeTL}Qr>gB`xVi9c#n2?D}P zw+VtZf*?Q|Gc@W|>S2{;J)m9>NTM1dEkH1ZZJt*I9kc6XH@x!;nb&$K_3b7bFHld0 z$>np{%D}X2f-pj)0SG4l5PaV!2&z!Z5_KgwpUuN_Ep&L5xN(@UYEW!m;Xvgg%6XdF zg)8iLJ22Vdc_q*>dC$c^F-F(>n= zXp5o-wID=9Q|(MqPe62T5&e3BeEkf=eZx5YhuB(}!L*Y zZPu|tvTt5PRTZPXLwG|k(pdWxdzbLX>>ZMp;*+@;L)cdJYXm_9zf$9;)d!qkSmNfv zEwZMIw{ME*{s)Nl2+PUQ5iVm-Oi_sy1|kUH=6j(d&uo~m+_WfGA2D`l9Pja0iB{jk zuwt5(LCW7vbI&MZ6bEQC`J2|7>6ImBR`1|AIjnp0j5vdoo}8lj;6s$HiTnZ9zrVqc z`$j2ub}(gUXfp)}lN#kTCSyC;iz|$0M@U*F)^5E^SIH*Y+QY{6pSkhW1lsGOv)KTx zX){0&G05TKNDga$nX$vi$*f%C_X|HT`}Gz#zq*RMxEsUl#KywLB8?LSFq0%DO;h^2 z$LTM?=O3M;`P-Ka9e5tUyvfR~dG?t&}89kynmRT`ZP*UQ(6` z2$k6{7#}S1?C2onmN30uAk-P!gdGA&l2U$HzVsJ$Njv@DAMu|600000;GBGqrEGw;Tan07PX6DVCH*elYzhBsU=<(Atb2GcE)hYl8004pj2*~on z?Z0oIsm;vI?0)<8cZ5oi6(axyL8%l#Jcc44urK8oFbZfPvTC3~!6G!%z>b0s0K&P{+vu#W_io~a`h@zXK zC=!O33<^$5v$zuQxtBw2-c%}R$1S$lOBt!iu*6DWiCUXC7B{^|j znI|ggXHNdO-trP-k0nqF8MbQv_-{1JlsVf(hkEGJ?evxLG4bxj~o4;Q#>3iv`_q_Jh zegQQh2$-Cj*Ug50h+}`Gby<;mbo&u`S;&iAp|sptvSZT&qIBTd5BAs*o>qghES+Ea z-K85pYc^YwB#~sPyeurP{%TZYvSMVEk93DUJ2yWl8pX~I-c<{Tv%ZylWPGe?qS2NN zQ%RP{^2{BR3$h}YmxY_1KTS91U0nLc<>f2x?H*7g2%(~7(jdgf^M*B{Db5nd&%Gio zQc0G&dv?2BcRl99;@8eEp7ZL#6Fxrnsalrh@;tY3dZ&#u1Q6`n@+1f$fWyb`6Dkdt zmoIzc@P{@|Ey(gugnfse_OahVzBqrvaduZl%W_EUGX2~lqZrjZY@1Ab7<46l2Np>VpckHIA{JYE2^no-@h1mtO>BKaj zm`_vFX{stRAuJHY0Wch{(UkVSzrsg<>b|vV{ooUp${VKDG5t|rCu)h?9cf+&VTPau z1WA%e(}~CHwcUM{>DSk(7n=OMa+b;`nR1q!6`A=g7eWJKfZ=eRrZgH3B=0?A-zPh& zmk;W$&K#NVX!j1=+l{n4ZIgVCT>>!y6va%I=0a#pmTS>*reFN+r<12mn}y>3Rh>8% zRf+D>svt%X2f)(ONNYMIlWy-6$w#rLqpHMFW~Z zF)cKmF^B{5DzjCWx}BcorJ-Ur*W1&RB^N#1JZLl?D@Ec~@ZjH4oZWHv_sbwA2%)8K zU>b7Wddc3?a;~zhsFdD zgkyM>qalEm$--vTa`)1X?Q6d|a{PJE-u*^+^UNFHuC1@W7PVsp0T2KH5CEP0fs-q> bqL}#~;%Pj^C=){W00000NkvXXu0mjfH4Ss< literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_bronze_1.png b/media/img/icons/silk/medal_bronze_1.png new file mode 100755 index 0000000000000000000000000000000000000000..5f8a6d65d5b04eb7c08704bc3e13e4aa58d8236f GIT binary patch literal 640 zcmV-`0)PF9P)`P1v}r1H+ja=6UDkoHNeMI34Nf6XW_#WMcyp!BRqF zM29h3TEaejqW$r`J7sE&j8Vu&Kou$XB3Ou{$X^0cFcH*yRHPIVIa}8z2vp7qgot?$ zb8{r`QSV9KlZpa2Kab`EEQJ3!2yxXN?yWR#^=aL$L#;YIcSv3kKJSu3T>Ym&{r>&| zQt8JV4=?!oEGbnmDR7dL4fbhP-uB(SbTG=e(<<1TJGa5T3k%O@d}yHgFQhoZVu48j zSEbQ(OnrUXCEA1R+3xoF93<(;wMR2vTBN*33MFVUphb@Kev%*cC}x*u^f-0Kl4vT6 zv3&&{9G9R3kcdW)NkHQO`F+ShrogAg@f@g4t5vaBpc1eYQ7PdRh9bToc|nt#o=`?B zn@HlB^|P6VQ394crW5+W)Q(*2gQoM=#g}=A9#9Yuk)v@3DQ?z!d$?MLrf|-B`EsI? zwP^YuNMLi^!9dq)JFmN$%c*2dP{mUDCorShYSU)G0+SKqfs a@BaZ*f3CHDs;P1S0000gn_Py*^3f)*N7*a%wSf-Fz>>todNGT#B=>)M`EK;mZ{((hAK@ludS}2Hw zNSYLa2#Jj$$oi4RO*U`e%>A->o4D&H7Y>(U?m2TfbDf#txbDBZYd5Z3$5v+pVhT|i zK*7qmdZB^mYcKHT;d^(?i7`}647Ge%RKTi({tqGWFy%jiz%T$^ys}?={qOs|c<%NjP0!#+A{b|IoMO7ai(5OddrPx!Z`UzyvIl#oj^prg?wT`16pfYNmeVzk(01B`N2%T{ULhEt& z3tXH)C5%|lUlv43872P%9I!s_psy?O*0XlvQbb7!P=yJ>hyXJb%2gDr3F1#1ZPRFF zY!3h+JifdHMk~xO*0YI=5LTE^0ZK7(w2OFaqpj?g&#msPo+b%707*qoM6N<$g0NH=B>(^b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_bronze_3.png b/media/img/icons/silk/medal_bronze_3.png new file mode 100755 index 0000000000000000000000000000000000000000..ed3f43eb02ed2a663bc7e7d90ee1db42d66809b8 GIT binary patch literal 646 zcmV;10(t$3P)tEd$*D0XNa#H~{u@&`DHPzMJWk%F7xR2(`~hfa=lsOTVF#lJyH zOHm36RcKx8VuTuuO>XYJ-}&K?wj?Ha;Bc1jdC$xHoygreuA9%^`~6#2+5FzX#8EX= z4O2tJs7;?|Wo?^}D|ez}rbthjDrSy^BT%|irQ0HoiuNM?0w>#ocA*~lMDQPhLZ1Us z+DYKj=`tbLzP@s%LMzEo{jUREI{5No@!o|^E|&KgwKf2WSNOpcuXkoJDK7OgQE!O8 zR+~?>{5-yX_f#lNqFTTuC6a`=vroSJwlz-jxcKnX>VSa1xiJgTyL{$JHOtFb@*7Fp zct~-{AsV4P8Zox}qE7JJ@uQus{tQ$W?e}5KIouh%f;#G_z_YrsPQcSb7Xl*eO=pEv4mh2^1#ls~;X zkFb=_%vICUWmF8$5(o*U_CCe!jk-y+cy@Jfb*KP9x-dO!Embb5TU#BEo3hLTZ;4)MjYmq6dlVGHB7JO-msN z%Iqno2vOD`2re>_p`5{)x!%`#bpc5{(Fd&5_<9L0}=-hfsKtp zG6u;x1f>wAZ1(m-zIl&|@mB0pZ&ET3uh0fe{L0VfOY)AF@|54!6J0vqV7&&esb|S34l$G`gnC-%!Nr9`L zT?xYH7MH+67VWrH>4lrXc}QJBoz85S&LX0r=N9SaOWO&Eo`QUq=u+jVf9!Uh=SP&> zRWNr=`Qj=PC7YBX5+x{~f1C!DeddkS^i~fzOR~1hbsmd>+c_n*2$a-^aBZ;M3hZnS zZqvm&QQ*lPCQ8A2XvKaAr%(jyQ<)ka^@3VZ2P~g~!^#1V_w4jQ$heSYfn=cxxSo3v z%>82i?By`CoJKz0QB$~oI=^aVhhIMUcCTcjEdE4{Zb;t+*#NloYy;?GnP8hj4 z5W`d){ub#v{#Yw8NhQv=UkloAoq2+my+?EzEh=!tkn!bd+9WnYW>hH=fe-o(K#e)C z3`{LgVrZ;CAQ*bxkA>f}x^x2q(4o$OSW_gizPutkB}q|t_6^+V3@d4#S6cP=u>S~Dhet_ drXDUQ{{mj?xUREc-`xNJ002ovPDHLkV1i_JQQZIl literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_bronze_delete.png b/media/img/icons/silk/medal_bronze_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..d32aed727a274c60dbba1060637b25791ddd2ae3 GIT binary patch literal 730 zcmV<00ww*4P)W2cRU zi9*0MK@d@5KvX0|iTTn?&iCHko!zl`lS`uLz%sK7zlYxpJ4RIj2$wD@yZ0hPL#PNE z0?~WoQZ5}ojy@k|-HT_2RZ(0nR*Q6%FpA`N5!8A9j1_%2RrG=1I2`(3^cf>43sGA8f6YGn)P#lOSdW(u9`Z}^OM_pRMhMvD?5Osaj1oatF92z`Pa&d5Zu6`P$ z`eK}HdTL|nElvP;dk5vt(hxQOMB*FP8z(rbpT~((W8b+eGiHu|c{08+mxqNb?)bbN~PV M07*qoM6N<$f>3)(#Q*>R literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_gold_1.png b/media/img/icons/silk/medal_gold_1.png new file mode 100755 index 0000000000000000000000000000000000000000..87584dc95898d855855de134f117edbbe77c81ea GIT binary patch literal 629 zcmV-*0*d{KP)Z>d?i4qd16vfQzD=mMU~8 zN|%D0Lq)_&gV<4&f zpuMp&KaagxW8&>f()W}Zs$r8288yc4I!3Gr!gBs2b8q(cLfTTC=<7Ux4zR z_uJ;uHfQc0WBfcuN~$?YXrX%_DaIbQb-`^9dy@Vy#CNA=FkUkKsAi?(Xlz3KjY)=y zgCqe7v^VPwDY#O*W*ht7z$DZ;eXnNa6IlEOl4Ig}%259u(~PlmH)~;!`p6YD7PF;^ zOIX~))b-?ha+r3|@RM}>Bq3vVYH1nM9Mt#Z1`-F-1`EW3>L@@IEP@t;=>5}W zkO=d{;*dVjC`}73%))`_ZU8}%qC?1Ojsk*Pm)#ALq_jW2^hOJ$=~42XuXI|hj{wB6 z+}^z3P`3-EG0Y++y(B0}d6MW7K0SZc$TOBl`T$_(adJZfOOuzc*DBSskQf#-q-c?S z+hXhK>qefjIQPt+90~yV{2-YrTGXRsRwC8l!F6c5jCB!~=U#Lhs9%2ozn-rxJP9Nk P00000NkvXXu0mjf!(1iX literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_gold_2.png b/media/img/icons/silk/medal_gold_2.png new file mode 100755 index 0000000000000000000000000000000000000000..fa3a15dd67285af0074b69bb46f3df2860ee7dfc GIT binary patch literal 641 zcmV-{0)G98P)W=215y}4!=PhViQzKob6 zDm^JtBWDj)c(U-6#XIkkeoc;{h#{iZJuE6j)m|RR`#4;(3*aMW5JZL`U8!n!uM>6v zGQ*4DBYDQiX9@&~cnNq31c~IcMT#~~@ZtXsf{%0c_4l(^^Pee&bqeNCHJX~`mmcQr zCnfke_g}!XV;?qJ@nf?%b$gt#Qy3W%Z8I4fjBkJ8VEsY!@_Dy0T$A*>5SNckV=Qpu zVcD{iXskp0i%E)!gCqe7G*_!N@mwljv6UTvU=pevy<4{20WAIjX=CDgO3}_wOj8Oc zZ0^+cLNBD_!gl}eH0Mfl5DMzB-x$zrI#&` z$rNdCey7!7X#^mS`R3}qnz}8>7BGvL^qin1xe206`1D6^WEW2V9G~OIZ?Oe&$to bfco(d?EI=iCbwn$00000NkvXXu0mjfNkJU) literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_gold_3.png b/media/img/icons/silk/medal_gold_3.png new file mode 100755 index 0000000000000000000000000000000000000000..ef1b08b9203d3f24f734288042fe49c9a761330b GIT binary patch literal 634 zcmV-=0)_pFP)MJBXWuWa>}^3xbUnyTHuo)Wv)6?Z%}^KK!Vm-Vjkl z6cxpLr95$jg=edLTDTf?JUMzwMNl=oYa4y5i*Lz$L%j4_`T@JsoU}|m=3U?(K&CH& z7s96Fcwq>aN}t9L4bx~Qi2OH!%>DVcJbP{89Y+hF$p>{*jnIu!b!U0{_ODm z!0%uZViH3TfH)efm8zs%E?u{kz8#pj3gdT6mOG63EszM4xUCRPeq$PvKYgp@wy6y4 zKz&-yj-JE(Hl}e~Nn0_dP1OA*Gja?UQXaU1suV4g!!!a-+KRi97^DH_@F~SXfGC&; zO}o)M)1{jTOYrGFf1qA!=IWTaJ<;PX1Vz#&E}}LFaPg9Ct`G#-{`k`F=E!7*i8g-H ztg|!#keK<#>iw$5n~=?8<}qm}K?!mNd>rug<(q00GQaO5Z9EBP#4%Smf3tL;I01oS zK19+w;jeYppTDg}A+ysjY;j)z!1o8iR9dIvW6I(wx&-1TwK!x+g!$=Ltq1DVKeyPk U$*;Edh5!Hn07*qoM6N<$g5h`|PXGV_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_gold_add.png b/media/img/icons/silk/medal_gold_add.png new file mode 100755 index 0000000000000000000000000000000000000000..dcade0d8db1e2f08bea2b150c3a6cfe46f694726 GIT binary patch literal 733 zcmV<30wVp1P)D>BNLRMw2ieX^Xozu6uvH&7^%eKL znC@8!5S)MYO_U$9;ldIcHzWA?u7;;exbjDm+^x`csBd!to`_%uTlOK`rL{LNnI@bm zf~g=jLaYMM1FH#N7shSE@%#xH{^t$E>H=#o=OtK%nBQP)h*fn(xOf6_5xGsL^14i6 zUIb^7w#?$4h$$mZ)fLyJ5LdEUM)zrEP>k&f4ggpBa z@$x&AY7v!csq#B4UVqR%axHaW9f$#!{Ix!PyHz|ME%V+qa_Hb*TADZU?8DuqL+@W+ z-G64yGCz%Ai=s=2=sDI?-Tzc%_m*8)-?D4<5v-@#zvBSF=@g*VfSnq~^D^LKa4MBe z`$Tz?thaF^ykuG$HZ^8u`)Cw$#K?$i`ya)=nj)}7#}gp+(28>FZIBmg~+ zPcl037C`v`&7CrABD$s?UK~#*-r;4M@E5h<=hi}IB}dmUXXx!94FueK*GGdFF!1ID zK(9CbodG`I@b)Do3P#ap4b3_RRi&sR25zocS@{_R$AP6l1?U^PJy!Sw9~HhWDlkR3 P00000NkvXXu0mjf{{l-G literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_gold_delete.png b/media/img/icons/silk/medal_gold_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..84b06d5bfdeebc87c663962937c9ea0e8a956bb2 GIT binary patch literal 724 zcmV;_0xSKAP)HY|*JfU$_R_$b0#TLxJ>S10}f2<8B> zL81s68gNmBk0M+Y;j~6&GWcQ%iR1q`h|Lx9uiKM{ev&*o4mATEgXcI|+6M zaRtO_PzszO-`_UuVh*QI$jd+8K%8l#{&HFpD-rt(TnTZyq5?h|MSOwOmeXmIqwTL1 zyp5Z}CA$!tL%gmisz@Wgh&NLNwQDg2n*IiOR~G~c#FxNF73q07&1mm?M*AL8{E=Am zF`M`f+&<7{JIes)K`i)q-umoxry1@0K=HF-_pwVXYTQBTO;`Qf=h>^-{mDX5UcpU@ znMTAcuwK@{vwkxBj*$A)jkTs`7I76Pc*0eSDZY9H9qWl&6;rK>+{hR%lp!_y z8-Lzar<~!+vOOo$$-2#;1hEBNJk7wPUJ9RPs9)_!1cS_sS-y^h&S+_$0|0!vq4vhp zv{_A)v(%XgbdgD2prTM)VvGS_-qj_8gF|p19)P(nFwXL0DoD6AFDg=h=3|k~IRy4M=>;3cvvoB9REhVzD5)-R{V; ztdmly^tR#wN-bwHncQqP1H&-D!yBL=0vbct_24|8&*xB0dBa2m6-W(rcFFayI|V0O zEEbSVCIJ-`HaxIxJ569-41x#Zcj!lY8^JGF%`Wo1U#H_L;37nKHp1{6euL@ zHi90_Pfqi$V$fMU9*6OGOlo@@1UOf%-|vqUMS(;jvEl)BCi7%jhEAt5LW0`HJD}BS zwJuOeRnxSbs;WP)GgLE~OrYIvkMOoCjYi{kD*>%~y{;ii8M_qdX2@JDnqu@YYRzWz bO~ii#xW2)!uhIgp00000NkvXXu0mjf1kCtz literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_silver_2.png b/media/img/icons/silk/medal_silver_2.png new file mode 100755 index 0000000000000000000000000000000000000000..2e0fe75c904b499fbe379a709f324babc75d1aa9 GIT binary patch literal 600 zcmV-e0;m0nP)PbXFR5;6Z zQax)TQ53y1k)0Vo8W9xy1?kpenZ_pNZnOCdDS}O!KnerFBCud(uPZEUtA%Bng%uLr3#se)N9A-Q{mh)+9g~oN*B0mQ00Qh~4);e4nc&Zv^m=46z_kM79tp7M*R_ zo`9|{7z!AW1VcAbgo7Wj2sAg2EU>~fa@hM0P~i6O*r}alzQTvl1dZvy1OqQv!a~g9 z&(m|nc~{`(tGm0gnqy8Y&M(IN~Q9!mjPp}n#<)1^Z6V+&w~JiB#;1}f$O@_eyLO{pqpwe zL?o5T4RuB*uiXh!Y`I)QDwP6sP>yBb`+kDl1Kga+ zK;_+~eL2@OEpkZQLjnW3KP4@@s-Qi~vS2cqklR5_0Pj^F4u_6unvhH;_cEZ)6kZ~c zfNr=_g-)mA;NPk>o6YYB1!y!H4I4$O*riN= mhQh_78DfB_w_2?SmH!XLe!dG_KsR0h0000Ibg? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_silver_3.png b/media/img/icons/silk/medal_silver_3.png new file mode 100755 index 0000000000000000000000000000000000000000..e385b5467346b43eb436ef98bd9d4ee41d9fdb79 GIT binary patch literal 597 zcmV-b0;>IqP)tuPEh$A>RJ!n2QW;OG4eBo9Fd zsUQ)YODG>7!sWMLFt|LmbWIYBkV1fzA#nCs$TwfXH{e9dg;^3M*mh%LQ)Cox37-%o zA`0-(^BElFY+!2uAzNZvP3EJe%Kd(M`n$s6NbZ~!#Te$6bi+~VgbwLQV|dm zi3HfTt{Zgq^L^aiziI`L- zHPjiEY`YUQndf#Uznt%%8?*KPv+E6{a zmao^AWhsS}yNjSt^OMuMs|ngmr_(T*Oh|1%Mu2nG2ZO;ll}bS-lZkjhoyojpG6~&o zcZ>w}*gK$Tx7+8aq~4dX$*UcXbgFbNF+Y)(tt)yc6D_{WLbu$X|U)87#IOtLseCN zAB)8zG);1!h?Ep(ld#SvQ@z=p!6mC!s|W^zpb6spR>)?vR!>ilSS%KK5n42G&-tG@ zd@p{1tW}_B+e$?(KY96h=@A#PLC@nRw|X~TTF;^+e#1!o0*-bb$4q`Yw6Hw)aCqX# zA-)2QRo?lfo4dQ?GymzwJDfW)2urju7`*~ZFfe@PB1^yN63nyxnbL08R+QvlXcr`0 zJ$Z{axpV0SjvYSBLZ8@t=c&cT#Z8~jhd>~(O9Md=AgdMRH?o*YkMnO+ug9^r^_7=; zCMPE`Ffg#5%jM+N)z$OSXjJOx=zt_iTy?+SkBa<LMIcKp14eyUq)Kd1$B(lLIj2IeBs$f@-Hvy&}y1Tc%uLS002ov JPDHLkV1o5RML+-m literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/medal_silver_delete.png b/media/img/icons/silk/medal_silver_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..06cab467904647ac915ed1d80286709b793d616b GIT binary patch literal 714 zcmV;*0yX`KP)3-Bct`_@l$aK(2lbLuE;;m2Z0V_pBK-p-7ZLPg4qBv$^pvA|$i<6S zgP_nvvC$e3TM-XI4=sYRG{i*7kIioO$M|O5P1BY-@OU$`?|tuk-2$LiUKA+FAQmM43>-u6ko&In@1EQJ{VXr_*un z6NyBW*kq1~NI@yVL{v6~>TY#m9$2^AMIaCWF-RS0p-vdeUGzO)9_85NAF7^R(V&vUz{E7IxP^b z=HN-Yy?gY9?`=HAnVCyaw%5U)EWy9?43qJ3nKOQK#0A)({uhPP&g>5{ks389(J5fz z*8cqOoq}w$Ny(k_>gML=o}wu5`~3$rV2pu>!cafI04Pbn&G4J7RjUgvc9};#m&;uv zCM(HgG8zm9|GiF^MdRgTocOke)8q6{NL94!Ccf8X%h34p06?s4Hk%}n42hZ|3kh+l wr6$?N+@I2}QvbRjTP#kMe^SkKmx=vV@a|w4d?1G z{A&|1yzGF~TZ8KHTl_r*T3@s<=A;pUk6t|eFbv0%74?%+OlCdki0e@06yy3x1%Foo zZA8IP3kLWJ+!ohD8&$%-Xu;s38IP9-L1$fP3CnTSerf$50rgDty6Lr^*!3d)Z5bO| z-!b-f1e)3AZ8+nCGAzU8!LrRAB^VQ3$5hYdKYA07xLVs{S`MaSy~ut|Ll;xQn;C~< zTE=EZ#ZWme+JuKV0b`<5t|FFt=DRug$%=#6R&beFSRGVu!=XktGv>d{p(*$PrItbs zC%{@V&UayoG-zyPh^uwrJq0zft&6HKksgOU)PPF&4Gy0B97SX;1Yuth&KvTM@H8_D zI|j&k17#5C^Q5`mXHM}n5yer~ z1v@0vf}XSMShQ`!KZ;`Qm@#H#oe^ U8%xtYa{vGU07*qoM6N<$f()ing#Z8m literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/money_add.png b/media/img/icons/silk/money_add.png new file mode 100755 index 0000000000000000000000000000000000000000..588fa9d0783d81acbe040f068e8aae43809ba3ed GIT binary patch literal 784 zcmV+r1MmEaP);YQ5ff;UfFtdJ+!s8dg;Nft@+ebwU*P=rQI}aqD!2(VVNRw7ex>S5eQ5K(*jaK z1G#95tuVE@GHJzFl8GEO@ zUBT+8B4M3rhjLVcx?nZ?zX%$}<%!!fZ3w&@gn7z<+CUX5eHH9~A|RF%mT3z1!L{Oq z|IGmOPc#sC%fWLOv;Rs^|45oJPa6<;>&5-oPB<2=s2UPrDBcgvgbLSPToiWavv(v= zj*1heDLwoIte#LpIWB>H!Gg{OGwv>R!WZ{I8W!P-{lfYm1oDx(_4a42#I6^spO^4u zYXiNr-B66xCBbVRNWwx~>df8TR)S%&`H(Ck`f8kPVQN)Jl?>PvH6s3T6{@HV-ZeMG zAt6;pe%D3h*>d(U1cphiNJcER#dHk#-m-((7Bk8eEFYF6!ND4;jM#_As2#qAY)giM zA)uBFv1U9Z4eDL)VrsoJZ-SiIR*lOruX!HVAxt z=$~rQzv6<>e-r1eSr8JEbYUv|b2j|Gd@qcYAo&%QKK@~8xOOYN7C@P&1cVS-=8W&8 z)5AHI%$l^a{Tof8Yfyza3|JN9YS3kFh^Nruf!#Pv>X09#!80qvudQToI zax_Pv4HYrUbf;&M*Zdlyq8?7_RmbIN@>OSd8gKHrfy5_j`{&+3^FIJn1i+n#6MyFb O00001KIqEP)qMo*Mh*; zd8}=$qVq*NBx99ZaL^2)i;wdy8SB4|pz_rwh=wb^H~8+;vno7N8diH65LymE?h(Nf z?1o^7PdOv2^&Hsx^e9?D<*TU>kx2Cu_h`6l!AN2YXlDu*JA_-XlSesY;^R2V9i>Rq zo|4c4R3z0zEe6SgIu}~$Ss%=(AttfqZV~zd-KcPuK_yFsJ9{676QeQ2j)l1J08S{A zVi=MUfq@kC&(-J;Jw|aq2hFb<(KgpiU=!`uRGo~MB}cG2ScAxn1L3YhOy(clY)y|* zFeIab-Bb$dNYqnxbX?=CehVhOJaY~lnQ>SlFqA0(HwKW!}E}Fo%mEf!{6?`Hxd@KqPe-D2Bz6fHeeuNe%wsQ7YxymHtCsikX7kp6pGprGeQG`X(cypEhrPES70s86nE z=+h39P4A`Nz3e!lFE?TR12-O@%Ayg--Gz~qs0~LFllSw8ayxPkWg9O{lV6p*-Fc6* k_mmRH5EYwBM8Q=52dt34J8}-iLjV8(07*qoM6N<$f?4fv82|tP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/money_dollar.png b/media/img/icons/silk/money_dollar.png new file mode 100755 index 0000000000000000000000000000000000000000..59af163824c44be62dfbb06df9e71769563a33e1 GIT binary patch literal 630 zcmV-+0*U>JP)!DK;9Y=n` ztyZT|d*HtN4z^AtY@ehNsx1Av5@058(+4Yyzw@m$wtszqQ04yGbJhSW-PK+Sn9kpy z6c5&sKH5aCB||O zo)n!;Re(Lq>NlD(Y>~Mm^&rNjF{+zqQYLCFW%O8ObHbFoO{oHG8H;vpFN|zULKkF} znE;czLyw9^s&5nLicTfoh(h`)V!g47a4i6T`6XNhM{_uCpf3fOH)+aUm{Pd%0$HCQ zD`b=e=_a}-!2e?bhS(t8*Bx}jxG|(Bs-8zXGwpDVhfpKF$YwKX2WZW0hO6n{GpNkbaQ6*W`Eo;3}_R5=XK< z0YsI0n43^|QWPahLjCo*dA`zf@Kp|7fal9I=-yn{U+4i*ot*tN)m|#kBeuVS2r=(P z$&2x{rKt;Dqx=3$7Mb}P++9YHsIwW%;gx^mfN*2lS#X?@Zq5b--LhKUKO1nouBZGU QkpKVy07*qoM6N<$f-OlOxc~qF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/money_euro.png b/media/img/icons/silk/money_euro.png new file mode 100755 index 0000000000000000000000000000000000000000..b322ba9296ace62bce4768154d1d451b9df80066 GIT binary patch literal 605 zcmV-j0;2tiP)sEfkJ^DF^$1U^B4aT>wGyd_KRG3vZ26WF5%bR^MyEuu}!xvI7 zQ4}Uoe0wYvMUju7*jEvjh~~QmnJ%%90SQCmB9*gJSni~-bU}(xuT=+5g+%PHky=$b ztAtNLSnMEvw{i+rv0BowTGVPSi~WZvat{y|&Z~_L5?u;UhnclI<{p)vqxEUT<*BQz zvfi)z!DrXF*rA9oQM7h$yYT+pnbu*xRfYK$;(Lka*052{Pob5$<(3yn4BoU+h_@+x zjWTEN9@;zO2(O!)yifUEJ2BIPhREJWCnrPQoj|d77oF@Qw9+?S2`ddhQ_U#es#KOk rI$x!XulBQYygdf5{#9;h@W1*4h?>zEyRGj_00000NkvXXu0mjfeSH?O literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/money_pound.png b/media/img/icons/silk/money_pound.png new file mode 100755 index 0000000000000000000000000000000000000000..b71136463797cbd9bbee7601fd27ee7f4c6bff02 GIT binary patch literal 565 zcmV-50?Pe~P)~-Etk+scx`tkipse7HYewM-t*f6pyf05Vqlz=?Cx-0Cb?Vi*;@osiZSU+ z^MlKA`@6uHPjYa_ijgecBXjczsZ>Mi@*n=3>DY{yjc@Ll<4u5-uIkC+1B5~qe(Bm+ z;PP}WTC5-BG(>Ycrr0cP2>e(Vov||w@?{NPQqcRC1e-Pfm5JGwcv|N(6|e~fJ(I-# zDloE^U=A;IM9j24k1+6jQtwQ(^~)4tx?RN8H5RtL3JiJUu1H?PK~{sA>T3EHzIy}* zmsSzKc)+h{$!Hqb5*0IDhghg#C#B+dtZYJMtdcTDmQ(ayfK6N@D61f+)`{O^TU5>F zD|q=51{Xg7Sk*m2oNVGRwv#G4M?*~0FL87wP4|u}*gRCwJ{%hOFyI^y+h_dwx=&C* zPO9MKJFG`;;0{tS0gCx8iaCD)9m71|a0S+0Nv4YZV;!NihP@*VyRrsOxz2{eQ&bu=6;*0K>sc1K0N)?)o3UDjKX9=-hzDU3LGfw^jbPZm~2VXaK~yc|hm3 z{CAn)*q^jA?tbg8#{c#mw*7bm5g7w*Eoj-@@V|X;%m4lZz5h$r7rnQvH5VY-01z(O zRPcYwp-KOH_jUizSe|yDU^IgLKQC~9>87Ip#TyF#*Ke==Kk2}P|I-gm{ok^^`G5BE zjQ?57(*Nfz&v}W{fPhK<4So}R8+`k`8^k&t94FzhQIz{|S5h|M&0i`(L}E z>VL}or2k3t6aNEUxDTfRZf$N2uB|Q&Am@h73_Z}ZtNVZUvW(9`QvwfIS6Ve#mRmMh zl$#Uh1-n|?hMZ;D|HEg7-M6f;B+d&I zlf7$HK@h-y`|e%TykI^w7?PY_EJaAPQ54c>8q53x3fJksAZa2BCYUM*sVua!l3=50 z1dSH9NARmNLGvZv<-M8Rv3QsB1}{LI`;8@!q4VZC%_V z($)|W@MebM6lV#a& zfU34!!f@p@U7a0N`V)>GiP;fDG$0YU$1qc=n0xaYRSAaA#PbPt+vx8D8 zB67J83x@zGq~M&(A%HnYBlWn*@^>KYPa(@PqEZCFm(QR6T7^0eIoK=XlUq$sy&MG<48XIWqWo>Z&VtMl{o y&kv0NU}|dWorsL?pTgE;zOB`27yg*S|Hv=)vtlNu1or3v0000+n4X>%=N!&CthHEc zF~($l?$lameM?J=iU3$^sjRGKePaVeATvM&0YoIbMuf7mQig_J0gwf(CzITLG|K;2 z*R4~8VfY7NjM)we)v;p~7v>SGD54-gLRt&jIJ5;TF#i4%;)Eaw0Pp~`))|?AQi@dC zkXTQX3M?XEtPmPUU@~V!*sVZojoZe!2O*<7>0Ph2f+N?>_4mENBq5j zyl8~Z8z-?=h(@CtPipYzMg zwbpN{s;XLzF??7Uo+zoYb@jCkRF}tjJN1(BukV<+eY{BO?*6_zZghIaxeDw_Eu=Em*er{lpj8V(U3^2@blLSQB_P+ zZ7TrxFFs-LOCK;$unQ0bK|?GSqp9gK#u!8d5#hmLlBvZpCKpF&zx0&O*VifV^8wO( zQt0UD_^7q6&+Wi@J&9NIgEJ=@i65=wTVjH-&m(-FP452&``PI`m7TzC;2^LG^o>7W aZ2t|Q2x{GhZjL7a0000&@yin2vZsda%QRL~-#MTLt9f`nYOZPPyx zh@eoS36T*}D;K6x+W3Rik;ZxN{x~g0r!j^4axdp{IrnqUx#wObB1}w7h;t6-9M)Q_ zwHRXxws>l-3$~-9Lj?fVTI%Z?S;=HT1o8t!5I{riG>aY7h|0C)ge>wKDkQi^QO zkY34=4J{&ItPmMTX!1THY|TJxjoZvmDU?#IWerY3D&sMNz{hifYyh0N?ErCkgerop zN0vxC;^igyzK5ssF~scvpr{0;R2~9|Qe;Dm@+7|xxW7w?q6p9T0GOGc`ezsXz~2ri zi3L2legtcUSS-fE{5&TAx5r5r9xSl2ptYv(x&)l{Wy1TnS zYORkJ|GVG`Z6o<;=+J= Z{2PKMYxPLJkEH+r002ovPDHLkV1mLrGgANn literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/monitor_edit.png b/media/img/icons/silk/monitor_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..f772c562f4f5534cd81918f26d60ee96bb039511 GIT binary patch literal 769 zcmV+c1OEJpP)_KmXiXIZwA}WMjL=;76t2RNaR?)&96eLtwL_vXz z78QgPQTDKhZ3bK9gB*tvb)-_Onfbo&-tV@UoIZ)7!@Zn);ojdl|9kEcT5J0H`n2OX zIF5r-3Z)cM%CvV++qTobv9VEj0hCgdl$0_tH3eEjYJk>gKx>^|qc!>Yd31E#2OtfY zn4ILug)aWb&NQ#avaH_#Ddn$_P#P*DC*UVEC!5R+FG*WtO9xwl((t-FjCM4pX#!vX z*tVTY6A(fWPfA87lEh7g)*zL}k`AU!oza?^8Q8XsGo7Ch2qE|umpIxaFWZOL>%nj| z<#e-WWe1*tK{n++rRU<6eQAJpQV8LKBrJtxJ7fp^RA)V7OJS6(*?S3AEN3E8L+`_@ zr_%sj5`+*b2%v>vp7ES*wJ~M|*YV}Ud;G#8cUCbug=Il6r1Tgb1AypIWX6jxDjZ<< zT8q5OZI~nN_ydAyxR>ugB-)xYMxJMYP%uHTY6r>T%NTx% zFQ=Rg8Rd3l9>-g*_fG@Pb#^}4==x;^x$zf~>P=#eJ;K>N&>iP-po?JYfne`~Cth;Lwt9oYdf00000NkvXXu0mjf%FSMP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/monitor_error.png b/media/img/icons/silk/monitor_error.png new file mode 100755 index 0000000000000000000000000000000000000000..270c5018d2ea1f310c576c0774264dbafd26abf7 GIT binary patch literal 714 zcmV;*0yX`KP)R8*8RG4UJ#ACTJE;QGiL{wIb8 zVz{om3-CNIcO}%-H&7A@Q(s+7VL_0L5|n398nnQ>*#u$)$8i7%04Sxhnt)|lq%$5r zQW?^YMg%-9xSqlBvS&otYoL_E?D$z0mSyoP?P0{Byf{QKXcI7k*LnDThkt>8-d=#QvQ%F#iCM*MenPSqKoa6~~LFXl;$r7J8jC_^SoibqUx30KP3R z?RoLumM=86bWv8*L382}btT={L3=+S913#h%1N{qLZJ|=$t0x(4u#2aN~>b%&1W>7 zy2wEIB?0N#2e>yqJ=L8zWtEpjgqgQyp`omjaU@c}zAIyzddlv-^&)Jk;g z6XgwOFzFe@Y}0wJ9pkQ0SiH!=W9JWlpLuW-hzIfkj^muJt*s^2b6F-qprP*A3b92OyEw$zL wk3ZfA0C+ppxhC2~#0X+cUW#8a1`(P214m|cKIc`U82|tP07*qoM6N<$f@x1W;s5{u literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/monitor_go.png b/media/img/icons/silk/monitor_go.png new file mode 100755 index 0000000000000000000000000000000000000000..8af3eda9f2db79939652cb5f81e045dee47c5395 GIT binary patch literal 696 zcmV;p0!RIcP)a@nqhkOUP*ZVFoTSV`-U zLLou1m(eD{B1k^%wpy{zu%b|qpFOLkE@6vB7_hKA>h3) zK zP*z$(A`uapd<~T~K*0h<7K|}@2%yHW5(nm_ooRO#6M5uc3)WhqL_g+P!#~T49sU+7f9v}oIl}d4E^gJpKD<11TwUzZW)Es3gx6I}K78>1|ykb?Q zx3~AEbM8dZE2|va{&3I9rgH=pf&>I*X5ky@vT8;q`Wc-X)SS0z^Y{9Sqr1Di<9+(k zt<(E2F!}2vPCQ;5E;yp7gz9Z|3{5=c<>#T0EI!!N(^KV~o2{?k$LP--K6rL+--VYz zP~peI6qV&Qy!|@N@TZ|U>uFgBh~xNhCX=DH^%VE-b?{*1239ONZ^`axuL*-KFD&CT=FOSIlydMCoq{ e+1V~F-1Q&8>xzO)Eb}Y?0000 zQ{77xQ565p?E1A+>b7crZ9b%xJqY0!SXit{Ndyr+MD!T!OZ3toQ0zksMIZ)+LJ!eH zYC=Ys2<1aiks0bkf_v7qT}>+0_8&fJgg%&zNNFVW%tIA><=`JLaHd#=PehiQR8 zfHTHmf>LUM5R&z|FbpH>?Z}w9vAVhz(O3*HNz==Ux#f5^HoenXit+KW-2~B%4czE^ zkAJay-d5?LV`IV$r2z*$aG;TkgW&G+zOjUUQr!bd`@gs zgaT1Hx`s&e2(A^C9u}{KbZtebPGN0%0%M^z%qC9m zB$__cvN*EzKVXy|k5}oR3&CO5{~^I0j*3I+9dD5T}ulDl!VvE!ai! zgF;tJnWip?$_)9Adhykcs=98JszFdgM>ITx=ie`2HvR)TU$qEqc3VaPp~La;$9G|^ z{bprFIby-raMpH#B%{z1>)0R%kUH`R9d&uQxW5vbrdb3s(k)2alQ=Xqbf1$=PitXc zlcTs^j;t(^<;}(q$%;#z=F|m)!N{5_xKA&$|^xFLAEzI1^&jSMkZGW}!zxEq#$)AzlP&sV?0000gjy?kL>n$m`}v28ZSU`sZIN*4v83u!ijAR!PX-H4mwUvOQ7QUw2ie;_L< zh_=}XB2-e{*ev2l(xkyunxsiy@;=6UCnhF#p_e!B-WkrEd(O-#LI@lm9}C;I!NamF zIZV?Wdy_{#!MR81ZSzJ2}j z&s)&QQlCKK!%L^rVrAtf>Wv24ZJi$0XA}$H;rIJdE}!CB_&P!hA?)wJ#>`9r)#@3F z#R9U~>{wsHP9}43OV@Sf=;-KbI2;b7QYkc>O#&8?$z&RzK4zWCWYX<&xs-CbjKf10 z^7;G|rGI@K%gf7m*4NixBsVuFp6~9SRVtOK+1Xh{qfzjtYPE_|sbr0hkH6a5+KQ3# znmX*w?RMXupy2xcgVYp1mP8_fwY4?GVlixNY~bSJqD^s+F$8rxh6#K=AE>LWGY4;E z-rnAZ*XxxvTT)fkqiI^2=O-s8`iO}*^z<}$c9J!V&f*6ty88=|+-So6 STiROy0000LLgQ-DDLPW}%f1vx-$*I7)nw zfcOL-13nN51fSzuPw%;K2WgWo(hFy1bAI3VopUb-0Nis+mgRTP0@LZVJ|2(TBuVN& z+EA%fUX@BES3aM=&1SO_aeA}o`uduja5${`{r8$SgJ{Xf~Tbl0moIh539=3k7k0hr@BL z31l*v6h>rm(PgvQz-%_7bK^2GKBhxqVhC2NHLeLH5{diea;bsnvREvrBMKvce}u`E zg2iIl7>&lanm|$%@6in#7|0w)qY)KsG#Vg^A_#&|Ch+0@&2hPl3mJES?)xCRvYE+s z-4Xcgu}8<%1@onPeh#Z-k^REHGlaqtS+3C&f+gG|YbRG-_ zK;8rdgF)bV{)@q2&^;-DALaP?p!n(Ir6dUQ6>oa5+wDEF=^rMO>F8guCh$M?8yO%b UQwmBS=l}o!07*qoM6N<$g0ICJX#fBK literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/mouse_add.png b/media/img/icons/silk/mouse_add.png new file mode 100755 index 0000000000000000000000000000000000000000..65bcab520632ccbd540ded7e01c30af31671dffc GIT binary patch literal 729 zcmV;~0w(>5P) zlih1laTv!H#vr0UAo>ToDcDs6-9&T|1YL9y!5A}ay|RSVC5g70p24(@bj2Xpi0wir zjT4pbI4^u*zOW1N6*L835E%?N=kZ;ie$S7NNp%tX!NZSpc)s87=Xp3s1OTFwmdE3{ zb|RtQ?;mx!TxynO%l~XhBob$0v6wy_4(|nnL6#(48A=_qlVh{l__ejQzs2!*{1g%I z6$%A7K0bzWxeTFD2pkT_w$tfcBB|L_Dg{2D4~$0R#-GWf(P(rxm&*a3e!maGNhXtE zwOV;X049^^fMJ+vwOV~z5Q<5|R3s89WV2c5bUM)M^{4^X;o%|hJP)N(3Cw0Q==J(> zrBXSHT0|C;`kc?_DKZKW8=KqhHXuzporYSiMol@61D#H%5U53DQLhAK0UHT2nG6sz zC>D#*Xf$Y{AvcLeE)(&Q4vk45s8lM~z`*Tx@3&g5 zfe=%g%_dDmV-(OQ zrUbsmmLXi?VA1&)?krw_OHa-kM4^=x5AFcdhlQ9b%sjzd@3GM(U=#1?o(wzpVR7dH z8Z<=d8RaU!umEkZmkO%YDlHrfjn>!K;pWRR_#XQR!{v&*S@_3q}?we7-7i00000 LNkvXXu0mjf((yoF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/mouse_delete.png b/media/img/icons/silk/mouse_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..72865668cfe796ac531ec2d40a95871aa06da700 GIT binary patch literal 741 zcmV zlTT>UVHn4Mq8SlE-6H5PsAGrDb%@qF1Uv7t%Sd7oEeZe3khvOj&=4ZM>`>dmL0iLN z5dK*n{KGbFfla3{({PH|VmX~Zb^iPIJ}>;ns1C6Q9)9rhe!t((^YH!z0K!Q-5D4_1 zNVvAPru6xIMyJzR{O5&4B5^JrkDH^>=tejkcCw_K$5OAmSS>9riF0#ve~Y)aw$3o| zMlP4b!NCEF#Udh+2;6SBXJuvO6-&)*Z*LS9JjKyNB*=!b6-EJ3BC6h@k zE-s3U09LDYZ)$34#Ar00m4q^O;lbwSW-gP-pw()j)9G*n>izwFh@yx>p#YoB2D8~b zsMG0`q$Ok-Ysb#c4o4;dVbkSivk9U}rBbL?tK8J<^2w;5 z4EcN>^?IE*8PfbFlgV{tu)e+?B18$7Qrhh{YPA}lo0duVL`TLf5C((6cVyuA`*#ly z508YD(r7ezA{mo_zFCJA{=qBwbXx(}-P1ojeezLm5L{l~r8IJvgi>O;T;_&f-%cQ^ zxqxoBIG0HFN@gvCa<5!Oru1lbN9*MeO15tW&QK%xg7!V`F0l zw(0j8jb>1-R?C6|m&U`YtF3~*2fKz-NULP<^()%$KKZl%{sTh;mq%IRcfuwj64Uu_ XBDfTk2IT+r00000NkvXXu0mjfR~lRR literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/mouse_error.png b/media/img/icons/silk/mouse_error.png new file mode 100755 index 0000000000000000000000000000000000000000..bcc156238bc7063b216201aac6c09da7cddcb4cc GIT binary patch literal 790 zcmV+x1L^#UP) zlif>`VHn00M2PU8D2hIa(oQ0R2>*l*in0Si`Z}-(-B`|6$~H+f%Rxz$BlJX9Hqcz! zs=ZsfEi2n6?#tdy)|#7cu08v7SI_gthLlG>aPywr*LD5w3*IUKRXZJy;~IA)oS&bs z)$8?AtyUY^cEROx)j1pv#p2@Pg2iId(xg*cQtPMb(`YnlwOakZ*y(icqT+>6D1=lh zg-9dMB~)-7<0+n-Tc^eo!*3 z1byI5w-EP^H^nu9Qn8g-<~&?zCJy3wqjr%8sb<7EL{-NB9qA^B3=WQ z^&QAXUx4_U!71yJ;l)S<-oUCl>9RaLQ70I9#iHSKZ!hvjqkz9blaq-xxL;qvIxQ~q zqYY`#`M=}6L{Aw2Z+L`H_Z#jA27F6PjqgV59O>>7N@IocpGU!S{m4Zg3+ZX^MS4Pm z@FjukAV0O>x{v%a+&g?oxFgWqTw}j>byzDFbEEBTaqhwCB8mBtThk*Or5!}ax6Dfv zQVy(`NASL5|M<2)6UB>}l*fosew5H8LX*fx*+KH5^8leDqL=I=dhuTJPPE7P2dw8J UZ5DxR`v3p{07*qoM6N<$f`-p)3;+NC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/music.png b/media/img/icons/silk/music.png new file mode 100755 index 0000000000000000000000000000000000000000..a8b3ede3df956f8d505543b190bc8d1b5b4dce75 GIT binary patch literal 385 zcmV-{0e=38P)klCE>?a@fNhGaV ftv%qM$TQzJ6;XjO8erVL00000NkvXXu0mjfw}q7O literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/new.png b/media/img/icons/silk/new.png new file mode 100755 index 0000000000000000000000000000000000000000..6a9bf0370708a165d3e49047c09e110e02074a53 GIT binary patch literal 378 zcmV-=0fqjFP)Q51$RwCw?WgWe;0fi^vY%UagXRhyB(O=1wVPFJlYqlK$kNFcaSBrLFKHcpU( zVj5rP+%se7wuRup#~J3_|C@8?jsx6(aN8gV+_?~^wID=7QAmWo&=P9GzK~Bj7P?xU z4^LybJ-~;P$nL)ri2Lx-f?f?uyKtX3G(76UWeycgm{0H$eX9nWr+ASHH8>r~vom;o zFz$}vYpDI9TZYLgxm?Z}9nS!RQHI8Y*b~3AE}I>k|Ynq_|_kL0z^} zg`YWG?`i*VRiHt=)+fle*{;CjiLD9r5bPAPFRr!h8&+rODTKm>mjte|vSwTU#7zr+ Y0SIdSJYsEaB>(^b07*qoM6N<$g6XKB5dZ)H literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/newspaper.png b/media/img/icons/silk/newspaper.png new file mode 100755 index 0000000000000000000000000000000000000000..6a2ecce1b85eaa9084b427ee2c5226e2296eaeb8 GIT binary patch literal 658 zcmV;D0&V??P)oVs((xWgD$)EF}_d~6|E9cYZTvaqk~9`i&BW97*P>v z@lDk@Xl;b%^t%HQ(pa0tz@5kM+;h(T<_N&ip(~wEOB0DiJ{F5{;c!^;_xs1dg=jRo z3WY*KAQ0euKA+@K0;yC=8jr^rydICoSglqd_{QV$a4whY=|O=zI1-7hhr=Og4T=Ck z5O8*O_S@lbByBd^lf44TWKv2W^LH=<&(F_6aj;k{L?;9b7K?>5nM{(sFqO3)3}ZrBV@HFj%2boa`NCnylwer*m5<6vU%rtuL2L)a!Nd zJP*qIOD>n6?i;$@!fv-8Tdme9+l?I|%bm;R7`!3)<-bP$-VIIGvB6*%vHYw+%Da)t sWG@c=a1S2nbh=||dPK1BKbT#A0Qk`HN6lbD;Q#;t07*qoM6N<$f^gU==>Px# literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/newspaper_add.png b/media/img/icons/silk/newspaper_add.png new file mode 100755 index 0000000000000000000000000000000000000000..8140e8c1013bc74ac369f84e9dd51f77bb4b84e0 GIT binary patch literal 750 zcmV5IqDdRzdYtFTr{V1TRy&qUdlr6t!*Q zHvj+G^)jT`Lj*H)Do#WSbxu;}#bFcLx8FIWtr%kmew=&HJ)iIS{=WB&02n!{B9VwH z7z|2&zh78dS{nWT`*Gle&*$qdE-oq_k4KoBn;SirKsX#$1p)yE@7C*ebh}*;yytSc z1c$?M@<@RJyu7@;TdUPT&!85dC<^R$`!Ac#7P4BcCk_<|g+eOYEDvA?&d<+-+CjVB z=1vG!EEbDkGMPpXg(MY!sGxH7Vo{$XdszP;zzTENlyx% zk9h>;Pta<$eL)azZ~;0^_Ikbj?d@%l2%JtQ@14OUj@8vwl*?sg3nhFA$PC^i`0_AB zf~AFph5bsUf?}}6s97Lm0lu9MIB38V#JiwE8cW_^Qy?g8R#WzC%N?A##)7aVB z!RF>B3WWl9z>?49am5~0vQ7WIV0H6$&Vq*PnkfE3((CvJv%$wPb3oj*Rj+)oenaY3}jix z?a51sZrE^e1k+|F@b?bP%*>2UPfs^k&+HenzT@#YD6HPq7iWKJrAN?6;~dtkjQ{Ik zP;|4#3z@Uv(P(;VwfY=wRNvK|hhCcCC$pKo4>LGedcA&ZYHDhWV1>bhb=oXY gDa`htSzznG0VN>dZZSF0x&QzG07*qoM6N<$f}9CZOaK4? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/newspaper_delete.png b/media/img/icons/silk/newspaper_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..bde96ce19ad865893414628a85f933140b50f41a GIT binary patch literal 775 zcmV+i1Ni)jP)4QQaBQ_!nBv1oso6^(<=>w{5>7*5@*yDdEq47ZolibYY&U|OiIrnb>&~VuDcsz2K z%jI`C9Nfgjg!JF{M}Y&AlauA~@o~XsvvFp#S$ZUasi`Ts)9GYzWpi^A<#HJW@0v^| zZe(QS_@M&(u-$I2WHK4hGbjQCLBR0v@Grey?;aW&k{u}EcDv>DF~1Kp&|#!>2w-opVxy*UtizV17UIiDof0s%jFOZ2JtOlz%yG2 zw)auE_&N0U_EtHLYZe9QZ~WNUSaoY_3nT)g(I{qTFo|P!b{5HG65&_^Z=5`XcL}~+ zFOgus)oQJ!QYpmaarpgy5oQjir>BufB(S9G!n@n&!8gm`y(!E1S|puy0cu%TSy{pM z_BPhm))0%uLe;JbAe-wB4g73eq#yllc(#WnbDNIr`KG+Cz%217Lv2#80=S}&DK zSY2HO&-0?~+L9fAUd67{v@fmIk5Q-7H4Y9A=2&KSgejjmyLz%N>!ySO2ACDVQ zptXKi0_q|4*C5ekHTL)SXIXw$U{6oaPIq_rg}JsfFBaM_{>*eVA@@XvMEfzkZI$kM zTO?2a8)cN`a literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/newspaper_go.png b/media/img/icons/silk/newspaper_go.png new file mode 100755 index 0000000000000000000000000000000000000000..fd6142871d234b34bf48ae5b5c86fafaaf36c62c GIT binary patch literal 779 zcmV+m1N8ifP)JNR5;6x zQ(Z_?VHkeSJnLs}CkkC!=4??Q)07hS6YFA8coWfXy6n!PyCB$w(M?0Tk}jkhZxRx3 znh?4{kP zRrRH&X>)Xc==b}Tzuz17K@Jf-ilW>j1c!!(_P?uI}vYw9xZ?LU3SU z;9$9q+iL_yE_ZghT&CICS+F{v&xcSbq|tta;P2|{lK&AH9UW!lVVc>^$TKrDC>Dzl z1OXn82S%e2gM))Ps(HpT;rAjFO5}JvULn_?Ysd4cG)`O1pwY}!<06>hGhs9z6Wq{bqCcdP%@IINv^&2-iB3~f17|P^wXSz(&)6*5Q)9J+g{5+Pjcfj#? zaj~%qpOeeX#Ua9hlE6;q%U-Y76pO`nb!K9e2Si0eLrpVYE!@JwrwNIT5C{auOBv9D zCCkgQjJCEmq*5t_*B@j2^%F>%0_nGc6GzXYxz354n8(}VQ(lC$7(f90jsus&;o!_> zGYW+QY&IK|jD)L>+fa24Bo7Tb(i>}NZMcLjsc87P8r?V_G#o2C$meo73$xE=&SWwr z%Z&Uzy9AkBD4Gmem9e>OxuN6fRFES5MlqAYvo4L`?)Hpbo z{Te>3PGM~E%}+_em2{7u*mV;7`udp2Qd3h?9mjDD}Vk z4@oPLzwY@j^!E0aLUt-_Z)>dhKeO+=m9KzDlQq6w>wzs$CE|-gmFS6MzN~ID=T(;Zo!u3eqqJRXmnn*G;eCR|=#2Caiap};30 zu{1R`B}`6E*4zSIi^;5ubUFsKxY^6C6xh*rLnQG=N$06m?i+3#dpu;atMV&ILn_y z@Aw2qK@9- zWhoksqF5~A`1lw`qY>ld<6!?kkw_pM4s#fZuVS%Snbr39_jyliYwK$nnf3MH-~c;2 zJKXVsfdPnzhZr0jL|a=My1TnUuJby}TUuIvDwWE245HKNiZZ&aCo?lM6`#)styas% z;{Z_<(b(9CKp?>LNF>4yuCK5E-rnB+fB}YwhcCGiR;#tvVzK0COb%gy-rim)6bdvo zHKC)Ug9pnS8X78{ot?W3pwVawH-|)*RZDzIt*)-- z$*TgbcyjBMsp*kkuRo*LuGDJv51QtZqTJQh^^)QRnL002ovPDHLkV1n@`X+{75 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/note.png b/media/img/icons/silk/note.png new file mode 100755 index 0000000000000000000000000000000000000000..244e6ca045c50a130086ac388b560a12761544b4 GIT binary patch literal 500 zcmV z!-sF!^gVb+8rtpyctW0#N6uWni0LCt_6PoOdbjll_d4>B|?abUmpo8>v>h}Zj|Ya;Eu#qwvU1IVc9khP8VrtAsT2=e83P~$#!xXbw)n}FlPSEe7Hq1uCb zR8w;xqmBrUgA^pnkB=O@-lq0DPz$ay0yh_~I_IDpzxRb(4=Iy9CT||k!08w)Pe>W4 zElmH8fF;68$GMwZ#7{4ozI(ySrR%I+xs4-G1q^UxnUV7rlf9>Rn&_6Wike0000v%0y_nie4@QbY&^tbl4Sl(SzV~n0XlZf6UDPQ6j=tD#8}4ezlRG zZ^aZB5eX0zA~r-!fEXXKK7<-;G-5mmHBA?vs9FMRh#tALPC*0|R2D!W_x$pD2Y&uH z+eHxPl@An%I6xt+F{nrb5_%h4!5CaHk12iv=OYr7cNc)uh|`Gk*tX{aE-Y<8V12+K zPJ@IMP&HU1t^{I`U;_tcWvOhrM%lwTT_N$nd1VpvZ#{vt8a*?L@xOx&KnzwFi0yAF zD?5!?55(2Hfm#jH;)`C1wsa8hIuAHpFh_Cx84de(fs`1Y)r`zJmOYQ4l;h7z{??m2 z6NB|tOoR)Q+6LPXG!1ljo}#1m7&G(ZWG2)6`muahZFZcKskR~D8qf$7frn!c bvi<)7-g`sTs&+NB00000NkvXXu0mjf0pJeu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/note_delete.png b/media/img/icons/silk/note_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..8a1f0ff56f3ff9c1d6e1868eaebab76a185b35d3 GIT binary patch literal 631 zcmV--0*L*IP)X_hQMgJ64VgUTuVX_4iRmQ%|%N&1VIKW z6ly_}Niis=j1O#s|KSprLH24(6;msP^w!;>QD2}~Bd>N!nVR)Lt@FeB=w?vJK@BNvc%LDG&20)2m|BSOT zG|GYVcTq|a#BPX7Q8i>wYmuZj)g4Rb?d zoVa*{?96A>%WfKfzN5XZB^D+3Hxl3sDvoG6cLzPuPx0$};+E57TQ6Xj`pC9+z|{wv zz4sm=4ys+P57Xl7YZ7dNID=S?(*+IABYLga|n=&i1C^Ll$f?5eeicnA#1rn`Vw5g!~Ai_;Six%mol@YXv zpr{DSk_4&HqEGXqMs21Urx~61zW2TFJuNiKk5=8qxp3h5o#%3&zLVh3I}!7>rV zy0cveL@eMS{2@4@V#Ifsc!DulJ&DQpf%Op4v$xe?6=D@)U81WGV*SDrfWQL`Vikx# zC;D5g5L>`a_LDBIB75he%=~zQqY~|505hGQwLEXKi?wPF;-YiIct4j@Rd<3|O#|8C zTHZhC><9zcK%qYMV7$)|Xb?l7a+FlZ5nDj##-OBu%J?oaL+^+>n(`G@l&xA93j+jh z8k0*q$O-j?Nca8_zy`4G;prD4e1YrH!W$vy!p#G|OpS~5?22&Z3S zwVIa$XW=s4>S&U~r@Q#jeV*}=UW(V%W0I-yifB=D-Gvu#7REiau<_yZq|tBhQd7T= z($ZQI{e#oW)d!XmFX`aO{z|uT!vfZZgl-iCb@8i9wMYj?C(+SK{{W>psZ+6os7oDm za8eW+HAssHtztndH5&8%zW06Kd+%{bu?flMg>w%acz!(Rz~hJr|MR*4Wcius>Tg5> zM2Cn85gj1fM~n}l!f1tP4?;!XxoM{rU^Lwa#@py3;K14k2oxWkZ+GCAR)~ur)@w{1 z5V3%RuugCy8}R1M4FaG`bDID#R+pdTbatiw)fl0OJE1u?i$y6E%w! zVqFl81g#Dt0J>IaSeBqk>|w2kSPxY%Q(P@$!YZQc?GCI_sHInE|1+2XL}OHi*zT=Z zU8h#4lGu5M@=C7l1`z<`70{Ix5}64S2PWxB9|IdA#-&~?(=&LIP1_Gq`nEt2iL?V8 z5yJdD#TVBw?h=>~Dwg8YnA%(R zj$TFk{>|*vNOIkQRurG##+`eJ{gcQ0@|wbOj?}J$Sa%+=9>Zg4Z196vY>{n4;~DJ- zSJu{V4^!^$=;eXT={tk_;+R?%k%0G4J~2F&!HM=k{5bFKU(buRM>_(tQzPGpCT4a- zBg=>`HbT&J_h>xL&yOEie0t+?SEq<-KZxb-jd@}Pv9_t?U&mTRWbiM2Xm^@Lr1jze O0000R5;6} zlR-$7K@`V--@00+DaBF-W?)2!79o*g)FH}yo{A10qGLqR*@KDKJa+EdtwTj9l&K)3 z2LlOBDn&C*S6$t2zL_`kI_yf>8U)SZ4Lo?i|9|Ga7pW@$bJ76%<)upQ2dWkohkA#K zMI}Lf0?y#Ypb~>K)OJ3Nb_2Xn-g2{qt_l$p1E7$7cB|Auvc5p2DjMQKHUiZEL@2)q zQEDIR;ys=qLa<9nZVW<#sx92XLNI7BXo#uE+#tC89sr*Jf(8TXibcN{8#LrW1+{xP zkge5%a#8RJW;(ld$se?!rw>(L9V3?ZryF^h$&-Xc4 zn#Bgeig4`EDVplq$eC?A`s&;zw4fx;* zD2p5OoTmDXLoU5Kp}zH~JhS7O#P?t24MDNN_ms*i3Sq zJARohmrsv<9yY}}Fl1l#qhe4OW8)8)+A72gM{638;PD#xwlT-y>N+OoM;MtM{%D2P z=x@u^`J~YsYq7y%#BwszoVwW9!TY&U2B%+7TH(TCpC-}2ZevStYUO;x)y$je!EqaC vU+hy`Y{0((8oQ$vAIdUu@a4;WDm(d~Ny&QoBWxc?00000NkvXXu0mjf`uQqR literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/overlays.png b/media/img/icons/silk/overlays.png new file mode 100755 index 0000000000000000000000000000000000000000..ab3100b5c5142a96ec64a5a33053d065b6838bff GIT binary patch literal 716 zcmV;-0yF)IP)Zj1^v+DeN+ z$wh@msTr8&gVYAi($s0panyAF{~70=7Bh|!8ANA$x!?JIoO6_j@IPe*ID7Z~6(AWX z0Cs{1f^FdIX=die(XkIi1XSQ#-1toaG7Gh|Dhn^t=uehFhvBJruwfNMfwJ0*%3} zdmXN~y{MvcRCEHN*b)W=wEhgx{on+}Y3*z&xIpA^6ONi@I-a?4yzFGd@jIkuWRa3& z51Gp3;wA=kO-X4(hKS_lx?HP#AD)tuTgcS-1Osgj>SHf6UiJ==)=)@21D0L@_4_%W y+#BcJk(yxLlbwRt%r{=w__?DuyFM+oU_Sv>Crl?v_;CpU00005TQ^(M5v$(QKVE?W+9X! z*o}&~6c?_FreF)9NJB7b5Nbn{G0n4+%uJhR9(V5R|NFTpb|HgjefT!tIhLx@DR+N) zV+fHiR5Yt19}k|KnCsND{tH-`IMJ)3AE?OtyZ4>Un|6(d%h#JK`i&a7^xW9>`yBy` zS4SOHeOpC7$?hH5-#7Rswiue_8Ju*2N@$58=a#2OTA3png`w3v->gWif7t%e$ z$NLVS!tFT#8WL|Wa&K~+{%4P2cRfwesYV1_!F=3OaRVHl(>=`%&{x*s30c}#CNE@&;ItrAv!f!)Oy$Q9t$uS=(sD$-J{T*^(8Eez1E-l3}} zPrfHZ1`qsIFe&gipuL8-IZbo2Yg{lFGKs?ZZWcOaOdk*3`5T;$?AjbG1#`B510Er^h2)2r3Y{!8_2Gj=$KzuN5 zaErtW8W_Y2iJJjY)5pmTVJoPJYpanPOEuYHclM^C1F>${hFRpdi8a<2H|Xudf78bm(zwJ9`K%6I?q*Ua~ fW9JvIbn5*B+_J)rUMBs>00000NkvXXu0mjfH&TkY literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/package_add.png b/media/img/icons/silk/package_add.png new file mode 100755 index 0000000000000000000000000000000000000000..9c8a9da4ae49b7fb02af2eaf6e03e0f6c91ba01a GIT binary patch literal 899 zcmV-}1AP36P)i-HS{zx9u^IUGw>*=$qi z4z(fju8Kxf4E>slBg^es4|nAN~@NV_SFj zT24(nZf1>C;s&Oa#mmJBSw-p_cY~Y6U)hMyiI9#@b2~OpJ~{tQK#e@V>&ZUL%dC-& z4K3ksgdE?;g2XJ7a-IC z{t7T9P!AB)6MkIq=xo`8@fr4Pe+pxHJkq|8i#gBoi7`)S7Dry495@-9|NUzWL5S=I zI}8e@=#j{*V_TIRYJCHM<4>HSsjdT~`23%KH*e}YU%C<>JM(QmG2_K2&b4Ftok-)u zSoT&#!hAJ4MD=!?;n}ksXzJm;^DmMqtaEL0%KcAFfAn>=sgaW^@?6tnFI$DxIX=HQ z$n|KMeH{mAuJ2-I1BCpEP)*e`r0GmDdCv3B-24AN7nLkDp7r6!fpdkQ_POs-o|x$lEQQg9%evW;K1esG{Gik*}W^x_p02 zz@7605mh~*BB$cp`?|L6d!3LNikV3wPMD?CDC_s8?yATc75TAuc)YR+NS+_)L-b>( zsrQ9#j~&5n>ISV5tlihzvj6 zHDtNXPvRAp*~s0*)Qb3}431T$tz$2EYlIs*2)S|cnIwy;Davbif3elb@jZvmT7F@f zVrCSn<#Eb6%J~fW`2`LReM=-(52Z9(N@3-bw6yQ1u^Fa+pFL`;NJ+68qpm}|xr0jX z26asd5=}8;l);+=69sPpD)W@H6BN@|aCaR+jg)K^0RgNik;ZN!P8@G(5-Bbb34>Lh zfsj(mUZRj+Cx|5=>Y#prieRe|9`s;9t61=5{Se?kq8ij zU+()P`Q4A8{?PogZ2858X21%`-aNe960R|t^-p8 z^#MVBA#){3_e)1{XGXDpK1SW_uk7k*rZ%@8*ka79h57N}Tj{Y=&7Ft39^KzhIKCIk zDey{|s*hQ#;kNCD{`WQ~Y=8O)Ay1smDNq0KY^#dAt47{xe`+An-rEnpM}Gb))1Q6G zGp`I%KX;C5B}*A7;LY2^-NEnihO`bR7JkxdbOvtdjHL^v38oUE+~BW@`d1wzX5cwxst&W RBUk_c002ovPDHLkV1h=xq}~7k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/package_go.png b/media/img/icons/silk/package_go.png new file mode 100755 index 0000000000000000000000000000000000000000..aace63ad6f91537268eb6e9bf328743da7c631c6 GIT binary patch literal 898 zcmV-|1AY97P)yqPWur#3F*- zi1-H*6GJgONgz~1E;+_Oe@~@VF-1Iy-=*@ zV9T!Kgk#%59lVt}Zj7B_)9wTKYBy6YEwPxKqOdeGuEw0%cVhe}Yj*hPSBMNYZ5yz{ z4STT*%d9TVV4NauDND$z(%QKb>=kMr>ckh0lFuesOioc=Nq^^8BQNYYbk1@M%M`O? zh?6H&UZR}Ol3%#RzJX5(MAktmg_e?7`2>w^4^!6w)4$9==U0)EV$}u1A)*bPRF?jv zHdar4EJB1b*f+rh!M+8R159x8%Qjd0I{0j+|69pUC)f(>!P(OTs8c~;XuVtXzfO>s`m zrjW9YI38*Yel_NvP&FVfNEx)sn-kxIx;WzEcpe*LJBYXLr(llS6I0o+c9O z0L_4N7u$0%Dx~ks;fjYRF0OIOR}1uPI!MtibK=J3pihiBTv)jD>R%(Llj(_XFa#mG z6Wg=#j7Q7*PFmM*W@B9!ftm;#qU}sCT;|&KtBZ%Fe#3()Pk+9@Sw&8%k=NQD>92qN zkFT*E2S*%i&!MYvH;;DpF?sU}zb4Mlls)au3~BX$XZr12Z?_sbts>8Fec~0Xl1q`9 zxyH%T#p<5UCqrY2(J4oGEHk9ens22BN3dYXATM07*qoM6N<$g3xBAZ~y=R literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/package_green.png b/media/img/icons/silk/package_green.png new file mode 100755 index 0000000000000000000000000000000000000000..25b28bb6aab661d06764c3f5df40447eafdc0611 GIT binary patch literal 896 zcmV-`1AqL9P)KI|MAoju4i{u@{tJy)-y@2kjrH7x^`PJV~I)v=6C z`lgBuhno6Z8#*uI5{FE53a{TyEIdwPb9zlhuByn*o}qjBCxNBA=lc=8;;-uIZRogw zS=9zw#NJ=#@9`0ibe+Ogc8o$c&USd3bbMh_9cSdZw3#-bprFL3#cPmkBXQjDd5M8x1tTNKZF&VLNYPDZZL9>z@-$o zek7erUNs|}ub$=P&x}PsA(FiZTEG)*B6PT&oEM6I6T4uO&RP6Yi1D2#!M@?3 zj;KdPT+QWuH26CBX>*w061S-HHgF>FB0;keTcKdt%%qe2>11#Wc&Yqlx{|^}k)r#Z zfn$A{-OZ-=^|@K>LVUuw z|4pw?MTXRo;p&#ttpfPljc~ z^*)fFGk3%$D&OKXWdCy9_{b!yT6y_0c7~Gqk-mpj!O8w1MrQtV62N6 zKd51Qa}KVznef~1!f(w((D?|<6MD>btH8XFphvgoMdY%=T+oe>w-3GnExf%dOqtHY zS(}E=dofs^vjBbvF#8tV7ahP{1|};J9#x@ByDLnQ%VJl9Jkj#ok?On}j7gvDZk*=&ZvV1OVY z4lT+p?g&7sR0jS;nIvmd&hhA`>@!j>0=RkO0+JFFArJ^4kx2N8^a=5YR@06hZH)jj zGBW1Ze2nd6Nm9jQr5bhU^{c0-s;WYHc{y@&a-dKs_&%cP^?IL1qnW2^+P(%56&1BE zHa0doIXU@@OnNGiEzexdmY?CSWe7^s)6)~Ova%LQ1*B5x&xj}D{RPNa+l;K6M!5h0 N002ovPDHLkV1m8@u^RvY literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page.png b/media/img/icons/silk/page.png new file mode 100755 index 0000000000000000000000000000000000000000..03ddd799fa0a3aec561c75d4221f195db65d6eb9 GIT binary patch literal 635 zcmV->0)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_attach.png b/media/img/icons/silk/page_attach.png new file mode 100755 index 0000000000000000000000000000000000000000..89ee2da0753040d1ba0a3487473a715a8fe89322 GIT binary patch literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_code.png b/media/img/icons/silk/page_code.png new file mode 100755 index 0000000000000000000000000000000000000000..f7ea90419d950f9e69d977a1f5847456d96a5f0b GIT binary patch literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_copy.png b/media/img/icons/silk/page_copy.png new file mode 100755 index 0000000000000000000000000000000000000000..195dc6d6c365d298e466026b37c1959d96119ea7 GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_error.png b/media/img/icons/silk/page_error.png new file mode 100755 index 0000000000000000000000000000000000000000..f07f449a44ff2761bfc7b752db3d08d0e1238b02 GIT binary patch literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_excel.png b/media/img/icons/silk/page_excel.png new file mode 100755 index 0000000000000000000000000000000000000000..eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9 GIT binary patch literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_find.png b/media/img/icons/silk/page_find.png new file mode 100755 index 0000000000000000000000000000000000000000..2f193889f7ea091c292acdd684c595dcb206b5c4 GIT binary patch literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_go.png b/media/img/icons/silk/page_go.png new file mode 100755 index 0000000000000000000000000000000000000000..80fe1ed0cc75fbb67e9398ae686641f8fb287238 GIT binary patch literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_key.png b/media/img/icons/silk/page_key.png new file mode 100755 index 0000000000000000000000000000000000000000..d6626cb09eb11a298b90a8a27b0d8eab41f49a82 GIT binary patch literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_lightning.png b/media/img/icons/silk/page_lightning.png new file mode 100755 index 0000000000000000000000000000000000000000..7e568703d6432c530224e443771a04fc1e2e59c6 GIT binary patch literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_link.png b/media/img/icons/silk/page_link.png new file mode 100755 index 0000000000000000000000000000000000000000..312eab0914ab59271384686255d1be913a6b3add GIT binary patch literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_paintbrush.png b/media/img/icons/silk/page_paintbrush.png new file mode 100755 index 0000000000000000000000000000000000000000..246a2f0b426faa0c7f5ba009e32b1deaf88d1288 GIT binary patch literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_paste.png b/media/img/icons/silk/page_paste.png new file mode 100755 index 0000000000000000000000000000000000000000..968f073fdddc1cc0f0800b1ac4001cd9a55f053d GIT binary patch literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_red.png b/media/img/icons/silk/page_red.png new file mode 100755 index 0000000000000000000000000000000000000000..0b18247da5850f3c2486373a3e179acd2772e8aa GIT binary patch literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_refresh.png b/media/img/icons/silk/page_refresh.png new file mode 100755 index 0000000000000000000000000000000000000000..cf347c7d4685128a4a447abb9fb8e939417644f4 GIT binary patch literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white.png b/media/img/icons/silk/page_white.png new file mode 100755 index 0000000000000000000000000000000000000000..8b8b1ca0000bc8fa8d0379926736029f8fabe364 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_acrobat.png b/media/img/icons/silk/page_white_acrobat.png new file mode 100755 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_actionscript.png b/media/img/icons/silk/page_white_actionscript.png new file mode 100755 index 0000000000000000000000000000000000000000..159b24075191fc259cfd80c797a1b0d74c168422 GIT binary patch literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_code.png b/media/img/icons/silk/page_white_code.png new file mode 100755 index 0000000000000000000000000000000000000000..0c76bd1297751b66230f74719504b2adb02b1615 GIT binary patch literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_code_red.png b/media/img/icons/silk/page_white_code_red.png new file mode 100755 index 0000000000000000000000000000000000000000..87a69145075afd8f8fd8b391c5da1249ec8b2889 GIT binary patch literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_coldfusion.png b/media/img/icons/silk/page_white_coldfusion.png new file mode 100755 index 0000000000000000000000000000000000000000..c66011fb0fbdcbf210483d676b7131542a0e282b GIT binary patch literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_copy.png b/media/img/icons/silk/page_white_copy.png new file mode 100755 index 0000000000000000000000000000000000000000..a9f31a278e17993d8d4e13beac2f9d5f7b42d08f GIT binary patch literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_edit.png b/media/img/icons/silk/page_white_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..b93e77600def75c9a144d3d0a5088a62c02cbb0b GIT binary patch literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_excel.png b/media/img/icons/silk/page_white_excel.png new file mode 100755 index 0000000000000000000000000000000000000000..b977d7e52e2446ea01201c5c7209ac3a05f12c9f GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_find.png b/media/img/icons/silk/page_white_find.png new file mode 100755 index 0000000000000000000000000000000000000000..581843637079359a6a58fcdccf0763690c67b063 GIT binary patch literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_freehand.png b/media/img/icons/silk/page_white_freehand.png new file mode 100755 index 0000000000000000000000000000000000000000..8d719df5205f7415ce657e5c277db4533c82f346 GIT binary patch literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_gear.png b/media/img/icons/silk/page_white_gear.png new file mode 100755 index 0000000000000000000000000000000000000000..106f5aa3611a4807ec8c21701c631730275089a4 GIT binary patch literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_get.png b/media/img/icons/silk/page_white_get.png new file mode 100755 index 0000000000000000000000000000000000000000..e4a1ecba1b60e54f3777717ed105cdde745b7184 GIT binary patch literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_key.png b/media/img/icons/silk/page_white_key.png new file mode 100755 index 0000000000000000000000000000000000000000..d61648452284da1bc28b10385f95b5d2bf027901 GIT binary patch literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_link.png b/media/img/icons/silk/page_white_link.png new file mode 100755 index 0000000000000000000000000000000000000000..bf7bd1c9bfd78d689c73ba67cf914182933ee68c GIT binary patch literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_magnify.png b/media/img/icons/silk/page_white_magnify.png new file mode 100755 index 0000000000000000000000000000000000000000..f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e GIT binary patch literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_office.png b/media/img/icons/silk/page_white_office.png new file mode 100755 index 0000000000000000000000000000000000000000..a65bcb3e1e9613cd9e4950850db43d7025a5fdf9 GIT binary patch literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_paint.png b/media/img/icons/silk/page_white_paint.png new file mode 100755 index 0000000000000000000000000000000000000000..23a37b891c2f5faa3b8128d45373ceab794ca609 GIT binary patch literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_picture.png b/media/img/icons/silk/page_white_picture.png new file mode 100755 index 0000000000000000000000000000000000000000..134b6693687b2fa5fe36d48a9c0b8001f937c741 GIT binary patch literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_powerpoint.png b/media/img/icons/silk/page_white_powerpoint.png new file mode 100755 index 0000000000000000000000000000000000000000..c4eff0387d5888c638ba09473ba6d2369f7b56f0 GIT binary patch literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_ruby.png b/media/img/icons/silk/page_white_ruby.png new file mode 100755 index 0000000000000000000000000000000000000000..f59b7c4365fa1720af1aa04eb47167ddaa6eeed4 GIT binary patch literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_stack.png b/media/img/icons/silk/page_white_stack.png new file mode 100755 index 0000000000000000000000000000000000000000..44084add79b9a0fc3354d16bbd4b4b5ff8095da7 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_star.png b/media/img/icons/silk/page_white_star.png new file mode 100755 index 0000000000000000000000000000000000000000..3a1441c9a12062a4bb3d706000d3ca14399aebca GIT binary patch literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_swoosh.png b/media/img/icons/silk/page_white_swoosh.png new file mode 100755 index 0000000000000000000000000000000000000000..e7708292adabf4821612bfca032cbd019c63180b GIT binary patch literal 634 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_width.png b/media/img/icons/silk/page_white_width.png new file mode 100755 index 0000000000000000000000000000000000000000..1eb880947ddf3e745c29e8d9dc90f09c7e6e323c GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_word.png b/media/img/icons/silk/page_white_word.png new file mode 100755 index 0000000000000000000000000000000000000000..ae8ecbf47672a874c0958d0d113a56162c2bd364 GIT binary patch literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_world.png b/media/img/icons/silk/page_white_world.png new file mode 100755 index 0000000000000000000000000000000000000000..6ed2490ed1432d5d667a76235360824a1088e928 GIT binary patch literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_wrench.png b/media/img/icons/silk/page_white_wrench.png new file mode 100755 index 0000000000000000000000000000000000000000..fecadd08afed92536be91ab12d8e37b6bf410d5d GIT binary patch literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/page_white_zip.png b/media/img/icons/silk/page_white_zip.png new file mode 100755 index 0000000000000000000000000000000000000000..fd4bbccdf1643f4ff5022fbc59b82546e259317e GIT binary patch literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/paintbrush.png b/media/img/icons/silk/paintbrush.png new file mode 100755 index 0000000000000000000000000000000000000000..a3ecf87784e7715238421dbbe773a54f602c7fb9 GIT binary patch literal 548 zcmV+<0^9wGP)_f5P$T1}wR3qlt(jG_Y0Zr52WH59esgOQSo5P}VIa-lfSOgY zCZygaE0|WSnkNR-ymix>c|SI-nf-6e(wcueyQTi$-RJ-R;B=$^K+VoLQ)2g$Ws=Pc zm#>>RZ{`29@OSkoJqNN@e;Py`Af1JrY`wEZP%6mtqXSk zPwm?BzjD%=|3xj6wl2t5m&ThH>ZdPV+c10m|F)IK{&%jw_P=uO$^X$kSO5DKE_-is$J8N5P(ZnF4bK|DPP6d6{}iR@dma4U zGwNI63={10?wsg6GrMIz9=9gZKjA|+f3>GAK+D|GJH82pDTdw`PIL|}-E9ldO1tCE zh!Y}h7`H{Mc=~qbQ(FLcAgsD6T*IKskM2jy_-qNlZnsM>1c*c;%G7om9HAYZ4@|gr ze-YdHGL{@3SlraFMS}W1yBeCDwgj)70ffV0WjdWkyAqr__<>5Lf>Nmjzuyn#`-SF| zCD@#CrZM!vJ3OHFTxO9ZIYyfsjRp#Z0 zMwk*D4u?7#jpFF&2#1GEG`Byu|C}hU^-i!wvCE+^rj9RT$?eTa}EEYkR zMK{!HwbGGEfk1HjC$2x=82slTsZ=WU`uaN4eVfe&i9|y3`F!?;Cy|z1E>{~228hLC plE>q<_Zv^tYSsXk%l)sJ)*onV;!t9*YM1~3002ovPDHLkV1n&hO1S_4 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/palette.png b/media/img/icons/silk/palette.png new file mode 100755 index 0000000000000000000000000000000000000000..73c5b3f243d98d089dd9e025edc81b939c1a9320 GIT binary patch literal 856 zcmV-e1E>6nP)PbXFR5;6x zQ`<|^Q5@e>|3Fq06ckj13SKAzrBX7=2LmNa=VjAGbC_kBmo!b(h0(lh&dtlb&FNfD zmuquN(K1t)x?D|-M01+g{cLIqvEiq)K|Q2K51*IA`CQKDe7`gRw4E?o66yPi8&Nn? z6l%~H1nUQ%T@&i^1O5KKw~aW)k2+%HG368DWXx)cVb)1u?vucz;=oXT3q3jhU%Im| z1?(s=#*a)g@)(;l>H@5fX<;>n14d_9M|`nnP-6AN3z#%q4DzF(Nk5nWM_|14<{lEc zYPuy4KilYl*ag-mA8dVe2Tbuq#03kAEX>O@@Lksg>YW6tl(V+B2dCW}0wgkfx|Qv4 z-D>azy5k)pmaZ6BhrO`cMMsS?2x;x!C{kX=N`E6pB`Ii0bgLj_hNq!8%(hX_#U?!j zKiGk=Hh5$0c^KwfGl^?D=47dOtiAw2KNAm$$b9o7%%}<>OK>*QNXr%9w1k|LfQ{U2 zSbTi2+))I}Pzx-B&9LZXSZvF~o2CeGlzvc4uVc3ME*4%1(7-xD(S|uUCaD1_sK#7S ztY9n_un1WWgXlK28Rs!v7K;_~=D2b`P734*5Qt!^h`~~a5OuM~Hfisl25mar^a_}} zg_v*2Bt^;WEyLcAGWiUsw{`FkNI_Ti5|L(1@j^*TA*!PfgVy)tDpxOv#%F0dOfNa0 zdc|1jYs3&aBQ0Zq#{l)Z8sgGaTq&(WaY+Uil^l#q(oh+BaNO|=WH5X?GktSNWOaL* z*ZNp}GN_(f2a)O)VOE@kDJ~t8MZuVBOvi$ni}tLGC}Zpk**1wJva900hs{igrph=+ z+^OPVd@W&MNyEpqoQ;kge+VO-3U?f3JDTsf%0@_u%bjJIsY%3=wv>=dpyM%#>wcRc z+$m+(U9dwMf67h5I&QPOO-M5_z-8e1J$HL#g&=&d>pz$2H|k=JCX$xdMNx#CVVzw7Br$VwirmQyNV@gr)$8lP5a8@sX@X>Dli-1k7mq;##Fp9!vA_9^;^gT9 zP&gbR4}cpAfn4PTZUM;;=G@;S+1?wugFJxT@euH|gQuOIga4}@AmEnvC%Ym({+M9j zVo-M%iVA!`GEJ-1T5@;H3^V)O0~j7suz;J9gdFkMB)8`tk|fFDp$n3T<2Y?Ln@fEF zAw}jWIBvqt>2x}*t*xPfNLgR6*9jr;*MT`691n(DgqZ(davP zmnO-~_^B!6Lhj^Kh<}!mM6FgE5@&Y?c=UF4wG3R!9vOLdDwio1i$qa0@&m+^F-hDazwk}ll-1Dc;27nEK-O1DzqF;+xvCKUl1yw-F>su5hSe&Q6 zd1nGh{5?V(0CA|b_?hj9v#84YIfF7$vAk&paR3!TtVK+Sn6TEt|EUJBh%@V)?=D{> zW|j#eOFG+*1PTX+xH9%m#R}Fa&bmJUhgbv7BF=$=Z!3&m?IRxZH+3!)BW{d+SOs7W z>IAids-lshF6MLl!6%A=qq`-^%tD29U5rdB#`J6%XB2;>11C5uIO`DW5T_^*gi1m^ za;-^zl!R@WI6>&p2)tE*AjYA!Cq~ey8e}~nq4IkACngdWzJ+|5kLcOkfNyI6aZ+`) z4zbn0i>iT|Q2APRfap0wiqTYrbIaCxC0R;+m_%U#i(9u*!|M51aJ}!|~%ZZ*AV!nrH z6)^H*axx9leCK>fZ|?Hc~wO$JO;+eDygBY-q!vzBAX@ jDN+qv6;u=v4^;RK&~tO2tvSZs00000NkvXXu0mjf1&A?| literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pencil.png b/media/img/icons/silk/pencil.png new file mode 100755 index 0000000000000000000000000000000000000000..0bfecd50ee9f5bc5828f0c0745aa3e0effcbe250 GIT binary patch literal 450 zcmV;z0X_bSP)Rq1}l<=psl5*5Xz9i;M}s*NP=ugs7Q#8Z;Dyx|}!`#}xw_C3!B-yaPC&0j)XcpuX@rNfq|q}N(wJOjA& z>u+z?dfJEuLePrqzy!)73pvLjxk4d6XNZt?hm_iYES{i}J5y3l?}PPNYDBR7oPc~6 zL^d)Bi4Q2L3pnp!nFxN9c2E+=@XAl&+;2m6a~kZj1r3Mz3C=hmUG<{+vWR@t4q?fJ zhFc(ozZD#Mx`^Q~g1v=K6!QnfuqyD4>U4EjF0eamL}Jx| z%&`kR-H+3GBYr*Qx}frLU4`%n9(`uSomzw)t%%NagXkA*R5Mbv9VLDp1wMo$cOMa~ s3Wm%r7^bwK$2$}-<~D8p`#1iScU4^XCLAA~0ssI207*qoM6N<$g3sK(Qvd(} literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pencil_add.png b/media/img/icons/silk/pencil_add.png new file mode 100755 index 0000000000000000000000000000000000000000..902bbe61b3e64a9e83333fc17bc8dbb38de2cf9f GIT binary patch literal 589 zcmV-T0?rbKYL%|LWA_fWIdu`2D{$SO5OKC8m-@8*p<)!2cUdv;Kd7c=G>` z$EW|Fn(FlbP?O<0Vr~Eb<;wE^KOP?a|MT$~F#djf@Bfn%{QnZA`N!MC|9?DM@&E3+ zoc~|WF9l}pHx`K1jMaes6V!>;jA6jePPPA^p6$b`dFe#2|9Mj)KBe{f z|Bq~O_~cokR|7X-MzVqeNb|$f8~&eInU0}(LBHGo#?^`cw_KU}|H89f|ND1m{SWWg z{coNv*#kCUa<1I}PY+N0|MmRh|E;wq{}0bJ{D0?2?*H?1y#60=Hu)dh?(%)(aJUfxDNBtTRAiRVBdDb0dZd)pL$P{k)kNc7^C;B3}2}V7~LIt{1J-u zhHUbkuFT{RQI})I5UhL)qs;n91WqH1y}Go3nEOb^5S){rk&d_VLp;L=Zv%O94ll;UWY2R65rz&!x17@cl;CAj}Ns6%i zd5nRJ)r9X?F*V{u^c>>t)oOyZLgJ?ibJq@?o8Vd*UvF46f4UHmRbSVF|2SWIEDX1n z;BVSWf5%?^&f2l_?*pt}-!E-L^YwrR>t@D1jikkgEQo!)?mk$6_1@Tor0i`56;e7( zEUJ>)1XO=cFF0!1!ZB+Jo)hId80xNhvbwq9`W=^}E#<#bon_3QUr(ZC9Yc0=ZqO!N pF#MTD>UVajJI?%>LQ;b@|2K$J-BF0k8QA~;002ovPDHLkV1kb~77qXb literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pencil_go.png b/media/img/icons/silk/pencil_go.png new file mode 100755 index 0000000000000000000000000000000000000000..937bded9d85c849e8f94c11d9c04744622b6488d GIT binary patch literal 666 zcmV;L0%iS)P)8Wj^3Dc;Nh7)Vsv6dp$FpFhaq;+AFZR+9Q*|``QOHOq0+`PQM-~WA|=Y0tP#QzlU zjh~&FiBopjH?OgXag&EJVb1*cp(`tix4>^L!aJ%8p@0YB85-W3Qn)mtUcTuFPCh_5 zFp9{`7+0aGL3l_R!wU|7A3^w&71O;J5cE-8MFq6+XowfQ5_DkEUxA-KC0?70G2LAY zk3ohto45*oe-^hpQG^2vbN7mJZeUSlOyXme>$P8A?sO}tH35s93jSh^XL?Il?B-N(GohGAU+j4l6$w~;CB*oW5PMx5)+N2;0_Pf`&Hu^ybr-GWl75bc#2=&#=mr%uxI=X7>y z1#@RCc}Q&_##ng6KmSJd$a5(T>mXDS>wjPW1*Kof&ZRxP)A1 zOEJ*J2%-6P-uFsN(314vc)81apZC3Y?}U^RyNqtPD}x|FyWJM~eFHm=EXyz)4*%_2 z`9-hS>nKH+LWpCvJW_K{ee2+Qy$;K=iUCm+-8LExR4SE?bDE}l5@MQWF@R2<=i#hh zg==L9Gagssz>e{B{#CAk4$LM@iPnXHWk?Xw`LOUEW#s_FFc8NvgbK8&R^1S*OrR37 zn*ts~sNlPI6{FG%N)TkF%_zHVFy=yhaAh z=X2P$4d3_SI1Uzzg$DC~VGUH@|Ab+5bP-s zf}lekDhv}*C|@qtVsuz(vn6}P&0T&o-DI`Uo!fjFJ~Q*35i_Ha$mMdDBnkcf{Zg+7 zG#IMN#KgoudQ_hb4-XHS*?AFZ0rmq;B7&;ooFj^&tpU|)^=3~`52;jYz1Vw?_a0Rx z48yGfs!Ar4;mpWhc0@`=1u*u+HJ)~V-+qE9ityeep>g}15Cw(+L(>tztGYcP2m)%g z8WI?B2$&H75*iqdO`xhs2m_;F0wREbncp4|h9RoTvyNF*b=^GgJ()1mIAA2nlS-vH z{P`HIt*z{P@Px^$-ALOK*RoeESzS(kt(5P-y!Yv@)PG_=pSP~AF3RQddS^3Zrucz! z(>$lzPjjfbjW=`88J`{H>zAdW;C~(z3I$Y^g@pyojLC0rIeD}bA9y-jF5#s{_ldIr z*MrR~m>JGF0GxBEDnFAFO|qNb_8S1)y7-tQ2RZ=K!R9lnDvOJY#BofiR3e>Dvz(Nf zD~>Vvx(|TCSA7&p(*S=q07PV^QmNpaBM1VVbHs7Xh2xhQpB^J7;>ApkSR&qkd literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/phone_delete.png b/media/img/icons/silk/phone_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..bbe4f8aba2ce43774553cde9ae33a99626fedfc8 GIT binary patch literal 615 zcmV-t0+{`YP)%*{aNai6YXlS;4Z!H&hL8-fhmgKTOQxX!a)O6V@-K8Cag+^@ULl&X$4v<*AK_y8;GVul}2y`Dd_t?kJrLGh}bvCYd=c z)%mGopJ%7l zz2D3s1QO*{TDvnaF!X=ey&jy3-|>yAN~u&Loldi~v_x-jFXfI-*5AM4z{{J|s^3`$ zDrHA-eA~8yi2SZrt9b8;q6qIji9~`__Bx;5y`}W0jk0Uu*H7W=iUfoFHiKfZ_-Jx+ zacK@S!@h=-yEBPe(i z!9ay7UV6}j5OUI9ni4`5Y%nw>Hf=V$o85J0L$(BM9C$nL?Y#NEnRzq9bzKaTY&Pq* zS}kNU8SyW>g#U=+I4Befo7!dmYngKC#= z-5ZhYsr7cJNXPwt4fq1HiGYhcM+6>@yO| zXD@>K)$29`oe)=`;M0Ve`z_rRHM)ytw;{NqJ92_6VOk@C*y0Ex)o5ihL^ph1#5YinO zyxORvZUfgg!GxzCWTNIM`)KJS{p1Ntor?_ABp3_=gaD2H85Y)0(rUlQOh{nzR6z<5 zEO0De$IN)yJIjF82x73(uJW{bfy*E6{#GD4S;+brQ?z@ND2z~($5eI$1QYf0H)an^QOO;qRuu9YpYp4SM;xg>M8uf2%- z4&`D7e%l1>UYk(D)RldpJ=nl|j&F_OWY^F0mWv<>mGbk{ZJaBpo;hQ@c$JuAE_G z>kA@^Du`N&ASK|$QI{P-M0lOJM3Q-5L||^Kgud8yZZAIFCr~v!RYRTlfoYQIjVYQ- z@`-LI*iLI^b+d+Cy~4MZvuq`bP?tuvn%~Ob0#1}j{!glo6%)=lNp(n3tLAI=Jjyf5 zcAt}odBk@Td^~l6M0_0&@I(!DhKN#_UXGgLY!5ZXP>M6kh|a8&xfSGGV;!Y=6}+16 zW8(80yiCP&qNo@dN3uwC4q)Po`JMYauvk&f<(3vCC`5{z7@6s%zN&%Vg?>B{1q%?$ z%_k=(4^_X?%By$TULFLLp%=p(3S@Dy@)`hl&UZ8LsS648`vi-#v-`XK+j+9R)hAFR z7II8S$C-?d(caWU$51O7Y3ZaH1P*eI^=;vYrRAY}4b_cQ6xFiu{R87uV=OPNcLol6 p&h>5K4&Ww`4Qv8k6OW_qzX0uFt{M8}XYT+2002ovPDHLkV1m?qHvs?u literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/photo_delete.png b/media/img/icons/silk/photo_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..18b67df43aaa0eac5878317173146b3d9b1dcbd0 GIT binary patch literal 703 zcmV;w0zmzVP)E*UdrD2cU6 zL=;sJwLC#yz=`8-_cEB(*e?>1AKiu zNOgJ<--)7PM2btu+Dp1gE<;I?x-VD5n8Id~ED*w*PD%={_G2sL||uq&`2V z_~}Km={ZusY9dUgAdI(_Hoohq@7)$HzP78<`F?1c)kVkm`LN_N*5hrp&hI-Kx|2(@ loni4BC2TVW_f8GCzTapmv2Abd86N-u002ovPDHLkV1l>_I==t_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/photo_link.png b/media/img/icons/silk/photo_link.png new file mode 100755 index 0000000000000000000000000000000000000000..e6bb35fbf8a31d1535fd86db6c0c6ddd1cc5fcef GIT binary patch literal 784 zcmV+r1MmEaP)s|6h%ThKxv*&vL}(yVunR&6mG%%uQ9hSF)I%Xelo0h)4-xd( zLqGN=k%rVmRQRAItqZ!v=x%F^nmVoH&V19IZ?+#Ff}j}=m$`HAIp^N_#${O+{^ycL zukHIQ17jA4Nia+XlVC@~u%nZc?84gCW-!wP$PIU739wl$o}wIMVAN#S*o0t|hk(g< zlMVqh4Xn&(kzZc@C*`t=a`=_NZwD47?dBH;-+~(eocI&;d__5j(jE0SJsu3+LygbJ zi3P4$+``!RyM#N?T{EN(7)2Clls8K)VEHK;XOk;i#T^KaXUF!Q$`my}!b`0m1-3#3 z)NBw5VM;%Qk;VO3U7zL3v=%<1K++*0%&gbq*~(d*pS%Cd zf!!nVg;5n>7%O0UbqZazGSb=xG_eayYpw9IBTyIHu)YzXS`oW>58Fy$v$n`NL`nk? zKh~o<<%Pfc7*g38SZ$Bd5Pk?eZ^BOBE@YbekoZP>vRsf%PGIr5WHE#fqgm9`-E*P` znx>&)z5%b_kAaowINIHZ63LBBrU?@h)licuNVYPgdA55>F@1RiqOTJNPIltzg;V&v z>_Sjc5RFEWNoR2D=52}#2vrF<-hUD5r&$QLGRR7WSH_yli}DID|1g)X51>%Uqqnyg z?d|P|$K!~_V$ky%;vt>alvjEk2Xl!8KVh3|Kzc#tF9!#1@RK(*Gz5>w!*ljX_S{br z45wp2hH71Z{*94Hq`9%N@o7g#N1(2*j!BYKmCa_6OeW!WyAcY7;P?B9*jQ3kRTv*1 z|FVT391e@YU@%IG!-}HRP?Jb$A(zXYp|~K+@-W41x~`k)bowhf>iz+8udW=YJH@sD O0000uGbh)OD` zgcc!@P()C+7(|Syv{2NWl1}%|Ip23$OfzL^1Rl7H!-a?UPH0>AuIgq>Y&*abtHh}bOQd8rj^1=cFY2s6_~{FH~Pqa?m7MUmIL zXOcRvh_#B#q^Swkk*#g!jm7WXi&VJ<8 zrFU3SGIfR^Sgcm?D>^DRQrV;2ce{u!WPvAN_Ooa<6KaGN;mE)!NfIOa2cTl3sg$9s zVVo(vQNs))-_MaGw`pzK zMsTql`^! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture.png b/media/img/icons/silk/picture.png new file mode 100755 index 0000000000000000000000000000000000000000..4a158fef7e0da8fd19525f574f2c4966443866cf GIT binary patch literal 606 zcmV-k0-^nhP)Q2rnAt>LM%-F zK|rtwgcU)}7x~z1Hrcs5bH*ZO$!>xO8K#?==bZPQ_ecnV>#P`H`QzGaRhd62G_&rC zTLU$c7_x*nFP_dW#Q+*);mMHE?j)HexK784D4x9l_tfpz2$@1y}9rkF+ zI+J5NMWeZyObc!d+rUc=>D+uOdAOg#%+Ej6h+wn5^xPmVVH*Eu446Y0A_@ zo$rlds-+sL10DbwHdg4=I}KDOKH)5`dDSD>$*Y+lYhxmAcGuF-%MWsHUJr4IgaCsM{ig0 zSSBT=s4DwP*iI5?#me_ElhaWObR8DO+&EW-R6_iOTG;>$!^9AfH5RBU`HBdsS8XyAx|wUq)E7h=Ss)mVnuwi!$R3b1!m9&Tc8e2Ah* z93dsPSIWMcb|P*JsnqXhvE^WDxdW*bQYjAj-)O1aj{;`q7kRbTjhQIKR1t1J@W^=H z&KKSDw_e_z=&`ic2;k(#VF6&)C&;9iap&Jt(%M18^cYK-DUQ?~rD9htLzB%~biuWVi^wq=sbuS+r^MZt^XM4mKhUNn@-HDRMN|w*p+XTw5ejxoBfqGYGMX z(mxA;rQ{;Eh;XXz5&+jv+-LAZKk(eOLY8>^WN4-(D|NlrfBplBR3bVVA7LUsOjp|g zy{|9gnht;`^xt0nqUO%>o{FmI&DMtF)b45G)516-?}wS2P4@j4U=z{{Tmg0fDWHG! bUcBoE0(26M^-PUO00000NkvXXu0mjfKPpmF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_delete.png b/media/img/icons/silk/picture_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..cca9f535d9a699716b2c735d0d72374472b9e1ea GIT binary patch literal 744 zcmVP)hQkw$4DenXv_1k19q1k|i7>6Y(!p>Gs}5>iPV z&!aPy~rgIO_{C4dkZ zsR>k_stj1H2h_AgX+YF5TH#m%V^&Vp0x+fl@M)z~j$m*Jv?7oSAwrZ(QKF$u*tP{m zthQiG!$Q<-Z$2x93SWCz>;N z@|O=~WGn`>v{S8}AU&TvrXK^HBjlLS_A2{fi z9kE7URXC0c#|c`x8VSriV9%*u{Le%1vY)0{oXs5_c45r)I=(B4=z47DhP@!fFO>QH z0C=0v;craC(Thvo`;ypNY<5D9c=%{=VqZ;}9mcGE1D(-CbLGP`EAr$5!D5yQP@1<< zHq*lVt!kNGcenM0nj_az3F$c2B&EFMYtB~ns=5AO0D$4{_RHnM^m$u}4rQAu1Gf)n a7BV67Uig7b0z_wp2kkRjeX{OGU(8H$_BnrJxI2 zYgf8Z1aYIHLaSgAOBf`OQi|_q z1L^n?A4@G9O#>X0iwC~zJ`7+;C3bJy(9+;Iju1lU|Kv%CqmXNNU;Y5h0cL$^+qNTq zyZ;7{DN16HOnRJzStL@D{B(k6FI}qC3Jg*l-I*blLd-*rAOcO((F6qA7@7KUY-@y~ zUm}Vl4BMu?WeM5gYHF=|q+ICA0FZ#D34AqyWxkIeO+9pNK>MVS5NOzoBR(E$7F1q?VDFq+r9-q zcNwcnFw!?b=mk?=WoG?52ZK`wiKQf#k}v!TdRp2LW|5}OF5IPG7i_ZcJ}<$N=fj|Qmw<{WlS3PTs~E*h30u3Wu0+!MsALn%mSe|2{r`kBGYM;ZG4 zA$DsgUOp#BS`W{b9~5FkFJNk1ng@Oy8aBjAUQTxD9n1zdX_3 z|EYp~1lYByuF~C}HrA}jpiKW^Wqe}awv&Gif3Bf#0dDv^qSF@P-T(jq07*qoM6N<$ Ef^;Qtp#T5? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_empty.png b/media/img/icons/silk/picture_empty.png new file mode 100755 index 0000000000000000000000000000000000000000..abd2b9bb48252338e831bb54f2fd76037b1bdeef GIT binary patch literal 463 zcmV;=0WkiFP)h0wrhpX|Hs7;Pt55ta+?_WPZ?E%ty zcl7GX<6#&ib$G%g0Kx`)KASRL^ZnUGrx zCTlifW8bF0Zh;X~MQ7g4Lm|_~ykU(Cppw z+zc^}2l`HK1P^+B{r2nc%R}+A|9PB!2fN@?ZS6gu^9@CduRn)+FfsrD002ovPDHLk FV1m%L!2$pP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_error.png b/media/img/icons/silk/picture_error.png new file mode 100755 index 0000000000000000000000000000000000000000..d41d90d64fd3d6b4416c2b85c589d032bdc71c9e GIT binary patch literal 755 zcmVVGzfE-|p@0ZqAsP=fxPqDMk&P@d+L_YNLgS5CkC>7CvglMzFFJY-|-o!A5+b z=|ybBs38g>N;Dc&G%;Qt=I(ay+Zl`CBSswQ z#|XVCtO{SJL!J-UQKM@~(a6dDITA7E2Q(F1a2yxMK7N0B1$U6)?#%Q-}jk~LK;H{Mdu0g3t$Xtg(#^~ zu@U8JL@bs>08>RJA>|lU=d0=fsLlZbnwgo+pm;=*5ZMG{(zH}uj;$IcG}-TwUrmvQuWfY-v(a0A7mBKGMB480{k`Gwrd zoh)wKz%qS+oqoMgL{)e>ag;=aM1-zroI*z@>Vi`fQ`=NeGJS_->-rcUzJ_7%FMz6I zfZcP(0>I5rQkwlj=KWo=`2$cHWZ>#;wjMdfyU_f0 zDIw7asE~YnL~i>D+Nb-2f%Ao004MOw6jG(9bt^sD0_(B`@-3UG8+}Oq^7TmR87gHq z^{z(Zj|9OhI=go`Hj0k}n2Wat&x)EtoM`^XiQA(4=`EcSX1hX?Zv&{tJh}0LO}%R| zZXJZXczp5nn2PK$e;NZ|;C$hIzVB+g>%2v6@sAZ9+;BCYpAYe>|IGE&-@eX9aWHtH lx2&S5$Zx4XDmBR~*Li@40hl?wvRqnZ(Ao1QJ1rZCaJSDB{Laap9suT~%lorMMMz>qEQ4lo5g<`B}Oj2V=n8e9sGWVQ&&hO_UijFU(&+eSXhr@Fo^Xu=UKZ=+y zSDmER^Ln)XSd1Yp^2;}$?>z+&i<%Qh5A<$I)6^JK;J=ay1fO&1%7d?gHDJ|Bk|e1) ze|3qB8Vxf}f6qMSVjZu-;&Pcg4?5}4L1MZ%eY~F_#ym%3=OKy;L-P9AJKpf3Z(ci39q!_wFi{`Mq{ zJ*0SVfxfPfu_0%B_aJ93?kA`cBW^;RWZPkwP68J7<$6(vG4fo-LD8L1PKVrY<-5I?FU$KEpAQ! zS%3drRE^CW_8Q6?$-E<|Fjf1TTs&TK@{qG^8|>~q$V$E%-IyGy#c9#hk-YPRo_%1< zGfK&Ph7X>e4SjeC1Qj0Fr>RypGdgpPYZD_2&U4uO{M+dFqGrDfI`r}vU#Wf3nK_3O zN9G+nx_7Z};4n9*uQM`neYIg%KAIiYyXMtlye;pYi<%$y9qPDx|Bpvb_;hwy#{vE~ oFmTp1gA_Vi5(egnb@KWBQ*sVbcJX$M%m4rY07*qoM6N<$f(SNMBme*a literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_key.png b/media/img/icons/silk/picture_key.png new file mode 100755 index 0000000000000000000000000000000000000000..667086c0dac0f81c56a83ec870f5bc6b1c730c58 GIT binary patch literal 794 zcmV+#1LgdQP)i(Bs^(FFyPpKpHC!eKyq78HS+{!sY)gF`!k>wO=0{1y%vg)C55giVMHh zNLZjDD)e>F5_xr$H7qVij6Z6l#lDZEo#S8jp^Xs#LS?4Faa;Ez>{UJmqCY1?^_`0-6PZ0r?kYkldRPFs14}gH z1;XjS=qQg+n7Tt=o5FGD5l)Q1aUPN;FQ-#iigoT)M@4j0#P}ZXJiLe(S&W*&F-zdI zV)Kj#S1QSPWqCw~o~UE;wq4zOL5P1)mZW-%Wa<~X_6%XOpAovjgWD-GO~`X?C#uVb z4qu)emA(`|jgD3KW!etBzT*Ajdf~mHPuy(&G*Y%PK97pH7o`P}~TW4UqW>+Ofv)5*7e-t)=%JInR4ZOz4aWnyCP#5ZRjUR_W3 YH!v??(E);vF8}}l07*qoM6N<$f|C4jrT_o{ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_link.png b/media/img/icons/silk/picture_link.png new file mode 100755 index 0000000000000000000000000000000000000000..42dca7440be7b2b2776faab865b7347a8bd14b6e GIT binary patch literal 835 zcmV-J1HAl+P)P(65Slt@yYeSUmI*|#LP@Auh-f!mltQ}@UFj-f zTy`ZC-MO$`2%;Ms5JAvd7tz>ITbyM6k~DRa-s#*s-;awR%^2|P-p#`~=RM-HuYOrF zM!eCEjUOov%l4kG1mES_+pnFz1R#wS3$rhm^1km2ArkzbItH}ra{arzZvy*(c4R!y z^Tp@O59#oLJ#mNO!X_!Vg|dd7-4wsw&C+L2AQ|NH*(}W^J9t9zXs3^6BOu6*ARTe&GtwRexKC3|onqtm zO$IVGgx0v7JjX{D$oK);nE%e=iGw>2&ZCW?8*7fVB+`9_T;Ulu?ypkY`~V{(2DeV} z&F)Edo7+!axbW$fm6esN(prlErcYl&E6w*`|3Lro0p{lB2*Z$#(NTW*Cfe@1shkl9%GZURQtpgZ5UN*>kV+$<-x(zr9LuG@x8AQ?J)q`gn;(qrtI} zlWO7YtgKWj=N;b_Elii^3NP?zJ)*xq3&7=z@6nAF^YimePEIm2GsE=sG;tjB>`P}t zfNVDF$)prte0lTUi?O!lKQ~n}(XRV|c=!Del~PJBE-sQzrvV7V5UmYAeS59-{96mz zYPH%C2Zu2+F>zvSZ0!2f)YQ>Zsbr*-N1DwhYinzGp2yJ85QRbkrPR*)`nt2cyxiyk zjE|2ef*>fT)9D+Rv3n7{sE}ALP-~3!5;ts N002ovPDHLkV1iNgjz|Ci literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/picture_save.png b/media/img/icons/silk/picture_save.png new file mode 100755 index 0000000000000000000000000000000000000000..777fb5d2e6a8418c573972246582c21d2c4984e4 GIT binary patch literal 755 zcmVe)^Pp+~01yB`w`9=u(Ho~0 z&q0|Zy>{}2gZl=9K}x9u0000cnYNkw{OYaOaSqCHmHYkvAYHn)ZsML%y6Mn?Rm1M4 zCbIimL%-gdGZROY_IT&jL)x4YKv_2wMMsgSixr3VuIl&xwpoodZKLe>9X|MwKbLly z@9mW{08m0kQ6yEY>2=p_>};yqiMnYtv8~_l+pdQ83=1I;07}RxQW8y8wNsO(vNNsJ zxzT2%smQIeNFo9Nln_CYl7W3j+smTUwfx(8yZemmMmgIvlXtBAH}d|cf5_39J9FWB zT>bgZGbKb&6v=F7!JU=6<_61l#uG1|c+xA2v%dWPU+)_++yuBPsf8gS*uy8tE)TNP^?wUn|FBDi_)Ep5))oIO#kS?(pBVA^IE&o0V2 z1UkY@NmW(0wrgcXNO*bi9DvTz4L^KUm{e2mUH(gvXxc2dSs)?^X1ZCKKmdStIIqc} zY8#!Ri;%QZN+O4dtZAm|x={|gX;Yrg9Xs$WDG3lp>Fmkfnp~qGh?EV=o(rGc zc5iE2*(=lK&%R!Iu5ROK1ORQ0xsI-E$A>rGws+=HNnvgLk2jzGKw)59)ygxcj-Lkr zfNySo7mq#2f!UFlj-4>yTcBWLvS9zN#!QbgB`G2R0KijcuYCLXBg5zC`|}3n1DZUQ la+ac%)7bB~m#l70{SP&gLHlD?H{SpN002ovPDHLkV1hOfWCQ>J literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pictures.png b/media/img/icons/silk/pictures.png new file mode 100755 index 0000000000000000000000000000000000000000..d9591c13f67cac8e13632e1c841f7debd1417a5e GIT binary patch literal 704 zcmV;x0zdtUP)W^i!ifsTc(=K1_V3&M#zHR|lg@#Gff=58Uzib9<$t0J;KqX&BUR5k)rz$& zB8cFtCF~4|SkfeZK0aC--xN^wy;E1t?BD8nzWmkmJ4KipCa34l0-FPtBg&rV%afN2 zgWsE9wzM;K6tG3NTXA}ea>>OQv13!S3uzM9$46_o*8xQ6&4HCL+j_Bfpv&{BC`w^1 zF1}kXxg=@s7HD;HdhR^19-zvqDt;>}q`SxG>C8uWsk!U~u^=L-t>B2@I?m3_$iUdt zY>+1Lqw&$&NLPoX3PquAW?h1I?p!{72+!;L*RlW-rlx;#dhQbN8zA&r3m}CfJ#G*x zp4Z31*EX*k*Xge=5oLx?i`zNA>kdcv??%LxH4CUBC|U7?JP#?Xk^{N5`2He2rEOSJ zY`MX=R)kfHh*sAC4)&WC*-o##!|g6raU2I#Scx)PNkXBkgeIjKCA3IE1y$N>fGA2{ zOw{KO8Y@F-YA9^{3y@eEU-x1w?+8sq(AvYkfy%}^xOc5~AK>QHtKmwQ-3^sNYaxgW zh6lzt+!*2ghff42?~W2UMkn=!+`e+&#r4!m&t*Pi{kVy<{yV5rBn%1W8t zSc#vBL6V!9;o`ktd-^>D7(tpD{uAK>89pW@UKU2M&7k1<{}&?u{~w6_M>q^XHopD# zj{zRGFdFC`m|=JgcyRw`*p4$_S3h|7hvD1L|3FO;TfwpQ_dj7T-0PBk52V5r3LXh+ zs&njyMf3kZ3=9ldq8w*5KA0f){@b^|?-~BUyz(C!4g_3)48VSdx!^BW2jDjVJ@95jSE5A%ge_ins}gi!8E`O6kJ1h=>~tC15ut zhN?)5E3L|iZFJF=*g_=_^DuEHTaU-1<9YtxodHgl>v@>xAxV-FEX%^_baD=dL!A@w?eOp=8xA9r z$snChBauiTl}aHRje-D@{otVRRsdtSzw(Ddia41}D%C|%#M#-I0`hph__Dum`X_*4 z7_*xaWU-tqSCqx%U9ljCczzCMZ!dBK;IUe#x$SLaNDz<55s5?;ahR-}o}MBQ2*68l z`F>+(2iE}Msj2D2$_lc(ySSL0MT}t}2m&~cLx}9q6mWcetN>{;SX*CrT>(6Ug9d4F z5m};M%*-G$F@fJ>V-S{>KqG|D=L3xpCnS{LVPkU>?`*b81z@kLQhCS6k)_L&*^D@y zW22*p_V+{V=|O024sN$wXh+oA&=3Ry#HoX*MuT4s4fs@Dt;@Mg^Ccw@tmWk&jv5;!R-?J}*4AEruB^=3 z)as{q-o_UN1^M%Zh1xg8#irLqMY?&F>VB?m{R_n_>>p`!{|5j7002ovPDHLkV1lz) BL~;NC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pill_add.png b/media/img/icons/silk/pill_add.png new file mode 100755 index 0000000000000000000000000000000000000000..ac9c2df6a48474857daa68528728f6071bd49373 GIT binary patch literal 797 zcmV+&1LFLNP)wFU>XvLNg!qz8X`KdHL8Ic>|z&@MT9el%^8`LU|occ zQlgXyos)^Rc@rpRGB@Yu=Fa9hZpXGU$AAQ%iH91g?p_k#dfDp*h|kV24A$4zd63m+!+VoS@kfBc zU{G2}04L^xxs05c^v<`y8MCng!}PT8H-L3uppDY&5ha2^AON4w$BR9rm9@1sI2;bx z2%PheO-|w$fTy*!EjToU*whrZIyw!Dp!y^xz=K3bC@X02SsM6E}IlSWeC{yIhXw@Gt^0 z88#am;j66$Q&|abSsAF}VraXr;m+_SyjkeQ9Hm3|L=)<|kK<(XA+_LnX6BJak}cBL z2UaYGuciicMFqU2rJ#z6Kofwp{R~Dv-p9z|18#6o>#v|&FXI4Pf}YgWxYv1k^Nd{n zC8SV*E-#0tqy%n}2s8n(g@riRD#Y7`e(Zim=X*K8w+-~9r5!YhL{3I5j)ocM|S@AF_salheuz%+t304scaAki# bRh<7TqW0OL4=7q900000NkvXXu0mjf`H^eH literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pill_delete.png b/media/img/icons/silk/pill_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..c61592e8d841d675a9848ab253c125f874e5eba9 GIT binary patch literal 805 zcmV+=1KRwFP)|3VJFEMEiM8|CV`op1c*cqh-v z-FmRM7mTGPK$#3!q+J#%oJot<(E(ad4;1HLLjK((XsHAs2fxdp(&LM>=n*e-T*FCG z1Wby9QmL|#La61YrwMc!FrS9DYd66WIt|*#S?SaJ$XKLHP}pCZR?@OruyQ#tNp9t( zC}0swpX!hG8ECq21)PZ}FfaO`^2;k|Y>+t2;6Z+;Q1}*KU*D+n`_EMP{fxS?QNDq| zvLMh7;1W1}A%M%b|IEOMA2^F?w4d_R+S=poO-&z~TUvY-7z=7T4Nf9PdwY;21x)*5 zyXX6ENL9%*|kK`a4V$F#WqLMuJ$OgSWd=Bt jX)rmwMO4o&&7$$&XRoX@!lr5t00000NkvXXu0mjfznpB^ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/pill_go.png b/media/img/icons/silk/pill_go.png new file mode 100755 index 0000000000000000000000000000000000000000..e5c07d415dbe960ce2f2b1a031a4f437ca5c7b04 GIT binary patch literal 817 zcmV-11J3-3P);VJK6Bvc5}LQ4dy(CN%{=H9v9nFNf%=)y@(CUfukzjM!j<_e54{Lf?iSHeal zQfU!{>y*-RLddJ^?Ch65pN}5y3x7MoN;rJq8Lu+X~|k26(OnW89+3mFHnL?XfF=jXqVO-y7Md6qv_4vmlZdA;7d1zs;W0K6hN z#HbFt-Ht4`JBN#J8@a~-p-`wN;P-b1d_JVpX%oPE2lv2y9~>MY$K!!UNar!Y>fm5^ z6{Yu1yWM6*LwqPSLen&JotuiZrse$x*zW4;_B$M11vVRKe?RouSyOC?4DpkZcJ#i# zhRhRABt;RaR4RM~SZ!~=nNeEWmBD)^lanBk2!w$FU})%9Wul@u{|q`_G~v_o5>ler zWR7tx7nkeeDyype znT*+`%}v~Di$dXJRCy~hQCWHZS>b%yRm?=jF&uugtrA>`^|8-Kcj0MPR_;lc>-o7r zpwS};ZiO2elO#PVNv&xJ(_(3)jIF7< v{eEcNHZMNv|IbJ-M`( zKwWL~opzjJe^WpCmV9E;(0&ut2;4va_(#>M8)>9$R5viQnf(Nkh~VM$y>J(jqb$cj z+nL1Nm|mV)Gm|9MnHf*7Ja4OEAQz__^LRKOLEwqpiGV^^A*T=#&inGm-62Xs;dnSp zKj&H9T*boh2i)W+(n27l!C)>fq|L%VB1i ziC4p;NwV_}ZjW7$LRW#(_bKF#hp=!IqNO26Z*w2+LEwx{PVnZ&Sn}T;mtzb$;qA*nT@@+ zV5uQ@iXDTPoTbV#FRr~z04|PPh`wXTNoCm9*tG&?e3+fYl>K6+&3|Cc$KOpL`ER+_ dcRl5U#9zn6ZO}GF!C{kgV#7nZ!}+IFwq-SXfjo|dBU;$2A*R+N`fo=|&GUYL?n@~UJ} zRwmI}jPAB8^01Y3C+^Ijd+pCXe>~g?4Jqg4)T#41=X}pOfxGiRR{6W&>CB0&nI=@t zRrSu<^!c5C0)&<(_cUQ7TI*VgHN*l@P5-TfC4f_@-VY11P%L?g;zAJ-8T%U`aCgp( zo^&%s)zGr{_QtkAOc?cV zQv@Ya7h%t}T`nSsD7Oy`1i{aDaBT3P$D8A1r!%M-=8CwXt~6AISyR6jGsiIoM;>tZ z&|vV(9f&CEifGyEVzQcIGxNN8`GVQmBE|UvZp9xX9KCnIMU)jaD^N2^UMg#1ikMNI zccRNH*tm5QYno!*e}0qU>_gJsE$2etD<@XAvnsrb$ z6AdYytGA&+iFC(ifFqRvB@qNA^X?fNqMb~-l0^}rXPZ}>v4 Z=Nr{rY9&UI$M^sM002ovPDHLkV1hoZLv;WE literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/plugin_delete.png b/media/img/icons/silk/plugin_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..d9c3376d4593e666a148192e2527219c09402b0b GIT binary patch literal 692 zcmV;l0!#ggP)o z8!8gf>Ps&qN+foRRaLf2cODK~N?MJ?TqgM?^Zm{DGc$p^^FI-u@A2&5i4il6tD39o z?eiNi?f9EO!QA5G6&UfRk|r9;8Uj(>xKIak1WvVG9G{lyOwMy;rZb4h@InHCyK`>n zq?;+KhUT-kM4JOKVJJ2HSwvM;3q*vgyRJv)Fi=w(iyJUE%pJ!9HNzcZ)v<`W;%+<{ zeL6oxRYlz}HD~zzLxP}i?Y1B1u$G@Yd z2ufv1CA+WfbP+*B>1^)`g5USxNTS1I)iFjs4x(n5E8>Q_QdSsYW$7x+9LGrXJ>c$v zMDWKRh$!lcXg=#qv6|BO>?Lal?hs0ik&TuzSreVLaQI%kizwwq<)|4s&*hnzB4)Hb zOR*_kK=a9qwZ3!*05_6dnry{5ig?1;u$aIZCXe_18qqjr!gMP5Vz%^zuIR zoMTC(oHezz^gs8bVSt#mV?pSB(TAuq zGoo*^V8sSj*929MdxF}E#e_qJeEA@}eix|YmxF&j=SO>19nXv>J3<=NYRKO@T-n+s a7k&VT=yiY6-x8nz0000C#5QQ<|d}62BjvZR2H60wE-%6>*?YcA|c6o(9vsZq6FK8&wp!F zF0$?pcZqJ6&S3OwF}q+R#qxHA?UfUOTRSwCUs|AaNS^nI!2RcM=UfD8Z{R$ze7&XT z^FMD`8FU!r%WF4nmagOjGMB$ToO@@rKEr{G`PNF8+Li0>g`{fgZ$F^2Ey{S2?Az@> z_!5Gmb{DGOS|qE%F!@LB`D1H4*e{yhE7iR5;6} zlS^n^1r&zAJIS<_JZ9PwM^mj%n&~t%YBgvRrPZy_kfqR-WMN#1f*Td23l&14xKMCm za3$hOD2Nb2A!@B)Qqwd=6KqpDCTSj%CLuF(bMJX{5zv&R*?2Yw4*VbI@t?rm`9D#= zQ}KhbcPGrWsA{gN-+k2manJn#iS6Qd4qz1Xjd^m-xjZf5V;e=HCauFQ?Eim0k;LPQws{c``d9jGZs8*-Q%=8j{5 zn&A$GmO@HhaW~edhnf89jMp_jNo8r6Ae?!16QGK^VQ$Q>-(n?PL0m9*5R+#7fp{m%kuR< z*%L%GH9th-!NaLws}J7#@pUh>6qqQFp=OvXkJ}wyYwaZ6_A(oDUsEdwEKF8e4MP&O zYW|)ph$!lcs3ImDj?45ve4O-=(}c616D04DY;1z4#HZDNct<8j+`LX-b*<18HuD2tz{_*+R*y?^}D#G^uK? zs!!WfH;*g^h|Dj(RDzL==f|my)dr%PT1vq@z?H_1k(}fvLJyh9O&}sYO929R=UVq= zH&av%{Tsc$cuOEAbbsynEuyNb5fS0`v3teyW}v3jt**t~Fn1ga)C_k>tW6ZEEAGat z{;q|GsH&(N=Em^&5TnzhhzsUUB#2UD!tNkSx9K7PQF=4I#FiIQwt53UCNrojYD(0z z>{MZM)o~6?bkcO^sEY_9%9G}2K?I;Zbu;MLdn-tfr%_Wv3kg*a6B;F?s`4CazKnWI2NNtV@9URch+SU-u9ZR}f7$*x!f z1;vwCb^zSa@z+%EzsM=%0Z41VipU4IWnn;Nmn9^9tb(Gql>{UE+b7(o&tm+%R_>i_{EvXkXu6tFE{kkH?3W zH&InlH_VOf+$1x_8N>y1CyvT6bGFu|5Rv5(&OJQks!B~oEsfQUyqX?CT}wD#!m7-@ zWj-k|9dANJ5m9a*zZ=B>momLk&%P^BZZ3zK5-bo@5EFt4!G%JYr>UWhiozQ*={<WZjR`S~qo32uUlu(7^{whepvQOt91@ETgS?T^68zT+;U)UB#R%?KWdE#Xl5 z*lz^G$O5mjeV51m#(7m>mtf82>auQHqEPjWt`41v95+C#hevf#LT947}<8 zk_d-O9|S?oNU!Ta)X09F!lmdp1}~FX5)~z3YeSk$^I@L6>!)w*?x#fP%y#>$1q9*A z*i%Fm5kW+Yw@!>#0UW$~Kr2v&KRk@1xQhE@eIFB}Gu!Q>zjN>})qEk!tCg)Tm^SCS cePVI`3(`iF?tE;SITJw0xGxH8942>1F_9ZaThjjZ%s23?xQ-@r5kxkEa4j>7{{;BfdE8C6 zp)=Kr_7x|%4~~=ZYy@N51Gu$7A2z>jIV?4`^U?Mw=@$3+y z+k+V08o==9hZtOcfJd1g7-KpV1azcWJe7vY*83?Q?)MDX1Py20ES*+3mn{;Y7ls$t z3Iimk;ZEAowc?Sty5ck(%T2hsSPw?5gJs@;{)`{?Sqrq|6e`BbpdPt`Qzkk@3r05j zVP9%MvuMPPg<6>BYtZC@cyF=Ex0$sT7)uN=NgX2>bi{*xTDfJRXO~-;T~c z4|Z}pvX)FH&DbSxYH|dx8wmMk!n_RX`L)q|<365(&g&F(?#@@0FF6=LtX%gku@d z_{xC3wQkV84PfldAAnXnr&KC`s#GdeRaMDBa-xwM0a&fpybP#&S&f=WEh_r2qQam- zpf7MTH8piGJw1&`Bm$>X`kfpn=R_m5U@(~1Xf)ZsUZJ?S_?&dbOKP?Hi`i^Gve|6M pQvA^AbVeykrTiPwNR9N6-ro-@tE8r#i39)u002ovPDHLkV1nq!Tkrq? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/printer.png b/media/img/icons/silk/printer.png new file mode 100755 index 0000000000000000000000000000000000000000..a350d1871536eb28fe2949936de1c79c1c26269d GIT binary patch literal 731 zcmV<10wn#3P)^msfbTI z9jQ^EwMRD5xNEm*sJPjH^k)@gXT@kl5ii6#6jNXX`Yb0kVgq(zut?ZfbRr+DS= z>q{33dTpWN$tl6c7nxE)4Qur1GCxuUnp5Y z5HK(>u&W4&EXz<>UtfnPivJ`O3Zb4K8yl-}7K;Uh5XR!-B2uXo6E#Dr&Ck!D<$0b5 zXEK?PNF*3;w;Rc15`MqGDN4rSaGd2kJ3GNmOiaM%^D*ppJL2&;mX?;95{t!PwOY^e z?d|R0=pOKTy$qMj1$rk8qtS@b(NQ*LUtb@(y1JlNtJzsS-`3U!Ze(Pn>hXBkfzr6} z{3Vv(2AlG1;RQN6I#_mYZVs)jt>6p>!_3go(6&ye1Mdo>SRyz&A^1T#%t=UROW6Bf zz^9CeqErU&3`3<-Da~6HQ^UW&yCT)$Cu literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/printer_add.png b/media/img/icons/silk/printer_add.png new file mode 100755 index 0000000000000000000000000000000000000000..d228d0580d8af0dea62d44c8fb33851568591286 GIT binary patch literal 782 zcmV+p1M&QcP)z?``cAjK`}OU-rz95{9r*BaIM4Gr-{-(903g`rl=7|Q zY>&q#(t7d)h;*K$NIRJnY9{ifSDk%3Yqu%bRNiu?SJ@=KZ>A87|74X-AsAty99n|( z-hARj^YETs1wxH0v9ZNr=5v;if#(y4@r4vpnH**!S=<;|!byew*{*^rjVs9uW{F_- zOBPd$X*fS}2(N5{PqwnQg)-H6=C1;^T3uA7nc&tpIrzzK{^i`S6lvJzwqOp#u}(%i z-QnOQ5=l{kfHX@9aq?JLBZA;^9v_InM?~Jm3>{-^K0(gXsOWT}uC6XF7K^1+KpM*i z1_t2udU3ADjTjMxqIm=f{;xT_C!@GY3I`b_Mg(VWy5Vp*AeYNgUS3|t3w&fD8jV7! zRQ?xyt<&j5b#?UuFW|D-EO@4;r@^x9KXJKS*sgDFZOsc*Dit`6qnJ!4gu`Jf`jaQG z`ylT>kBfIiU~X69sr4ZkhJm2Hy&b_|kYX?x5DJB0x7!PNVC;t4#9%m}$GeCXy*3$Y zdXJ#A<}d_pZEdjGY!sbNhd>|zi^WoaL{ou5|6L5u-3Pz4qmAety@ZmceGrg2U^bg6 zdc7XxO(+V50xc~qG^X%cF-8K9v2zXi^eAcG3xP}~%NdPED&QMmynKbRHxmUMzj6RQ z)(hyeN@#PJMM4uCZ6X4xRQjmCzTQ_`TMI_-Mk2{!b%VnK>(>B<`N@M8)qp=c#EPlOx(m^7ZttmyEx}O|KIyO@5`Y8P&=Gak4UOI z9A;ssgC#(yb0mbF7m2Kp5(`OOSQV z#ZO&(x9_ilO06xv9b+)LoFSy)_{?B*K8a*Hi^)I+ci%6eOlj%)tDr(_OK^fIBAEJ; z!Ng(;^a2C_Y7|^&tD7+hG^6Q13R+uR3oEo^%vO}a4B2gFCHu3B6wI?R7(Eeekn#D93#ZJ1gl2JlLaG}i(tJMm*T#oYcaselBlZ9X~2(?=M zUvRZFO{2QHdY%(7nM?*8PNx&$aQL6tY&PuFH#Ie}lt!Zg!!SI3eSPrz{k-UR9C{V# z%f~QSR)Asg5qx^y2B}mEN~Kc4>-F*&3 zz9|c^P`3wzRrze&$pas9{spPtk*$9`fqKI)>UhS{rM!uL;bHz3OoF`S0YRRM%X|m5 W5Be1eiT(`$000001{r$78XkvMLD8LgLPI}p^3#ZkL-WmU{TI1 wPFcbdW00`FlWkSj%Pe9r%we8QTmJp#H==T7N?a3H(*OVf07*qoM6N<$g8eR!YybcN literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/printer_error.png b/media/img/icons/silk/printer_error.png new file mode 100755 index 0000000000000000000000000000000000000000..279ebb0e53aa400ce0d56ef55306f5dfb96d18a0 GIT binary patch literal 854 zcmV-c1F8IpP)}sFDxRh;iJ`Kl6P99uC8=RvRI)}HkrHImRbEuyMi<_M7fBaobX62} zlPf9eDk#N5YwAseOmSEsTF>{Vk~BJwPOZ97&_0w~^#(52_;@cTLqJi(-d-dO zvy0z<;;>|=arHNxEKc`4{&eb zea1EMtc>>BMVM;ZG48&F`h*Eq>ovGsE(8LBhpK?hZntZPolYlgHd}_kX5cNYLp5^E zb*L&CL8-M3MMXs#hKGkMI7yNO3hl7p@7Fd$q0m-=#1ITC?@)2H6H??2O!iKMCSF5K zp9Di#tgo*#L=;6VEG%eHiL^k7MxzuPw1YmPxausBn8w$q&yk%MM^@5@dC$l$hfAl^ zSX^AxJjP-%sDi0f3c9o(1x6k@`7!F<2eqP7^c%`s`Y`+95u%n{1cSjX0hOQ*y{O+Zbdy2gRyjvQ3h zv>+=d1Vs$f{$w%r%1ckkkP}{*4p=~bjiEG00qbx$%4TP0g_)U|lFjNa+_=z$wTS^( zny!P;mSp(-Ao?nl)g99;BUFMjTA|CfAU{0%J>xZA8Jd(h+FBPk`oK!`CCkb-<{9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/rainbow.png b/media/img/icons/silk/rainbow.png new file mode 100755 index 0000000000000000000000000000000000000000..5ede989a4b9aabb6b4473a45870acac30ca8b327 GIT binary patch literal 655 zcmV;A0&x9_P)u8hXXmW8$M^Z}tgueu#dCAu^FHtQeV(HM&<>-oby}}zNt6*; zqOz!R7;sXQCXnvAh%NsOY!BYTPS6Ya_FvE=N~N0XvE{pt>_abd<38j9C$Sf5#*g^{ z6#d#i;i$++U%QNK=q`5eyJ3V~u*Q$0G+EWp#2~B(nj<_bDs2zkL~hK7Lhu+$HfYV9 zg88}w#kZGWr6!PHZ*X)j?F`*Ue##H?v8xKkTTpy+9>!)Dj4xM}tnU%z-?{#Jvq5LV z)@YN0%~$O(K6n)LZPSD2E1d`=S}^f`2uGvZfdMJLnQPaaO}!IFvKxB>&n|bMcm4$0 zUpC_Oiw1-@0yr|I9f+!ueRKzf;l|(20%tyTVPvrtXKnCG%!j^695MYP&h*dy8jxmG zh3GwXFus{<)0uFafajiFK;M%%ru8Id^v`&@kgN`{8&+n{jEe5+VD{Q{CLD|<6d0af zLr+L2Y>HMnV2KT5NtiRE;&b?xw@c1+=e2n-zL{&& zned;z;Q))>W;sY6uKp4No)iE8002ovPDHLkV1im2E0q8M literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report.png b/media/img/icons/silk/report.png new file mode 100755 index 0000000000000000000000000000000000000000..779ad58efc5776825ef81064a042eceba274a928 GIT binary patch literal 649 zcmV;40(Sk0P)sm$HQ(N)Ek< zrc#vXMLdW}TWpphCZsGREkUZr{Mg;M&b;luZ0IGA9rnH1`DVU1->eh_0hG(-dw<@) z-1S-xc+D!@wd^?Z=a`M%%phe@J_EnT0QpH7V3 jcG~XA#&PRl)Zh6(yXt(^KFGF}00000NkvXXu0mjfDwr>g literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report_add.png b/media/img/icons/silk/report_add.png new file mode 100755 index 0000000000000000000000000000000000000000..d5eac9bccdbd7b67529851a7e325f8da95c4b930 GIT binary patch literal 714 zcmV;*0yX`KP)?M^6&hEY^hlvJDB989RxW$OpU>|&7C!ZMnz(wW_8 z%4_O$i8?inSS;2{tXQNsU5p{a{r<(%`+a5ad~p{ZcsQJk=lOolb2t(J5|77oe7-}2 z8KVMDRRtsxN%c0hhs>33w>$E6c@f{1U6{ODj!Y)AE%6~nqj3krFv=;j4xf8;n7mSs zcswprG#W)D5)rh%zK(P{y%8WLn1iEUz9k?Rl2bSwMk=Ki?=?40^$1L&Ozp!v;TK7go1 z1mo?ESa_ku*f|-WPTD-Rl{2>3{J8$g&vy`u#j*tnM$gFjf+!$&6%tLPyOTK-3Sn(+ zEy4vH%o9A&V*a@Xqo?-@=GM0>Xny?%*LwVDvi^qtyY0yjr6tSA*qBm!!@ft$$ucnaoc7ie`(Yhjtzp+;Yl%oE&J zW7eX=@UeUVO{d~c+^xa{Ys2O>>g`5NQwg>Z3>}pso6Yhskt3+RQHl;{1I$h(Z#GXU z#RLX}K{`;k45P)CROWRt-dv0|g`BB9e*V>|nBUvKAsWJiZyICw7K_xGH4{3!sG!{InF^GJm$ zT{%7}NF?WKp`AQp>d)-)JCE#U_u1-VZlkc;HoNjMY=As7s@ zT*1L*gVtKiw5u?DYPS$>dhJ6)j~7?FJ-FQU6ZJ2Cp#HfF48tH02&}Pz)dFLsm@gn3 zT;3e$QehAPCuhy)V$zIzI%_9)_GPmuj? zLiBATzFpamXNTy=c?NdQz)-$R7?Bu|#Vyrh#JDi@CxPb8zJlt8i@>xLz^mGT$;v`> zly2;#$a5ytNVXiieW2)$Qo2>O*3<1R+tx86rx%Decli$==AQF^vpmAoR0K|e00000 LNkvXXu0mjfW4KG5 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report_disk.png b/media/img/icons/silk/report_disk.png new file mode 100755 index 0000000000000000000000000000000000000000..1c856cd61593e944e09238a6c2cee7e10cb42c56 GIT binary patch literal 760 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report_magnify.png b/media/img/icons/silk/report_magnify.png new file mode 100755 index 0000000000000000000000000000000000000000..aeaa889534234e156bdcec30b73b591b10d8a019 GIT binary patch literal 738 zcmV<80v-K{P)JgP zpi~!%ir7|Bt5jR6QQK0ZCTW`7b7ovzy|oJBfwLHx`JHcmbH-6s1_lOpm2RKDZl(&D z@ey|9hdTJbGvW02_pi6sK9F!G?O~ZbbC_*sU;J0K@B1Bo5ClV=ot;M-U-ssk7Xk`l z7|ux)5ma?foJyr4k?!v9)z;cm(zYKD!}oiAf4$_oE+P`gj^o6FF+uWKZ$8teAW;Iq z$xGvifI?ItAi#;e+1WN?g4X?bj^W##yRm=>tXZ1+DG=Sk(Fy?8+PMV&;I({9R#DYi z0ac!lP9uPdqGAz^JaAoC{vbGj=NO8&@5Viz+?V6gn+Yb%HOjRH8WKt7r34#RF(y$3 z>@304tNBc8#Hp%?2p8^uV8Q$rHmu0vCp;#;)hU*0JbqhZQ+rDq@O~pWh=-wgt1ouC zF_or0*F>@AV5$~%JQlZQcrjd|P$=Mep6dodFjOcMj*R!7qx|GNVu?pouGUE=6BsLq zC^L1TZosHdE|k}>@gRw+&tz7K`>;DS-0`kjdx88QmDen$Oy(5j4`A|Se4f3J2wko zOJhvGAEb5pTDmrm9dmve*0XA1*Rtm1)<{9 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report_picture.png b/media/img/icons/silk/report_picture.png new file mode 100755 index 0000000000000000000000000000000000000000..3a9a7e5eb91319a532f1c796740c70692b8335eb GIT binary patch literal 733 zcmV<30wVp1P)jdqY@m5y1@@iycWVf~UiPPmZK9+AcIyv0)YE`F$AZQJGdwa**+S<<5zV6SY>Hz_* z^@>9093rw}pGYJC_(x#KcXx8|<_iX&ePnXFNPa;R1U{j*)C7L@R^@PWue+86@v;8Q z+O&WJr4*B2iX3m>PBNMLFMl!A-0V}AgN}}loz~iJ*LVV78Gbx`gi?yaq9d71F+Q`v zrSc?V8*qfU_!M6Y zC7d`SV^}6QiLVTW2Ngj)<|6{dQbeI##>!6?b;$QpnF1k5rKT!)emAqWQ9xwr$3>u6 zc1+Fez}38DQJ0u6Y@@lUrrOG?;1oWF!r%}9p|&^&^S>;6nl92Zb)Hx6vdka2hS3HA zBJHXIZ}?88E-g4qMIeGg82fw{tu@0@M6@wR^s)o3HOKc4BeFtp8V|$Vzz|9))~8~K zjkt2Gk3SD$S(eaRQycS^37+20q|y#-rJ#AsI&KYp;LB`@ARZ7!mU!F;sRqf+zU`_e zF)FX|Fic)L!_mR_IOnj|VvHdSLvpzs4Gj&X)9Gp$m8#5wF=kiGoBJP=8xn}X#KZ)~ z7>qGXbKrR%xm=EHHjC$ZL{U_^bF%x17Y(;Yr_2drFbQ=B?CYbj<)Iue4Y zjHuM+6fIggQwO;rx(zM1NUs_(1KGi;_5Ap~&-=VA0IaF0sdJ+( zBtEEe@J_TBEEenV2D6)LPPf@?{?FDi*sT@}7o}lsZEZuLAu5$>lhJ4tzP(+F@vc$~ z7p5T;3NaE01mO4k<5^l-!s_a348SxP!4Sb_H2Zu$w5!X|!r2OK&NirsEPR=p!^+AE z(_lzjim`_!7!t6tyu3`Orh6Whl?~8ycR+JK5!z@iJGmLx3oon#;sz5jgTYH|gu`Jv zs;Bd)$~%EOWCk8r=At}%7pnRDL1rc+7z{8C1{+K8sk0aZ`KdIWO4XC^sFsoNIgAL- zn())ofnP2YdYTHNfMDdG2K{-d^nfS;b&a}CLL;&3M?)z`lEn@ z>jw437=1vZpSLI8Ox8aKCpQmuIz6;XA=+*Vp}2Yj#Zo!$wzeW6A>jzqU}6Nu+!PvM zHk+Z--GW3S0iS;nhOS2#7=8~fmkW_d1esicqsNXL;s&N#5|(xe`Zy`{0KeTk1IsfV z)Qx&5mF39i^TFfsP*6aiNGwISp$VSW(-DS&Eo#u4lS~_U2kP;%mW#_`1@wA7G#U*E zfC^9bC`4LA3-Q+eGNijse0UKYlEHg}R{$a=DDYia;QsYl-3-7Thjm zr0+cYm%;0-Bt#++`X#7AQmadCqs!%j*XzZfC%y+26%|R{oPFrKatN<7li+r{F&AA| zr_+gCR;x7zpg>fFsasCf9oVjsuoKDu`Od!qHK~iHIh0CT P00000NkvXXu0mjfuTNAF literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/report_word.png b/media/img/icons/silk/report_word.png new file mode 100755 index 0000000000000000000000000000000000000000..995134248551bd273d1d82c8eb10c11545a28daf GIT binary patch literal 731 zcmV<10wn#3P)x`$;*%QE>Pm-#2tuNQAW$Ppq@+uSPM$2ic=BSMf;tzS4LT(D4twpO zC5F`@JQ%)2wPk1+YwO#tn(OYf&&>QgtZpeCoZG<6@ZmqdpAr$q$Hy=J9=bQ6my_uE z8Cv=h_3UmfsIjrJ6ULbLHprK|7#8n$a=!P|u5O1yq54of9#1qjHg=VL?(eIJ0s=u0 zY&&SJMMSpkJ6c=d?vho>Ndh+qm9 zfWQ}iZ5Wo)0aZ#dHD_>?&~mzVr{F3sn#|xZ01^lYWOEkB7cQKMGLcwg%~;N!+Do)5 zvV8{g{SR3meS$R<1pzoNn1ba{G|Z)@{RmJgn&yTWuA_De+Hue<4-BJ}BFI~o(mr>( z>p&ov*IaKuT>8evv|oH+D+kWVi@u7O1+$s9z;f;OM{?^qyfP1KL99gt#0u6b)V3rR z^5qViAGbQVJop`JEyftM*7&|pDwU$Tx|&!lR#GUXie1oJA3yo!<@BC?9wIO^GlSL| zt#zpfj^mI@rI?+a#c>=8g<=rYR!KUJM9&?ph%_g&!Oz}r%agmU^B=+0hDY`Kt<(Sj N002ovPDHLkV1l*bNUHz< literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/resultset_first.png b/media/img/icons/silk/resultset_first.png new file mode 100755 index 0000000000000000000000000000000000000000..b03eaf8b5416fa6878165d95116e73003f8445f5 GIT binary patch literal 522 zcmV+l0`>igP)ufs8f5Kzx*fI63}@)AAFXgQp7K#X5)&2^7g z_9O9^7^ARqyc%qAP{1M7?|}io8xW>dotf=a%%ZSXBBI&Rf<-t`#(~H!2g~*8&15{# zVXjXMwHZYVJ6lk!gb6?r$g;SuO>QI;yeQ51#0H@Z6sk_ajqECPZEqLq!PMf5MQ5gS1i(Owi(ut_CY*w|Psf-Iy6=08Y` zHnsuDs6h)+OwcBqopImX_v1c`5LkrSCWWWFUvW71z%eN$cB714YVYtd`}$X<%JbQ) zM;;CHJDu;#-swg0iul07{S&4s!M>4O+`c|6_tW_i^y+I%|aPsIlEx5K=^ki~8LwqDy-)t}thx1D9 zB6|#ECQ%2a60OQQ<{6-)5|okv)6E>1Xpv+@iIv@MJ8v15 zR{N~1_2z$e&R$WgNhIQelIl1rK}5XruIN#GDZA_4bJqcqID*^mXXFcgt1K5iK7HPL zwLW*@#tu()#Cyd@CHc^75Ul6pYT4PCpSeBE)hh4bY>IO8de(|Ml<%@O-40!dwX61{2C5s-llVw2V@@N0oo_PPieZ!0Y2~+R( zk!(QTf=B;X9DnzJ@u9c>OP4(U@7{849!UlyO@H`*;lVfmCvAW6f9CF&{}ZR*{jXDW zb_vl21ozzrYJBy-Vb$aRjjJF3@7nm}zjw#A|58cE9uZ}LbIY~=6ShA8U$XeY|MDdd zfQCH!?_7WRzhvaG%|sbsT7Kz&`}!yUix%Do#>T_{_Ei`DO9UTSBkH=Hg(w4*^UnUS zTk-IJ<+2C=ZObqG7Z2FGlB7VCN;>(!bn*TFHYMl(i+Sx`L~=ArL>~EXU3lidsO!!J pWF;gqzXSh89JkLNxXeT<1_12n>%V}Y6R`jQ002ovPDHLkV1iLCz99er literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/resultset_previous.png b/media/img/icons/silk/resultset_previous.png new file mode 100755 index 0000000000000000000000000000000000000000..18f9cc10948f025fde708328fa704b520161e5f6 GIT binary patch literal 389 zcmV;00eb$4P)K{b{Xc8(tN&i@ zH%T)fYQpV#rAr?FpSkE_eXe+_wJd|K3f{{%aMTC(eL? z&YO?2=RWv9b;pbUjjJF3FIss2fAiYM|D{t;5@!?n%vQ}6um-u(1``H~0!(`ViJ zU$yMvf616*#2KJfaGFIu@9Y|n)@%Q3RzCcnHskjH!iD$#iw7MbEf6JRj;ypTzwkeA z{@wqXv+w*Db>B;RG>UocU1Xkp@_*9QTmMBIcK#N@1p=a9KakdI4{r9Fsj0rE)+ zb~J|8lW*Tz02$`Zaxk^6sfOa5!ghcM1=puT<{WmU!JK!6{4kb3fZrJ*ROjE>@quHyr}*Cr;=Aa64! zj|O-=Sx^U(hAq-h=kq`Q2V>dc0LCnFFu6l&F;*d8IpiIHH4yNNu{%yB`v73}L;K|S z5BXjfZJO%>P`FNNQN^m$1zjx5c5Y{17VpEWq!t0|e{#P8+?shbj%;~D00000NkvXX Hu0mjf+-WMY literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/rss.png b/media/img/icons/silk/rss.png new file mode 100755 index 0000000000000000000000000000000000000000..1dc6ff30ba5020600aa4ba2646beb9eb25dc978f GIT binary patch literal 530 zcmV+t0`2{YP)8MDR)G%QU0LxY1jsDL`i z5Y)<<0mFa+Gyv?I-SF1`9OhtF)?#(7@ZwPg0IYohcf#rgRl*cR36-)JAyh$ycISTR z#|RJ*0Y`3-+O5RfdxRPJ@Fmbb_UtP8y?FXu?dZjo$& zzrG9Rp9<^S_%m{rBJa8vxT8 UVM82oKL7v#07*qoM6N<$f={^a^#A|> literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/rss_add.png b/media/img/icons/silk/rss_add.png new file mode 100755 index 0000000000000000000000000000000000000000..b590beb7384ef1eceb91d38b67f3f29d7ebcb4c7 GIT binary patch literal 649 zcmV;40(Sk0P)_`vtWfF`j z0<2B6iHB4fl=M^yJC7s$OkB4XF^SV+68F!}^Z5-pSkKZ)7dfJ zWJl?2zDxJhlca-{tPoI3*~Z59s;f1d)?99?+e2nUJu`EYjJ+LY_Tzl7TIxDCwpVon j=YTRG2izRLk?s5g)J!H~cfFa;00000NkvXXu0mjfU zi6qKEsUS((2z^ne7sH6u^xpT*$7wNF!ypjufnm-JGY|ZJ=Nu&>loOgVqilfTUekXx z1h4^|1sA{;!TEUSfucYP27p~1|NITBmk;25%&jlw4qn_X0RR?q5CY;$51d211M3iH zboWq^PPG;;65b4e59pTjU>C6uFOckS$9)}J0cfm^fFPg^RMkOn$lMhAa2LAi zB;mso)RqR!v0H@6*ASvaQo)cfM13Kk0JZM~@^KKVYVh|v(5+X|d)k=nX(9J{mc^MI zCTpl|_)UE(7*ZE$AwaN%vFqrAoyhw^lD6C6Et5CTF_%`-*m05d^?S*`8)9PQDW*_F zN&gO^@i@Y-=(=-=jZTY=?!SC6O!MhJDnAXw^ayO+#1B))#Ly^)ynwYRUx8XKq4%-& z63s2n7pT})4@W!yc3|&zia|<%XLnXQ3olSyy=RPKX?&3EqqC&>8J2*B`2>?_)LN!- zq`jthU3K>I&dtskJ;lPTdu`X^&)k{Bt2&>^w7@{?kh}5+(yKTs Tolt1000000NkvXXu0mjf#S9}s literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/rss_go.png b/media/img/icons/silk/rss_go.png new file mode 100755 index 0000000000000000000000000000000000000000..43a86bff65d0c81eb5d4ff8f95e4e825f9015a0f GIT binary patch literal 635 zcmV->0)+jEP)^cw4_Lf`NnXu4)qJaOz0Jk*jN=Gk2DWh4)N< z8s*VU4f~P`qK$rI>tMXr-gv6&^_Q35oN{`3$UXxb2jm8#wV)MM1r50$LpE2g{{bi; VQ8S@)tH1yN002ovPDHLkV1iVr3a9`8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/rss_valid.png b/media/img/icons/silk/rss_valid.png new file mode 100755 index 0000000000000000000000000000000000000000..a6d0b0e872408ecad6388a132fbc95aa4ae9a558 GIT binary patch literal 660 zcmV;F0&D$=P) zlTC4I~z~%t(2;3ZV$IVbTEK^K`cbf9DJcWsEZG8LjgQ3BX ztk>_fsZ-qa^*zkr^JiK2KaV+&zI@_j^%VsVuFdVDQY^v4>l8Vx1;n1LCn5~d(Z zsIW?vOXDVh8tp@`Vfq3Xjus#w0#+U)DYX$V&J$*&OAmk!WA_e|ZaBm2QW<@4n)vV> zM4A9qP=jzNO&}hhB3XTc#2Wb1b6`%|br9q`a_bOGJ*fn|_k1ofNlU#NR&w&qt&YqzwPe=XD1lS-g*U+YebC>)k^TqzktpS2p6W z`Y3jv%8gZP0vejr+`$EZc9x`b3w--bVcS)b@+9o#4N5(I6qfBm?;dXg6aQFF90*an*tf?f9 u%m^eP3upiqkd2B87`f4-l>F~^Zs`{-O<@5o5}gkK0000k7R5;7c zlif>`Q5?tj7Yw@ZCMtTF^Q|ZedeJhM%QPCR*bs8V79p$QTo7e94yQNXRs-{0?hOn_-8n0AMO@u1Ts zNl8QzJs1#rz%RBt?ux>l+amAvh+J!{$lkaqv}+Erb-6j2xp>K4GLQnNB*W`hFg*?P z^AL@~(h~Z+wfcWEXHqV^Tq-#z$7Y#o0;yFxA!00F}F2dX# zjE$iOgT#G4*1TR6kB1Gnn@>$meCh2a>c5YuIvFn-R2W@>4@M*m@-|jiDV?b)bccgA zyPfsMM!rjy>+1O2)5Eg29Z_*2p&qGnmS!OH?vZ(4>QB01d>j%9n4QINxkyT(Dos?I zjaWF$*IQmh`SF-?xU%xMEfjq1=6qY*g&lgG_cXv$BGoIWyfO5 zp>pdV*O+y=&6@N2WWFo(%RtT`Q(H^6zn^a%epE~Kx^mEJ{c8`luC$nc*z9j|4Ms8aJK-la*? zu}sM&ls8IJIBTw8%#^`KxVF<=?#=zao!{!hU{cUc4}5tzhx2@%m-Fxd@cu=-{{z7G zcFU>0QV~u$otEUZU1a-OC&^y!AQ?tY(ygr|b+Lsco1|o`K@v%vt5f6wG(bj`z|0F^ zejZp}2K;`&=R@xGD@4Y|5FH&wd}IW%2M-Z+I1s$ukImE7iFo-b2?uzKCy#*1NxZPNzdqqd|ya5LK(Op-|vmVZ9X=X}9uO24{Kk}A!B5JXr!qbIp8z_8L}evXRx6$w7guhv5miVSjlA&GurHb?&tlT#n6(v-{&G z&-l~YZX~a3p)yv(^}zv`?|y#1w%JRt&vtNt1X7ZUi&z*Oj!7dOpRh%pPmp60w ZKL8&#%K87S&;0-Z002ovPDHLkV1m=DG{pb_ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ruby_delete.png b/media/img/icons/silk/ruby_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..30022630d81b07d271d8168bc8e2b67290fc621d GIT binary patch literal 704 zcmV;x0zdtUP)iMii@3{=qhJYmGNO z6B95x3hnKL%F1wAEX*kiZnK#MlZj!2fe$q`IEqUU@h4qjfmpTN`dY2EgY3raEE})C zpHOx-b9y~rGBf!uF_oOm`|4_@lmbNTiFwb#_?(R$NWW3i?~_nfC3JMa{5*_|pc;)V zN}@-Kc+%5x+U-nVRS-vxJKYE3;{Lcoz)}#oo}b?pwAo;A5XQ$*<>*4E!<&}ILR}p* zlI%Hr%<0~LBxchy`i-VYUruh%vKUS;eIK245Ldvw}Q5*3@~ zVD-Yq$dz<`@7nDSQ-7tybO?#sqs)B8oN*$8uuoo~2V~ z9c$K7d^fE0CGJpHC7JsMutkAAT3Sk^CsjN3*My0q35TTLA?bG}JhnRgnBSkLau?zH zmf|Y?y1b2MkR*S(2DiklMT@L|-jcwJ+}%|}%D%vyEt;=4x8qc{@yrkr?AB>-ZTZu@ m%-vfdJ5K+)f-6i8*M9)_HOV}%zz`7t0000p`gJ-s&X^#FvVo2#P4DDKuuwP0($&5u3Gi3xsSB&b7S=yXf4CDeP%T zi085%<7O+R*T-!1OkxYf)Oe8PJhFf|3Z zT)^5Iu)GXROn~X_MMf$`RxCzAB*G7Y0H2$h5ZCFD?0yMSe?7wz)Kyf5I<$7M#1FH8N)$3v2_5+iXKrRO? zE#aHNfPmMFOh*U8;V^>1AYwf#d>plvU1p2xSPErnS8b`Y(|x2?0}Bhl>MHzxKN5)q zLZJ|~WF7H%96q0qF0DdGWoWh9v&SMiY!lQT@LJs^mAXo>F+7Y|EJm$yL8H+?uh&;) zM59p{jm8fr_F(@}OYPnRj{o<@d_K=k0@Zs^xOBC}VzKO{(`k4-9t;i+o?MRIJNGU) zsi9t~KSfQo+wIu8c!kHVnayUhMw7Byt&m70e{R?p-qV}2FJ5IA7Z(u-1TZo(vS%`x zh?}Mni9{fm%k7ll{HZl{(DJYZ>}^;%?7^|IG0e@)u>?>k6lYE)pc-v5nGAh>eU0O^ yjRqPko!TlC3K>41Kl4|QNvTvqAYki%{Qoay0^pl|RRvxE0000S literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ruby_get.png b/media/img/icons/silk/ruby_get.png new file mode 100755 index 0000000000000000000000000000000000000000..f5203c7e94b09b06f5b6f42fb84b126e323e3186 GIT binary patch literal 692 zcmV;l0!#ggP)Y=UYJ?ASrjeqP`A=ks}gya2C%k=OqLkPGuPLSKZW zHF@$4lE;uGt!8FOD{1E?w=P9mPE3@R&YqK8@oH)Dc-)-x=rQd&KolehIqB_z{(cx4 z0jm|p$MHOU!dz=B_Ldgro11Yo+`wiwW4lz!LiiEqd}vtQ8sHT-8=5%;PPS|%U6u)d?MW5>JPEPJ#EhvD20T>-c7S^SxD4fyJ%$iJm6vYnT zpb7g9zdgTQq-(r*x zmy1e}+uB&EsllFYprlbP7eCIWu=fJ-x0IF*gS2oca@+j=gVtq39!`S+V^h3b^eBg> zH}y1F>PWkrL}YE)`|yg8Eq_dy6d39w`W>vergA0TKIP86pU(9mGj%UbWZz5YKv}RW z_@bicuOq9fkHS1yjj6w!*sGBQ8T~>xbqm5WSDs&{{8=%9dA@A=n1p47WfVC+?9SN! a6Yw4MW6QB{x)Qkn00000x$iEP)rl-P_^Mu?M#=uC#u zWRgfl1^(vp$dZ@wYeC?I?drV2_}Esbuo$wlp{NLwN$Bgt^*mf_ae-;yCtO|4g3rC= zx3!O0Ay2s%Up0TV4Qp|us^d4wE?iw7oY+?b-WV<81??Y&0G zJ$aoU8Ug@;%U7nXl!x^|;=Yc@p}!wOA;`)iC?z4K@U5b-U_Ixz#z|y*hw?f1?XFp~`}D>*)(C`F2(4L}UqX3dC9VC9bPTo_Uy0n8b(1OQR};Ox`=VCJ zJ7;RgYii1lp{+q1jlnXK93(HYl-Ipac{lLF_)6ple-$I^-rbp0Rn2iFB6}T zMxl&EYRODymQAa-lah0RH+@YLe>5@s*^@zE`6#Ve7A<0Vw3rpSF+y$@OLA86KG95b zPt(|(V2ks&GVQ+}GrkZABk+}AZ9$o{Ew+od192LDrY==^URH(Uy&w-oIN zKksfB5{ByGdfWBe7yd=;f|J(94SPn%M(b_gkNg`)>s4a^*@puF0000uOV?{sfmJEOvVyH^4y)cgf5dHLYF5Q%^>gqd5u-21$*wBhAR zB_jOdZ{3_P+COI%7ca4wFNeH5CbKW$&keRmzkEP7aJ}9 zaO#ishFM)}q93lAD_8lgun@=h@vBBsFm)+G<{ddBM&m?a)V%4D2^D4aN<{dZw`@he zXmiP_nz?Yu)F}k97~g_M3Rlg+vSTP~7!t(6WN1G7DWyb&f2HOxEER3;FmLk2RCx#F z1d>}-q#UaUW#thX&D--WeXrm4u2&+$|9m)9wO6@A50tE27ZH6E6(o7nkVxCfFl8&n z>(SL0A4g;`kw6fc= zhZghZ#*fsC=bhU&oq2zne>e=_OEi9~H*sfNrYr5WwtlZ$f8yN*{^KXl-Z$AZSrFg= O0000Z&H5% literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ruby_link.png b/media/img/icons/silk/ruby_link.png new file mode 100755 index 0000000000000000000000000000000000000000..bf4be526fb1190cc7f778c5ec7894b0db5b367e1 GIT binary patch literal 767 zcmV5*`Q5eUCpo;>bf5H-)x*6q-8!ArQkJhH?Vnaw@-Q1A1t>wIFB5v4Vq+TQyi3r{( z3L=SKNGYNaH5GrBOp}2c&b=pHP3PWyJ7;%`?z-u~7apGH`+UyxoRbA0>tB@he*jYM zCkCoxD#9eV97J%~NV3IBE}Bgw!8MTcx;k>Ee@Nn0)#R5-6N$<18q)yUP(u~N^c1kL z0IaM4+uOj#280jq5g8gnbZ`(S0|Ve+y+*jZ8{uajoJz}LCq=~?2Ka=xZ-9vjU}OYX zUk8?#fzeS2E*HXPGxj+S(S`;b8IAa?R%5HH3)?n3i1<#J0rFE%9UoKAeE_`;dwWQq z*;xqH)!0`m@m-<752~HgQfzv?*x{N$@^2sTx#F7i8_<2P(S0X{b`LN<4jdc+OG`)@ z42aN1o^|Z^@@|EqHwp?ee&NF0l%1%rf0t}+1r`^9wKb&Z=%lD z`Th7toB5lCq3HEI(Or_)WBl$0doayhhGZCWg5 zIaXr;=FI@)(xX)#?RL1`?sUv@tj0Xdn*qql$+<*FEKn#E xyBx>GtX6BB>b$nLwvMWd#wRStYRtpDzXADfss$&H-+%xB002ovPDHLkV1ii!VgCRC literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/ruby_put.png b/media/img/icons/silk/ruby_put.png new file mode 100755 index 0000000000000000000000000000000000000000..e026323c257e45d5d4c8fd0464a47340d1f6796e GIT binary patch literal 694 zcmV;n0!jUeP)31)X(c{M zhz)p)O~Px+7wZ@D#M-%R;V~M-s$MTv(oYF@s#+``Pg-ytJ*L|fkOYl{i~9pGGz4Q~ zV6(yGB;Lo5SZHm<(bB?Vb2HAmdh8Yp_G@J<9X#S%jEGFy5O_|*UFhk7jt-cZfYDLt z?8IAKj6ElZS)&n$!N9yu$BV>7-d0s%%P&Oi-e=zs2=SGep8BdQLB7V!44Y?g5U*Oz ztV+elgakfIOh-rarlNvrV-_N0@0>Gmw`Ow&GVeB-x8GY{2Ho8-HwRWLKCPAoNpwmP zXM8+Um6g2DFd`ItrW`w!${)6{mXj6W$;|9qFD-@PVHh9BC#{RvSX^;&%$v=8kYs0Y z*py?3V%JaCxT4hsxHV~go|4jU0&)hfs3=xyYB>M!4B7oUGP=^xwWsjQ9xR_o4)_wU zda!!sD!%r1)~c&<6qq>MtEFwSftJ^Gq&BM9vPesZW415uKV(}q72%d-nb)oFP}B74 z7IoHIv`wkR)I>&X*+dZ<5hU}D+_;(O*0-g2F81bf`=y22XJ!hzayd{Q?he1K9QbWj zPq!ueOUt&rdj>2cRhWmalU|=fSc&4DB0tdok2^0dkLemuqPdeyXi>2BuRfEsJfbWN cdh-3rG{ z$cl-P=->hx6#}NAmbP5myY~I>{qOhtLMa7Y{qE64eE#g}(xpY)TeQ8l?;Upi4EuP3 zj9qNwYy4OP^j-JLi)W5q`snr30AQZ_=_2*h-J^Uqwd^<9gC_@m_YruehOwSPa9@O%#PST ztn>RnbQXoQ3&2p_*N2(YI zkrMO}==(rnxsJAW59QQs0L07JZk*~;x_q%%{cN7dr3j%I4jC^oS!R20 zp-X8Kpw211iFbazd*AM1?Vu^zTr_Qvx?Y!ieJR$aQy;v2#^ddUoYEFRo!j>1ci(tn z{K@;T0)Sj-bCEg}zP!0%dBFa`LT=k_fI7GB{l`yczPWYR>anra$&%HTk?G3F@#Ue> zFdEg-dzaUZYPNRv<+lA7pzgcw+uL{UoxOeM-g%tFNu0n5OqYg(!P3&eWMyo1vh4Ri e9{q`*0R9JiiaRV3rbYDt00009Gp0rM-&EhljN^i}(|Pq=@5XF~~)>U!;+BT;WiZ;-?olqd>fK_MstEkar}b9uop zSG%(%K&q)D8CgaWKtPPtDOv9I8!SQz&9K@qF)=0vTF8Vz6y!_@T)cF~Uzb0()L$?a z`$c#8#_Jq>ql8oq?5#4M^3MAs_Mj^9a~&q%&y!>ZY?Ffij=buvY#%T_TY|PQcQN;bwCQWy*nR;m&;UD z`|<407yq%aQd%Bnb;^cyP&KV4wU)a7>4a6Dx$h-#bpLzK{Pr$B8!J;?KlH*=4~)Nd zXfFUrnL1@v!}G_xF3kSm{Oos*9r(bTXJ0f{jKZMUxbxsWQRhe^WR#$Jv5>jf6w4x#gTU%_MMNlkNp$oSbvBp&uHw9M;u0-4@=t5BI zP6Hx#-C_{5RMJ z0_P+Xkumexn8%)S+Y)#l(gR;YJP<6#1-=jjK0LONWPdJQIR8uK1HpvVIxBIQ2ztt+ zqoEx_X9S%QGMe=~(k#sebCL-an)%CR%a7YtUOQUgv+G>~?N~XSWhx=? z@$fx}0MB;$`JWcQ-Re{XV~5|{DvU(#*+NF*g)j^qk#b~G9_O!i*y&mZVZ=a3;Go(K z`DkskYn56Nhu+k@1Ke*uY|x zI&k6j$JfNe_a{GH%=n2rZOz$Z8R9V?Pe36hIk}jo+A-`;dt9vyvBu#Xm@veu&@v`| zzt%mwc_$nd0-sMVx2d)b0!MqGxmfCumx7yB#nIUWvA{!HOMfslMyW1iV&nY>zxwyj z8^JfLN|kT z4m^Q1mhO(_r4w@`V?H=YNkOf(i&bHT3Auc3bryK1_{hDSetLoLN{VLB^78ULiNFy^ zkUqqG$fjVkJj5tfWkOn|P5`HVEp5@-mGnc0wvJGHC=+39MC2TWT#i?t*~fNch*he_ zgtS^8dH$(KlW)EF1b4Fzv~?&0IQaNdg;W5&{t&Bmg9&N1-rBBr_;Rg8ekw^mn;@T# zlS{|Rq+-Nlg18i%UY;i|q1NnSwf>I@85#4U4002ovPDHLkV1mEDi4_0< literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_code_red.png b/media/img/icons/silk/script_code_red.png new file mode 100755 index 0000000000000000000000000000000000000000..8fcf0f09ae3046a7bace82cdd583ebcb2bb58beb GIT binary patch literal 868 zcmV-q1DpJbP)r^f`W}XqzY0MJb1LFP|{o!^ss14Q0vK;LyO=G zl>{$>EqZ7VQmVn=L0C~*jNqY3H8#?%q3Q0roqd^|`M-KFiSY;D>*w+ z0Uz8~N>7H;5K4nIhJi8x&;^=+2HHRi_#F7wV{=BSiHAq?ldnB7%+B?NDTcxn+mRj< z61uVG&t{Kr{^%b7syl&^Lec@Cep}-^4xR%E4^qC%y(yQ3>*6Qik+BTBin;Qqm)75R zw*W0=p=2VIfv#`}By>6vK?FertpVKXX#ie7d!5Njjt7SP;cXxv1|$2wnnxX-rXOi4 zCubS@>|?^9Pd7I7BFjL40UX`or)zDNt_SNbfH*o`o?ZIlnVdI3Iv!zck$CuY8J#~x z)b7%c4Si|A!bT_N!^PE(7Gl~JM~)mcVf5GNuwOLw7WHHApn#=ARm6>eq|;~bu^Cde z?}?Oyv7mj85~6bc<;NCXGl=HnedB4fv;xOx>Ez2eF6cs;-(PqIez}UA80Vh3leki1 zEvPs~i&z7=CLFw&__`LE$}XG}Z(?sXaIqwVCY8B&QG4#jxmcq)!WE?ipr}qVB!Avj*}>Ogl)r>xpM?l2gvx)>cyy7Y%IL>tOalZ z7KZkUkERae#gJ$;z;SV#4Z;A{PMkvKieMq@xis1Xw20TYuIEiv&kg}^KR7u~uX={> zmIb-4=EqMikoGOU2g$_06|%5e4^cvFYy(<|r-0{vUS6X;@aV-BsV%W|5Xzvm!B|VV zSmdRrN4ePw(Lyx-1EhTP`6nOBym9#P|NVfrAhks(z{2T;b+SHmdm&oN)=psUW;5W- z;xeUthEgF-DVL&{OL0dwNh;}*@>~v0jga!7@pl(3<&AB?D0QxOd1b72d1W_n*JgKa uR!k>-Kb`g|yI#9! z6)lXSPy)q8C1lZ}g3^41=HNKqnYs7QJ?H%A@B2c|8SMY^(nC0W>$>q>gSs`STXowS zHf;~fxQ2v9EZ{R7D*@W3dHBBBHM?GWY!d+JSMBtmYNr=h)3&N+d6b;Lw&L5f{XIBX z0<=xDd8!-0r5i~n1ZAKo8S6whk3~g{It4qoP1rg;x#5%3mk&jNRM%6JB~8n674&Lu zjOeY>TV-L${7M3Ee16fcxk-1=bT*X$sjfGy?MD3({naGKphQs+3kpFIXc5wqAI~j1 zbFp{11V~l2d3vJI8#V@`EXJ&e#1s^fLRJ*Wg{w;=M~?r!g#9HzQ&rnHPj&QGvj#Fn z3Svg0kd--VGpUm_RWo<=l}E2ffK-jP&rXl&S6PS@A&7_wfRM?VW;BwjQGycozWv=q zS;X#GC#q5sWn>vi00A*lr(~r+Xs`q&G^1+MA;g07I7@NDx@V8^d@28HxbNq=; zzxe*f?K5pkhju@>PI%T6esG3%jS_iIPFg`oSQ?CLj-`b*R!!2d1>j$2D{N9N- z_dNmtQl?H>)o|vgtp>k-WAdw)jfVdjV0o#K3YUx7d-mS8etPnmh2`4C`M&w3RZD|f z-DE|Kx}BgKTK}9nDt3ap=<6+H=dQ$*8t;dl`wq|GAhu&8Hex;2V|u*X>5Pwe>`ABX pxbn5N{RLGS=ZoANdGc8E?*HisN=owtMsNTC002ovPDHLkV1hpQeRTi; literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_edit.png b/media/img/icons/silk/script_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..b4d31ce282f378e5b94cd40680d283842229e491 GIT binary patch literal 880 zcmV-$1CRWPP)dH?P zU9(eZs5A|8t5v?eTRRMlZU=heApt;c-QWm;Ex@uN>_}2!i6teD1%o>y^d_S1XRa-N zEVlrobv$Z==R-vaN*dOiP;xh}(13rd27nL8<{3^$d8*UtvbO>4tszOR2{qRsrN9O( z3#0`W0!x4o2vg>#nIhNcON;jbrFs$(i&Dd*-VBg3z>*-1z>;7Qu%r9~e~*90+noc{ zCV%7=ogDig@RaK7i93|s01qGl%Lrt!v323f)kR;ImtNTS&iSm|tlwheV@t5403k8+mq?kbBz7Iez4s~7(WvsntW4bC^upoW zL+_1G1IUA;W1XH-C-(17v0M(ATQQWfmq_ZL>3(tqwR{#U6woa9k)QmX+`va6fx$W7fs9{PlZoQqK^zXeF6_0Y=) zo``&Le1wy)J;oj`vgg^i2{p0wZPdg%Emnhs7DUXV(uFJOraKqiM8$=I3#~g5 zsinLfkEQ%6M1VxHcYm;Ee*Cg{jbI-l!ye@3hJn(LR@I1UqL;$#0T|Nz5 zd2nc8vKx82ktgz=UhEq{3)lo4unp9JPk^rj?#9RQlPAi1CSN^MWOq8&=eySDxBKp( zji41e?rgTX`giA9U}iT^$|V&5%XLRWDFOv1fK)C8U62)K_Fq}nj!CBztsdT?o^1a z9Vz7!H2OjeSOM!4)`4pLLT2e5Y}mpJxP&9NcC>owiRkmrsu!X0<8YS#xZ)9Io~& z!>UepZx&_G$m{7Ncig zMh6C!ID{S;<3ME!Jurq!9wEpaBbhy#*}VB}NmVXfDF8FT2(S;>_wM+or;J2eyeRR4 ncn{*igLkoLaaMWfMP&XzP&{b)e?%0|00000NkvXXu0mjf(|U^f literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_gear.png b/media/img/icons/silk/script_gear.png new file mode 100755 index 0000000000000000000000000000000000000000..56fcf84a8518f692988061347375c9f6ff8d0dae GIT binary patch literal 861 zcmV-j1ETziP)-~Z!n@9pW{oO5sFQkR#oNEERoq9}~OLlE7(C>^?38iHU~FCGf)7!g^i zr#b|KB0a>q#9E#VC2d>I$+ouU+sE5`|IdEEpe##p>ifB)xbn@_=$0}CvEq;yxiY$Ba;K;UP=U?3g05+4N(N2oSY9}8}Qr5e<+2svC{=In|=VE{& z%bNW?0hoJ|s|0~KAd2a&g!c4?qA*m6I5b-GRHHul#pL5pLx4O@`|B}T!Fm#Cr9A1< z>d@-2vc=Ly4lZ7Q=-61@^Fx(gF+iTCgWG#Tn_V_LxiAdGh$6y>NFWL*5aerqn_hMM zVe4@WkS9sAQH!*;GVN|D3`%4zyI{*%a_aem2=mJ zaOvo?dn~M#W*2kyDxFqK6h)fNrs3gXwJQC6lx1LjecjyLoayOlah@b^;KUzyXRL0; zHoB!WFBREABOCJu2N#TujhP((+Eh^5^Ym^jD=Y5Yx$`A1#Ce(?e*3i-Y9F6`2>|3J z*S?v;fQ5wxM-Cs<>2%D@%xE+k@LsJ}dq2+8bY@|><=V}=2Da4<^j8hkdo}941_p;* zy?WILAD%V!`=rIiMayN=ty`a$S(e?rapOiF96EVr21Po+|=RvfC` nv$VA2&+^D$IC=Zp*(vxR7Y$Nw@UeaB00000NkvXXu0mjf2&J7q literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_go.png b/media/img/icons/silk/script_go.png new file mode 100755 index 0000000000000000000000000000000000000000..8e154e2313cb8c8e66baa5a2b22f20a9186a51b2 GIT binary patch literal 839 zcmV-N1GxN&P)z22yyMI`&M<>aiqax`m<9PjBq5ZbMGKcLk`}FvHr3V$f&yJ7L`0OE zD5_PFU=K#J5rqiU9y&S`lcwW%=XuXL|9?*3mo!ZSj(s_|2Pbz7_w8S+YHL-ks%z_^ z?qC`B5V42_e2VXLfI5V|PfiT%fBo4p0I*utLu+L{wAhW4WyNw4-MqKr+v}@`aXbg8 zLl__INxC)-4u+D!g5xjY3*8c5nkB_#-a)4M>BO7~Cs|BmwC`}VNvWzq%lgJWkByq`w8;dT_ zcII<{SeD~M{h7{suvRqEw2`HxF_EQY8d-)Wb7!e=>g?Z3IFx592OOQh-%CUC4Pnu9e!`IV? zHFZ$dK^cQBn;y1vVz1@ys{8A&=G{=VxxbP_EQ<|!yGNdqrHNQ4LR~ui*vn#5i*;0M z%y;HIF?qmBx$e^JPn}(Frz82n<7Y;3V$UO6-Ck z`Rh}6%iu^JtLo_&5AEuI>!p1F;OObXC%?R>tV`Wc+A;d5eLIf0cx%eJKYm^+r3U6{oTe5J$idmy?N@HcLyYCzv&ylY2Q6|YUcC@ zS0JxL_+skfwaKZA*S29ZHe(YuVW_XC)#~eO>5Nu>`140Y|GY7ihq12!{s-FVb;8HC R$Nc~R002ovPDHLkV1iD+kv;$b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_key.png b/media/img/icons/silk/script_key.png new file mode 100755 index 0000000000000000000000000000000000000000..49bb24d71daee6956a5a1e4417ef1a0cec4a407d GIT binary patch literal 853 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 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/script_save.png b/media/img/icons/silk/script_save.png new file mode 100755 index 0000000000000000000000000000000000000000..36216d8276dd679934346c30ace3006e1d76bbd1 GIT binary patch literal 804 zcmV+<1Ka$GP)W!a4mwm4 z9lAtNv=ALSSd<+NDwVaw^{3sLb!X=Ld%vD1v~3H{e06ITmmVL?oETThxJs&&OzJem zHtwUrCLZ83e4hiPx_{6!^k(M?jGkMpCU#xpD+L1R^b^O%J&(6Mk`UL>+ z=KDX%bR-j>Tz%V8|BxWMH@@Yq=Prq6jEhpgV{ iMhatptY3F`RQVr(hfH%Uc-uk%00008!PM!jse+otDvXRhleu>w{(hr=P& zTV2;rBMofZo=3rrs;YWAJqHeofOC+HNSe*6&}=qN@aeaKWm$(L&gF8enM?+{FRwu9 zoD1NBqmclHW{%@Tw}6Wqg+f989t^&~Me(EkfChX#56VZfjYtFPF_lU|uh;XF8H4TO zj!YM$blUKV1mw(6M2qNP2;H{su`-!X|7n%u=>+~>3AvaIiltqd9#DvgJ&1=10t0D6 z$;|KlP3c1Y-2fh17umvCJQ4=!_2+B&{P5)SL<2$#ZY7EM2$|!%^Ti9`3q;4qtws{i zDI^jJKbdhUAOoMo-`t-B@esjXtJQ*jzYmI{z|3qKZ(vLsG2zn?;Y5OJwYqN@My1o~ zTxy!Ox4y9nOZhb^2wGcN&dWOz9qA2Pi2L&&MfZ)$Tym*VCU=T$Q;z6Ze zJ$g#19)u*6U}?pjN9Q`P1faW_&ZrhEh`zTzI_Q+4udtc{7?20{`>0tzC%6 z<4$0NFD@aX1`EXFfryb1uLICn5nxWaVpGCkj6kwT4ni1iOhPYO8V+7ZA`uje zMd-SYjtzD?ftn&>m3S@d6_=&B-;Cz zF*bAv13UKN-Iq6*nUCUQI(Jw5*Xv9h7Nm56LZ>KDJd8b9y7n953x!Z9A}LY;0000< KMNUMnLSTZ#4=Y0e literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_chart.png b/media/img/icons/silk/server_chart.png new file mode 100755 index 0000000000000000000000000000000000000000..1128d3f338c0cecbb91fcd9ac0f6e5ea4598218c GIT binary patch literal 673 zcmV;S0$%-zP)7AT2vWj$BZsrIMeOXfs&qO}(Cv2bXmF`i zn$P8OI5_+UtuCd4RFa4k1d)YdIKBkB+$xvL=D=8hn7|*seIk&jacljqDPt^wuF-W} z_`aVg3xOMp%SK(DsOv`m(}89d1k#uEK(uwQ`+>4B>iWM+_wG-2kn~EK%bH+uY1OEY zT&M{>ut&^^18tc|#7X^j1Yi9``uhQ%%^X6#daT6L4gVa$DOmh%oF>}(w1O79jptw1 zfT=8SaeOJ^j z9Ox;eQmLfwvo0bDP8ISYeP{_k1*6;T>n$70^-rg?Ku7#^t7EmtFLkvlsX#yA^ z0&)=vupq!uG(a51$y=z`>)VvJ8;!<#uh)A?qg~QVB`&`J&rxpz8Yd(B(?r6h*;wB` z0t*?eNzZxZ$!BFL^PX_?_pZu1u)YqRuyb8F${wa literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_compressed.png b/media/img/icons/silk/server_compressed.png new file mode 100755 index 0000000000000000000000000000000000000000..bf49fad9deb97c5a6afb67867fef7151d3f3c19c GIT binary patch literal 721 zcmV;?0xtcDP)LAt_C)p(Rjrvjl$x6>nZFiinqh3jPb8dl5tM>LG_BlnP$G3zi&; zV5o>pV425P#d+3b(m@taAL7K|XcFnkO%?|tvRZ-)sX@IRk%cvG!bAN#(4 z+w(kwDyXXEx~{BG^7;I&kp%U6Jw|{>@pwER4j+L-AOr!FHc~h_8ArLidXsj464Yw7 z%MzSOBxWL!2sWGFAiD>FKp+Al65vGUIL>Gbba^$MPOFV=_uvuuef=#F1jBV{;fk^` zl0bS4g+j0_tKXS(oR~kQx{LkpGU&f5kj$Jw@{$~glwPmBp~@+sF2EQXjVQvVhUJwd z@&qQ6Y45bA7Z-~yrJ$dcP(+eoK6?h5wT5Wu8H@;>3l7IlVr%yz`(eed(eR4SF5JDx!-HU+!&0(x(aLNwrdd+;0^ zFE^53V$-K*oo?Iz&}?N_mL7g&hhJl%P*@#6V7`^Hd1#_@^v<%i-4wq8=5C=k00000NkvXXu0mjf DekwlT literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_connect.png b/media/img/icons/silk/server_connect.png new file mode 100755 index 0000000000000000000000000000000000000000..49b269145afbb97ddd03fcfa844ea832c947fdd5 GIT binary patch literal 755 zcmVwYT0AgCL27sE1k% zB#Vk*Q+6?;e9+Vt!L4!K*`1ktXYNe*UVlWT^w7ZN+<|kx?>px^H{km|{^wKwm9Vg| zaNl*^8;;|sJc37gD5WAk3LK@NP$bk5Y$CIXlI%=4cd(q9B*cVPIfT zN-yMdJTl47IAHqHm0t=ttI8)@h=c;2s@8%}%bVy(RAhosz?g^LzLS!DUxmLngP`ow zrfn8+J7Zx$33yPOy6}EAf^^3q=H^}@`{F5>9HNI({R$?_cfm&~2_!((r0s!M>3g`lJ{4?wIwATQp;6yHt2^& zKYuq+Eb5L^v&R{AmzYgUE~OhIXUe@VXP)2T#eMsaNyJ@y*%#F`%&V0x=ZR~P^R7jY l<)&}aKbCWipX^bu^(V1WxGAiK0S5p8002ovPDHLkV1nEbSAPHi literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_database.png b/media/img/icons/silk/server_database.png new file mode 100755 index 0000000000000000000000000000000000000000..b24e826c70485ac1eca79266cc94b2e1ae0a1d90 GIT binary patch literal 666 zcmV;L0%iS)P)#!|MU57FB*-;`{iB zltEd-G)>MQ3WdU}jeu6Gb%zSx#^dpVu7@$FB3Kqg8!6n{isS6;^d+tS1T>q?r(B#! zB(@`w2rhs2z}+p&hGkm>vY`kzpU*dsK$}lfsgx|PuCB45;;*d>0$A&Ka`;Tf*a+Ym z1Azd>7o`0^ zD1W4UA_^R@YymM~XLnz^iwE`sMl_6kK96WLn(%l$m`3tlgU8W^|fpsnH5pPhXPm^s~h7O^zPdU%%v&b^m;uEheP!HeNbn)AFSBJ z=D4?!CCl+yPJVsw4MJL2IzGU?Fbo61kWM#H6OdXN>u%=Xt80A&C>DzcolfU@rBb;#Kd(U#Xvm}= zAeGuiI(eV%75S`kHk-lk_ahVv34q7fZokG-sdPy6V~Sn(F=ew^z>%07*qoM6N<$f?lLE AtN;K2 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_delete.png b/media/img/icons/silk/server_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..61e740fe18dc615016c3493811f305df96d678a7 GIT binary patch literal 668 zcmV;N0%QG&P)ZQIL=Mmwl(g-y|iYtDg0bIogV2(V47x-17<>@P+Hf!VQ~;Bh1ADY_Vk1>Kc5@s ze}58`N~Nm;9En7Z`Tc&Zu9YFOQ_4UY-hbj=vgo8wo7>bZ?mX^6EGP}5o4qgAd zf>y7X3>E~5{sEcYRlyGFL6@t*C6FW{GilXc39MrFM;3HnTt|X7nCvx95Y4`y#>dJg ztfe`ee?5c6OCFj}YU|v_+9e2S?u!(X>8@nT&ql-J&^L3?zb)dzt-H{Tgi?Q*KmN9` zaDU;lXQ!<|OhHxER^9tl$hWZk7^g1YfN$j)lt&}z{_q67@vzDiHtH&PUMLjK8is*D zAOPQypQzOua-5=e?fX~wjvBzVJA2(9k3ywNui{G2X0t6|kiq1HIx$HB zW_et?e1)g6CxGQBiXw8kTq&|)pgDYkM<-j+S+T2y6lPy^62aYq&DA(8O6C>^FtR~K zY!hn=v!0MX(AnV8*}uTWDx7b$!|CsWCwLOS(jg>=dLNe^lxjuzW(EkiwDRc8MWrzT zziSEZ+H+X@`URpzLuJ)LxN8EQvV&~^htSAO%-@~E2>A%S!FH&NeGn@w_$DP$RJ5!j z=g*b_WwB8z8Ur}>1X^l!cp9%k$vlHq)M0nmV_#u3n7UScz@`dA}==j2R8?9RoCPqd^kk99_k&dImN83s2usHn$CKPP0)nR#b2G3^$ z2t~&h{yYa9(B0jAW^Qh-qrbm@GLw9X=C&R^WM%8FgJjux z8z1%@)9>H8E5K?%8h(ZObQ+(;He^)?YjH9bi#7cdaN|O?+&qJbow|jiS2#4N{$R0WLTZ2{0maUAKP;ba*kDOsb7Wqlp%QS1KhU;N7@5by=0s zmq6AS3WZRs)!NF8;Y8}BQWt;JWwZBmAek9~JUvF7O!F1lQ?STdk6+P4mt#iL@Kj(?SViZ@x(dovnP-+Hn95Y`kB52 zT`>FGIGz1~vGoN;+ytw=L1JPK%=PZAJe>~iAdt=J+(_9tH9m4-G(O@;Y8GggQGD_Y z!)611)4NJ>t;d0!g0AbTZfQU4Rk1%7f?;igyH%=>gVmQYa{i9yyY9o{Dh&#KClkq zZ^`-W=(`>n#l}|$Yi}RC(E2^+50BD61>-}qA41;3ZisG1`*xOo17YZXX4HXKtN;K2 M07*qoM6N<$g3c2*g#Z8m literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_go.png b/media/img/icons/silk/server_go.png new file mode 100755 index 0000000000000000000000000000000000000000..540c8e2689b19cd661d3f07ec6d5c69a48ee79b7 GIT binary patch literal 706 zcmV;z0zLhSP)7<1w@I`*?5OI84*T|9oBhH}d)X zV_ny$7-LpT(?ounOeSx1Bq$b(0RlV<27^hr+Y6OI;2f4ea@pG(#Qc2bI;{>8 z6bgmQ0vry9qduPxrLScOb?OXyK&ctFdYopOnzzF=IxIzTH9TSNw zRv8@$M2+3u-KbWpO=ZKt@W_~@Zno4#v;XQqFdGCChs31_>&3!5%7&#b{zWFQc68tn zplmj4#^Z6+YBf55z<5&3{|y;v7;9uv%2$5X>rHda_}~n%R!c9`2Bty_PB{afo|wH(i1~} z&mbZJ35Q%B^!cO6Z!BTy%i>mD!&!%IJ)KTZ(mdRYL?UO7ODFJPbqWeO)2I~TMhXw( zyp+KE^<^xqJ^!icxKx=jKRWim##AbmAfj1{QTs88yd0gw>A`WlSX(G-+yZ}U&%wWZ o(p|@%!Cl@4H>AxOvt;l80V><8&-M2O*#H0l07*qoM6N<$f@GaWM*si- literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_key.png b/media/img/icons/silk/server_key.png new file mode 100755 index 0000000000000000000000000000000000000000..ecd517425f0cf0a573f091656a0c69e294b6197f GIT binary patch literal 746 zcmVR5;6} zlS@n!Q51&%dDs?eX$!L{YO$aaAT^% z8wrtxVNvT!(-=&NwM9+Zn#dzTR2m+|($3p^r?x7Vm6P0@nLFqI&VSCGVRT)`|6Kge zjaV!eR1{@UmSvtqkZ3GPl4zXp`~BxC0uqUYod_N{91g$PTn&+kplLAt5tmM<1L1J! zEP47D5Rb=CQn4Ti`>a+g<`U7ws?&F_ zfzvp|MzQqNH!H3#j~%}BVf-%##aZb_G6l4GJB;cj7tG=`j&}>Nw_Z7xnHjztyK`i@ z<3{><*+B_lKuBdOqW7yc^Z1f_jE;l*VQ=n3ZZU*Cw&q%gTbv4AZ5(1tfU;QqJva(_ zn7WS!r2xBk0P6N9ScH1;)qty~y}GH@J!&|h!zq1{)G}>Brx3Dtt?nj-%`oKk1+ZKO z44Z?gCIb|<@nc2g$}P}S;5e?>w@Rn3!6Yu>fc6sRS^`$SgVipF07*qoM6N<$f~LGuF8}}l literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_lightning.png b/media/img/icons/silk/server_lightning.png new file mode 100755 index 0000000000000000000000000000000000000000..b0f4e46cdfab24395e96c434d7e4f81f666f93e8 GIT binary patch literal 729 zcmV;~0w(>5P)WDY2I?wA+J)g@swh z*tq9;Az~0KxUTE-L+yVFGMP*>3GNw&aV-*w!yyrbfO<`uM8d%Q{PVvFikbca$;C7w zD0sNBg*UbZv_J@}9F7}CA$k)Y3U9HIWm#<@P#1rB)IBUb)@c`W zV~ft{yH{`1uq+F@t|JpA}c-%zc%xMO9#00000 LNkvXXu0mjfaz;V& literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_link.png b/media/img/icons/silk/server_link.png new file mode 100755 index 0000000000000000000000000000000000000000..e8821dfd88a4a178df1581e12832925c401a78c5 GIT binary patch literal 706 zcmV;z0zLhSP)?mgenukSf$Ow%;{&(Qz*V`F0@b#ij@ zxZm&VX$7rf9v>g``Z^Q}JsL?+C={#&cxkiQLb7}jJpw^hA^ed`yWNI#dL>L>e-q^M z`Fjj@I2>0@CKGnPR>A73szKFMBGRA`S+Ca{9f68h+-|q{(d{0gPvFmm91*Ce^UmFA z5o06)XEYcLXt&z~WkrF1>Y7m3eyMY_&vn4e3W2zY4~4B4@}Fo`ggWoJX72yn!Jt=~ zC}x7Gz;&TMbfKNo1KrTUkU)^IvNFituckW41Kdc8hGB^|5P zDhq;WG2$IrNz43AeK;CB`x^az|5dNo zn+^tpmuW~wqY?Fb9i>u9WcPSHn3$O0UhR>XE|bZ8|Bb-s^GTFBK#I#m;3Sa5N8M~T opRypm6;{4LkrnDigB(5h2_j2`gUi>R_y7O^07*qoM6N<$f)SrU?*IS* literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/server_uncompressed.png b/media/img/icons/silk/server_uncompressed.png new file mode 100755 index 0000000000000000000000000000000000000000..86e8325b9cf7938320d26317b1a59ddc23cd6892 GIT binary patch literal 669 zcmV;O0%HA%P)o zmTnjo#N%;{$781#wOUO^qtRcCC%e)iaFWe6kO?$RK-YEn{eE>9SivT7xryr@aC7Y2 z$c~ladYiP^Pq3RR&C`<0Ux?tE>+nwIoYzoN(EPEW%eEu*a|dK@V-c z5D36?QKuUy998{(pX_K5LZ~&x3q&AivzY>DnM@|$Y&IVki^Y@U<9E>A0yl45$Ngjq zpX#4+cGkw}={MBtb^M^=^?Kiu3X_y63F7=~%;)ndI($L%zDLhi_oR#=SOyS-!hh=FNvz5*&gc}4bkUS$- zpueTJs?jS>W4VH5cvDBnk}bYn&!Q$gHPEkM{Aeg6CFgw8)S-s+lpfn7J^^Wlx#}xw U_BgG30kodM)78&qol`;+07=(QkN^Mx literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_align_bottom.png b/media/img/icons/silk/shape_align_bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..55d2694008bf2e0f60ce19ee9a2bbd8a786a2b81 GIT binary patch literal 398 zcmV;90df9`P)DFExf{Zw)P^3DA)+Tx7p16zeV2eBJN`sG!O!r z%r{>qq_fRm#^J65xA(7`3Wk)qxjOIm1^`@~9w8eEp5GTgVh8&GR>?|J)7!6b_t4vb z5)9aIeRjRw+BgJn%>h#W0y-C@uGM%f6pBvD)Skg0XTAk-QuyBUn< zN;P$?E+2m3@;x^jxVzMBC#}&PhY07*qoM6N<$g6GqtMgRZ+ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_align_center.png b/media/img/icons/silk/shape_align_center.png new file mode 100755 index 0000000000000000000000000000000000000000..efe9a98e5fa3c6ad11072c7d5383c10d7e4bd988 GIT binary patch literal 384 zcmV-`0e}99P)Z6yAF1om>|ST ztKHFR-u%C_TS&rR#$xWUuInG^#ZbZh<7OKK0Sbr!oPg)`=K8c40#>`ki?apTCliRg zlEUj-Ocaa&0ziHzlBp`G6i@TVfL<<@Bqx|guvvfy(7bc&my!0N1m(V4lyq=bRi(Le zNvR9#hi1|)cfp-7Ct3?wOSDEz&|1=(k-c%ksD` e{M&ClW_$rjx>)p&(flj`0000i08P^j52wc?^pz~| z{+5E5H{Y(Hu4@1Skd}#3sVYT@{hJmRi$#&$%TyG}1r}?t9|7htd)Lsfy!ajkDt-Z6 zU91o2&s&(!=K$Q?&o&L4`Lx!Vx>#S23&w$uyhfU-d$K`9~Nd8w!zv$M9@Z1$jp29TFj3j_=8Fw z3{%YI%$@t@b+*~1_I?xG+&ypHkT%yBC*7X`0H;U$*kGH-*D~zj_WsiblwiPy%d>+H zKsFLsCaZ=4DL6hHA;5x{_a@9VN{~#-l-L5WA>DQvR=Nn0X;LB+>N1A`ku;k2zxK4npfSnM_=ZsUd2J2vMpSkH_8s%x1H0<)AI26!ZDKD6N!6J>@l|AVmlDp4k6{s%-F`BPf$oC&{AN@ zdiEsm`7?=OX84O0rxL5G3YAyiA3W{4u_Yt`k_-{ROY9Tg-K@O0-jDvtW z{2*|9y*9tOg^9q!_Q>;57`(LL1f6BD4#7DRBzU~PGId=~JGk7O1tj^fbWx*#*Ac{h z0ba=a=eWF?0CQRvsw;s58J%Ft^?dlC`7PvXK46MN^%$di5+|bh4y+|Oy!L_^s_LB1 v#`bl7E&d^!7k=P_NG200000NkvXXu0mjf?~}0h literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_align_top.png b/media/img/icons/silk/shape_align_top.png new file mode 100755 index 0000000000000000000000000000000000000000..1181b43fb258e3e524f8b297c4d301bc51e1fafb GIT binary patch literal 406 zcmV;H0crk;P)iXZHXLga@5kw1` zhA#fE*Hzt}ZT=Fw0JGW5r4;(UXSrOmSS&VH-}kG0DTVob-T`#~LI7}cx3B>v7_i~u zbicd4eO^~Eq|DX%akpWRf}?{S1X%F$u9fcOa1Yr?@c6piPGCd2?K0H0ekE3#NN+c& z3DVjib38X$K{A;l%7lRi0_i(Jt)iw-nkrGE{!GvejIudIh+13qOivS3wMNQr1j7|R z!z+qRQ^v%`6jG$Rbq_omBvC~U6cJMdhNrhAhlz~uD@szMRj)D;69kuM2i>-pR>H(k zU20R=YA_WM*~Hm;Bk6Yr_0!xxd~68E`15D_0t@>jBdvxMApigX07*qoM6N<$g1oz_ AhyVZp literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_flip_horizontal.png b/media/img/icons/silk/shape_flip_horizontal.png new file mode 100755 index 0000000000000000000000000000000000000000..8667c81f8b2ae38922a801bf8ad50ae8cfa7e7fb GIT binary patch literal 403 zcmV;E0c`$>P)+Q9Q4|H>Gx;$-G!ZQV78ZfoO&~77*3Nn$jc&kZKoCTmAc8K!LP4<=!NN2tOlc{Z zN$xqL$HGYbLH113OaYT)W33X5N`C}SuCsO{M4d)0!W1Bd zPzF|)%AK8~r}nqN@l_U#p4Mv-asy1$8wsx&u~-Jolx`n9hA#o5C(U{(u9g9#gDRe2 z!e}g*5zR(5HY)i99A1uEM(-{!M3@w(Q`3nM*_asR0^}go-P*tZD6~=(l~M=~!wKks x1gKbXqcC{MAPSU2?m_Ytz$O4h|MV~XCU1V{%3*(8NnQXpYiVPVoA5~c|!VPFV?AVO1l*q#wuVDF}{5Y`EMTa_P#5+JM* z7NrLtc5{G@^7nWG`CDHlY@FTuu<8=_lZ5psk-QoqP`Hx{VV$sN)+C(P0F{PBnQyZy zv3A)TEIq7N~!NGFz151St77tx49JDc?6PU}s zU^eqSJON>auuj<9wLVdFzOaAY#g6%o^o5I=?bdiJ&{?IkkvMg+S?VBl{)W}#Hm1{! za5rFVjj=`i=oRt2z*MRp{)mjN&{-$!O(tv6TOh1XtXGZyt1-&_0(6x6mpf9k1poj5 M07*qoM6N<$f}NJIe*gdg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_group.png b/media/img/icons/silk/shape_group.png new file mode 100755 index 0000000000000000000000000000000000000000..bb2ff516d35dc9a92ed6ffdc79595d61513e65e3 GIT binary patch literal 553 zcmV+^0@nSBP)+TVU5_x7IrE&y4G<6LW)%R0m7z{{Dic2rZN9Q$X1&!1i?xJlHEd! zMb<)AaLd@37v7sQ$Kt*h-|9m$FwES`%*UCz+-Nu)o=e)5bUGLe9$*XW_xtbCG~Fk8 zS^==z>2yHy9=5bNj`w@L9^yE@UnO}mnM@vCy?#47TC5}hP9TpCzy*-N^X9b(0M_gE z+tFzB%*@_Lk^lflio(4eCs(C^W#d$;S65tM)myfdnARS}?B&nAG1Y9f~bPvTYI2|OiyFW_ORR02sPxSI|DVlF2 z(;aRKd!WOt1W+_H!3vT$JIHb~{vVJggjsddXjHaLhZC0-bi3U}k|cX1kEhe=697of zarXTeQU_=bBVa~2!_$6z^8&YCf03D;q1|q4Hk+y0Y)TTg@kXPe@p!CSt){5eY8@v@ r@|fhwd_LdX<~P>s_0MMZkmR@D2_>Rn5)Y(r00000NkvXXu0mjf$qDH! literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_handles.png b/media/img/icons/silk/shape_handles.png new file mode 100755 index 0000000000000000000000000000000000000000..ce27fe3a0345e03e919b54ca3b6a8498743b2ee9 GIT binary patch literal 538 zcmV+#0_FXQP)Tm(Vb6n04%0-0d~Z?N5N>2x}bMx$D(zp$faLbcIm6))=iDcNsK{XO_NUIz9_#=Hl90fplE_S$iRDekpz|Us6%gcl z10>7>u(;bXN$%}9L;!i)H44lO83AA=upo5q1c5U!FDx|env1*bl?cq~cLH;UH^p~Rgca1Ok;(*H5ZUXcXOPFe6C@8ghq04j{~AV5iYe^SBjqm*l4!TaGj6|yQS zl0>W3O7lFgJbe6&SDlNa#1ExQ;_~7(-;>XH?~^Rc>h}P$EUWbUeQtj&SzNDKTyL1C zYZj|t%+odV)rMrXCP_Cezg;mNk8#e`cJr5LHk)4>jfPdL)hmSs`qPQy_Y4;U;qFB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_move_back.png b/media/img/icons/silk/shape_move_back.png new file mode 100755 index 0000000000000000000000000000000000000000..a216ffd36c85ef8502b8d3e5255994d19c1b4837 GIT binary patch literal 395 zcmV;60d)R}P)v z+whYUbTtD=;_3AxvLR>j@_3VuCP*of(#dy15?2>z*unc(K3-w5STtU}9or^nBL$nP zxpFy~Ob*vRzkSE`)Q^SnzOP?8cAX z*{yXuWVu|%K5qiHBIoijdLMx`0Gq8@eE#4JzB}(FuvGu=x~*2L7>~yXKwBe&!GPIp pM$x6Pz5*+|0DT4aFQAXWegS3uME2I#<|+UH002ovPDHLkV1fcsq%;5k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_move_backwards.png b/media/img/icons/silk/shape_move_backwards.png new file mode 100755 index 0000000000000000000000000000000000000000..ee3f9b27ac50d9fb560d7f136c2fd1453150ced1 GIT binary patch literal 358 zcmV-s0h#`ZP)@HXh(hEF306Q6`_2r7V>{$iQE;V^UUSdf-&-W% zFVXPFSOUDheNAO3Ap!*~BL^v1P$gcT9~Tz@fQS1#lHfobY>>=6C zi9qrIaOiv80Eju^%ymq*LRD@6%9O6VT0sWebQSjdeQaZ!^?JQn0#tc+J9C}h2K8dK zdLjwi?RKu9YJgmG9ow-(2_(@p4Yp@M*9&QR)zvye66AS^l4d|(=KbTFI`%&d)zki! z5Ssww<&G7Qj|*2z{Lom8f6?>>PIkVv)K%QjRejY(R}`*(6?jp z+G0hH3!I310<6fv$?bSN`g*+{AesWUTCLdc_mtNN%K=-W6PTYtZaH8HvZa6i6&L{P dpY=4B#2-g@ai@NbQ3?P6002ovPDHLkV1iK7x%~hD literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_rotate_anticlockwise.png b/media/img/icons/silk/shape_rotate_anticlockwise.png new file mode 100755 index 0000000000000000000000000000000000000000..07a30206c2d913e9de72e7befe0ff34b975a5c6f GIT binary patch literal 657 zcmV;C0&e|@P)rBSW%1yym%3h>P=CJq=%jqJXyqou@YzvD3*eP)k}mbY7q~i z;GrTBD_SU06%3(@S_Ny;^o!gT-@Q5A7Ab}S?LJP1C4Qi#inM2z{qs&8>j3owfJ*pv4@YF`X*Nd zoPBZf^2Q4Pg&j3PkhTPa8BqA~9rA@d43Bk^1zzLD(JL6%Cs6^Vii=lQt}>0Fzr#L1)~3>`~-s=Ycgt!=LtG$^Cf#hW&f@ZE-58uB`z^`Jq1m z(fhf8v{eiNr8U#A8ZkNcsx5s5ONOVt&(3isK%k_Mhruzis7O~P+0iqmPT%^XoO#b6 zOQHe`WByjjgGg64w64+}E+hEwe^(H;6?}e>W|z8COkcK<&fLwQaWd|~nPJHi0Fz;- zkLbQC(k`U>c<-eZS`y$G=c_6Ua&CjgY$$qwe#}9tJp{JalHgjMJh|C#CU5l328sX; z&pT%vb`+SHj5{p=05G9&4Z!Up;H@Oij^VL_IC!nsxQcn#H7qxd13foA`)fy(J>Q)U rY-kFh_WZag1nU^vj$tRrYOnK8uN+@bVu@BX00000NkvXXu0mjfmTxVW literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_rotate_clockwise.png b/media/img/icons/silk/shape_rotate_clockwise.png new file mode 100755 index 0000000000000000000000000000000000000000..b99db7d7017d397c88d3f365d4151c2a2f1cf396 GIT binary patch literal 673 zcmV;S0$%-zP)-MvO4zAah)y8AdgNT;8aNt0Z#``ZBWS5ruW_!~&_5y@A&Mem(ZTgN^o`}~SszU$^ z7RHvh1xFm@)^ph0*nGGCHC}q|R4n_)A1L3n9&>Brm1ReutcF$^i>p}}-y)rv!{S1A zVD9e6YXDL=pXA)%0TJb?rt->iD68*Gzt-&OgQ02V4o<0CmgJKqX#oHth8qSBmxWt82N#=*8fj=+HCx7f zRfTi=WOc-~l=q1x#t%h^h5>6i)zSai1%ODQad<{ISdvuCby_M8I4B7NffW$v^VTwa z!ysl<#Y!62w*3Tvp2*`_<64r0B}rDtLT-7f149B603-l$UI7t7nGgz!h&XxaPUca> zlFVC@M$5qJHo=m>QhqYAV5c9J7%STfOuTb1F0-VZ{jT#**V$+0nYH{Q00000NkvXX Hu0mjfq@H!pQI5+Ti_L0YJ|=5)wx zkF=1qGlSNkDr^3|$ws8mau%VAs!N}G7ur`j3{a)&lwiJCaRceu$939gbwXgD!G7W+ z`tnW&{YVf#zprcNBv=w4wLNbW#_u=%`)~XMSM_D9ZJ#Vp00000NkvXXu0mjfl(La4 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_square_add.png b/media/img/icons/silk/shape_square_add.png new file mode 100755 index 0000000000000000000000000000000000000000..31edfce597565363903c26264756f3c81ec47a9b GIT binary patch literal 539 zcmV+$0_6RPP) zY*Mj<2s&tEg;ElO(UR|;EE2 zmXINo=@2a3IhPCp07@s1V2lL@EF*&lAQF82)gDa{Hg;|h*v8J&*;~c&MS43 zq~ic-3K8n{ABI4)^_J$J_x#;!&}#2->rws5>!%xweLw^e6Zxy>MrU8S(^#cAS)+38 zI#Z{ndAGSj?bFsmxmr3==qE4{Mkz!%`;`!Bn5~@^u3VfY3c>8z3XyauU!DWF-v@*V znN-fTh{%%cwzfH(9OL$-2LL?0`GO0lX8?)=Zy-K@Z}&P&!eIpL{%){YUuUDf#(d=^ zOKEE2mXIOT z>O*kn@_5z<062PJ1Y;~PU>OFh(i2W?ykPpuRrXGu zX8S{(Pp=p6E}q@9Rq8r05k?6j+`3AL6lUMMN1Qx!kkz9_x58Sax;000000NkvXXu0mjf^cC)W literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_square_edit.png b/media/img/icons/silk/shape_square_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..d28dc6b1a4420e67d2ad201e77fa6ffdff47b0f0 GIT binary patch literal 660 zcmV;F0&D$=P)-HHgciWXH=58>$m+)aUP_=fNurq~c9Jfr+{g4OA6VysNJCVr!>1 zyO(ukr-@eVVQOd_eeEr`d;&*7#Zd36d)>ub=%lXvJGs$=On&Pn97vP9zKEPnrBRKfD#EKdHd|_ZeufOm#a)m@NAF&m3;5bVE$Q(zLZS1JKPk-x02D-XgTe_RX z#5m7GmzbE!!E}bj^$Yyl#_Q*HW-gz-5F#kVUOZxW=<7_hAg}KDjh>#B%CwB&uQ)_iwz;@6pmo1X^%*Tz443SFZSDVxCn0000%A_P)#@-A##Iv1?0U0EvQG&ENA(xNS^k7Z^%HE|M4B}V92E{q3W6e{k)ec8 z;2o4;WI_>0-Os((YH*HbdS-6e>@`^r&%5C**ybRog9Dz3o3;H0(ZZPh3fB%jAn_JaCWIV75Lro?O_~d_!D*f|Tp6e0*C-kV z?*}L-D{Vv4e9~_iEKhKBV4Q*Qj-I$i$ODAHzoJZtqFWmbg;x}hm55tU8M-vhNLWB> z=Kx~N%IW-$qTG7H;Mh%QEVKA%j-FDTzWNfw$x5CMzKw$_Lx%n3aYJO)wwz~idx_3>Z)??@^wP9b!U%(SY5BN zy8egc`%5Y#=Q&dRfx}NIBrMHW0ii~f{+89x%o+fGChT%8I(hy(~5wOC)KNbJH(T^wDQj z6eh>aF;li@IYJTxb2IaN*tt&{lQ9Mn%+#O1(s+QB5)=tBa;k8a`Pr*9lQy3_ce(j& zZ))Z7-_`(NhS@}R>kt*Vv+xjeVKRhMYix0G?mDf|;ZyZ(T&)ioIHtj~B{3mdwn-W?A1_W9{4O zPKYe#dY|dhi;9~DH(x(?k0bVL9Kv zQoJ?!=IiU9LENsDeFNaYfYOs(+jL~IBP;zb`)2R_KV%7xht?ds^8f$<07*qoM6N<$ Ef_nG=SpWb4 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_square_key.png b/media/img/icons/silk/shape_square_key.png new file mode 100755 index 0000000000000000000000000000000000000000..c34b982a07774e25177206a5910f20507747cf63 GIT binary patch literal 607 zcmV-l0-*hgP)aH&8>vW#0l<-cT^NQb7+`9sfwh^a!rV%AD}k6{<_Z+d3^PaL zj8qL(L;P)85D5`6L)8^-YV9=fMYkH5XqafAs+i&m)KMwv@-q(Y`bjJp1nzfkAy7~; zMAXr=w2G1}O>#QD%8AS!GRMB~b+muDgFpjCT#qf1P$xHXoJ&p9GjJL2M~*~q3QMhJ za}SQ+Z5jjth-kC_c9TBx^q#tkRP*fKpQI*B93C3%4!qKM%RmH?xSP7W-NIFtgFgJy z0?}BJNYtY%QG{BRjpcf*jld9b#cuiuzrdN;1lmY+-oB+ zH-qr@WPOVM;2i^(hOowaBC^iR+ZyIoF@=S>%FU6N^Vv26rLb6agM*6)KXLL(hDLFm zc)W+1k3O%Lu2bA|9s^!HKbsBr?;gy*XK`})bA4shyuvk`etcp5$*uIrc6sst{jy*4 t#SfM8)Y0m1@6YV)>ciVlzfWwJ_ZRVAlCjH(sapU5002ovPDHLkV1kNh85aNm literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_square_link.png b/media/img/icons/silk/shape_square_link.png new file mode 100755 index 0000000000000000000000000000000000000000..b885fcc60638e4643d7da2613fd79090aae536d9 GIT binary patch literal 642 zcmV-|0)737P)VHAd+Ld!L2q^VM98w(n1h)wF~45O2p7^VJ*E>2zbFL1)dQ4LX7H*KPh4wz^h zOo>C|P#S_Q?WOh#F>;Z@{myadEwm{cXL^V8K6&4h?+d6ZN0}jxIKi%X^1JcDFsi8f1_4z?)lcJtL=+Ll z>>X0Um`+4g5%G;(E&Y%^BZB}n(pgjx5mfLEvTy7HJ?{{JCm==S^Y}gB;H{F&jVwG-FBPJ>Jp*t72@M3SzY_ZvD7TX)+lb}9j8yl*!ky> z&#yi#l}gVJ0LHMl3(Mc$lO9)Y+`EJ8x}05G@Y&^`V~e(L2TQmShOBjtJPSb z`;;HNT+zVhcLKkQ_Y#Fd;ZIKjW#i`$ z&c(w3oVj?5<LHjPH3 c<+|?G|E;ujN0TKn=Kufz07*qoM6N<$g8H^2*Z=?k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shape_ungroup.png b/media/img/icons/silk/shape_ungroup.png new file mode 100755 index 0000000000000000000000000000000000000000..3a6f369a5048b92bb2f625afecd70f29b32e2233 GIT binary patch literal 666 zcmV;L0%iS)P)4!9)$b<|9tNU+CsbaPrm=%-T&Tq-}~;JVp$fPW~sF0aycD| zJcw2*l?qHIrPJw`rfFUgLbUSveBc-XE>9#9fqK2}f3{*+f&-8)iUMP|+l5#x29-+1 zf1(1;d9zllU2@DV!Q!k<7FoCnWT6h{&Ru{~sRWF%*OLUw$b+Zv4C}1RCJV$7$a^H) z-4}4{>a2320$QWQH_waE`LzS;j2kXry9@Ri*Wio`nHLU+SJ00jVztp|glr=M*)Jxx z_jHIxqwxFZ4y$v9D0AR)a@B&ERc^k`Fu>UNgpz&%tPgLLt51?|a;f8r-<|NEVV3@`Ixv zk00KIFB@-Z_*$qqV4EBaeCWw$v*^bs__%Gr2mK$yfQ_$zp|xee=k*4Z%VnBM|8Rh; zG5CDGRj=18G)-$vo)J`4eW54{$$mxm%4vV+{~xG}o%M|tZ2$lO07*qoM6N<$f@ZNP Aj{pDw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shield.png b/media/img/icons/silk/shield.png new file mode 100755 index 0000000000000000000000000000000000000000..3cb4e257893adf230db7220c06fb9371360312e7 GIT binary patch literal 702 zcmV;v0zv(WP)CSS=grr57X34Zl(zd#$wMb&<%>`t-B(tkBb(psfna0f6_}Do~^xke$ZPQvRr946H zWWosxshhe2GGhTlX^H4l2T{)>lHM28PjBPv)052H^wfm_GUcM~_VUEV$3cdCKWX1R z!rT&^3rTv;k{#1R&D<>@Px1a?%-hNzH)w3T)o)siWm4p$YE@#8C&=cg43(z=rJn}gKmtpUPjP_< zhQXyc#h?f*t`d2Vd9yzWR3(s7PzH#A7!f0%A|E3em_y#OBXS^bn8gJ3v%wOOhaiEV zN+Bg6K!%U|v5J*O8kij|KR-n{eladP2^TtCnBu~OphnPUSs(4yA3V7-gl0O@~?V*x@CTl&E<2=tI5q@L#DQla@S41 zJh{xk+x)uL-5)Og@e9A})romiTU+;hxI5}I{Y{<6W=--* k<)9^%y{&t@hew?Fzp3k#2;Op=9! zVS%RGgcvtB?=hrnT(^1LdEEQ||L^Y{iyPBKvvKOIPJPa&)A<@z<$uZ3-6v zc~$Gk^h9y;%5Y0+$*))mIb#7qgC5d9!ldIb@VnnpFu9T5$YrK&jTjd|MT^t1mgM-l zi=cwqeuBO>+~TDe5+v>*=`WxH zDB^YD#jY{*;V7u!b$6g5&jH-u$57F%uJu6zFoLAQn4AE$>1<~_P>T~PCNq?*1bT)6 zRzMZRM{R&{ERX^dVAKOmgLqjZYY{8*w}EC2R0Gf)APsmZ9%=*BdZ-GBL9K*F0<0k7 z;S|ik4n)A@g5!gewRjZEqxJiE`ktM{PYJ1^!X4M4$r(0~Gs!nsaL3hQLK85q!MFj& z^?C5w(w-@!VR-|4w(O;LaWzcjP~E<&Q-1(e8=fB+?7UC%eKWb`8*vK8;N%7vcaYn! zlPsKDi*+oum8-EPpl(4uz}^wBtX9efI_@#hai37>HjFzH;|vn-OAs<+SwC+-00&oH zV8)~xfcz1FsheLVGO1*BZ?u`-$W^RA1x2fB&I!kl=p3xE?XyZ9830Hn>o()jVx z+;X+D-*LwrDVp8Lxw|)dqa{Tp^)<_wRk4Towq)Bpeg literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/shield_delete.png b/media/img/icons/silk/shield_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..22823a70d9d595c91898132ae06b38d956cd75b8 GIT binary patch literal 768 zcmV+b1ONPqP)_wWDzWofpWZjRwL)Vd8iHwR;&_<&#(aXJ|2rC=4&(@vrY3M%S$@!-jW z=* ztyLco*Wo15n0#0=A?aRByJb2o>G^@3N0CJP%2&wrwamVeY0834$+YqI(Vv}@#Oext*GL@6XYIDnd zAA<~q7WqGC@#Xt*&Xd)?q_FV-8}>d63ap%a4-57fJrO-yE8n*)Uk4fa%1QE-Q&{pR z$N*vK66xX>v@g5`GSbyc$m}P2Jbf|&hC&9GgEOo%g^P0(5)=~DO+kUEP^Q~%?f@E| zJ_Q2_EJGp3MFHr5%W+CU30MjU3jqse^mzJY0vQS!QVxoN1V|An3ONcXl7TrCtU!;a zPr)!tiAsA2Yct?BK$Jn$0hd!dSEGJ*p7v4&H|UYV*vK(n_w>o^{pN3HVEj6TFYk3Y$#xl^Q_CE7r%8FT(3 z3r-UM^~Wc7-lAYHMt;+qH;q)78y|02t5m*iYd7}MJgs_{E6Z`n6TR&u@qf;Lxclai ybx&BVbsWd>_wU(r)Ga$pr#Q!2ut=L3{<%oAf+b{E;+-G}C0%qCSQkM=7lG`eZo2X^ z4eBCEy@)7AgN%7FT@r(le`@L`$DC`&?HtdZ=lA@6-%sb_Tu6{Ny)Onwlls1`t zw)FcKN4tlPVEJu=d0u<&4Wf)_5kpiLXL-K=B^rL2w`R^wXUCEiDQ$fRCf=R>X2((2 z(M5UlL9%d~DC5@O*C{Lzte}VmOL?8`PrgE>k|5 z#7u>;Yon7s@IrM&xs$}d{c+;i4T|Ww|s z5qVmiB>u~lC#5QQ<|d}62BjvZR2H60wE-$x;pyTSqH#X?$9aZk9xk4=gcS_} z%w2~hdwA07|NZ~@|FQilArsd8f6XF{Qw<&ke0ci5`VUv#|NpJ=2j%aCIn+%2WcF59 z%>CW#*}oUPcm3UcP5krW-G`*(r!XhJ>z-n_f{E?eO??G7rnQMK8>51>n=~5O_yZ)GQ;#)>*f=EeOp`n$p2lMq5y8c< Y)sUsE^zP|RKsPgZy85}Sb4q9e02 zk}*reKp2Lbf0AEO7ypA}amXNqYyp>Y;Fci-g4`}4WOLWH+9@cGQs}0F*iEjOG*W}4 zm%wK(ZQw2m_=MnyjyI)bdn5JojW9_ApWwoHWG)HAlBv>up3c{Bd7V)Nj z@iR8U_45rBpRWSDU5?-*Tkw3&gP5hEC2ui07*qoM6N<$f(bUU AHUIzs literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sound.png b/media/img/icons/silk/sound.png new file mode 100755 index 0000000000000000000000000000000000000000..6056d234a9818d248987389d4a621e5c83ce0851 GIT binary patch literal 610 zcmV-o0-gPdP)FDRfPcVFW5d%9V=z{?A#;oriL5xO+n6O2X~nf!lQuE^VWXpgu83qI(qCF{ zS}dqc=wWy-JjhR6YYDxINHb)T^nMSh)vA20R`F7)lzCSCZF94My}d73T>N+m zpyXWPL`#FF;s+j3t(LL2R!6+EP98p9G9EaJe<5S)o@#CPu0JyV*YBbiNC<>y{C`3_2 zFc^fUC0P=`0GC2D0rmxry!i<{eh#|t2UjSV*w|QyY37m5W)KQZKoA6m%^;bK|K7sb zq~^Y!1U(%y>Cs5W^^bz?JUQeR7IK)M&$43OYdMwDJVcVBtSjl_Ar8Hmr2)a$eK-tv zNC4d)(7D`Piq~gVUR7m2k$BH5O6=$i%I6Kpa_sVNy!&j)9UKPT@*VWNNNm+UIUciF wPJ00!a`S;oH}3WS@hUTDnx*^y9@F3E2OYGed{u8eJ^%m!07*qoM6N<$f+a~A3jhEB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sound_add.png b/media/img/icons/silk/sound_add.png new file mode 100755 index 0000000000000000000000000000000000000000..965c503c6088f5ca20ae624ae9f9bb8f05490640 GIT binary patch literal 684 zcmV;d0#p5oP){@e)R=6tn`E0`O&UochFZ7FhGdgX0zI@b zfwou(BBezH*PQIpi)fL8z0AQtp}BZyynUTrZBg2SA`X0cGmm+n_nl#e0l@r=nEwVS z77H#}mcINopj0Xj&|*nZiK$9T94|fX&Uf=yW>Jbseo%3z8&JU=68c{18C+IKL-EK<@goWW*KkIou$FceWXN zR;;c*gQ6&qWf}Q=9;sA{&gT$|i6&ro%)LY0f_2wLyAC_e9ASq+u3Etu7u9GiKoA6Y zyE;cmU`TyT?i+$k6Byz~!4D7Y4!Pa#<`cE+CuDAd!f}ZXbiiVxce( zLZQIn5o-DIjdXP!!OAG^KN}ku5B~vbQ06k30fR6Ek~oG3E?;|b;X&0ux5We z`<%net$Dof>d@Xy!l_+?|K8aSlbnjOk;yO{4)bg<=w}7Nw_|`ZnG|^5X97IRt^WGQ zD%L;MjWyJc0Id_k^~kCIkw-$i4)6h=OtpUi7|C71tF5Q_b!>c?HvlI;Q3{%%>KgMK z(KG#$?uVkAKq#+$Cp$P!bmN>uJ&&@^o1KkltZ82T<6lQN7pT4(wtvQgk^c_UnVcJ% Sc~{E-0000 zv4KjGLD@@SwqBY+AwKj_2x)Ps2A1Yat)lSTxi^%;0wX%`a$6Fye?p-;}9Oz@3_H4Is>e~!^?WT9P4(UVR_y$uYg2R z0LM90z};reLY114GXmmv;A$P-B^yEOFE%_9+Ev5395PjP4WPtcoxO#h*GhbsI?f-T zC;7Pu|AZ>;$? tsn=ZC^sk$??2gfnFO}FzBE_uKzXNI$nkY}mb87$q002ovPDHLkV1k=gKso>b literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sound_low.png b/media/img/icons/silk/sound_low.png new file mode 100755 index 0000000000000000000000000000000000000000..4d918633fb7c50bb382f91385540919583695bff GIT binary patch literal 524 zcmV+n0`vWeP)}W-Vhw;NT#RL?T9uLxYyXVPSxHJZ{>R$9RZyOF=SYo-}k2-w!jPV1Nk(IL7DO zV|bqJ_Mv1_1jn)OuW@=|^wWn#R~_NJtU~kr5%BG&OrdR>hyVLb-^~lVI0N<*QWk}{)T2Jp~1;rnJ&N2haulNhlC*Od9Gf>KFEtyV>~T1KT( zMys`lcDs%9Y!**GpCvG7uAr)U^!sP%^?K-byD$s`r=o}<$KlrRw*+%D1$0-K<~|ff zfh@~77KHKSyI>I8i8yRaw2IR8ItU>!0|7iT3@*K1Y{mtMqF^t`<+5lr>Nw*0@#HI( zfyeDeD71=LjJFr0(_1)Hq)$07*qoM6N<$f*zgBZU6uP literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sound_none.png b/media/img/icons/silk/sound_none.png new file mode 100755 index 0000000000000000000000000000000000000000..b497ebd54abd420d6ad527e45cf61be55170e944 GIT binary patch literal 417 zcmV;S0bc%zP)=wlnx)<^8N0A$6XFU?l;N(8Q}Zq)nMgnHnL@z8KSBRn@Z&a%{xn|-d2Q4 zMH9;98$s8LZzsrcY-m~$XFnviYhEiADa-Lkz!&I><>UW8(|7X;y57kb#}^N300000 LNkvXXu0mjfTqdux literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/spellcheck.png b/media/img/icons/silk/spellcheck.png new file mode 100755 index 0000000000000000000000000000000000000000..ebc632d9bc411a06cc269dcdd21b87574cd71693 GIT binary patch literal 603 zcmV-h0;K(kP)G^19JQHhNlNj`@k%q%HHzg==U|9D%gW$B$$pnzkJW0RZ8O~_ z**^l>7H?3b1=gURtg>1uTESC4M-RmX46)~p85(ciV2C_Fjlp$--AR~)afRMYkbh08 z4X%OwtCOX5QXyPUQYlKIT_aI_mrA_ym5}Ph590lI|1dY-e8b>)T!Q$}jyx;DP=E8f z`?4qhxtni(VX!@_j1r9uwKo$O%5S=2)f{@(N4)p$pTHGQ{xjEJf5%{XSQ;Z8FqGcZ zl3e`w2SfGs#SE#JIl*G#XPFqH&rY_S_vnAX(kK5JO0Pd>Fg+-NGa&&rR{O4h{-3$~ z_A`dyvpx*PS5LYx0%~3Y)SQ3$5raOeW=sQO&$9r%az1SBi~p8$9{kVP_~L)S!pHv^ zGB4j_(A+OUR8nT}JgFeudizi1j#vNv=0E(;kb3?$gX&%hlJWx3pG8j7?*C^R2Ufr z!A*#a0RRTzHbHkRR_DJLALEjfHcAx^ZJQaCv5 zRc_myg{0)59F#Je9Q@Sdc_JdxD$jSCy;J>({^8#4&gN1?BqC>vi&blI&zxtTs9dsc zu%=p8h(t~oGu`{%_~x_M=G}7FO*KQ^6cU-L?s)5;FWRnnq^sq!Yj#K_sg>h{m%dss ztL?jU7BrnUqbY-wDLXg3@JHK6bJ}M8FzuvqO>3o-(cT^ReKO~PIrDg@q3)QP5$R=p z|DjpW{q)MbU;cV*%A}e-wn;xl|F)~zp8DXo_a1Ag8+Xu78>FA5y-TiWxuE5oriK$H z)a)~Awe+&6v)^?M)21~{she=rnC(UkOD8Eam~qB&b#;@*)r{F`la(?^8A-Lyq+<>_ z;)nzG+G?X!hNO~6igec)RoZ2%EjC$eu_5WEkcgy6mBA7#thU^+AsM7fArcXhlB;K`2YX_07*qoM6N<$f^}HuKL7v# literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sport_basketball.png b/media/img/icons/silk/sport_basketball.png new file mode 100755 index 0000000000000000000000000000000000000000..f7a000b9ae4beb7e2f7a532418518dffb32dad73 GIT binary patch literal 977 zcmV;?11|iDP)hK4BUhe$KN9UVKPOxMNOv5-kgi^#pr|CgFd+|MrUGt z(8O1>C5urLHi^@yWCP5`g3ciz`jb5EQ)*Y6Fs<>YtYdi|Z$7iUj3J%5by<|2kMLF%Vl==ZZUK6wy_(+9Q< z#T14bqdL@$b8EdeIz8+6c$_2ho3Dm{@b&e$Ge3_}-Rz{0jFFqou>0@<9I}9N8OgM; z%o28~L@}#V+0e<-wM$(X#VN%q&IP>T<7}wsNzJa1pI2!+-p&1+vlMe>gj2y4bfY+( zc-#sVjvVFcW|Uxuba`lGP)X0m2=Cn{{K7LVUKplqfx{If^3>yCmJl{*$t0Fxl1*xC z=Sn!%C#m&RqbFAnDEjy$`qOa~+rr^@5@-!_>+4_XIyQiez!oyT+Ino$!0U4%Oaoj2 zvRUYlROO}6D+6fD8Rjovg{n%zE$uY*>|x^j3Di^`A=%gnY$1URSSFII2BVN6k+s$o z)0Fgz)&_S~x*a{WL?M%+F5H027hw9gd4!PJ-xtAO1(IbVTpontVdLH^g(BC)U*CN4 zQD$@H{ZL>xmBuug^(1YNgg^)^MIomax%2xPm=+aoiH7dO%#4il-IdWx(V}!xr0!g= zx-sxz|Gg35!xKFNeoH;% zRI>;DPCQAsGd&r#7FHA4(HHytKb{^=?hyV3XQ-8jhtkdh00000NkvXXu0mjfe#+H3 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sport_football.png b/media/img/icons/silk/sport_football.png new file mode 100755 index 0000000000000000000000000000000000000000..199f0f7f1c105db4d1da7923635ca4d1665b0618 GIT binary patch literal 875 zcmV-x1C;!UP)@uM zZrZKLQ08ITY#wSOr^)1q^3X-^zFU_|=8x~6ukZWw`Fy`03IMg#Q84MtI+(OwT`YR^ zV3Vj?^HwNTaMD`&0lplTt79Z>+eQn6urr&!LYc$xS7tL>WK7y@7dr>N0yf5al^FXV zLsw}Y7`B^#-7zO#%jvgKj-OtjYmA}ET{4Eq58sgU) ze_Mc+%rp;W7QIu=E5MLM0By4nQ^TL2uFOYUdL$YX0#O%x3Vk)D&@_v{KW#TNk2~o1 zJUcQ{Rek(IO!O`w32A=(Pd%2UB(9XD zCY7s8^6xpB2zkG~K0LdDM|18c{->}XW@ZJ)H4y#zi6N+Ou(xMXVl;FhpMV*0e*bg5@jLI;QHC){F;>`R6}I=gLXzN-t$s1{H|6% zFkP}V>jwBIwl2afcT19fK!@kT))+NX;>*FcvdkFBbFQH!B@C~lJjt{J3?{SOHlifR z2~YeTK=5R!nb8GGC14LJ9^Hl{IRxUHMzJvYpRtQ{X-ldG#PEas+&AjIl(d#PxV(4ao^#JV?>+&chcHA(W9zrcuzIeZN_*SKBfUBi{Yn_Ku88)CIy(5o z14=m5T;5${pO7EA36uz_sNoww%td4ohv#73M1nBfuf4Ii#Zb`Xkx?c^#Wj|EB;1+9 zTAO`3)Mn^#lUbsMOIsNead(bTs~hdEii`#-c%_#Z93Byp8u;Rfb|2RBC;KZL62xLk z1l1Nr<$n(?o+_Scw@RxHl?15^Rr)FwKC;G~!x?W|M;u9M&TQbFkgoE9M-rMS(BuHC5Cr@S`IdWv({{8!lckbMoyLt2GqP1(+3W4PDYCe1Rtni5wCoUg8 zd^mp3o;@i$cI*h>v}sfPnl)<{EnT|w&iwiF)o^M)bLI@s@#Du|A3Ju;1!zdulP6Dl zA3b`s_36{6u^TpQ2%I~2?u_Zvrx#$=eERfhCZNWNhYlU813JGKsA<;Y$B#EXfBw7@ zXvl6LI}2#LSAT#1CaeY=J$h6QsQJLUb?Yi`-MUo-)UX?9NE^rnK$rA9eE4u1&|41e z?d>P98n9;Tey{XN2VSpQwJPYrg9mF~zI>SrvKfe{1NobPhSUNBx4faDVFy+N7O&eG z?9;UO$FgP1N`Z=DHn#&cgPh-S_wLT8m6ersSPhu8Xp6aX)sCNw7caKiyLT@r z@TT9te}D6{XU__OnzwJ;woSXDqT*IjQIQl@1EN|sE8CT9`8{XOob$ktc3-`Eb3|G@tVF^4Eohg|=AJL2lbZDeI!mXYyuU{BM`P`n65=@@E$5OP&}eExPHN zKIK+vY3a;@f&veidKArFy%Sm*+j@RD6s~$7-+SV}bKc^tr1HtNDW%s+?`qkyWy}Bf z@8AF5xN+nEth|yFnVFfKgz^d4fY#Pl$?op%{~tbl_zz5?|I@PzPo$-#5v3XKf}G;o z6~NH`pOTSxA|)k-Xw4{Lkert3o0yo$PKss_1^|BXzSrUmnOy(?002ovPDHLkV1jkM BXjuRN literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sport_shuttlecock.png b/media/img/icons/silk/sport_shuttlecock.png new file mode 100755 index 0000000000000000000000000000000000000000..917287fa0ba063e436798e7e1015745ca53bd612 GIT binary patch literal 683 zcmV;c0#yBpP)`0Ff_) z6e&KX(`h$k5oZ~J5u9y)zyE$Bk+^QPTGuQV%Y(lJAkE{v8jHo$!C9#h+Aw-No*ght z^l`{um25Vfi-I5ww8;=op`M_|ag-U@4_cbSRV2wryWPHJv)M$}FCj1rIcqYRM%n`O z`Wh7 zK2s_adXd;QTrA;c|W~1W4#eyUX=D7{S)QhURZu{wV*E*$t7xfmZ+P$ zmmY}TY|LJ*Do=`RwN9cf(bdybHtXB|IE<|AeS z=Ja%Q-prWI^L^G71JLJ zE8`y7X+TRKbJ}7QEf&P-lZHVDtk4w%9mAH2<2r{UzpN1_~X;&AtPx+O1GL)H&d;Z}BMq6_~4ugAk%x{bD~00000NkvXX Hu0mjfw(0T$ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sport_tennis.png b/media/img/icons/silk/sport_tennis.png new file mode 100755 index 0000000000000000000000000000000000000000..e88a6efa1d04cdeb47a10bdfad46da5562c2653d GIT binary patch literal 884 zcmV-)1B?8LP)HdtBYdE!qbq|qw^eo+5Go%YI zri}HfQL{4YHLp zUYR_SM+pD;A5hEG#uyVikJyhc>OuUH*p2Haf+~YXw0D(yP z#Q*(9(Elu|vyH(=ODdkx5mLt9X6SV0s#(EJlNopd*b6`zY)?PWbNk=W%i`{rgTK z{0us}i=QdsNYlJNPjhXKpx95be1d}7@A^tuKZDZ-mxQS1ZLZ8z!(N+N zm!bN`MYp~Sa9^t*iP5CRm{p9Zgh~=Y60sr^mW*cp^&j2BPXGUM-@5B#(`4ZQ0000< KMNUMnLSTXp`kIXZ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/star.png b/media/img/icons/silk/star.png new file mode 100755 index 0000000000000000000000000000000000000000..b88c8578956ceec4ff17f81995b8652f6aa2b58d GIT binary patch literal 670 zcmV;P0%84$P)rx?szq&Dw38OK zY!^{rCAFy_2z8TV&4=Ube7+y|oYO*02OOyb5BD7I^ZdAQt`ZS+tMaFrb6^=AxbXHx zH;=|4CCm%L{PZwSS3v3G^sH+#W3JcR_xs(&`Tqt8^J9}d0vU#im5^f#04JL4qMaI^seoYDXwB>7;oyw=|M z1!ayym?6XvqV3ae_f95{py8ukt2TxB^!VIzRRh4#rNu~y^X+P>L{SXo3_|Qqm>9wY zz(9!5s#OBElpmj4DRyjO`0`RiEIkUg%7D)8y}}Ye3}prow;JG>UQOIs{kfZSJ9bYz zskMPbH9)1H6FDf)1=ZKVfe+;jf`a(O{!9meiN~~d0iA$0qX=t0D6Ydx4#RO76h@#R z9_k7Z;$fv6G>QeZ{Yu0n&xL4%!?l}UPj4!j&Vs@?dl=y8#_IQ`5I-5a_T$dJtJ_~5 z4&186>klZh{hfba4fr z6PwPau1z;L*OuFz&bh6rTf>}7rgwL{vsvHnW-Tgd2hPI}&i8YE=X?(f0PF88s3%G) zL~ga9&rja%@sULWLY>0xDcP!aOR+%eUoyJFnDMM*${oSj3a;9@k z?EJir4=x&dXBg%M8gg?G8D(;HQb1#`kDT^wiYFX2G`0|w(-g*MDHJwZ$)td~ZXZd^ zM=)UzLmd}~FicPwWyZ*_Ba#CO>rHB6>1>>#BxM)&QmCCWKWd?Nyxg z+&=)>6*{48at&4w&G;UI(G>&G80eS6s%?jEY7r{)3Wf}R$n|zStvwYwpMBs&0#Mpy zcZ}PEP+CZgSt-0{y6YWb^gq3VF|!w|!LPVeS&djM1|sMl)ZiNDpeh023*EHA5rTNw z2NmPHj~8At$fubW(Ar5}A-e;lANk z;&I0_l(AD4zwJ0C&ELV*x0W^AF~SJPZ4|Ri5*=L%H1XLGNhEkaL_j<+iFQ#NsyJzZ zGnr}Ze-3FkcX%m-Z}8^bAObm+L^Sn+F1qJ*Yw+yxJi4~{=tg~Udf;N#UODH;zN}dN Y4=LaLNh@8G#sB~S07*qoM6N<$g8f@x2mk;8 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/status_busy.png b/media/img/icons/silk/status_busy.png new file mode 100755 index 0000000000000000000000000000000000000000..987c806fff759fafe2a221a8d1eba225a3ace560 GIT binary patch literal 751 zcmVMm^(vTr!>t+|;*hPrMu0kRLK}h1qZtx06|w?a-}3^qoWvxT zfGus7FwBUs(l#`$Om={_&1eeI{;ME6L5Jm!CgE9<;a*I@LCbfxzsBOR;|S94iWW$Y%n_pb3sBMQ?EUhPdzat|DF7MMoo}#Odu|*-#@{3>z*~tL(y81=;uZeUhC0MNvg+l|!JR7U)*Ljd(7Z>ZlA!;mAE z28_{LFwY3!^764(ehIPL)rb}qrN!4(BV2Y~0sQ#0j&hSGU+3y+>f$g$jds6Chbh3? zZN%c~0<6-Wm9mxO@RhWApCP33pF=vU8{R0>yQ4LanH|+bX7AiR=brjTXM8d@|Cf*C hq>WTt)Lfzb{|&yn-Q8GmUSt3O002ovPDHLkV1fp!UoZdw literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/status_offline.png b/media/img/icons/silk/status_offline.png new file mode 100755 index 0000000000000000000000000000000000000000..a88261a65e7cfdd6cc724b95f322857ab4011768 GIT binary patch literal 422 zcmV;X0a^ZuP)guf5051u^hG_WwKQb8ui+Q;x{7X%|^Y&0xPbV_6>a>1n71xJ#O zjD~@M$`ct9q?!Bbg0q&vEh;stNEApDC(Ba13yy!P+##c*P~w4W;$&Iufv}pTfQ-Tm zdG5I(MU0u=gm-*pFN%bYN|{H}gzU+=6QbVu-m7iQpne!TDVN%1_maZRwgWInz^rj-iiE`ej`WTM zRSR$kWHTx*hyeBSk=JUKdG_TQVeX5bE0{JyvV@u~P^D5s5>{3jW?s+db|lDTKTqGC zTB;fqj*8`$gA$E!<6(|fX0z`b`=!k>_Dp1l`;Nt~oamI2oIL+B0$>zlG-M*cEj-Gu z7G6GhbxY_MuX=WHbTpG5=t*22KG~LR)dDD60x7<}i*mIYa*$(UU#um+T$+%4V{Zh% z{cOt!EfID6%<))iH%0cxpsm%7NgxhbM6#gQ5TbN040g35dFYa72VLzg{mo$?eiv;5 z3j$KPDe(1gAtZcVGSS|uAQ+1u@epX5(kV+mX2~2LJ#7 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/stop.png b/media/img/icons/silk/stop.png new file mode 100755 index 0000000000000000000000000000000000000000..0cfd585963d255190b8855a7689e8da1c4d7cf6b GIT binary patch literal 700 zcmV;t0z>_YP)*?Fk0YVb%?UEFajs1S?+YtYiPrjx0+ z+4YbyJXwz!SX#yqTlhtNQ%Ku9=RNm$j)&+(}lZ!UGGp|@|O z09YA#-dR#rIaGe;MBLe!ht*}!c?U}6YT!dfHDO%~>xtx&Klk-^WB==sC_vP4ddg4L z#GN10u$+QGf$!(i3&8VpF6O6+ef~&gQ#>AVqCJH_utvKMAuOeG%3%mn<<%9)yb~#4 zHc70e5sYyQ03$?zFUko7D1Bg1=6jXvg#bUm1b(pVKuC*}koEKGdj<=zdM#RWsl+kfRf;OU^G_BQh+Fc$z&F_AHuQYu(b)aq=H_Fx idDl8IBmWBc*Z2i=4uSP&;Q8VJ0000p%S8Yz4}?d^ZEOv#Sc!)mtIgHXaEQ+_ullV zJO1Y8v8UhuAAS7ozvIlitK{;}YszGvVI*jPQs)gu{RuZGF1qsJqxF>Ai*mOY zeUVJ^Xn04=g+vNN2-6q_7DHe6!8fa@! z^ZEB_2Vebf-umoI@{HTtK!PIfdyIp7Zk$|p=*|D=N%#IIE_w1_EaGe}ST5wWclgx% z|Fx4ZY{8likTKA?G12oM|4&}@o+);3yYs=L?ao)At-(S*$63Le zJ&q^>ZEbL?y!O>L=h9<7rvvdA2Do?L{p8zs_rGt?o&P=^cm5ltT|5S~l@laqmU8i; rSIv!oK>XjU`o@3v@@qdCD9z3Q7_5=EFk?|V00000NkvXXu0mjffa;^e literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/style_add.png b/media/img/icons/silk/style_add.png new file mode 100755 index 0000000000000000000000000000000000000000..e0369c6be9d36e994b0de011069494460d96a837 GIT binary patch literal 844 zcmV-S1GD^zP)e0@+Julu(JNEkTghQ`>*6)1&K56lT)AFSk6p+=zFou9~?@f=o z<8N*rd;0DF(Z}EZJI=hjN-qDrrcCA;MuG+?b>3jqpKx>HqAMRhT2HyXD0l0#iaLPj_0@CCfwX2oqfq#v-#E>^WJ+0O*-%H zHfg=H+pP80LCw-@%MhBYE~}R8d~tQ=>345r($1Jk$Dh=ha`5$Q|0%Z*NM~MfR<5`? z*=OG4&)FMa{LftT;=fMmjdkL&7s}uU7`0rTx%v91Kl4t$`!M0as~0m4zJ7b)=BNL$ zv+kY|^Ex1>-*9Vvz`RHQoOC>ZM%CJXsdg~+{gcAqR#h%!vGjSdf96p zUz&8_)hmghBZe>+iF)o;PnvP(V#cg{58Ni-fA2Qo-b=Bl^VUFHgCb`>{I8mLVHwzf zj-AiHPdoVPfAiL7Uy^6s-UbpBao=Mc+;ijPvO{nFM^C!rXeXPW->+%GCcCp6&YIzdP%Hc)#v{<8+;QI1SLuzO*J`-lP9w z!6%zz+g-kIygcFm#%q)QgFw%o)c^f^(*K)hOZ~vm2n-}+(aVjYFP!CqB_qTX zOJ&0en^&%FY~D`yo5wuXrqeuThwbe*!4lN!gNF~E?|Yv2;o&s_0FxcK)F4Mv>u0z* zJhiT>SNoIRsri=6U06{-CYN%OHJ$srT8APibiLY-K*7FMO` zu!-u4!CmVjT89blRPxkIDKC*hn?y-keBB&eC_)C&se#e8D!|7|Y1Eu$<>Pfv>N49K>6fy0A2YR8!Poer$)vwrolN$#@;q4<}Pej2{e%3 zI=@b?o@g_YM+14D#L_V#yK@oZ%9M~)Hw)Nk$>Z&}>!Pcq%1JmymbL7=2fKmBjgNb+ z0y1kBXpaiveUuCEe9fUL91qlp8>1G%-IfQ7F?q0R5`%pM_H zlBZRaI3ut~u@Y3I*su)iBl3JP27{y#cAw>392ogM27x8WYUncrLQ548Qmg=v)c#(M zKW28lmJEQ3zM`w6LouCZ2JeDx41XWS7nLH=8uZMsJl-Y~+6d*|L+TPovcw00000NkvXXu0mjf$UutB literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/style_edit.png b/media/img/icons/silk/style_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..25bb5b677f89b1071fa44f29a006ed0be8fca098 GIT binary patch literal 927 zcmV;Q17Q4#P)4 za;GYM@Zfsyfm)fD&Ry41qf>=r$+ULd=aUgoB$PD=lkdf_7Ilg?zyQOl7->rK6-vac z;TV_Zv*2yTAsc({lxwkakt#&M=^sjC#7^AUP&&Nl19N&`|TDi=7JD}Yd0Ws1C z>4Cn`%K-NAO-Gb$R zVwgTXc$E4*bT1D$0aYNf*Tq)K^tV$NSHqh(`FgCPo#PoB*clz&@Zz?t*3^<<*(b1GSS=liGL+!XKb`BrUt80E|` zL^nZdavGLlE*g6AK5q89fuGJSBa^o|%9F?I)(M}uC9Y*LTOPY~cz<|nclXlE}xo*2>>r;3Jd?&=tr_!Iww zFvhUfzU@K1>#kb5wJi!Jl*ja3{?P6ZuOx9B{{rz!RGKb8<;DO2002ovPDHLkV1j*g BxhDVs literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/style_go.png b/media/img/icons/silk/style_go.png new file mode 100755 index 0000000000000000000000000000000000000000..25d6181ac9f814963f515c363bf7dcfe6bcb0a27 GIT binary patch literal 862 zcmV-k1EKthP)2r7#xK|RPpjbh>wel673Rj41+4mDY(S62jvPf{cq_v-ek|xTnHW zcy>yBKofFot(G%sIo1G#B%vscr`XiR&NXTSkpSLxhuVKlq0b8fvyOFFICMGFVJx`o z9Z!=OMxATr&E12nLGp!$En9SU4yb-$Bs%I$=UqQ0;@>DHH#uj+XO1BG@b#0f`j*b% zo8Hdvx0MG(WnybQmvf0{fLEm&_Y`L7>wJFk>(D^NoodoN<0$9?4~r423@C43b=vt~ z0*?2*oN`Y*E_*Q9wyl*&`1ywsVT_}Uv9QE^%|MQl-1Pkg6v=u96VUQZ`urNt9<+Do zr|^ZdQLNirlXi73nNsU1DX+HO*_mf5iiqH}tyY^vB#3s)dZ?;8(n=J8hK1z0zs%x8 zT1>1K$0a0CnB(M-F6V97!xY3?q4QI zJM^)H5?WbPBLbE&q$N9)VtHORIqL_r!3rM(UC=%3$HBg~Gs|XB+dLZ9sKLl-cY%l` zKqR4blOUOve74k81AYGY&^6=(7kL5%b7;jOE~VfKJH5%V!}5B_^8pbkn`lx_`d?dE oimQ>CmWj#|C$c)&MDd^eZ)gE}if+w3_5c6?07*qoM6N<$f-cC6E&u=k literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/sum.png b/media/img/icons/silk/sum.png new file mode 100755 index 0000000000000000000000000000000000000000..fd7b32e43bc8128181c1aeacc2c1b0af9dac484b GIT binary patch literal 289 zcmV++0p9+JP)dEcNn4H`bJ0C+qr9t=q z3IB5(AiS{sSlm!hKmUK){R9C#j!Zc}`+sBs9tE)p5$}U$;ZzVK5OzQCHlA<@UGIO! zvj@U9`H!I>IKl6{$7vAD0_aTr_h<@&41C_Zzj3U$sWlFzu{fRl=l_3uX4QtyMkj+0 zY#SOnetv##&Ac*9!Aw2qzO90ukB`rtBTS+*)~sK@Qd3Wl>6w91lc$EXqw|d(p7rtj zL#=9mJql4^&ui$IAYgxZvAe!x-T!~wAEkwbV}v;l|IpFV;kk6_P=alNz5|0Yv$3)9 z;rsjlKkS;w>nL%6C&hSi8{-+bv^22=Ol%^&FHDS$JJJrBFsN`$`tyH2>+-h(-T}M` zbIkMa)w8ljvf0|^RyP)a!RbZ^nygOjY zvaEgmwz2N_`+TjfUI2su5O03fI=3GN zO-DxyfY)uofj}vRZ5#J+ElHI?A*K4L!FxreG+Of^;j>jrB82=(AcRCIi81=y>WNH@ z%WRC|bAfWDj8}GRun?h8$n^AdF*G#bidPlPiBA#-q@JRT_(tjU^l_TnC4PNQQ?cK< zK{}l!ozDLFW@ou==4Pg`rH#LBisPFd#s??Z*^7WN=GQg5GHfE(Tc#HK$)FiqXft*F z#C#!FO5Mi@99aMa4lQnTNq|ya1TW@gEuM_gfac(8lLn!QCe8qYqTX>HUu+Km^FSj| e1UBOv_sg$~0hzRbE)Q}50000VjOibLw0u`97udk^oE-nJ*FfxKk zC>udT*o+LXU%yp4efr{5AO~)Mh>#FJ!=pzp8Gir%3-KEh6I>Gr!}u&LEDX}p!eBjc zFF*hz12Z!-!{5LE;fj$BK^VXcWHY0N0nA2bW)`3V1{4kGG&3`ZX2LW8BnXoH|DOe` z?Z1w%Vfc1rIm54K4;WsHN-*$Bn*;SGGBD1YH}AiKf-Hlco;E!25CI0^zuC2r;rrQ* z4662l4D5>94Bs#9Vz_o>FT;IqU5EjM;!J!~6@z1HDFf%-0}KpLk1#Os3oyK4k!Lu4 z>^cJjC@&Dgdz@JQ{X4tvKQee9-48WwCz=RY_ZJ~6X0ynn~YaOWu_Fv1z8F%p}dk4DHUL_z|9*cLd@B00000NkvXXu0mjfcQ48A literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tab_edit.png b/media/img/icons/silk/tab_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..4c09c0fd702ab11802c4b14cf51aa478ab8e3504 GIT binary patch literal 580 zcmV-K0=xZ*P)GaTv$cZ`CS^eoMHio&-;eKy=l49%&jMKf1j|1aEQ}pE z9vwP~`nZefyGNMm+u!`#;l+tPjhbL(W%en2%J6Y^6!}W+d-KxaaMT#QHQ;AF8}1+% zx=3kp98K({7<|N+gp1(4HhoJF_WNbhY1Jf?sW87uY=q^|1a;A#G{vLic;vEaqaB!F2-Lh}}&E>lF*Y?BG6Ki$V|MM6AieLky^#zer STRB|-0000}QD-v#^of`t8ol%E>>SLB14q9p3NkwX3|5@!@8rWb+j zKGBJmy2QkcQa}UehH7>3bQIt=s3TxA6y;UGTiArh*fR!}8qk|Fkq{6sz{|@^k(K3w z%jHs|NCEqpqO)ocj5}Zsg9DDM`v_`ETJc0*F&`PpL=aqc5DG;UzFLe>MZUZ{hb6kO z9Sat-@DP7QZD|{xtQSm&hCqJ%3;hd~yxTVUEhb{&Mw4$WDDyjt0&Y(-LC>Y za~>9>RP2BvW>Zv{Ra&#B3%lVhY@Dqf3UcFBfX7L?zp;8!i`JL5o114Fd(=UTAXByc qbOk))B+4A!e05mHZ9qIv(%t|bp11egU=P6n0000>q?GuNnCdgP^*Bj5V_b?dAq2Ppn9^MBB^YUM zad0N-T{Ujg*A6d~mYV4na=hT4Nz+_}SGTgW|Iir!%$ z;@OGkWI6+j0H}~K4RYR%!7y|zM`O@*K>rL{*&}x3lR**HrMXC1->#slU>X|w!U1xQ zqc^@R5;6} zlTS!gQ5431?~i{f-N>j^(nf@gnz4vsG~1*?ZHy3tqD@4b(p4K*Q47IE5Jb6XVMKux zSz4`PETXXnBWf%+CAA199Uoz1qRzYL-WG3|8Cw}$xO|**x!?Kjch9kmG5pVR0q(w9 zyl4z(#pnjDHKIXjjfh6HL5VKef+&M%{dV9~Q`7~}#`N_>t3&@%`O>}Fa6y4+9Re8t zdK;w`N)*0U_~I8)RN<_@bpYR&iV}jrhm*U`Y^eJ3s=`-N^gu)dFp|h@h@g9a4Y^VR zl_vl=(O$>>$$5?+s4wJ3lk@b%im{hnU9Z3wjW!0?fzdY^9LMHiGJ|DuWY zbD??rW^(>tPcVS%SR9MiGCsAy(P-T|1*P$9I*U?zy#k}bwc+Wz1so?p2yy^dAKl^m z`~=G@i>&!Ma%=m5);xjI7-J}N;PBpB;wg{LNU<%hjSaIT2|5l&X{c%9#mpGVPmhW9 z4qve$=sEz$wuq-Z0OBc+c*^7Xw8#6;4`|sLL2MziwF|L)Vtd*E&Ibfa1s>SY842M! z0d_`0914f#Z3A& zsdR$=u3HQ~J58li0kE3?1v7bhwSU`zl2002ovPDHLkV1n}7B%A;M literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/table_delete.png b/media/img/icons/silk/table_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..b85916d921ec08675f9e41f18c0fbfd7f2124d8c GIT binary patch literal 660 zcmV;F0&D$=P)Q?2k`9nO>z?V zkm+%pXeD(;$AS7ZfflT_L=+s|TT1_EiiW!ITMXX4Mag6@HO(#LRPSW@V;_Y>1H5R6 zv<447v{ZFFVUNY*Dm}RIv2nDFsh1@_Tuj zC17D*VH8v8SFpp^y1wjLHB#VfgRc!n3%(Jw(bShWQjmB~tT+!(MOc{COw72}B6pni uj`Q&8s8!`!6#=Xdf;B0000P)5jnv(m~oD{XNgT3)4vA_BpPAR^yYtKhdYt0F% zRhCi;sX!=&lnSXdLaG^CB85gO^}75>ZomdmT9+LPq@?{z=d(9HZcH$cN~HnRbYDRz zfsg`M30&z;S1A&AC%2X3x-w}7K-`DJ>yH0b_ir(QE9A5XQYrwdgM)v3=y!r-_us;n{0~Bx1NSxhn7-09ZmqgoMF?+)iQgb#j`e`+7534TN z0IpOht+6e*T|bCrncQg@#4y1G{LUj{Bc1qjw-f1V#cMdE%w2?U!P3-(1P$1h!NI^n zYF>po5J(3gHuQ{%fmY__6fxCz9dEM1=f*ao6DG#gP`>$-fmUFfQ2Qo~WyR~0Pz{s) z_nEh153w(m7@iS4z7&$=Fjpf*6qeoThyw_P)*6om`?f4(mTj;#xt=vi^`x%cPptPc zrpLvJW-}CQ#wj?(S8o;&mxxet6D`xAu4xF>S4X5LM0(y{oc<~-uVyN`jDhEG>CCGD z|Ek2~;!_YJ?tux5$LkQf1)(zOYq`k$bT6^U5=P&&kzGi+A}aH!shy18Z~8o~aj;gW+TQDw?~0 am(K6d-%A+Xv@1gZ0000G~lwc44+E`q>jqydsX9IH6-SKYrQ41uvJ53CgcdPe5{3UH{dfYo$>`2hfE+ZW-+ z=qyK@qHAx1qxUJx7$sWOfww-F*ka<>2?8sKD!vCdAJ5@=E`3kta9r>;!Op~8LeVCk zjrK5~+d_F!CaXab;Qm}e0pD|IZH(Z%aHJu^;ra+o8^?(h)seet4+YC39N4j#{8}R^ zKwt$G@Ljkw`5Dhk>b<8^e46ejC!B{}yhXUYjj5q-tT8C*03)a>>pW<#EhOYSH17?w z+ZiBQ)&hy=j9) zEY9ZRLY&RZj|kF4V@iU_JY`5llj VPx0FJ2v7h3002ovPDHLkV1gP+HZ1@E literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/table_gear.png b/media/img/icons/silk/table_gear.png new file mode 100755 index 0000000000000000000000000000000000000000..cfc2702acd7b7c84be4d84363e6845d4be5614ba GIT binary patch literal 714 zcmV;*0yX`KP)KTsd(L2%Nfb28ake(Nc)gcnjiHl06Vi5zr`8 z(3F?(m8sa))$`m0WS?l=+qJX%?3~|q&b{3f0P254(UJXrb9jGiI#k0{pbFjlDki*T zsNK65bM9bxejAF{MGVvdfg*Ucf>99P^0^-hR9&S2%@qIt{DU3aL~IrBX@O zh{xkltJMZF!Qku$_KzEIr<%^br7DT7!cwWkIkl(KYIP_Ui*UJIkjv$u`d_XSfR}Cb z{UM9R0=L_ZLZJY?UJqxoLZsE{kj-XUkQPFr5LDmuPuODtfppV3xYCS`Mgz%Y5)8w@ z@Angkj%{{2orpvt5Q#*37I1~SZ(2p|=nR#EQ|#1EP^{GPb@v#bw+~@78VP`#hFgbg zG?`3@Mxz`6VzKxVB{AfpV(m)(_QW!7K24!#B!TNn23O@VNMzIK?d?U6)DE-R43$cS wYY%A%1cIMD9`7A_#BRT>L?Qv7&&S{SUnp5P#YQSqod5s;07*qoM6N<$f_olE%m4rY literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/table_go.png b/media/img/icons/silk/table_go.png new file mode 100755 index 0000000000000000000000000000000000000000..0528dfa24ea76e6d1ee3919deb5b95a6c3e8b27e GIT binary patch literal 683 zcmV;c0#yBpP)&Lm&p%aeyiM6U{&J)Zzehs6~qcg z1!K+DX=Sr^zrF)w?A~pFj1Mhkw|6ytB@m3*Ef1_!0J{5Ay8>LU$tBzlkaYmSjnfHU z4a{=AA%8R1Gc-$c-Bvue80=JFtfI~l^`U1lh3|Xx4yA~A;H@{^>pDl;EYVc{nu?-B zgeC*uF;DGCO|}YDsT!>58jRZ!uO%| z#aWyhLKQ+0j^vh5T5yV`V1?G+DzbUD4Iqkhjw~N8oy?y)Yaaf}M024fA2YfDrYonhIm@?o-n z-UASkj0YZ^uZk1(A&>yELViv$1v$q!d@xCtA0sdOD5KK@e4O~oYDmqN2hLGZe1M<7 z(;Ux_k(M<&2Okq^NFX7}co}ucMuw;Q8J!uUBKA~!+FL%aKO{HM-aTF&THSBNV#E@Y zZlYEZE93y5W*UijF$TuJP_pL<3oD7Y0Fm8(=VV)C#j3wAtu~o@R5;6( zl37TUQ5462-_l~GmD!jj5v>qoD#&CdZL|ncl0r}@v_nv@(Nole_8x&x6%kcZjNbMBwtJ?C(Yi}(AFYs~?vRk2bEsX!=& zlnSXdLaGrakwPPtde&IK$Om96t&i0Catrv6bK=UoWq5(p`9mB5v5 z)=M$`c5Fo>t}7>u0B8VqE#3D|zsHgSS4gq|sQ_qs5dJ5?wu*exBLQLv0I;*lL+is3 zJ607A=lqXD)Kz98$ z0Kk+|p#j@6s9WK|HleoC!*-vC8lMM%8lQ*N6K=6!R){%OyQy9Bnioxrs{xEtZJ+d^ zO-0=A`GsMO?$Sx{X*lg=)O z4W-$&xc%}6i*o`@E!l#McQdh|n568ZXieE95$kWZg~|-kG7UPr9DreO8sIAEi_c(M z|3^&A!7yWt&vPIdXYgCfvV{;f-+m@oP?$sT`ylf34UErMnYX+OoxX)3qx9TNVI`9!Qj(7! zBJ~X|LBB1fet5FwZCP5X$*z#NLL!CY@azuC*KZ*0G-KOSd37hvrB9m)=T$HmjdxtT zP~!(cYdxlYX{&yc3N`6iV5@$9dS&$No`nr#>FmF)?AM^v85y`cFa9%@=t@@v-Jo56-xpcZCLFvFo+sh%yoi{VZ?9B7cjqH@ z8!|K0K+I4z)ErSm)DSg96%|L#evN4{_Y+flvN@i^7vC@LifQSMZsr<)pJA<0#?&w| zOa&KZT_b+%+Dp|_hzX*?r~AGp1Wm_0Rk|^m+?;%ybY_6erk!{YJP6vXQ(u{gS1-+DVsvCiz+&=4Z_!gK zprJ`^=?3>+I>|eGM~G4xHY`4{oCq*90 zHfq~Hqng;lg=?$CiB$~Pv85Boz}<0ozC3%&%PVDHJU8YKX5RO?@Ai3R;RkPKA6bUws5yfGJ=?vs`Qc_KTWo0goouiTL-$h^=J)M zL(O?@u!DuWRi0($mT-4AOn)<_L=-A5W!r^l6;r`F>{yEp7wdQ}83!rCswNq=_ zq*jNNQb+|tDWp_Lr4dr4g+vOCRBEEDwY1U&ptQczSefnpm(CAfhmP(LNTs|0gWq2v zlt4&P#};uo!MS~DaC{N8 zCc_0sd|7PSe?371F2g}XWgdg$NiJ9B?;%LfL$Ni4Pa&qpcOjIeH(99(9V2I`$*Ld>uIkVFf6crZY_xlO|{6Tm3 z1o4FhjvYTmZOwVY;c&YXKnQ^b!l4;FIR^oF)OinK+qAT_P*qh$eSJN3b#(~arm3|Z z0FTGx-t|Ch%1aM3{dqDqst+F{gdh+IV47xXfGi886g@AVaq&Ve(P(tTp|$4j%daEC zmKCeXd2{W{Th5-WpxEalE7M6Lksufh;&!_!DJh|#pn%_-idb~s9v*r>=Scs~Wo2bX zQBjfKG|hqH;^I8F+id{OrKP1dAnNsc2Y`&t%}p7L#gdj~HT(fFX--g%a!N-40000< KMNUMnLSTZ?Bt^mi literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/table_multiple.png b/media/img/icons/silk/table_multiple.png new file mode 100755 index 0000000000000000000000000000000000000000..d76448e34a04f5c94794597f91ade6f423b3f6cf GIT binary patch literal 612 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 bl|JXclv{aX%Z3zd00000NkvXXu0mjf?NAwh literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/table_save.png b/media/img/icons/silk/table_save.png new file mode 100755 index 0000000000000000000000000000000000000000..25b74d18f740ff208435f72333a1633569c0e833 GIT binary patch literal 723 zcmV;^0xbQBP)9=EBdhkBh&jKg_`&J(Mr{5K9?YB z7%NS3^ZC#w7o(tnOANaU&GbDgva8U-z`c)j6qd7VU7r32pE$mM#UEBK-6|qt9$Fs- z6>t{%pB71ynwG1c@8bc0>raNK6Dt8qRVe;QF-EXH2&zgZfzI{KWSyaNeKXb?5(OWH zv)$_uQKBdbLe2@*YL(JNiVIR}Vqy(9UXB8Al#S?e6$ef`OJ z*^@Dj?#>2+q<{qlHA2?aai;eJ-%1m>7t)ru4w<;#O*nKUzaX~*8Diz*A!^1TLczbnd@cygZQu8S|yQc0M~PHm=T*UUVeXvI&U+E-jSmPDu1(PvLywGr8TgQ=M*)M_<+{4|1yv{5RR4tt*Wfq6tg zLV{VqgJ)69K=q3ablpCL%L@Jenx}`>=j@dCAobP_wYPDAM3Q7fL890|4 z#q#quqV8u*XLE?fV!B9yx*?fNYUt4!L!nSOsV9)M1v7z%l{QTPbh}+$%sJP^lBO8; z3a;zI^!V?C5EafH8AXH{TZL+c?Yyc{Q!(}Glv$=hf_>95_YL%VJsl5s55{@|)lF+a zE1Wu%&|-!|CLG7nKMr>flBfwxtpR;Z@85+l-@7=lHwt^xAuTMJrm4~2xi4NQ6w;oW z3%Uilc5~@%))oFv^}-Y;b^wV=Wvg>0lR-QlN3+>PwOWO3+gc~WEu+sIv|_QikCLa= zhy*j8PT$UEvnZF#sMqUrl-p3mgx7y17`FNO`B^GjA)LwQ^N)kMUmr-cdnR<{ga7~l M07*qoM6N<$f|JxSlmGw# literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag.png b/media/img/icons/silk/tag.png new file mode 100755 index 0000000000000000000000000000000000000000..e093032a77d0b90d3a5dc05759dd6bcc2ad51715 GIT binary patch literal 389 zcmV;00eb$4P)OW%^N^ox0}MJJ@O#dCdMskq^A9kwxXrIWcrSi_3?zrw0R6UmLLRf9 z9xK}R`oI6&r}tpuA*){AE8G3%KS)ly_Kpx%1N2(%MMSTD`Mq%KtN(tpp59Y0xFL-s zCmpcp**%b4#M0;AfpQTj2Iw~2WeZ>a{A1;gH$Vl?eyiqOGe&o+X8A2+kX-4em;VE2 zKK`hXbcGGY1?t5&BSPmt{hqbz#ea{!2lwRTE=eQFNqbLybPpsKH1pASpj-sjFi=dn zB4pce=UD3Er~h4B?!v>sYto~887rRu2g%7rUlhU{3o;QG_$|wC9`o+J2ag5+DGxu` j)ZRG;k{c;WnG_5FM|sxYY1FNa00000NkvXXu0mjf#+s`M literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag_blue.png b/media/img/icons/silk/tag_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..9757fc6ed6597438eb8e5a70a1ab2402cdebd5d1 GIT binary patch literal 586 zcmV-Q0=4~#P)6YY{78#rvt}vj%qrc zN=UU@y$E6COaj9&r1NAlaUpajQlL~SorN%pOwHs*2laYgHBA$?ZOd~4Rw@5yFm2?1ZIg`0V-$-;GT1Fi5dB7wUSNi^%`^Ge62m>OBeX610Nsukl}DhDG-mxT?nhyYH!4he7Ri8 zrq0Ti&UXUvqX&F@JcJAe14@BNBqAY_QZAPjF(Y3r7P9H_kB#@LgFAf>xz>Qp&n=|a z>ro1XLZK^nmO`PRh#C2OK0ktd7l6-A;O5?fz1gNnCX)yR00~-SI9%?%=X}23bKl`4NrEVf$mjFO<#Nbov&dvJ zNT<_CrBZ7ExK+Uw3I&YEL1 zq(%qHWHR0F_n|0?dQQMtEQVk(xD>*X>NJrR|6!IJgTVluzJkEFiIZBbhHyBHKp?OH z;YfLEc{Cb2#_Pl@g6c zwX8?E)9I*5#h(iF=`qaGA;gdY_^%U4sZ=5tu-olxvtB}>ke2l*x7+On$PNQM`eeub zw>sQOtcA_q_1U#pC~GN zxfc`_zq*cJS5eFyM^neBh0V3}>eD$_#z~y93x^BudEejjyyv`!5k(Q1Oa`e`3dv*= zi9`bNcpQQtAQp?w0$`>sCY?^B-|tVXYPG6B!r|~#2t$==L8Verl*{Gv2ts4T1p-Cg41%^T)c)i|3Aq-XBPb9^Eh~-MB(?O%%1HUtLQYw|; z_xr)~`~-xd%KMgOSq3fM-RomxYk()80j@IKD;A5?1w0eX zO8_7BFTq~F0B&Ih{IyeXKfVEz$#iz?L`i>Ij^m_Stu}(_2;{@7O(gElqvL#zLDr4E zPj?Wzbx~#))VC+@m1SA2+wGRu@+EI*AlQZ4U$s{{4PFIsxvodT`{7+wFD@IcbRw7dsPL` zqN+OerCF_3joECLc-<-@E9d2JYjfCrFoQ2E$G|VCW%r`$A@jfIYBU-(27}>DVEOcY jqWG2CCjT8;O!xl+&v_qytO7mD00000NkvXXu0mjfWRW`K literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag_blue_edit.png b/media/img/icons/silk/tag_blue_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..2a9f6266ebbfb023c9965cac87924611d3242a2d GIT binary patch literal 748 zcmVPQ541JUvS~ZL`~zygnz)KVWCC?F5D=Ikq8U?h>6CXAjX9uM6jBuQEWg2V^GsJ zMH;n{ex$Xn{j#O)Obd}(%Ft$twTjfv*iMJzn?agT3X8Y7bI9*=`z7{p>R zM59qeA`yhcVT3{<1cSld0H~b~Mbk7SN!oHUnT!JQ`FuM-Mr_<>gM6Qt( zaJ${xLMS=1+$_7vg+L$>Di(_nMNz5CK(E&ehr`hjLdmWhjYM1~ky$|ykSmI?Ev+X> zrBZOYT(H?}TOgF|yb-xttwI)mFG;vNvxdGefR$bUmP{rQusp)t#2L&_^&>KR9MLCD z9Tb_7&*$?>Q>9V?N1O-4YZzjH;W(g~S%>_|OoFp_Vo~nZx7psL70cE|*gv zi60^cLK3tjfhp`nfw={VcZ2_S1%<#>%)aa*Bb!S4U!4hV~9@te7c zr1k{t#!*?UQf{ICTBfI`)#g`y<;2J9B=#o=3tjljp2G@BGXJy%7Sn6!^?Ft98tVbi zF7NG%f9OTj`~Vq$8%hi9C`5Yjb(qASn%E?62+$241y<9T8$Jzt?;d!xt#E0M!D1ZW zB5nxiyU-+-y^m4$KZL*kFm#s=z^osIPN!2fe9HBOw&q>Joz8=zZJ<@O-aq0r4)vTO e;(gowO#c9xAttCU0DR;C0000^5T)AZ%#@G{_P{NCN^P z(J0zvSn~SSm(Ur);-M~8^*;61*VRI`T1BN&LAhK;sZ>I-SVW;vfUfJv=ko^ugnc0x zhJodBxe>iyk3%w<%wC8holUJ4(iv>tL{`DQt zPOsyUbO_Cmc&*iHkqbm3ku`|GcC^OhF>jj9W*GkH;^g!iUVpib_h*=@udp4h(P+e*zL_~ZmJjh(y^BxULwq>9zXoYE8sq{#pN~U0C6!8vY)5N2 z9P*}mw}7X$O^qTtJef1ACWvJT9^wt-)Zh0r~j#0bT`f;-zv6 z^Tmw22!%rMcs!TaUX<-8s;X-B`+Xbo+_uWuFa z1yIPc?DTrQ7KvRhmt*TG|L=EYQ=LqFX;=Lp`4}jx6BE-@00000NkvXXu0mjf=s_29 literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag_orange.png b/media/img/icons/silk/tag_orange.png new file mode 100755 index 0000000000000000000000000000000000000000..454a59f30ca04916c30b5da70821b236df7dd934 GIT binary patch literal 586 zcmV-Q0=4~#P)YYm{!ci%zG5cDs#MtA%E>iAJM=dcBTXt#$=Kxm1c}S>T)> z)oeDCkaD?v5u%VY38vGjbe>Em9)x-#1qy}2S%^ZB=`y)dqgt)jH=7L{$B}&kmP#dL zv)PjngPi@y?F z?msb!MgKs27C;q`$Nl1^87)}9-#;n72%w5aqyBI>%t#yv1bin~`G3EwaPlhB@q!hxI!PKQbx4SpL{`r}VmgkO zKJ1rs_WIV^Cp$u~*F(44MZ4WbtJOlY*+iq!K)qf^tya4OAlxdU)9GNp-=EcdKIf2f zxqK5MkTVHpvl(}uPNxop&R7Z*3Wci>fg)2gxzRzjTCMB44$HFmIRQ(h60+IsMTkJI z$3`aJvdFXbdX25Rfl*oUyUApNd_Ip%CUXW6$oUxAwr!Budf7tzCgJ6?1fzU_jK^b2 zfn+jy0uk7ZrmCvEX}8;PXYF3X>c?-ad@8i>vI7~7Mw9~4Xw-oSl}hCko6%Ghg*TZa zojb2QDqe$2yuO1BheJw%P$$M1@gl$?5#tJcsvfD&-d}drYvCA3ZZKYBvF_B1^w22%tHlRHzus60N_IkZ8=MgV0M=TZ-Baw(nn|S=hBxdI) z;;R6va5(H{FKyC-4F-dY;+p`fU@++R`~4<~Jsywi;wt~|cV(__CjM~k{x92pJ|?T2 RMYR9`002ovPDHLkV1iy62OIzZ literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag_purple.png b/media/img/icons/silk/tag_purple.png new file mode 100755 index 0000000000000000000000000000000000000000..ebaf0e8743fc33cf152cb7694b865e8d8adbfa90 GIT binary patch literal 599 zcmV-d0;v6oP)GWQRM3$+Tx>2G~D3qqtDdzLJ$P+M| z%_5OV?1V_vbzR8Cf4JqIVHo)K^%pXcv3TotyGW%{h{xkw5Q#dkEiV=ekof!9z?%~d z=g(E7!z)Oq(;*j#L?RmyiObN>-n-ERY$OQs{fC-WE z`TR3JBO8xbMN0KSbiO^m!^f-pEr_bBgH6ZV(+;jrKl87%5H3QY5S&iu(~XVt z`Q%tE#s-6d3Aucs;QCb?w-;^voEneC7ITEh5sgOWa5&8962;=`54d^#1;35CDRwv< z7ITTajw2Wh%6`9}(Iu`wF^PG8L%bJ2;q&>deAA2$Oi`4b;)4JRkH=$mxm=9IcDvoO l^OXPhyYjA9E`GA_{V$1@FaBct0}KEF002ovPDHLkV1kGx8r%Q? literal 0 HcmV?d00001 diff --git a/media/img/icons/silk/tag_red.png b/media/img/icons/silk/tag_red.png new file mode 100755 index 0000000000000000000000000000000000000000..6ebb37d25f58c68246d8ad6a015295dfa5367870 GIT binary patch literal 592 zcmV-W0k7R5;6p zlgVxxK@f)LC45c9TOf_{d{!)DV#gQ9u^lTnR)N?B4hRsNK&)mFLI{BXaU6RP-Hd*B zb;Jb3l0#jp`v2;$?rNpgYN6R|qF%3~R;!^}t)fz?pj!?Xf$9L#$Jra zV+qOU^Cuw+btb`RG?JZ%!=VYGoN$3mCUX>`kYzed-6&Bk7R#EZfpaeN1kB}fNG6j9 zAqsWf92DY}usm8Wm*DdmSn7|g4F&_G(`h6Ui9Luyoi~=(>orKcUM#@A*}%S@gC$>N zt>5pH3q+&Q9f%@k)E7cPhZtkvGtt>@1HZome|iABzA_=bUXNTL7z~;arBEn*5i{!Z z`TQ^BwFP!@4*qZt{`(pH*W(VP+wGDI_d4WAzVcfivW|vfP^h0000QiaQF5iW`b6E^(ZmMn^kdOo-E`onH8J z>I^oDOD^i7tLp#iuVX0<1_Si_eRR8BbUGch+ikR3Ei{`=G#ZU70Mez9dc7VT$2p4m zd@dl>YV{&SqRAvsRaHz@6vc&5j=MmqR5}Zh$TBt4G)mO#_2y=?fn`}DPryp0f_y%I z5+c#mT_YF2aLcM;7%2yjikWQx$AQIn^t=DVOWSS;S{So@FPhj^qFdn`O&<--0OvnY|@wf|-YPH%sz9Z8# zO*CzvI(X)jneq*W`tt}f9*@ZdB9VxI2uitJmidlswOYMG{`5KIBMjws55m8-gs2aP zLvn#oD0JoSQYaK;z9U;Mm&cHYA7FRacp6>9u`S^unM@)O2)sRbQNEv?&1TtRvDkxr zfPVJ{f2X&2F*f^RkGsNtWHK2!l}a(X#8*fU&-Y*9ScWV1`~4pG5le8ujv*W^`bq(deZ3B7hB~2~XTCyZ1O;cQ)B1udZC+u$StgkNJem9(+80{W^ak4$r zssW%66N!3M{XR?-QICiq>aimHe*MqdrL?~k9;}zz&5;}{t9NlCTfU+yw_XaW)Ch4whj=bo>I#_Vs6a)#}JGIWNaL~IW&KV7+rh@w6q zqeyD<^tSp;x2rf+j4_xmzWv1qE+$Zq3342N^(Z@89#MUG1~^fiDr4c0`S}IXK@XQ% zHvj1p{<^sONvG-0)W=J?X0zSO<%?$h<`V07dt^>zfOIP#7t)x%Dqs7rGa}Kl|zX00F>> zFMph>SIQr>nsqXP@`0y)H!7nnulA@`>O|$nn~&zf+b7SPczgGU&P=O-3Bd%670gqB zR&A7>`vby4iK&BQ)w#D$eGU*@`syR!nVp%dR;q05T11s%^d!K0PpKG@#4)`+p;(<_ zv{pF*5CSBb1{+(u+}e0Rk~WyXvPhg{I8jn7SZhg>lq^YESze(ODM8Q=9|N4VSWz