summaryrefslogtreecommitdiffstats
path: root/plug-ins/gimpressionist
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:23:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 16:23:22 +0000
commite42129241681dde7adae7d20697e7b421682fbb4 (patch)
treeaf1fe815a5e639e68e59fabd8395ec69458b3e5e /plug-ins/gimpressionist
parentInitial commit. (diff)
downloadgimp-e42129241681dde7adae7d20697e7b421682fbb4.tar.xz
gimp-e42129241681dde7adae7d20697e7b421682fbb4.zip
Adding upstream version 2.10.22.upstream/2.10.22upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plug-ins/gimpressionist')
-rw-r--r--plug-ins/gimpressionist/Brushes/Makefile.am66
-rw-r--r--plug-ins/gimpressionist/Brushes/Makefile.in863
-rw-r--r--plug-ins/gimpressionist/Brushes/arrow01.pgmbin0 -> 23160 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/ball.ppmbin0 -> 4858 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/blob.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/box.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/chalk01.pgmbin0 -> 11245 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/cone.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon01.pgmbin0 -> 9259 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon02.pgmbin0 -> 9302 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon03.pgmbin0 -> 8502 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon04.pgmbin0 -> 13059 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon05.pgmbin0 -> 70503 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon06.pgmbin0 -> 9327 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon07.pgmbin0 -> 11534 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/crayon08.pgmbin0 -> 5059 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/defaultbrush.pgmbin0 -> 11859 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/dribble.pgmbin0 -> 9222 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/fabric.pgmbin0 -> 40060 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/fabric01.pgmbin0 -> 40060 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/fabric02.pgmbin0 -> 27615 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/fabric03.pgmbin0 -> 20780 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/flower01.pgmbin0 -> 40060 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/flower02.pgmbin0 -> 5158 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/flower03.pgmbin0 -> 4933 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/flower04.pgmbin0 -> 30438 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/grad01.pgm205
-rw-r--r--plug-ins/gimpressionist/Brushes/grad02.pgmbin0 -> 40060 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/grad03.pgmbin0 -> 31502 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/heart.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/leaf01.pgmbin0 -> 68180 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paintbrush01.pgmbin0 -> 12347 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paintbrush02.pgmbin0 -> 16847 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paintbrush03.pgmbin0 -> 7059 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paintbrush04.pgmbin0 -> 35260 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paper01.pgmbin0 -> 24440 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paper02.pgmbin0 -> 26053 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paper03.pgmbin0 -> 38436 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/paper04.pgmbin0 -> 52788 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/pentagram.pgmbin0 -> 42060 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/scribble.pgmbin0 -> 18974 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/shape01.pgm5
-rw-r--r--plug-ins/gimpressionist/Brushes/shape02.pgmbin0 -> 34285 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/shape03.pgmbin0 -> 34285 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/shape04.pgmbin0 -> 31303 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/snow1.pgmbin0 -> 2360 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/sphere.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/splat1.pgmbin0 -> 10101 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/splat2.pgmbin0 -> 10103 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/splat3.pgmbin0 -> 6755 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/spunge01.pgmbin0 -> 12859 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/spunge02.pgmbin0 -> 10058 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/spunge03.pgmbin0 -> 14059 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/spunge04.pgmbin0 -> 8057 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/spunge05.pgmbin0 -> 14655 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/strange01.pgmbin0 -> 39703 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/thegimp.pgmbin0 -> 19860 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/torus.ppmbin0 -> 10813 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/wavy.pgmbin0 -> 17807 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/weave.pgmbin0 -> 16399 bytes
-rw-r--r--plug-ins/gimpressionist/Brushes/worm.pgmbin0 -> 10060 bytes
-rw-r--r--plug-ins/gimpressionist/Makefile.am87
-rw-r--r--plug-ins/gimpressionist/Makefile.in1216
-rw-r--r--plug-ins/gimpressionist/Paper/Makefile.am16
-rw-r--r--plug-ins/gimpressionist/Paper/Makefile.in813
-rw-r--r--plug-ins/gimpressionist/Paper/bricks.pgm43
-rw-r--r--plug-ins/gimpressionist/Paper/bricks2.pgmbin0 -> 9662 bytes
-rw-r--r--plug-ins/gimpressionist/Paper/burlap.pgmbin0 -> 9274 bytes
-rw-r--r--plug-ins/gimpressionist/Paper/canvas2.pgmbin0 -> 40058 bytes
-rw-r--r--plug-ins/gimpressionist/Paper/defaultpaper.pgm5
-rw-r--r--plug-ins/gimpressionist/Paper/marble.pgmbin0 -> 40187 bytes
-rw-r--r--plug-ins/gimpressionist/Paper/marble2.pgmbin0 -> 16444 bytes
-rw-r--r--plug-ins/gimpressionist/Paper/stone.pgm6
-rw-r--r--plug-ins/gimpressionist/Paper/struc.pgmbin0 -> 16399 bytes
-rw-r--r--plug-ins/gimpressionist/Presets/ApplyCanvas43
-rw-r--r--plug-ins/gimpressionist/Presets/Ballpark40
-rw-r--r--plug-ins/gimpressionist/Presets/Canvas28
-rw-r--r--plug-ins/gimpressionist/Presets/Crosshatch28
-rw-r--r--plug-ins/gimpressionist/Presets/Cubism40
-rw-r--r--plug-ins/gimpressionist/Presets/Dotify40
-rw-r--r--plug-ins/gimpressionist/Presets/Embroidery28
-rw-r--r--plug-ins/gimpressionist/Presets/Feathers28
-rw-r--r--plug-ins/gimpressionist/Presets/Felt-marker28
-rw-r--r--plug-ins/gimpressionist/Presets/Flowerbed40
-rw-r--r--plug-ins/gimpressionist/Presets/Furry40
-rw-r--r--plug-ins/gimpressionist/Presets/Line-art28
-rw-r--r--plug-ins/gimpressionist/Presets/Line-art-228
-rw-r--r--plug-ins/gimpressionist/Presets/Maggot-invasion40
-rw-r--r--plug-ins/gimpressionist/Presets/Makefile.am32
-rw-r--r--plug-ins/gimpressionist/Presets/Makefile.in829
-rw-r--r--plug-ins/gimpressionist/Presets/MarbleMadness39
-rw-r--r--plug-ins/gimpressionist/Presets/Mossy40
-rw-r--r--plug-ins/gimpressionist/Presets/Painted_Rock40
-rw-r--r--plug-ins/gimpressionist/Presets/Parquette30
-rw-r--r--plug-ins/gimpressionist/Presets/Patchwork28
-rw-r--r--plug-ins/gimpressionist/Presets/Ringworks28
-rw-r--r--plug-ins/gimpressionist/Presets/Sample40
-rw-r--r--plug-ins/gimpressionist/Presets/Smash40
-rw-r--r--plug-ins/gimpressionist/Presets/Straws41
-rw-r--r--plug-ins/gimpressionist/Presets/Weave40
-rw-r--r--plug-ins/gimpressionist/Presets/Wormcan28
-rw-r--r--plug-ins/gimpressionist/README102
-rw-r--r--plug-ins/gimpressionist/brush.c660
-rw-r--r--plug-ins/gimpressionist/brush.h29
-rw-r--r--plug-ins/gimpressionist/color.c106
-rw-r--r--plug-ins/gimpressionist/color.h32
-rw-r--r--plug-ins/gimpressionist/general.c283
-rw-r--r--plug-ins/gimpressionist/general.h26
-rw-r--r--plug-ins/gimpressionist/gimp.c535
-rw-r--r--plug-ins/gimpressionist/gimpressionist.c207
-rw-r--r--plug-ins/gimpressionist/gimpressionist.h181
-rw-r--r--plug-ins/gimpressionist/globals.c86
-rw-r--r--plug-ins/gimpressionist/infile.h32
-rw-r--r--plug-ins/gimpressionist/orientation.c206
-rw-r--r--plug-ins/gimpressionist/orientation.h39
-rw-r--r--plug-ins/gimpressionist/orientmap.c717
-rw-r--r--plug-ins/gimpressionist/orientmap.h25
-rw-r--r--plug-ins/gimpressionist/paper.c221
-rw-r--r--plug-ins/gimpressionist/paper.h25
-rw-r--r--plug-ins/gimpressionist/placement.c130
-rw-r--r--plug-ins/gimpressionist/placement.h32
-rw-r--r--plug-ins/gimpressionist/plasma.c122
-rw-r--r--plug-ins/gimpressionist/ppmtool.c904
-rw-r--r--plug-ins/gimpressionist/ppmtool.h60
-rw-r--r--plug-ins/gimpressionist/presets.c1098
-rw-r--r--plug-ins/gimpressionist/presets.h34
-rw-r--r--plug-ins/gimpressionist/preview.c191
-rw-r--r--plug-ins/gimpressionist/preview.h26
-rw-r--r--plug-ins/gimpressionist/random.h24
-rw-r--r--plug-ins/gimpressionist/repaint.c1201
-rw-r--r--plug-ins/gimpressionist/size.c210
-rw-r--r--plug-ins/gimpressionist/size.h40
-rw-r--r--plug-ins/gimpressionist/sizemap.c553
-rw-r--r--plug-ins/gimpressionist/utils.c411
134 files changed, 13607 insertions, 0 deletions
diff --git a/plug-ins/gimpressionist/Brushes/Makefile.am b/plug-ins/gimpressionist/Brushes/Makefile.am
new file mode 100644
index 0000000..fa8860d
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/Makefile.am
@@ -0,0 +1,66 @@
+## Process this file with automake to produce Makefile.in
+
+brushdatadir = $(gimpdatadir)/gimpressionist/Brushes
+
+brushdata_DATA = \
+ arrow01.pgm \
+ ball.ppm \
+ blob.ppm \
+ box.ppm \
+ chalk01.pgm \
+ cone.ppm \
+ crayon01.pgm \
+ crayon02.pgm \
+ crayon03.pgm \
+ crayon04.pgm \
+ crayon05.pgm \
+ crayon06.pgm \
+ crayon07.pgm \
+ crayon08.pgm \
+ defaultbrush.pgm \
+ dribble.pgm \
+ fabric.pgm \
+ fabric01.pgm \
+ fabric02.pgm \
+ fabric03.pgm \
+ flower01.pgm \
+ flower02.pgm \
+ flower03.pgm \
+ flower04.pgm \
+ grad01.pgm \
+ grad02.pgm \
+ grad03.pgm \
+ heart.ppm \
+ leaf01.pgm \
+ paintbrush01.pgm \
+ paintbrush02.pgm \
+ paintbrush03.pgm \
+ paintbrush04.pgm \
+ paper01.pgm \
+ paper02.pgm \
+ paper03.pgm \
+ paper04.pgm \
+ pentagram.pgm \
+ scribble.pgm \
+ shape01.pgm \
+ shape02.pgm \
+ shape03.pgm \
+ shape04.pgm \
+ snow1.pgm \
+ sphere.ppm \
+ splat1.pgm \
+ splat2.pgm \
+ splat3.pgm \
+ spunge01.pgm \
+ spunge02.pgm \
+ spunge03.pgm \
+ spunge04.pgm \
+ spunge05.pgm \
+ strange01.pgm \
+ thegimp.pgm \
+ torus.ppm \
+ wavy.pgm \
+ weave.pgm \
+ worm.pgm
+
+EXTRA_DIST = $(brushdata_DATA)
diff --git a/plug-ins/gimpressionist/Brushes/Makefile.in b/plug-ins/gimpressionist/Brushes/Makefile.in
new file mode 100644
index 0000000..61a3a73
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/Makefile.in
@@ -0,0 +1,863 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = plug-ins/gimpressionist/Brushes
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4macros/gtk-doc.m4 \
+ $(top_srcdir)/m4macros/intltool.m4 \
+ $(top_srcdir)/m4macros/libtool.m4 \
+ $(top_srcdir)/m4macros/ltoptions.m4 \
+ $(top_srcdir)/m4macros/ltsugar.m4 \
+ $(top_srcdir)/m4macros/ltversion.m4 \
+ $(top_srcdir)/m4macros/lt~obsolete.m4 \
+ $(top_srcdir)/acinclude.m4 $(top_srcdir)/m4macros/alsa.m4 \
+ $(top_srcdir)/m4macros/ax_compare_version.m4 \
+ $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \
+ $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \
+ $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \
+ $(top_srcdir)/m4macros/detectcflags.m4 \
+ $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(brushdatadir)"
+DATA = $(brushdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+AA_LIBS = @AA_LIBS@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALL_LINGUAS = @ALL_LINGUAS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPSTREAM_UTIL = @APPSTREAM_UTIL@
+AR = @AR@
+AS = @AS@
+ATK_CFLAGS = @ATK_CFLAGS@
+ATK_LIBS = @ATK_LIBS@
+ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BABL_CFLAGS = @BABL_CFLAGS@
+BABL_LIBS = @BABL_LIBS@
+BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@
+BUG_REPORT_URL = @BUG_REPORT_URL@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_OBJEXT = @BUILD_OBJEXT@
+BZIP2_LIBS = @BZIP2_LIBS@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@
+CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@
+CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@
+CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
+CPP_FOR_BUILD = @CPP_FOR_BUILD@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DESKTOP_DATADIR = @DESKTOP_DATADIR@
+DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@
+DLLTOOL = @DLLTOOL@
+DOC_SHOOTER = @DOC_SHOOTER@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FILE_AA = @FILE_AA@
+FILE_EXR = @FILE_EXR@
+FILE_HEIF = @FILE_HEIF@
+FILE_JP2_LOAD = @FILE_JP2_LOAD@
+FILE_MNG = @FILE_MNG@
+FILE_PDF_SAVE = @FILE_PDF_SAVE@
+FILE_PS = @FILE_PS@
+FILE_WMF = @FILE_WMF@
+FILE_XMC = @FILE_XMC@
+FILE_XPM = @FILE_XPM@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@
+FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GDBUS_CODEGEN = @GDBUS_CODEGEN@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@
+GEGL = @GEGL@
+GEGL_CFLAGS = @GEGL_CFLAGS@
+GEGL_LIBS = @GEGL_LIBS@
+GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@
+GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GEXIV2_CFLAGS = @GEXIV2_CFLAGS@
+GEXIV2_LIBS = @GEXIV2_LIBS@
+GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@
+GIMP_API_VERSION = @GIMP_API_VERSION@
+GIMP_APP_VERSION = @GIMP_APP_VERSION@
+GIMP_BINARY_AGE = @GIMP_BINARY_AGE@
+GIMP_COMMAND = @GIMP_COMMAND@
+GIMP_DATA_VERSION = @GIMP_DATA_VERSION@
+GIMP_FULL_NAME = @GIMP_FULL_NAME@
+GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@
+GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@
+GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@
+GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@
+GIMP_MKENUMS = @GIMP_MKENUMS@
+GIMP_MODULES = @GIMP_MODULES@
+GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@
+GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@
+GIMP_PLUGINS = @GIMP_PLUGINS@
+GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@
+GIMP_REAL_VERSION = @GIMP_REAL_VERSION@
+GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@
+GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@
+GIMP_UNSTABLE = @GIMP_UNSTABLE@
+GIMP_USER_VERSION = @GIMP_USER_VERSION@
+GIMP_VERSION = @GIMP_VERSION@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
+GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@
+GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@
+GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@
+GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GREP = @GREP@
+GS_LIBS = @GS_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@
+GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@
+GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@
+GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@
+GUDEV_CFLAGS = @GUDEV_CFLAGS@
+GUDEV_LIBS = @GUDEV_LIBS@
+HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
+HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
+HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@
+HAVE_CXX14 = @HAVE_CXX14@
+HAVE_FINITE = @HAVE_FINITE@
+HAVE_ISFINITE = @HAVE_ISFINITE@
+HAVE_VFORK = @HAVE_VFORK@
+HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@
+ISO_CODES_LOCATION = @ISO_CODES_LOCATION@
+JPEG_LIBS = @JPEG_LIBS@
+JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@
+JSON_GLIB_LIBS = @JSON_GLIB_LIBS@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
+LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@
+LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@
+LIBHEIF_LIBS = @LIBHEIF_LIBS@
+LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@
+LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@
+LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@
+LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@
+LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@
+LIBOBJS = @LIBOBJS@
+LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@
+LIBUNWIND_LIBS = @LIBUNWIND_LIBS@
+LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LT_VERSION_INFO = @LT_VERSION_INFO@
+LZMA_CFLAGS = @LZMA_CFLAGS@
+LZMA_LIBS = @LZMA_LIBS@
+MAIL = @MAIL@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@
+MIME_INFO_LIBS = @MIME_INFO_LIBS@
+MIME_TYPES = @MIME_TYPES@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@
+MNG_CFLAGS = @MNG_CFLAGS@
+MNG_LIBS = @MNG_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@
+MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@
+NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@
+NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENEXR_CFLAGS = @OPENEXR_CFLAGS@
+OPENEXR_LIBS = @OPENEXR_LIBS@
+OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@
+OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@
+OPENJPEG_LIBS = @OPENJPEG_LIBS@
+OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@
+PATHSEP = @PATHSEP@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@
+PERL_VERSION = @PERL_VERSION@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_CFLAGS = @PNG_CFLAGS@
+PNG_LIBS = @PNG_LIBS@
+POFILES = @POFILES@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@
+POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@
+POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@
+POPPLER_LIBS = @POPPLER_LIBS@
+POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYBIN_PATH = @PYBIN_PATH@
+PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@
+PYCAIRO_LIBS = @PYCAIRO_LIBS@
+PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYLINK_LIBS = @PYLINK_LIBS@
+PYTHON = @PYTHON@
+PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@
+RT_LIBS = @RT_LIBS@
+SCREENSHOT_LIBS = @SCREENSHOT_LIBS@
+SED = @SED@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
+SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@
+SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
+STRIP = @STRIP@
+SVG_CFLAGS = @SVG_CFLAGS@
+SVG_LIBS = @SVG_LIBS@
+SYMPREFIX = @SYMPREFIX@
+TIFF_LIBS = @TIFF_LIBS@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@
+WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@
+WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@
+WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@
+WEBPMUX_LIBS = @WEBPMUX_LIBS@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@
+WEB_PAGE = @WEB_PAGE@
+WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@
+WINDRES = @WINDRES@
+WMF_CFLAGS = @WMF_CFLAGS@
+WMF_CONFIG = @WMF_CONFIG@
+WMF_LIBS = @WMF_LIBS@
+WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@
+XDG_EMAIL = @XDG_EMAIL@
+XFIXES_CFLAGS = @XFIXES_CFLAGS@
+XFIXES_LIBS = @XFIXES_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@
+XMC_CFLAGS = @XMC_CFLAGS@
+XMC_LIBS = @XMC_LIBS@
+XMKMF = @XMKMF@
+XMLLINT = @XMLLINT@
+XMU_LIBS = @XMU_LIBS@
+XPM_LIBS = @XPM_LIBS@
+XSLTPROC = @XSLTPROC@
+XVFB_RUN = @XVFB_RUN@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gimpdatadir = @gimpdatadir@
+gimpdir = @gimpdir@
+gimplocaledir = @gimplocaledir@
+gimpplugindir = @gimpplugindir@
+gimpsysconfdir = @gimpsysconfdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+manpage_gimpdir = @manpage_gimpdir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+mypaint_brushes_dir = @mypaint_brushes_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+brushdatadir = $(gimpdatadir)/gimpressionist/Brushes
+brushdata_DATA = \
+ arrow01.pgm \
+ ball.ppm \
+ blob.ppm \
+ box.ppm \
+ chalk01.pgm \
+ cone.ppm \
+ crayon01.pgm \
+ crayon02.pgm \
+ crayon03.pgm \
+ crayon04.pgm \
+ crayon05.pgm \
+ crayon06.pgm \
+ crayon07.pgm \
+ crayon08.pgm \
+ defaultbrush.pgm \
+ dribble.pgm \
+ fabric.pgm \
+ fabric01.pgm \
+ fabric02.pgm \
+ fabric03.pgm \
+ flower01.pgm \
+ flower02.pgm \
+ flower03.pgm \
+ flower04.pgm \
+ grad01.pgm \
+ grad02.pgm \
+ grad03.pgm \
+ heart.ppm \
+ leaf01.pgm \
+ paintbrush01.pgm \
+ paintbrush02.pgm \
+ paintbrush03.pgm \
+ paintbrush04.pgm \
+ paper01.pgm \
+ paper02.pgm \
+ paper03.pgm \
+ paper04.pgm \
+ pentagram.pgm \
+ scribble.pgm \
+ shape01.pgm \
+ shape02.pgm \
+ shape03.pgm \
+ shape04.pgm \
+ snow1.pgm \
+ sphere.ppm \
+ splat1.pgm \
+ splat2.pgm \
+ splat3.pgm \
+ spunge01.pgm \
+ spunge02.pgm \
+ spunge03.pgm \
+ spunge04.pgm \
+ spunge05.pgm \
+ strange01.pgm \
+ thegimp.pgm \
+ torus.ppm \
+ wavy.pgm \
+ weave.pgm \
+ worm.pgm
+
+EXTRA_DIST = $(brushdata_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Brushes/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plug-ins/gimpressionist/Brushes/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-brushdataDATA: $(brushdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(brushdata_DATA)'; test -n "$(brushdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(brushdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(brushdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(brushdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(brushdatadir)" || exit $$?; \
+ done
+
+uninstall-brushdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(brushdata_DATA)'; test -n "$(brushdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(brushdatadir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(brushdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-brushdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-brushdataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-brushdataDATA install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-brushdataDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plug-ins/gimpressionist/Brushes/arrow01.pgm b/plug-ins/gimpressionist/Brushes/arrow01.pgm
new file mode 100644
index 0000000..1c72f0d
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/arrow01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/ball.ppm b/plug-ins/gimpressionist/Brushes/ball.ppm
new file mode 100644
index 0000000..15d5fa2
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/ball.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/blob.ppm b/plug-ins/gimpressionist/Brushes/blob.ppm
new file mode 100644
index 0000000..59a546b
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/blob.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/box.ppm b/plug-ins/gimpressionist/Brushes/box.ppm
new file mode 100644
index 0000000..b5c0a55
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/box.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/chalk01.pgm b/plug-ins/gimpressionist/Brushes/chalk01.pgm
new file mode 100644
index 0000000..659639b
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/chalk01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/cone.ppm b/plug-ins/gimpressionist/Brushes/cone.ppm
new file mode 100644
index 0000000..d354433
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/cone.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon01.pgm b/plug-ins/gimpressionist/Brushes/crayon01.pgm
new file mode 100644
index 0000000..59851db
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon02.pgm b/plug-ins/gimpressionist/Brushes/crayon02.pgm
new file mode 100644
index 0000000..1bfe3c4
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon03.pgm b/plug-ins/gimpressionist/Brushes/crayon03.pgm
new file mode 100644
index 0000000..74a9a1a
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon04.pgm b/plug-ins/gimpressionist/Brushes/crayon04.pgm
new file mode 100644
index 0000000..5f8eaf1
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon05.pgm b/plug-ins/gimpressionist/Brushes/crayon05.pgm
new file mode 100644
index 0000000..ba7186f
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon05.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon06.pgm b/plug-ins/gimpressionist/Brushes/crayon06.pgm
new file mode 100644
index 0000000..adb13c4
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon06.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon07.pgm b/plug-ins/gimpressionist/Brushes/crayon07.pgm
new file mode 100644
index 0000000..ee78838
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon07.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/crayon08.pgm b/plug-ins/gimpressionist/Brushes/crayon08.pgm
new file mode 100644
index 0000000..6dd791b
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/crayon08.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/defaultbrush.pgm b/plug-ins/gimpressionist/Brushes/defaultbrush.pgm
new file mode 100644
index 0000000..e0f52e6
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/defaultbrush.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/dribble.pgm b/plug-ins/gimpressionist/Brushes/dribble.pgm
new file mode 100644
index 0000000..de264ed
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/dribble.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/fabric.pgm b/plug-ins/gimpressionist/Brushes/fabric.pgm
new file mode 100644
index 0000000..ab63505
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/fabric.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/fabric01.pgm b/plug-ins/gimpressionist/Brushes/fabric01.pgm
new file mode 100644
index 0000000..ab63505
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/fabric01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/fabric02.pgm b/plug-ins/gimpressionist/Brushes/fabric02.pgm
new file mode 100644
index 0000000..7b9b794
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/fabric02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/fabric03.pgm b/plug-ins/gimpressionist/Brushes/fabric03.pgm
new file mode 100644
index 0000000..c923c7f
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/fabric03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/flower01.pgm b/plug-ins/gimpressionist/Brushes/flower01.pgm
new file mode 100644
index 0000000..02dae4c
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/flower01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/flower02.pgm b/plug-ins/gimpressionist/Brushes/flower02.pgm
new file mode 100644
index 0000000..effe674
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/flower02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/flower03.pgm b/plug-ins/gimpressionist/Brushes/flower03.pgm
new file mode 100644
index 0000000..bb7aab7
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/flower03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/flower04.pgm b/plug-ins/gimpressionist/Brushes/flower04.pgm
new file mode 100644
index 0000000..e515e61
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/flower04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/grad01.pgm b/plug-ins/gimpressionist/Brushes/grad01.pgm
new file mode 100644
index 0000000..dc7302d
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/grad01.pgm
@@ -0,0 +1,205 @@
+P5
+# CREATOR: The GIMP's PNM Filter Version 1.0
+200 200
+255
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûûùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùùøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóóòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòòññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññññïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïïîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííííììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêêééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççççååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããããââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËËÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼¼»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»ºººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººººº¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¸¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶µµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµµ´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««ªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªªª©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©©§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££££¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡                                                                                                                                                                                                        žžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžžœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››››šššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššš˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooommmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa________________________________________________________________________________________________________________________________________________________________________________________________________^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999988888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666665555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555544444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333331111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************************************************************************************************************************************************************************))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plug-ins/gimpressionist/Brushes/grad02.pgm b/plug-ins/gimpressionist/Brushes/grad02.pgm
new file mode 100644
index 0000000..80600ed
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/grad02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/grad03.pgm b/plug-ins/gimpressionist/Brushes/grad03.pgm
new file mode 100644
index 0000000..365827a
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/grad03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/heart.ppm b/plug-ins/gimpressionist/Brushes/heart.ppm
new file mode 100644
index 0000000..674fdf0
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/heart.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/leaf01.pgm b/plug-ins/gimpressionist/Brushes/leaf01.pgm
new file mode 100644
index 0000000..8f191d7
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/leaf01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paintbrush01.pgm b/plug-ins/gimpressionist/Brushes/paintbrush01.pgm
new file mode 100644
index 0000000..ce2de78
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paintbrush01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paintbrush02.pgm b/plug-ins/gimpressionist/Brushes/paintbrush02.pgm
new file mode 100644
index 0000000..261b238
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paintbrush02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paintbrush03.pgm b/plug-ins/gimpressionist/Brushes/paintbrush03.pgm
new file mode 100644
index 0000000..0339bd8
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paintbrush03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paintbrush04.pgm b/plug-ins/gimpressionist/Brushes/paintbrush04.pgm
new file mode 100644
index 0000000..06aa796
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paintbrush04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paper01.pgm b/plug-ins/gimpressionist/Brushes/paper01.pgm
new file mode 100644
index 0000000..079ae32
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paper01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paper02.pgm b/plug-ins/gimpressionist/Brushes/paper02.pgm
new file mode 100644
index 0000000..bc1afbb
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paper02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paper03.pgm b/plug-ins/gimpressionist/Brushes/paper03.pgm
new file mode 100644
index 0000000..c1caa44
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paper03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/paper04.pgm b/plug-ins/gimpressionist/Brushes/paper04.pgm
new file mode 100644
index 0000000..4e11e06
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/paper04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/pentagram.pgm b/plug-ins/gimpressionist/Brushes/pentagram.pgm
new file mode 100644
index 0000000..ebc8135
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/pentagram.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/scribble.pgm b/plug-ins/gimpressionist/Brushes/scribble.pgm
new file mode 100644
index 0000000..944e1f1
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/scribble.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/shape01.pgm b/plug-ins/gimpressionist/Brushes/shape01.pgm
new file mode 100644
index 0000000..61bc319
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/shape01.pgm
@@ -0,0 +1,5 @@
+P5
+# CREATOR: The GIMP's PNM Filter Version 1.0
+185 185
+255
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file
diff --git a/plug-ins/gimpressionist/Brushes/shape02.pgm b/plug-ins/gimpressionist/Brushes/shape02.pgm
new file mode 100644
index 0000000..e6cd78d
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/shape02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/shape03.pgm b/plug-ins/gimpressionist/Brushes/shape03.pgm
new file mode 100644
index 0000000..888db5e
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/shape03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/shape04.pgm b/plug-ins/gimpressionist/Brushes/shape04.pgm
new file mode 100644
index 0000000..87eebdd
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/shape04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/snow1.pgm b/plug-ins/gimpressionist/Brushes/snow1.pgm
new file mode 100644
index 0000000..057f515
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/snow1.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/sphere.ppm b/plug-ins/gimpressionist/Brushes/sphere.ppm
new file mode 100644
index 0000000..7a4d1fc
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/sphere.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/splat1.pgm b/plug-ins/gimpressionist/Brushes/splat1.pgm
new file mode 100644
index 0000000..6f3f842
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/splat1.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/splat2.pgm b/plug-ins/gimpressionist/Brushes/splat2.pgm
new file mode 100644
index 0000000..dbbb197
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/splat2.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/splat3.pgm b/plug-ins/gimpressionist/Brushes/splat3.pgm
new file mode 100644
index 0000000..5fd45ae
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/splat3.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/spunge01.pgm b/plug-ins/gimpressionist/Brushes/spunge01.pgm
new file mode 100644
index 0000000..5638e59
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/spunge01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/spunge02.pgm b/plug-ins/gimpressionist/Brushes/spunge02.pgm
new file mode 100644
index 0000000..8bb8908
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/spunge02.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/spunge03.pgm b/plug-ins/gimpressionist/Brushes/spunge03.pgm
new file mode 100644
index 0000000..f8ae3ed
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/spunge03.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/spunge04.pgm b/plug-ins/gimpressionist/Brushes/spunge04.pgm
new file mode 100644
index 0000000..5597100
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/spunge04.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/spunge05.pgm b/plug-ins/gimpressionist/Brushes/spunge05.pgm
new file mode 100644
index 0000000..1dbbd00
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/spunge05.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/strange01.pgm b/plug-ins/gimpressionist/Brushes/strange01.pgm
new file mode 100644
index 0000000..eefbaff
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/strange01.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/thegimp.pgm b/plug-ins/gimpressionist/Brushes/thegimp.pgm
new file mode 100644
index 0000000..2c23b64
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/thegimp.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/torus.ppm b/plug-ins/gimpressionist/Brushes/torus.ppm
new file mode 100644
index 0000000..442c9ec
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/torus.ppm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/wavy.pgm b/plug-ins/gimpressionist/Brushes/wavy.pgm
new file mode 100644
index 0000000..1fe9559
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/wavy.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/weave.pgm b/plug-ins/gimpressionist/Brushes/weave.pgm
new file mode 100644
index 0000000..dd9a3ca
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/weave.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Brushes/worm.pgm b/plug-ins/gimpressionist/Brushes/worm.pgm
new file mode 100644
index 0000000..00a3f68
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/worm.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Makefile.am b/plug-ins/gimpressionist/Makefile.am
new file mode 100644
index 0000000..9262dcb
--- /dev/null
+++ b/plug-ins/gimpressionist/Makefile.am
@@ -0,0 +1,87 @@
+## Process this file with automake to produce Makefile.in
+
+if OS_WIN32
+mwindows = -mwindows
+else
+libm = -lm
+endif
+
+libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
+libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
+libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
+libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
+libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la
+libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la
+
+SUBDIRS = Brushes Paper Presets
+
+if HAVE_WINDRES
+include $(top_srcdir)/build/windows/gimprc-plug-ins.rule
+gimpressionist_RC = gimpressionist.rc.o
+endif
+
+AM_CPPFLAGS = \
+ -DDEFAULTPATH=\""~/$(gimpdir)/gimpressionist:$(gimpdatadir)/gimpressionist"\" \
+ -I$(top_srcdir) \
+ $(GTK_CFLAGS) \
+ $(GEGL_CFLAGS) \
+ -I$(includedir)
+
+AM_LDFLAGS = $(mwindows)
+
+
+libexecdir = $(gimpplugindir)/plug-ins/gimpressionist
+
+libexec_PROGRAMS = gimpressionist
+
+gimpressionist_SOURCES = \
+ brush.c \
+ brush.h \
+ color.c \
+ color.h \
+ general.c \
+ general.h \
+ gimp.c \
+ gimpressionist.c \
+ gimpressionist.h \
+ globals.c \
+ infile.h \
+ orientation.h \
+ orientation.c \
+ orientmap.h \
+ orientmap.c \
+ paper.c \
+ paper.h \
+ placement.c \
+ placement.h \
+ plasma.c \
+ ppmtool.c \
+ ppmtool.h \
+ presets.c \
+ presets.h \
+ preview.c \
+ preview.h \
+ random.h \
+ repaint.c \
+ size.h \
+ size.c \
+ sizemap.c \
+ utils.c
+
+LDADD = \
+ $(libm) \
+ $(libgimpui) \
+ $(libgimpwidgets) \
+ $(libgimpconfig) \
+ $(libgimp) \
+ $(libgimpcolor) \
+ $(libgimpmath) \
+ $(libgimpbase) \
+ $(GTK_LIBS) \
+ $(GEGL_LIBS) \
+ $(RT_LIBS) \
+ $(INTLLIBS) \
+ $(gimpressionist_RC)
+
+EXTRA_DIST = README
diff --git a/plug-ins/gimpressionist/Makefile.in b/plug-ins/gimpressionist/Makefile.in
new file mode 100644
index 0000000..f6e5713
--- /dev/null
+++ b/plug-ins/gimpressionist/Makefile.in
@@ -0,0 +1,1216 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Version resources for Microsoft Windows
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+libexec_PROGRAMS = gimpressionist$(EXEEXT)
+subdir = plug-ins/gimpressionist
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4macros/gtk-doc.m4 \
+ $(top_srcdir)/m4macros/intltool.m4 \
+ $(top_srcdir)/m4macros/libtool.m4 \
+ $(top_srcdir)/m4macros/ltoptions.m4 \
+ $(top_srcdir)/m4macros/ltsugar.m4 \
+ $(top_srcdir)/m4macros/ltversion.m4 \
+ $(top_srcdir)/m4macros/lt~obsolete.m4 \
+ $(top_srcdir)/acinclude.m4 $(top_srcdir)/m4macros/alsa.m4 \
+ $(top_srcdir)/m4macros/ax_compare_version.m4 \
+ $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \
+ $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \
+ $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \
+ $(top_srcdir)/m4macros/detectcflags.m4 \
+ $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(libexecdir)"
+PROGRAMS = $(libexec_PROGRAMS)
+am_gimpressionist_OBJECTS = brush.$(OBJEXT) color.$(OBJEXT) \
+ general.$(OBJEXT) gimp.$(OBJEXT) gimpressionist.$(OBJEXT) \
+ globals.$(OBJEXT) orientation.$(OBJEXT) orientmap.$(OBJEXT) \
+ paper.$(OBJEXT) placement.$(OBJEXT) plasma.$(OBJEXT) \
+ ppmtool.$(OBJEXT) presets.$(OBJEXT) preview.$(OBJEXT) \
+ repaint.$(OBJEXT) size.$(OBJEXT) sizemap.$(OBJEXT) \
+ utils.$(OBJEXT)
+gimpressionist_OBJECTS = $(am_gimpressionist_OBJECTS)
+gimpressionist_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+gimpressionist_DEPENDENCIES = $(am__DEPENDENCIES_1) $(libgimpui) \
+ $(libgimpwidgets) $(libgimpconfig) $(libgimp) $(libgimpcolor) \
+ $(libgimpmath) $(libgimpbase) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(gimpressionist_RC)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/brush.Po ./$(DEPDIR)/color.Po \
+ ./$(DEPDIR)/general.Po ./$(DEPDIR)/gimp.Po \
+ ./$(DEPDIR)/gimpressionist.Po ./$(DEPDIR)/globals.Po \
+ ./$(DEPDIR)/orientation.Po ./$(DEPDIR)/orientmap.Po \
+ ./$(DEPDIR)/paper.Po ./$(DEPDIR)/placement.Po \
+ ./$(DEPDIR)/plasma.Po ./$(DEPDIR)/ppmtool.Po \
+ ./$(DEPDIR)/presets.Po ./$(DEPDIR)/preview.Po \
+ ./$(DEPDIR)/repaint.Po ./$(DEPDIR)/size.Po \
+ ./$(DEPDIR)/sizemap.Po ./$(DEPDIR)/utils.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(gimpressionist_SOURCES)
+DIST_SOURCES = $(gimpressionist_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/build/windows/gimprc-plug-ins.rule \
+ $(top_srcdir)/depcomp README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+AA_LIBS = @AA_LIBS@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALL_LINGUAS = @ALL_LINGUAS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPSTREAM_UTIL = @APPSTREAM_UTIL@
+AR = @AR@
+AS = @AS@
+ATK_CFLAGS = @ATK_CFLAGS@
+ATK_LIBS = @ATK_LIBS@
+ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BABL_CFLAGS = @BABL_CFLAGS@
+BABL_LIBS = @BABL_LIBS@
+BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@
+BUG_REPORT_URL = @BUG_REPORT_URL@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_OBJEXT = @BUILD_OBJEXT@
+BZIP2_LIBS = @BZIP2_LIBS@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@
+CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@
+CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@
+CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
+CPP_FOR_BUILD = @CPP_FOR_BUILD@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DESKTOP_DATADIR = @DESKTOP_DATADIR@
+DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@
+DLLTOOL = @DLLTOOL@
+DOC_SHOOTER = @DOC_SHOOTER@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FILE_AA = @FILE_AA@
+FILE_EXR = @FILE_EXR@
+FILE_HEIF = @FILE_HEIF@
+FILE_JP2_LOAD = @FILE_JP2_LOAD@
+FILE_MNG = @FILE_MNG@
+FILE_PDF_SAVE = @FILE_PDF_SAVE@
+FILE_PS = @FILE_PS@
+FILE_WMF = @FILE_WMF@
+FILE_XMC = @FILE_XMC@
+FILE_XPM = @FILE_XPM@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@
+FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GDBUS_CODEGEN = @GDBUS_CODEGEN@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@
+GEGL = @GEGL@
+GEGL_CFLAGS = @GEGL_CFLAGS@
+GEGL_LIBS = @GEGL_LIBS@
+GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@
+GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GEXIV2_CFLAGS = @GEXIV2_CFLAGS@
+GEXIV2_LIBS = @GEXIV2_LIBS@
+GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@
+GIMP_API_VERSION = @GIMP_API_VERSION@
+GIMP_APP_VERSION = @GIMP_APP_VERSION@
+GIMP_BINARY_AGE = @GIMP_BINARY_AGE@
+GIMP_COMMAND = @GIMP_COMMAND@
+GIMP_DATA_VERSION = @GIMP_DATA_VERSION@
+GIMP_FULL_NAME = @GIMP_FULL_NAME@
+GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@
+GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@
+GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@
+GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@
+GIMP_MKENUMS = @GIMP_MKENUMS@
+GIMP_MODULES = @GIMP_MODULES@
+GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@
+GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@
+GIMP_PLUGINS = @GIMP_PLUGINS@
+GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@
+GIMP_REAL_VERSION = @GIMP_REAL_VERSION@
+GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@
+GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@
+GIMP_UNSTABLE = @GIMP_UNSTABLE@
+GIMP_USER_VERSION = @GIMP_USER_VERSION@
+GIMP_VERSION = @GIMP_VERSION@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
+GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@
+GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@
+GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@
+GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GREP = @GREP@
+GS_LIBS = @GS_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@
+GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@
+GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@
+GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@
+GUDEV_CFLAGS = @GUDEV_CFLAGS@
+GUDEV_LIBS = @GUDEV_LIBS@
+HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
+HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
+HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@
+HAVE_CXX14 = @HAVE_CXX14@
+HAVE_FINITE = @HAVE_FINITE@
+HAVE_ISFINITE = @HAVE_ISFINITE@
+HAVE_VFORK = @HAVE_VFORK@
+HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@
+ISO_CODES_LOCATION = @ISO_CODES_LOCATION@
+JPEG_LIBS = @JPEG_LIBS@
+JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@
+JSON_GLIB_LIBS = @JSON_GLIB_LIBS@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
+LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@
+LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@
+LIBHEIF_LIBS = @LIBHEIF_LIBS@
+LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@
+LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@
+LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@
+LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@
+LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@
+LIBOBJS = @LIBOBJS@
+LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@
+LIBUNWIND_LIBS = @LIBUNWIND_LIBS@
+LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LT_VERSION_INFO = @LT_VERSION_INFO@
+LZMA_CFLAGS = @LZMA_CFLAGS@
+LZMA_LIBS = @LZMA_LIBS@
+MAIL = @MAIL@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@
+MIME_INFO_LIBS = @MIME_INFO_LIBS@
+MIME_TYPES = @MIME_TYPES@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@
+MNG_CFLAGS = @MNG_CFLAGS@
+MNG_LIBS = @MNG_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@
+MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@
+NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@
+NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENEXR_CFLAGS = @OPENEXR_CFLAGS@
+OPENEXR_LIBS = @OPENEXR_LIBS@
+OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@
+OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@
+OPENJPEG_LIBS = @OPENJPEG_LIBS@
+OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@
+PATHSEP = @PATHSEP@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@
+PERL_VERSION = @PERL_VERSION@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_CFLAGS = @PNG_CFLAGS@
+PNG_LIBS = @PNG_LIBS@
+POFILES = @POFILES@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@
+POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@
+POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@
+POPPLER_LIBS = @POPPLER_LIBS@
+POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYBIN_PATH = @PYBIN_PATH@
+PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@
+PYCAIRO_LIBS = @PYCAIRO_LIBS@
+PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYLINK_LIBS = @PYLINK_LIBS@
+PYTHON = @PYTHON@
+PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@
+RT_LIBS = @RT_LIBS@
+SCREENSHOT_LIBS = @SCREENSHOT_LIBS@
+SED = @SED@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
+SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@
+SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
+STRIP = @STRIP@
+SVG_CFLAGS = @SVG_CFLAGS@
+SVG_LIBS = @SVG_LIBS@
+SYMPREFIX = @SYMPREFIX@
+TIFF_LIBS = @TIFF_LIBS@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@
+WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@
+WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@
+WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@
+WEBPMUX_LIBS = @WEBPMUX_LIBS@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@
+WEB_PAGE = @WEB_PAGE@
+WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@
+WINDRES = @WINDRES@
+WMF_CFLAGS = @WMF_CFLAGS@
+WMF_CONFIG = @WMF_CONFIG@
+WMF_LIBS = @WMF_LIBS@
+WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@
+XDG_EMAIL = @XDG_EMAIL@
+XFIXES_CFLAGS = @XFIXES_CFLAGS@
+XFIXES_LIBS = @XFIXES_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@
+XMC_CFLAGS = @XMC_CFLAGS@
+XMC_LIBS = @XMC_LIBS@
+XMKMF = @XMKMF@
+XMLLINT = @XMLLINT@
+XMU_LIBS = @XMU_LIBS@
+XPM_LIBS = @XPM_LIBS@
+XSLTPROC = @XSLTPROC@
+XVFB_RUN = @XVFB_RUN@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gimpdatadir = @gimpdatadir@
+gimpdir = @gimpdir@
+gimplocaledir = @gimplocaledir@
+gimpplugindir = @gimpplugindir@
+gimpsysconfdir = @gimpsysconfdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
+libdir = @libdir@
+libexecdir = $(gimpplugindir)/plug-ins/gimpressionist
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+manpage_gimpdir = @manpage_gimpdir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+mypaint_brushes_dir = @mypaint_brushes_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+@OS_WIN32_TRUE@mwindows = -mwindows
+@OS_WIN32_FALSE@libm = -lm
+libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
+libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
+libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
+libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
+libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la
+libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la
+SUBDIRS = Brushes Paper Presets
+@HAVE_WINDRES_TRUE@GIMPPLUGINRC = $(top_builddir)/build/windows/gimp-plug-ins.rc
+@HAVE_WINDRES_TRUE@gimpressionist_RC = gimpressionist.rc.o
+AM_CPPFLAGS = \
+ -DDEFAULTPATH=\""~/$(gimpdir)/gimpressionist:$(gimpdatadir)/gimpressionist"\" \
+ -I$(top_srcdir) \
+ $(GTK_CFLAGS) \
+ $(GEGL_CFLAGS) \
+ -I$(includedir)
+
+AM_LDFLAGS = $(mwindows)
+gimpressionist_SOURCES = \
+ brush.c \
+ brush.h \
+ color.c \
+ color.h \
+ general.c \
+ general.h \
+ gimp.c \
+ gimpressionist.c \
+ gimpressionist.h \
+ globals.c \
+ infile.h \
+ orientation.h \
+ orientation.c \
+ orientmap.h \
+ orientmap.c \
+ paper.c \
+ paper.h \
+ placement.c \
+ placement.h \
+ plasma.c \
+ ppmtool.c \
+ ppmtool.h \
+ presets.c \
+ presets.h \
+ preview.c \
+ preview.h \
+ random.h \
+ repaint.c \
+ size.h \
+ size.c \
+ sizemap.c \
+ utils.c
+
+LDADD = \
+ $(libm) \
+ $(libgimpui) \
+ $(libgimpwidgets) \
+ $(libgimpconfig) \
+ $(libgimp) \
+ $(libgimpcolor) \
+ $(libgimpmath) \
+ $(libgimpbase) \
+ $(GTK_LIBS) \
+ $(GEGL_LIBS) \
+ $(RT_LIBS) \
+ $(INTLLIBS) \
+ $(gimpressionist_RC)
+
+EXTRA_DIST = README
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/build/windows/gimprc-plug-ins.rule $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plug-ins/gimpressionist/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(top_srcdir)/build/windows/gimprc-plug-ins.rule $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-libexecPROGRAMS: $(libexec_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-libexecPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files
+
+clean-libexecPROGRAMS:
+ @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+gimpressionist$(EXEEXT): $(gimpressionist_OBJECTS) $(gimpressionist_DEPENDENCIES) $(EXTRA_gimpressionist_DEPENDENCIES)
+ @rm -f gimpressionist$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gimpressionist_OBJECTS) $(gimpressionist_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/general.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gimp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gimpressionist.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orientation.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/orientmap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/placement.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plasma.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppmtool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/presets.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preview.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/repaint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/size.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sizemap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libexecdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libexecPROGRAMS clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f ./$(DEPDIR)/brush.Po
+ -rm -f ./$(DEPDIR)/color.Po
+ -rm -f ./$(DEPDIR)/general.Po
+ -rm -f ./$(DEPDIR)/gimp.Po
+ -rm -f ./$(DEPDIR)/gimpressionist.Po
+ -rm -f ./$(DEPDIR)/globals.Po
+ -rm -f ./$(DEPDIR)/orientation.Po
+ -rm -f ./$(DEPDIR)/orientmap.Po
+ -rm -f ./$(DEPDIR)/paper.Po
+ -rm -f ./$(DEPDIR)/placement.Po
+ -rm -f ./$(DEPDIR)/plasma.Po
+ -rm -f ./$(DEPDIR)/ppmtool.Po
+ -rm -f ./$(DEPDIR)/presets.Po
+ -rm -f ./$(DEPDIR)/preview.Po
+ -rm -f ./$(DEPDIR)/repaint.Po
+ -rm -f ./$(DEPDIR)/size.Po
+ -rm -f ./$(DEPDIR)/sizemap.Po
+ -rm -f ./$(DEPDIR)/utils.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libexecPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f ./$(DEPDIR)/brush.Po
+ -rm -f ./$(DEPDIR)/color.Po
+ -rm -f ./$(DEPDIR)/general.Po
+ -rm -f ./$(DEPDIR)/gimp.Po
+ -rm -f ./$(DEPDIR)/gimpressionist.Po
+ -rm -f ./$(DEPDIR)/globals.Po
+ -rm -f ./$(DEPDIR)/orientation.Po
+ -rm -f ./$(DEPDIR)/orientmap.Po
+ -rm -f ./$(DEPDIR)/paper.Po
+ -rm -f ./$(DEPDIR)/placement.Po
+ -rm -f ./$(DEPDIR)/plasma.Po
+ -rm -f ./$(DEPDIR)/ppmtool.Po
+ -rm -f ./$(DEPDIR)/presets.Po
+ -rm -f ./$(DEPDIR)/preview.Po
+ -rm -f ./$(DEPDIR)/repaint.Po
+ -rm -f ./$(DEPDIR)/size.Po
+ -rm -f ./$(DEPDIR)/sizemap.Po
+ -rm -f ./$(DEPDIR)/utils.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-libexecPROGRAMS
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--depfiles check check-am clean clean-generic \
+ clean-libexecPROGRAMS clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-libexecPROGRAMS install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-libexecPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# `windres` seems a very stupid tool and it breaks with double shlashes
+# in parameter paths. Strengthen the rule a little.
+@HAVE_WINDRES_TRUE@%.rc.o:
+@HAVE_WINDRES_TRUE@ $(WINDRES) --define ORIGINALFILENAME_STR="$*$(EXEEXT)" \
+@HAVE_WINDRES_TRUE@ --define INTERNALNAME_STR="$*" \
+@HAVE_WINDRES_TRUE@ --define TOP_SRCDIR="`echo $(top_srcdir) | sed 's*//*/*'`" \
+@HAVE_WINDRES_TRUE@ -I"`echo $(top_srcdir)/app | sed 's%/\+%/%'`" \
+@HAVE_WINDRES_TRUE@ -I"`echo $(top_builddir)/app | sed 's%/\+%/%'`"\
+@HAVE_WINDRES_TRUE@ -I"`echo $(top_builddir) | sed 's%/\+%/%'`"\
+@HAVE_WINDRES_TRUE@ $(GIMPPLUGINRC) $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plug-ins/gimpressionist/Paper/Makefile.am b/plug-ins/gimpressionist/Paper/Makefile.am
new file mode 100644
index 0000000..6094996
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/Makefile.am
@@ -0,0 +1,16 @@
+## Process this file with automake to produce Makefile.in
+
+paperdatadir = $(gimpdatadir)/gimpressionist/Paper
+
+paperdata_DATA = \
+ bricks.pgm \
+ bricks2.pgm \
+ burlap.pgm \
+ canvas2.pgm \
+ defaultpaper.pgm \
+ marble.pgm \
+ marble2.pgm \
+ stone.pgm \
+ struc.pgm
+
+EXTRA_DIST = $(paperdata_DATA)
diff --git a/plug-ins/gimpressionist/Paper/Makefile.in b/plug-ins/gimpressionist/Paper/Makefile.in
new file mode 100644
index 0000000..8aa162a
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/Makefile.in
@@ -0,0 +1,813 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = plug-ins/gimpressionist/Paper
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4macros/gtk-doc.m4 \
+ $(top_srcdir)/m4macros/intltool.m4 \
+ $(top_srcdir)/m4macros/libtool.m4 \
+ $(top_srcdir)/m4macros/ltoptions.m4 \
+ $(top_srcdir)/m4macros/ltsugar.m4 \
+ $(top_srcdir)/m4macros/ltversion.m4 \
+ $(top_srcdir)/m4macros/lt~obsolete.m4 \
+ $(top_srcdir)/acinclude.m4 $(top_srcdir)/m4macros/alsa.m4 \
+ $(top_srcdir)/m4macros/ax_compare_version.m4 \
+ $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \
+ $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \
+ $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \
+ $(top_srcdir)/m4macros/detectcflags.m4 \
+ $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(paperdatadir)"
+DATA = $(paperdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+AA_LIBS = @AA_LIBS@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALL_LINGUAS = @ALL_LINGUAS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPSTREAM_UTIL = @APPSTREAM_UTIL@
+AR = @AR@
+AS = @AS@
+ATK_CFLAGS = @ATK_CFLAGS@
+ATK_LIBS = @ATK_LIBS@
+ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BABL_CFLAGS = @BABL_CFLAGS@
+BABL_LIBS = @BABL_LIBS@
+BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@
+BUG_REPORT_URL = @BUG_REPORT_URL@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_OBJEXT = @BUILD_OBJEXT@
+BZIP2_LIBS = @BZIP2_LIBS@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@
+CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@
+CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@
+CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
+CPP_FOR_BUILD = @CPP_FOR_BUILD@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DESKTOP_DATADIR = @DESKTOP_DATADIR@
+DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@
+DLLTOOL = @DLLTOOL@
+DOC_SHOOTER = @DOC_SHOOTER@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FILE_AA = @FILE_AA@
+FILE_EXR = @FILE_EXR@
+FILE_HEIF = @FILE_HEIF@
+FILE_JP2_LOAD = @FILE_JP2_LOAD@
+FILE_MNG = @FILE_MNG@
+FILE_PDF_SAVE = @FILE_PDF_SAVE@
+FILE_PS = @FILE_PS@
+FILE_WMF = @FILE_WMF@
+FILE_XMC = @FILE_XMC@
+FILE_XPM = @FILE_XPM@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@
+FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GDBUS_CODEGEN = @GDBUS_CODEGEN@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@
+GEGL = @GEGL@
+GEGL_CFLAGS = @GEGL_CFLAGS@
+GEGL_LIBS = @GEGL_LIBS@
+GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@
+GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GEXIV2_CFLAGS = @GEXIV2_CFLAGS@
+GEXIV2_LIBS = @GEXIV2_LIBS@
+GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@
+GIMP_API_VERSION = @GIMP_API_VERSION@
+GIMP_APP_VERSION = @GIMP_APP_VERSION@
+GIMP_BINARY_AGE = @GIMP_BINARY_AGE@
+GIMP_COMMAND = @GIMP_COMMAND@
+GIMP_DATA_VERSION = @GIMP_DATA_VERSION@
+GIMP_FULL_NAME = @GIMP_FULL_NAME@
+GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@
+GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@
+GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@
+GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@
+GIMP_MKENUMS = @GIMP_MKENUMS@
+GIMP_MODULES = @GIMP_MODULES@
+GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@
+GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@
+GIMP_PLUGINS = @GIMP_PLUGINS@
+GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@
+GIMP_REAL_VERSION = @GIMP_REAL_VERSION@
+GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@
+GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@
+GIMP_UNSTABLE = @GIMP_UNSTABLE@
+GIMP_USER_VERSION = @GIMP_USER_VERSION@
+GIMP_VERSION = @GIMP_VERSION@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
+GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@
+GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@
+GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@
+GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GREP = @GREP@
+GS_LIBS = @GS_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@
+GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@
+GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@
+GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@
+GUDEV_CFLAGS = @GUDEV_CFLAGS@
+GUDEV_LIBS = @GUDEV_LIBS@
+HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
+HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
+HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@
+HAVE_CXX14 = @HAVE_CXX14@
+HAVE_FINITE = @HAVE_FINITE@
+HAVE_ISFINITE = @HAVE_ISFINITE@
+HAVE_VFORK = @HAVE_VFORK@
+HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@
+ISO_CODES_LOCATION = @ISO_CODES_LOCATION@
+JPEG_LIBS = @JPEG_LIBS@
+JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@
+JSON_GLIB_LIBS = @JSON_GLIB_LIBS@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
+LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@
+LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@
+LIBHEIF_LIBS = @LIBHEIF_LIBS@
+LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@
+LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@
+LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@
+LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@
+LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@
+LIBOBJS = @LIBOBJS@
+LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@
+LIBUNWIND_LIBS = @LIBUNWIND_LIBS@
+LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LT_VERSION_INFO = @LT_VERSION_INFO@
+LZMA_CFLAGS = @LZMA_CFLAGS@
+LZMA_LIBS = @LZMA_LIBS@
+MAIL = @MAIL@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@
+MIME_INFO_LIBS = @MIME_INFO_LIBS@
+MIME_TYPES = @MIME_TYPES@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@
+MNG_CFLAGS = @MNG_CFLAGS@
+MNG_LIBS = @MNG_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@
+MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@
+NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@
+NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENEXR_CFLAGS = @OPENEXR_CFLAGS@
+OPENEXR_LIBS = @OPENEXR_LIBS@
+OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@
+OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@
+OPENJPEG_LIBS = @OPENJPEG_LIBS@
+OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@
+PATHSEP = @PATHSEP@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@
+PERL_VERSION = @PERL_VERSION@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_CFLAGS = @PNG_CFLAGS@
+PNG_LIBS = @PNG_LIBS@
+POFILES = @POFILES@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@
+POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@
+POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@
+POPPLER_LIBS = @POPPLER_LIBS@
+POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYBIN_PATH = @PYBIN_PATH@
+PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@
+PYCAIRO_LIBS = @PYCAIRO_LIBS@
+PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYLINK_LIBS = @PYLINK_LIBS@
+PYTHON = @PYTHON@
+PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@
+RT_LIBS = @RT_LIBS@
+SCREENSHOT_LIBS = @SCREENSHOT_LIBS@
+SED = @SED@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
+SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@
+SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
+STRIP = @STRIP@
+SVG_CFLAGS = @SVG_CFLAGS@
+SVG_LIBS = @SVG_LIBS@
+SYMPREFIX = @SYMPREFIX@
+TIFF_LIBS = @TIFF_LIBS@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@
+WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@
+WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@
+WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@
+WEBPMUX_LIBS = @WEBPMUX_LIBS@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@
+WEB_PAGE = @WEB_PAGE@
+WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@
+WINDRES = @WINDRES@
+WMF_CFLAGS = @WMF_CFLAGS@
+WMF_CONFIG = @WMF_CONFIG@
+WMF_LIBS = @WMF_LIBS@
+WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@
+XDG_EMAIL = @XDG_EMAIL@
+XFIXES_CFLAGS = @XFIXES_CFLAGS@
+XFIXES_LIBS = @XFIXES_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@
+XMC_CFLAGS = @XMC_CFLAGS@
+XMC_LIBS = @XMC_LIBS@
+XMKMF = @XMKMF@
+XMLLINT = @XMLLINT@
+XMU_LIBS = @XMU_LIBS@
+XPM_LIBS = @XPM_LIBS@
+XSLTPROC = @XSLTPROC@
+XVFB_RUN = @XVFB_RUN@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gimpdatadir = @gimpdatadir@
+gimpdir = @gimpdir@
+gimplocaledir = @gimplocaledir@
+gimpplugindir = @gimpplugindir@
+gimpsysconfdir = @gimpsysconfdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+manpage_gimpdir = @manpage_gimpdir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+mypaint_brushes_dir = @mypaint_brushes_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+paperdatadir = $(gimpdatadir)/gimpressionist/Paper
+paperdata_DATA = \
+ bricks.pgm \
+ bricks2.pgm \
+ burlap.pgm \
+ canvas2.pgm \
+ defaultpaper.pgm \
+ marble.pgm \
+ marble2.pgm \
+ stone.pgm \
+ struc.pgm
+
+EXTRA_DIST = $(paperdata_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Paper/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plug-ins/gimpressionist/Paper/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-paperdataDATA: $(paperdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(paperdata_DATA)'; test -n "$(paperdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(paperdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(paperdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(paperdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(paperdatadir)" || exit $$?; \
+ done
+
+uninstall-paperdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(paperdata_DATA)'; test -n "$(paperdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(paperdatadir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(paperdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-paperdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-paperdataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-paperdataDATA install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags-am uninstall uninstall-am \
+ uninstall-paperdataDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plug-ins/gimpressionist/Paper/bricks.pgm b/plug-ins/gimpressionist/Paper/bricks.pgm
new file mode 100644
index 0000000..c721f76
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/bricks.pgm
@@ -0,0 +1,43 @@
+P5
+# CREATOR: The GIMP's PNM Filter Version 1.0
+96 95
+255
+§¾Ãºœªš§šš®³£’Ž• ¤˜›ŽŒ‹Š„ƒžˆ‚£Žž’¦¡¢©Ÿ±¢©˜Œ¥„§œ³§´’°˜œ¢‘¡ž¥¡®±Ž²½Â©¼×±¯©¢Œ—˜„¦š ãª°´› Ô­ªÅË­®Ù³™„Ÿs¯ª•¡‘«¬—•’Š§—–¸¬´Å±ª¤§«°©•£¦•¢~œ˜¦¥µ‰¨¥¡¡½®¯¨–Ž¥°Ï˳Ý×Í{˜°—º·¡¯¥Ä–ÓÓš±³¨²š«·œ¯¯”¹±ž©––ƒœth…~˜w†uj}†—©˜‰ uˆ£š©²­ÆÄÍ°¿¸Ó˪¬›µœº·±–Ÿ¥‘”²­¨‘ª‚yŒµœŸ¥¢d‰‚¹‹|—‹’œš­—£Ÿ²ž”“™¢»¼—ª£°¬¡§ª’Á»q‰o‚r}¨fbaq—È…¼S„i­ÐßÌÁµ¤}|]`¦gŠŽ·°©l‹€nŠ¥…l„Ui›££#9Å•nˆ“–pvÆ¥u¤˜šžÂ£°¥˜†”©½‡¡Š§›˜˜¥ƒ²–ˆ£¢Ž’1‹r’X„˜¬ }“±“NÛÃœ•¡sGX`-wzvr¦‰¢—q_x…Ukpzuy‚G—« ³»‡kª~„°Z{²´¤”§Œ–¼ªŽ°¤œ‘ˆ›“lŠ„w—œ”’•—•„¢¶‡rƒ‘“›§¨OÈ®ŠŠŒ‰ˆƒ„„¾š—Ås’‘O_r†oŒŽŠ^drm¥ ³Ê‡•’ˆ‡ƒ‘‡…—¡ƒšš±È¯¸•“šŸšª~²˜z†žl£„Ž¢£‹‹—ƒ zdrˆ­Ã—"¾£|~} ŒuA|£›¸}š–Š&pc`Ywy”Kc„›y¦ ·›‡{†sŽ˜št‹O‚•­Œ¨®¦§³~z‡‚}ƒ…qˆ¢³§‚¨ „¡’œx~[t…²…ƒI «¹°gŒ{›'z‹W±q™}ƒ£Vwvjn]}ƒW4}…–¢WvÒz€…ˆ“¬o”¥‘nŽ…©¨©°£ƒ™”š“‰gofˆvp‚–¦…©’†”’“§y…˜Ž°Ÿ_ƒ‚vžtm}fN+:}ˆ”g‘xœ¡~mttlpS‡›}•†§‹Sh·œ†žŠ}’|o‚}˜n’­“ž›¨«–Ÿ‚žxq`l^ƒ„Ÿš¡£ª¦›¡††|‡’œ±²Wnƒz&®3|sxˆ™dgš›¢©‡Ÿ—œ¥x…|w©š„•|yƒ†…˜€ -®°bkl™\–™—ˆwT‘–¯¦Ÿ†š” ˆ“«{…†ŠvŒ©•˜ª‰ž‹‰rœŸ±Pgv k¶§ž«™š”Š›¥|už››¥†y|zm†w‚“„œ›“"¯Š˜¤Œ‡§z›l ˆŽ˜¯¢›Á˜~—Ÿ‰„”€—fŽ“¬žœŠž¢w}¢¥K^Š’ˆ_T  `´¤vŒ†·yl‚©¥’•‘ªŒšomj‘o•¾Ž•‹}‘›”’¨¸}tZ€‹©p}Ÿ§›ž„Š¡‘Š£¨²š~x™‹‡‚~›’¡££~œŠ™‡‡¢–HFT=QIt_qPԧ˳ª©Žyjµ¯š£ ¯¯€¢}}ŸŠiy¡Y}š§È~ŸŠoJd›‚‚„›v—s²—‚ž¼Jq…—ˆŒ‘„…•‰¶ŠŽ„ˆˆha^‚obˆl„$kÖ¿¥­£¨~’ œŽƒ“§œ„¦ƒ}‡}Š~Š¢±‰Ÿž™ Äqš„{vG`©Ž”Ÿ´°ˆ•‹Ÿ°ª‚¾œS‡«¦—†~—xŽl†—ž²“‚jsxb/†UŽ|]-
+ u¼ªÈ›«µŠŽ™£§—¦ˆ†l†{yn‘’„…žw›Š£œ¯‚ [–¦cnƒ¤•Ÿpqmˆ’¥”£šh{³x“~j}†”¥‰‰ˆ¦•†¡®‘u_\U€Y]‘j--
+aÚ·²¤”¥ŽxŽ—ƒ™„†›…}‚†Žv™ª¬¤©¡o ®„¢yqŠgq¦`{‰}˜˜“˜ˆ…’ƒs”u¦}˜‰€sp‡ª£®‰‡SrnoFsxUTl `ÔÇᎉŸŸ†Š–Œ ¡|†‹—†”‡”ˆŸ }„—y*
+”œr‚w—Œ•‰“§™—Ž«†—Ÿ¹½‘“”|ž•{t—ššŠ”¦£fx›\…vnigzpy/ iÏ¢¹†|Ž‰g‘ˆ©“‡¡•œ‡”“’}¤œ’¨™”¡É
+œz”vr€€Ÿb©­{«¯£€¤Œ«“œœŒw†‘Œs‚—‹¥”“’‰Ž€j{tm“Ž‘¢{|F_׳›¶”Æ¢’­›¡w¡§•ˆ‹–² šˆ‚šš  šŸ£ž¡¢¥”‡v€“‡sh†žŸ·ªz~€’‰•’•œ†¢i‰h’z„¡—±s›zž˜¡£‡‰Šz…y’¢œ‘n#j°—Õ©Œ‹Ž˜•¦wt~žŒŠ—ŸŒ„š™¤­´¼™ls_”A„ˆ¶†¡y`“‹ž”†²”’¨–ƒSQ{X†•‡¥ž‡š’‡i€Š‹iddvz¸ž¥£a fοwÁ°©¡–«¢ŠŽ–—’•ª’’›¶œ¢©®®«©¶§‡+ ˜r†ƒnxo“®……•ˆ’¬“°®ƒ„†…ˆX]˜€¦’›‘‰‰rŠ†“„‹™^knzm´}u97
+aÖ‚F{ºƒª¯«¤©n‰Œ©¬¥¡«‰…Š¡ v–­‰›º–jD £«\20Bo‘—’ƒ}‘‘“›„š‡nh_o81ƒ“Lo}‚šŽyšmžº¬zkYO].Ej—`<
+˜M)2-#31$FI8%$/ )%!«’<&X³'€–Œ…¤rclŒ¼gzOO(5;lp5bqœ™“”¢¢«}‘tbon=Yd‚i
+
+#           ypPŒ°‘—dO™„‚b‚º£²„Q"<GV$CSS1aba‰')(hepU^œKRhŽ L/5/       >2[fg}D$–€››Ž†e[," ! (   zŸ|ƒvA)%
+
+- ) 7,) 2?&21("…Xt‹c^T[>b`8 
+ "  :\u_u€¦º§‡™€‘•q; €\'$%!$;2 -k+#!3‘~NMhjTUkF8Nfpyx³½¿¡¡»žª‡›Œvd^o~#!YZy‡‘Š‘Œ«`‹X‚–ƒp]hz{qimƒ{”xmP| ´¨ ´Ÿ±°²§§¸šÆ™¡“™™žµÁ¶¸´³¾½²³³¯Ÿ«·›¯½¨£ž¬œ™”‡œ«1L|••nQ="%C€Šf–‹™¦“wi— ˆ´z©”›¥–™Š’”“Œ…£^‡›¼¤¯ š°¥¶¡“«”¤­ÆÁš¯ž®ÃÏƺÄǬ­º½­¡±Èõ‰œ¸´«»¦œ¹ª¨¢Ž—“´´±œ¢®¡µ™™š±­¢œ“¦—ª¡”°ˆ´¤¨•¹©³±‘š “’ƒ¦šž¡«°•Í³¥¼º®¡¨§›‘£¯Ÿ°£´»‘¹£¼À¶¨³Ë¿ ·wx™«¯²˜¥ƒš–ª¡³±®¼²®¥¬¦Ÿ¦xž2?Ž¥•¡ž´t³¼ÃœŽƒž¨¨§«²¨}jž¦¨½·¾‹µºªŸ¯¼½¬«ŽZ¢x™‹w=k²|Y‡Ž¡ª¸°©¹¬…Z³§Ÿž°ŽHXy€¤¨Í¹‘¯œ¦vjuŽ©®gƒ~qln•ªÀµ¿¶¢±°œ©¼²¶¤›—Š‰”†NU©À¨¬‰¡ž‹ˆ‘Ž•mdq’²´¯°¢®ªŸª˜š’¥š„“Œlw£‡gzUˆ~Š$Ÿ¸´©ƒi”‰ž©³¸¦ª¶‰§¦©£±ª´žp­“½¹±²¼Ê©­«‹¡©š¤Ž«!Fž°²š„‹§œš„cxˆvOovqŸ¥…zƒˆod_Udk‹qpt‚aˆ¥Ÿw‡€Š‡d
+Š‘ž¦s£¢£¬§ªµ¾Ü·ÉĽ§€‹”ÃÄÂÀËÁЭÊÎÌÇ«Ïɺª¥µÂ²±‘©¸½šŒœ›œ£œ¨›\“Ÿ†“Œ§–ˆ“yw•—ml‰¥I”† ½†g˜„­yT1ˆ¹ÉºŸŸ•­¬µ¯À¥ÈÆ»´¯·¾ÀÆÄÆÁ¸¾¿Ç¼ªµÃÒª¨¢¬½¯Æ£ ˆ«Â¸—›¤¥ƒ–©‡’µl“o•ƒ¢‹…”y’gizr“‡Œ•Qœ—•x|³‰+O#x™Ÿ½Ô°°§½»¼Í·½Ñ­Àɣ˴ÀºÅ­ÊÈÙ¹¿ÎÓẽ¡—­œ²‘¯‡ `¦Âœ”¦§¢ª—¬z›’²‹“²Äœ™{x [hŽ­—°Ë”²uœ¡Œšs… ;œÇ¼Êº¿¾ÃÑÚÆÇ»©Æ½¹®‘®°žÁÁÁ¹ž²¬«²¸Ÿ«¡‰–ˆ|. œ¹ª¥¡»©¦ª““Ÿƒ‰–›œ˜£Ž¬®žƒ~s£x…zw‹¤|ˆ°˜¼¢y‡Ž©™! # •Õ·º±ÂÇÅÈÀ§—£¨™ ©…¸Š¢«ª›¬ §ªžŒŠ£‹¥ˆ›x†uŒZ ¾Á£Œ™‰¡¬š¦Ÿf_x‹ŸŸ¬œŠ}‚s§|€q„·Ÿ§”§ª¡¢oŽ†s’¼©¼µØÆȨˆ  š¨‘ˆ†µ­¢±™·£˜®¯‘¦ ¢m~`”˜i_ƒ™M€Ë¥•¨¢¤© ›˜‰’{l’¬˜‰°ˆ~”z{™–qvŠ‹o¥¬¬¯®˜Œp‹‘xuµ©”»¤·zž—–Š‘¢‹ž™¡¦ž}{Çž¡ªžž¯˜¤’•w_}‹c~S›™
+BÑt›”Œ¯¢ŒŸ•‚˜Œ’¦¢ƒ¯¡‡™š„™Œiœ€Ÿ­¨¨²¬œp…„¸¦š¯¼…ÈΪ‡¬µ§Ÿ”qqœŽ¡‘½š†šz›§ª§”s‘¥‡§qv‹^Ž¡U)ÒÀ˜Š‹¡•rh¢‡ Ÿ±†•–†™ } “¼©k™„•¨˜¡¥Ì}¢¨œ¬†'  £Ówߧ{•¾¦¨²¥Ÿ¨¡œ¥‹©›—­Š™™£¹ªŸ›˜„h‹}[o~”‚Zu 8Òµ—›©¯±¤Ž¦§ž’”ŽŒ¤g´°…Sy©Šª‘¦šœ§²¬²„’§ˆ¬’•+ ”µ³Qê—uš—o¥—‹¡£¬’Ÿž¤ª«­¼”¡±£„•¥™‰~´šF—š“ƒ†ž™°®žŸ‡Œ²ž•š…³°³—yiŒ‰™›‰—•oz‡”~†¤­¬§¥{ªy›“®ŸCp¦ËwÕp‚ªŽjšŠ…–¡Ÿ˜³¬±¥«¤«Ÿ‰ž—¤ž²˜{†°td‰}y§u!ÖÓ­®£·™®Á¯†¤}‹œupq¹šw‡Ž•¡c«¦‚ª±¨¦¥›a–ª¥±t“®¦à¦³gŽŠ–¥”š’¤—¨¾¯® ª ¢­”¥ž¥‚’œ¯¢“p{{†—yˆ†C›ÂÏ®¥¤¨´•™“žšŠ{ŒŸd“~oŽn¦‘œ‰ › j¢Œ y¨¯±ž·y‹
+²˜™˜ŠtŠX^—…’ž„ –¦³¥¬¡©¨ ¬•Ÿ€‰˜†‘’Ÿ¥vtA“˜F”E Ƭ§­‘‰¨§¡r§‡¦Šzwˆ›œ¨ u¥}·¢˜Ž£§{¸±©­žx‘s’»Ó£qjxkg„[žŸ~š¦—§©¬œ˜¦‘Ž’ „¢”Œž£pR~[ˆŒ–¼Ü ¥nlw‘–„…†~™vˆqŒŒm€® zŠ­£Ž¤›’ Ž ¡’€‹¢–†‡˜S©µ¸¯„ˆˆh†—«zŒ©x“¢À¥–³–ˆ…ƒ²–—y•Œ®ƒqqr›ŒŸ ¬ì „[krŒvq‘®Ÿ¥x~}‡¤•¦ ¨i€w£x¥—y‹bŠ¡…p Ÿ¹Â·xyXunœ™‹rh~…©Ÿ Ÿ¦š›‡œ‰ž§r’{‡Ž\iK dIR‹]¥Ê—en—s„„€k`€©žšx…‡c|œ«†œ¶W|¶ŒŒªqŽŸªª†x|hJD*ª®¬Îh}c}™}l”‹¦š¨¦–©£­”¡†Ž‰rZ–\o˜xoLkvph\
+ ›Öt‚xž{‹Ÿ‰ ““˜–Š–—‘‘¨¦i¦£ ¸ž™{~†y°­š~u˜©«ˆO!¤´Å¥km^iT¦ •ˆ›«§¨š¹±–‹qœ¢££…[•„u^ D{U¶YjQ¾`~Œ†‘–””…±¥…~KvŽ¢„Îç¬ys¯®”†‰–·œ«”Ÿ"i˜¬›ŠŽ‚†™b’‡¥†€w ¾­ª¦´¶¥¡ƒ‘aQ’Yyk|jprŒx0W: ·¶§–¦ª¨¥„‚ƒ‡}•‡ˆ¦}£¡“†‡¦›‹‚’¤Ž¤§«šƒœ«³“•’ˆ (£y¸ª·µe|V…Š‚}z‘±È¹¯˜¬š„eFwR$BSpf†Y3@Bu!': ·¿‹¶“ž{›—Ÿ{§¢˜…S€‹gjc“†š‰›€¤™†›–°f2  :È ”Œ§ƒž¦¨›‚†|¹³¸¿•¥±ª…rr<T1€€glJY}'3 =¿¾¡¢¢£ŽŽR[‹žEOerSL<CY^dxŸ¥­‘¬’–Cq ˜•ª±¢§~‡JasbgLj•²ª¶Zœ ¢Ê’](+~p›¥_6%#/ ‹º’†’œ¢Š£TQ'Zƒnj=<^ˆs-.Hryss‚—|ŸƒJ3%iuaŽ±‚E 
+ 
+
+ 
+ 
+ }¹¤Ã/ LbMV=C;VJBY7*03GWd€Zp£¦œ€RI7>#
+ *]¢°°“šŠq9
+ '       G½¯œL$-J{”A}sRx@E‘¤š~')IPcbg{fN6Q^ 
+ b¾²­½ ¢§­žŸ´¤Ž—‘Šž™X 
+   ŽŠ Ážȶ%   "! 6 €?E­wŒ¨¬¯¸½Â¾¹£ž·ªÀÀ°›‘˜¦ ¥•§„L   6…š¡˜¤¢›µÎ°È¹Çä½Ë¯ÅÁ§p   j®­Ä¼ÅÅ<.Q·Íº·¼¯¯«›­µžŽŽŸ¥u¢x†¡¼¯š§­‘ƒlmq~€“”¯ª«™¸¹¯ª±¶’eRW£™•¡nƒž¢Ðž‹‹‚…œµ“„Ñ™Œ ‰ÉÝÕ׿ÍÁÛÜÎç˰̽µ¸³¾ÉÍÁ¨Ë­»Èʦ±È¶˜“Ž¡½ÇÇËÇÊ¥oˆ¢t¦–©˜Ã¨­Ÿ£“¥Å ‰Ž¥¤›¡`RXkŽ’ŒX. QѺª®t†9m¨ºÉº¼¹½‰³¿½°™Ì²¬®ÄÁÊüì˭¬Â¢Å°¤­¬¸§™ŒŒ‹xŽ”–p[w—‚ƒ‰ª¯±xŒs‹“š†¡ª§”—Š„''19‰|B`>\Cg°‰¡¦vt‘C%P–¬ÓÍÐ䜜©ž§¯«“«´º±¦¯œ­´¾¿ °ºª¯ÃÑò¨‘œ•~„š~„Ž‰—n’~k mœ›¥¢ˆyO}‡–r‡–‘´¥|fQpYe’…£©«Ÿ›·{¤žˆ_YaO ; ÆÁÏ»¡’¡’¤¥¯¸¸¶¨š¯¨»²­ª·Äµ¦¬µ°³”•¤q_ƒxr˜‘‘t`k€…”¦„ƒ|rwžvts”v¤¯ž™™jtqƒ˜™ž´¯£«®”‹‘”gp(­ÔÏÁ…¦‘ µ’±¡¤¯«£”ž³ª¥ºÄ»»µ±½©­¢£©ª¤Žmƒ–[l“‡zuˆ™†˜¦³Ÿ…’‡n‡†™‡yp€œ›f}}hP’rp’™£ –‹‰{… }a„h&
+·Á±ž¥Ÿš¯¹°–¨¨È¯š£©œ©µ«¼­Ï‘°´±¼¥·¯µ•œŒˆšˆX{˜W3Ts™’¡¨¢sfˆzŽ¬ˆsˆŽ“¢^_˜}^’t‘£¶¹•• –¦¸¦­©€‰Œc V´Î“«£œ®¦¸˜• ¦¢ž²¸“•µµ¿™¼œ™¿§²·¯¡›¤˜ž“„x›”xj^iˆ„Œˆˆk|w”†rvf¡•š‘†w¸J°¤‡§‹¨}¡ž°¤©®šŠ¡|f /¬Ä‘§ª¥›˜—“”’–­Á–¯¥Ž¥³¨šÑ«¨œ³«¸¥±žœŽš‘…˜‚nQx…˜‰Œ€}gS€}tf†‹‚™œj›¯—jE‹„µŽ™Ž—”Ž~g’„Jl
+
+e·« Š„›œ›¡~¯…·ž¿°Á§¹¾µÊ©·¡ˆ§¬­”¹¶ª Ÿ¥˜œŽ}Š˜~xrm‘Ÿ‚~^yŸUhŽyWy„ …‚œµzy_e’xp˜˜‹{uˆu} š {Ct
+†¾°¢r™—¢ˆ’v£¨©Ž¸ª‡¡¢§‘¯¤ˆ©ª˜¦¯¨«°–¢Ž}Œ—w^iy’ƒa†Œ†~„Yx˜…wu±¡„®œ—„m[ž~pºÎ£‘ƒd„t¥¥Ÿvf‡–¥ª†ˆ¬”ƒ–‡€‰œÇ« ·‹–‘š¤­«»£‘œ¡§«™ž£¢“{Šu”“›i‚‰“v­—}‰pz–´¢–y¢‡¿˜§¦–Y0vt™¡œœˆƒZ„™Ÿ¦¡{RzŸ—‹¼ˆ‘’o­¯˜£˜­‹j¦¡²¡½~œ‡‘š¦¦ –—•˜q‚„…uf}€pq˜‹f…Œ¥Œy“s²dSŠ”šy˜ZdT‹Ž¡†’“ƒ‰Šœ‘†k†d¯¸©‰wN¡¥˜–ŸŸ¸šŸŠœ®r®µž•²¡›™¨¢­®”–|}ƒ‹‡u{[]t…{¨ˆ|—d˜ˆ –ˆŠ „šŠ¢°¢›ŸŠr2Yƒ¡˜ª°}…—››²´£ŠUŸ… ¢ ¤~†‰‡“•¤‡‚yc¥Ž²•“¬›•ˆ²ž•š“¨“¡‚žª–yr|\‘†…of]dd’—š¬ªm‚¡±šŒ‡±’Š›Àž‰„¢pVƒŽ£d¾­–‘xŒŒ…•…°“œcž¦½›i‡›Š˜¬ ‘…£‰±–º­§©Âœ™’°£¤™˜©Ÿ«¬—~ee’†\…ygXˆo†r‹•~‹šƒ’ŠÂ¨€£”¥¨™¢xtƒ¤‹‹¬‰v“˜ˆ–¤”•¢Ç x„“y’Ç•}Š§r³–«{™¶“¶²¬«µœ­Žµ´¯¶¥›˜¯©¨›¤fˆŸ„„pŠ‚pX|}„qkxU¤¦ ž“…t~Žš¨©›Štc€‚¯¬Ú­„­’‘±šŽ±­ £‚3‘¦™mœ”‡³¥¡œ¦©¥­œ¢«Â©©…”²Ÿ¤¡®¡§–—ª’‚šxo‡Š‘oapcp„]h’œ ™°‘¾¤ ‡Ÿ‹‚Œzt§™©™Ážw¯…陸¤™Àšž™œwY š¬¤‚›‘ª±¥¡Š«½½¢£©³®—®Š“š—¤¬¥’‹“®ž††u‰ry…„‰vYzTm”©‡©€œ©¹šÁz™¢|”± •›‹‡Ž‡–«¬¢€£o§Ÿ’ ¡¨µµˆšƒ‚ )”½½‘‚‹¨±¢±¦‘ƒ˜¬š„ª’—ž„–¦®”ƒªšvvw{}m”~|Žhzn†‡Œ¦|\˜ ±¸Š{Š„•¢Ÿ•”¢°Ë¥À²´™—~¡Åű ¦¶¢´¡°w`}¸¡Ìr“c•·±–¯ u¹‡¾…œ£‘šŒ€“©ž—¨™|‘†jx|akj`y{vƒˆŽ„{|s}Š‚•—¥Š¯¨­¬®° –©®Á™¨Ÿ¥” ¡²—‹‘¢—°‰)
+ º˜°œ¢«ª›Ÿœ…’ª§”’x•“’‡±«•°¯¦©¨„~aš€gMka]€azŽzdjr¥š“p“u ‚„”¢°¡’ƒ–œ¨•—¨·°„—“¬«®¿¤²·½º¨”›ž/¥Žµ»ˆŽ–®¥«œ¦ ™”À›†l³—¨—¥Â´²›x‰Žkty`qCqwt~‹Š…o‰ˆt…Zvwm†eba¦ž˜­{‡ªŸl‡§­›Š³™²Ÿ­¼¹¢‘¦£¦ (
+À¶®Ô™±ŽŸ¬À˜¬˜²³“šŒˆ›¯½¢£ª·’ÆÒ®»“|v|~|‚Ž~sbebirVs‹uzeX‰Z_§¦¥v™ˆ—Œ¡Œª“†i…¤§¢£«™¾¢˜¦«´±£Ÿ™žƒ›#·®·Ú|¨¨¯±À¢–¨–¥º“˜™¨™”¬yá~©RayŽxnx„…l€…wwsŠzinPnun†™¤‡Ÿx†‡…“q“‡~|Ž£¡œ±°Ÿ®­¥¢³«š“¨’˜›´¨·Ïˆ®´¶¨±ª™¤¬Šš‹¨ªšˆµžž«¤¶ÂMŽf„’Ÿ‹›{tmq€sekqycZ€]wtwŒ…‘llbƒr~˜Œ‚©z„n Œ—§¤•®©¥ ”•œ³Ÿˆv™[5f¬®²ÌÇÚ¹¹¨§¨‘›‡œ‘£”‡ƒ¢º¬±–-H&$BYf^igmwlnuwqSrŒbcg…‰tX}sg—ž•žžyŠ“…¬¥°³¢·¢¥ m†§§Š‰k‡oa_~ž·ÒÀ΢¬¬™—thnk’rœŽ¢ª¯ž–W)*hB‚jG"7((Y]x|x‚„wjt}¨—„s}|Z‰…¡„¦˜—‘w‚]¼¡ «œ¬…‡D…´U{n—V9d ŽÅ©·»Î©ÃÒ¶vXbž£’ŽŸŸ¯¸´“c@&,#GL€g<"#7AbŒmtecg„f–“ž|ks…‹l‰›}«X“…Š}•¡´”€ij'!<´”‚pJ¤|‚Œ$ P¯“ž²š‚ˆ}d…[h‚›£‘‘² ¨¡ !1)DD5LZˆ‘…f_T(F#2„Xbx‡œf¢©­qulo€~tVj‹|C=5u‘³©”½€ƒT~žž´‹ n¤™•’˜u {¹‘Š”›£ƒ‹‚w®˜’£¬¦§Ÿ³€2 !^­¤{m‘š''09_xa+.#B"_emt\@<**,"+!\{Œž™l—¾‰“º¬‡l‚¬ƒ…LÇ®qu? %+Nbre•Ž‹…vw„R! #%*+ *#)
+2" )   
+ '.6bbiv´|ŽŒa„mXqpž„ˆM
+À¼½­†u_M #%
+   #
+('&SWb#  &    º¦¬¸šœ³¸Ï¡  &   ! %
+$4PKhcŒ}kƒ~ˆI   
+ #$)‚«¬¶’Š¥Žš¤Œ¶´¡Z'Š«³¾¢o#S€•°¥ƒ8oDA$š¼rª»®““AŽ™´ž¥¤Á¨¯¨¨­½¸¨¢˜—¨˜²žt 
+', 7”¡¡¦¯Ïʿ͹´¹ÄÄž¬VŸ’Œ=EwÏÒ¶²°»¹Ô¤½¨¢§Æº¼Â§¹Ø³·©¥¶¬Â¼´Ã²ª¥¬¼¼˜Ä²Õµ²¾½µ¼»Ã·Ø¹ÇʶÂÀ־Ͼ»ÂÑÏ¿¬Á¯²°½Á¾»ÎÁ¶Ö¯Û—¿ÊÓÑ­ÄÊɵÒÇÅà \ No newline at end of file
diff --git a/plug-ins/gimpressionist/Paper/bricks2.pgm b/plug-ins/gimpressionist/Paper/bricks2.pgm
new file mode 100644
index 0000000..a7d9c2e
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/bricks2.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Paper/burlap.pgm b/plug-ins/gimpressionist/Paper/burlap.pgm
new file mode 100644
index 0000000..6eb247b
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/burlap.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Paper/canvas2.pgm b/plug-ins/gimpressionist/Paper/canvas2.pgm
new file mode 100644
index 0000000..0ff93e7
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/canvas2.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Paper/defaultpaper.pgm b/plug-ins/gimpressionist/Paper/defaultpaper.pgm
new file mode 100644
index 0000000..da32d96
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/defaultpaper.pgm
@@ -0,0 +1,5 @@
+P5
+# CREATOR: The GIMP's PNM Filter Version 1.0
+100 100
+255
+¢£ov†nƒ—‘w‘›ˆ“™„}’žv­£–Š}š§’–“¦ŸŒœ‹“¡œÀ­ƒ}Œ†ˆ’y…Š”¨—«‰ªË¬—“¢­³œo“£}±œ”ž‚rrŠ„o¢Œmš‰y‘…{–’‰{‰‹‰Šmgœ›¨§ˆ‘‚€®š­—†¬’……™«’…™š£™ž†„Œƒƒn”…™Œr|–›–˜ž ¹¿¤†Š¨ª©¤˜c¡¡š‘—¢ ž—‰”‚ut‘zv‘Š’ŒŠ†z‚‰¢“˜„”šs†wt¢¸Š²›™‰ŠŸ‰—„¤§¨¡šz›¨žŠ––s«Š€…w€‰y‰‚ŒŠ–¢™’§«™›®¡˜¤®®œˆ§—‹³´”–ž”šŠ™¢‹{…e|„…‹¡°„˜’–‰ˆ–‹Œ¡”™¤}}µŒ¦‚¢©…œhz§’y”‹„— Ÿ™Œ‰ššŒ—®‚p‰–po† ¤¦˜¡––¡¦—«¡§ ‘ž¡^‹ªª­²¡Šˆ|‹Ÿ¡’–ˆ€u‹u†——œˆ‚n¦”t}›{y˜¨’˜³¢œ¨Ÿp}“§‘y‘—¬ˆ…‘…ŸªŠˆw“‰ˆ“œ}†œ…\|Œ®±‹ˆ££”ž©«­š‘}¡€¤·®¦˜©µ¢‹—‹€’—›’Œ’—‹{w†Œ—†sg†‚˜‹’i…œ€š®—¦·—„}¹{d’†– ¡}h‰ˆ§¢am{…”›€†w…‰w€¡Œ„sŠ‹ ™†žw‘—¤¬¬¤šz}{u¢ž´À¤·™™™Š‹–›ž¡„™¬›Š|œ›zwƒw‘˜Œr“±kˆš§¢Š{ž vrrv£—¨ž|u€Švvžƒnu‚’‚†m{›Ÿuw’ž›£™Œ’ž‹¢§ ˜š’–spwžÏ´‰–¡‹„¦”‚—{–šy¢™‹††š‘›‰w“|z¡—tœ–€›‹ ²uwš¤…_k’’¤†† ©Ÿ|t…t˜œˆhr‘pyƒ™šœ„„‰¡›¡šŠ™–ˆ’“¦š‘zœ„ŸŸ±²­–Ÿ£€ušˆ}¡“––ˆ‘‹‹†‘©”¡„–…€}ŒŒkh†¤Ÿ|€ƒ€ª¦Œ—™«”€o€¡Ÿ¢ˆy›†–¡“‹ˆ€v‚y‰€ni’ªƒv}}™–˜‘ŠŠ™š†™…e›– ”®±‰™„“œvif—š±žž‚‘‹˜¬¬ˆ‹¡Š|—†Œˆ…Ÿ­‚™––‹—ž˜ŠŒ¢“’¢™‹ƒ“vt ª‹wsev…l]’™‰tt’—©›–‘Ÿ–©”˜™’pŠ¢ž©©–¦ŸŠ”–žgz}ˆŠ—¢–‚›Œœ –˜ Ÿž“Œy€‰‘Ÿš’–‚––¦š©¿”¢€—–¢ƒ¦››‚ˆ‹‹šyv™‘Šl…no–„sn†Šš¢’žu†‹™‰©Ÿ‰Š‘†‰ˆžŒ›šˆˆu¢£ž§‹‹‹{o‹™‚˜“™¡ž¢ž””£­–š¢ †¤™›l‘£©®§›£¡—¦‘’‹|wu™“|_™«—]nƒ‚t‚„š˜‘‘}‚Š‰–‹ „‚‘y|„‰—‚‰Œhz……™œ”‹”{˜t}Šƒ‚¢—¡­¦¤™…lv¦°‘¨ ‘£”‹—œ‚—˜–Š‰‘‹£©¹£—‚€u—™‹pƒ™šŸ™‹˜o|s˜—›’zˆ‘Œ›{…|“Š—vy†””v^Œ‹‚€œŠŒ¬œ|‹¦“›l‚ƒˆ“¬©¶©Œšœ…{o™y¼©–‘£wƒ°¢®¤npvµ–¶¶¡¢zƒ“…ˆ–‹€…€ˆ¦Œ—’Œ¨‹ˆ|”“–‰Š‚‰›˜t‹wŒŒˆ‚wƒzvŒˆŒ‚ˆˆ–—š¡ˆ—}}…†‚‚‰’—¨£ˆž±Ÿ…|›”¬––y„™žp“ž‹Œ­Œ¡©¢©µ”„…}Œ£ž…\„†z’›““‹‚‚|œ¬˜r€…„‹}Œ˜‰„—¡”™”y–Œ|„Œ„“‹“€…—l|ª–’‹urpš›’Ÿ—}©ž¬šŠ‹—Œ{‰¢ª—wž—{£ œ€v’¬¢› ¡yˆŠ‰–ˆzsyvˆ®£r{}Šƒ‚sŸ¢™–‰|‹…›˜v–“‰‰‹€‹‘“ž£—›tuz€‚’’}‚‚–›¨¡–„ž´ŠŒ¡£Ššœ‰ƒ¡‹˜z}›”“ Š–›§·©|p|¡®…Šƒf…Š–€€dˆ—|‘œ˜ŒuSs†¡¬¤“‰…‰š›‰ƒ…rŒ“€‰† ™†“¤›v–ru}“”y‹—‹‰¢ž˜Œ¤£˜¨€ˆš¡”œ’—y¦—v„‹¦ž¦Ÿ¬œ¶®‰‰£¢¢‰¡wl|—uw‹ˆ¤…{{Œzotrƒšœ¤¦’™œ}˜zgr‰‹”’Ÿƒp‹ˆ‘Žr……{‰Š‰’’£¡ŒŸ£’—Ÿ—†–’–’¢…”„‹™Š®«­§¦–š–{‚²­ªˆcƒ”sŠžƒd”‹ˆ‹v…}\{{mt|‰‹ ‰š§¢€† ƒ”Š‹“Œ‰Œy}Š‹r’ˆ‡z\`tƒ™€tŸœ©›‰“„’ƒ¬”‰›™“™’yož–†€›ž‚ªœ€—±‹{‰–¤£œ§–nš°¨w|ez’ Ÿs^{e€}ƒhrŒ“˜”¨·‹…|˜¶šŠˆ„ƒƒ’—ww•‡~˜ššsbmly‹„zn“¦›¦¨ŠX z†¹¤†–€©Œ‚‚œ‘—ª¨”“ƒ‹ª¤…v—©‚w”£ƒˆ†gvŒžtŒdŒ€|o‚y^}‘Ÿ‘Ÿ©®ž‘ ’Š‘’‘ŠuzŒ…‚ŒœŒs‡s‹ŽZ…m’†šŸœ†˜§‘ˆw€š¦“ ™¬“‘w‘²““‘ ²o‰ts’–¢‘Œ›Ÿ½œwˆo—{™t‘‹Œ{††p^˜š‹ ‹‘ ‰‹›u}‹‰‘† †l lw‰}˜s†‚ƒ™¤pfu‘›‹†¨—¼ }“˜žz†¦š˜´·¨‹}ž˜”¨“e]Œžoz™’¹ ›±œ¤«|„‹ƒ€uyh £†|{‹a{º“Š}‹«¸“}‘Š†y†{£¨y‹››}‹Œ‚uyh™†……˜‚“¨‘m‹«‘²¡—‘‹¸‘”m^z‰²Ã¨ ›uu–ž›€…š™||¤—˜Š…žu€²œª“z„zwr…Št‚Œ‘yˆŠ“w„‹’¨œœ€‰rŒš –˜›œ‡ž†zwrƒƒ€…u¡ ²¢”€„[u¬¬’¡¬¼–‹·Š^¢œŠ“¬ÆÉŒƒ}¢ˆƒ™§”y——wyŸ|uƒ™¨˜ž…™š€„‘m}vp™ ‹‰vc”–˜Œ‰Œ|†”Š”Œœ«œ›°¬¨™š€„Œu€Ž›–°“—ž„f‰‹e‰¸¤”žª–ƒ…ž£¢ž”›}¸·«vˆy…Œ£|m}¤©m}ŒŒŸœfy¬{£˜ˆm{„y‰Šmtƒ”|””c„š›””š—˜™š”˜§®§®”}£–ˆ€††Œ™š§Ÿ—–™‰tzo¤£—Œ‹¹±—““…§¾Š‘“—ºª¡†ƒ¬§ˆn„‚}«–Š§ƒ›}}†‘ –—œ†ˆ‘sy‹‘}kc|˜³“Šy|˜‹¡§–…’žš–ˆŒœ©¬«Ÿ¢žŒ|Œ{‰Œ‘˜”Ÿ¡±§¢“”¶˜¢¨¡šˆ§š®ž¨ ˜…®Ÿ‘„’ ²ª§¸‹‘¼‰‚‘”‘”zsˆ}Su“—‘˜“™zŠ“”‘z]u–—ˆ†y†¤µ§‰€Œ™ž…‘®¢–š«¨™®™—Žˆ’}Œ¢ž¨‘µ¢€Œ… §§Ÿ¨¬«Œ™›‘–§¡›‘«®“™Ÿº«£¡“›”™˜ ’‘ƒ€}‹Š‰pŒšƒ…‚¬“ƒ‘“¡£’tM„†šª®”Ÿ¡“š˜††›”«šª³–¥¥ŽŒŽˆœ‰Ÿ—–š£¦Œ†š¢›ª¢¨˜Œ«ˆ¡³ž|˜±w–§Œ¡´°œ…®· §š·¬’‰ŒleŒ§¤…l‚„ž|„†˜ŒˆŠ‹}š ˆw„‹†‘¢“†”˜ Ÿ™›—…ŒŒ¡™ªŸ˜…ž ‡Œ”“ª˜}†Ÿ œœŸ›¡™—žš’‚ƒ¡©¼˜““’‰–™£¹›˜£Ã§–ª¾Ëœ‹’…]}‚t–†œ‘§u‚{‚˜ˆ†¢¤yorƒš£‘”¤¦žžžƒ†”š‹œ“–˜ˆ‘Ÿ ›†’‹“‘‰™£’¨¨ž™Š„™²’r„§Ÿ––Œœ‹–§¨²ž‰´Á¤ ¬Å«v…šo€®œ‚€‚§ŸŒ„rcrw{š››Ÿiy‹“””ŒŒ šŒ™–‘›™—³²…”””–Ÿ ƒœ¡”ˆ—t}Ÿ”{Œ’™›œ˜Œ™{†”¤””–ž œ¬ŠŒ—¨ª”›©³®®«±¶w„°£Ÿ–¡ž£©…‰“Œmc†|o†Š°–œŒlio™¨—…–y‚ª¢Šš…–¶ ™›­“‹‘Šœž{˜p—‘Œ«žƒ‹§ˆ—…“œŠtš§Ÿ‚–²–˜£Ÿy˜§˜£¤¸³§œš–˜¬¡™žšƒoŠˆ¤“|aah€„˜¨k„…‹Œ}‰œš ‘’–®˜›© Ÿ›—‰Œ¡‹‰¡œ“©£”€«‹€€ªžŠ›¢ ™ž…“Šš‘ Ÿ¶¨š˜”‘ª{£°¿©‹‰¤±˜…ƒ´´ž  ˜soŒˆ€“™“„ƒyv„uoc–¤—‰mhœ£Œ‘¦’¦Ÿ¤¤ª³™}†“’ƒ}Œ”²ªž’Œ y štž§„{ž¼Ÿ“¡¤ƒr”ž‹„’’ˆ§š§|Šœ‹§µ’Œ˜¦ž“«˜ ™…“ŸŸŒ›ž…n€’«¤‘rouƒ€†Š–™|†‘’‚Œ ’¦ªŸ”§”—¤š™¡À¡¢©‚‹‰‹–i›¦¡¬ œœ—ˆ“‰˜š‹uy¡†²Ä¬˜§§©vŒŒ¦ Œ‰…—²—”z|…†|˜°yt‚|yv‹†œ§“œƒ}‘š”¦±²ª£’˜Š£ˆª”¬ª¢“®§ ¡r†Š˜‰y‹–®µ¢£ª’ „Š–wu„¦›“£©¤µ¨žtƒƒš—’”ž’‘ƒšœ“œ‹o|€}–ˆ”}’v‰’‘Ÿ—m‚†Ÿ“Œ¤ª­©¡¨}ˆž›‰‘”ž± ªˆy¦„ƒ€Œ˜z¢™“…‰³ž™°£ ›|†™˜}””žªi´°ž”‘}t‹Œ‰|f’†›¢™ƒ¡u…–‘}’”™ˆ…{{}–y€—…›‰‘}†¢Š±›†©§ŒŒª–ª«‹z…szv™—£¢™ ¤™¤¹—˜’–y‰ˆ…†–š–¬©–›¡¡™‘„„lw”œ¢ˆpœ›’rzŒŒŒª–Œwƒ§‚‚’ˆ{}h‰‘—’’…†|…††—„­±˜š¤——wš¢’¡v€c†‘Œ“˜š†¢ž¦™™›€™«’™–m…†ž‹š¤®˜w‘’Œ›‘ˆ™€o’€…’š‹v‚ƒ˜¤†ˆ——„€ut„‰‹sˆ‘“š—˜‹ŠŒ{Ÿ›Š‹º¢œ˜’”¤¦˜‹”iœvv“‹ƒ¤œ‰„­³’—“†“——™£™ z…¢¤Ÿ€Œš™Š—›©ƒoœ˜—“}mˆ§¡wˆeŒšƒ”œ‘˜šz€‰vn€“‘Œ¤’œ‘uŒvœ’–„š–ŒŠ£š‹“”­¦œŒ…ˆw{“‹ ‚“Œw¦®¡ŠŠ„Šš–’Ÿ…’—“…˜ ™›“”¤Š‹‚‰§«œ‘™–yƒšŒžŒ„Šƒ’}ŠnŠ© °‘‘|{Š{h……Šš…|Ÿ‹vr—ˆ€¤žh“š—v¼«{Ÿœ˜‘…”‚˜’’¤œœ³‘„ž”’”’¦”—}ƒ——Š†ƒ›’«‰“”“}“ŸˆŸ‰‚—ž}‘™ˆ}ŒŸ’z¦˜ˆ¢­ œ’…myw€„‚‹ƒ™‘€‚ˆ…Šs—›‘–’¡¶©”œ“‚¡®¤ƒ“¦’¤š–“‰Ÿˆ¢‘¡”ž‚ˆŸ›——ƒ|ˆ˜£˜˜š{—žœ›“˜„’¤˜Ÿna‰°§œ¢‹‚šˆ—“ˆž›‘‚‚s}z–ˆ‰“ˆ‚}‹Š›Œ’tr…¤ §§¡¢œ‚©ž­}s§¾˜t”¤“šy–£—¤‘„…Œ ­˜ƒƒ‹—˜“‰“†‹˜š®¡—´£{¨“{Œ‹§ªªš°®Œ”‚‚|œ™Ÿ‹|}‰œ…ž}{ˆww‘¡’“™|u}š¢˜ž¢ƒ–ª—… ¬ …‚‰‰›¨yŒŒv“ª™—Š‘“–‘¦›–…”‘Ÿw“¨šyœ”˜¤«´‰‘‰ezŠ…˜´ˆš¤ž ž“‚s|››‘«v‘’vsotr{™˜›Ÿ‰eo}|Š¬œ ¤’Š…–™¿™l¦ŠŒ”‘”š“›šžŠ¢Ÿ˜Œž™“”ƒˆ‘„‹}‰“š‰šˆ˜v±¡¦«¢–{{…|ˆª’ ™”€›¦”‹‰”ƒsŠvœ“«š€u}tv†`Œ‘€ ­—ozwhyŸ¦Œ«£“Š±´€¦ž{„¢ ‘˜¨³œ¡›‚†±‘’ w†ƒŠŒmnœŸ‚Šˆ“”’˜˜€´žv™¹ªˆyž¢–‰¢Œ—¤–Ÿƒƒy€|ˆ›Œš†Š‚†p…‰y†ž†™‚n’‰z}–”˜Çšs¡ “€ˆ®„}©«°š¤¢¡ƒ„£…Œ’‘…€†ƒft’’†y¦…Œ§|“›¤™«²ž…µ²„r˜‚” ‰Ÿª mu“‰„…ƒsŠt‹ƒšž‹w£‹z{—i}˜¤†ž„†sŒ‹{}Ï¢wl£ž„€ƒy£  ™’¢ž¨‹£«”¢°€„‰¢ˆ’y…Š”¨—«‰ªË¬—“¢­³œo“£}±œ”ž‚rrŠ„o¢Œmš‰y‘¢£ov†nƒ—‘w‘›ˆ“™„}’žv­£–Š}š§’–“¦ŸŒœ‹“¡œÀ­ƒ}Œ†…™Œr|–›–˜ž ¹¿¤†Š¨ª©¤˜c¡¡š‘—¢ ž—‰”‚ut‘zv‘Š’ŒŠ†…{–’‰{‰‹‰Šmgœ›¨§ˆ‘‚€®š­—†¬’……™«’…™š£™ž†„Œƒƒn”‰y‰‚ŒŠ–¢™’§«™›®¡˜¤®®œˆ§—‹³´”–ž”šŠ™¢‹{…e|„…‹¡°„z‚‰¢“˜„”šs†wt¢¸Š²›™‰ŠŸ‰—„¤§¨¡šz›¨žŠ––s«Š€…w€–po† ¤¦˜¡––¡¦—«¡§ ‘ž¡^‹ªª­²¡Šˆ|‹Ÿ¡’–ˆ€u‹u†——œ˜’–‰ˆ–‹Œ¡”™¤}}µŒ¦‚¢©…œhz§’y”‹„— Ÿ™Œ‰ššŒ—®‚p‰…\|Œ®±‹ˆ££”ž©«­š‘}¡€¤·®¦˜©µ¢‹—‹€’—›’Œ’—‹{w†Œ—†ˆ‚n¦”t}›{y˜¨’˜³¢œ¨Ÿp}“§‘y‘—¬ˆ…‘…ŸªŠˆw“‰ˆ“œ}†œ„sŠ‹ ™†žw‘—¤¬¬¤šz}{u¢ž´À¤·™™™Š‹–›ž¡„™¬›Š|œ›sg†‚˜‹’i…œ€š®—¦·—„}¹{d’†– ¡}h‰ˆ§¢am{…”›€†w…‰w€¡Œ’ž›£™Œ’ž‹¢§ ˜š’–spwžÏ´‰–¡‹„¦”‚—{–šy¢™‹††š‘›‰zwƒw‘˜Œr“±kˆš§¢Š{ž vrrv£—¨ž|u€Švvžƒnu‚’‚†m{›Ÿuw¡›¡šŠ™–ˆ’“¦š‘zœ„ŸŸ±²­–Ÿ£€ušˆ}¡“––ˆ‘‹‹†‘©”¡„–…€w“|z¡—tœ–€›‹ ²uwš¤…_k’’¤†† ©Ÿ|t…t˜œˆhr‘pyƒ™šœ„„‰–˜‘ŠŠ™š†™…e›– ”®±‰™„“œvif—š±žž‚‘‹˜¬¬ˆ‹¡Š|}ŒŒkh†¤Ÿ|€ƒ€ª¦Œ—™«”€o€¡Ÿ¢ˆy›†–¡“‹ˆ€v‚y‰€ni’ªƒv}}™›–‘Ÿ–©”˜™’pŠ¢ž©©–¦ŸŠ”–žgz}ˆŠ—¢–‚›Œœ –˜ Ÿž“Œy—†Œˆ…Ÿ­‚™––‹—ž˜ŠŒ¢“’¢™‹ƒ“vt ª‹wsev…l]’™‰tt’—©žu†‹™‰©Ÿ‰Š‘†‰ˆžŒ›šˆˆu¢£ž§‹‹‹{o‹™‚˜“™¡ž¢ž””£­–š€‰‘Ÿš’–‚––¦š©¿”¢€—–¢ƒ¦››‚ˆ‹‹šyv™‘Šl…no–„sn†Šš¢’‚Š‰–‹ „‚‘y|„‰—‚‰Œhz……™œ”‹”{˜t}Šƒ‚¢—¡­¦¤™…lv¦°‘¢ †¤™›l‘£©®§›£¡—¦‘’‹|wu™“|_™«—]nƒ‚t‚„š˜‘‘}‘Œ›{…|“Š—vy†””v^Œ‹‚€œŠŒ¬œ|‹¦“›l‚ƒˆ“¬©¶©Œšœ…{o™¨ ‘£”‹—œ‚—˜–Š‰‘‹£©¹£—‚€u—™‹pƒ™šŸ™‹˜o|s˜—›’zˆ‰›˜t‹wŒŒˆ‚wƒzvŒˆŒ‚ˆˆ–—š¡ˆ—}}…†‚‚‰’—¨£ˆž±Ÿ…|›”y¼©–‘£wƒ°¢®¤npvµ–¶¶¡¢zƒ“…ˆ–‹€…€ˆ¦Œ—’Œ¨‹ˆ|”“–‰Š‚Œ˜‰„—¡”™”y–Œ|„Œ„“‹“€…—l|ª–’‹urpš›’Ÿ—}©ž¬šŠ‹—Œ{‰¢¬––y„™žp“ž‹Œ­Œ¡©¢©µ”„…}Œ£ž…\„†z’›““‹‚‚|œ¬˜r€…„‹}|‹…›˜v–“‰‰‹€‹‘“ž£—›tuz€‚’’}‚‚–›¨¡–„ž´ŠŒ¡£Ššœª—wž—{£ œ€v’¬¢› ¡yˆŠ‰–ˆzsyvˆ®£r{}Šƒ‚sŸ¢™–‰…‰š›‰ƒ…rŒ“€‰† ™†“¤›v–ru}“”y‹—‹‰¢ž˜Œ¤£˜¨€ˆš¡”œ’—‰ƒ¡‹˜z}›”“ Š–›§·©|p|¡®…Šƒf…Š–€€dˆ—|‘œ˜ŒuSs†¡¬¤“‰™œ}˜zgr‰‹”’Ÿƒp‹ˆ‘r„†{€ˆŠ‰’’£¡ŒŸ£’—Ÿ—†–’–’y¦—v„‹¦ž¦Ÿ¬œ¶®‰‰£¢¢‰¡wl|—uw‹ˆ¤…{{Œzotrƒšœ¤¦’§¢€† ƒ”Š‹“Œ‰Œy}ŠŒo—“Šz_`tƒ‘™€tŸœ©›‰“„’ƒ¬”‰›™“™¢…”„‹™Š®«­§¦–š–{‚²­ªˆcƒ”sŠžƒd”‹ˆ‹v…}\{{mt|‰‹ ‰š”¨·‹…|˜¶šŠˆ„ƒƒ’—wx–‹‰–‡~uiy‹„zn“¦›¦¨ŠX z†¹¤†–€©’yož–†€›ž‚ªœ€—±‹{‰–¤£œ§–nš°¨w|ez’ Ÿs^{e€}ƒhrŒ“˜Ÿ©®ž‘ ’Š‘’‘Šu{‰„‘˜~ŒŒ€€›„‘‘Z…m’†šŸœ†˜§‘ˆw€š¦“ Œ‚‚œ‘—ª¨”“ƒ‹ª¤…v—©‚w”£ƒˆ†gvŒžtŒdŒ€|o‚y^}‘Ÿ‘‹‘ ‰‹›u}‹‰‘† †lœvŽ’}žŠ™—|u£§qfu‘›‹†¨—¼ }“˜žz†¦™¬“‘w‘²““‘ ²o‰ts’–¢‘Œ›Ÿ½œwˆo—{™t‘‹Œ{††p^˜š‹ ‹«¸“}‘Š†y†{£¨y‹š›ƒ”{}š“‘Ÿˆ–—•žž‚“¨‘m‹«‘²¡—‘‹¸‘”m^š˜´·¨‹}ž˜”¨“e]Œžoz™’¹ ›±œ¤«|„‹ƒ€uyh £†|{‹a{º“Š}’¨œœ€‰rŒš –˜šŽ|„‹¥£›¤š‹¤ ²¢”€„[u¬¬’¡¬¼–‹·Š^z‰²Ã¨ ›uu–ž›€…š™||¤—˜Š…žu€²œª“z„zwr…Št‚Œ‘yˆŠ“w„‹–˜Œ‰Œ|†”Š”Œœ«œš¬™‘€™ª¢™˜’…›•°“—ž„f‰‹e‰¸¤”žª–ƒ…ž¢œŠ“¬ÆÉŒƒ}¢ˆƒ™§”y——wyŸ|uƒ™¨˜ž…™š€„‘m}vp™ ‹‰vc””c„š›””š—˜™š”—¡ªŸ‹†ŸŸ•“‰‚‰‹™š§Ÿ—–™‰tzo¤£—Œ‹¹±—“£¢ž”›}¸·«vˆy…Œ£|m}¤©m}ŒŒŸœfy¬{£˜ˆm{„y‰Šmtƒ”|”Šy|˜‹¡§–…’žš–ˆŒ›¦¢¢­¥¤”{Ž}‹Œ‘˜”Ÿ¡±§¢“”¶˜¢¨¡šˆ§š®ž“…§¾Š‘“—ºª¡†ƒ¬§ˆn„‚}«–Š§ƒ›}}†‘ –—œ†ˆ‘sy‹‘}kc|˜³“†y†¤µ§‰€Œ™ž…‘®¢–š¡¥£¯›‘ˆ’}Œ¢ž¨‘µ¢€Œ… §§Ÿ¨¬«Œ™›¨ ˜…®Ÿ‘„’ ²ª§¸‹‘¼‰‚‘”‘”zsˆ}Su“—‘˜“™zŠ“”‘z]u–—ˆ†šª®”Ÿ¡“š˜††›”«šª²—¡¥ŒŽˆœ‰Ÿ—–š£¦Œ†š¢›ª¢¨˜Œ«ˆ¡³‘–§¡›‘«®“™Ÿº«£¡“›”™˜ ’‘ƒ€}‹Š‰pŒšƒ…‚¬“ƒ‘“¡£’tM„‘¢“†”˜ Ÿ™›—…ŒŒ¡™ªŸ™…¡ˆŒ”“ª˜}†Ÿ œœŸ›¡™—žš’‚ƒ¡©¼ž|˜±w–§Œ¡´°œ…®· §š·¬’‰ŒleŒ§¤…l‚„ž|„†˜ŒˆŠ‹}š ˆw„‹†š£‘”¤¦žžžƒ†”š‹œ“–˜ˆ‘Ÿ ›†’‹“‘‰™£’¨¨ž™Š„™²’r„§Ÿ–˜““’‰–™£¹›˜£Ã§–ª¾Ëœ‹’…]}‚t–†œ‘§u‚{‚˜ˆ†¢¤yorƒŒŒ šŒ™–‘›™—³²…”””–Ÿ ƒœ¡”ˆ—t}Ÿ”{Œ’™›œ˜Œ™{†”¤””–ž œ–Œœ‹–§¨²ž‰´Á¤ ¬Å«v…šo€®œ‚€‚§ŸŒ„rcrw{š››Ÿiy‹“””–y‚ª¢Šš…–¶ ™›­“‹‘Šœž{˜p—‘Œ«žƒ‹§ˆ—…“œŠtš§Ÿ‚–²¬ŠŒ—¨ª”›©³®®«±¶w„°£Ÿ–¡ž£©…‰“Œmc†|o†Š°–œŒlio™¨—…š ‘’–®˜›© Ÿ›—‰Œ¡‹‰¡œ“©£”€«‹€€ªžŠ›¢ ™ž…“Šš‘ Ÿ¶–˜£Ÿy˜§˜£¤¸³§œš–˜¬¡™žšƒoŠˆ¤“|aah€„˜¨k„…‹Œ}‰œŒ‘¦’¦Ÿ¤¤ª³™}†“’ƒ}Œ”²ªž’Œ y štž§„{ž¼Ÿ“¡¤ƒr”ž‹„’’ˆ§¨š˜”‘ª{£°¿©‹‰¤±˜…ƒ´´ž  ˜soŒˆ€“™“„ƒyv„uoc–¤—‰mhœ£‚Œ ’¦ªŸ”§”—¤š™¡À¡¢©‚‹‰‹–i›¦¡¬ œœ—ˆ“‰˜š‹uš§|Šœ‹§µ’Œ˜¦ž“«˜ ™…“ŸŸŒ›ž…n€’«¤‘rouƒ€†Š–™|†‘’}‘š”¦±²ª£’˜Š£ˆª”¬ª¢“®§ ¡r†Š˜‰y‹–®µ¢£ª’ „Š–wy¡†²Ä¬˜§§©vŒŒ¦ Œ‰…—²—”z|…†|˜°yt‚|yv‹†œ§“œƒ†Ÿ“Œ¤ª­©¡¨}ˆž›‰‘”ž± ªˆy¦„ƒ€Œ˜z¢™“…‰³ž™°£ ›|†™˜}u„¦›“£©¤µ¨žtƒƒš—’”ž’‘ƒšœ“œ‹o|€}–ˆ”}’v‰’‘Ÿ—m‚…›‰‘}†¢Š±›†©§ŒŒª–ª«‹z…szv™—£¢™ ¤™¤¹—˜’–y‰ˆ…””žªi´°ž”‘}t‹Œ‰|f’†›¢™ƒ¡u…–‘}’”™ˆ…{{}–y€—’…†|…††—„­±˜š¤——wš¢’¡v€c†‘Œ“˜š†¢ž¦™™›€™«’™–m…†–š–¬©–›¡¡™‘„„lw”œ¢ˆpœ›’rzŒŒŒª–Œwƒ§‚‚’ˆ{}h‰‘—’˜‹ŠŒ{Ÿ›Š‹º¢œ˜’”¤¦˜‹”iœvv“‹ƒ¤œ‰„­³’—“†“——™£™ z…†ž‹š¤®˜w‘’Œ›‘ˆ™€o’€…’š‹v‚ƒ˜¤†ˆ——„€ut„‰‹sˆ‘“š—‘uŒvœ’–„š–ŒŠ£š‹“”­¦œŒ…ˆw{“‹ ‚“Œw¦®¡ŠŠ„Šš–’Ÿ…’—“…¢¤Ÿ€Œš™Š—›©ƒoœ˜—“}mˆ§¡wˆeŒšƒ”œ‘˜šz€‰vn€“‘Œ¤’œ‹vr—ˆ€¤žh“š—v¼«{Ÿœ˜‘…”‚˜’’¤œœ³‘„ž”’”’¦”—}ƒ——˜ ™›“”¤Š‹‚‰§«œ‘™–yƒšŒžŒ„Šƒ’}ŠnŠ© °‘‘|{Š{h……Šš…|Ÿƒ™‘€‚ˆ…Šs—›‘–’¡¶©”œ“‚¡®¤ƒ“¦’¤š–“‰Ÿˆ¢‘¡”ž‚ˆŸ›—Š†ƒ›’«‰“”“}“ŸˆŸ‰‚—ž}‘™ˆ}ŒŸ’z¦˜ˆ¢­ œ’…myw€„‚‹ˆ‚}‹Š›Œ’tr…¤ §§¡¢œ‚©ž­}s§¾˜t”¤“šy–£—¤‘„…Œ ­˜—ƒ|ˆ˜£˜˜š{—žœ›“˜„’¤˜Ÿna‰°§œ¢‹‚šˆ—“ˆž›‘‚‚s}z–ˆ‰“ˆww‘¡’“™|u}š¢˜ž¢ƒ–ª—… ¬ …‚‰‰›¨yŒŒv“ª™—Š‘“–‘¦›–ƒƒ‹—˜“‰“†‹˜š®¡—´£{¨“{Œ‹§ªªš°®Œ”‚‚|œ™Ÿ‹|}‰œ…ž}{otr{™˜›Ÿ‰eo}|Š¬œ ¤’Š…–™¿™l¦ŠŒ”‘”š“›šžŠ¢Ÿ˜Œž™“”ƒˆ…”‘Ÿw“¨šyœ”˜¤«´‰‘‰ezŠ…˜´ˆš¤ž ž“‚s|››‘«v‘’vsv†`Œ‘€ ­—ozwhyŸ¦Œ«£“Š±´€¦ž{„¢ ‘˜¨³œ¡›‚†±‘’ w†ƒ‘„‹}‰“š‰šˆ˜v±¡¦«¢–{{…|ˆª’ ™”€›¦”‹‰”ƒsŠvœ“«š€u}t†p…‰y†ž†™‚n’‰z}–”˜Çšs¡ “€ˆ®„}©«°š¤¢¡ƒ„£…Œ’‘…€†ŠŒmnœŸ‚Šˆ“”’˜˜€´žv™¹ªˆyž¢–‰¢Œ—¤–Ÿƒƒy€|ˆ›Œš†Š‚‹w£‹z{—i}˜¤†ž„†sŒ‹{}Ï¢wl£ž„€ƒy£  ™’¢ž¨‹£«”¢°€„‰¢ƒft’’†y¦…Œ§|“›¤™«²ž…µ²„r˜‚” ‰Ÿª mu“‰„…ƒsŠt‹ƒšž \ No newline at end of file
diff --git a/plug-ins/gimpressionist/Paper/marble.pgm b/plug-ins/gimpressionist/Paper/marble.pgm
new file mode 100644
index 0000000..589d8d3
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/marble.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Paper/marble2.pgm b/plug-ins/gimpressionist/Paper/marble2.pgm
new file mode 100644
index 0000000..0090344
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/marble2.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Paper/stone.pgm b/plug-ins/gimpressionist/Paper/stone.pgm
new file mode 100644
index 0000000..a1c0e34
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/stone.pgm
@@ -0,0 +1,6 @@
+P5
+# CREATOR: The GIMP's PNM Filter Version 1.0
+130 130
+255
+µ¤´¬±º­«¾ÂËÏÐÕÕ™%+/Guž¤ž¬­¸®Ë¹©Ÿ²©¥›¯ ­Â±ªÊůª|Ÿª«°¿žœŸŸ¬¦¨£¨©³ÂÐÀÀžI c™«§®¤±³§“‰’yx‘™¬¶ŠŠsuweekzuyz‡•¶­¢–šÝÝÐǽ®±­³ÀÌÔÇö½ª´¯¶¯±»ÃÆο¸½¶¼¨}LX’¥®·š¥™ ¯¡±¦®¿¦›±È´¨µµ·Ä²ªË¤Ž›Š£¤¼«¯²¡®©ª›±ÙÕÖÀ`cNDs¥ÖÛÉÄÄÁ¸»¼³ ~`n¡—‘£¸­²´¬¬Â¼·¹°µÅÈ¢·Á³ÔÉǺÃǬ¾¿¶µª³¿ÄÁ¼­²¯¡«·À½ÁÅ´»º°ÇѸž4s¬¯¡±¢”“¶·¾¸ ¨ÒÏǺÊÖúвµÈ¦®ª­¬›°±¿º©ª–¢—‘®ÃÌã¾n1Toœ¸ÜÛÞáààÕËÓ×Ǻ¢VJŽ’®¹´¯¹¼¨¸µ¼½¡ªÆÇËÌ”›š«Ë²²À¼ÃÇ˼«·°¡¾ÎĹ«¸¤©ºÀ¸¸¶½¼·Â³ÌĹtG&*N·²§—ŸÌ¿Ä¼§¡­½ºÂÔÖÓͶ¶œ£¦«¬¸¨µ­”¥“–š˜§³¤jz^‰›»ÉÕÅÄÎàØÙÔÍÓп³ o\’š±¾¿ÈËÁ¾ÅÏ·¼½«Â¿ÅÄ°{­Ì¯³¿­´½Â¶³°»¦¬¶Ê±¥«¡—±²¸·²ªÌÉƨ£¯¢··ƒ7#—ª¼ÂºÄ̶‘—›¦ªºÁ³®¶»¸´‡””š¢˜”œ“³«¡¦¡ ”°£W$m ÌÏÖDzÁ»Á¿¸ÂÍÇÍɱ¢“Šv“´À¹ËÍÀÅÓÛ¼¼Á²ÁÈÂÁÀ½‰zŒÇ¤µ¸ª´­¼¯®ª»—¤©·´Èº®È¿¾«¡Ÿ´½½ª¢³¾º¾š…zZ.r¶Ì½Ÿ¡¾Æº£¦•®£˜œ‘²0X‘}“žƒ™Ž¥•¥ˆ—žŽs0%`›×áËÔßàáËÅÇļ¶ÈÈ» Š‘’{†Â³¯½ÀÀ½½¿ÒÕÁ¹“ ¥Ã¶«®ux‡wµµ¼¶¿ÆѺ»ÆÐÕÅÉ̽ı·¹¸¹¸±±¬´¾À­°¯¦±»•wna5+7 '_ºÕÏÐÌý°±¼¨¬„Vmœ¦ ¨ªµÀ¦·²©†‚sM<:d­ÎØÐÇ×ÎËÔ³¾ÂÈÀ¬º°¦†’—Œ€–•¸ÄÅÆÊÂÀÆÀñ¥Ž²«‘”x}ˆs £´ºÃÍÐÏ×ÖÍÌÆÊÀϦ ²²º´´ºÌο¹Á¼«¥­£…gi|‡wlZS:"Av¹ÃÎЯ¦ª»Ã˦…8‰†“˜£§±®§®®ËÆ´u&?w§»’°Å¾ÉÌÑ·»¼Å¸ÉÉ©¦­²Šˆš¢š¡_>]–²´»ÈƼ¾Á¬½¨–†“j~oR ¬°³¹É¿ÐÜÐÄËËÀ½Æ·°·ºÊ³¹ºÄɬ ´µ´ z]Xnž½Æ½—€Z</)-J]cŠ’ž©ÍµžpZdtl†‹”›ª°¬µœzN<;>j’¦º§¯¢¹®ÉÆʼ¼ºÁÁÈË°•¨Á‡€–¡›£–MJMȾ¼º¼¾¾¶¬§¶—yfu|lM•ÂËÏ¿ÃÃÙѽ¸Äź·Çº©°ÁËËÑŶ²Ÿ¥®¦³ŽRdx’¸Ó×Ø×ÖɬU1.( ;nŠ¤]6O‚x]e˜•‹”£š˜X 4U™»µÂÅÏ®ÈÂ㱶¹àɵʸ— ¹Ë—‚–¡™¦““_EÑÜȵÂŽ»°¬¦µ¶¢ƒtdaV«ÉÖÜŲ¯º·¼ÊŸ«³Ã¦´ÄØÚ¾ºµ´³®¿¶‘gJW¨¶¼ØàâáàÖÌÅÁ q2&* !>YyF]¤§”ƒa  HfpO¤À¯®ÉÉÙÒ¾›“¦ºÀƱ¸Á¦Ÿ…u…£§Î¸—š|¡««ÃÖκº²£­³·£’”“V¦Æ¹º«¦Â²µ¿Åµ²¦°£ÃÅÆÒÉǵ¶ÁÀ¯³•X2Ll„·ÔÁ¾ÓÛ×ÒÍÎÎÕÒ˸vMMCD8>g‰–D=_U:)(,?9€n„¬ÂÖÞÒÖ×È»ÍÈ»¿±¶Ä¹©povrŽ‰og{~¨´¬¨±·²²µ´¯¶³°¥ž s›ÍÀÏÀ·Ì½´½Ã½²—¥²ÅÄÃÏÑ¿¾ÂÒÙÒ«X/+KMDsÖÙ§ÅÙØÆÎÚÚÙØÓÑÐÖÏĺ±®§¦»Ð×¥}VKNYYTVSTXXGC8o®¨„‘ºØàßØÞåßßÍ¿¶«—‹šªšˆv}‡x^nn‹° ¢¦ui^j‡ƒ¢²µ·¶¯¯•}~¹ÉÞÏξÍÆÄ˽ª¨±ÀÉÏÏÚص¼ÀÏÅ“QFGcqd82½éÑÕáÜØÛÕÚÝÔÕÓÓÝÖÌÐÖÍ»ÁÕÞÛÙÑÆÁ¿¼´ª«¥©¢z[ZI+cwÆé¦r²ÖÝÎÒØßåÏǶ™”ŸÊË¿ÁÉÍÂŒ™‰®¿¿Â·©¢uUL<Iq’±¸«¤ ‘t•ØÝÊÌÀÊǽÌļÁÂÅÌÝÝÖµ¾×Ê}F‚x„’x[,€ÍËÎãêÞßÙÝàÖÖØÜÜÔÔÔÖÏ¿¾ÄÆÃÉÉËÏÐÌȾ¶·º´ª¨š¡~pXSšÎ£‹žÆ¯²º°½¾¥§¥ºÄÎÚÌÎÖÙÕʼ§c¯Î·ÁÁÀ²ª·µ‘ƒKCZOn…ƒ„~c>mÁÄÒ̾¿¿ªµ­¸ÎÌÈÐËÈÈÆ®ˆ¬ÎÌÆǽʳ˜[4£ââÞåÜßâÛÝåàÛØÓÏÖØØÒÍÎËÄÁÃÅÆÇÇÄÁ¿´²¸¸´µ©¹±„ƒkU’¥tQ «Ä½Â¼½ ›¿ÕØÚÏÌÍÕÖÛÜ͹—ÄÞÕÚÛÛϾ¿¨sž’x€ ¦£žœuY®ÒÕÓÑÁ´ÏÁ²½ÁºÄƵ»[s·ÚÞÙÛÙØÜÌ°”{-GÎáÖÂáÝÛÖÝäÞÛÖÚÖÐÍÒÌÊÖØÑÌÅ¿¶³¹¼¹··³¾Â¬©¤¦¹®³­s<FA5b•¤·­¬—­ÖÜÝáÔÑÔ××ÛÕÛɱÕÞ×çéáÜÜÝ·Œ®½¬¢®¤ª³¹¶¶¾§—µáÜƼÏÀ©¨¢¤“ x„mŸØÖÒÀËÑÛÚÒÁ£K:m¶ÞÐÒàÜ×ÛáãÞØÓÌÌÉÏÌÍÙÚÔÓĽ¾Â¾¶·¼¾¼¸±«¬¦±«Ÿ¹®“ynJDR„£ œÍàßÚÙ×ÔØ×ÕØÔÕ©‚¶ÕÛáãÖÈÍ˦–­²¨°´¬¯¬±±¬½¦ž¼ÈÖͼĸ¦ªµ®ŽVvnuy³º½Áª´¹ÄÊÓÐȳ_1ƒÕÕÃÏÙØÖãááÝÓÐÎÏÕÏÉÕÜÝÔ¿ÂÆÊÊÍÄÆÆÀ»¼»±¡«¨–™½ÑËÌ̧…NIk†µá×áÔÔÖÒÑÙØØØ° ‡¤½ÚÖÏËÁ»¼™ ³§¨²±±¦¡¤¶¶Ä©w‰»¿º¡{|ooˆ¢±Á ji‘ÏϺÀÊÀÆÒØÒ×ßÞÜÌ­}„ÁÒÒÖÕÜÛâãÞÝ×ÒÍÍÏÔØÚÖÔÊÊÐÓ;½´¹¼ÍàâÔ󱕓¢°¯È¾À¿Á§„iQ~ÀÑÑÛÆÍ×Õ×Ø×Ù·ÜÓŒlŠƒ’‚ldPI^”¯½½©®±ª¦®¶²¸«¯–À¶¡~^uŠ©Íº{_«ëâÞÜÓÏÑÕÚËÐÛÚÕÝÖ­t¢È¿ÁÂÎÒØØÒÕÓÉÏÏÎÌÍÒÓÖÒÆÑÖÐÁÄÂÿÌÙÖϼ«¯¢£©¥¨·¯®¯µ¿°¬¡o»¾ÏÌÒÛÖÑÑËÕË–É g@*5!9.!. c¾ÄÂÀÁÁ¸´¤©¡¬²¶²¨šo”­¼«¦®®¸ÇØžÚèÖÐÓƹÇÊÆÅÄÉÈÎÜÔÔÓ‡»½°À»¾ÍÊÐÑÑÌ×ÖÖÓÔÐÇËÒÕÚÞÛÏͼ­·³¢ ¯¾›‰——®¯µ¯¨ªŸ§¡—¢’¶ÔÓÑÛÖÓÏ¥‘~{M=YPwˆ{ez¦»¨Œ”¿ÉÌËÁ·¡¨¸±³©‚By£¨–³ÆÆ¿²½ÊÚÅãÚÕÐÍÍÀ¾ÇÄÊÊÌÌÂÆÑÊÒØ·xf·¿ÐÐÑÓÚÚ×××ÜÙÚÎÏÔΞÄÅÌÕÓÒÆ¿·«¤£¢¢…  ¬³«¨¥±®¹µ±À¯¶ÃÅ­‡~«¡˜Œ|“¸Çƺ«¶¸ÇÐÒÜ¿‡¨¥¯§ºÃ½º±§~_\KP[®°®²¶³ººÇÉŸÊÞÎÒÊËÒÔÈÃÆÂÉÏÌÈÁÀĹ¾ÏÊŒUi ÆÐÊ°Ç×ÖØÚÖÓÚÏÒк¬¯Ä§Ž›¾àÞ×йpi¯¸±´Ã½µ˜œÆÙàÒÔÎÒÔ· •ƒ`4ˆ¾ÓÜÔ×ÖØÖÜ˽ÀǼËÁÍ©l¥¨•š¨µ®±uL6-CTdxˆ¢·½¹¹±¯ÂÆ¥|§ëØÔÎÐÍÐÏŽ¾ÄËÎÏɼ½À¿ÃÔØ°oEk¹Áþ¾ÃÊÓØÍÍÓÁËÌ´£¨‘ ¾ÔæãäÛÏz#Z~‹—¹ÃÌÄ«Y‡ÊâØÛÐÕϼ¤ƒs_yÜâãÜæáÚÕÓ¾º¸ÃǼÆιC9¢¡¡’«®¥>¬¨¢¤«¡ŽQQj˽¹¼¾³£rçÌÍÑÒÖÔÐÍ÷¸½ÀÅÉÌÄÇÊÈÈо¯§iVk‹•¤­’}vZLp††{IHLlàìòîéæâÛÔÄž}T9/0E{†raGILXbo“Ë»£¶ÔÙÑÍ×ãßÛÚ×ϲ¸ÇÐÔ¶¢X%¯«“ƒv “93ÄàÜáÛæàÙáæÙH‘—ƒšš¿ÞéÞÑÎÍÐ×ÒÏÉÆÁÀÆÇÈÄÈËÐÓÈÁ»¤‹‡H=Qs‡›pPPMS)EPa’·æëîìèáÜÜÜÜÔȱžmRQ`Š³¸ÁÅÇÅ«m_œŸÀÑÏÐÕÖÔ×áàÖǹ¸»Å»ybHjÉÙУu{uFV¤ÛÑÔÕÚ×ÝßÙá溷±ŒŒ·ÔÚÚ׿ÂÈÈÁºµ¥¯µ¶ÅÑÛÔÏÐÐÒË̬€E1.[‹©·ÁÁ¾Çĺ³ª•=2b†´ÈäêìéãáââåìðòìÕ—……ªÎÕâÞÙÕÍ×ÚÍѵƒ¬ÀÃÒÙÖ×ÝáÛÓű·²«|-E˜Òæäå¸zZDS¯ëÔÈÍÓ×ÛÜÏÆØÝçéÚǷƾÂ䙓’ŽŽ~RUPDU{™‡‚§ÃʳH3x´·¸¼¾¸±º»¹ÊÍ­\XzÂÔàäàÜÜßãèíñð縪¤‡g®ÖãáäãÙ×ÎÏÕÓÇ©ÁÎÌÒÖÔÚÛßÜ˽´q\d„ŸÊÝäÚ×ÖÄ®¥—sšæÍÔØÒÑØÖÖÛÛááÛÖš­±ª¦©‹‰’¡¬Ÿ§¢£‡G;i¢ „kSg= Uls»½»¼¾»¸¼½ÄÅÄÊÀËÊ»”psƒ®ÎÛÚØÛàåæçääáÔ®‡JPÆßèãÜÕÆÏ×ãÙÁÕàÔÌÚßÝÞÝÙÉÆÑ–B{¾ÑÞàãÐÆÙäàÛÂqBÉáâÔÍÎÎ××ÎÙáâØÉUq–¡•ÈÌÀ©—§³ÄÐÎÆ¿½ÅÄĶžb*D¿Ç¯­¸¸½ÁÁÁÁ¿¼µµ½ÅÈÊÉÎÃÆÂÔ×ÚÓÄÃÍÙÝãååßÝÝÞݾž–}Z[‡¨ÅÎÙÚØ͸¹ãèáÞà×ÎÔÑÄàÍ(6xƒÈâäåÜÝÚááäÖÐØÞÙVmºõãÒÏÎÎËÈÔäÞÚ®¶·ÃËÅÍǹµ¼µ·ÂÈÉ®•¢¯¼²xAYˆÔ͹»¼¿ÇýÇǼ½ÁÁ¾Ãź½ËﵶÁÍȶÂÙÙÞãàÛ×ÚÙÖ«ž”ž{gem¦¹ÉÑÙÅ¥œÐäçèÚÍÙÜⵃgjw–ÈâãßÓààâßÞÒÎÏËÔ¯ZkÅçáÔÑÁÅÂÔççׯ¸ÂÆÎÊÁ»¹½º¿Á¾»¹´ xn’¥‘FKÆÚÍÒкÅÃÐÑÎÔÌÇÅ¿¾¹½¼¾¾·®®¶¿ÅÎÓÁµÐàßááÕÓ×Þѵmf½ØÛе¡Žlt‘­˜zz®åáÕÉÏåܶ‡¶Ô»’~MlÝêæßÞÙßÚØÐÐÉ¿ÅÏÕ£g´ëÞÔÈÃÄÏßäÑÜàÜÖÔÉ»¼½¾µ½¼ÀÇÆ­vk–’Lb²ØÌËË¿¼ÈÄÇÄÅÊÅËÆ¿ÄÃÃÀÄÅÃÃÁ»ÁÂÓǧ¼ÕÞßÞÖÑÕÜÁ¿Œˆ½äöìãèêÓ°³ºÏʨ†ŸÞØÌÖÔÀƒ³Í×ÍdzzM\©àÝÕÖÜÖÔÑÕÓËÏÎÏѺ¿£æäÙÍÎÛÝÑÐÜÖÖÏÉ¿´³µ¼¹¶½ÆÎÒɹo(]W“ÀÝÞËÐͽ¿¾¹´¹¼¹¼¯¶´œ«³¿ÉÌÐÍ¿ÃÂÖ•ˆËÏÈÈËÅÊÈÁÀ¯_ªØêçèêííêïôóõõÞ¬¬Ôàë­GV”ÌÆÎ×ÐÖÓνˆXoÃäÜßØÎÄÆÐÕÚÙÉÍÖÑÇGcÒçßßëÁÂÕÊÈÆÁ¸µ¯©²¶³¼º³¶Æ¾”Z<Ë×ØÙÏÊÊÁÁµº¶µ¼¼¼¼ºÁ°§·ÄÑÒÖÙÕÔØƧÒÅÀ½½¶½¹¿¿©}ÅÞáÕêïòîïïóéÚÛÊ¡·ßÛÃ^¶ãØÑÆÍÕÙÓÕËЗOw¿ÔÛÒÐÏÉÒØÙÑÖÕÌÒÝOtÖäÚØ­–¿Ä¬µ·²±¯«´¹¶°¯¹Á´£¨•ŒÍÑËËÎÉÁÿ¾Â¾²²°£¥´½¼³­¾ÂÇÌÊÎÕÚáÖ˜²Ë×ÔÓÈ­ƒhP< ;¶ØÀÖèØËÜæáåܶŠ¥«¢{3~ÍàáÙ×ÍÊÆÂÅÑÓÉÒΞ†ªÏÅÌ×Ñ×ÚßÙàØØÙºV{‘‚˜¡™£·°¥Ÿ¤­«©µºª¬ª¦¨«¥ „ÓÏÓÍÁÁÉʾÀ̾²¿Ã´¼ÊÃÃÄ¿ÉÊÈÉÈÈÌÒÚ±} ~soU=@DIE@PÈëåêíãÛè܇”‰‚¾Äµšss‘»ÈÑÕÛÓÊÉÎÃÈÈÉËÍÇ󋊬ÕÜãäÞÞáÉ¢}rš£©•„£¨¶µª¶¬£¥§µ·³­¦¥ •™¤¥¦‹Qišª½¿´·ÊÉÇÌÒÆÅÑÔËÊ˾Ì˺ÁÊÀÈÆÃÌÅÄ}\R05hµ¯§k„ØöõôñäË•UZWjRL™ºº¯š§ÈÎÁÉÅÑ×ÓÏÇÂÌÇÀËÿ˾‘UYµÕàÞØàÀƒOWn²½ÐÄ¿ÏÏÌǹ¯£¨±°¯¢ ª±¤¢®µ¤Ÿª“‡‚usenˆ“”}›ºÐÎÐÎÔÖÒ×ÆÍÌÐÖÍÔØÒÎÍÍo20K‡»ÁÊÕÜééäÖWGR¼Áo\‚˜œ¦¡¨‰UACO€ª½ÍÏ¿µÀÅËÏÓÌź´ÊÉΤu†¨²‚zn¨ÐÒ‚iTK|‹¤—ž›´ØÚÖ¾©´µ°«±º£™˜– ¨¬«¢€r¨£›§©NbW<3a‰‰°À³¾ÏÎÕÖÎÎÙß×ÌÑÖÑZd•µËàäæçàæöîÓqKmŸ?9pª©ªšª¯µµµ˜gkŽ±º²¹²¸ÅÂÅÀµ¯¬²Åí—œž»¿È£ž…l'q~p‹‡š³²’‚ªÉááÕǹ´°¾º¾Á¾´¼±ŸƒhXaµÈÆÆÃËÕžž…ƒg|rahsZ;TonŽº½Ã×ÓÚÚØÔ E&AXZx¥¡¸Î”F>PIDDn’ ¥©°§¦©·µ´½ÎËÄÅË¢€Ÿ«¯µ¾ÄÁ¿ÂÀÃ¥€„›ÉÖ¿³·“¯¡~]kd“µ¼¿¬¾ÅÌÀ–‰©ÇÄ¿ÀÀ»»enln}mVOHAŒ¢³ººÄÅÆʱ“«£¯ÅÏÑËÒÇ€]RZaž¨®º¾³³»±„k[I622.6?b•‹xgYc}vž¥ª¡¦ ´©£ª®·¹ÁÊÊÂÈ«ŒŠ›«³¶»ÁËʲœˆ¥ÁÕØ̾¶µ›ª¥•Šz¶ÄÐÔÉ¥’ˆ~uˆŽxwk17,(8OS\n{ÍÀº¾¸½ÉÇͼpйºÊØÛÑÐÛÞÒ±’nwű§½¶¡™¢ÀÊÒÌÀ·¨™˜«»ÆÕ×¥ƒamÁ³¨£œ•°¬©«©©¦²¶Å¼­~y•¸Ã¶¶½Ä¹’u¢¸ÐÓÅÉÃÉÃÌŒš»Ä¢œ~ŸÊ•{MDX{“‰fJB'20©¨ª§ ¤¨±¨oËÊÏÖÙÒÓÔÕË¡Î×ßßÞÛÔÊÎÙÙÛ»M^¥¼ÓÊÏÐÉÐϼÂËÓÏËÏÏÌÒÜÓËÊ×Ê­oyž±–£”’•ž¥¢©¹¶µ·Á¿Å”cJu³ÉÄ·¨rs·ÑØѱ±ÌÏÐ˱‘¸¾»¸¥o{s}pm~Œ‡ˆœ•¤ Œ¬¶±±µµ²²¸²²¶Ÿ½ÙÒÈÒáâØÛÚŽÞÔÍÎÍÓÖÖ×ãàäéAB—ÄÒÎÇÖ×ØßÙÛÜÌÑÓÏÑÞÜÚàÝÖÏš\%g˜ª˜¢¢—ž¬³¯¸ÉÎÎÖÕÉ“uqq}¯ÆÁ ‘–‡…ÑÞÖÕÓÀÄÑÒÍÇ£²¾Âž·§¦®ÂÎÜÚ×åâÙ°¡³ª¨®±´´±¢³±¶—¨À»¶ÂÑÈÈСhÊÉÙËÏÒØÙÑÜàçéÒxIy•¤¤­ª²©ª³º³»´³¼ËÉÆÒÚÛÑÊ–D5ušŸ¡«¡Ÿ¡®¯°¼ÆÉÖÞÚ«‘—eƒ¯¨ –”¡ž×ÝÑÊ̽ËÒÕÀ­ººÄÌÍÏÉÈÒÖÕÔÖÚßßÜ¡y³¬¬¥ ¦¬­«´¦±²˜­¾ÀÁú½Ç}‚Ô·ÇØÐÒÐÒÖÝ×ÞâêÎm<.'&0BBX‡}z~~„‘©º¶œž£°ª¾¤uaC†¤–˜§²¸¹²µÄÊ×åâ±—§œ]”¡¦Ÿ¦ÀÄãÞÐÆÈŹÅÏÙ·¾ÇÐØÎÏÓɶÎÎÓÏÔâæÎHv¥´·´£¤®·¹¸Â¼¶¶KJOJQKSSU`\ÍÒÖä×ØÙÙÔÝÜÙÙäâš^>BQt‹—«ËÓ̹ª¸±±±ºÌÀ½»Á»¶¬žš˜®³“‘rbXTd‚£ÄÊÌÓÚ³š¡›œsS]†¢ÅÒÖáÓÆÇÈÌÃÉÍÕ¥ÂÄÅÓÌÉǼ­ÊÆÎÊÐÄfs™¯¹µ«¨«¤ªºÂÒËËÌÑ])(,hE@‘Ìêå×Ñ×ÛåßØÔáåµmGož¾ÆÍÙÑÚѵ©Éò¹ÁƾÅÄÄÎÈÌÆ¿ÑÏÈÁÁ³§“kI?Uy¤¼ÇÊž“¬­™…;<pœÔÙÚÙÍÄËÈÍÈËËÌÈÄ¿Ä°£¨¯´³°¶ÄÜ«3dŸ§ºÅ±¦«µ«ªºÅ¼·¸¶¯œÓâÌ÷®§´ÃĽ’V0Ykt‘·ÀÝâèêǭħ€Œ»ÄÅÀ»Æ®œºÊ·³ÅÆ¿·±¨©¬Ê;¼§±¶·¾ÈÐÏͺÅÑɦËÅ ‘iPu‘ÄÔÓÌÚÏÎÈÊÃÄÊ¿›Æ¿¥––®ÔâéãíëÙÒ¿ ª®›H.t’§q‰ ¶¿¿­–£Ÿ²‚˜×ÀÃÍÅͺÑÙÞßÇ“˜§¶š‚i€–˜{Zƒ²­œˆp‡‘— ¦¼ªŽ´¨±³¶¹¶º £®ÅÄ·Á·µ»ÄÍÉÄÁ¾ªªªŸ“ ¾¿ª¨ˆq‰ªËØλÚÎËÅÄÃÁÉ¢„ª”vz ®²º¿½µ¶·´¸¶·¹¿’>.2K*Q—½®µ¢˜—v³Ò½ÑÊκ½ÇÔáÛØÔÍÙÕÑŠ # [Œwotcusq|ˆ¨¡ŠŽŒˆ™¡­¼Ã²´²¾Á»½Âª±ÅÏ¿±¦¡Šˆn{†ª¶¤¢ ªl¹ÔÑÀ°ÐÇÉÀºÄ¼Åvh”€qy“”Š–›—t¢¼À¹»¸­y‘nL0¤£žsFž£Ž‹ŽSSW>Š¹ÚÇÈÁ»ÇÈ×ØØÜáÜàÒÈži0Lapxi\QC447>>JNTtu~‹›œ–Œ—š¾ÌÆÁÊ®«Âµ¡Ÿ¡­ªœ˜ˆ‰‹wıv¹ØÕ¶ªÇÄÈÄÀ¾¸¿o\’¤¬·ÁÆÈÈÊÖ¦HXe›·–p–¥Â¾¼°Ûçâ²JH‡„‚šJ+m¶ÅÏѼ¹³Ñß×ØäßàÏÕÞÆ„]z§»¨–®º¹»ŠU $6/57AOENSgu€¶ÉÁð²Æ¼§™ž²®”‹‹’”ˆ…\¤Æœo¦ÔÏ´¬ÃÅÀ¿Ä¸·Âu]Ÿ«¼ÁÆȼ¼Ñ¿]3UŽoSœØßÚÞáÚÓÐÎâê:Hmœy¹ÔÜà»W7r•´¶¾¼ËÄãÙÕÒÐÔÊÑÝϯÛñöëãêéçïíìéܸl[jj]=L=8H7IB24:,0;Q:;f…–œ¡––}p{©Œh³ÊŸ§¥œÖÔÔžÈÑÿÎÄÅÌ{x¸¼»ÄÅÆÆÀÅÉ·¯‚KµáåíâØÝÜÕÜÙÒÌÞæk^‰£×ääÞßÁ@=“¿¼®ÁØÛàâÓÎàÜÌÓ¯ƒÙïìçêïéäëèåçêéàâéèÝ­»Â×ÚââÛÛ¿‹fQM<-(Iu™—n{Œž½ŠiÀ‘žÈµ«£ÊÓ­ÌÐÏÔÔÅÐÌqzÂÆÆÅÂÀ¿¾ÁÃÂŹÑçåæåÖÑÑ×ÒÜ×ßßÎ’lžÎÍÙÚÛÛàÞÛ¼[Up¤ÄÂÉÖØßÙÕÝÐÌඊØîòêãååäëàßâáàáêîëñ¸t‡°ØÛÕØÛßÞÏÉÉÇ­^3 D_n~¤´ºÌvo†“Àà̺¡µËÁÙÓÊÎÑÇÍÈ…¼¼ÅÃÊÏÎÎÄÆÀ¡œÎçèâàÎÖÕÑÐ×âñÜp^´ÇáæèÜÕÛãàèÞÊ¥Q6<£ÝÇËÙÞßã×ÌÐÛÑ’ÔåóîáÛÜãèèæèßÙßäæâßç‡Y«ÞàÙØÓ×ÛÝÙÒ®…¯Í‹G69W„ªÃÊÇÁ`Qy»ÊéÈDz¤¸ÅåÙÍÈÒÊÏɉ•¼½ÂÂÓÓÕÛË´–egÈÙæàÔÔÏÔËÊÒì†:‰ÊÏÐÖ×ÙáâæßÝãëâ߇tTGŽÉ×ØÖÏÄèêåèÃexÉéëêéááêäßÚÙÝÞåâÝæãÙžt°ÀµÏÜßâÖÚ¿±ÎÝèËŸ|^k–ij³ÀŸ`o£ËÌÚÔØÍ·¤žÀåÓºÉÇÆŇ¥šœ—£ŒyuUNKNZ¿àêÜÍÔÀÏÕÔã½q¶ÕмÍÖÒ×ãåäàÛáíäÖ•yxŠuPÍÝÜÈÉÌÜáé™r@ŸäîòçäåâäßÙßçØÜãâÖâÇÛ¦«Ä¿ÆÅÍÒÌÜÑÎâäëÔ¦le±Ãº¹¯„=‹³»ÙÆØû½±º¡É˽ÇÒÌ¿k`wslYXXs•¯¬ªÂ¢ÅáßÔÏÔÐÍÖáßtÕÒÂÁ¨ÉÖÒÖÜÜàÙàäè¡I<zºËÒÜPp½ØÚËÅÕôq—ëëëåÞÞèÙÐØàçÞßßâäÝîìíç͸·ºÈ¾ÃÖÚÛÛÚïãÄx“±²¶¿¥~xª¿·åÝÔµ¼Ê»±¢šÐÏÇÂÀµw’¿ÕÝààÚÙÖØÚÞÚÛÀçÙ×ÊÔÍÔàÆfÏÏÍÐÓÍÍÒÐÏÛßÛÕãÊ€hh–¯×ÕÓÒª€ry¥ÎÑÚæ ˆˆÆïïñåÛÛâÔÍÞâàÙÞçãàîââãèæÜÉÀÅÂÍÞßÜÕÐÛØÁ‡€£¼¶ª®ˆlœ¸¾ºä仧ÃäÃÄ«¾ÚÕÅ»ªÉÛÝßÝÐÐÓÒØÖØß×ÈâÚÓÛÛÔ­”¬ÜÑËÚáÔÉËÊÊØßßá¾z*x¿ÙÒÜÕÒÐÌÆ>;ÝëåÙ¤Œ¬æðíìêÞÕÙÈÓàçå×áïàÝíÆÚéçêñäÓÓÙÛÖãäÒÛâÚ˱‘–¹§ª¥}•¤º¶ÂãÝ®•¶´±ÚÔɬØÔÉĸŽ«ÈÙÙÖÛÒÏÖÕÜ×ÙÞ×±ìãÚåÜplºÙÒÎÝÞØÔ×ÒÇÑÙÚÊŠD\ºÄÐÖÛÛÓÈÃÉÌ×Àž3pæõŸÂ¾éîæØãèäÛÑáÕàèÚåìåãñèãéåëíçãäàÌÉ×áÞÜââßÓ§œº·£‘†ª¦¼®ÉæÒĹп¼¿Èʾ¿âÖƺ”­ÀÌÓÌØØÔßäßÑÇ»ujÖèôÝ‹˜ËÝÓÓÕÝäÙÙ×ÓÏÔÈ•EtËÚÎÓÑËÃÇÄËÔÙáàÝ`,hžžÒÑæðôæÙåçæÞåÞãçàçééáéìéìèëðêãâáÑÇÀÆÇØÜÙÓÕ¡‹¸µ­tŒ¨²Æ·ÆÛÔËÃÓÃùľͳ©ÙŲ‹¥¼ÇÏÍÔÑÕÝÚÕÅÄq2_ƒ¢„~”tšÊ¶âãáçß侤¯“ËÏÇÐÊÄÆɽÂÆËÜØÓÊÄɱkNMsëçëìëçäÞßÜáÞáÞâæèìãèëèàâæåèìæàÏÆÂÌÁÏÜÏÉλ—Ÿ¸žl›§¾¾¶¿ÙÆ¿ÀµÇµÃÅÀÎÓ²¥¶‘s¢¾ÉØÒÛÙÖÛÉš’rzªz™£¡•š„OH2ÖâáÒœO+¹ÎÏÄÇÅÅÂÄʼÃÑÚØÈÁžÒÑÊŽz„ÏëéëíêÞÚÚæßÙÝÔçàÝäßìòéÚàèåêïãØÅÍ×Ò°ÀÖÌÏßؘtœ™‹¬¡À¹½¼ÄȾÃÆÉÄÂÃË×Ó½ŒŸiÌÐÜÛØÜÝÇŒ=n¶ÊÏËȺ­ÌÔ£•ˆG*!Zf¢ŠKo…ÑÏÍÍÅËÃÀ³¥¸»¿ÈÑÃŶ·Ç¾·Â¶VJs¥¨¶ÞåìåäÞÜàÒâÕØäÝæíéäåæåæèäÞ×ÕÑÖ½½ÒØÒÚÚʘ•›“¬µ¹¹É¾Æõ®ÁÏÄÀ³ÂßÊÄ¡˜—‚ƒÍÒÙÝØË„dz«ÄÒËÐÏÅÇÉ»¿¼³ˆ…ˆ+ !Q“·ËÛÕÓÏþ¾­‰œ­·ÆÒÉÁµ·Á‰¢Ø¼¾†%%8‘Ÿ¢½áñßßáÞÓÞÖØàØãííêââçååçâÛÑÍÞÓËÒÜÒÐÓàÉsq©¹Ã¶ÀÐôœ¼±³’¾¶ÀÝÈ‘ÉÑåÕà¢@v¬ÈÑÂÆÑÆÈÅËÊÄÄȲ|Žˆ_24K™ÓÐÉ¿¯œ¯º·µ¹«ÄÊÅ÷§§ºº¼Ý¨b¼ÖßãßÈhFŠ˜¥ÜÜáäááÓÓÝÞÙçéÞØÒÔÚßáÝààâØÐÂÍÎÙäàØÔã…:–Ÿ©¶³»¸´«Ìµ—¡²ÃÆÎÔü¤Œ—€cÌ;£C|ÍÈÇÊ×ØÑÏ뵶À¹ÉÎÓÕĈu‡¤ÈÇ̽´·±¯¸µ¶·½¶ÀÁ¿Å¾ÀÃÁ·¢¤qŒÚééêìëâ¼|“¦¡®ÃÕÕàÒÕÖØÛåàØØÜØÒÚäáàâãÚÙËÒÝÙÜ×ÛÜÛ¡\ƒ˜°°µµ·Å­Â°°®©ÃÅÌ̼´£‰Ÿˆž—”pÍÆÅ»ÏÈÊÏÌÁ©­²¿ÀÍËÈÚ½‰›´ÀÄ¿¹ÈǾ¸º»¹¹¾ÄÆ¿º½¼»»ÎÁ©€?Ok¥àõïôóòïôììÜ<Y¢ÍØÍÏÑÒÛÛáçæëæÙÙßäåâßßßÒÖÚÚÕØÞàÞ̓]¤¢¦«³»¹¶´Ìº¥¯ÆÎÑ´¶¦‰”©«€WS¶ÊÊÀÏÎÊÃÉÈı¦±¹¸ÀÆËÊÚŽ­µÃÉËżÄÂÃÁ¼ºÂÊÈÊʽ½¹ÆÊËÅfOI…¥²ÂÈÍãêóòöòòñæ´™}fRÑÑØØÑÕèåãêíáàÝÜÜÜÔÞÝÐÐÕÑÔÛØÞàݪR€£›¢žœœ¡„€•¦¶ÃÐÕµ¶“ƒ›§ž‰‘¥ÓÕÍÄËÏÊÄÅÇÈ¿²²±°±–ogT¸ÕËËÐÅÇÄÉÂÁ¾¼ÐÔüÁÀ½»ÈÌÇÅw+]p€¨§Á›§ÛäïðòóôõòæåØ9nµÔÛÓÞëáåéìâãÜÚÞÝØßÜÖÏÒÖÚØËÚãæÈhi ¯£™ŒoxUi|˜±ÂÁÉͶ¶‘‰Šˆ—ªÉÕàØÊÆËÕʾ¸ºÀ½­®¯º-$!mÇÄÆÏÇÑÐÆÅÀÊÎÍÑÁ¾Ç¾»Ë¸¸½Ó×6%Zhn±É¦ªË²’³Ùðõòóíöíèâç«2y½§ËßçÞÚÚÝØÞáØÚÔÕß×ÍÔÐÄ¿ÖÔÑÓ®M25;e‹¤°¿ÈÊÄÄþ·’wz—ÉÏ¿¨³ÁÈǶ³Ò¿¥¤±º¡¢†1;m„ÐÉÐÔÝÚÑÒÌÊ¿ÄÆÇǽ¸¼¼µÀºÂ½°Œ QoiZJ]VP]r|fXu”¡¥¨¤§¬°¸·§Y1"DG…±ßëàÛÝààÞÙÚÒ×ÝÙÒÒξÆÚÝÓÌÃyR@>V[›¼Ã¹¶¹ÂÅü¹²¡†…£ºÍʶ±ÄÀÊÌÄÀ½»ª«¯·_BUcsc±ƒŸÍÚÞÌÔÒÑÀ¸¸º»½»·¶²¶Ä£xQ9hry{vP_i_]apvzvywiZRcsx|‘‰ƒ¤wb"/>nŸÍîèãçèãÉÆÑÑÙÖÙݾ¿ÑÖÔÔѵ…’«²ªŠÕÍÄ·¿¸¾²·±¬§´»·ÁËÏÁ̺Åľ¶ª¸®«¯Ãž–ª¥¥¡™…wA;e¥ÔÙÒɽ¶À»·²¶¼º¾ÇºZ)ElŠ‘«¸°ÃÐÊÅÇÐÞÞÝÜæ×ÓÍ®½ÊÏÉÌÐÒÏÅÒ†5(W¿íæáßÐÀÈǽÆÒÕÛÑÃÉ×ÞÛÜÔ¸³ÎÚ×´€°ÊǽƳ¬±¼·®©©£·ËÉÈÂÆÆÄÁÁ¿°­«³¼ÖÎÑÐÐÉ¿ÅÊ{½n&5`ŸÎβƒ˜«®³¶¯²£yRtx…£Å—ÅÕâââØßãååáÑÙÝÝßÖ¶´ËÏØÊÈÃÈÉÖˤq7)2g Žez“±—¹ÅËÊãáÊÁÛÖåàÆN@b©ÖÌž…«w»®œ”§ž˜¸ÓÖƼ»»ËÏ̪¯ µ·ÅÔÜÛÛÕ×ÓËÆÐÖÒ—EEzs(¢˜Œ“°˜€z¢µÁÌÙËŸ²ÄÌÚåæàÞÝÙØÔÖÛÙÚÌÒ¼¸¾Á¾À¿À¢ÁÕ±œ…cH*00:^j‰›xkš}[Ju–¦©Ä¬ƒ/',7uŠ¬v3k…YRp‡‹–¸Ëʶ¦ ¢§Äɼ¾²`j¤¶ÇÑÓÓàÙÖÕØßÙÞÓÝ×–+$!)3@^‚†‰¤Å»¶³¨¯„KI¸×ÝáÔàÝâÜÛÞäÕÀ¸µ¾¼ÇÀľ½´²£|¦ž¯¸¾ÉÐÓßà×Óĸ±£]EG@PQp„z}Še1"+<8ZYXQZ­¥¯±¶¾Â´´ÐËœƒaCX„®»ÒÌ×ÕÑÛÛàêèâàÝÚσzM:<HM]fYuŸ­«©®¹¿¿¹¾«¬ŽtOFq½ÛÞàâáÛÞÞßÙÜÏɾǷ¶»ÄÒÇ·š‡hl†­ÑÏÌÍ××âÞäáæßÜÇ´¹¥op~}}”¦ª”wiUB^Vvz ´À¾¹µÆÍ¿·¹¦‰vWhr|z¨¿ºÂÉÏÑÍÌÐÖÝàÞãáÜÉáȘ~hutl‡³Çɸ­µ±ÀÉÎÊÌÇέœ}px‹¥ÝâááÞÚØÌÁÊÍäàἸ¯ÂÝÞö·[/+5x€|°Àµ¸ÆºÆÎÏÕÆÊÉΖyjl…¸º¶º½«›tnx^½ÆÆÉÇûÉ̼¼¨`"Gs€„…¾Â¼´ÅÊÉÎËÏÆÊ×ÒÓÔ×ÕáÕËË©•†C!¨×ÐÓÎÍÍÉÄ¿ÁÌÅÑÔΘƒnZs¡³Æ±³¹ÈÈÓÕÏÍÄ«ÓÜÜÕÖÚ©ž“‰š’z].)bÉÇ´­º»¼º½§«°¹©yl]¬Ç¹¼ÏÓÈÀ©«¦YW•ÆÐÏÉÁ¼ÉšuhUbo~‡’˜ƒ]O‚Çĺ·ÑÉÄÁÈÇÆÌÌÕÝÞØÕ×ÕǬY!E§ÞÝ×ÔÍËÆÊÌÁÇÈÒ˹¨¯]e–Ÿ¬ÁÉÝËÍÕÔÍÓÌÎÓ×âáâÏ›™ŒÁ½¼«t31}±¹¶¹¾§©©±©£¡”psŒ´Å¯¶ÏÒÉÂÁĹ”zw“¨³¹•t‹ˆ]f|‡ƒ‡†˜’ˆ—N+`¡¼ÈÁ½º½¼Í®ÃÈÍÑÈÎÖÛÚп©žR-‡ÏßÚÎÒÏÈÌÆŽÈÌÓØáËš_A?ˆÊÈÝÛ×ÓÒËÎÈÆÈÃËàÝÙ¯¥…¾Ò´ÅÜÀœJ%b­Ã°¼ÀƳ¹ÂÁˆYs~ÐÚÏÍÍÕÞѿŸÀ²[=;$;\€“‹{—¢˜‡…’“ˆ@A£ÈÁµ·À½¾±ÆÂÆÑÅÍÓÔÐÉź¯ pFk¢ÛÜÕÓÍÑÇÊÅÊÊÑÓÜ×Å•F7[ž·ÕÐËÒÈÁÆÊÌÒÆÊÐÒÆÓ¿‘½ÕÅÆÒÌÀŠXS`£ºÈ½Á¼ÊÉ«y^€hS„ÅÛáÜÜÞ×ÑÑÉÆÁÇ™]O*9OF\„…|VBtŽœ–žª£›e—þ½Åƽ¹½ÄÆÇÈÌÌÎÊÈÕÑÊÌϧk9]²ÙÙÔ×ËÏÀÄÃÍÌÊÓ´‘~’ª¶ÅÒÏÏÆÉÌÉÂÁÆÎÌÄϯ”»ÆÑÊËÍÛÓÄdFjÅÃËÅɧk}“¨Œ`,WZ|½ÚÚÖÙÖËÌÉËÌÅ´ŠwŠ•o€˜“„~›Ÿl;?DIILtŠ¾ÃÃÀÈÍÈ·ÈÌÊÀ¾ËÊÎÏÑÊÆÈÉÕÕ®T<ÔßÖÐÔÑÉÐÎÈ¿ÃÁ­’„|…ˆ¿”¸Ðà×ÎÎËË»¿»Ê×Ò·£µÇËÅÊÃÕÜáÓ®G*yºÆËÏ m€˜ª¥“l;Zƒ•»ÚÙÊÈÎÒØÓÓÀ«“tW•­¬œ¢ž›ŒYG0.10nnƒˆ|xuz˜1Ja¥ÉÑÓÒÅÉÔ½¼ÊÙËÂËÀ|2jÈÐÃÉÎÒÔÛÙØØäåÜØ‹‰´¦´ÆÑÊÍÒØÁÃÒÎØÏ­À§ÉÓÚßâÕÙÐËÉÓÛ°M@cÆÀ’›¾ÇÈÀÀÀw:7IPe†­¼¾ËԺľ¹° 3‘·µ¨««´³˜¤¦¬°¨¼¶°¥skZ82RT<vš¹ÐÚÛÖÉÉËÂÎÔÔÃ|e8}·Ò×ÒÓÒÓØÓÔàåè×À¨‰uv½ÔÔÏÇÅÈËÒÇÈĪ·š¾ÅÏÍÒÎÐ×ÞØÔ×ØÀkM›¥—¾¼ÃÀÁ󦑀ha]Ra‰¢½¿ÅËÉ­‹F}¯¶«¯¯²©›¦¤§­¬°°³°©«¨•iŸ{* FŒÂÒÞÙÖçÙÙËÏ΋z8GÝß×ÙÜÕÝÕÑÛÝæèèéÍeRªÐÙÓȽÍÐ×ËÐÔÊÂŒ¾ÌȽÆÈÊÐØ×ÖÞÚÖÓDTx”©Å¼ÃÆ»²´žƒq—qL[go—ÀÆй¡Šyxož± ¡¥ªŸ’’‡Š’¡š˜š‘¨¨ª«©Kl_E$#'DL^SUZ‘¯ÔÕÏ®ŒqNRˆÐÛÚÔÔÍÈËļ¼È±¤fuq¢ÜÜÏÊÍÜÚÖÊÏÒÔ͉¶ÄÃÁÎÍÓÉÂÁÈÛÙÙÏÇšŠ{§ÉÊÅÄ»µ¨°µ§‘Ÿ±¬¡•bEmƒ¼¾¸¯¢˜r‹¬¤§ª­Ÿ¥£¡¦¡¨˜™ —™–˜qLcq}~rEPF45hT,:˜ÂØÒ¤Šk+ 4šŽ}l=EG//6$-""S€BÛëèß×ØÔÒÓÕÏÛÌ‹®»Â·ÇÚÛÓ˺ÈÊÕØÊË‹y ¿Éº½Ã²£²¸¸±°·¹¿ÏϨfPJ£ÂÏËÆ™v€§¡Ÿ ©¤±©ª´«·«œ•œ—“k/B•µ»¯œ½¹¹ºÌ±ÊÈÃÂ~+#0^†vwJ%
+ $@Q`HAF@qŽ‡nA§Ïâïæçá×ÕÑ«½À´½º¼ËÄÁº½ÍÎÉÎÑÁš…{š›¯¶¥£’±½³´¼ÂÍÔÊÊÔÚÏÁ±™¹Á£†aª£ £¢ ”™¯¾²§¥—¥DNm»Ä¶º¦´ÁÅ»ÄÀȹÈžE"FmvphS:GY\\f„ ÄÌÒÔÖÔ³¶Ì×Ó”oa†²èàáÞØÓ¹¬Ÿ¾Ç¼¿»¿È¾º¸ÀÇÁÆÍήšpª¶²µ¬˜‰˜¬·±´¸¹ÅÌËÎÚÙÐËËžŽ¥¢švLš¤¥¤ žœ£©¦£›•• ~X>oš¥ÏλÁµµµÊÙÒÎÆÈÙÒÊÁ•QE[axz||›ÇÜßÞÜÝÖÑÑÛÝÒÞãäääÙåÕ°M-¿ëîäÞÙ½›†¸ÉÄ»º½½¶¨´ÊÊÉÌʈŒ{nšœ•§·¬½Ä¿ÂÀ½ÄÈÔÓÒÊÕÔÊ¡‹tŽ€}¯¨™—š“„pr•˜¶ŸI=u”±ºÂʹÂÓÉÄÈÑú²¹ÖÎÕ¶ªz†zz|Ž˜ÁÔâÝÙØÕØÐÏØÚ×ØÕÖäàÝÞæåá¨SAh­ãíãÞŸt±Â¿¹´¼¿»°¶ÅÁÁÃÅoxyŠ–¦¦¡§±¹¿Ä¿¿ÁÃÈÄÍÇÌËÎѹ|T8j£­ž§’ƒte]WM]zlR`bp{¡±±Â¾Â̸­Õ²²ÓÉ£«±±ÖÙŽa^~m‰«ÈääßØÛáÞÝÍÑÑÂÏÎÍØØÞçàÝáêÙÈf>)5_VŠ„r¯¸º·¸·¿ÁÁ¸·ÃÊÖÓÎyXJ/A@N~²¼ÑÐÉÄ»¸º¾Â¹Íʽº±€>aŽ˜º¼¸³®–˜¨¢‘²¶²´¹À³«–’r“¿ÀÁËÅÊÀ©³¾¾Óß¿ÉÒ©Ñ·w_swyÄÕéàÝ×ÑÔÔÓÌÕÝÒÙ×Íß×ÔÜàÖáåÑÎÇr9 5b¬½Â¹¹¸À½Á¹±ÃÐÕлŽsXVLET8Ly±¼ÁÁ¼»¹¼Á¹ÅÃÀ¸…ÂÒÔÍö¾¬¢³ÌÍÁ¯ºº¶»ÇÎÍÇ ‡Š«ÉÕȼÏǽ½²ÎÔ¹ÎÇÉÑ°®¨msn˜ÚÛÛÓÖÌ¿ÊÒÕÑÐÝÙÔØÎÞáÙÚâÞåÞÏÏâçÚZ*E[®Å͹³Â»Áƺ»Ê¾‰Š~kaV‰ÔÅškAYsœ¥²·¿ËÇï~€†ÍØÉÍǼ¶¦¡¨ÁÒǹÀ»´°¼¼º¶­¶”)V˜Æ›µ¯È¾ÀÃÄÍѺÀ¿ËÐÍ´©‹ž—Š¦ÝÞØÐÙÎÎÑÌÒÓÖÛàÞØÖÒÜØÕÕÜÞÖÓÚáΗXB59Ua¦Éɵ·½ÁÃÄÄ¿»É´qxute{ÌÖÚÑ¥…œ§¼¼ÃÎÉlK<Du‹°ÌÍÊÇ»º²¾ÃÎÊÊǾ³¬³ºÀÀ¹¬»±umsm<v}r~›¡áÕÛÅ«¯ÍÜäÀ©–¯¨¼àéØÕÙÔÓËËÜÝÛÛåáàâÖÕÖÑÄÔÑÒÓÙÚ¥D 0LfnŽ®×À¾´³·¾½º»ÁÃÈ €ƒu}p‹¬ÅÎÛåáÐÂÅÊÒÐËÁ•*h‰¥ÅÈŶ¿Æ¼ÈÐÄÄ¿¿±£•’²ÅÄÁ½ÄÌζS¡3)-?0Hr©ÒØØÁлºž¦²­§ÏÞäÍÛÕÕÓÂÑÎÐÝÑßàÝÞÑÔÓÊÑÎÔÚáÎ{a‡¡­fPkÁÕǼ¨©µÁÅÄÆËÌÂŒ€gt‹’¸ÖÏÑÌÑÈÉÌÒÑÕ·nN'¢¹˜C'J¢Á¶»ÂÀ¿ÙÚÒÄÒ̤_ÂÃÍÁ¾¼½ÃÍÒËØ”kf;:1k„Ž©µÓÆÆ®¨­¸ª¨ÉÙÚÕ×ÒÏÍÕÕÕÕÚØÜÑÕÙíèÔÌÏÔÔÎȵ³½®ŸŸ¦¤uY'‰±Ã¼¹°ª±µ¸¾¾¿­‰‹lŽ£ºÇÔÈÎÊÔÔÌÆÏʺ–GLÜßæ¦@'#F|¬ÌÁ²ÂÛÉÇÁ´‰gÄÏÄÿĻ¸À¾ÂÏʽ·¤‘‡f*!‰…§ÊĘ°¤ÄŸxØæÞÙÊÀÙÐÕßÖ×××ØâîìæÑÒÕÔÐѪ”¯´–Œž  Xhci()z±Æµ¼¹µ¹Áø†|‹}™­´´ËÊÌÊÓÌÐÓ¿‘_ÓààãåÛÝç¶LN ²¸¸®¼£›ˆPB¯ÌÒ×ÒÅÌ»»»¶³¬º{Š£º¹®–q`T;Bm“°‘¬›’a­ØÚÝÐÌÖ×ÜÙÙÛÖàÝÖßâæåàÕɱ£|vzn~›lryƒvO/2_™¸·³¶Àðwx’¢ÁûÅÇÈÏÑÕÀ›—…¾ÓÙÙÝÚÜäÔßÙ°[}•w“—yOir„«ÒÖØÑÎÌÇƵ¨”xg\oOšÁÐÓƸ¿²¨eV*4fr’|kh¼ÜãÚØÑØÝÎÕÑÍÓÛÎÚÞàèÖ´˜{`GQs•„lWƒ—­«C94r ÂÀ½Ñ´rz™³ÈÒÑÎÑÓÍÓÓÍrY¬ÝÛÎÑÓ×ÐÔÖÚÜÉ×Ô¶‚|‹ÉÚ¶{UxÁÈÓàäÙП¢}];(5ÂÌÍÌÏÌÃÉÈɾ¹{C&5oqgf¸ÎÓØÛÜÖÓÝáÛß×äêå´¦­®{CWG/)Dl†¥§±ÏÓÊÆ¿ª€fR%.J¦ÊÔŸV~ÔÙÕÑÍÖÖÕÈQŠ½ÜáßÕÈÇÈÔÔÝÊÅÓÖÔ±7€ÚçâëͯÇØØÚ×ÓÉÇ®ŽxbIXr|‹µÑÊÇËËÍÐÕÕÓÊ÷°ÉÇvn}|#2ÍÊÇÔÞÝÛ×ÕåÕÕäïìʸqYGD?w£·ÃÎÐÒÍÈÆÐË×ÌÖ×ʧ›†S'(¢‹|„¦ÖÔÑÊØ×±v=RºáÚÕÙÚÔÏÏÓËÎÎÐØÙÔžŸäãØ×ÔßÞÓãÓÒÚÙ×Ŷ§¢œ› ­²²¹Ò¾ÄÅÌÐÔ×ÔÏÑÇŽªÁй’‚‡sQg»¿É×ÓÍØÎÃÖßȸ¯žXRCLFm®ÄÌÐÒÐÏɼÀÄÁËÉÖÑÐÈÀ¸…\;Ve›´Í·ÍÕèwRWÅäãÙÙÝÛÕÒÑÖÆÃÇÅË·¨–ÇâÈÓÑÒØãÙÎÙÛÞÜØÍȳ¤Ÿ•¨°¨²¿Å¼½»ËÓÉÐÎËй½½¼ÅÎÍ´–€„`.eÚÏÕÚÖÝФ­Â¹W7$ @Uc~¡ÇÍÎËÊƾ»À³·±¾ÅÇÏÉÄÁ¹¥•’„i/Vx‘·æ½ ³Œ{”ÙæéßßÝßÛÙØÐÒÂÅÑÒŠmÝóäÕÎÉÊËÛäÞ°½Ê»Êà•„u‘®¾½¹¯¶¹¼·ÄÀÓÏÂÄÎÁÐÎÄɸ¥¨« ‘‹}4)ÞÉÅØÞÒ¿ªÂ›gG1E^wšž·ÍËÉÅÄÈÇÁÀÇÄÀ©²¼ÈÄÇż€`‡¼xbmtm~µÅÊ”UYl¥ÚäèßÝÝáÜÝßÒÏÎÚ²f|®îÚÓÎÈÌËÌÝàצgo‹ «¢¦—…Ÿž­ÁÀ²´µÈ·ºÃ¾ÂÅÓÔÃÌĸ¹«§³Âº¢’‡9$ÏÝÕÒÖ²ªÓÖ],LMiŸ¹ËÁÊËÆÇÈËÏÍżºÇ¾®±º³ªÐªƒX‘«ªVaŒzz£¦ßÜY Tƒ³ÝééæÛÜ×ÝçáàжaqßíÞÉÇÌÔÌÍÕßàÕ•RLš²ÊÍÇ«˜˜ª´¿Ä¿µ§¼®¼ÆÊÞÞÔʨÁÂÁ·ÉÁ¨¼ÈÎÍƱ{YËÈ”Dß×¥_bq™ÇÊÏÏÏоÝÌÃÇÆɹ²»¯°·¸¶ÈŽ+oÉÆ…g^dbdm~›¤¢¬µªÈ¾C<rœºÜÝÝÕØÜÛÑÇzeÑæØÚÚÐÇÕÙÙ×ÚâãâÅ—ÀÉÊ¿Ë̤Ž‡ª¿Â;«À»¾ÇÓÓÔÎÅį¿¹½¾Ã¸¶ºÀÑÉÅÄ‘\‚µÁÏÌ©…‚ƒ€—²ËÄÉÏÉÈÆÍÉŸ½¸µ®»µ²®šu=U¤Ù•teV]ojc~œ®´¸¸ªºÀ¦lK]ˆÌÛçäáÄ ”uq‚ìÐÐÙÒÓÔÕÓÙÝãäðÜ¿²ÂÅÅ¿¾Ä±‹«¶¼È´±ÁÌÍÀÁ¾ÑǾż½¶ÁÀµ§ÂÅ·»ÉÌDz‘bìãÔ¢’¦{ŒÐÏÌÏÐÅÈÏÃÁ¾¶´®¸¹¼º©¹¨qBd˜Á½–lig]cwngƒŠŸ»Àµ¥¼µ©¦=.ŠÍäâÓ¡pw?9¡ëÎÇÕÑÒÛØÛÞáêâܯ~—±ÇÄÀ»Â±ˆoÊÊŵºÇÄÁµ½ÁÊÁ¾ÆÄÃÁǼ¸µ¿œ…¦Ÿ|fWilQd‘™d„¬m<Fg«ÉËÀÄÊÄ¿Á´¯ª¼Á¼¸£h{r|–…|iYdgjotqq€¡°·¼³®¸Âȼ¡~Rb¨Âž›‚’…C6“ÖÞ××ÛàÜááÝ«†ŸhN_’Øʶ»º ’p–ÐÈÐƸ¸¿ÀÀÀ¸ÑÎÍÌÉÇÇżÁ¸«“u^1,9IvP5&@m|²f.L˜ÃÂÂÂÄÈ¿¬¹¿¹²±•[Y•‚tvXVOcagpsmuy|“§±·Àº²Á±·ÆÏΉIaƒPe‰–p§h¥âîäßæÜ×ƉG… ~L8BÛÑ¿Ç´‡’\qÔÐÈÀ·¸ÁÇÎÑÓÄÇËËÎÏ쫧‘gh\7T›ÉÛÃÆÁÁÏÜàȳ˜enE@) 4m£³ÁÁ˹¸°¨^U•Æ®˜„jRXupks|vnttux‰¤­®¿¿»ÉÊË»Óügi¸™†²©¦k@$2U_”Œv¦¾¼È¸»ž–ÁÉʼ—x‡Y,Ji§´±ÁºÎÉÆÅÌÏÒÑÏË»{: %,Hh™¸¥ŸŸ£ÊÕÔØæÝÈÀÏÒÓ¢ˆl-*„±¡‡r=0Ty­¾ÇÂÂ[5i\x~Š“ujwvmwowˆŸ­Â¼¸³ÈÁÐÃËÃk­¸¢‘¿Ä»´¸’T/0l®¶¶»ª«‰ ÁËÈ—p{‰]"NjV[q°²·­Ÿ³¼®‰kT'"AKoxŠ©Â—–£¡ÂÃÇÈÏÏ;ÄÔÝØÔÏÔ«†nKPxœsRET^sª¾´º°ƒWNUyˆ›“‰v{uƒ|oiy‘–†ž ’‰“¢±½š…²´¸µ¿Ä½®¨¯§‰|ffx™®¡ŽÃÒÔÙÕØÍ™{‚†mX@8T=19`|†…‹‚X(">Uo€¡¡¥º¾›‰¬Ì¨©±¨°ªÂ½ØØÙÛÓûÙáÑʪyhyUJT^e{ Èª¿Ä’œ[5„›•~…~†ƒhxŠŒVZlpD=>IKJ…:žÍÊÑÏÊÅ´š¤µ°¾¶¬‰˜£T‘ÔÒÆÅÁ±™„ƒ…ŽvmWJ& (3T3$Kpv~}’¬²®–«·¬—œ—µ¡ž™­“¼ÁË´·ááÝʽÅÅͳϽƜq\WiœÄÚ´´—¯¡©}2<¨…ty…q|~Ž‹x’“9c”||bWBD;s»¼¼¹«°²œ—¥©±¿Æw5yÈÔØÏÓÀœ{¨ÁþÍÇ¢]WV:8:(0)$.A_‰±¿µ™yšÂ¦ž «¬±©¤“©šš¤¾›½¥¨¶¥ËÎÆÏÜÓ×ÖÉ«·Ë›uiuˆ—­¬Çʸ¹—–›™hKsœ‰puxƒ™¥”~b†™O}¼Ã½ÁÀ¿ ®“±¹·¯ª«­­ª¬¹¹¼ ŠRÝâÖÔ×Ѧ’É×ʯ¸Ãµ¥•zcY©¾Ã¬ ÉØÜØÙÞØ®aX¯¦Ÿ£ššž¬œ¬®µÂž®—ŒªŽ«µÀ¨ÂÂÉ¿ÑÜÒ´njr®Ô¥¥¦¶´´ˆ“¤³|Glq—¤£«Ÿ{wkhAr°»ÊÀ¶·¼²¶»º¢°µ¯§¡£«¢¸{€ÎêßÓ×ÉÚݧ¢¹Ä̪´¸ÄÑ×ŷ̳dz®¶ÎÑÐÒÖÓÌÄ—?lŒ£¯­¸ ¥§¦žµ¨²¼›Ÿ’Ÿ–œ£§§¼´ºÁÐØÑŸlŠ{€ µÀ¥²«¤¯°ŒŸ›¤¬²TCa‘©¡Ÿ›w[`yuWgŠ˜­©³¾·Â¶¬À½ª¬±··³¯²¾·›³ÅÒÔËÊÐÏÔˆ”¸¿¹¸ÄÆ¿±´µ¾ÙÆÑ°—±ÉÊÂÔÛ˽½Õm3ƒÈ¦ «·Ž›ÄÀ¨´¨—™—›©œŒ” ¨ª¦¬¼ÇÃã|‘u“¢°·¥´©®½«œ¤°¦Ôˈ8+dœ¢±{FU_t‚m[_u†š¤¼¼Â´©·¹³§­²¼¸·ÂÍ­¶®°·©¸Ãª‰„žÊƼɳ»¿®¥§¶Çø¤£ª¤¿·ªÃÌÇÐÏÛÏf%2‰¯™ ›¯±·¨«­¤²³ž¦Ä¯¡š¸«¢Àµ¬©’…¡ª©£¯›¨¤¡š›²©¦©´ÅÚɨ2"TŽs'Tnz|ywxiZw†xkƒ²±¥¤©«‰…|u{kWF?mŒ”œ²¥—‚FºÇÉÆÆ·««¬¿Ã´­½œ \ No newline at end of file
diff --git a/plug-ins/gimpressionist/Paper/struc.pgm b/plug-ins/gimpressionist/Paper/struc.pgm
new file mode 100644
index 0000000..3d6fe74
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/struc.pgm
Binary files differ
diff --git a/plug-ins/gimpressionist/Presets/ApplyCanvas b/plug-ins/gimpressionist/Presets/ApplyCanvas
new file mode 100644
index 0000000..839bc3e
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/ApplyCanvas
@@ -0,0 +1,43 @@
+Preset
+desc=Simulates the Apply Canvas plugin, by just adding a paper relief to the image.
+orientnum=1
+orientfirst=0.000000
+orientlast=0.000000
+orienttype=0
+sizenum=1
+sizefirst=0.000000
+sizelast=0.000000
+sizetype=0
+brushrelief=12.000000
+brushdensity=1.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=1
+generaldarkedge=0.000000
+generalpaintedges=0
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+generalshadowdepth=10
+generalshadowblur=4
+devthresh=0.100000
+paperrelief=25.0
+paperscale=100.0
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/defaultbrush.pgm
+selectedpaper=Paper/struc.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,50.000000,1.000000
+sizestrexp=1.000000
+sizevoronoi=0
+colortype=0
+colornoise=0.000000
diff --git a/plug-ins/gimpressionist/Presets/Ballpark b/plug-ins/gimpressionist/Presets/Ballpark
new file mode 100644
index 0000000..e6205a8
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Ballpark
@@ -0,0 +1,40 @@
+Preset
+desc=Huge spheres! Tileable. Might be suitable as a background somewhere.
+orientnum=1
+orientfirst=0.000000
+orientlast=60.000000
+orienttype=0
+sizenum=6
+sizefirst=28.670000
+sizelast=50.439999
+sizetype=2
+brushrelief=100.000000
+brushdensity=7.070000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.020000
+generalpaintedges=1
+generaltileable=1
+generaldropshadow=1
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/sphere.ppm
+selectedpaper=Paper/defaultpaper.pgm
+color=ffffff
+placetype=0
+placecenter=1
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Canvas b/plug-ins/gimpressionist/Presets/Canvas
new file mode 100644
index 0000000..f0a0e21
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Canvas
@@ -0,0 +1,28 @@
+Preset
+orientnum=1
+orientfirst=0.000000
+orientlast=360.000000
+orienttype=2
+brushrelief=12.000000
+brushscale=15.930000
+brushdensity=7.940000
+brushgamma=1.310000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/weave.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Crosshatch b/plug-ins/gimpressionist/Presets/Crosshatch
new file mode 100644
index 0000000..1d64a80
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Crosshatch
@@ -0,0 +1,28 @@
+Preset
+orientnum=4
+orientfirst=44.599998
+orientlast=360.000000
+orienttype=2
+brushrelief=0.000000
+brushscale=10.630000
+brushdensity=21.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.000000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/chalk01.pgm
+selectedpaper=Paper/canvas2.pgm
+color=010101
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Cubism b/plug-ins/gimpressionist/Presets/Cubism
new file mode 100644
index 0000000..3644e80
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Cubism
@@ -0,0 +1,40 @@
+Preset
+desc=Simulates a cubistic painting.
+orientnum=30
+orientfirst=0.000000
+orientlast=360.000000
+orienttype=2
+sizenum=1
+sizefirst=17.080000
+sizelast=17.080000
+sizetype=0
+brushrelief=0.000000
+brushdensity=18.600000
+brushgamma=0.500000
+brushaspect=0.000000
+generalbgtype=1
+generaldarkedge=0.000000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/grad01.pgm
+selectedpaper=Paper/canvas2.pgm
+color=646566
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Dotify b/plug-ins/gimpressionist/Presets/Dotify
new file mode 100644
index 0000000..38e9749
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Dotify
@@ -0,0 +1,40 @@
+Preset
+desc=Turns the image into a layer of small pebbles.
+orientnum=1
+orientfirst=47.790001
+orientlast=0.000000
+orienttype=0
+sizenum=1
+sizefirst=5.000000
+sizelast=5.000000
+sizetype=0
+brushrelief=0.000000
+brushdensity=20.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.300000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/shape02.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Embroidery b/plug-ins/gimpressionist/Presets/Embroidery
new file mode 100644
index 0000000..e854fb3
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Embroidery
@@ -0,0 +1,28 @@
+Preset
+orientnum=4
+orientfirst=44.599998
+orientlast=360.000000
+orienttype=2
+brushrelief=0.000000
+brushscale=10.750000
+brushdensity=11.040000
+brushgamma=0.500000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.000000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/fabric02.pgm
+selectedpaper=Paper/canvas2.pgm
+color=010101
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Feathers b/plug-ins/gimpressionist/Presets/Feathers
new file mode 100644
index 0000000..31f3369
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Feathers
@@ -0,0 +1,28 @@
+Preset
+orientnum=10
+orientfirst=38.230000
+orientlast=360.000000
+orienttype=6
+brushrelief=12.000000
+brushscale=20.000000
+brushdensity=50.000000
+brushgamma=2.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.300000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/dribble.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Felt-marker b/plug-ins/gimpressionist/Presets/Felt-marker
new file mode 100644
index 0000000..fc3e09f
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Felt-marker
@@ -0,0 +1,28 @@
+Preset
+orientnum=14
+orientfirst=66.900002
+orientlast=360.000000
+orienttype=6
+brushrelief=0.000000
+brushscale=13.730000
+brushdensity=20.000000
+brushgamma=1.000000
+brushaspect=-0.450000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/shape04.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Flowerbed b/plug-ins/gimpressionist/Presets/Flowerbed
new file mode 100644
index 0000000..32baef1
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Flowerbed
@@ -0,0 +1,40 @@
+Preset
+desc=Flower power, man!
+orientnum=7
+orientfirst=11.489998
+orientlast=45.599998
+orienttype=2
+sizenum=1
+sizefirst=15.930000
+sizelast=15.930000
+sizetype=0
+brushrelief=12.390000
+brushdensity=21.709999
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=1
+generaldarkedge=0.150000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/flower01.pgm
+selectedpaper=Paper/canvas2.pgm
+color=646566
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Furry b/plug-ins/gimpressionist/Presets/Furry
new file mode 100644
index 0000000..0bbdce0
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Furry
@@ -0,0 +1,40 @@
+Preset
+desc=Woof!
+orientnum=30
+orientfirst=89.199997
+orientlast=203.889999
+orienttype=4
+sizenum=1
+sizefirst=14.200000
+sizelast=14.200000
+sizetype=0
+brushrelief=0.000000
+brushdensity=28.320000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=103.169998
+paperinvert=1
+paperoverlay=0
+selectedbrush=Brushes/chalk01.pgm
+selectedpaper=Paper/marble.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Line-art b/plug-ins/gimpressionist/Presets/Line-art
new file mode 100644
index 0000000..274ca86
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Line-art
@@ -0,0 +1,28 @@
+Preset
+orientnum=15
+orientfirst=44.599998
+orientlast=180.220001
+orienttype=6
+brushrelief=12.000000
+brushscale=14.200000
+brushdensity=20.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/chalk01.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Line-art-2 b/plug-ins/gimpressionist/Presets/Line-art-2
new file mode 100644
index 0000000..5ec301b
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Line-art-2
@@ -0,0 +1,28 @@
+Preset
+orientnum=15
+orientfirst=31.860001
+orientlast=180.220001
+orienttype=6
+brushrelief=41.590000
+brushscale=15.350000
+brushdensity=26.580000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/chalk01.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Maggot-invasion b/plug-ins/gimpressionist/Presets/Maggot-invasion
new file mode 100644
index 0000000..93b4477
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Maggot-invasion
@@ -0,0 +1,40 @@
+Preset
+desc=Sends a horde of maggots to gnaw at your image.
+orientnum=30
+orientfirst=0.000000
+orientlast=360.000000
+orienttype=6
+sizenum=1
+sizefirst=13.150000
+sizelast=13.150000
+sizetype=0
+brushrelief=16.000000
+brushdensity=20.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=0
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/worm.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=1
+numorientvector=1
+orientvector=0,0.633333,0.466667,282.000000,-0.978148,0.207912,1.000000,-1603454457
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Makefile.am b/plug-ins/gimpressionist/Presets/Makefile.am
new file mode 100644
index 0000000..8cfdc88
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Makefile.am
@@ -0,0 +1,32 @@
+## Process this file with automake to produce Makefile.in
+
+presetsdatadir = $(gimpdatadir)/gimpressionist/Presets
+
+presetsdata_DATA = \
+ ApplyCanvas \
+ Ballpark \
+ Canvas \
+ Crosshatch \
+ Cubism \
+ Dotify \
+ Embroidery \
+ Feathers \
+ Felt-marker \
+ Flowerbed \
+ Furry \
+ Line-art \
+ Line-art-2 \
+ Maggot-invasion \
+ MarbleMadness \
+ Mossy \
+ Painted_Rock \
+ Parquette \
+ Patchwork \
+ Ringworks \
+ Sample \
+ Smash \
+ Straws \
+ Weave \
+ Wormcan
+
+EXTRA_DIST = $(presetsdata_DATA)
diff --git a/plug-ins/gimpressionist/Presets/Makefile.in b/plug-ins/gimpressionist/Presets/Makefile.in
new file mode 100644
index 0000000..dcc008b
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Makefile.in
@@ -0,0 +1,829 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = plug-ins/gimpressionist/Presets
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4macros/gtk-doc.m4 \
+ $(top_srcdir)/m4macros/intltool.m4 \
+ $(top_srcdir)/m4macros/libtool.m4 \
+ $(top_srcdir)/m4macros/ltoptions.m4 \
+ $(top_srcdir)/m4macros/ltsugar.m4 \
+ $(top_srcdir)/m4macros/ltversion.m4 \
+ $(top_srcdir)/m4macros/lt~obsolete.m4 \
+ $(top_srcdir)/acinclude.m4 $(top_srcdir)/m4macros/alsa.m4 \
+ $(top_srcdir)/m4macros/ax_compare_version.m4 \
+ $(top_srcdir)/m4macros/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4macros/ax_gcc_func_attribute.m4 \
+ $(top_srcdir)/m4macros/ax_prog_cc_for_build.m4 \
+ $(top_srcdir)/m4macros/ax_prog_perl_version.m4 \
+ $(top_srcdir)/m4macros/detectcflags.m4 \
+ $(top_srcdir)/m4macros/pythondev.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(presetsdatadir)"
+DATA = $(presetsdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+AA_LIBS = @AA_LIBS@
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALL_LINGUAS = @ALL_LINGUAS@
+ALSA_CFLAGS = @ALSA_CFLAGS@
+ALSA_LIBS = @ALSA_LIBS@
+ALTIVEC_EXTRA_CFLAGS = @ALTIVEC_EXTRA_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPSTREAM_UTIL = @APPSTREAM_UTIL@
+AR = @AR@
+AS = @AS@
+ATK_CFLAGS = @ATK_CFLAGS@
+ATK_LIBS = @ATK_LIBS@
+ATK_REQUIRED_VERSION = @ATK_REQUIRED_VERSION@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BABL_CFLAGS = @BABL_CFLAGS@
+BABL_LIBS = @BABL_LIBS@
+BABL_REQUIRED_VERSION = @BABL_REQUIRED_VERSION@
+BUG_REPORT_URL = @BUG_REPORT_URL@
+BUILD_EXEEXT = @BUILD_EXEEXT@
+BUILD_OBJEXT = @BUILD_OBJEXT@
+BZIP2_LIBS = @BZIP2_LIBS@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CAIRO_PDF_CFLAGS = @CAIRO_PDF_CFLAGS@
+CAIRO_PDF_LIBS = @CAIRO_PDF_LIBS@
+CAIRO_PDF_REQUIRED_VERSION = @CAIRO_PDF_REQUIRED_VERSION@
+CAIRO_REQUIRED_VERSION = @CAIRO_REQUIRED_VERSION@
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
+CPP_FOR_BUILD = @CPP_FOR_BUILD@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DESKTOP_DATADIR = @DESKTOP_DATADIR@
+DESKTOP_FILE_VALIDATE = @DESKTOP_FILE_VALIDATE@
+DLLTOOL = @DLLTOOL@
+DOC_SHOOTER = @DOC_SHOOTER@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FILE_AA = @FILE_AA@
+FILE_EXR = @FILE_EXR@
+FILE_HEIF = @FILE_HEIF@
+FILE_JP2_LOAD = @FILE_JP2_LOAD@
+FILE_MNG = @FILE_MNG@
+FILE_PDF_SAVE = @FILE_PDF_SAVE@
+FILE_PS = @FILE_PS@
+FILE_WMF = @FILE_WMF@
+FILE_XMC = @FILE_XMC@
+FILE_XPM = @FILE_XPM@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+FONTCONFIG_REQUIRED_VERSION = @FONTCONFIG_REQUIRED_VERSION@
+FREETYPE2_REQUIRED_VERSION = @FREETYPE2_REQUIRED_VERSION@
+FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
+FREETYPE_LIBS = @FREETYPE_LIBS@
+GDBUS_CODEGEN = @GDBUS_CODEGEN@
+GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@
+GDK_PIXBUF_CSOURCE = @GDK_PIXBUF_CSOURCE@
+GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@
+GDK_PIXBUF_REQUIRED_VERSION = @GDK_PIXBUF_REQUIRED_VERSION@
+GEGL = @GEGL@
+GEGL_CFLAGS = @GEGL_CFLAGS@
+GEGL_LIBS = @GEGL_LIBS@
+GEGL_MAJOR_MINOR_VERSION = @GEGL_MAJOR_MINOR_VERSION@
+GEGL_REQUIRED_VERSION = @GEGL_REQUIRED_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GEXIV2_CFLAGS = @GEXIV2_CFLAGS@
+GEXIV2_LIBS = @GEXIV2_LIBS@
+GEXIV2_REQUIRED_VERSION = @GEXIV2_REQUIRED_VERSION@
+GIMP_API_VERSION = @GIMP_API_VERSION@
+GIMP_APP_VERSION = @GIMP_APP_VERSION@
+GIMP_BINARY_AGE = @GIMP_BINARY_AGE@
+GIMP_COMMAND = @GIMP_COMMAND@
+GIMP_DATA_VERSION = @GIMP_DATA_VERSION@
+GIMP_FULL_NAME = @GIMP_FULL_NAME@
+GIMP_INTERFACE_AGE = @GIMP_INTERFACE_AGE@
+GIMP_MAJOR_VERSION = @GIMP_MAJOR_VERSION@
+GIMP_MICRO_VERSION = @GIMP_MICRO_VERSION@
+GIMP_MINOR_VERSION = @GIMP_MINOR_VERSION@
+GIMP_MKENUMS = @GIMP_MKENUMS@
+GIMP_MODULES = @GIMP_MODULES@
+GIMP_PACKAGE_REVISION = @GIMP_PACKAGE_REVISION@
+GIMP_PKGCONFIG_VERSION = @GIMP_PKGCONFIG_VERSION@
+GIMP_PLUGINS = @GIMP_PLUGINS@
+GIMP_PLUGIN_VERSION = @GIMP_PLUGIN_VERSION@
+GIMP_REAL_VERSION = @GIMP_REAL_VERSION@
+GIMP_SYSCONF_VERSION = @GIMP_SYSCONF_VERSION@
+GIMP_TOOL_VERSION = @GIMP_TOOL_VERSION@
+GIMP_UNSTABLE = @GIMP_UNSTABLE@
+GIMP_USER_VERSION = @GIMP_USER_VERSION@
+GIMP_VERSION = @GIMP_VERSION@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
+GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GIO_WINDOWS_CFLAGS = @GIO_WINDOWS_CFLAGS@
+GIO_WINDOWS_LIBS = @GIO_WINDOWS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_REQUIRED_VERSION = @GLIB_REQUIRED_VERSION@
+GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@
+GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
+GMOFILES = @GMOFILES@
+GMSGFMT = @GMSGFMT@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GREP = @GREP@
+GS_LIBS = @GS_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@
+GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@
+GTK_REQUIRED_VERSION = @GTK_REQUIRED_VERSION@
+GTK_UPDATE_ICON_CACHE = @GTK_UPDATE_ICON_CACHE@
+GUDEV_CFLAGS = @GUDEV_CFLAGS@
+GUDEV_LIBS = @GUDEV_LIBS@
+HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
+HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
+HARFBUZZ_REQUIRED_VERSION = @HARFBUZZ_REQUIRED_VERSION@
+HAVE_CXX14 = @HAVE_CXX14@
+HAVE_FINITE = @HAVE_FINITE@
+HAVE_ISFINITE = @HAVE_ISFINITE@
+HAVE_VFORK = @HAVE_VFORK@
+HOST_GLIB_COMPILE_RESOURCES = @HOST_GLIB_COMPILE_RESOURCES@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLLIBS = @INTLLIBS@
+INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
+INTLTOOL_MERGE = @INTLTOOL_MERGE@
+INTLTOOL_PERL = @INTLTOOL_PERL@
+INTLTOOL_REQUIRED_VERSION = @INTLTOOL_REQUIRED_VERSION@
+INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@
+INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@
+INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@
+INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+ISO_CODES_LOCALEDIR = @ISO_CODES_LOCALEDIR@
+ISO_CODES_LOCATION = @ISO_CODES_LOCATION@
+JPEG_LIBS = @JPEG_LIBS@
+JSON_GLIB_CFLAGS = @JSON_GLIB_CFLAGS@
+JSON_GLIB_LIBS = @JSON_GLIB_LIBS@
+LCMS_CFLAGS = @LCMS_CFLAGS@
+LCMS_LIBS = @LCMS_LIBS@
+LCMS_REQUIRED_VERSION = @LCMS_REQUIRED_VERSION@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
+LIBBACKTRACE_LIBS = @LIBBACKTRACE_LIBS@
+LIBHEIF_CFLAGS = @LIBHEIF_CFLAGS@
+LIBHEIF_LIBS = @LIBHEIF_LIBS@
+LIBHEIF_REQUIRED_VERSION = @LIBHEIF_REQUIRED_VERSION@
+LIBLZMA_REQUIRED_VERSION = @LIBLZMA_REQUIRED_VERSION@
+LIBMYPAINT_CFLAGS = @LIBMYPAINT_CFLAGS@
+LIBMYPAINT_LIBS = @LIBMYPAINT_LIBS@
+LIBMYPAINT_REQUIRED_VERSION = @LIBMYPAINT_REQUIRED_VERSION@
+LIBOBJS = @LIBOBJS@
+LIBPNG_REQUIRED_VERSION = @LIBPNG_REQUIRED_VERSION@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUNWIND_CFLAGS = @LIBUNWIND_CFLAGS@
+LIBUNWIND_LIBS = @LIBUNWIND_LIBS@
+LIBUNWIND_REQUIRED_VERSION = @LIBUNWIND_REQUIRED_VERSION@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+LT_VERSION_INFO = @LT_VERSION_INFO@
+LZMA_CFLAGS = @LZMA_CFLAGS@
+LZMA_LIBS = @LZMA_LIBS@
+MAIL = @MAIL@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIME_INFO_CFLAGS = @MIME_INFO_CFLAGS@
+MIME_INFO_LIBS = @MIME_INFO_LIBS@
+MIME_TYPES = @MIME_TYPES@
+MKDIR_P = @MKDIR_P@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MMX_EXTRA_CFLAGS = @MMX_EXTRA_CFLAGS@
+MNG_CFLAGS = @MNG_CFLAGS@
+MNG_LIBS = @MNG_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGMERGE = @MSGMERGE@
+MYPAINT_BRUSHES_CFLAGS = @MYPAINT_BRUSHES_CFLAGS@
+MYPAINT_BRUSHES_LIBS = @MYPAINT_BRUSHES_LIBS@
+NATIVE_GLIB_CFLAGS = @NATIVE_GLIB_CFLAGS@
+NATIVE_GLIB_LIBS = @NATIVE_GLIB_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENEXR_CFLAGS = @OPENEXR_CFLAGS@
+OPENEXR_LIBS = @OPENEXR_LIBS@
+OPENEXR_REQUIRED_VERSION = @OPENEXR_REQUIRED_VERSION@
+OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@
+OPENJPEG_LIBS = @OPENJPEG_LIBS@
+OPENJPEG_REQUIRED_VERSION = @OPENJPEG_REQUIRED_VERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PANGOCAIRO_CFLAGS = @PANGOCAIRO_CFLAGS@
+PANGOCAIRO_LIBS = @PANGOCAIRO_LIBS@
+PANGOCAIRO_REQUIRED_VERSION = @PANGOCAIRO_REQUIRED_VERSION@
+PATHSEP = @PATHSEP@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_REQUIRED_VERSION = @PERL_REQUIRED_VERSION@
+PERL_VERSION = @PERL_VERSION@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_CFLAGS = @PNG_CFLAGS@
+PNG_LIBS = @PNG_LIBS@
+POFILES = @POFILES@
+POPPLER_CFLAGS = @POPPLER_CFLAGS@
+POPPLER_DATA_CFLAGS = @POPPLER_DATA_CFLAGS@
+POPPLER_DATA_LIBS = @POPPLER_DATA_LIBS@
+POPPLER_DATA_REQUIRED_VERSION = @POPPLER_DATA_REQUIRED_VERSION@
+POPPLER_LIBS = @POPPLER_LIBS@
+POPPLER_REQUIRED_VERSION = @POPPLER_REQUIRED_VERSION@
+POSUB = @POSUB@
+PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
+PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
+PYBIN_PATH = @PYBIN_PATH@
+PYCAIRO_CFLAGS = @PYCAIRO_CFLAGS@
+PYCAIRO_LIBS = @PYCAIRO_LIBS@
+PYGIMP_EXTRA_CFLAGS = @PYGIMP_EXTRA_CFLAGS@
+PYGTK_CFLAGS = @PYGTK_CFLAGS@
+PYGTK_CODEGEN = @PYGTK_CODEGEN@
+PYGTK_DEFSDIR = @PYGTK_DEFSDIR@
+PYGTK_LIBS = @PYGTK_LIBS@
+PYLINK_LIBS = @PYLINK_LIBS@
+PYTHON = @PYTHON@
+PYTHON2_REQUIRED_VERSION = @PYTHON2_REQUIRED_VERSION@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_INCLUDES = @PYTHON_INCLUDES@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RSVG_REQUIRED_VERSION = @RSVG_REQUIRED_VERSION@
+RT_LIBS = @RT_LIBS@
+SCREENSHOT_LIBS = @SCREENSHOT_LIBS@
+SED = @SED@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+SSE2_EXTRA_CFLAGS = @SSE2_EXTRA_CFLAGS@
+SSE4_1_EXTRA_CFLAGS = @SSE4_1_EXTRA_CFLAGS@
+SSE_EXTRA_CFLAGS = @SSE_EXTRA_CFLAGS@
+STRIP = @STRIP@
+SVG_CFLAGS = @SVG_CFLAGS@
+SVG_LIBS = @SVG_LIBS@
+SYMPREFIX = @SYMPREFIX@
+TIFF_LIBS = @TIFF_LIBS@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WEBKIT_CFLAGS = @WEBKIT_CFLAGS@
+WEBKIT_LIBS = @WEBKIT_LIBS@
+WEBKIT_REQUIRED_VERSION = @WEBKIT_REQUIRED_VERSION@
+WEBPDEMUX_CFLAGS = @WEBPDEMUX_CFLAGS@
+WEBPDEMUX_LIBS = @WEBPDEMUX_LIBS@
+WEBPMUX_CFLAGS = @WEBPMUX_CFLAGS@
+WEBPMUX_LIBS = @WEBPMUX_LIBS@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+WEBP_REQUIRED_VERSION = @WEBP_REQUIRED_VERSION@
+WEB_PAGE = @WEB_PAGE@
+WIN32_LARGE_ADDRESS_AWARE = @WIN32_LARGE_ADDRESS_AWARE@
+WINDRES = @WINDRES@
+WMF_CFLAGS = @WMF_CFLAGS@
+WMF_CONFIG = @WMF_CONFIG@
+WMF_LIBS = @WMF_LIBS@
+WMF_REQUIRED_VERSION = @WMF_REQUIRED_VERSION@
+XDG_EMAIL = @XDG_EMAIL@
+XFIXES_CFLAGS = @XFIXES_CFLAGS@
+XFIXES_LIBS = @XFIXES_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_REQUIRED_VERSION = @XGETTEXT_REQUIRED_VERSION@
+XMC_CFLAGS = @XMC_CFLAGS@
+XMC_LIBS = @XMC_LIBS@
+XMKMF = @XMKMF@
+XMLLINT = @XMLLINT@
+XMU_LIBS = @XMU_LIBS@
+XPM_LIBS = @XPM_LIBS@
+XSLTPROC = @XSLTPROC@
+XVFB_RUN = @XVFB_RUN@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+Z_LIBS = @Z_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CC_FOR_BUILD = @ac_ct_CC_FOR_BUILD@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gimpdatadir = @gimpdatadir@
+gimpdir = @gimpdir@
+gimplocaledir = @gimplocaledir@
+gimpplugindir = @gimpplugindir@
+gimpsysconfdir = @gimpsysconfdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+intltool__v_merge_options_ = @intltool__v_merge_options_@
+intltool__v_merge_options_0 = @intltool__v_merge_options_0@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+manpage_gimpdir = @manpage_gimpdir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+mypaint_brushes_dir = @mypaint_brushes_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+presetsdatadir = $(gimpdatadir)/gimpressionist/Presets
+presetsdata_DATA = \
+ ApplyCanvas \
+ Ballpark \
+ Canvas \
+ Crosshatch \
+ Cubism \
+ Dotify \
+ Embroidery \
+ Feathers \
+ Felt-marker \
+ Flowerbed \
+ Furry \
+ Line-art \
+ Line-art-2 \
+ Maggot-invasion \
+ MarbleMadness \
+ Mossy \
+ Painted_Rock \
+ Parquette \
+ Patchwork \
+ Ringworks \
+ Sample \
+ Smash \
+ Straws \
+ Weave \
+ Wormcan
+
+EXTRA_DIST = $(presetsdata_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plug-ins/gimpressionist/Presets/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plug-ins/gimpressionist/Presets/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-presetsdataDATA: $(presetsdata_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(presetsdata_DATA)'; test -n "$(presetsdatadir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(presetsdatadir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(presetsdatadir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(presetsdatadir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(presetsdatadir)" || exit $$?; \
+ done
+
+uninstall-presetsdataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(presetsdata_DATA)'; test -n "$(presetsdatadir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(presetsdatadir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+ for dir in "$(DESTDIR)$(presetsdatadir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-presetsdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-presetsdataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-presetsdataDATA install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags-am uninstall uninstall-am \
+ uninstall-presetsdataDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plug-ins/gimpressionist/Presets/MarbleMadness b/plug-ins/gimpressionist/Presets/MarbleMadness
new file mode 100644
index 0000000..4db9fba
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/MarbleMadness
@@ -0,0 +1,39 @@
+Preset
+desc=Quite close to the original Cryptiq-plugins effect.
+orientnum=1
+orientfirst=0.000000
+orientlast=0.000000
+orienttype=0
+sizenum=10
+sizefirst=6.000000
+sizelast=25.000000
+sizetype=6
+brushrelief=100.000000
+brushdensity=50.000000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=3.500000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/ball.ppm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Mossy b/plug-ins/gimpressionist/Presets/Mossy
new file mode 100644
index 0000000..679ef76
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Mossy
@@ -0,0 +1,40 @@
+Preset
+desc=Very rough moss-like texture. Works quite well for tileable backgrounds and other textures.
+orientnum=21
+orientfirst=31.860001
+orientlast=180.220001
+orienttype=6
+sizenum=1
+sizefirst=30.570000
+sizelast=30.570000
+sizetype=0
+brushrelief=41.590000
+brushdensity=26.580000
+brushgamma=0.500000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/strange01.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Painted_Rock b/plug-ins/gimpressionist/Presets/Painted_Rock
new file mode 100644
index 0000000..622ba4b
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Painted_Rock
@@ -0,0 +1,40 @@
+Preset
+desc=Rough paint-on-rock sort of texture. Good for tileable backgrounds.
+orientnum=30
+orientfirst=0.000000
+orientlast=360.000000
+orienttype=2
+sizenum=1
+sizefirst=35.369999
+sizelast=35.369999
+sizetype=0
+brushrelief=100.000000
+brushdensity=20.000000
+brushgamma=2.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/splat3.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Parquette b/plug-ins/gimpressionist/Presets/Parquette
new file mode 100644
index 0000000..9ea0b14
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Parquette
@@ -0,0 +1,30 @@
+Preset
+orientnum=4
+orientfirst=31.860001
+orientlast=360.000000
+orienttype=7
+brushrelief=12.000000
+brushscale=20.000000
+brushdensity=20.000000
+brushgamma=1.000000
+brushaspect=0.630000
+generalbgtype=0
+generaldarkedge=0.400000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/crayon04.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=3
+orientvector=0,0.240000,0.333333,0.000000,0.000000,1.000000,1.000000,3
+orientvector=1,0.780000,0.293333,0.000000,0.000000,1.000000,1.000000,3
+orientvector=2,0.533333,0.813333,0.000000,0.000000,1.000000,1.000000,3
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=1
diff --git a/plug-ins/gimpressionist/Presets/Patchwork b/plug-ins/gimpressionist/Presets/Patchwork
new file mode 100644
index 0000000..68fbc25
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Patchwork
@@ -0,0 +1,28 @@
+Preset
+orientnum=8
+orientfirst=22.299999
+orientlast=360.000000
+orienttype=2
+brushrelief=15.040000
+brushscale=13.630000
+brushdensity=15.500000
+brushgamma=0.860000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=0
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/spunge02.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Ringworks b/plug-ins/gimpressionist/Presets/Ringworks
new file mode 100644
index 0000000..a0de14c
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Ringworks
@@ -0,0 +1,28 @@
+Preset
+orientnum=1
+orientfirst=0.000000
+orientlast=0.000000
+orienttype=2
+brushrelief=0.000000
+brushscale=11.330000
+brushdensity=12.390000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.000000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/shape03.pgm
+selectedpaper=Paper/canvas2.pgm
+color=646566
+placetype=1
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Sample b/plug-ins/gimpressionist/Presets/Sample
new file mode 100644
index 0000000..9607029
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Sample
@@ -0,0 +1,40 @@
+Preset
+desc=Plain oil-painting. Good for big pictures, as much of the details are lost.
+orientnum=30
+orientfirst=70.089996
+orientlast=360.000000
+orienttype=5
+sizenum=1
+sizefirst=15.350000
+sizelast=15.350000
+sizetype=0
+brushrelief=12.000000
+brushdensity=40.000000
+brushgamma=1.310000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.050000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/defaultbrush.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Smash b/plug-ins/gimpressionist/Presets/Smash
new file mode 100644
index 0000000..92f29f0
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Smash
@@ -0,0 +1,40 @@
+Preset
+desc=Looks like a mixture between a spiderweb and a smashed window.
+orientnum=17
+orientfirst=15.930000
+orientlast=360.000000
+orienttype=3
+sizenum=1
+sizefirst=25.780001
+sizelast=25.780001
+sizetype=0
+brushrelief=0.000000
+brushdensity=20.950001
+brushgamma=0.500000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.100000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/strange01.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Straws b/plug-ins/gimpressionist/Presets/Straws
new file mode 100644
index 0000000..82b703a
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Straws
@@ -0,0 +1,41 @@
+Preset
+desc=The image looks like it is made up of small pieces of straw or chips of wood. Tileable.
+orientnum=30
+orientfirst=41.419998
+orientlast=360.000000
+orienttype=6
+sizenum=1
+sizefirst=29.730000
+sizelast=29.730000
+sizetype=0
+brushrelief=0.000000
+brushdensity=32.650002
+brushgamma=1.000000
+brushaspect=-0.400000
+generalbgtype=0
+generaldarkedge=0.350000
+generalpaintedges=1
+generaltileable=1
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/defaultbrush.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=000000
+placetype=0
+placecenter=0
+numorientvector=2
+orientvector=0,0.500000,0.500000,90.000000,1.000000,0.000000,1.000000,3
+orientvector=1,0.500000,0.500000,270.000000,-1.000000,0.000000,1.000000,3
+orientangoff=0.000000
+orientstrexp=1.400000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Weave b/plug-ins/gimpressionist/Presets/Weave
new file mode 100644
index 0000000..63a3edb
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Weave
@@ -0,0 +1,40 @@
+Preset
+desc=Makes the image look like some sort of woven quilt or rug, or something in that direction.
+orientnum=4
+orientfirst=9.560000
+orientlast=360.000000
+orienttype=2
+sizenum=1
+sizefirst=20.530001
+sizelast=20.530001
+sizetype=0
+brushrelief=12.000000
+brushdensity=13.080000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=1
+generaldarkedge=0.050000
+generalpaintedges=1
+generaltileable=0
+generaldropshadow=0
+generalshadowdarkness=20.000000
+devthresh=0.100000
+paperrelief=30.969999
+paperscale=100.570000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/fabric01.pgm
+selectedpaper=Paper/canvas2.pgm
+color=646566
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
+numsizevector=1
+sizevector=0,0.500000,0.500000,0.000000,0.000000,0
+sizeangoff=0.000000
+sizestrexp=0.000000
+sizevoronoi=0
diff --git a/plug-ins/gimpressionist/Presets/Wormcan b/plug-ins/gimpressionist/Presets/Wormcan
new file mode 100644
index 0000000..9880db7
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/Wormcan
@@ -0,0 +1,28 @@
+Preset
+orientnum=16
+orientfirst=0.000000
+orientlast=360.000000
+orienttype=2
+brushrelief=30.969999
+brushscale=20.000000
+brushdensity=25.160000
+brushgamma=1.000000
+brushaspect=0.000000
+generalbgtype=0
+generaldarkedge=0.050000
+generalpaintedges=1
+generaltileable=0
+paperrelief=0.000000
+paperscale=30.000000
+paperinvert=0
+paperoverlay=0
+selectedbrush=Brushes/wavy.pgm
+selectedpaper=Paper/defaultpaper.pgm
+color=010101
+placetype=0
+placecenter=0
+numorientvector=1
+orientvector=0,0.500000,0.500000,0.000000,0.000000,1.000000,1.000000,0
+orientangoff=0.000000
+orientstrexp=1.000000
+orientvoronoi=0
diff --git a/plug-ins/gimpressionist/README b/plug-ins/gimpressionist/README
new file mode 100644
index 0000000..42d90a4
--- /dev/null
+++ b/plug-ins/gimpressionist/README
@@ -0,0 +1,102 @@
+ This is the README for The GIMPressionist
+ (c) 1998, 1999 Vidar Madsen - vidar@prosalg.no
+
+ The GIMPressionist is free software, and may be distributed
+ freely, provided this file is included!
+
+ This program comes with no warranty, whatsoever. The author
+ can not be held liable for any damage caused by proper or
+ improper use of this program.
+
+
+--- Introduction
+
+The GIMPressionist is a plug-in for the GNU Image Manipulation Program,
+a.k.a. GIMP. It can be used to create natural looking painting effects
+and similar. It can also be run in a primitive "standalone" mode.
+
+The current version is still a bit shaky, and is to be considered beta
+software. I'll do some serious testing, hopefully across a few more
+platforms, as soon as I can.
+
+The official Web-page is http://www.prosalg.no/~vidar/gimpressionist/ and
+will always contain a link to the latest released version.
+
+
+--- Compiling / Installing
+
+To compile (hopefully):
+ make
+
+If you want to compile for GTK-1.1 and GIMP-1.1 instead, you will have
+to change the two variable at the top of Makefile. Possibly you would
+want to edit DEFAULTPATH as well, but that's not critical.
+
+To install plug-in and accompanying files:
+ make install
+
+The plug-in installs itself under $HOME/.gimp/plug-ins/ and copies a
+couple of files into the directory $HOME/.gimp/gimpressionist/. The
+subdirectories 'Brushes', 'Paper' and 'Presets' will be created during
+"make install", and a few files will be added; As a minimum,
+'defaultbrush.pgm' and 'defaultpaper.pgm' under their respective
+directories. These are vanilla .PGM files, which could be edited (and
+created) with any decent program - like GIMP! :-)
+
+
+--- Standalone
+
+As of version 0.99 and later, the GIMPressionist can also be run
+separately from GIMP. This is primarily intended for debugging
+purposes, though, as it still needs GIMP libraries to compile. In your
+shell, type:
+ gimpressionist somefile.ppm
+
+The image specified must be a valid PPM file. No other formats are
+supported, and probably never will.
+
+If you click "OK", the PPM will be replaced with the "repainted" version.
+If you "Cancel", nothing will be done to the file.
+
+
+--- File Formats
+
+The "normal" brushes are simply grayscale PGM files, which can be created
+with almost any program, including xv and of course GIMP. A number of
+brushes is included, so I guess a more in-depth explanation is not
+necessary. And, for those who might want to try it, GIMPressionist can
+also read GBR files, which is GIMP's native brush format. (You still
+need to copy them to the GIMPressionist's brush-directory, though. This
+will probably be fixed sometimes.)
+
+Version 0.99.4 introduced the concept of using "colored" brushes (although
+"pre-rendered" usually is more correct). The brushes' file format is a
+plain PPM file, but the layout is somewhat special (and kinda hard to
+explain);
+
+- The Red channel contains a shading map of the brush in question. Often
+ it resembles the overall image more or less completely.
+
+- The Green channel contains a high-light map. This is a pre-defined
+ image of the shiny parts of the brush. (Ordinary grayscale brushes
+ have this calculated automatically with a rough emboss-ish algorithm.)
+
+- The Blue channel functions as a brush mask. When applying a brush
+ stroke to the image, all areas colored blue in the file are first
+ "blacked out" of the image.
+
+
+--- Feedback
+
+If you have any comments, criticism, ideas for improvement or new
+features, or if you run into problems of any sort, let me know, so that I
+can (try to) fix it for the next release! (And, if you find platform-
+dependent bugs, please try to fix them and send me a patch!)
+
+I'm also welcoming contributions in the form of brushes or textures! For
+this program to be valuable, it needs them... Bad! All contributions will
+be properly credited, of course.
+
+Good luck and happy painting!
+
+Vidar Madsen <vidar@prosalg.no>
diff --git a/plug-ins/gimpressionist/brush.c b/plug-ins/gimpressionist/brush.c
new file mode 100644
index 0000000..a5d1e59
--- /dev/null
+++ b/plug-ins/gimpressionist/brush.c
@@ -0,0 +1,660 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include <libgimpmath/gimpmath.h>
+
+#include <gtk/gtklist.h>
+#include <gtk/gtkpreview.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "brush.h"
+#include "presets.h"
+
+#include <libgimp/stdplugins-intl.h>
+
+
+static void update_brush_preview (const char *fn);
+
+
+static GtkWidget *brush_preview = NULL;
+static GtkListStore *brush_list_store = NULL;
+
+static GtkWidget *brush_list = NULL;
+static GtkAdjustment *brush_relief_adjust = NULL;
+static GtkAdjustment *brush_aspect_adjust = NULL;
+static GtkAdjustment *brush_gamma_adjust = NULL;
+static gboolean brush_dont_update = FALSE;
+
+static gchar *last_selected_brush = NULL;
+
+static gint brush_from_file = 2;
+
+static ppm_t brushppm = {0, 0, NULL};
+
+void
+brush_restore (void)
+{
+ reselect (brush_list, pcvals.selected_brush);
+ gtk_adjustment_set_value (brush_gamma_adjust, pcvals.brushgamma);
+ gtk_adjustment_set_value (brush_relief_adjust, pcvals.brush_relief);
+ gtk_adjustment_set_value (brush_aspect_adjust, pcvals.brush_aspect);
+}
+
+void
+brush_store (void)
+{
+ pcvals.brushgamma = gtk_adjustment_get_value (brush_gamma_adjust);
+}
+
+void
+brush_free (void)
+{
+ g_free (last_selected_brush);
+}
+
+void brush_get_selected (ppm_t *p)
+{
+ if (brush_from_file)
+ brush_reload (pcvals.selected_brush, p);
+ else
+ ppm_copy (&brushppm, p);
+}
+
+
+static gboolean
+file_is_color (const char *fn)
+{
+ return fn && strstr (fn, ".ppm");
+}
+
+void
+set_colorbrushes (const gchar *fn)
+{
+ pcvals.color_brushes = file_is_color (fn);
+}
+
+static const Babl *
+get_u8_format (gint32 drawable_id)
+{
+ if (gimp_drawable_is_rgb (drawable_id))
+ {
+ if (gimp_drawable_has_alpha (drawable_id))
+ return babl_format ("R'G'B'A u8");
+ else
+ return babl_format ("R'G'B' u8");
+ }
+ else
+ {
+ if (gimp_drawable_has_alpha (drawable_id))
+ return babl_format ("Y'A u8");
+ else
+ return babl_format ("Y' u8");
+ }
+}
+
+static void
+brushdmenuselect (GtkWidget *widget,
+ gpointer data)
+{
+ GeglBuffer *src_buffer;
+ const Babl *format;
+ guchar *src_row;
+ guchar *src;
+ gint bpp;
+ gint x, y;
+ ppm_t *p;
+ gint x1, y1, w, h;
+ gint row;
+ gint32 drawable_id;
+ gint rowstride;
+
+ gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &drawable_id);
+
+ if (drawable_id == -1)
+ return;
+
+ if (brush_from_file == 2)
+ return; /* Not finished GUI-building yet */
+
+ if (brush_from_file)
+ {
+#if 0
+ unselectall (brush_list);
+#endif
+ preset_save_button_set_sensitive (FALSE);
+ }
+
+ gtk_adjustment_set_value (brush_gamma_adjust, 1.0);
+ gtk_adjustment_set_value (brush_aspect_adjust, 0.0);
+
+ if (! gimp_drawable_mask_intersect (drawable_id, &x1, &y1, &w, &h))
+ return;
+
+ format = get_u8_format (drawable_id);
+ bpp = babl_format_get_bytes_per_pixel (format);
+
+ ppm_kill (&brushppm);
+ ppm_new (&brushppm, w, h);
+ p = &brushppm;
+
+ rowstride = p->width * 3;
+
+ src_row = g_new (guchar, w * bpp);
+
+ src_buffer = gimp_drawable_get_buffer (drawable_id);
+
+ if (bpp == 3)
+ { /* RGB */
+ gint bpr = w * 3;
+ gint y2 = y1 + h;
+
+ for (row = 0, y = y1; y < y2; row++, y++)
+ {
+ gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0,
+ format, src_row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
+ memcpy (p->col + row*rowstride, src_row, bpr);
+ }
+ }
+ else
+ { /* RGBA (bpp > 3) GrayA (bpp == 2) or Gray */
+ gboolean is_gray = ((bpp > 3) ? TRUE : FALSE);
+ gint y2 = y1 + h;
+
+ for (row = 0, y = y1; y < y2; row++, y++)
+ {
+ guchar *tmprow = p->col + row * rowstride;
+ guchar *tmprow_ptr;
+ gint x2 = x1 + w;
+
+ gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0,
+ format, src_row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
+ src = src_row;
+ tmprow_ptr = tmprow;
+ /* Possible micro-optimization here:
+ * src_end = src + src_rgn.bpp * w);
+ * for ( ; src < src_end ; src += src_rgn.bpp)
+ */
+ for (x = x1; x < x2; x++)
+ {
+ *(tmprow_ptr++) = src[0];
+ *(tmprow_ptr++) = src[is_gray ? 1 : 0];
+ *(tmprow_ptr++) = src[is_gray ? 2 : 0];
+ src += bpp;
+ }
+ }
+ }
+
+ g_object_unref (src_buffer);
+
+ g_free (src_row);
+
+ if (bpp >= 3)
+ pcvals.color_brushes = 1;
+ else
+ pcvals.color_brushes = 0;
+
+ brush_from_file = 0;
+ update_brush_preview (NULL);
+}
+
+#if 0
+void
+dummybrushdmenuselect (GtkWidget *w, gpointer data)
+{
+ ppm_kill (&brushppm);
+ ppm_new (&brushppm, 10,10);
+ brush_from_file = 0;
+ update_brush_preview (NULL);
+}
+#endif
+
+static void
+brushlistrefresh (void)
+{
+ gtk_list_store_clear (brush_list_store);
+ readdirintolist ("Brushes", brush_list, NULL);
+}
+
+static void
+savebrush_response (GtkWidget *dialog,
+ gint response_id,
+ gpointer data)
+{
+ if (response_id == GTK_RESPONSE_OK)
+ {
+ gchar *name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+ ppm_save (&brushppm, name);
+ brushlistrefresh ();
+
+ g_free (name);
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+static void
+savebrush (GtkWidget *wg,
+ gpointer data)
+{
+ GtkWidget *dialog = NULL;
+ GList *thispath = parsepath ();
+ gchar *path;
+
+ if (! PPM_IS_INITED (&brushppm))
+ {
+ g_message ( _("Can only save drawables!"));
+ return;
+ }
+
+ dialog =
+ gtk_file_chooser_dialog_new (_("Save Brush"),
+ GTK_WINDOW (gtk_widget_get_toplevel (wg)),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Save"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog),
+ TRUE);
+
+ path = g_build_filename ((gchar *)thispath->data, "Brushes", NULL);
+
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), path);
+
+ g_free (path);
+
+ g_signal_connect (dialog, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &dialog);
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (savebrush_response),
+ NULL);
+
+ gtk_widget_show (dialog);
+}
+
+static gboolean
+validdrawable (gint32 imageid,
+ gint32 drawableid,
+ gpointer data)
+{
+ return (gimp_drawable_is_rgb (drawableid) ||
+ gimp_drawable_is_gray (drawableid));
+}
+
+/*
+ * This function caches the last result. Call it with fn as NULL, to
+ * free the arguments.
+ * */
+void
+brush_reload (const gchar *fn,
+ ppm_t *p)
+{
+ static char lastfn[256] = "";
+ static ppm_t cache = {0, 0, NULL};
+
+ if (fn == NULL)
+ {
+ ppm_kill (&cache);
+ lastfn[0] = '\0';
+ return;
+ }
+
+ if (strcmp (fn, lastfn))
+ {
+ g_strlcpy (lastfn, fn, sizeof (lastfn));
+ ppm_kill (&cache);
+ ppm_load (fn, &cache);
+ }
+ ppm_copy (&cache, p);
+ set_colorbrushes (fn);
+}
+
+static void
+padbrush (ppm_t *p,
+ gint width,
+ gint height)
+{
+ guchar black[3] = {0, 0, 0};
+
+ int left = (width - p->width) / 2;
+ int right = (width - p->width) - left;
+ int top = (height - p->height) / 2;
+ int bottom = (height - p->height) - top;
+
+ ppm_pad (p, left, right, top, bottom, black);
+}
+
+static void
+update_brush_preview (const gchar *fn)
+{
+ gint i, j;
+ guchar *preview_image;
+
+ if (fn)
+ brush_from_file = 1;
+
+ preview_image = g_new0 (guchar, 100*100);
+
+ if (!fn && brush_from_file)
+ {
+ /* preview_image is already initialized to our liking. */
+ }
+ else
+ {
+ double sc;
+ ppm_t p = {0, 0, NULL};
+ guchar gammatable[256];
+ int newheight;
+
+ if (brush_from_file)
+ brush_reload (fn, &p);
+ else if (PPM_IS_INITED (&brushppm))
+ ppm_copy (&brushppm, &p);
+
+ set_colorbrushes (fn);
+
+ sc = gtk_adjustment_get_value (brush_gamma_adjust);
+ if (sc != 1.0)
+ for (i = 0; i < 256; i++)
+ gammatable[i] = pow (i / 255.0, sc) * 255;
+ else
+ for (i = 0; i < 256; i++)
+ gammatable[i] = i;
+
+ newheight = p.height *
+ pow (10, gtk_adjustment_get_value (brush_aspect_adjust));
+
+ sc = p.width > newheight ? p.width : newheight;
+ sc = 100.0 / sc;
+ resize_fast (&p, p.width*sc,newheight*sc);
+ padbrush (&p, 100, 100);
+ for (i = 0; i < 100; i++)
+ {
+ int k = i * p.width * 3;
+ if (i < p.height)
+ for (j = 0; j < p.width; j++)
+ preview_image[i*100+j] = gammatable[p.col[k + j * 3]];
+ }
+ ppm_kill (&p);
+ }
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (brush_preview),
+ 0, 0, 100, 100,
+ GIMP_GRAY_IMAGE,
+ preview_image,
+ 100);
+
+ g_free (preview_image);
+}
+
+
+/*
+ * "force" implies here to change the brush even if it was the same.
+ * It is used for the initialization of the preview.
+ * */
+static void
+brush_select (GtkTreeSelection *selection, gboolean force)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ gchar *fname = NULL;
+ gchar *brush = NULL;
+
+ if (brush_dont_update)
+ goto cleanup;
+
+ if (brush_from_file == 0)
+ {
+ update_brush_preview (NULL);
+ goto cleanup;
+ }
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_tree_model_get (model, &iter, 0, &brush, -1);
+
+ /* Check if the same brush was selected twice, and if so
+ * break. Otherwise, the brush gamma and stuff would have been
+ * reset.
+ * */
+ if (last_selected_brush == NULL)
+ {
+ last_selected_brush = g_strdup (brush);
+ }
+ else
+ {
+ if (!strcmp (last_selected_brush, brush))
+ {
+ if (!force)
+ {
+ goto cleanup;
+ }
+ }
+ else
+ {
+ g_free (last_selected_brush);
+ last_selected_brush = g_strdup (brush);
+ }
+ }
+
+ brush_dont_update = TRUE;
+ gtk_adjustment_set_value (brush_gamma_adjust, 1.0);
+ gtk_adjustment_set_value (brush_aspect_adjust, 0.0);
+ brush_dont_update = FALSE;
+
+ if (brush)
+ {
+ fname = g_build_filename ("Brushes", brush, NULL);
+
+ g_strlcpy (pcvals.selected_brush,
+ fname, sizeof (pcvals.selected_brush));
+
+ update_brush_preview (fname);
+
+ }
+ }
+cleanup:
+ g_free (fname);
+ g_free (brush);
+}
+
+static void
+brush_select_file (GtkTreeSelection *selection, gpointer data)
+{
+ brush_from_file = 1;
+ preset_save_button_set_sensitive (TRUE);
+ brush_select (selection, FALSE);
+}
+
+static void
+brush_preview_size_allocate (GtkWidget *preview)
+{
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (brush_list));
+ brush_select (selection, TRUE);
+}
+
+static void
+brush_asepct_adjust_cb (GtkWidget *w, gpointer data)
+{
+ gimp_double_adjustment_update (GTK_ADJUSTMENT (w), data);
+ update_brush_preview (pcvals.selected_brush);
+}
+
+void
+create_brushpage (GtkNotebook *notebook)
+{
+ GtkWidget *box1, *box2, *box3, *thispage;
+ GtkWidget *view;
+ GtkWidget *tmpw, *table;
+ GtkWidget *frame;
+ GtkWidget *combo;
+ GtkWidget *label;
+ GtkSizeGroup *group;
+ GtkTreeSelection *selection;
+
+ label = gtk_label_new_with_mnemonic (_("_Brush"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE,TRUE,0);
+ gtk_widget_show (box1);
+
+ view = create_one_column_list (box1, brush_select_file);
+ brush_list = view;
+ brush_list_store =
+ GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
+ gtk_widget_show (box2);
+
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ brush_preview = tmpw = gimp_preview_area_new ();
+ gtk_widget_set_size_request (brush_preview, 100, 100);
+ gtk_container_add (GTK_CONTAINER (frame), tmpw);
+ gtk_widget_show (tmpw);
+ g_signal_connect (brush_preview, "size-allocate",
+ G_CALLBACK (brush_preview_size_allocate), NULL);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
+ gtk_box_pack_end (GTK_BOX (box2), box3, FALSE, FALSE,0);
+ gtk_widget_show (box3);
+
+ tmpw = gtk_label_new (_("Gamma:"));
+ gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0);
+ gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE,0);
+ gtk_widget_show (tmpw);
+
+ brush_gamma_adjust = GTK_ADJUSTMENT (gtk_adjustment_new (pcvals.brushgamma,
+ 0.5, 3.0, 0.1, 0.1, 1.0));
+ tmpw = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, brush_gamma_adjust);
+ gtk_widget_set_size_request (GTK_WIDGET (tmpw), 100, 30);
+ gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE);
+ gtk_scale_set_digits (GTK_SCALE (tmpw), 2);
+ gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect_swapped (brush_gamma_adjust, "value-changed",
+ G_CALLBACK (update_brush_preview),
+ pcvals.selected_brush);
+
+ gimp_help_set_help_data
+ (tmpw, _("Changes the gamma (brightness) of the selected brush"), NULL);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (thispage), box3, FALSE, FALSE,0);
+ gtk_widget_show (box3);
+
+ group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+ tmpw = gtk_label_new (_("Select:"));
+ gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0);
+ gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+
+ gtk_size_group_add_widget (group, tmpw);
+ g_object_unref (group);
+
+ combo = gimp_drawable_combo_box_new (validdrawable, NULL);
+ gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), -1,
+ G_CALLBACK (brushdmenuselect),
+ NULL);
+
+ gtk_box_pack_start (GTK_BOX (box3), combo, TRUE, TRUE, 0);
+ gtk_widget_show (combo);
+
+ tmpw = gtk_button_new_with_mnemonic (_("Save _as"));
+ gtk_box_pack_start (GTK_BOX (box3),tmpw, FALSE, FALSE, 0);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (savebrush), NULL);
+ gtk_widget_show (tmpw);
+
+ table = gtk_table_new (2, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ brush_aspect_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Aspect ratio:"),
+ 150, -1, pcvals.brush_aspect,
+ -1.0, 1.0, 0.1, 0.1, 2,
+ TRUE, 0, 0,
+ _("Specifies the aspect ratio of the brush"),
+ NULL);
+ gtk_size_group_add_widget (group,
+ GIMP_SCALE_ENTRY_LABEL (brush_aspect_adjust));
+ g_signal_connect (brush_aspect_adjust, "value-changed",
+ G_CALLBACK (brush_asepct_adjust_cb), &pcvals.brush_aspect);
+
+ brush_relief_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Relief:"),
+ 150, -1, pcvals.brush_relief,
+ 0.0, 100.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Specifies the amount of embossing to apply to the image (in percent)"),
+ NULL);
+ gtk_size_group_add_widget (group,
+ GIMP_SCALE_ENTRY_LABEL (brush_relief_adjust));
+ g_signal_connect (brush_relief_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.brush_relief);
+
+ brush_select (selection, FALSE);
+ readdirintolist ("Brushes", view, pcvals.selected_brush);
+
+ /*
+ * This is so the "changed signal won't get sent to the brushes' list
+ * and reset the gamma and stuff.
+ * */
+ gtk_widget_grab_focus (brush_list);
+
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
+
diff --git a/plug-ins/gimpressionist/brush.h b/plug-ins/gimpressionist/brush.h
new file mode 100644
index 0000000..65296f8
--- /dev/null
+++ b/plug-ins/gimpressionist/brush.h
@@ -0,0 +1,29 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __BRUSH_H
+#define __BRUSH_H
+
+#include "ppmtool.h"
+
+void brush_store(void);
+void brush_restore(void);
+void brush_free(void);
+void create_brushpage(GtkNotebook *);
+void brush_get_selected (ppm_t *p);
+
+#endif /* #ifndef __BRUSH_H */
diff --git a/plug-ins/gimpressionist/color.c b/plug-ins/gimpressionist/color.c
new file mode 100644
index 0000000..9dc18d7
--- /dev/null
+++ b/plug-ins/gimpressionist/color.c
@@ -0,0 +1,106 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "color.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define NUMCOLORRADIO 2
+
+static GtkWidget *colorradio[NUMCOLORRADIO];
+static GtkObject *colornoiseadjust = NULL;
+
+void
+color_restore (void)
+{
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (colorradio[pcvals.color_type]), TRUE);
+
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (colornoiseadjust),
+ pcvals.color_noise);
+}
+
+int
+color_type_input (int in)
+{
+ return CLAMP_UP_TO (in, NUMCOLORRADIO);
+}
+
+void
+create_colorpage (GtkNotebook *notebook)
+{
+ GtkWidget *vbox;
+ GtkWidget *label, *table;
+ GtkWidget *frame;
+
+ label = gtk_label_new_with_mnemonic (_("Co_lor"));
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+ gtk_widget_show (vbox);
+
+ frame = gimp_int_radio_group_new (TRUE, _("Color"),
+ G_CALLBACK (gimp_radio_button_update),
+ &pcvals.color_type, 0,
+
+ _("A_verage under brush"),
+ COLOR_TYPE_AVERAGE, &colorradio[COLOR_TYPE_AVERAGE],
+ _("C_enter of brush"),
+ COLOR_TYPE_CENTER, &colorradio[COLOR_TYPE_CENTER],
+
+ NULL);
+
+ gimp_help_set_help_data
+ (colorradio[COLOR_TYPE_AVERAGE],
+ _("Color is computed from the average of all pixels under the brush"),
+ NULL);
+ gimp_help_set_help_data
+ (colorradio[COLOR_TYPE_CENTER],
+ _("Samples the color from the pixel in the center of the brush"), NULL);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (1, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ colornoiseadjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Color _noise:"),
+ 100, -1, pcvals.color_noise,
+ 0.0, 100.0, 1.0, 5.0, 0,
+ TRUE, 0, 0,
+ _("Adds random noise to the color"),
+ NULL);
+ g_signal_connect (colornoiseadjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.color_noise);
+
+ color_restore ();
+
+ gtk_notebook_append_page_menu (notebook, vbox, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/color.h b/plug-ins/gimpressionist/color.h
new file mode 100644
index 0000000..51ebdfa
--- /dev/null
+++ b/plug-ins/gimpressionist/color.h
@@ -0,0 +1,32 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __COLOR_H
+#define __COLOR_H
+
+enum COLOR_TYPE_ENUM
+{
+ COLOR_TYPE_AVERAGE = 0,
+ COLOR_TYPE_CENTER = 1,
+};
+
+void create_colorpage (GtkNotebook *);
+void color_restore (void);
+int color_type_input (int in);
+
+#endif /* #ifndef __COLOR_H */
+
diff --git a/plug-ins/gimpressionist/general.c b/plug-ins/gimpressionist/general.c
new file mode 100644
index 0000000..5f58056
--- /dev/null
+++ b/plug-ins/gimpressionist/general.c
@@ -0,0 +1,283 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "infile.h"
+#include "general.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define COLORBUTTONWIDTH 30
+#define COLORBUTTONHEIGHT 20
+
+
+#define NUMGENERALBGRADIO 4
+
+static GtkWidget *general_bg_radio[NUMGENERALBGRADIO];
+static GtkWidget *general_paint_edges = NULL;
+static GtkObject *general_dark_edge_adjust = NULL;
+static GtkWidget *general_tileable;
+static GtkWidget *general_drop_shadow = NULL;
+static GtkWidget *general_color_button;
+static GtkObject *general_shadow_adjust = NULL;
+static GtkObject *general_shadow_depth = NULL;
+static GtkObject *general_shadow_blur = NULL;
+static GtkObject *dev_thresh_adjust = NULL;
+
+static int
+normalize_bg (int n)
+{
+ return (!img_has_alpha && (n == 3)) ? 1 : n;
+}
+
+static void
+general_bg_callback (GtkWidget *wg, void *d)
+{
+ pcvals.general_background_type = normalize_bg (GPOINTER_TO_INT (d));
+}
+
+void
+general_store (void)
+{
+ pcvals.general_paint_edges = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_paint_edges));
+ pcvals.general_dark_edge = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_dark_edge_adjust));
+ pcvals.general_tileable = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_tileable));
+ pcvals.general_drop_shadow = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (general_drop_shadow));
+ pcvals.general_shadow_darkness = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_adjust));
+ pcvals.general_shadow_depth = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_depth));
+ pcvals.general_shadow_blur = gtk_adjustment_get_value (GTK_ADJUSTMENT (general_shadow_blur));
+ pcvals.devthresh = gtk_adjustment_get_value (GTK_ADJUSTMENT (dev_thresh_adjust));
+}
+
+int
+general_bg_type_input (int in)
+{
+ return CLAMP_UP_TO (in, NUMGENERALBGRADIO);
+}
+
+void
+general_restore (void)
+{
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (general_bg_radio[normalize_bg (pcvals.general_background_type)]),
+ TRUE);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_paint_edges),
+ pcvals.general_paint_edges);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (general_dark_edge_adjust),
+ pcvals.general_dark_edge);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_adjust),
+ pcvals.general_shadow_darkness);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_drop_shadow),
+ pcvals.general_drop_shadow);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_depth),
+ pcvals.general_shadow_depth);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (general_shadow_blur),
+ pcvals.general_shadow_blur);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (general_tileable),
+ pcvals.general_tileable);
+ gimp_color_button_set_color (GIMP_COLOR_BUTTON (general_color_button),
+ &pcvals.color);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (dev_thresh_adjust),
+ pcvals.devthresh);
+}
+
+static void
+select_color (GtkWidget *widget, gpointer data)
+{
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (general_bg_radio[BG_TYPE_SOLID]),
+ TRUE);
+}
+
+static GtkWidget *
+create_general_button (GtkWidget *box,
+ int idx,
+ const gchar *label,
+ const gchar *help_string,
+ GSList **radio_group)
+{
+ return create_radio_button (box, idx, general_bg_callback, label,
+ help_string, radio_group, general_bg_radio);
+}
+
+void
+create_generalpage (GtkNotebook *notebook)
+{
+ GtkWidget *box1, *box2, *box3, *box4, *thispage;
+ GtkWidget *label, *tmpw, *frame, *table;
+ GSList * radio_group = NULL;
+
+ label = gtk_label_new_with_mnemonic (_("_General"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ frame = gimp_frame_new (_("Background"));
+ gtk_box_pack_start (GTK_BOX (thispage), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add (GTK_CONTAINER (frame), box3);
+ gtk_widget_show (box3);
+
+ create_general_button (box3,
+ BG_TYPE_KEEP_ORIGINAL,
+ _("Keep original"),
+ _("Preserve the original image as a background"),
+ &radio_group);
+
+ create_general_button (box3,
+ BG_TYPE_FROM_PAPER,
+ _("From paper"),
+ _("Copy the texture of the selected paper as a background"),
+ &radio_group);
+
+ box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0);
+ gtk_widget_show (box4);
+
+ create_general_button (box4,
+ BG_TYPE_SOLID,
+ _("Solid"),
+ _("Solid colored background"),
+ &radio_group);
+
+ general_color_button = gimp_color_button_new (_("Color"),
+ COLORBUTTONWIDTH,
+ COLORBUTTONHEIGHT,
+ &pcvals.color,
+ GIMP_COLOR_AREA_FLAT);
+ g_signal_connect (general_color_button, "clicked",
+ G_CALLBACK (select_color), NULL);
+ g_signal_connect (general_color_button, "color-changed",
+ G_CALLBACK (gimp_color_button_get_color),
+ &pcvals.color);
+ gtk_box_pack_start (GTK_BOX (box4), general_color_button, FALSE, FALSE, 0);
+ gtk_widget_show (general_color_button);
+
+ tmpw = create_general_button (box3,
+ BG_TYPE_TRANSPARENT,
+ _("Transparent"),
+ _("Use a transparent background; Only the strokes painted will be visible"),
+ &radio_group);
+
+ if (!img_has_alpha)
+ gtk_widget_set_sensitive (tmpw, FALSE);
+
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (general_bg_radio[pcvals.general_background_type]), TRUE);
+
+ box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box1, FALSE, FALSE, 0);
+ gtk_widget_show (box1);
+
+ box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
+ gtk_widget_show (box2);
+
+ tmpw = gtk_check_button_new_with_label ( _("Paint edges"));
+ general_paint_edges = tmpw;
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ gimp_help_set_help_data (tmpw,
+ _("Selects if to place strokes all the way out to the edges of the image"),
+ NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.general_paint_edges);
+
+ general_tileable = tmpw = gtk_check_button_new_with_label ( _("Tileable"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ gimp_help_set_help_data (tmpw,
+ _("Selects if the resulting image should be seamlessly tileable"),
+ NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.general_tileable);
+
+ tmpw = gtk_check_button_new_with_label ( _("Drop shadow"));
+ general_drop_shadow = tmpw;
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ gimp_help_set_help_data (tmpw,
+ _("Adds a shadow effect to each brush stroke"),
+ NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.general_drop_shadow);
+
+ table = gtk_table_new (5, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (box1), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ general_dark_edge_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Edge darken:"),
+ 150, 6, pcvals.general_dark_edge,
+ 0.0, 1.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("How much to \"darken\" the edges of each brush stroke"),
+ NULL);
+
+ general_shadow_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Shadow darken:"),
+ 150, 6, pcvals.general_shadow_darkness,
+ 0.0, 99.0, 0.1, 1, 2,
+ TRUE, 0, 0,
+ _("How much to \"darken\" the drop shadow"),
+ NULL);
+
+ general_shadow_depth =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Shadow depth:"),
+ 150, 6, pcvals.general_shadow_depth,
+ 0, 99, 1, 5, 0,
+ TRUE, 0, 0,
+ _("The depth of the drop shadow, i.e. how far apart from the object it should be"),
+ NULL);
+
+ general_shadow_blur =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 3,
+ _("Shadow blur:"),
+ 150, 6, pcvals.general_shadow_blur,
+ 0, 99, 1, 5, 0,
+ TRUE, 0, 0,
+ _("How much to blur the drop shadow"),
+ NULL);
+
+ dev_thresh_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 4,
+ _("Deviation threshold:"),
+ 150, 6, pcvals.devthresh,
+ 0.0, 1.0, 0.01, 0.01, 2,
+ TRUE, 0, 0,
+ _("A bailout-value for adaptive selections"),
+ NULL);
+
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/general.h b/plug-ins/gimpressionist/general.h
new file mode 100644
index 0000000..a706c7e
--- /dev/null
+++ b/plug-ins/gimpressionist/general.h
@@ -0,0 +1,26 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GENERAL_H
+#define __GENERAL_H
+
+void general_restore(void);
+void general_store(void);
+void create_generalpage(GtkNotebook *);
+int general_bg_type_input (int in);
+
+#endif /* #ifndef __GENERAL_H */
diff --git a/plug-ins/gimpressionist/gimp.c b/plug-ins/gimpressionist/gimp.c
new file mode 100644
index 0000000..fea302d
--- /dev/null
+++ b/plug-ins/gimpressionist/gimp.c
@@ -0,0 +1,535 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+
+#include "ppmtool.h"
+#include "infile.h"
+#include "gimpressionist.h"
+#include "preview.h"
+#include "brush.h"
+#include "presets.h"
+#include "random.h"
+#include "orientmap.h"
+#include "size.h"
+
+
+#include "libgimp/stdplugins-intl.h"
+
+static void query (void);
+static void run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals);
+static void gimpressionist_main (void);
+
+
+const GimpPlugInInfo PLUG_IN_INFO = {
+ NULL, /* init_proc */
+ NULL, /* quit_proc */
+ query, /* query_proc */
+ run /* run_proc */
+}; /* PLUG_IN_INFO */
+
+static gint32 drawable_id;
+static ppm_t infile = {0, 0, NULL};
+static ppm_t inalpha = {0, 0, NULL};
+
+
+void
+infile_copy_to_ppm (ppm_t * p)
+{
+ if (!PPM_IS_INITED (&infile))
+ grabarea ();
+
+ ppm_copy (&infile, p);
+}
+
+void
+infile_copy_alpha_to_ppm (ppm_t * p)
+{
+ ppm_copy (&inalpha, p);
+}
+
+MAIN ()
+
+static void
+query (void)
+{
+ static const GimpParamDef args[] =
+ {
+ { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0) }" },
+ { GIMP_PDB_IMAGE, "image", "Input image" },
+ { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
+ { GIMP_PDB_STRING, "preset", "Preset Name" },
+ };
+
+ gimp_install_procedure (PLUG_IN_PROC,
+ N_("Performs various artistic operations"),
+ "Performs various artistic operations on an image",
+ "Vidar Madsen <vidar@prosalg.no>",
+ "Vidar Madsen",
+ PLUG_IN_VERSION,
+ N_("_GIMPressionist..."),
+ "RGB*, GRAY*",
+ GIMP_PLUGIN,
+ G_N_ELEMENTS (args), 0,
+ args, NULL);
+
+ gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Filters/Artistic");
+}
+
+static void
+gimpressionist_get_data (void)
+{
+ restore_default_values ();
+ gimp_get_data (PLUG_IN_PROC, &pcvals);
+}
+
+static void
+run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals)
+{
+ static GimpParam values[2];
+ GimpRunMode run_mode;
+ GimpPDBStatusType status;
+ gboolean with_specified_preset;
+ gchar *preset_name = NULL;
+
+ status = GIMP_PDB_SUCCESS;
+ run_mode = param[0].data.d_int32;
+ with_specified_preset = FALSE;
+
+ if (nparams > 3)
+ {
+ preset_name = param[3].data.d_string;
+ if (strcmp (preset_name, ""))
+ {
+ with_specified_preset = TRUE;
+ }
+ }
+
+ values[0].type = GIMP_PDB_STATUS;
+ values[0].data.d_status = status;
+
+ *nreturn_vals = 1;
+ *return_vals = values;
+
+ INIT_I18N ();
+ gegl_init (NULL, NULL);
+
+ /* Get the active drawable info */
+
+ drawable_id = param[2].data.d_drawable;
+ img_has_alpha = gimp_drawable_has_alpha (drawable_id);
+
+ random_generator = g_rand_new ();
+
+ /*
+ * Check precondition before we open a dialog: Is there a selection
+ * that intersects, OR is there no selection (use entire drawable.)
+ */
+ {
+ gint x1, y1, width, height; /* Not used. */
+
+ if (! gimp_drawable_mask_intersect (drawable_id,
+ &x1, &y1, &width, &height))
+ {
+ values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
+ *nreturn_vals = 2;
+ values[1].type = GIMP_PDB_STRING;
+ values[1].data.d_string = _("The selection does not intersect "
+ "the active layer or mask.");
+
+ return;
+ }
+ }
+
+
+ switch (run_mode)
+ {
+ /*
+ * Note: there's a limitation here. Running this plug-in before the
+ * interactive plug-in was run will cause it to crash, because the
+ * data is uninitialized.
+ * */
+ case GIMP_RUN_INTERACTIVE:
+ case GIMP_RUN_NONINTERACTIVE:
+ case GIMP_RUN_WITH_LAST_VALS:
+ gimpressionist_get_data ();
+ if (run_mode == GIMP_RUN_INTERACTIVE)
+ {
+ if (!create_gimpressionist ())
+ return;
+ }
+ break;
+ default:
+ status = GIMP_PDB_EXECUTION_ERROR;
+ break;
+ }
+ if ((status == GIMP_PDB_SUCCESS) &&
+ (gimp_drawable_is_rgb (drawable_id) ||
+ gimp_drawable_is_gray (drawable_id)))
+ {
+
+ if (with_specified_preset)
+ {
+ /* If select_preset fails - set to an error */
+ if (select_preset (preset_name))
+ {
+ status = GIMP_PDB_EXECUTION_ERROR;
+ }
+ }
+ /* It seems that the value of the run variable is stored in
+ * the preset. I don't know if it's a bug or a feature, but
+ * I just work here and am anxious to get a working version.
+ * So I'm setting it to the correct value here.
+ *
+ * It also seems that defaultpcvals have this erroneous
+ * value as well, so it gets set to FALSE as well. Thus it
+ * is always set to TRUE upon a non-interactive run.
+ * -- Shlomi Fish
+ * */
+ if (run_mode == GIMP_RUN_NONINTERACTIVE)
+ {
+ pcvals.run = TRUE;
+ }
+
+ if (status == GIMP_PDB_SUCCESS)
+ {
+ gimpressionist_main ();
+ gimp_displays_flush ();
+
+ if (run_mode == GIMP_RUN_INTERACTIVE)
+ gimp_set_data (PLUG_IN_PROC,
+ &pcvals,
+ sizeof (gimpressionist_vals_t));
+ }
+ }
+ else if (status == GIMP_PDB_SUCCESS)
+ {
+ status = GIMP_PDB_EXECUTION_ERROR;
+ }
+
+ /* Resources Cleanup */
+ g_rand_free (random_generator);
+ free_parsepath_cache ();
+ brush_reload (NULL, NULL);
+ preview_free_resources ();
+ brush_free ();
+ preset_free ();
+ orientation_map_free_resources ();
+ size_map_free_resources ();
+
+ values[0].data.d_status = status;
+}
+
+static const Babl *
+get_u8_format (gint32 drawable_id)
+{
+ if (gimp_drawable_is_rgb (drawable_id))
+ {
+ if (gimp_drawable_has_alpha (drawable_id))
+ return babl_format ("R'G'B'A u8");
+ else
+ return babl_format ("R'G'B' u8");
+ }
+ else
+ {
+ if (gimp_drawable_has_alpha (drawable_id))
+ return babl_format ("Y'A u8");
+ else
+ return babl_format ("Y' u8");
+ }
+}
+
+void
+grabarea (void)
+{
+ GeglBuffer *src_buffer;
+ GeglBufferIterator *iter;
+ const Babl *format;
+ gint bpp;
+ ppm_t *p;
+ gint x1, y1;
+ gint x, y;
+ gint width, height;
+ gint row, col;
+ gint rowstride;
+
+ if (! gimp_drawable_mask_intersect (drawable_id,
+ &x1, &y1, &width, &height))
+ return;
+
+ ppm_new (&infile, width, height);
+ p = &infile;
+
+ format = get_u8_format (drawable_id);
+ bpp = babl_format_get_bytes_per_pixel (format);
+
+ if (gimp_drawable_has_alpha (drawable_id))
+ ppm_new (&inalpha, width, height);
+
+ rowstride = p->width * 3;
+
+ src_buffer = gimp_drawable_get_buffer (drawable_id);
+
+ iter = gegl_buffer_iterator_new (src_buffer,
+ GEGL_RECTANGLE (x1, y1, width, height), 0,
+ format,
+ GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+ GeglRectangle roi = iter->items[0].roi;
+ const guchar *src = iter->items[0].data;
+
+ switch (bpp)
+ {
+ case 1:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ const guchar *s = src;
+ guchar *tmprow = p->col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+
+ tmprow[k + 0] = s[0];
+ tmprow[k + 1] = s[0];
+ tmprow[k + 2] = s[0];
+
+ s++;
+ }
+
+ src += bpp * roi.width;
+ }
+ break;
+
+ case 2:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ const guchar *s = src;
+ guchar *tmprow = p->col + row * rowstride;
+ guchar *tmparow = inalpha.col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+
+ tmprow[k + 0] = s[0];
+ tmprow[k + 1] = s[0];
+ tmprow[k + 2] = s[0];
+ tmparow[k] = 255 - s[1];
+
+ s += 2;
+ }
+
+ src += bpp * roi.width;
+ }
+ break;
+
+ case 3:
+ col = roi.x - x1;
+
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ memcpy (p->col + row * rowstride + col * 3, src, roi.width * 3);
+
+ src += bpp * roi.width;
+ }
+ break;
+
+ case 4:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ const guchar *s = src;
+ guchar *tmprow = p->col + row * rowstride;
+ guchar *tmparow = inalpha.col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+
+ tmprow[k + 0] = s[0];
+ tmprow[k + 1] = s[1];
+ tmprow[k + 2] = s[2];
+ tmparow[k] = 255 - s[3];
+
+ s += 4;
+ }
+
+ src += bpp * roi.width;
+ }
+ break;
+ }
+ }
+
+ g_object_unref (src_buffer);
+}
+
+static void
+gimpressionist_main (void)
+{
+ GeglBuffer *dest_buffer;
+ GeglBufferIterator *iter;
+ const Babl *format;
+ gint bpp;
+ ppm_t *p;
+ gint x1, y1;
+ gint x, y;
+ gint width, height;
+ gint row, col;
+ gint rowstride;
+ glong done = 0;
+ glong total;
+
+ if (! gimp_drawable_mask_intersect (drawable_id,
+ &x1, &y1, &width, &height))
+ return;
+
+ total = width * height;
+
+ format = get_u8_format (drawable_id);
+ bpp = babl_format_get_bytes_per_pixel (format);
+
+ gimp_progress_init (_("Painting"));
+
+ if (! PPM_IS_INITED (&infile))
+ grabarea ();
+
+ repaint (&infile, (img_has_alpha) ? &inalpha : NULL);
+
+ p = &infile;
+
+ rowstride = p->width * 3;
+
+ dest_buffer = gimp_drawable_get_shadow_buffer (drawable_id);
+
+ iter = gegl_buffer_iterator_new (dest_buffer,
+ GEGL_RECTANGLE (x1, y1, width, height), 0,
+ format,
+ GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+
+ while (gegl_buffer_iterator_next (iter))
+ {
+ GeglRectangle roi = iter->items[0].roi;
+ guchar *dest = iter->items[0].data;
+
+ switch (bpp)
+ {
+ case 1:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ guchar *d = dest;
+ const guchar *tmprow = p->col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+
+ *d++ = GIMP_RGB_LUMINANCE (tmprow[k + 0],
+ tmprow[k + 1],
+ tmprow[k + 2]);
+ }
+
+ dest += bpp * roi.width;
+ }
+ break;
+
+ case 2:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ guchar *d = dest;
+ const guchar *tmprow = p->col + row * rowstride;
+ const guchar *tmparow = inalpha.col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+ gint value = GIMP_RGB_LUMINANCE (tmprow[k + 0],
+ tmprow[k + 1],
+ tmprow[k + 2]);
+
+ d[0] = value;
+ d[1] = 255 - tmparow[k];
+
+ d += 2;
+ }
+
+ dest += bpp * roi.width;
+ }
+ break;
+
+ case 3:
+ col = roi.x - x1;
+
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ memcpy (dest, p->col + row * rowstride + col * 3, roi.width * 3);
+
+ dest += bpp * roi.width;
+ }
+ break;
+
+ case 4:
+ for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
+ {
+ guchar *d = dest;
+ const guchar *tmprow = p->col + row * rowstride;
+ const guchar *tmparow = inalpha.col + row * rowstride;
+
+ for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
+ {
+ gint k = col * 3;
+
+ d[0] = tmprow[k + 0];
+ d[1] = tmprow[k + 1];
+ d[2] = tmprow[k + 2];
+ d[3] = 255 - tmparow[k];
+
+ d += 4;
+ }
+
+ dest += bpp * roi.width;
+ }
+ break;
+ }
+
+ done += roi.width * roi.height;
+
+ gimp_progress_update (0.8 + 0.2 * done / total);
+ }
+
+ g_object_unref (dest_buffer);
+
+ gimp_progress_update (1.0);
+
+ gimp_drawable_merge_shadow (drawable_id, TRUE);
+ gimp_drawable_update (drawable_id, x1, y1, width, height);
+}
diff --git a/plug-ins/gimpressionist/gimpressionist.c b/plug-ins/gimpressionist/gimpressionist.c
new file mode 100644
index 0000000..905149b
--- /dev/null
+++ b/plug-ins/gimpressionist/gimpressionist.c
@@ -0,0 +1,207 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+/*
+ * The Page Specific Imports
+ * */
+#include "brush.h"
+#include "color.h"
+#include "general.h"
+#include "orientation.h"
+#include "orientmap.h"
+#include "placement.h"
+#include "preview.h"
+#include "size.h"
+#include "paper.h"
+#include "presets.h"
+
+#include "ppmtool.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+static GtkWidget *dialog = NULL;
+
+void
+store_values (void)
+{
+ paper_store ();
+ brush_store ();
+ general_store ();
+}
+
+void
+restore_values (void)
+{
+ brush_restore ();
+ paper_restore ();
+ orientation_restore ();
+ size_restore ();
+ place_restore ();
+ general_restore ();
+ color_restore ();
+
+ update_orientmap_dialog ();
+}
+
+GtkWidget *
+create_one_column_list (GtkWidget *parent,
+ void (*changed_cb) (GtkTreeSelection *selection,
+ gpointer data))
+{
+ GtkListStore *store;
+ GtkTreeSelection *selection;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkWidget *swin, *view;
+
+ swin = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
+ GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (parent), swin, FALSE, FALSE, 0);
+ gtk_widget_show (swin);
+ gtk_widget_set_size_request (swin, 150,-1);
+
+ store = gtk_list_store_new (1, G_TYPE_STRING);
+ view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
+ g_object_unref (store);
+ gtk_widget_show (view);
+
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("Preset", renderer,
+ "text", 0,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+
+ gtk_container_add (GTK_CONTAINER (swin), view);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+ g_signal_connect (selection, "changed", G_CALLBACK (changed_cb), NULL);
+
+ return view;
+}
+
+static void
+dialog_response (GtkWidget *widget,
+ gint response_id,
+ gpointer data)
+{
+ switch (response_id)
+ {
+ case GTK_RESPONSE_OK:
+ store_values ();
+ pcvals.run = TRUE;
+ gtk_widget_destroy (widget);
+ break;
+
+ default:
+ gtk_widget_destroy (widget);
+ break;
+ }
+}
+
+static GtkWidget *
+create_dialog (void)
+{
+ GtkWidget *notebook;
+ GtkWidget *hbox;
+ GtkWidget *preview_box;
+
+ gimp_ui_init (PLUG_IN_BINARY, TRUE);
+
+ dialog = gimp_dialog_new (_("GIMPressionist"), PLUG_IN_ROLE,
+ NULL, 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ gimp_window_set_transient (GTK_WINDOW (dialog));
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (dialog_response),
+ NULL);
+ g_signal_connect (dialog, "destroy",
+ G_CALLBACK (gtk_main_quit),
+ NULL);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+ hbox, TRUE, TRUE, 0);
+ gtk_widget_show (hbox);
+
+ preview_box = create_preview ();
+ gtk_box_pack_start (GTK_BOX (hbox), preview_box, FALSE, FALSE, 0);
+ gtk_widget_show (preview_box);
+
+ notebook = gtk_notebook_new ();
+ gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 5);
+ gtk_widget_show (notebook);
+
+ create_presetpage (GTK_NOTEBOOK (notebook));
+ create_paperpage (GTK_NOTEBOOK (notebook));
+ create_brushpage (GTK_NOTEBOOK (notebook));
+ create_orientationpage (GTK_NOTEBOOK (notebook));
+ create_sizepage (GTK_NOTEBOOK (notebook));
+ create_placementpage (GTK_NOTEBOOK (notebook));
+ create_colorpage (GTK_NOTEBOOK (notebook));
+ create_generalpage (GTK_NOTEBOOK (notebook));
+
+ updatepreview (NULL, NULL);
+
+ /*
+ * This is to make sure the values from the pcvals will be reflected
+ * in the GUI here. Otherwise they will be set to the defaults.
+ * */
+ restore_values ();
+
+ gtk_widget_show (dialog);
+
+ return dialog;
+}
+
+gint
+create_gimpressionist (void)
+{
+ pcvals.run = FALSE;
+
+ create_dialog ();
+
+ gtk_main ();
+
+ return pcvals.run;
+}
diff --git a/plug-ins/gimpressionist/gimpressionist.h b/plug-ins/gimpressionist/gimpressionist.h
new file mode 100644
index 0000000..ba944e0
--- /dev/null
+++ b/plug-ins/gimpressionist/gimpressionist.h
@@ -0,0 +1,181 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMPRESSIONIST_H
+#define __GIMPRESSIONIST_H
+
+/* Includes necessary for the correct processing of this file. */
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "ppmtool.h"
+/* Defines */
+
+#define PLUG_IN_PROC "plug-in-gimpressionist"
+#define PLUG_IN_VERSION "v1.0, November 2003"
+#define PLUG_IN_BINARY "gimpressionist"
+#define PLUG_IN_ROLE "gimp-gimpressionist"
+
+#define PREVIEWSIZE 150
+#define MAXORIENTVECT 50
+#define MAXSIZEVECT 50
+
+/* Type declaration and definitions */
+
+typedef struct vector
+{
+ double x, y;
+ double dir;
+ double dx, dy;
+ double str;
+ int type;
+} vector_t;
+
+typedef struct smvector
+{
+ double x, y;
+ double siz;
+ double str;
+} smvector_t;
+
+typedef struct
+{
+ int orient_num;
+ double orient_first;
+ double orient_last;
+ int orient_type;
+ double brush_relief;
+ double brush_scale;
+ double brush_density;
+ double brushgamma;
+ int general_background_type;
+ double general_dark_edge;
+ double paper_relief;
+ double paper_scale;
+ int paper_invert;
+ int run;
+ char selected_brush[200];
+ char selected_paper[200];
+ GimpRGB color;
+ int general_paint_edges;
+ int place_type;
+ vector_t orient_vectors[MAXORIENTVECT];
+ int num_orient_vectors;
+ int placement_center;
+ double brush_aspect;
+ double orient_angle_offset;
+ double orient_strength_exponent;
+ int general_tileable;
+ int paper_overlay;
+ int orient_voronoi;
+ int color_brushes;
+ int general_drop_shadow;
+ double general_shadow_darkness;
+ int size_num;
+ double size_first;
+ double size_last;
+ int size_type;
+ double devthresh;
+
+ smvector_t size_vectors[MAXSIZEVECT];
+ int num_size_vectors;
+ double size_strength_exponent;
+ int size_voronoi;
+
+ int general_shadow_depth;
+ int general_shadow_blur;
+
+ int color_type;
+ double color_noise;
+} gimpressionist_vals_t;
+
+/* Enumerations */
+
+enum GENERAL_BG_TYPE_ENUM
+{
+ BG_TYPE_SOLID = 0,
+ BG_TYPE_KEEP_ORIGINAL = 1,
+ BG_TYPE_FROM_PAPER = 2,
+ BG_TYPE_TRANSPARENT = 3,
+};
+
+enum PRESETS_LIST_COLUMN_ENUM
+{
+ PRESETS_LIST_COLUMN_FILENAME = 0,
+ PRESETS_LIST_COLUMN_OBJECT_NAME = 1,
+};
+
+/* Globals */
+
+extern gimpressionist_vals_t pcvals;
+
+
+/* Prototypes */
+
+GList *parsepath (void);
+void free_parsepath_cache (void);
+
+void grabarea (void);
+void store_values (void);
+void restore_values (void);
+gchar *findfile (const gchar *);
+
+void unselectall (GtkWidget *list);
+void reselect (GtkWidget *list, char *fname);
+void readdirintolist (const char *subdir, GtkWidget *view, char *selected);
+void readdirintolist_extended (const char *subdir,
+ GtkWidget *view, char *selected,
+ gboolean with_filename_column,
+ gchar *(*get_object_name_cb) (const gchar *dir,
+ gchar *filename,
+ void *context),
+ void * context);
+
+GtkWidget *create_one_column_list (GtkWidget *parent,
+ void (*changed_cb)
+ (GtkTreeSelection *selection,
+ gpointer data));
+
+void brush_reload (const gchar *fn, struct ppm *p);
+
+double get_direction (double x, double y, int from);
+
+void create_sizemap_dialog (GtkWidget *parent);
+double getsiz_proto (double x, double y, int n, smvector_t *vec,
+ double smstrexp, int voronoi);
+
+
+void set_colorbrushes (const gchar *fn);
+int create_gimpressionist (void);
+
+double dist (double x, double y, double dx, double dy);
+
+void restore_default_values (void);
+
+GtkWidget *create_radio_button (GtkWidget *box, int orient_type,
+ void (*callback)(GtkWidget *wg, void *d),
+ const gchar *label,
+ const gchar *help_string,
+ GSList **radio_group,
+ GtkWidget **buttons_array
+ );
+
+#define CLAMP_UP_TO(x, max) (CLAMP((x),(0),(max-1)))
+
+#endif /* #ifndef __GIMPRESSIONIST_H */
+
+
diff --git a/plug-ins/gimpressionist/globals.c b/plug-ins/gimpressionist/globals.c
new file mode 100644
index 0000000..8b4bf5e
--- /dev/null
+++ b/plug-ins/gimpressionist/globals.c
@@ -0,0 +1,86 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+
+gboolean img_has_alpha = FALSE;
+GRand *random_generator;
+gimpressionist_vals_t pcvals;
+
+/*
+ * The default values for the application, to be initialized at startup.
+ * */
+static const gimpressionist_vals_t defaultpcvals = {
+ 4,
+ 0.0,
+ 60.0,
+ 0,
+ 12.0,
+ 20.0,
+ 20.0,
+ 1.0,
+ 1,
+ 0.1,
+ 0.0,
+ 30.0,
+ 0,
+ 0,
+ "defaultbrush.pgm",
+ "defaultpaper.pgm",
+ {0,0,0,1.0},
+ 1,
+ 0,
+ { { 0.5, 0.5, 0.0, 0.0, 1.0, 1.0, 0 } },
+ 1,
+ 0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 20.0,
+ 1,
+ 10.0,
+ 20.0,
+ 0,
+ 0.1,
+
+ { { 0.5, 0.5, 50.0, 1.0 } },
+ 1,
+ 1.0,
+ 0,
+
+ 10,
+ 4,
+
+ 0, 0.0
+};
+
+void
+restore_default_values (void)
+{
+ pcvals = defaultpcvals;
+}
diff --git a/plug-ins/gimpressionist/infile.h b/plug-ins/gimpressionist/infile.h
new file mode 100644
index 0000000..b263428
--- /dev/null
+++ b/plug-ins/gimpressionist/infile.h
@@ -0,0 +1,32 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __INFILE_H
+#define __INFILE_H
+
+#include "ppmtool.h"
+
+/* Globals */
+
+extern gboolean img_has_alpha;
+
+/* Prototypes */
+
+void infile_copy_to_ppm(ppm_t * p);
+void infile_copy_alpha_to_ppm(ppm_t * p);
+
+#endif
diff --git a/plug-ins/gimpressionist/orientation.c b/plug-ins/gimpressionist/orientation.c
new file mode 100644
index 0000000..1a5183d
--- /dev/null
+++ b/plug-ins/gimpressionist/orientation.c
@@ -0,0 +1,206 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "orientation.h"
+#include "orientmap.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+static GtkWidget *orient_radio[NUMORIENTRADIO];
+static GtkObject *orient_num_adjust = NULL;
+static GtkObject *orient_first_adjust = NULL;
+static GtkObject *orient_last_adjust = NULL;
+
+
+static void
+orientation_store (GtkWidget *wg, void *d)
+{
+ pcvals.orient_type = GPOINTER_TO_INT (d);
+}
+
+int orientation_type_input (int in)
+{
+ return CLAMP_UP_TO (in, NUMORIENTRADIO);
+}
+
+void orientation_restore (void)
+{
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (orient_radio[pcvals.orient_type]),
+ TRUE);
+ gtk_adjustment_set_value (
+ GTK_ADJUSTMENT (orient_num_adjust),
+ pcvals.orient_num);
+ gtk_adjustment_set_value (
+ GTK_ADJUSTMENT (orient_first_adjust),
+ pcvals.orient_first);
+ gtk_adjustment_set_value (
+ GTK_ADJUSTMENT (orient_last_adjust),
+ pcvals.orient_last);
+}
+
+static void
+create_orientmap_dialog_helper (GtkWidget *widget)
+{
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (orient_radio[7]), TRUE);
+
+ create_orientmap_dialog (widget);
+}
+
+
+static void
+create_orientradio_button (GtkWidget *box,
+ int orient_type,
+ const gchar *label,
+ const gchar *help_string,
+ GSList **radio_group)
+{
+ create_radio_button (box, orient_type, orientation_store, label,
+ help_string, radio_group, orient_radio);
+}
+
+void
+create_orientationpage (GtkNotebook *notebook)
+{
+ GtkWidget *box2, *box3, *box4, *thispage;
+ GtkWidget *label, *tmpw, *table;
+ GSList *radio_group = NULL;
+
+ label = gtk_label_new_with_mnemonic (_("Or_ientation"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ orient_num_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Directions:"),
+ 150, -1, pcvals.orient_num,
+ 1.0, 30.0, 1.0, 1.0, 0,
+ TRUE, 0, 0,
+ _("The number of directions (i.e. brushes) to use"),
+ NULL);
+ g_signal_connect (orient_num_adjust, "value-changed",
+ G_CALLBACK (gimp_int_adjustment_update),
+ &pcvals.orient_num);
+
+ orient_first_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Start angle:"),
+ 150, -1, pcvals.orient_first,
+ 0.0, 360.0, 1.0, 10.0, 0,
+ TRUE, 0, 0,
+ _("The starting angle of the first brush to create"),
+ NULL);
+ g_signal_connect (orient_first_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.orient_first);
+
+ orient_last_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Angle span:"),
+ 150, -1, pcvals.orient_last,
+ 0.0, 360.0, 1.0, 10.0, 0,
+ TRUE, 0, 0,
+ _("The angle span of the first brush to create"),
+ NULL);
+ g_signal_connect (orient_last_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.orient_last);
+
+ box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box2, FALSE, FALSE, 0);
+ gtk_widget_show (box2);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0);
+ gtk_widget_show (box3);
+
+ tmpw = gtk_label_new (_("Orientation:"));
+ gtk_box_pack_start (GTK_BOX (box3), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0);
+ gtk_widget_show (box3);
+
+ create_orientradio_button (box3, ORIENTATION_VALUE, _("Value"),
+ _("Let the value (brightness) of the region determine the direction of the stroke"),
+ &radio_group);
+
+ create_orientradio_button (box3, ORIENTATION_RADIUS, _("Radius"),
+ _("The distance from the center of the image determines the direction of the stroke"),
+ &radio_group);
+
+ create_orientradio_button (box3, ORIENTATION_RANDOM, _("Random"),
+ _("Selects a random direction of each stroke"),
+ &radio_group);
+
+ create_orientradio_button (box3, ORIENTATION_RADIAL, _("Radial"),
+ _("Let the direction from the center determine the direction of the stroke"),
+ &radio_group);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0);
+ gtk_widget_show (box3);
+
+ create_orientradio_button (box3, ORIENTATION_FLOWING, _("Flowing"),
+ _("The strokes follow a \"flowing\" pattern"),
+ &radio_group);
+
+ create_orientradio_button (box3, ORIENTATION_HUE, _("Hue"),
+ _("The hue of the region determines the direction of the stroke"),
+ &radio_group);
+
+ create_orientradio_button (box3, ORIENTATION_ADAPTIVE, _("Adaptive"),
+ _("The direction that matches the original image the closest is selected"),
+ &radio_group);
+
+ box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0);
+ gtk_widget_show (box4);
+
+ create_orientradio_button (box4, ORIENTATION_MANUAL, _("Manual"),
+ _("Manually specify the stroke orientation"),
+ &radio_group);
+
+ orientation_restore ();
+
+ tmpw = gtk_button_new_with_mnemonic (_("_Edit"));
+ gtk_box_pack_start (GTK_BOX (box4), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (create_orientmap_dialog_helper), NULL);
+ gimp_help_set_help_data
+ (tmpw, _("Opens up the Orientation Map Editor"), NULL);
+
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/orientation.h b/plug-ins/gimpressionist/orientation.h
new file mode 100644
index 0000000..6355f59
--- /dev/null
+++ b/plug-ins/gimpressionist/orientation.h
@@ -0,0 +1,39 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __ORIENTATION_H
+#define __ORIENTATION_H
+
+#define NUMORIENTRADIO 8
+
+enum ORIENTATION_ENUM
+{
+ ORIENTATION_VALUE = 0,
+ ORIENTATION_RADIUS = 1,
+ ORIENTATION_RANDOM = 2,
+ ORIENTATION_RADIAL = 3,
+ ORIENTATION_FLOWING = 4,
+ ORIENTATION_HUE = 5,
+ ORIENTATION_ADAPTIVE = 6,
+ ORIENTATION_MANUAL = 7,
+};
+
+void create_orientationpage (GtkNotebook *);
+void orientation_restore (void);
+int orientation_type_input (int in);
+
+#endif /* #ifndef __ORIENTATION_H */
diff --git a/plug-ins/gimpressionist/orientmap.c b/plug-ins/gimpressionist/orientmap.c
new file mode 100644
index 0000000..1b8b765
--- /dev/null
+++ b/plug-ins/gimpressionist/orientmap.c
@@ -0,0 +1,717 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "infile.h"
+
+#include "preview.h"
+
+#include "orientmap.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+#define NUMVECTYPES 4
+
+static GtkWidget *orient_map_window;
+
+static GtkWidget *vector_preview;
+static GtkWidget *orient_map_preview_prev;
+static GtkWidget *prev_button;
+static GtkWidget *next_button;
+static GtkWidget *add_button;
+static GtkWidget *kill_button;
+static GtkAdjustment *vector_preview_brightness_adjust = NULL;
+
+static GtkAdjustment *angle_adjust = NULL;
+static GtkAdjustment *strength_adjust = NULL;
+static GtkAdjustment *orient_map_str_exp_adjust = NULL;
+static GtkAdjustment *angle_offset_adjust = NULL;
+static GtkWidget *vector_types[NUMVECTYPES];
+static GtkWidget *orient_voronoi = NULL;
+
+#define OMWIDTH 150
+#define OMHEIGHT 150
+
+static vector_t vector[MAXORIENTVECT];
+static gint num_vectors = 0;
+static gint vector_type;
+
+static ppm_t update_om_preview_nbuffer = {0, 0, NULL};
+
+static gint selectedvector = 0;
+static ppm_t update_vector_preview_backup = {0, 0, NULL};
+static ppm_t update_vector_preview_buffer = {0, 0, NULL};
+
+static gboolean adjignore = FALSE;
+
+double get_direction (double x, double y, int from)
+{
+ gint i;
+ gint n;
+ gint voronoi;
+ gdouble sum, dx, dy, dst;
+ vector_t *vec;
+ gdouble angoff, strexp;
+ gint first = 0, last;
+
+ if (from == 0)
+ {
+ n = num_vectors;
+ vec = vector;
+ angoff = gtk_adjustment_get_value (angle_offset_adjust);
+ strexp = gtk_adjustment_get_value (orient_map_str_exp_adjust);
+ voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (orient_voronoi));
+ }
+ else
+ {
+ n = pcvals.num_orient_vectors;
+ vec = pcvals.orient_vectors;
+ angoff = pcvals.orient_angle_offset;
+ strexp = pcvals.orient_strength_exponent;
+ voronoi = pcvals.orient_voronoi;
+ }
+
+ if (voronoi)
+ {
+ gdouble bestdist = -1.0;
+
+ for (i = 0; i < n; i++)
+ {
+ dst = dist (x,y,vec[i].x,vec[i].y);
+
+ if ((bestdist < 0.0) || (dst < bestdist))
+ {
+ bestdist = dst;
+ first = i;
+ }
+ }
+ last = first+1;
+ }
+ else
+ {
+ first = 0;
+ last = n;
+ }
+
+ dx = dy = 0.0;
+ sum = 0.0;
+ for (i = first; i < last; i++)
+ {
+ gdouble s = vec[i].str;
+ gdouble tx = 0.0, ty = 0.0;
+
+ if (vec[i].type == 0)
+ {
+ tx = vec[i].dx;
+ ty = vec[i].dy;
+ }
+ else if (vec[i].type == 1)
+ {
+ gdouble a = atan2 (vec[i].dy, vec[i].dx);
+
+ a -= atan2 (y-vec[i].y, x-vec[i].x);
+ tx = sin (a + G_PI_2);
+ ty = cos (a + G_PI_2);
+ }
+ else if (vec[i].type == 2)
+ {
+ gdouble a = atan2 (vec[i].dy, vec[i].dx);
+
+ a += atan2 (y-vec[i].y, x-vec[i].x);
+ tx = sin (a + G_PI_2);
+ ty = cos (a + G_PI_2);
+ }
+ else if (vec[i].type == 3)
+ {
+ gdouble a = atan2 (vec[i].dy, vec[i].dx);
+
+ a -= atan2 (y-vec[i].y, x-vec[i].x)*2;
+ tx = sin (a + G_PI_2);
+ ty = cos (a + G_PI_2);
+ }
+
+ dst = dist (x,y,vec[i].x,vec[i].y);
+ dst = pow (dst, strexp);
+
+ if (dst < 0.0001)
+ dst = 0.0001;
+ s = s / dst;
+
+ dx += tx * s;
+ dy += ty * s;
+ sum += s;
+ }
+ dx = dx / sum;
+ dy = dy / sum;
+
+ return 90 - (gimp_rad_to_deg (atan2 (dy, dx)) + angoff);
+}
+
+static void
+update_orient_map_preview_prev (void)
+{
+ int x, y;
+ guchar black[3] = {0, 0, 0};
+ guchar gray[3] = {120, 120, 120};
+ guchar white[3] = {255, 255, 255};
+
+ if (!PPM_IS_INITED (&update_om_preview_nbuffer))
+ ppm_new (&update_om_preview_nbuffer,OMWIDTH,OMHEIGHT);
+
+ fill (&update_om_preview_nbuffer, black);
+
+ for (y = 6; y < OMHEIGHT-4; y += 10)
+ for (x = 6; x < OMWIDTH-4; x += 10)
+ {
+ double dir =
+ gimp_deg_to_rad (get_direction (x / (double)OMWIDTH,
+ y / (double)OMHEIGHT,0));
+ double xo = sin (dir) * 4.0;
+ double yo = cos (dir) * 4.0;
+ ppm_drawline (&update_om_preview_nbuffer,
+ x - xo, y - yo, x + xo, y + yo,
+ gray);
+ ppm_put_rgb (&update_om_preview_nbuffer,
+ x - xo, y - yo,
+ white);
+ }
+
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (orient_map_preview_prev),
+ 0, 0, OMWIDTH, OMHEIGHT,
+ GIMP_RGB_IMAGE,
+ (guchar *)update_om_preview_nbuffer.col,
+ OMWIDTH * 3);
+
+ gtk_widget_queue_draw (orient_map_preview_prev);
+
+ gtk_widget_set_sensitive (prev_button, (num_vectors > 1));
+ gtk_widget_set_sensitive (next_button, (num_vectors > 1));
+ gtk_widget_set_sensitive (add_button, (num_vectors < MAXORIENTVECT));
+ gtk_widget_set_sensitive (kill_button, (num_vectors > 1));
+}
+
+static void
+update_vector_prev (void)
+{
+ static gint ok = 0;
+ gint i, x, y;
+ gdouble dir, xo, yo;
+ gdouble val;
+ static gdouble last_val = 0.0;
+ guchar gray[3] = {120, 120, 120};
+ guchar red[3] = {255, 0, 0};
+ guchar white[3] = {255, 255, 255};
+
+ if (vector_preview_brightness_adjust)
+ val = 1.0 - gtk_adjustment_get_value (vector_preview_brightness_adjust) / 100.0;
+ else
+ val = 0.5;
+
+ if (!ok || (val != last_val))
+ {
+ infile_copy_to_ppm (&update_vector_preview_backup);
+ ppm_apply_brightness (&update_vector_preview_backup, val, 1,1,1);
+
+ if ((update_vector_preview_backup.width != OMWIDTH) ||
+ (update_vector_preview_backup.height != OMHEIGHT))
+ resize_fast (&update_vector_preview_backup, OMWIDTH, OMHEIGHT);
+ ok = 1;
+ }
+ ppm_copy (&update_vector_preview_backup, &update_vector_preview_buffer);
+
+ for (i = 0; i < num_vectors; i++)
+ {
+ gdouble s;
+
+ x = vector[i].x * OMWIDTH;
+ y = vector[i].y * OMHEIGHT;
+ dir = gimp_deg_to_rad (vector[i].dir);
+ s = gimp_deg_to_rad (vector[i].str);
+ xo = sin (dir) * (6.0+100*s);
+ yo = cos (dir) * (6.0+100*s);
+
+ if (i == selectedvector)
+ {
+ ppm_drawline (&update_vector_preview_buffer,
+ x - xo, y - yo, x + xo, y + yo, red);
+ }
+ else
+ {
+ ppm_drawline (&update_vector_preview_buffer,
+ x - xo, y - yo, x + xo, y + yo, gray);
+ }
+ ppm_put_rgb (&update_vector_preview_buffer, x - xo, y - yo, white);
+ }
+
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (vector_preview),
+ 0, 0, OMWIDTH, OMHEIGHT,
+ GIMP_RGB_IMAGE,
+ (guchar *)update_vector_preview_buffer.col,
+ OMWIDTH * 3);
+}
+
+void
+orientation_map_free_resources (void)
+{
+ ppm_kill (&update_om_preview_nbuffer);
+ ppm_kill (&update_vector_preview_backup);
+ ppm_kill (&update_vector_preview_buffer);
+}
+
+static void
+update_slides (void)
+{
+ gint type;
+
+ adjignore = TRUE;
+ gtk_adjustment_set_value (angle_adjust, vector[selectedvector].dir);
+ gtk_adjustment_set_value (strength_adjust, vector[selectedvector].str);
+ type = vector[selectedvector].type;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (vector_types[type]), TRUE);
+ adjignore = FALSE;
+}
+
+static void
+prev_click_callback (GtkWidget *w, gpointer data)
+{
+ selectedvector--;
+ if (selectedvector < 0)
+ selectedvector = num_vectors-1;
+ update_slides ();
+ update_vector_prev ();
+}
+
+static void
+next_click_callback (GtkWidget *w, gpointer data)
+{
+ selectedvector++;
+ if (selectedvector == num_vectors) selectedvector = 0;
+ update_slides ();
+ update_vector_prev ();
+}
+
+static void
+add_new_vector (gdouble x, gdouble y)
+{
+ vector[num_vectors].x = x;
+ vector[num_vectors].y = y;
+ vector[num_vectors].dir = 0.0;
+ vector[num_vectors].dx = sin (gimp_deg_to_rad (0.0));
+ vector[num_vectors].dy = cos (gimp_deg_to_rad (0.0));
+ vector[num_vectors].str = 1.0;
+ vector[num_vectors].type = 0;
+ selectedvector = num_vectors;
+ num_vectors++;
+}
+
+static void
+add_click_callback (GtkWidget *w, gpointer data)
+{
+ add_new_vector (0.5, 0.5);
+ update_slides ();
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+delete_click_callback (GtkWidget *w, gpointer data)
+{
+ int i;
+
+ for (i = selectedvector; i < num_vectors-1; i++)
+ vector[i] = vector[i + 1];
+
+ num_vectors--;
+
+ if (selectedvector >= num_vectors) selectedvector = 0;
+ update_slides ();
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+map_click_callback (GtkWidget *w, GdkEventButton *event)
+{
+ if (event->button == 1)
+ {
+ vector[selectedvector].x = event->x / (double)OMWIDTH;
+ vector[selectedvector].y = event->y / (double)OMHEIGHT;
+ }
+ else if (event->button == 2)
+ {
+ if (num_vectors + 1 == MAXORIENTVECT)
+ return;
+ add_new_vector (event->x / (double)OMWIDTH,
+ event->y / (double)OMHEIGHT);
+ update_slides ();
+
+ }
+ else if (event->button == 3)
+ {
+ gdouble d;
+
+ d = atan2 (OMWIDTH * vector[selectedvector].x - event->x,
+ OMHEIGHT * vector[selectedvector].y - event->y);
+ vector[selectedvector].dir = gimp_rad_to_deg (d);
+ vector[selectedvector].dx = sin (d);
+ vector[selectedvector].dy = cos (d);
+ update_slides ();
+ }
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+angle_adjust_move_callback (GtkWidget *w, gpointer data)
+{
+ if (adjignore)
+ return;
+ vector[selectedvector].dir = gtk_adjustment_get_value (angle_adjust);
+ vector[selectedvector].dx =
+ sin (gimp_deg_to_rad (vector[selectedvector].dir));
+ vector[selectedvector].dy =
+ cos (gimp_deg_to_rad (vector[selectedvector].dir));
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+strength_adjust_move_callback (GtkWidget *w, gpointer data)
+{
+ if (adjignore)
+ return;
+ vector[selectedvector].str = gtk_adjustment_get_value (strength_adjust);
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+strength_exponent_adjust_move_callback (GtkWidget *w, gpointer data)
+{
+ if (adjignore)
+ return;
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+angle_offset_adjust_move_callback (GtkWidget *w, gpointer data)
+{
+ if (adjignore)
+ return;
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+vector_type_click_callback (GtkWidget *w, gpointer data)
+{
+ if (adjignore)
+ return;
+
+ gimp_radio_button_update (w, data);
+ vector[selectedvector].type = vector_type;
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+static void
+orient_map_response (GtkWidget *widget,
+ gint response_id,
+ gpointer data)
+{
+ switch (response_id)
+ {
+ case GTK_RESPONSE_APPLY:
+ case GTK_RESPONSE_OK:
+ {
+ gint i;
+
+ for (i = 0; i < num_vectors; i++)
+ pcvals.orient_vectors[i] = vector[i];
+
+ pcvals.num_orient_vectors = num_vectors;
+ pcvals.orient_strength_exponent = gtk_adjustment_get_value (orient_map_str_exp_adjust);
+ pcvals.orient_angle_offset = gtk_adjustment_get_value (angle_offset_adjust);
+ pcvals.orient_voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (orient_voronoi));
+ }
+ };
+
+ if (response_id != GTK_RESPONSE_APPLY)
+ gtk_widget_hide (widget);
+}
+
+static void
+init_vectors (void)
+{
+ if (pcvals.num_orient_vectors)
+ {
+ gint i;
+
+ num_vectors = pcvals.num_orient_vectors;
+ for (i = 0; i < num_vectors; i++)
+ vector[i] = pcvals.orient_vectors[i];
+ }
+ else
+ {/* Shouldn't happen */
+ num_vectors = 0;
+ add_new_vector (0.5, 0.5);
+ }
+ if (selectedvector >= num_vectors)
+ selectedvector = num_vectors-1;
+}
+
+void
+update_orientmap_dialog (void)
+{
+ if (!orient_map_window) return;
+
+ init_vectors ();
+
+ gtk_adjustment_set_value (orient_map_str_exp_adjust,
+ pcvals.orient_strength_exponent);
+ gtk_adjustment_set_value (angle_offset_adjust,
+ pcvals.orient_angle_offset);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (orient_voronoi),
+ pcvals.orient_voronoi);
+
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
+
+void
+create_orientmap_dialog (GtkWidget *parent)
+{
+ GtkWidget *tmpw, *tmpw2;
+ GtkWidget *table1, *table2;
+ GtkWidget *frame;
+ GtkWidget *ebox, *hbox, *vbox;
+
+ init_vectors ();
+
+ if (orient_map_window)
+ {
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+ gtk_widget_show (orient_map_window);
+ return;
+ }
+
+ orient_map_window =
+ gimp_dialog_new (_("Orientation Map Editor"), PLUG_IN_ROLE,
+ gtk_widget_get_toplevel (parent), 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+
+ _("_Apply"), GTK_RESPONSE_APPLY,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (orient_map_window),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_APPLY,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (orient_map_window, "response",
+ G_CALLBACK (orient_map_response),
+ orient_map_window);
+ g_signal_connect (orient_map_window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &orient_map_window);
+
+ table1 = gtk_table_new (2, 5, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table1), 6);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (orient_map_window))),
+ table1, TRUE, TRUE, 0);
+ gtk_widget_show (table1);
+
+ frame = gtk_frame_new (_("Vectors"));
+ gtk_container_set_border_width (GTK_CONTAINER (frame), 2);
+ gtk_table_attach (GTK_TABLE (table1), frame, 0, 1, 0, 1,
+ GTK_EXPAND, GTK_EXPAND, 0, 0);
+ gtk_widget_show (frame);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ ebox = gtk_event_box_new ();
+ gimp_help_set_help_data (ebox,
+ _("The vector-field. "
+ "Left-click to move selected vector, "
+ "Right-click to point it towards mouse, "
+ "Middle-click to add a new vector."), NULL);
+ gtk_box_pack_start (GTK_BOX (hbox), ebox, FALSE, FALSE, 0);
+
+ tmpw = vector_preview = gimp_preview_area_new ();
+ gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT);
+ gtk_container_add (GTK_CONTAINER (ebox), tmpw);
+ gtk_widget_show (tmpw);
+ gtk_widget_add_events (ebox, GDK_BUTTON_PRESS_MASK);
+ g_signal_connect (ebox, "button-press-event",
+ G_CALLBACK (map_click_callback), NULL);
+ gtk_widget_show (ebox);
+
+ vector_preview_brightness_adjust = (GtkAdjustment *)
+ gtk_adjustment_new (50.0, 0.0, 100.0, 1.0, 1.0, 1.0);
+ tmpw = gtk_scale_new (GTK_ORIENTATION_VERTICAL,
+ vector_preview_brightness_adjust);
+ gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE);
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, FALSE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (vector_preview_brightness_adjust, "value-changed",
+ G_CALLBACK (update_vector_prev), NULL);
+ gimp_help_set_help_data (tmpw, _("Adjust the preview's brightness"), NULL);
+
+ tmpw2 = tmpw = gtk_frame_new (_("Preview"));
+ gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
+ gtk_table_attach (GTK_TABLE (table1), tmpw, 1,2, 0,1,
+ GTK_EXPAND, GTK_EXPAND, 0, 0);
+ gtk_widget_show (tmpw);
+
+ tmpw = orient_map_preview_prev = gimp_preview_area_new ();
+ gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT);
+ gtk_container_add (GTK_CONTAINER (tmpw2), tmpw);
+ gtk_widget_show (tmpw);
+
+ hbox = tmpw = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
+ gtk_table_attach_defaults (GTK_TABLE (table1), tmpw, 0,1, 1,2);
+ gtk_widget_show (tmpw);
+
+ prev_button = tmpw = gtk_button_new_with_mnemonic ("_<<");
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (prev_click_callback), NULL);
+ gimp_help_set_help_data (tmpw, _("Select previous vector"), NULL);
+
+ next_button = tmpw = gtk_button_new_with_mnemonic ("_>>");
+ gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (next_click_callback), NULL);
+ gimp_help_set_help_data (tmpw, _("Select next vector"), NULL);
+
+ add_button = tmpw = gtk_button_new_with_mnemonic ( _("A_dd"));
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (add_click_callback), NULL);
+ gimp_help_set_help_data (tmpw, _("Add new vector"), NULL);
+
+ kill_button = tmpw = gtk_button_new_with_mnemonic ( _("_Kill"));
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (delete_click_callback), NULL);
+ gimp_help_set_help_data (tmpw, _("Delete selected vector"), NULL);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_spacing (GTK_BOX (hbox), 12);
+ gtk_table_attach_defaults (GTK_TABLE (table1), hbox, 0, 2, 2, 3);
+ gtk_widget_show (hbox);
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+ gtk_widget_show (vbox);
+
+ frame = gimp_int_radio_group_new (TRUE, _("Type"),
+ G_CALLBACK (vector_type_click_callback),
+ &vector_type, 0,
+
+ _("_Normal"), 0, &vector_types[0],
+ _("Vorte_x"), 1, &vector_types[1],
+ _("Vortex_2"), 2, &vector_types[2],
+ _("Vortex_3"), 3, &vector_types[3],
+
+ NULL);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ orient_voronoi = tmpw = gtk_check_button_new_with_mnemonic ( _("_Voronoi"));
+ gtk_box_pack_start (GTK_BOX (vbox), tmpw, TRUE, TRUE, 0);
+ gtk_widget_show (tmpw);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.orient_voronoi);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (angle_offset_adjust_move_callback), NULL);
+ gimp_help_set_help_data (tmpw,
+ _("Voronoi-mode makes only the vector closest to the given point have any influence"),
+ NULL);
+
+ table2 = gtk_table_new (4, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table2), 4);
+ gtk_box_pack_start (GTK_BOX (hbox), table2, TRUE, TRUE, 0);
+ gtk_widget_show (table2);
+
+ angle_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 0,
+ _("A_ngle:"),
+ 150, 6, 0.0,
+ 0.0, 360.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Change the angle of the selected vector"),
+ NULL);
+ g_signal_connect (angle_adjust, "value-changed",
+ G_CALLBACK (angle_adjust_move_callback), NULL);
+
+ angle_offset_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 1,
+ _("Ang_le offset:"),
+ 150, 6, 0.0,
+ 0.0, 360.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Offset all vectors with a given angle"),
+ NULL);
+ g_signal_connect (angle_offset_adjust, "value-changed",
+ G_CALLBACK (angle_offset_adjust_move_callback), NULL);
+
+ strength_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 2,
+ _("_Strength:"),
+ 150, 6, 1.0,
+ 0.1, 5.0, 0.1, 1.0, 1,
+ TRUE, 0, 0,
+ _("Change the strength of the selected vector"),
+ NULL);
+ g_signal_connect (strength_adjust, "value-changed",
+ G_CALLBACK (strength_adjust_move_callback), NULL);
+
+ orient_map_str_exp_adjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 3,
+ _("S_trength exp.:"),
+ 150, 6, 1.0,
+ 0.1, 10.9, 0.1, 1.0, 1,
+ TRUE, 0, 0,
+ _("Change the exponent of the strength"),
+ NULL);
+ g_signal_connect (orient_map_str_exp_adjust, "value-changed",
+ G_CALLBACK (strength_exponent_adjust_move_callback), NULL);
+
+ gtk_widget_show (orient_map_window);
+
+ update_vector_prev ();
+ update_orient_map_preview_prev ();
+}
diff --git a/plug-ins/gimpressionist/orientmap.h b/plug-ins/gimpressionist/orientmap.h
new file mode 100644
index 0000000..480908d
--- /dev/null
+++ b/plug-ins/gimpressionist/orientmap.h
@@ -0,0 +1,25 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __ORIENTMAP_H
+#define __ORIENTMAP_H
+
+void create_orientmap_dialog (GtkWidget *parent);
+void update_orientmap_dialog (void);
+void orientation_map_free_resources(void);
+
+#endif
diff --git a/plug-ins/gimpressionist/paper.c b/plug-ins/gimpressionist/paper.c
new file mode 100644
index 0000000..562b0e4
--- /dev/null
+++ b/plug-ins/gimpressionist/paper.c
@@ -0,0 +1,221 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "paper.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+static GtkWidget *paper_preview = NULL;
+static GtkWidget *paper_invert = NULL;
+static GtkWidget *paper_list = NULL;
+static GtkObject *paper_relief_adjust = NULL;
+static GtkObject *paper_scale_adjust = NULL;
+static GtkWidget *paper_overlay = NULL;
+
+static void paper_update_preview (void)
+{
+ gint i, j;
+ guchar *buf, *paper_preview_buffer;
+ gdouble sc;
+ ppm_t p = {0, 0, NULL};
+
+ ppm_load (pcvals.selected_paper, &p);
+ sc = p.width > p.height ? p.width : p.height;
+ sc = 100.0 / sc;
+ resize (&p, p.width*sc,p.height*sc);
+
+ paper_preview_buffer = g_new0 (guchar, 100*100);
+
+ for (i = 0, buf = paper_preview_buffer; i < 100; i++, buf += 100)
+ {
+ gint k = i * p.width * 3;
+
+ if (i < p.height)
+ {
+ for (j = 0; j < p.width; j++)
+ buf[j] = p.col[k + j * 3];
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert)))
+ for (j = 0; j < p.width; j++)
+ buf[j] = 255 - buf[j];
+ }
+ }
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (paper_preview),
+ 0, 0, 100, 100,
+ GIMP_GRAY_IMAGE,
+ paper_preview_buffer,
+ 100);
+
+ ppm_kill (&p);
+ g_free (paper_preview_buffer);
+
+ gtk_widget_queue_draw (paper_preview);
+}
+
+static void
+paper_select (GtkTreeSelection *selection,
+ gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gchar *paper;
+
+ gtk_tree_model_get (model, &iter, 0, &paper, -1);
+
+ if (paper)
+ {
+ gchar *fname = g_build_filename ("Paper", paper, NULL);
+
+ g_strlcpy (pcvals.selected_paper,
+ fname, sizeof (pcvals.selected_paper));
+
+ paper_update_preview ();
+
+ g_free (fname);
+ g_free (paper);
+ }
+ }
+}
+
+void
+paper_restore (void)
+{
+ reselect (paper_list, pcvals.selected_paper);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_relief_adjust), pcvals.paper_relief);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (paper_scale_adjust), pcvals.paper_scale);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_invert), pcvals.paper_invert);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (paper_overlay), pcvals.paper_overlay);
+}
+
+void
+paper_store (void)
+{
+ pcvals.paper_invert = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_invert));
+ pcvals.paper_overlay = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (paper_overlay));
+}
+
+void
+create_paperpage (GtkNotebook *notebook)
+{
+ GtkWidget *box1, *thispage, *box2;
+ GtkWidget *label, *tmpw, *table;
+ GtkWidget *view;
+ GtkWidget *frame;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ GtkListStore *paper_store_list;
+
+ label = gtk_label_new_with_mnemonic (_("P_aper"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE, TRUE, 0);
+ gtk_widget_show (box1);
+
+ paper_list = view = create_one_column_list (box1, paper_select);
+ paper_store_list =
+ GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
+ gtk_widget_show (box2);
+
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (box2), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ paper_preview = tmpw = gimp_preview_area_new ();
+ gtk_widget_set_size_request (tmpw, 100, 100);
+ gtk_container_add (GTK_CONTAINER (frame), tmpw);
+ gtk_widget_show (tmpw);
+
+ paper_invert = tmpw = gtk_check_button_new_with_mnemonic ( _("_Invert"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE);
+ gtk_widget_show (tmpw);
+ g_signal_connect_swapped (tmpw, "clicked",
+ G_CALLBACK (paper_select), selection);
+ gimp_help_set_help_data (tmpw, _("Inverts the Papers texture"), NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.paper_invert);
+
+ paper_overlay = tmpw = gtk_check_button_new_with_mnemonic ( _("O_verlay"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE);
+ gtk_widget_show (tmpw);
+ gimp_help_set_help_data
+ (tmpw, _("Applies the paper as it is (without embossing it)"), NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.paper_overlay);
+
+ table = gtk_table_new (2, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ paper_scale_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Scale:"),
+ 150, -1, pcvals.paper_scale,
+ 3.0, 150.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Specifies the scale of the texture (in percent of original file)"),
+ NULL);
+ g_signal_connect (paper_scale_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.paper_scale);
+
+ paper_relief_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Relief:"),
+ 150, -1, pcvals.paper_relief,
+ 0.0, 100.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Specifies the amount of embossing to apply to the image (in percent)"),
+ NULL);
+ g_signal_connect (paper_relief_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.paper_relief);
+
+
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (paper_store_list), &iter))
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ paper_select (selection, NULL);
+ readdirintolist ("Paper", view, pcvals.selected_paper);
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/paper.h b/plug-ins/gimpressionist/paper.h
new file mode 100644
index 0000000..ee7b45c
--- /dev/null
+++ b/plug-ins/gimpressionist/paper.h
@@ -0,0 +1,25 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PAPER_H
+#define __PAPER_H
+
+void create_paperpage(GtkNotebook *);
+void paper_store(void);
+void paper_restore(void);
+
+#endif
diff --git a/plug-ins/gimpressionist/placement.c b/plug-ins/gimpressionist/placement.c
new file mode 100644
index 0000000..1c4ce59
--- /dev/null
+++ b/plug-ins/gimpressionist/placement.c
@@ -0,0 +1,130 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "placement.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define NUM_PLACE_RADIO 2
+
+static GtkWidget *placement_radio[NUM_PLACE_RADIO];
+static GtkWidget *placement_center = NULL;
+static GtkObject *brush_density_adjust = NULL;
+
+void
+place_restore (void)
+{
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (placement_radio[pcvals.place_type]), TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (placement_center),
+ pcvals.placement_center);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (brush_density_adjust),
+ pcvals.brush_density);
+}
+
+int
+place_type_input (int in)
+{
+ return CLAMP_UP_TO (in, NUM_PLACE_RADIO);
+}
+
+void
+place_store (void)
+{
+ pcvals.placement_center = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (placement_center));
+}
+
+void
+create_placementpage (GtkNotebook *notebook)
+{
+ GtkWidget *vbox;
+ GtkWidget *label, *tmpw, *table, *frame;
+
+ label = gtk_label_new_with_mnemonic (_("Pl_acement"));
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+ gtk_widget_show (vbox);
+
+ frame = gimp_int_radio_group_new (TRUE, _("Placement"),
+ G_CALLBACK (gimp_radio_button_update),
+ &pcvals.place_type, 0,
+
+ _("Randomly"),
+ PLACEMENT_TYPE_RANDOM,
+ &placement_radio[PLACEMENT_TYPE_RANDOM],
+
+ _("Evenly distributed"),
+ PLACEMENT_TYPE_EVEN_DIST,
+ &placement_radio[PLACEMENT_TYPE_EVEN_DIST],
+
+ NULL);
+
+ gimp_help_set_help_data
+ (placement_radio[PLACEMENT_TYPE_RANDOM],
+ _("Place strokes randomly around the image"),
+ NULL);
+ gimp_help_set_help_data
+ (placement_radio[PLACEMENT_TYPE_EVEN_DIST],
+ _("The strokes are evenly distributed across the image"),
+ NULL);
+
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON (placement_radio[pcvals.place_type]), TRUE);
+
+ placement_center = gtk_check_button_new_with_mnemonic ( _("Centered"));
+ tmpw = placement_center;
+
+ gtk_box_pack_start (GTK_BOX (vbox), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ gimp_help_set_help_data
+ (tmpw, _("Focus the brush strokes around the center of the image"), NULL);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw),
+ pcvals.placement_center);
+
+ table = gtk_table_new (1, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ brush_density_adjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Stroke _density:"),
+ 100, -1, pcvals.brush_density,
+ 1.0, 50.0, 1.0, 5.0, 0,
+ TRUE, 0, 0,
+ _("The relative density of the brush strokes"),
+ NULL);
+ g_signal_connect (brush_density_adjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.brush_density);
+
+ gtk_notebook_append_page_menu (notebook, vbox, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/placement.h b/plug-ins/gimpressionist/placement.h
new file mode 100644
index 0000000..f308731
--- /dev/null
+++ b/plug-ins/gimpressionist/placement.h
@@ -0,0 +1,32 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PLACEMENT_H
+#define __PLACEMENT_H
+
+enum PLACEMENT_TYPE_ENUM
+{
+ PLACEMENT_TYPE_RANDOM = 0,
+ PLACEMENT_TYPE_EVEN_DIST = 1,
+};
+
+void place_store (void);
+void place_restore (void);
+void create_placementpage (GtkNotebook *);
+int place_type_input (int in);
+
+#endif
diff --git a/plug-ins/gimpressionist/plasma.c b/plug-ins/gimpressionist/plasma.c
new file mode 100644
index 0000000..82f9212
--- /dev/null
+++ b/plug-ins/gimpressionist/plasma.c
@@ -0,0 +1,122 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+
+#include <gtk/gtk.h>
+
+#include <libgimpmath/gimpmath.h>
+#include <libgimp/gimp.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "random.h"
+
+static int
+pfix (int n)
+{
+ if (n < 1) return 1;
+ if (n > 255) return 255;
+ return n;
+}
+
+#define PIXEL(y,x,z) p->col[(y) * rowstride + (x) * 3 + z]
+
+static void
+mkplasma_sub (ppm_t *p, int x1, int x2, int y1, int y2, float turb)
+{
+ int rowstride = p->width * 3;
+ int r=0;
+ int xr, yr, nx, ny;
+
+ xr = abs (x1 - x2);
+ yr = abs (y1 - y2);
+
+ if ((xr == 0) && (yr == 0))
+ return;
+
+ nx = (x1 + x2)/2;
+ ny = (y1 + y2)/2;
+ if (!PIXEL (y1,nx,r))
+ PIXEL (y1, nx, r) = pfix ((PIXEL (y1, x1, r) + PIXEL (y1, x2, r)) / 2.0 +
+ turb * g_rand_double_range (random_generator,
+ -xr / 2.0,
+ xr / 2.0));
+ if (!PIXEL (y2, nx, r))
+ PIXEL (y2, nx, r) = pfix ((PIXEL (y2, x1, r) + PIXEL (y2, x2, r)) / 2.0 +
+ turb * g_rand_double_range (random_generator,
+ -xr / 2.0,
+ xr / 2.0));
+ if (!PIXEL (ny, x1, r))
+ PIXEL (ny, x1, r) = pfix ((PIXEL (y1, x1, r)+PIXEL (y2, x1, r)) / 2.0 +
+ turb * g_rand_double_range (random_generator,
+ -yr / 2.0,
+ yr / 2.0));
+ if (!PIXEL (ny, x2, r))
+ PIXEL (ny, x2, r) = pfix ((PIXEL (y1, x2, r) + PIXEL (y2, x2, r)) / 2.0 +
+ turb * g_rand_double_range (random_generator,
+ -yr / 2.0,
+ yr / 2.0));
+ if (!PIXEL (ny, nx, r))
+ PIXEL (ny, nx, r) =
+ pfix ((PIXEL (y1, x1, r) + PIXEL (y1, x2, r) +
+ PIXEL (y2, x1, r) + PIXEL( y2, x2, r)) / 4.0 +
+ turb * g_rand_double_range (random_generator,
+ -(xr + yr)/4.0,
+ (xr + yr)/4.0));
+
+ if (xr>1)
+ {
+ mkplasma_sub (p, x1, nx, y1, ny, turb);
+ mkplasma_sub (p, nx, x2, y1, ny, turb);
+ }
+ if (yr>1)
+ {
+ mkplasma_sub (p, x1, nx, ny, y2, turb);
+ mkplasma_sub (p, nx, x2, ny, y2, turb);
+ }
+}
+
+static void
+mkplasma_red (ppm_t *p, float turb)
+{
+ int x = 0, y = 0;
+ int rowstride = p->width * 3;
+
+ for (x = 0; x < p->width; x++)
+ for (y = 0; y < p->height; y++)
+ PIXEL (y, x, 0) = 0;
+ x--; y--;
+ PIXEL (0, 0, 0) = g_rand_int_range (random_generator, 1, 256);
+ PIXEL (y, 0, 0) = g_rand_int_range (random_generator, 1, 256);
+ PIXEL (0, x, 0) = g_rand_int_range (random_generator, 1, 256);
+ PIXEL (y, x, 0) = g_rand_int_range (random_generator, 1, 256);
+ mkplasma_sub (p, 0, x, 0, y, turb);
+}
+
+void
+mkgrayplasma (ppm_t *p, float turb)
+{
+ int y, l;
+
+ mkplasma_red (p, turb);
+ l = p->width * 3 * p->height;
+ for (y = 0; y < l; y += 3)
+ p->col[y+1] = p->col[y+2] = p->col[y];
+}
diff --git a/plug-ins/gimpressionist/ppmtool.c b/plug-ins/gimpressionist/ppmtool.c
new file mode 100644
index 0000000..307779e
--- /dev/null
+++ b/plug-ins/gimpressionist/ppmtool.c
@@ -0,0 +1,904 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimpmath/gimpmath.h>
+
+#include "ppmtool.h"
+#include "gimpressionist.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+static int
+readline (FILE *f, char *buffer, int len)
+{
+ do
+ {
+ if (!fgets (buffer, len, f))
+ return -1;
+ }
+ while (buffer[0] == '#');
+
+ g_strchomp (buffer);
+ return 0;
+}
+
+void
+ppm_kill (ppm_t *p)
+{
+ g_free (p->col);
+ p->col = NULL;
+ p->height = p->width = 0;
+}
+
+void ppm_new (ppm_t *p, int xs, int ys)
+{
+ int x;
+ guchar bgcol[3] = {0,0,0};
+
+ if (xs < 1)
+ xs = 1;
+ if (ys < 1)
+ ys = 1;
+
+ p->width = xs;
+ p->height = ys;
+ p->col = g_malloc (xs * 3 * ys);
+ for (x = 0; x < xs * 3 * ys; x += 3)
+ {
+ p->col[x+0] = bgcol[0];
+ p->col[x+1] = bgcol[1];
+ p->col[x+2] = bgcol[2];
+ }
+}
+
+void
+get_rgb (ppm_t *s, float xo, float yo, guchar *d)
+{
+ float ix, iy;
+ int x1, x2, y1, y2;
+ float x1y1, x2y1, x1y2, x2y2;
+ float r, g, b;
+ int bail = 0;
+ int rowstride = s->width * 3;
+
+ if (xo < 0.0)
+ bail=1;
+ else if (xo >= s->width-1)
+ {
+ xo = s->width-1;
+#if 0
+ bail=1;
+#endif
+ }
+
+ if (yo < 0.0)
+ bail=1;
+ else if (yo >= s->height-1)
+ {
+ yo= s->height-1;
+#if 0
+ bail=1;
+#endif
+ }
+
+ if (bail)
+ {
+ d[0] = d[1] = d[2] = 0;
+ return;
+ }
+
+ ix = (int)xo;
+ iy = (int)yo;
+
+#if 0
+ x1 = wrap(ix, s->width);
+ x2 = wrap(ix+1, s->width);
+ y1 = wrap(iy, s->height);
+ y2 = wrap(iy+1, s->height);
+#endif
+ x1 = ix; x2 = ix + 1;
+ y1 = iy; y2 = iy + 1;
+
+#if 0
+ printf("x1=%d y1=%d x2=%d y2=%d\n",x1,y1,x2,y2);
+#endif
+
+ x1y1 = (1.0 - xo + ix) * (1.0 - yo + iy);
+ x2y1 = (xo - ix) * (1.0 - yo + iy);
+ x1y2 = (1.0 - xo + ix) * (yo - iy);
+ x2y2 = (xo - ix) * (yo - iy);
+
+ r = s->col[y1 * rowstride + x1 * 3 + 0] * x1y1;
+ g = s->col[y1 * rowstride + x1 * 3 + 1] * x1y1;
+ b = s->col[y1 * rowstride + x1 * 3 + 2] * x1y1;
+
+ if (x2y1 > 0.0)
+ r += s->col[y1 * rowstride + x2 * 3 + 0] * x2y1;
+ if (x2y1 > 0.0)
+ g += s->col[y1 * rowstride + x2 * 3 + 1] * x2y1;
+ if (x2y1 > 0.0)
+ b += s->col[y1 * rowstride + x2 * 3 + 2] * x2y1;
+
+ if (x1y2 > 0.0)
+ r += s->col[y2 * rowstride + x1 * 3 + 0] * x1y2;
+ if (x1y2 > 0.0)
+ g += s->col[y2 * rowstride + x1 * 3 + 1] * x1y2;
+ if (x1y2 > 0.0)
+ b += s->col[y2 * rowstride + x1 * 3 + 2] * x1y2;
+
+ if (x2y2 > 0.0)
+ r += s->col[y2 * rowstride + x2 * 3 + 0] * x2y2;
+ if (x2y2 > 0.0)
+ g += s->col[y2 * rowstride + x2 * 3 + 1] * x2y2;
+ if (x2y2 > 0.0)
+ b += s->col[y2 * rowstride + x2 * 3 + 2] * x2y2;
+
+ d[0] = r;
+ d[1] = g;
+ d[2] = b;
+}
+
+
+void
+resize (ppm_t *p, int nx, int ny)
+{
+ int x, y;
+ float xs = p->width / (float)nx;
+ float ys = p->height / (float)ny;
+ ppm_t tmp = {0, 0, NULL};
+
+ ppm_new (&tmp, nx, ny);
+ for (y = 0; y < ny; y++)
+ {
+ guchar *row = tmp.col + y * tmp.width * 3;
+
+ for (x = 0; x < nx; x++)
+ {
+ get_rgb (p, x * xs, y * ys, &row[x * 3]);
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+void
+rescale (ppm_t *p, double sc)
+{
+ resize (p, p->width * sc, p->height * sc);
+}
+
+void resize_fast (ppm_t *p, int nx, int ny)
+{
+ int x, y;
+ float xs = p->width / (float)nx;
+ float ys = p->height / (float)ny;
+ ppm_t tmp = {0, 0, NULL};
+
+ ppm_new (&tmp, nx, ny);
+ for (y = 0; y < ny; y++)
+ {
+ for (x = 0; x < nx; x++)
+ {
+ gint rx = x * xs, ry = y * ys;
+
+ memcpy (&tmp.col[y * tmp.width * 3 + x * 3],
+ &p->col[ry * p->width * 3 + rx * 3],
+ 3);
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+
+struct _BrushHeader
+{
+ unsigned int header_size; /* header_size = sz_BrushHeader + brush name */
+ unsigned int version; /* brush file version # */
+ unsigned int width; /* width of brush */
+ unsigned int height; /* height of brush */
+ unsigned int bytes; /* depth of brush in bytes--always 1 */
+ unsigned int magic_number;/* GIMP brush magic number */
+ unsigned int spacing; /* brush spacing */
+};
+
+static void
+msb2lsb (unsigned int *i)
+{
+ guchar *p = (guchar *)i, c;
+
+ c = p[1]; p[1] = p[2]; p[2] = c;
+ c = p[0]; p[0] = p[3]; p[3] = c;
+}
+
+static FILE *
+fopen_from_search_path (const gchar * fn, const char * mode)
+{
+ FILE * f;
+ gchar * full_filename;
+
+ f = g_fopen (fn, mode);
+ if (!f)
+ {
+ full_filename = findfile (fn);
+ f = g_fopen (full_filename, mode);
+ g_free (full_filename);
+ }
+ return f;
+}
+
+static void
+load_gimp_brush (const gchar *fn, ppm_t *p)
+{
+ FILE *f;
+ struct _BrushHeader hdr;
+ gchar *ptr;
+ gint x, y;
+
+ f = fopen_from_search_path (fn, "rb");
+ ppm_kill (p);
+
+ if (!f)
+ {
+ g_printerr ("load_gimp_brush: Unable to open file \"%s\"!\n",
+ gimp_filename_to_utf8 (fn));
+ ppm_new (p, 10,10);
+ return;
+ }
+
+ fread (&hdr, 1, sizeof (struct _BrushHeader), f);
+
+ for (x = 0; x < 7; x++)
+ msb2lsb (&((unsigned int *)&hdr)[x]);
+
+ ppm_new (p, hdr.width, hdr.height);
+
+ ptr = g_malloc (hdr.width);
+ fseek (f, hdr.header_size, SEEK_SET);
+ for (y = 0; y < p->height; y++)
+ {
+ fread (ptr, p->width, 1, f);
+ for (x = 0; x < p->width; x++)
+ {
+ int k = y * p->width * 3 + x * 3;
+ p->col[k+0] = p->col[k+1] = p->col[k+2] = ptr[x];
+ }
+ }
+ fclose (f);
+ g_free (ptr);
+}
+
+void
+ppm_load (const char *fn, ppm_t *p)
+{
+ char line[200];
+ int y, pgm = 0;
+ FILE *f;
+
+ if (!strcmp (&fn[strlen (fn)-4], ".gbr"))
+ {
+ load_gimp_brush(fn, p);
+ return;
+ }
+
+ f = fopen_from_search_path (fn, "rb");
+
+ ppm_kill (p);
+
+ if (!f)
+ {
+ g_printerr ("ppm_load: Unable to open file \"%s\"!\n",
+ gimp_filename_to_utf8 (fn));
+ ppm_new (p, 10,10);
+ return;
+ }
+
+ readline (f, line, 200);
+ if (strcmp (line, "P6"))
+ {
+ if (strcmp (line, "P5"))
+ {
+ fclose (f);
+ g_printerr ("ppm_load: File \"%s\" not PPM/PGM? (line=\"%s\")%c\n",
+ gimp_filename_to_utf8 (fn), line, 7);
+ ppm_new (p, 10,10);
+ return;
+ }
+ pgm = 1;
+ }
+ readline (f, line, 200);
+ p->width = atoi (line);
+ p->height = atoi (strchr (line, ' ')+1);
+ readline (f, line, 200);
+ if (strcmp (line, "255"))
+ {
+ fclose (f);
+ g_printerr ("ppm_load: File \"%s\" not valid PPM/PGM? (line=\"%s\")%c\n",
+ gimp_filename_to_utf8 (fn), line, 7);
+ ppm_new (p, 10,10);
+ return;
+ }
+ p->col = g_malloc (p->height * p->width * 3);
+
+ if (!pgm)
+ {
+ fread (p->col, p->height * 3 * p->width, 1, f);
+ }
+ else
+ {
+ guchar *tmpcol = g_malloc (p->width * p->height);
+
+ fread (tmpcol, p->height * p->width, 1, f);
+ for (y = 0; y < p->width * p->height * 3; y++) {
+ p->col[y] = tmpcol[y / 3];
+ }
+
+ g_free (tmpcol);
+ }
+ fclose (f);
+}
+
+void
+fill (ppm_t *p, guchar *c)
+{
+ int x, y;
+
+ if ((c[0] == c[1]) && (c[0] == c[2]))
+ {
+ guchar col = c[0];
+ for (y = 0; y < p->height; y++)
+ {
+ memset(p->col + y*p->width*3, col, p->width*3);
+ }
+ }
+ else
+ {
+ for (y = 0; y < p->height; y++)
+ {
+ guchar *row = p->col + y * p->width * 3;
+
+ for (x = 0; x < p->width; x++)
+ {
+ int k = x * 3;
+
+ row[k+0] = c[0];
+ row[k+1] = c[1];
+ row[k+2] = c[2];
+ }
+ }
+ }
+}
+
+void
+ppm_copy (ppm_t *s, ppm_t *p)
+{
+ ppm_kill (p);
+ p->width = s->width;
+ p->height = s->height;
+ p->col = g_memdup (s->col, p->width * 3 * p->height);
+}
+
+void
+free_rotate (ppm_t *p, double amount)
+{
+ int x, y;
+ double nx, ny;
+ ppm_t tmp = {0, 0, NULL};
+ double f = amount * G_PI * 2 / 360.0;
+ int rowstride = p->width * 3;
+
+ ppm_new (&tmp, p->width, p->height);
+ for (y = 0; y < p->height; y++)
+ {
+ for (x = 0; x < p->width; x++)
+ {
+ double r, d;
+
+ nx = fabs (x - p->width / 2.0);
+ ny = fabs (y - p->height / 2.0);
+ r = sqrt (nx * nx + ny * ny);
+
+ d = atan2 ((y - p->height / 2.0), (x - p->width / 2.0));
+
+ nx = (p->width / 2.0 + cos (d - f) * r);
+ ny = (p->height / 2.0 + sin (d - f) * r);
+ get_rgb (p, nx, ny, tmp.col + y * rowstride + x * 3);
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+void
+crop (ppm_t *p, int lx, int ly, int hx, int hy)
+{
+ ppm_t tmp = {0,0,NULL};
+ int x, y;
+ int srowstride = p->width * 3;
+ int drowstride;
+
+ ppm_new (&tmp, hx - lx, hy - ly);
+ drowstride = tmp.width * 3;
+ for (y = ly; y < hy; y++)
+ for (x = lx; x < hx; x++)
+ memcpy (&tmp.col[(y - ly) * drowstride + (x - lx) * 3],
+ &p->col[y * srowstride + x * 3],
+ 3);
+ ppm_kill (p);
+ p->col = tmp.col;
+ p->width = tmp.width;
+ p->height = tmp.height;
+}
+
+void
+autocrop (ppm_t *p, int room)
+{
+ int lx = 0, hx = p->width, ly = 0, hy = p->height;
+ int x, y, n = 0;
+ guchar tc[3];
+ ppm_t tmp = {0,0,NULL};
+ int rowstride = p->width * 3;
+ int drowstride;
+
+ /* upper */
+ memcpy (&tc, p->col, 3);
+ for (y = 0; y < p->height; y++)
+ {
+ n = 0;
+ for (x = 0; x < p->width; x++)
+ {
+ if (memcmp (&tc, &p->col[y*rowstride+x*3], 3))
+ {
+ n++;
+ break;
+ }
+ }
+ if (n)
+ break;
+ }
+ if (n)
+ ly = y;
+#if 0
+ printf("ly = %d\n", ly);
+#endif
+
+ /* lower */
+ memcpy (&tc, &p->col[(p->height - 1) * rowstride], 3);
+ for (y = p->height-1; y >= 0; y--)
+ {
+ n = 0;
+ for (x = 0; x < p->width; x++)
+ {
+ if (memcmp (&tc, &p->col[y*rowstride+x*3], 3))
+ {
+ n++;
+ break;
+ }
+ }
+ if (n)
+ break;
+ }
+ if (n)
+ hy = y+1;
+ if (hy >= p->height)
+ hy = p->height - 1;
+#if 0
+ printf("hy = %d\n", hy);
+#endif
+
+ /* left */
+ memcpy (&tc, &p->col[ly * rowstride], 3);
+ for (x = 0; x < p->width; x++)
+ {
+ n = 0;
+ for (y = ly; y <= hy && y < p->height; y++)
+ {
+ if (memcmp (&tc, &p->col[y * rowstride + x * 3], 3))
+ {
+ n++;
+ break;
+ }
+ }
+ if (n)
+ break;
+ }
+ if (n)
+ lx = x;
+#if 0
+ printf("lx = %d\n", lx);
+#endif
+
+ /* right */
+ memcpy
+ (&tc, &p->col[ly * rowstride + (p->width - 1) * 3], 3);
+ for (x = p->width-1; x >= 0; x--)
+ {
+ n = 0;
+ for (y = ly; y <= hy; y++)
+ {
+ if (memcmp (&tc, &p->col[y * rowstride + x * 3], 3))
+ {
+ n++;
+ break;
+ }
+ }
+ if (n)
+ break;
+ }
+ if (n)
+ hx = x + 1;
+#if 0
+ printf("hx = %d\n", hx);
+#endif
+
+ lx -= room; if (lx < 0) lx = 0;
+ ly -= room; if (ly < 0) ly = 0;
+ hx += room; if (hx >= p->width) hx = p->width - 1;
+ hy += room; if (hy >= p->height) hy = p->height - 1;
+
+ ppm_new (&tmp, hx - lx, hy - ly);
+ drowstride = tmp.width * 3;
+ for (y = ly; y < hy; y++)
+ for (x = lx; x < hx; x++)
+ memcpy (&tmp.col[(y - ly) * drowstride + (x - lx) * 3],
+ &p->col[y * rowstride + x * 3],
+ 3);
+ ppm_kill (p);
+ p->col = tmp.col;
+ p->width = tmp.width;
+ p->height = tmp.height;
+}
+
+void
+ppm_pad (ppm_t *p, int left,int right, int top, int bottom, guchar *bg)
+{
+ int x, y;
+ ppm_t tmp = {0, 0, NULL};
+
+ ppm_new (&tmp, p->width + left + right, p->height + top + bottom);
+ for (y = 0; y < tmp.height; y++)
+ {
+ guchar *row, *srcrow;
+
+ row = tmp.col + y * tmp.width * 3;
+ if ((y < top) || (y >= tmp.height-bottom))
+ {
+ for (x = 0; x < tmp.width; x++)
+ {
+ int k = x * 3;
+
+ row[k+0] = bg[0];
+ row[k+1] = bg[1];
+ row[k+2] = bg[2];
+ }
+ continue;
+ }
+ srcrow = p->col + (y-top) * p->width * 3;
+ for (x = 0; x < left; x++)
+ {
+ int k = x * 3;
+
+ row[k+0] = bg[0];
+ row[k+1] = bg[1];
+ row[k+2] = bg[2];
+ }
+ for (; x < tmp.width-right; x++)
+ {
+ int k = y * tmp.width * 3 + x * 3;
+
+ tmp.col[k+0] = srcrow[(x - left) * 3 + 0];
+ tmp.col[k+1] = srcrow[(x - left) * 3 + 1];
+ tmp.col[k+2] = srcrow[(x - left) * 3 + 2];
+ }
+ for (; x < tmp.width; x++)
+ {
+ int k = x * 3;
+
+ row[k+0] = bg[0];
+ row[k+1] = bg[1];
+ row[k+2] = bg[2];
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+void
+ppm_save (ppm_t *p, const char *fn)
+{
+ FILE *f = g_fopen (fn, "wb");
+
+ if (!f)
+ {
+ /*
+ * gimp_filename_to_utf8 () and g_strerror () return temporary strings
+ * that need not and should not be freed. So this call is OK.
+ * */
+ g_message (_("Failed to save PPM file '%s': %s"),
+ gimp_filename_to_utf8 (fn), g_strerror (errno));
+ return;
+ }
+
+ fprintf (f, "P6\n%d %d\n255\n", p->width, p->height);
+ fwrite (p->col, p->width * 3 * p->height, 1, f);
+ fclose (f);
+}
+
+void
+edgepad (ppm_t *p, int left,int right, int top, int bottom)
+{
+ int x, y;
+ ppm_t tmp = {0, 0, NULL};
+ guchar testcol[3] = {0, 255, 0};
+ int srowstride, drowstride;
+
+ ppm_new (&tmp, p->width+left+right, p->height+top+bottom);
+ fill (&tmp, testcol);
+
+ srowstride = p->width * 3;
+ drowstride = tmp.width * 3;
+
+ for (y = 0; y < top; y++)
+ {
+ memcpy (&tmp.col[y * drowstride + left * 3], p->col, srowstride);
+ }
+ for (; y-top < p->height; y++)
+ {
+ memcpy (&tmp.col[y * drowstride + left * 3],
+ p->col + (y - top) * srowstride,
+ srowstride);
+ }
+ for (; y < tmp.height ; y++)
+ {
+ memcpy (&tmp.col[y * drowstride + left * 3],
+ p->col + (p->height - 1) * srowstride,
+ srowstride);
+ }
+ for (y = 0; y < tmp.height; y++)
+ {
+ guchar *col, *tmprow;
+
+ tmprow = tmp.col + y*drowstride;
+ col = tmp.col + y*drowstride + left*3;
+
+ for (x = 0; x < left; x++)
+ {
+ memcpy (&tmprow[x * 3], col, 3);
+ }
+ col = tmp.col + y * drowstride + (tmp.width-right - 1) * 3;
+ for (x = 0; x < right; x++)
+ {
+ memcpy (&tmprow[(x + tmp.width - right - 1) * 3], col, 3);
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+void
+ppm_apply_gamma (ppm_t *p, float e, int r, int g, int b)
+{
+ int x, l = p->width * 3 * p->height;
+ guchar xlat[256], *pix;
+
+ if (e > 0.0)
+ for (x = 0; x < 256; x++)
+ {
+ xlat[x] = pow ((x / 255.0), (1.0 / e)) * 255.0;
+ }
+ else if (e < 0.0)
+ for (x = 0; x < 256; x++)
+ {
+ xlat[255-x] = pow ((x / 255.0), (-1.0 / e)) * 255.0;
+ }
+ else
+ for (x = 0; x < 256; x++)
+ {
+ xlat[x] = 0;
+ }
+
+ pix = p->col;
+ if (r)
+ for (x = 0; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+ if (g)
+ for (x = 1; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+ if (b)
+ for (x = 2; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+}
+
+void
+ppm_apply_brightness (ppm_t *p, float e, int r, int g, int b)
+{
+ int x, l = p->width * 3 * p->height;
+ guchar xlat[256], *pix;
+ for (x = 0; x < 256; x++)
+ xlat[x] = x * e;
+
+ pix = p->col;
+ if (r)
+ for (x = 0; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+ if (g)
+ for (x = 1; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+ if (b)
+ for (x = 2; x < l; x += 3)
+ pix[x] = xlat[pix[x]];
+}
+
+void
+blur (ppm_t *p, int xrad, int yrad)
+{
+ int x, y, k;
+ int tx, ty;
+ ppm_t tmp = {0,0,NULL};
+ int r, g, b, n;
+ int rowstride = p->width * 3;
+
+ ppm_new (&tmp, p->width, p->height);
+ for (y = 0; y < p->height; y++)
+ {
+ for (x = 0; x < p->width; x++)
+ {
+ r = g = b = n = 0;
+
+ for (ty = y-yrad; ty <= y+yrad; ty++)
+ {
+ for (tx = x-xrad; tx <= x+xrad; tx++)
+ {
+ if (ty<0) continue;
+ if (ty>=p->height) continue;
+ if (tx<0) continue;
+ if (tx>=p->width) continue;
+ k = ty * rowstride + tx * 3;
+ r += p->col[k+0];
+ g += p->col[k+1];
+ b += p->col[k+2];
+ n++;
+ }
+ }
+ k = y * rowstride + x * 3;
+ tmp.col[k+0] = r / n;
+ tmp.col[k+1] = g / n;
+ tmp.col[k+2] = b / n;
+ }
+ }
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+}
+
+void
+ppm_put_rgb_fast (ppm_t *s, float xo, float yo, guchar *d)
+{
+ guchar *tp;
+ tp = s->col + s->width * 3 * (int)(yo + 0.5) + 3 * (int)(xo + 0.5);
+ tp[0] = d[0];
+ tp[1] = d[1];
+ tp[2] = d[2];
+}
+
+void
+ppm_put_rgb (ppm_t *s, float xo, float yo, guchar *d)
+{
+ int x, y;
+ float aa, ab, ba, bb;
+ int k, rowstride = s->width * 3;
+
+ x = xo;
+ y = yo;
+
+ if ((x < 0) || (y < 0) || (x >= s->width-1) || (y >= s->height-1))
+ return;
+
+ xo -= x;
+ yo -= y;
+
+ aa = (1.0 - xo) * (1.0 - yo);
+ ab = xo * (1.0 - yo);
+ ba = (1.0 - xo) * yo;
+ bb = xo * yo;
+
+ k = y * rowstride + x * 3;
+ s->col[k+0] *= (1.0 - aa);
+ s->col[k+1] *= (1.0 - aa);
+ s->col[k+2] *= (1.0 - aa);
+
+ s->col[k+3] *= (1.0 - ab);
+ s->col[k+4] *= (1.0 - ab);
+ s->col[k+5] *= (1.0 - ab);
+
+ s->col[k+rowstride+0] *= (1.0 - ba);
+ s->col[k+rowstride+1] *= (1.0 - ba);
+ s->col[k+rowstride+2] *= (1.0 - ba);
+
+ s->col[k+rowstride+3] *= (1.0 - bb);
+ s->col[k+rowstride+4] *= (1.0 - bb);
+ s->col[k+rowstride+5] *= (1.0 - bb);
+
+ s->col[k+0] += aa * d[0];
+ s->col[k+1] += aa * d[1];
+ s->col[k+2] += aa * d[2];
+ s->col[k+3] += ab * d[0];
+ s->col[k+4] += ab * d[1];
+ s->col[k+5] += ab * d[2];
+ s->col[k+rowstride+0] += ba * d[0];
+ s->col[k+rowstride+1] += ba * d[1];
+ s->col[k+rowstride+2] += ba * d[2];
+ s->col[k+rowstride+3] += bb * d[0];
+ s->col[k+rowstride+4] += bb * d[1];
+ s->col[k+rowstride+5] += bb * d[2];
+}
+
+void
+ppm_drawline (ppm_t *p, float fx, float fy, float tx, float ty, guchar *col)
+{
+ float i;
+ float d, x, y;
+
+ if (fabs (fx - tx) > fabs ( fy - ty))
+ {
+ if (fx > tx)
+ {
+ i = tx; tx = fx; fx = i; i = ty; ty = fy; fy = i;
+ }
+ d = (ty - fy) / (tx - fx);
+ y = fy;
+ for (x = fx; x <= tx; x += 1.0)
+ {
+ ppm_put_rgb (p, x, y, col);
+ y += d;
+ }
+ }
+ else
+ {
+ if (fy > ty)
+ {
+ i = tx; tx = fx; fx = i; i = ty; ty = fy; fy = i;
+ }
+ d = (tx - fx) / (ty - fy);
+ x = fx;
+ for (y = fy; y <= ty; y += 1.0)
+ {
+ ppm_put_rgb (p, x, y, col);
+ x += d;
+ }
+ }
+}
diff --git a/plug-ins/gimpressionist/ppmtool.h b/plug-ins/gimpressionist/ppmtool.h
new file mode 100644
index 0000000..cf464e4
--- /dev/null
+++ b/plug-ins/gimpressionist/ppmtool.h
@@ -0,0 +1,60 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PPM_TOOL_H
+#define __PPM_TOOL_H
+
+#include <glib.h>
+
+typedef struct ppm {
+ int width;
+ int height;
+ unsigned char *col;
+} ppm_t;
+
+void fatal(char *s);
+void ppm_kill(ppm_t *p);
+void ppm_new(ppm_t *p, int xs, int ys);
+void get_rgb(ppm_t *s, float xo, float yo, unsigned char *d);
+void resize(ppm_t *p, int nx, int ny);
+void rescale(ppm_t *p, double scale);
+void resize_fast(ppm_t *p, int nx, int ny);
+void ppm_load(const char *fn, ppm_t *p);
+void ppm_save(ppm_t *p, const char *fn);
+void ppm_copy(ppm_t *s, ppm_t *p);
+void fill(ppm_t *p, guchar *c);
+void free_rotate(ppm_t *p, double amount);
+void ppm_pad(ppm_t *p, int left,int right, int top, int bottom, guchar *);
+void edgepad(ppm_t *p, int left,int right, int top, int bottom);
+void autocrop(ppm_t *p, int room);
+void crop(ppm_t *p, int lx, int ly, int hx, int hy);
+void ppm_apply_gamma(ppm_t *p, float e, int r, int g, int b);
+void ppm_apply_brightness(ppm_t *p, float e, int r, int g, int b);
+void ppm_put_rgb_fast(ppm_t *s, float xo, float yo, guchar *d);
+void ppm_put_rgb(ppm_t *s, float xo, float yo, guchar *d);
+void ppm_drawline(ppm_t *p, float fx, float fy, float tx, float ty, guchar *col);
+
+void repaint(ppm_t *p, ppm_t *a);
+
+void blur(ppm_t *p, int xrad, int yrad);
+
+void mkgrayplasma(ppm_t *p, float turb);
+
+#define PPM_IS_INITED(ppm_ptr) ((ppm_ptr)->col != NULL)
+
+#endif /* #ifndef __PPM_TOOL_H */
+
diff --git a/plug-ins/gimpressionist/presets.c b/plug-ins/gimpressionist/presets.c
new file mode 100644
index 0000000..3db9715
--- /dev/null
+++ b/plug-ins/gimpressionist/presets.c
@@ -0,0 +1,1098 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <glib/gstdio.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "presets.h"
+
+#include "color.h"
+#include "general.h"
+#include "orientation.h"
+#include "placement.h"
+#include "size.h"
+
+
+#include "libgimp/stdplugins-intl.h"
+
+#ifdef G_OS_WIN32
+#include "libgimpbase/gimpwin32-io.h"
+#endif
+
+#define PRESETMAGIC "Preset"
+
+static GtkWidget *presetnameentry = NULL;
+static GtkWidget *presetlist = NULL;
+static GtkWidget *presetdesclabel = NULL;
+static GtkWidget *presetsavebutton = NULL;
+static GtkWidget *delete_button = NULL;
+static GtkListStore *store = NULL;
+static gchar *selected_preset_orig_name = NULL;
+static gchar *selected_preset_filename = NULL;
+
+static gboolean
+can_delete_preset (const gchar *abs)
+{
+ gchar *user_data_dir;
+ gboolean ret;
+
+ user_data_dir = g_strconcat (gimp_directory (),
+ G_DIR_SEPARATOR_S,
+ NULL);
+
+
+ ret = (!strncmp (abs, user_data_dir, strlen (user_data_dir)));
+
+ g_free (user_data_dir);
+
+ return ret;
+}
+
+void
+preset_save_button_set_sensitive (gboolean s)
+{
+ if (GTK_IS_WIDGET (presetsavebutton))
+ gtk_widget_set_sensitive (GTK_WIDGET (presetsavebutton), s);
+}
+
+void
+preset_free (void)
+{
+ g_free (selected_preset_orig_name);
+ g_free (selected_preset_filename);
+}
+
+static void set_preset_description_text (const gchar *text)
+{
+ gtk_label_set_text (GTK_LABEL (presetdesclabel), text);
+}
+
+static char presetdesc[4096] = "";
+
+static const char *factory_defaults = "<Factory defaults>";
+
+static gchar *
+get_early_line_from_preset (gchar *full_path, const gchar *prefix)
+{
+ FILE *f;
+ gchar line[4096];
+ gint prefix_len, line_idx;
+
+ prefix_len = strlen (prefix);
+ f = g_fopen (full_path, "rt");
+ if (f)
+ {
+ /* Skip the preset magic. */
+ fgets (line, 10, f);
+ if (!strncmp (line, PRESETMAGIC, 4))
+ {
+ for (line_idx = 0; line_idx < 5; line_idx++)
+ {
+ if (!fgets (line, sizeof (line), f))
+ break;
+ g_strchomp (line);
+ if (!strncmp (line, prefix, prefix_len))
+ {
+ fclose(f);
+ return g_strdup (line+prefix_len);
+ }
+ }
+ }
+ fclose (f);
+ }
+ return NULL;
+}
+
+static gchar *
+get_object_name (const gchar *dir,
+ gchar *filename,
+ void *context)
+{
+ gchar *ret = NULL, *unprocessed_line = NULL;
+ gchar *full_path = NULL;
+
+ /* First try to extract the object's name (= user-friendly description)
+ * from the preset file
+ * */
+
+ full_path = g_build_filename (dir, filename, NULL);
+
+ unprocessed_line = get_early_line_from_preset (full_path, "name=");
+ if (unprocessed_line)
+ {
+ ret = g_strcompress (unprocessed_line);
+ g_free (unprocessed_line);
+ }
+ else
+ {
+ /* The object name defaults to a filename-derived description */
+ ret = g_filename_display_basename (full_path);
+ }
+
+ g_free (full_path);
+
+ return ret;
+}
+
+
+static void
+preset_read_dir_into_list (void)
+{
+ readdirintolist_extended ("Presets", presetlist, NULL, TRUE,
+ get_object_name, NULL);
+}
+
+static gchar *
+preset_create_filename (const gchar *basename,
+ const gchar *dest_dir)
+{
+ gchar *fullpath;
+ gchar *safe_name;
+ gint i;
+ gint unum = 1;
+
+ g_return_val_if_fail (basename != NULL, NULL);
+ g_return_val_if_fail (dest_dir != NULL, NULL);
+ g_return_val_if_fail (g_path_is_absolute (dest_dir), NULL);
+
+ safe_name = g_filename_from_utf8 (basename, -1, NULL, NULL, NULL);
+
+ if (safe_name[0] == '.')
+ safe_name[0] = '-';
+
+ for (i = 0; safe_name[i]; i++)
+ if (safe_name[i] == G_DIR_SEPARATOR || g_ascii_isspace (safe_name[i]))
+ safe_name[i] = '-';
+
+ fullpath = g_build_filename (dest_dir, safe_name, NULL);
+
+ while (g_file_test (fullpath, G_FILE_TEST_EXISTS))
+ {
+ gchar *filename;
+
+ g_free (fullpath);
+
+ filename = g_strdup_printf ("%s-%d", safe_name, unum++);
+
+ fullpath = g_build_filename (dest_dir, filename, NULL);
+
+ g_free (filename);
+ }
+
+ g_free (safe_name);
+
+ return fullpath;
+}
+
+
+static void
+add_factory_defaults (void)
+{
+ GtkTreeIter iter;
+
+ gtk_list_store_append (store, &iter);
+ /* Set the filename. */
+ gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_FILENAME,
+ factory_defaults, -1);
+ /* Set the object name. */
+ gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_OBJECT_NAME,
+ factory_defaults, -1);
+
+}
+
+static void
+preset_refresh_presets (void)
+{
+ gtk_list_store_clear (store);
+ add_factory_defaults ();
+ preset_read_dir_into_list ();
+}
+
+static int
+load_old_preset (const gchar *fname)
+{
+ FILE *f;
+ int len;
+
+ f = g_fopen (fname, "rb");
+ if (!f)
+ {
+ g_printerr ("Error opening file \"%s\" for reading!\n",
+ gimp_filename_to_utf8 (fname));
+ return -1;
+ }
+ len = fread (&pcvals, 1, sizeof (pcvals), f);
+ fclose (f);
+
+ return (len != sizeof (pcvals)) ? -1 : 0;
+}
+
+static unsigned int
+hexval (char c)
+{
+ c = g_ascii_tolower (c);
+ if ((c >= 'a') && (c <= 'f'))
+ return c - 'a' + 10;
+ if ((c >= '0') && (c <= '9'))
+ return c - '0';
+ return 0;
+}
+
+static char *
+parse_rgb_string (const gchar *s)
+{
+ static char col[3];
+ col[0] = (hexval (s[0]) << 4) | hexval (s[1]);
+ col[1] = (hexval (s[2]) << 4) | hexval (s[3]);
+ col[2] = (hexval (s[4]) << 4) | hexval (s[5]);
+ return col;
+}
+
+static void
+set_orient_vector (const gchar *str)
+{
+ const gchar *tmps = str;
+ int n;
+
+ n = atoi (tmps);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].x = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].y = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].dir = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].dx = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].dy = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].str = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.orient_vectors[n].type = atoi (++tmps);
+
+}
+
+static void set_size_vector (const gchar *str)
+{
+ const gchar *tmps = str;
+ int n;
+
+ n = atoi (tmps);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.size_vectors[n].x = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.size_vectors[n].y = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.size_vectors[n].siz = g_ascii_strtod (++tmps, NULL);
+
+ if (!(tmps = strchr (tmps, ',')))
+ return;
+ pcvals.size_vectors[n].str = g_ascii_strtod (++tmps, NULL);
+
+}
+
+static void
+parse_desc (const gchar *str, gchar *d, gssize d_len)
+{
+ gchar *dest = g_strcompress (str);
+
+ g_strlcpy (d, dest, d_len);
+
+ g_free (dest);
+}
+
+static void
+set_values (const gchar *key, const gchar *val)
+{
+ if (!strcmp (key, "desc"))
+ parse_desc (val, presetdesc, sizeof (presetdesc));
+ else if (!strcmp (key, "orientnum"))
+ pcvals.orient_num = atoi (val);
+ else if (!strcmp (key, "orientfirst"))
+ pcvals.orient_first = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "orientlast"))
+ pcvals.orient_last = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "orienttype"))
+ pcvals.orient_type = orientation_type_input (atoi (val));
+
+ else if (!strcmp (key, "sizenum"))
+ pcvals.size_num = atoi (val);
+ else if (!strcmp (key, "sizefirst"))
+ pcvals.size_first = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "sizelast"))
+ pcvals.size_last = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "sizetype"))
+ pcvals.size_type = size_type_input (atoi (val));
+
+ else if (!strcmp (key, "brushrelief"))
+ pcvals.brush_relief = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "brushscale"))
+ {
+ /* For compatibility */
+ pcvals.size_num = 1;
+ pcvals.size_first = pcvals.size_last = g_ascii_strtod (val, NULL);
+ }
+ else if (!strcmp (key, "brushdensity"))
+ pcvals.brush_density = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "brushgamma"))
+ pcvals.brushgamma = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "brushaspect"))
+ pcvals.brush_aspect = g_ascii_strtod (val, NULL);
+
+ else if (!strcmp (key, "generalbgtype"))
+ pcvals.general_background_type = general_bg_type_input (atoi (val));
+ else if (!strcmp (key, "generaldarkedge"))
+ pcvals.general_dark_edge = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "generalpaintedges"))
+ pcvals.general_paint_edges = atoi (val);
+ else if (!strcmp (key, "generaltileable"))
+ pcvals.general_tileable = atoi (val);
+ else if (!strcmp (key, "generaldropshadow"))
+ pcvals.general_drop_shadow = atoi (val);
+ else if (!strcmp (key, "generalshadowdarkness"))
+ pcvals.general_shadow_darkness = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "generalshadowdepth"))
+ pcvals.general_shadow_depth = atoi (val);
+ else if (!strcmp (key, "generalshadowblur"))
+ pcvals.general_shadow_blur = atoi (val);
+ else if (!strcmp (key, "devthresh"))
+ pcvals.devthresh = g_ascii_strtod (val, NULL);
+
+ else if (!strcmp (key, "paperrelief"))
+ pcvals.paper_relief = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "paperscale"))
+ pcvals.paper_scale = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "paperinvert"))
+ pcvals.paper_invert = atoi (val);
+ else if (!strcmp (key, "paperoverlay"))
+ pcvals.paper_overlay = atoi (val);
+
+ else if (!strcmp (key, "placetype"))
+ pcvals.place_type = place_type_input (atoi (val));
+ else if (!strcmp (key, "placecenter"))
+ pcvals.placement_center = atoi (val);
+
+ else if (!strcmp (key, "selectedbrush"))
+ g_strlcpy (pcvals.selected_brush, val, sizeof (pcvals.selected_brush));
+ else if (!strcmp (key, "selectedpaper"))
+ g_strlcpy (pcvals.selected_paper, val, sizeof (pcvals.selected_paper));
+
+ else if (!strcmp (key, "color"))
+ {
+ char *c = parse_rgb_string (val);
+ gimp_rgba_set_uchar (&pcvals.color, c[0], c[1], c[2], 255);
+ }
+
+ else if (!strcmp (key, "numorientvector"))
+ pcvals.num_orient_vectors = atoi (val);
+ else if (!strcmp (key, "orientvector"))
+ set_orient_vector (val);
+ else if (!strcmp (key, "orientangoff"))
+ pcvals.orient_angle_offset = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "orientstrexp"))
+ pcvals.orient_strength_exponent = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "orientvoronoi"))
+ pcvals.orient_voronoi = atoi (val);
+
+ else if (!strcmp (key, "numsizevector"))
+ pcvals.num_size_vectors = atoi (val);
+ else if (!strcmp (key, "sizevector"))
+ set_size_vector (val);
+ else if (!strcmp (key, "sizestrexp"))
+ pcvals.size_strength_exponent = g_ascii_strtod (val, NULL);
+ else if (!strcmp (key, "sizevoronoi"))
+ pcvals.size_voronoi = atoi (val);
+
+ else if (!strcmp (key, "colortype"))
+ pcvals.color_type = color_type_input (atoi (val));
+ else if (!strcmp (key, "colornoise"))
+ pcvals.color_noise = g_ascii_strtod (val, NULL);
+}
+
+static int
+load_preset (const gchar *fn)
+{
+ char line[1024] = "";
+ FILE *f;
+
+ f = g_fopen (fn, "rt");
+ if (!f)
+ {
+ g_printerr ("Error opening file \"%s\" for reading!\n",
+ gimp_filename_to_utf8 (fn));
+ return -1;
+ }
+ fgets (line, 10, f);
+ if (strncmp (line, PRESETMAGIC, 4))
+ {
+ fclose (f);
+ return load_old_preset (fn);
+ }
+
+ restore_default_values ();
+
+ while (!feof (f))
+ {
+ char *tmps;
+
+ if (!fgets (line, 1024, f))
+ break;
+ g_strchomp (line);
+ tmps = strchr (line, '=');
+ if (!tmps)
+ continue;
+ *tmps = '\0';
+ tmps++;
+ set_values (line, tmps);
+ }
+ fclose (f);
+ return 0;
+}
+
+int
+select_preset (const gchar *preset)
+{
+ int ret = SELECT_PRESET_OK;
+ /* I'm copying this behavior as is. As it seems applying the
+ * factory_defaults preset does nothing, which I'm not sure
+ * if that was what the author intended.
+ * -- Shlomi Fish
+ */
+ if (strcmp (preset, factory_defaults))
+ {
+ gchar *rel = g_build_filename ("Presets", preset, NULL);
+ gchar *abs = findfile (rel);
+
+ g_free (rel);
+
+ if (abs)
+ {
+ if (load_preset (abs))
+ ret = SELECT_PRESET_LOAD_FAILED;
+
+ g_free (abs);
+ }
+ else
+ {
+ ret = SELECT_PRESET_FILE_NOT_FOUND;
+ }
+ }
+ if (ret == SELECT_PRESET_OK)
+ {
+ /* This is so the colorbrushes param (that is not stored in the
+ * preset will be set correctly upon the preset loading.
+ * */
+ set_colorbrushes (pcvals.selected_brush);
+ }
+
+ return ret;
+}
+
+static void
+apply_preset (GtkWidget *w, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gchar *preset;
+
+ gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME,
+ &preset, -1);
+
+ select_preset (preset);
+
+ restore_values ();
+
+ /* g_free (preset); */
+ g_free (selected_preset_filename);
+ selected_preset_filename = preset;
+ }
+}
+
+static void
+delete_preset (GtkWidget *w, GtkTreeSelection *selection)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gchar *preset;
+
+ gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME,
+ &preset, -1);
+
+ if (preset)
+ {
+ gchar *rel = g_build_filename ("Presets", preset, NULL);
+ gchar *abs = findfile (rel);
+
+ g_free (rel);
+
+ if (abs)
+ {
+ /* Don't delete global presets - bug # 147483 */
+ if (can_delete_preset (abs))
+ g_unlink (abs);
+
+ g_free (abs);
+ }
+
+ preset_refresh_presets ();
+
+ g_free (preset);
+ }
+ }
+}
+
+static void save_preset (void);
+
+static void
+preset_desc_callback (GtkTextBuffer *buffer, gpointer data)
+{
+ char *str;
+ GtkTextIter start, end;
+
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ str = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
+ g_strlcpy (presetdesc, str, sizeof (presetdesc));
+ g_free (str);
+}
+
+static void
+save_preset_response (GtkWidget *widget,
+ gint response_id,
+ gpointer data)
+{
+ gtk_widget_destroy (widget);
+
+ if (response_id == GTK_RESPONSE_OK)
+ save_preset ();
+}
+
+static void
+create_save_preset (GtkWidget *parent)
+{
+ static GtkWidget *window = NULL;
+ GtkWidget *box, *label;
+ GtkWidget *swin, *text;
+ GtkTextBuffer *buffer;
+
+ if (window)
+ {
+ gtk_window_present (GTK_WINDOW (window));
+ return;
+ }
+
+ window = gimp_dialog_new (_("Save Current"), PLUG_IN_ROLE,
+ gtk_widget_get_toplevel (parent), 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (window),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (window, "response",
+ G_CALLBACK (save_preset_response),
+ NULL);
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &window);
+
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_set_border_width (GTK_CONTAINER (box), 12);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (window))),
+ box, TRUE, TRUE, 0);
+ gtk_widget_show (box);
+
+ label = gtk_label_new (_("Description:"));
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+ gtk_widget_show (label);
+
+ swin = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
+ GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (box), swin, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show (swin);
+
+ buffer = gtk_text_buffer_new (NULL);
+ g_signal_connect (buffer, "changed",
+ G_CALLBACK (preset_desc_callback), NULL);
+ gtk_text_buffer_set_text (buffer, presetdesc, -1);
+
+ text = gtk_text_view_new_with_buffer (buffer);
+ gtk_widget_set_size_request (text, -1, 192);
+ gtk_container_add (GTK_CONTAINER (swin), text);
+ gtk_widget_show (text);
+
+ gtk_widget_show (window);
+}
+
+static void
+save_preset (void)
+{
+ const gchar *preset_name;
+
+ gchar *fname, *presets_dir_path;
+ FILE *f;
+ GList *thispath;
+ gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+ gchar vbuf[6][G_ASCII_DTOSTR_BUF_SIZE];
+ guchar color[3];
+ gint i;
+ gchar *desc_escaped, *preset_name_escaped;
+
+ preset_name = gtk_entry_get_text (GTK_ENTRY (presetnameentry));
+ thispath = parsepath ();
+ store_values ();
+
+ if (!thispath)
+ {
+ g_printerr ("Internal error: (save_preset) thispath == NULL\n");
+ return;
+ }
+
+ /* Create the ~/.gimp-$VER/gimpressionist/Presets directory if
+ * it doesn't already exists.
+ *
+ */
+ presets_dir_path = g_build_filename ((const gchar *) thispath->data,
+ "Presets",
+ NULL);
+
+ if (! g_file_test (presets_dir_path, G_FILE_TEST_IS_DIR))
+ {
+ if (g_mkdir (presets_dir_path,
+ S_IRUSR | S_IWUSR | S_IXUSR |
+ S_IRGRP | S_IXGRP |
+ S_IROTH | S_IXOTH) == -1)
+ {
+ g_printerr ("Error creating folder \"%s\"!\n",
+ gimp_filename_to_utf8 (presets_dir_path));
+ g_free (presets_dir_path);
+ return;
+ }
+ }
+
+ /* Check if the user-friendly name has changed. If so, then save it
+ * under a new file. If not - use the same file name.
+ */
+ if (selected_preset_orig_name &&
+ strcmp (preset_name, selected_preset_orig_name) == 0)
+ {
+ fname = g_build_filename (presets_dir_path,
+ selected_preset_filename,
+ NULL);
+ }
+ else
+ {
+ fname = preset_create_filename (preset_name, presets_dir_path);
+ }
+
+ g_free (presets_dir_path);
+
+ if (!fname)
+ {
+ g_printerr ("Error building a filename for preset \"%s\"!\n",
+ preset_name);
+ return;
+ }
+
+ f = g_fopen (fname, "wt");
+ if (!f)
+ {
+ g_printerr ("Error opening file \"%s\" for writing!\n",
+ gimp_filename_to_utf8 (fname));
+ g_free (fname);
+ return;
+ }
+
+ fprintf (f, "%s\n", PRESETMAGIC);
+ desc_escaped = g_strescape (presetdesc, NULL);
+ fprintf (f, "desc=%s\n", desc_escaped);
+ g_free (desc_escaped);
+ preset_name_escaped = g_strescape (preset_name, NULL);
+ fprintf (f, "name=%s\n", preset_name_escaped);
+ g_free (preset_name_escaped);
+ fprintf (f, "orientnum=%d\n", pcvals.orient_num);
+ fprintf (f, "orientfirst=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_first));
+ fprintf (f, "orientlast=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_last));
+ fprintf (f, "orienttype=%d\n", pcvals.orient_type);
+
+ fprintf (f, "sizenum=%d\n", pcvals.size_num);
+ fprintf (f, "sizefirst=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_first));
+ fprintf (f, "sizelast=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_last));
+ fprintf (f, "sizetype=%d\n", pcvals.size_type);
+
+ fprintf (f, "brushrelief=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_relief));
+ fprintf (f, "brushdensity=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_density));
+ fprintf (f, "brushgamma=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brushgamma));
+ fprintf (f, "brushaspect=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.brush_aspect));
+
+ fprintf (f, "generalbgtype=%d\n", pcvals.general_background_type);
+ fprintf (f, "generaldarkedge=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.general_dark_edge));
+ fprintf (f, "generalpaintedges=%d\n", pcvals.general_paint_edges);
+ fprintf (f, "generaltileable=%d\n", pcvals.general_tileable);
+ fprintf (f, "generaldropshadow=%d\n", pcvals.general_drop_shadow);
+ fprintf (f, "generalshadowdarkness=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.general_shadow_darkness));
+ fprintf (f, "generalshadowdepth=%d\n", pcvals.general_shadow_depth);
+ fprintf (f, "generalshadowblur=%d\n", pcvals.general_shadow_blur);
+ fprintf (f, "devthresh=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.devthresh));
+
+ fprintf (f, "paperrelief=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.paper_relief));
+ fprintf (f, "paperscale=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.paper_scale));
+ fprintf (f, "paperinvert=%d\n", pcvals.paper_invert);
+ fprintf (f, "paperoverlay=%d\n", pcvals.paper_overlay);
+
+ fprintf (f, "selectedbrush=%s\n", pcvals.selected_brush);
+ fprintf (f, "selectedpaper=%s\n", pcvals.selected_paper);
+
+ gimp_rgb_get_uchar (&pcvals.color, &color[0], &color[1], &color[2]);
+ fprintf (f, "color=%02x%02x%02x\n", color[0], color[1], color[2]);
+
+ fprintf (f, "placetype=%d\n", pcvals.place_type);
+ fprintf (f, "placecenter=%d\n", pcvals.placement_center);
+
+ fprintf (f, "numorientvector=%d\n", pcvals.num_orient_vectors);
+ for (i = 0; i < pcvals.num_orient_vectors; i++)
+ {
+ g_ascii_dtostr (vbuf[0], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].x);
+ g_ascii_dtostr (vbuf[1], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].y);
+ g_ascii_dtostr (vbuf[2], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dir);
+ g_ascii_dtostr (vbuf[3], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dx);
+ g_ascii_dtostr (vbuf[4], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].dy);
+ g_ascii_dtostr (vbuf[5], G_ASCII_DTOSTR_BUF_SIZE, pcvals.orient_vectors[i].str);
+
+ fprintf (f, "orientvector=%d,%s,%s,%s,%s,%s,%s,%d\n", i,
+ vbuf[0], vbuf[1], vbuf[2], vbuf[3], vbuf[4], vbuf[5],
+ pcvals.orient_vectors[i].type);
+ }
+
+ fprintf (f, "orientangoff=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE,
+ pcvals.orient_angle_offset));
+ fprintf (f, "orientstrexp=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE,
+ pcvals.orient_strength_exponent));
+ fprintf (f, "orientvoronoi=%d\n", pcvals.orient_voronoi);
+
+ fprintf (f, "numsizevector=%d\n", pcvals.num_size_vectors);
+ for (i = 0; i < pcvals.num_size_vectors; i++)
+ {
+ g_ascii_dtostr (vbuf[0], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].x);
+ g_ascii_dtostr (vbuf[1], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].y);
+ g_ascii_dtostr (vbuf[2], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].siz);
+ g_ascii_dtostr (vbuf[3], G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_vectors[i].str);
+ fprintf (f, "sizevector=%d,%s,%s,%s,%s\n", i,
+ vbuf[0], vbuf[1], vbuf[2], vbuf[3]);
+ }
+ fprintf (f, "sizestrexp=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.size_strength_exponent));
+ fprintf (f, "sizevoronoi=%d\n", pcvals.size_voronoi);
+
+ fprintf (f, "colortype=%d\n", pcvals.color_type);
+ fprintf (f, "colornoise=%s\n",
+ g_ascii_dtostr (buf, G_ASCII_DTOSTR_BUF_SIZE, pcvals.color_noise));
+
+ fclose (f);
+ preset_refresh_presets ();
+ reselect (presetlist, fname);
+
+ g_free (fname);
+}
+
+static void
+read_description (const char *fn)
+{
+ char *rel_fname;
+ char *fname;
+ gchar *unprocessed_line;
+
+ rel_fname = g_build_filename ("Presets", fn, NULL);
+ fname = findfile (rel_fname);
+ g_free (rel_fname);
+
+ if (!fname)
+ {
+ if (!strcmp (fn, factory_defaults))
+ {
+ gtk_widget_set_sensitive (delete_button, FALSE);
+ set_preset_description_text (_("Gimpressionist Defaults"));
+ }
+ else
+ {
+ set_preset_description_text ("");
+ }
+ return;
+ }
+
+ /* Don't delete global presets - bug # 147483 */
+ gtk_widget_set_sensitive (delete_button, can_delete_preset (fname));
+
+ unprocessed_line = get_early_line_from_preset (fname, "desc=");
+ g_free (fname);
+
+ if (unprocessed_line)
+ {
+ char tmplabel[4096];
+ parse_desc (unprocessed_line, tmplabel, sizeof (tmplabel));
+ g_free (unprocessed_line);
+ set_preset_description_text (tmplabel);
+ }
+ else
+ {
+ set_preset_description_text ("");
+ }
+}
+
+static void
+presets_list_select_preset (GtkTreeSelection *selection,
+ gpointer data)
+{
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gchar *preset_name;
+ gchar *preset_filename;
+
+ gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_OBJECT_NAME,
+ &preset_name, -1);
+ gtk_tree_model_get (model, &iter, PRESETS_LIST_COLUMN_FILENAME,
+ &preset_filename, -1);
+
+ /* TODO : Maybe make the factory defaults behavior in regards
+ * to the preset's object name and filename more robust?
+ *
+ */
+ if (strcmp (preset_filename, factory_defaults))
+ {
+ gtk_entry_set_text (GTK_ENTRY (presetnameentry), preset_name);
+ g_free (selected_preset_orig_name);
+ g_free (selected_preset_filename);
+ selected_preset_orig_name = g_strdup (preset_name);
+ selected_preset_filename = g_strdup (selected_preset_filename);
+ }
+
+ read_description (preset_filename);
+
+ g_free (preset_name);
+ g_free (preset_filename);
+ }
+}
+
+static GtkWidget *
+create_presets_list (GtkWidget *parent)
+{
+ GtkListStore *store;
+ GtkTreeSelection *selection;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkWidget *swin, *view;
+
+ swin = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
+ GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (parent), swin, FALSE, FALSE, 0);
+ gtk_widget_show (swin);
+ gtk_widget_set_size_request (swin, 200, -1);
+
+ store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+ view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
+ g_object_unref (store);
+ gtk_widget_show (view);
+
+ renderer = gtk_cell_renderer_text_new ();
+
+ column =
+ gtk_tree_view_column_new_with_attributes ("Preset", renderer,
+ "text",
+ PRESETS_LIST_COLUMN_OBJECT_NAME,
+ NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+
+
+ gtk_container_add (GTK_CONTAINER (swin), view);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+ g_signal_connect (selection, "changed",
+ G_CALLBACK (presets_list_select_preset),
+ NULL);
+
+ return view;
+}
+
+void
+create_presetpage (GtkNotebook *notebook)
+{
+ GtkWidget *vbox, *hbox, *box1, *box2, *thispage;
+ GtkWidget *view;
+ GtkWidget *tmpw;
+ GtkWidget *label;
+ GtkTreeSelection *selection;
+
+ label = gtk_label_new_with_mnemonic (_("_Presets"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box1, FALSE, FALSE, 0);
+ gtk_widget_show (box1);
+
+ presetnameentry = tmpw = gtk_entry_new ();
+ gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 0);
+ gtk_widget_set_size_request (tmpw, 200, -1);
+ gtk_widget_show (tmpw);
+
+ presetsavebutton = tmpw = gtk_button_new_with_label ( _("Save Current..."));
+ gtk_button_set_image (GTK_BUTTON (presetsavebutton),
+ gtk_image_new_from_icon_name (GIMP_ICON_DOCUMENT_SAVE,
+ GTK_ICON_SIZE_BUTTON));
+ gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (create_save_preset), NULL);
+ gimp_help_set_help_data
+ (tmpw, _("Save the current settings to the specified file"), NULL);
+
+ box1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box1, TRUE, TRUE, 0);
+ gtk_widget_show (box1);
+
+ presetlist = view = create_presets_list (box1);
+ store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+ add_factory_defaults ();
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_box_pack_start (GTK_BOX (box1), vbox, FALSE, FALSE, 0);
+ gtk_widget_show (vbox);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (hbox), box2, FALSE, FALSE, 0);
+ gtk_widget_show (box2);
+
+ tmpw = gtk_button_new_with_mnemonic (_("_Apply"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (apply_preset), selection);
+ gimp_help_set_help_data
+ (tmpw, _("Reads the selected Preset into memory"), NULL);
+
+ tmpw = delete_button = gtk_button_new_with_mnemonic (_("_Delete"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (delete_preset), selection);
+ gimp_help_set_help_data (tmpw, _("Deletes the selected Preset"), NULL);
+
+ tmpw = gtk_button_new_with_mnemonic (_("_Refresh"));
+ gtk_box_pack_start (GTK_BOX (box2), tmpw, FALSE, FALSE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked", G_CALLBACK (preset_refresh_presets), NULL);
+ gimp_help_set_help_data (tmpw, _("Reread the folder of Presets"), NULL);
+
+ presetdesclabel = tmpw = gtk_label_new (NULL);
+ gimp_label_set_attributes (GTK_LABEL (tmpw),
+ PANGO_ATTR_STYLE, PANGO_STYLE_ITALIC,
+ -1);
+ gtk_label_set_line_wrap (GTK_LABEL (tmpw), TRUE);
+ /*
+ * Make sure the label's width is reasonable and it won't stretch
+ * the dialog more than its width.
+ * */
+ gtk_widget_set_size_request (tmpw, 240, -1);
+
+ gtk_label_set_xalign (GTK_LABEL (tmpw), 0.0);
+ gtk_label_set_yalign (GTK_LABEL (tmpw), 0.0);
+ gtk_box_pack_start (GTK_BOX (vbox), tmpw, TRUE, TRUE, 0);
+ gtk_widget_show (tmpw);
+
+ preset_read_dir_into_list ();
+
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/presets.h b/plug-ins/gimpressionist/presets.h
new file mode 100644
index 0000000..ba67bdc
--- /dev/null
+++ b/plug-ins/gimpressionist/presets.h
@@ -0,0 +1,34 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PRESETS_H
+#define __PRESETS_H
+
+enum SELECT_PRESET_RETURN_VALUES
+{
+ SELECT_PRESET_OK = 0,
+ SELECT_PRESET_FILE_NOT_FOUND = -1,
+ SELECT_PRESET_LOAD_FAILED = -2,
+};
+
+void create_presetpage (GtkNotebook *);
+int select_preset (const gchar *preset);
+void preset_free (void);
+void preset_save_button_set_sensitive (gboolean s);
+
+#endif
+
diff --git a/plug-ins/gimpressionist/preview.c b/plug-ins/gimpressionist/preview.c
new file mode 100644
index 0000000..3619782
--- /dev/null
+++ b/plug-ins/gimpressionist/preview.c
@@ -0,0 +1,191 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "infile.h"
+#include "preview.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+static GtkWidget *preview = NULL;
+static GtkWidget *previewbutton = NULL;
+
+void
+preview_set_button_label (const gchar *text)
+{
+ g_object_set (previewbutton,
+ "label", text,
+ "use-underline", TRUE,
+ NULL);
+}
+
+static void
+drawalpha (ppm_t *p, ppm_t *a)
+{
+ int x, y, g;
+ double v;
+ int gridsize = 16;
+ int rowstride = p->width * 3;
+
+ for (y = 0; y < p->height; y++)
+ {
+ for (x = 0; x < p->width; x++)
+ {
+ int k = y * rowstride + x * 3;
+
+ if (!a->col[k])
+ continue;
+
+ v = 1.0 - a->col[k] / 255.0;
+ g = ((x / gridsize + y / gridsize) % 2) * 60 + 100;
+ p->col[k+0] *= v;
+ p->col[k+1] *= v;
+ p->col[k+2] *= v;
+ v = 1.0 - v;
+ p->col[k+0] += g*v;
+ p->col[k+1] += g*v;
+ p->col[k+2] += g*v;
+ }
+ }
+}
+
+static ppm_t preview_ppm = {0, 0, NULL};
+static ppm_t alpha_ppm = {0, 0, NULL};
+static ppm_t backup_ppm = {0, 0, NULL};
+static ppm_t alpha_backup_ppm = {0, 0, NULL};
+
+void
+preview_free_resources (void)
+{
+ ppm_kill (&preview_ppm);
+ ppm_kill (&alpha_ppm);
+ ppm_kill (&backup_ppm);
+ ppm_kill (&alpha_backup_ppm);
+}
+
+void
+updatepreview (GtkWidget *wg, gpointer d)
+{
+ if (!PPM_IS_INITED (&backup_ppm))
+ {
+ infile_copy_to_ppm (&backup_ppm);
+ if ((backup_ppm.width != PREVIEWSIZE) ||
+ (backup_ppm.height != PREVIEWSIZE))
+ resize_fast (&backup_ppm, PREVIEWSIZE, PREVIEWSIZE);
+ if (img_has_alpha)
+ {
+ infile_copy_alpha_to_ppm (&alpha_backup_ppm);
+ if ((alpha_backup_ppm.width != PREVIEWSIZE) ||
+ (alpha_backup_ppm.height != PREVIEWSIZE))
+ resize_fast (&alpha_backup_ppm, PREVIEWSIZE, PREVIEWSIZE);
+ }
+ }
+
+ if (!PPM_IS_INITED (&preview_ppm))
+ {
+ ppm_copy (&backup_ppm, &preview_ppm);
+
+ if (img_has_alpha)
+ ppm_copy (&alpha_backup_ppm, &alpha_ppm);
+ }
+
+ if (d)
+ {
+ store_values ();
+
+ if (GPOINTER_TO_INT (d) != 2)
+ repaint (&preview_ppm, &alpha_ppm);
+ }
+
+ if (img_has_alpha)
+ drawalpha (&preview_ppm, &alpha_ppm);
+
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (preview),
+ 0, 0, PREVIEWSIZE, PREVIEWSIZE,
+ GIMP_RGB_IMAGE,
+ preview_ppm.col,
+ PREVIEWSIZE * 3);
+
+ ppm_kill (&preview_ppm);
+ if (img_has_alpha)
+ ppm_kill (&alpha_ppm);
+}
+
+static void
+preview_size_allocate (GtkWidget *preview)
+{
+ updatepreview (preview, GINT_TO_POINTER (0));
+}
+
+GtkWidget *
+create_preview (void)
+{
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *frame;
+ GtkWidget *button;
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 5);
+ gtk_widget_show (frame);
+
+ preview = gimp_preview_area_new ();
+ gtk_widget_set_size_request (preview, PREVIEWSIZE, PREVIEWSIZE);
+
+ gtk_container_add (GTK_CONTAINER (frame), preview);
+ gtk_widget_show (preview);
+ /* This is so the preview will be displayed when the dialog is invoked. */
+ g_signal_connect (preview, "size-allocate",
+ G_CALLBACK (preview_size_allocate), NULL);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ previewbutton = button = gtk_button_new_with_mnemonic (_("_Update"));
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (updatepreview), (gpointer) 1);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+ gimp_help_set_help_data (button,
+ _("Refresh the Preview window"), NULL);
+
+ button = gtk_button_new_with_mnemonic (_("_Reset"));
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (updatepreview), (gpointer) 2);
+ gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+ gimp_help_set_help_data (button,
+ _("Revert to the original image"), NULL);
+
+ return vbox;
+}
diff --git a/plug-ins/gimpressionist/preview.h b/plug-ins/gimpressionist/preview.h
new file mode 100644
index 0000000..1e3d456
--- /dev/null
+++ b/plug-ins/gimpressionist/preview.h
@@ -0,0 +1,26 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __PREVIEW_H
+#define __PREVIEW_H
+
+GtkWidget* create_preview (void);
+void updatepreview (GtkWidget *wg, gpointer d);
+void preview_free_resources(void);
+void preview_set_button_label(const gchar * text);
+
+#endif /* #ifndef __PREVIEW_H */
diff --git a/plug-ins/gimpressionist/random.h b/plug-ins/gimpressionist/random.h
new file mode 100644
index 0000000..f52cb13
--- /dev/null
+++ b/plug-ins/gimpressionist/random.h
@@ -0,0 +1,24 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __RAND_H
+#define __RAND_H
+
+extern GRand *random_generator;
+
+#endif
+
diff --git a/plug-ins/gimpressionist/repaint.c b/plug-ins/gimpressionist/repaint.c
new file mode 100644
index 0000000..c8eba2d
--- /dev/null
+++ b/plug-ins/gimpressionist/repaint.c
@@ -0,0 +1,1201 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+
+#include "gimpressionist.h"
+#include "brush.h"
+#include "orientation.h"
+#include "placement.h"
+#include "ppmtool.h"
+#include "preview.h"
+#include "random.h"
+#include "size.h"
+#include "infile.h"
+
+#include <libgimp/stdplugins-intl.h>
+
+static gimpressionist_vals_t runningvals;
+
+static double
+get_siz_from_pcvals (double x, double y)
+{
+ return getsiz_proto (x, y, pcvals.num_size_vectors, pcvals.size_vectors,
+ pcvals.size_strength_exponent, pcvals.size_voronoi);
+}
+
+static int
+get_pixel_value (double dir)
+{
+ while (dir < 0.0)
+ dir += 360.0;
+ while (dir >= 360.0)
+ dir -= 360.0;
+ return dir * 255.0 / 360.0;
+}
+
+static void
+prepare_brush (ppm_t *p)
+{
+ int x, y;
+ int rowstride = p->width * 3;
+
+ for (y = 0; y< p->height; y++)
+ {
+ for (x = 0; x < p->width; x++)
+ {
+ p->col[y * rowstride + x * 3 + 1] = 0;
+ }
+ }
+
+ for (y = 1; y< p->height; y++)
+ {
+ for (x = 1; x < p->width; x++)
+ {
+ int v = p->col[y * rowstride + x * 3] -
+ p->col[(y - 1) * rowstride + (x - 1) * 3];
+ if (v < 0)
+ v = 0;
+ p->col[y * rowstride + x * 3 + 1] = v;
+ }
+ }
+}
+
+static double
+sum_brush (ppm_t *p)
+{
+ double sum = 0;
+ int i;
+
+ for (i = 0; i < p->width*3*p->height; i += 3)
+ sum += p->col[i];
+ return sum;
+}
+
+/* TODO : Use r = rgb[0]; g = rgb[1] ; b = rgb[2]; instead of
+ * the direct references here.
+ * */
+static int
+get_hue (guchar *rgb)
+{
+ double h, v, temp, diff;
+ /* TODO : There seems to be some typos in the comments here.
+ * Ask vidar what he meant.
+ * */
+ if ((rgb[0] == rgb[1]) && (rgb[0] == rgb[2])) /* Gray */
+ return 0;
+ v = (rgb[0] > rgb[1] ? rgb[0] : rgb[1]); /* v = st<F8>rste verdi */
+ if (rgb[2] > v)
+ v = rgb[2];
+ temp = (rgb[0] > rgb[1] ? rgb[1] : rgb[0] ); /* temp = minste */
+ if (rgb[2] < temp)
+ temp = rgb[2];
+ diff = v - temp;
+
+ if (v == rgb[0])
+ h = ((double)rgb[1] - rgb[2]) / diff;
+ else if(v == rgb[1])
+ h = ((double)rgb[2] - rgb[0]) / diff + 2;
+ else /* v == rgb[2] */
+ h = ((double)rgb[0] - rgb[1]) / diff + 4;
+ if(h < 0) h += 6;
+ return h * 255.0 / 6.0;
+}
+
+static int
+choose_best_brush (ppm_t *p, ppm_t *a, int tx, int ty,
+ ppm_t *brushes, int num_brushes,
+ double *brushes_sum, int start, int step)
+{
+ double dev, thissum;
+ double bestdev = 0.0;
+ double r, g, b;
+ int best = -1;
+ int x, y, h;
+ long i;
+ GList *brlist = NULL;
+
+ for (i = start; i < num_brushes; i += step)
+ {
+ ppm_t *brush = &brushes[i];
+#if 0
+ thissum = 0.0;
+#endif
+ thissum = brushes_sum[i];
+
+/* TODO: Pointer-arithmeticize this code */
+ r = g = b = 0.0;
+ for (y = 0; y < brush->height; y++)
+ {
+ guchar *row = p->col + (ty + y) * p->width * 3;
+
+ for (x = 0; x < brush->width; x++)
+ {
+ int k = (tx + x) * 3;
+ double v;
+
+ if ((h = brush->col[(y * brush->width * 3) + x * 3]))
+ {
+#if 0
+ thissum += h;
+#endif
+ v = h / 255.0;
+ r += row[k+0] * v;
+ g += row[k+1] * v;
+ b += row[k+2] * v;
+ }
+ }
+ }
+ r = r * 255.0 / thissum;
+ g = g * 255.0 / thissum;
+ b = b * 255.0 / thissum;
+
+ dev = 0.0;
+ for (y = 0; y < brush->height; y++)
+ {
+ guchar *row = p->col + (ty + y) * p->width * 3;
+
+ for (x = 0; x < brush->width; x++)
+ {
+ int k = (tx + x) * 3;
+ double v;
+
+ if ((h = brush->col[(y * brush->width * 3) + x * 3]))
+ {
+ v = h / 255.0;
+ dev += abs (row[k+0] - r) * v;
+ dev += abs (row[k+1] - g) * v;
+ dev += abs (row[k+2] - b) * v;
+ if (img_has_alpha)
+ dev += a->col[(ty + y) * a->width * 3 + (tx + x) * 3] * v;
+ }
+ }
+ }
+ dev /= thissum;
+
+ if ((best == -1) || (dev < bestdev))
+ {
+ if (brlist)
+ g_list_free (brlist);
+ brlist = NULL;
+ }
+
+ if (dev <= bestdev || best < 0)
+ {
+ best = i;
+ bestdev = dev;
+ brlist = g_list_append (brlist, (void *)i);
+ }
+ if (dev < runningvals.devthresh)
+ break;
+ }
+
+ if (!brlist)
+ {
+ g_printerr("What!? No brushes?!\n");
+ return 0;
+ }
+
+ i = g_rand_int_range (random_generator, 0, g_list_length (brlist));
+ best = (long)((g_list_nth (brlist,i))->data);
+ g_list_free (brlist);
+
+ return best;
+}
+
+static void
+apply_brush (ppm_t *brush,
+ ppm_t *shadow,
+ ppm_t *p, ppm_t *a,
+ int tx, int ty, int r, int g, int b)
+{
+ ppm_t tmp;
+ ppm_t atmp;
+ double v, h;
+ int x, y;
+ double edgedarken = 1.0 - runningvals.general_dark_edge;
+ double relief = runningvals.brush_relief / 100.0;
+ int shadowdepth = pcvals.general_shadow_depth;
+ int shadowblur = pcvals.general_shadow_blur;
+
+ atmp.col = 0;
+ atmp.width = 0;
+
+ tmp = *p;
+ if (img_has_alpha)
+ atmp = *a;
+
+ if (shadow)
+ {
+ int sx = tx + shadowdepth - shadowblur * 2;
+ int sy = ty + shadowdepth - shadowblur * 2;
+
+ for (y = 0; y < shadow->height; y++)
+ {
+ guchar *row, *arow = NULL;
+
+ if ((sy + y) < 0)
+ continue;
+ if ((sy + y) >= tmp.height)
+ break;
+ row = tmp.col + (sy + y) * tmp.width * 3;
+
+ if (img_has_alpha)
+ arow = atmp.col + (sy + y) * atmp.width * 3;
+
+ for (x = 0; x < shadow->width; x++)
+ {
+ int k = (sx + x) * 3;
+
+ if ((sx + x) < 0)
+ continue;
+ if ((sx + x) >= tmp.width)
+ break;
+
+ h = shadow->col[y * shadow->width * 3 + x * 3 + 2];
+
+ if (!h)
+ continue;
+ v = 1.0 - (h / 255.0 * runningvals.general_shadow_darkness / 100.0);
+
+ row[k+0] *= v;
+ row[k+1] *= v;
+ row[k+2] *= v;
+ if (img_has_alpha)
+ arow[k] *= v;
+ }
+ }
+ }
+
+ for (y = 0; y < brush->height; y++)
+ {
+ guchar *row = tmp.col + (ty + y) * tmp.width * 3;
+ guchar *arow = NULL;
+
+ if (img_has_alpha)
+ arow = atmp.col + (ty + y) * atmp.width * 3;
+
+ for (x = 0; x < brush->width; x++)
+ {
+ int k = (tx + x) * 3;
+ h = brush->col[y * brush->width * 3 + x * 3];
+
+ if (!h) continue;
+
+ if (runningvals.color_brushes)
+ {
+ v = 1.0 - brush->col[y * brush->width * 3 + x * 3 + 2] / 255.0;
+ row[k+0] *= v;
+ row[k+1] *= v;
+ row[k+2] *= v;
+ if (img_has_alpha)
+ arow[(tx + x) * 3] *= v;
+ }
+ v = (1.0 - h / 255.0) * edgedarken;
+ row[k+0] *= v;
+ row[k+1] *= v;
+ row[k+2] *= v;
+ if(img_has_alpha) arow[k] *= v;
+
+ v = h / 255.0;
+ row[k+0] += r * v;
+ row[k+1] += g * v;
+ row[k+2] += b * v;
+ }
+ }
+
+ if (relief > 0.001)
+ {
+ for (y = 1; y < brush->height; y++)
+ {
+ guchar *row = tmp.col + (ty + y) * tmp.width * 3;
+
+ for (x = 1; x < brush->width; x++)
+ {
+ int k = (tx + x) * 3;
+ h = brush->col[y * brush->width * 3 + x * 3 + 1] * relief;
+ if (h < 0.001)
+ continue;
+ if (h > 255) h = 255;
+ row[k+0] = (row[k+0] * (255-h) + 255 * h) / 255;
+ row[k+1] = (row[k+1] * (255-h) + 255 * h) / 255;
+ row[k+2] = (row[k+2] * (255-h) + 255 * h) / 255;
+ }
+ }
+ }
+}
+
+void
+repaint (ppm_t *p, ppm_t *a)
+{
+ int x, y;
+ int tx = 0, ty = 0;
+ ppm_t tmp = {0, 0, NULL};
+ ppm_t atmp = {0, 0, NULL};
+ int r, g, b, h, i, j, on, sn;
+ int num_brushes, maxbrushwidth, maxbrushheight;
+ guchar back[3] = {0, 0, 0};
+ ppm_t *brushes, *shadows;
+ ppm_t *brush, *shadow = NULL;
+ double *brushes_sum;
+ int cx, cy, maxdist;
+ double scale, relief, startangle, anglespan, density, bgamma;
+ int max_progress;
+ ppm_t paper_ppm = {0, 0, NULL};
+ ppm_t dirmap = {0, 0, NULL};
+ ppm_t sizmap = {0, 0, NULL};
+ int *xpos = NULL, *ypos = NULL;
+ int progstep;
+ static int running = 0;
+
+ int dropshadow = pcvals.general_drop_shadow;
+ int shadowblur = pcvals.general_shadow_blur;
+
+ if (running)
+ return;
+ running++;
+
+ runningvals = pcvals;
+
+ /* Shouldn't be necessary, but... */
+ if (img_has_alpha)
+ if ((p->width != a->width) || (p->height != a->height))
+ {
+ g_printerr ("Huh? Image size != alpha size?\n");
+ return;
+ }
+
+ num_brushes = runningvals.orient_num * runningvals.size_num;
+ startangle = runningvals.orient_first;
+ anglespan = runningvals.orient_last;
+
+ density = runningvals.brush_density;
+
+ if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST)
+ density /= 3.0;
+
+ bgamma = runningvals.brushgamma;
+
+ brushes = g_malloc (num_brushes * sizeof (ppm_t));
+ brushes_sum = g_malloc (num_brushes * sizeof (double));
+
+ if (dropshadow)
+ shadows = g_malloc (num_brushes * sizeof (ppm_t));
+ else
+ shadows = NULL;
+
+ brushes[0].col = NULL;
+ brush_get_selected (&brushes[0]);
+
+ resize (&brushes[0],
+ brushes[0].width,
+ brushes[0].height * pow (10, runningvals.brush_aspect));
+ scale = runningvals.size_last / MAX (brushes[0].width, brushes[0].height);
+
+ if (bgamma != 1.0)
+ ppm_apply_gamma (&brushes[0], 1.0 / bgamma, 1,1,1);
+
+ resize (&brushes[0], brushes[0].width * scale, brushes[0].height * scale);
+ i = 1 + sqrt (brushes[0].width * brushes[0].width +
+ brushes[0].height * brushes[0].height);
+ ppm_pad (&brushes[0], i-brushes[0].width, i-brushes[0].width,
+ i - brushes[0].height, i - brushes[0].height, back);
+
+ for (i = 1; i < num_brushes; i++)
+ {
+ brushes[i].col = NULL;
+ ppm_copy (&brushes[0], &brushes[i]);
+ }
+
+ for (i = 0; i < runningvals.size_num; i++)
+ {
+ double sv;
+ if (runningvals.size_num > 1)
+ sv = i / (runningvals.size_num - 1.0);
+ else sv = 1.0;
+ for (j = 0; j < runningvals.orient_num; j++)
+ {
+ h = j + i * runningvals.orient_num;
+ free_rotate (&brushes[h],
+ startangle + j * anglespan / runningvals.orient_num);
+ rescale (&brushes[h],
+ ( sv * runningvals.size_first +
+ (1.0-sv) * runningvals.size_last ) / runningvals.size_last);
+ autocrop (&brushes[h],1);
+ }
+ }
+
+ /* Brush-debugging */
+#if 0
+ for (i = 0; i < num_brushes; i++)
+ {
+ char tmp[1000];
+ g_snprintf (tmp, sizeof (tmp), "/tmp/_brush%03d.ppm", i);
+ ppm_save (&brushes[i], tmp);
+ }
+#endif
+
+ for (i = 0; i < num_brushes; i++)
+ {
+ if (!runningvals.color_brushes)
+ prepare_brush (&brushes[i]);
+ brushes_sum[i] = sum_brush (&brushes[i]);
+ }
+
+ brush = &brushes[0];
+
+ maxbrushwidth = maxbrushheight = 0;
+ for (i = 0; i < num_brushes; i++)
+ {
+ if (brushes[i].width > maxbrushwidth)
+ maxbrushwidth = brushes[i].width;
+ if (brushes[i].height > maxbrushheight)
+ maxbrushheight = brushes[i].height;
+ }
+
+ for (i = 0; i < num_brushes; i++)
+ {
+ int xp, yp;
+ guchar blk[3] = {0, 0, 0};
+
+ xp = maxbrushwidth - brushes[i].width;
+ yp = maxbrushheight - brushes[i].height;
+ if (xp || yp)
+ ppm_pad (&brushes[i], xp / 2, xp - xp / 2, yp / 2, yp - yp / 2, blk);
+ }
+
+ if (dropshadow)
+ {
+ for (i = 0; i < num_brushes; i++)
+ {
+ shadows[i].col = NULL;
+ ppm_copy (&brushes[i], &shadows[i]);
+ ppm_apply_gamma (&shadows[i], 0, 1,1,0);
+ ppm_pad (&shadows[i], shadowblur*2, shadowblur*2,
+ shadowblur*2, shadowblur*2, back);
+ for (j = 0; j < shadowblur; j++)
+ blur (&shadows[i], 2, 2);
+#if 0
+ autocrop (&shadows[i],1);
+#endif
+ }
+#if 0
+ maxbrushwidth += shadowdepth*3;
+ maxbrushheight += shadowdepth*3;
+#endif
+ }
+
+ /* For extra annoying debugging :-) */
+#if 0
+ ppm_save (brushes, "/tmp/__brush.ppm");
+ if (shadows) ppm_save (shadows, "/tmp/__shadow.ppm");
+ system ("xv /tmp/__brush.ppm & xv /tmp/__shadow.ppm & ");
+#endif
+
+ if (runningvals.general_paint_edges)
+ {
+ edgepad (p, maxbrushwidth, maxbrushwidth,
+ maxbrushheight, maxbrushheight);
+ if (img_has_alpha)
+ edgepad (a, maxbrushwidth, maxbrushwidth,
+ maxbrushheight, maxbrushheight);
+ }
+
+ if (img_has_alpha)
+ {
+ /* Initially fully transparent */
+ if (runningvals.general_background_type == BG_TYPE_TRANSPARENT)
+ {
+ guchar tmpcol[3] = {255, 255, 255};
+
+ ppm_new (&atmp, a->width, a->height);
+ fill (&atmp, tmpcol);
+ }
+ else
+ {
+ ppm_copy (a, &atmp);
+ }
+ }
+
+ if (runningvals.general_background_type == BG_TYPE_SOLID)
+ {
+ guchar tmpcol[3];
+
+ ppm_new (&tmp, p->width, p->height);
+ gimp_rgb_get_uchar (&runningvals.color,
+ &tmpcol[0], &tmpcol[1], &tmpcol[2]);
+ fill (&tmp, tmpcol);
+ }
+ else if (runningvals.general_background_type == BG_TYPE_KEEP_ORIGINAL)
+ {
+ ppm_copy (p, &tmp);
+ }
+ else
+ {
+ int dx, dy;
+
+ ppm_new (&tmp, p->width, p->height);
+ ppm_load (runningvals.selected_paper, &paper_ppm);
+
+ if (runningvals.paper_scale != 100.0)
+ {
+ scale = runningvals.paper_scale / 100.0;
+ resize (&paper_ppm, paper_ppm.width * scale, paper_ppm.height * scale);
+ }
+
+ if (runningvals.paper_invert)
+ ppm_apply_gamma (&paper_ppm, -1.0, 1, 1, 1);
+
+ dx = runningvals.general_paint_edges ? paper_ppm.width - maxbrushwidth : 0;
+ dy = runningvals.general_paint_edges ? paper_ppm.height - maxbrushheight : 0;
+
+ for (y = 0; y < tmp.height; y++)
+ {
+ int lx;
+ int ry = (y + dy) % paper_ppm.height;
+
+ for (x = 0; x < tmp.width; x+=lx)
+ {
+ int rx = (x + dx) % paper_ppm.width;
+
+ lx = MIN (tmp.width - x, paper_ppm.width - rx);
+
+ memcpy (&tmp.col[y * tmp.width * 3 + x * 3],
+ &paper_ppm.col[ry * paper_ppm.width * 3 + rx * 3],
+ 3 * lx);
+ }
+ }
+ }
+
+ cx = p->width / 2;
+ cy = p->height / 2;
+ maxdist = sqrt (cx * cx + cy * cy);
+
+ switch (runningvals.orient_type)
+ {
+ case ORIENTATION_VALUE:
+ ppm_new (&dirmap, p->width, p->height);
+ for (y = 0; y < dirmap.height; y++)
+ {
+ guchar *dstrow = &dirmap.col[y * dirmap.width * 3];
+ guchar *srcrow = &p->col[y * p->width * 3];
+ for (x = 0; x < dirmap.width; x++)
+ {
+ dstrow[x * 3] =
+ (srcrow[x * 3] + srcrow[x * 3 + 1] + srcrow[x * 3 + 2]) / 3;
+ }
+ }
+ break;
+
+ case ORIENTATION_RADIUS:
+ ppm_new (&dirmap, p->width, p->height);
+ for (y = 0; y < dirmap.height; y++)
+ {
+ guchar *dstrow = &dirmap.col[y * dirmap.width * 3];
+ double ysqr = (cy - y) * (cy - y);
+
+ for (x = 0; x < dirmap.width; x++)
+ {
+ dstrow[x*3] = sqrt ((cx - x) * (cx - x) + ysqr) * 255 / maxdist;
+ }
+ }
+ break;
+
+ case ORIENTATION_RADIAL:
+ ppm_new (&dirmap, p->width, p->height);
+ for (y = 0; y < dirmap.height; y++)
+ {
+ guchar *dstrow = &dirmap.col[y * dirmap.width * 3];
+
+ for (x = 0; x < dirmap.width; x++)
+ {
+ dstrow[x * 3] = (G_PI + atan2 (cy - y, cx - x)) *
+ 255.0 / (G_PI * 2);
+ }
+ }
+ break;
+
+ case ORIENTATION_FLOWING:
+ ppm_new (&dirmap, p->width / 6 + 5, p->height / 6 + 5);
+ mkgrayplasma (&dirmap, 15);
+ blur (&dirmap, 2, 2);
+ blur (&dirmap, 2, 2);
+ resize (&dirmap, p->width, p->height);
+ blur (&dirmap, 2, 2);
+ if (runningvals.general_paint_edges)
+ edgepad (&dirmap, maxbrushwidth, maxbrushheight,
+ maxbrushwidth, maxbrushheight);
+ break;
+
+ case ORIENTATION_HUE:
+ ppm_new (&dirmap, p->width, p->height);
+ for (y = 0; y < dirmap.height; y++)
+ {
+ guchar *dstrow = &dirmap.col[y * dirmap.width * 3];
+ guchar *srcrow = &p->col[y * p->width * 3];
+
+ for (x = 0; x < dirmap.width; x++)
+ {
+ dstrow[x * 3] = get_hue (&srcrow[x * 3]);
+ }
+ }
+ break;
+
+ case ORIENTATION_ADAPTIVE:
+ {
+ guchar tmpcol[3] = {0, 0, 0};
+
+ ppm_new (&dirmap, p->width, p->height);
+ fill (&dirmap, tmpcol);
+ }
+ break;
+
+ case ORIENTATION_MANUAL:
+ ppm_new (&dirmap, p->width-maxbrushwidth*2, p->height-maxbrushheight*2);
+ for (y = 0; y < dirmap.height; y++)
+ {
+ guchar *dstrow = &dirmap.col[y * dirmap.width * 3];
+ double tmpy = y / (double)dirmap.height;
+ for (x = 0; x < dirmap.width; x++)
+ {
+ dstrow[x * 3] = get_pixel_value(90 -
+ get_direction(x /
+ (double)dirmap.width,
+ tmpy, 1));
+ }
+ }
+ edgepad (&dirmap,
+ maxbrushwidth, maxbrushwidth,
+ maxbrushheight, maxbrushheight);
+ break;
+ }
+
+ if (runningvals.size_type == SIZE_TYPE_VALUE)
+ {
+ ppm_new (&sizmap, p->width, p->height);
+ for (y = 0; y < sizmap.height; y++)
+ {
+ guchar *dstrow = &sizmap.col[y * sizmap.width * 3];
+ guchar *srcrow = &p->col[y * p->width * 3];
+
+ for (x = 0; x < sizmap.width; x++)
+ {
+ dstrow[x * 3] =
+ (srcrow[x * 3] + srcrow[x * 3 + 1] + srcrow[x * 3 + 2]) / 3;
+ }
+ }
+ }
+ else if (runningvals.size_type == SIZE_TYPE_RADIUS)
+ {
+ ppm_new (&sizmap, p->width, p->height);
+ for (y = 0; y < sizmap.height; y++)
+ {
+ guchar *dstrow = &sizmap.col[y * sizmap.width * 3];
+ double ysqr = (cy - y) * (cy - y);
+
+ for (x = 0; x < sizmap.width; x++)
+ {
+ dstrow[x * 3] =
+ sqrt ((cx - x) * (cx - x) + ysqr) * 255 / maxdist;
+ }
+ }
+ }
+ else if (runningvals.size_type == SIZE_TYPE_RADIAL)
+ {
+ ppm_new (&sizmap, p->width, p->height);
+ for (y = 0; y < sizmap.height; y++)
+ {
+ guchar *dstrow = &sizmap.col[y * sizmap.width * 3];
+
+ for (x = 0; x < sizmap.width; x++)
+ {
+ dstrow[x * 3] = (G_PI + atan2 (cy - y, cx - x)) *
+ 255.0 / (G_PI * 2);
+ }
+ }
+ }
+ else if (runningvals.size_type == SIZE_TYPE_FLOWING)
+ {
+ ppm_new (&sizmap, p->width / 6 + 5, p->height / 6 + 5);
+ mkgrayplasma (&sizmap, 15);
+ blur (&sizmap, 2, 2);
+ blur (&sizmap, 2, 2);
+ resize (&sizmap, p->width, p->height);
+ blur (&sizmap, 2, 2);
+ if (runningvals.general_paint_edges)
+ edgepad (&sizmap,
+ maxbrushwidth, maxbrushheight,
+ maxbrushwidth, maxbrushheight);
+ }
+ else if (runningvals.size_type == SIZE_TYPE_HUE)
+ {
+ ppm_new (&sizmap, p->width, p->height);
+ for (y = 0; y < sizmap.height; y++)
+ {
+ guchar *dstrow = &sizmap.col[y * sizmap.width * 3];
+ guchar *srcrow = &p->col[y * p->width * 3];
+
+ for (x = 0; x < sizmap.width; x++)
+ {
+ dstrow[ x * 3] = get_hue (&srcrow[x * 3]);
+ }
+ }
+ }
+ else if (runningvals.size_type == SIZE_TYPE_ADAPTIVE)
+ {
+ guchar tmpcol[3] = {0, 0, 0};
+
+ ppm_new (&sizmap, p->width, p->height);
+ fill (&sizmap, tmpcol);
+ }
+ else if (runningvals.size_type == SIZE_TYPE_MANUAL)
+ {
+ ppm_new (&sizmap,
+ p->width-maxbrushwidth * 2,
+ p->height-maxbrushheight * 2);
+
+ for (y = 0; y < sizmap.height; y++)
+ {
+ guchar *dstrow = &sizmap.col[y * sizmap.width * 3];
+ double tmpy = y / (double)sizmap.height;
+
+ for (x = 0; x < sizmap.width; x++)
+ {
+ dstrow[x * 3] = 255 * (1.0 - get_siz_from_pcvals (x / (double)sizmap.width, tmpy));
+ }
+ }
+ edgepad (&sizmap,
+ maxbrushwidth, maxbrushwidth,
+ maxbrushheight, maxbrushheight);
+ }
+#if 0
+ ppm_save(&sizmap, "/tmp/_sizmap.ppm");
+#endif
+ if (runningvals.place_type == PLACEMENT_TYPE_RANDOM)
+ {
+ i = tmp.width * tmp.height / (maxbrushwidth * maxbrushheight);
+ i *= density;
+ }
+ else if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST)
+ {
+ i = (int)(tmp.width * density / maxbrushwidth) *
+ (int)(tmp.height * density / maxbrushheight);
+#if 0
+ g_printerr("i=%d\n", i);
+#endif
+ }
+
+ if (i < 1)
+ i = 1;
+
+ max_progress = i;
+ progstep = max_progress / 30;
+ if (progstep < 10)
+ progstep = 10;
+
+ if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST)
+ {
+ int j;
+
+ xpos = g_new (int, i);
+ ypos = g_new (int, i);
+ for (j = 0; j < i; j++)
+ {
+ int factor = (int)(tmp.width * density / maxbrushwidth + 0.5);
+
+ if (factor < 1)
+ factor = 1;
+ xpos[j] = maxbrushwidth/2 + (j % factor) * maxbrushwidth / density;
+ ypos[j] = maxbrushheight/2 + (j / factor) * maxbrushheight / density;
+ }
+ for (j = 0; j < i; j++)
+ {
+ int a, b;
+
+ a = g_rand_int_range (random_generator, 0, i);
+ b = xpos[j]; xpos[j] = xpos[a]; xpos[a] = b;
+ b = ypos[j]; ypos[j] = ypos[a]; ypos[a] = b;
+ }
+ }
+
+ for (; i; i--)
+ {
+ int n;
+ double thissum;
+
+ if (i % progstep == 0)
+ {
+ if(runningvals.run)
+ {
+ gimp_progress_update (0.8 - 0.8 * ((double)i / max_progress));
+ }
+ else
+ {
+ char tmps[40];
+
+ g_snprintf (tmps, sizeof (tmps),
+ "%.1f %%", 100 * (1.0 - ((double)i / max_progress)));
+ preview_set_button_label (tmps);
+
+ while(gtk_events_pending())
+ gtk_main_iteration();
+ }
+ }
+
+ if (runningvals.place_type == PLACEMENT_TYPE_RANDOM)
+ {
+ tx = g_rand_int_range (random_generator, maxbrushwidth / 2,
+ tmp.width - maxbrushwidth / 2);
+ ty = g_rand_int_range (random_generator, maxbrushheight / 2,
+ tmp.height - maxbrushheight / 2);
+ }
+ else if (runningvals.place_type == PLACEMENT_TYPE_EVEN_DIST)
+ {
+ tx = xpos[i - 1];
+ ty = ypos[i - 1];
+ }
+ if (runningvals.placement_center)
+ {
+ double z = g_rand_double_range (random_generator, 0, 0.75);
+ tx = tx * (1.0 - z) + tmp.width / 2 * z;
+ ty = ty * (1.0 - z) + tmp.height / 2 * z;
+ }
+
+ if ((tx < maxbrushwidth / 2) ||
+ (ty < maxbrushwidth / 2) ||
+ (tx + maxbrushwidth / 2 >= p->width) ||
+ (ty + maxbrushheight / 2 >= p->height))
+ {
+#if 0
+ g_printerr("Internal Error; invalid coords: (%d,%d) i=%d\n", tx, ty, i);
+#endif
+ continue;
+ }
+
+ if (img_has_alpha)
+ {
+ if (a->col[ty * a->width * 3 + tx * 3] > 128)
+ continue;
+ }
+
+ sn = on = 0;
+
+ switch (runningvals.orient_type)
+ {
+ case ORIENTATION_RANDOM:
+ on = g_rand_int_range (random_generator, 0, runningvals.orient_num);
+ break;
+
+ case ORIENTATION_VALUE:
+ case ORIENTATION_RADIUS:
+ case ORIENTATION_RADIAL:
+ case ORIENTATION_FLOWING:
+ case ORIENTATION_HUE:
+ case ORIENTATION_MANUAL:
+ on = runningvals.orient_num *
+ dirmap.col[ty * dirmap.width * 3 + tx * 3] / 256;
+ break;
+
+ case ORIENTATION_ADAPTIVE:
+ break; /* Handled below */
+
+ default:
+ g_printerr ("Internal error; Unknown orientationtype\n");
+ on = 0;
+ break;
+ }
+
+ switch (runningvals.size_type)
+ {
+ case SIZE_TYPE_RANDOM:
+ sn = g_rand_int_range (random_generator, 0, runningvals.size_num);
+ break;
+
+ case SIZE_TYPE_VALUE:
+ case SIZE_TYPE_RADIUS:
+ case SIZE_TYPE_RADIAL:
+ case SIZE_TYPE_FLOWING:
+ case SIZE_TYPE_HUE:
+ case SIZE_TYPE_MANUAL:
+ sn = runningvals.size_num * sizmap.col[ty*sizmap.width*3+tx*3] / 256;
+ break;
+
+ case SIZE_TYPE_ADAPTIVE:
+ break; /* Handled below */
+
+ default:
+ g_printerr ("Internal error; Unknown size_type\n");
+ sn = 0;
+ break;
+ }
+
+ /* Handle Adaptive selections */
+ if (runningvals.orient_type == ORIENTATION_ADAPTIVE)
+ {
+ if (runningvals.size_type == SIZE_TYPE_ADAPTIVE)
+ n = choose_best_brush (p, a, tx-maxbrushwidth/2,
+ ty-maxbrushheight/2, brushes,
+ num_brushes, brushes_sum, 0, 1);
+ else
+ {
+ int st = sn * runningvals.orient_num;
+ n = choose_best_brush (p, a, tx-maxbrushwidth/2,
+ ty-maxbrushheight/2, brushes,
+ st+runningvals.orient_num, brushes_sum,
+ st, 1);
+ }
+ }
+ else
+ {
+ if (runningvals.size_type == SIZE_TYPE_ADAPTIVE)
+ n = choose_best_brush (p, a, tx-maxbrushwidth/2,
+ ty-maxbrushheight/2, brushes,
+ num_brushes, brushes_sum,
+ on, runningvals.orient_num);
+ else
+ n = sn * runningvals.orient_num + on;
+ }
+ /* Should never happen, but hey... */
+ if (n < 0)
+ n = 0;
+ else if (n >= num_brushes)
+ n = num_brushes - 1;
+
+ tx -= maxbrushwidth/2;
+ ty -= maxbrushheight/2;
+
+ brush = &brushes[n];
+ if (dropshadow)
+ shadow = &shadows[n];
+ thissum = brushes_sum[n];
+
+ /* Calculate color - avg. of in-brush pixels */
+ if (runningvals.color_type == 0)
+ {
+ r = g = b = 0;
+ for (y = 0; y < brush->height; y++)
+ {
+ guchar *row = &p->col[(ty + y) * p->width * 3];
+
+ for (x = 0; x < brush->width; x++)
+ {
+ int k = (tx + x) * 3;
+ double v;
+
+ if ((h = brush->col[y * brush->width * 3 + x * 3]))
+ {
+ v = h / 255.0;
+ r += row[k+0] * v;
+ g += row[k+1] * v;
+ b += row[k+2] * v;
+ }
+ }
+ }
+ r = r * 255.0 / thissum;
+ g = g * 255.0 / thissum;
+ b = b * 255.0 / thissum;
+ }
+ else if (runningvals.color_type == 1)
+ {
+ guchar *pixel;
+
+ y = ty + (brush->height / 2);
+ x = tx + (brush->width / 2);
+ pixel = &p->col[y*p->width * 3 + x * 3];
+ r = pixel[0];
+ g = pixel[1];
+ b = pixel[2];
+ }
+ else
+ {
+ /* No such color_type! */
+ r = g = b = 0;
+ }
+ if (runningvals.color_noise > 0.0)
+ {
+ double v = runningvals.color_noise;
+#define BOUNDS(a) (((a) < 0) ? (a) : ((a) > 255) ? 255 : (a))
+#define MYASSIGN(a) \
+ { \
+ a = a + g_rand_double_range (random_generator, -v/2.0, v/2.0); \
+ a = BOUNDS(a) ; \
+ }
+ MYASSIGN (r);
+ MYASSIGN (g);
+ MYASSIGN (b);
+#undef BOUNDS
+#undef MYASSIGN
+ }
+
+ apply_brush (brush, shadow, &tmp, &atmp, tx,ty, r,g,b);
+
+ if (runningvals.general_tileable && runningvals.general_paint_edges)
+ {
+ int orig_width = tmp.width - 2 * maxbrushwidth;
+ int orig_height = tmp.height - 2 * maxbrushheight;
+ int dox = 0, doy = 0;
+
+ if (tx < maxbrushwidth)
+ {
+ apply_brush (brush, shadow, &tmp, &atmp, tx+orig_width,ty, r,g,b);
+ dox = -1;
+ }
+ else if (tx > orig_width)
+ {
+ apply_brush (brush, shadow, &tmp, &atmp, tx-orig_width,ty, r,g,b);
+ dox = 1;
+ }
+ if (ty < maxbrushheight)
+ {
+ apply_brush (brush, shadow, &tmp, &atmp, tx,ty+orig_height, r,g,b);
+ doy = 1;
+ }
+ else if (ty > orig_height)
+ {
+ apply_brush (brush, shadow, &tmp, &atmp, tx,ty-orig_height, r,g,b);
+ doy = -1;
+ }
+ if (doy)
+ {
+ if (dox < 0)
+ apply_brush (brush, shadow, &tmp, &atmp,
+ tx+orig_width, ty + doy * orig_height, r, g, b);
+ if (dox > 0)
+ apply_brush (brush, shadow, &tmp, &atmp,
+ tx-orig_width, ty + doy * orig_height, r, g, b);
+ }
+ }
+ }
+ for (i = 0; i < num_brushes; i++)
+ {
+ ppm_kill (&brushes[i]);
+ }
+ g_free (brushes);
+ g_free (shadows);
+ g_free (brushes_sum);
+
+ g_free (xpos);
+ g_free (ypos);
+
+ if (runningvals.general_paint_edges)
+ {
+ crop (&tmp,
+ maxbrushwidth, maxbrushheight,
+ tmp.width - maxbrushwidth, tmp.height - maxbrushheight);
+ if (img_has_alpha)
+ crop (&atmp,
+ maxbrushwidth, maxbrushheight,
+ atmp.width - maxbrushwidth, atmp.height - maxbrushheight);
+ }
+
+ ppm_kill (p);
+ p->width = tmp.width;
+ p->height = tmp.height;
+ p->col = tmp.col;
+
+ if (img_has_alpha)
+ {
+ ppm_kill (a);
+ a->width = atmp.width;
+ a->height = atmp.height;
+ a->col = atmp.col;
+ }
+
+ relief = runningvals.paper_relief / 100.0;
+ if (relief > 0.001)
+ {
+ scale = runningvals.paper_scale / 100.0;
+
+ if (PPM_IS_INITED (&paper_ppm))
+ {
+ tmp = paper_ppm;
+ paper_ppm.col = NULL;
+ }
+ else
+ {
+ tmp.col = NULL;
+ ppm_load (runningvals.selected_paper, &tmp);
+ resize (&tmp, tmp.width * scale, tmp.height * scale);
+ if (runningvals.paper_invert)
+ ppm_apply_gamma (&tmp, -1.0, 1,1,1);
+ }
+ for (x = 0; x < p->width; x++)
+ {
+ double h, v;
+ int px = x % tmp.width, py;
+
+ for (y = 0; y < p->height; y++)
+ {
+ int k = y * p->width * 3 + x * 3;
+
+ py = y % tmp.height;
+ if (runningvals.paper_overlay)
+ h = (tmp.col[py * tmp.width * 3 + px * 3]-128) * relief;
+ else
+ h = (tmp.col[py * tmp.width * 3 + px * 3] -
+ (int)tmp.col[((py + 1) % tmp.height) * tmp.width * 3 +
+ ((px + 1) % tmp.width) * 3]) /
+ -2.0 * relief;
+ if (h <= 0.0)
+ {
+ v = 1.0 + h/128.0;
+ if (v < 0.0)
+ v = 0.0;
+ else if (v > 1.0)
+ v = 1.0;
+ p->col[k+0] *= v;
+ p->col[k+1] *= v;
+ p->col[k+2] *= v;
+ }
+ else
+ {
+ v = h/128.0;
+ if (v < 0.0)
+ v = 0.0;
+ else if (v > 1.0)
+ v = 1.0;
+ p->col[k+0] = p->col[k+0] * (1.0-v) + 255 * v;
+ p->col[k+1] = p->col[k+1] * (1.0-v) + 255 * v;
+ p->col[k+2] = p->col[k+2] * (1.0-v) + 255 * v;
+ }
+ }
+ }
+ ppm_kill (&tmp);
+ }
+
+ ppm_kill (&paper_ppm);
+ ppm_kill (&dirmap);
+ ppm_kill (&sizmap);
+
+ if (runningvals.run)
+ {
+ gimp_progress_update (0.8);
+ }
+ else
+ {
+ preview_set_button_label (_("_Update"));
+ }
+
+ running = 0;
+}
diff --git a/plug-ins/gimpressionist/size.c b/plug-ins/gimpressionist/size.c
new file mode 100644
index 0000000..007e09e
--- /dev/null
+++ b/plug-ins/gimpressionist/size.c
@@ -0,0 +1,210 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "size.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+#define NUMSIZERADIO 8
+
+static GtkObject *sizenumadjust = NULL;
+static GtkObject *sizefirstadjust = NULL;
+static GtkObject *sizelastadjust = NULL;
+static GtkWidget *sizeradio[NUMSIZERADIO];
+
+static void
+size_store (GtkWidget *wg, void *d)
+{
+ pcvals.size_type = GPOINTER_TO_INT (d);
+}
+
+int size_type_input (int in)
+{
+ return CLAMP_UP_TO (in, NUMSIZERADIO);
+}
+
+static void
+size_type_restore (void)
+{
+ gtk_toggle_button_set_active (
+ GTK_TOGGLE_BUTTON (sizeradio[pcvals.size_type]),
+ TRUE);
+}
+
+void
+size_restore (void)
+{
+ size_type_restore ();
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (sizenumadjust),
+ pcvals.size_num);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (sizefirstadjust),
+ pcvals.size_first);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (sizelastadjust),
+ pcvals.size_last);
+}
+
+static void
+create_sizemap_dialog_helper (GtkWidget *widget)
+{
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sizeradio[7]), TRUE);
+ create_sizemap_dialog (widget);
+}
+
+static void
+create_size_radio_button (GtkWidget *box,
+ int orient_type,
+ const gchar *label,
+ const gchar *help_string,
+ GSList **radio_group)
+{
+ create_radio_button (box, orient_type, size_store, label,
+ help_string, radio_group, sizeradio);
+}
+
+void
+create_sizepage (GtkNotebook *notebook)
+{
+ GtkWidget *box2, *box3, *box4, *thispage;
+ GtkWidget *label, *tmpw, *table;
+ GSList *radio_group = NULL;
+
+ label = gtk_label_new_with_mnemonic (_("_Size"));
+
+ thispage = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (thispage), 12);
+ gtk_widget_show (thispage);
+
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (thispage), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ sizenumadjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Size variants:"),
+ 150, -1, pcvals.size_num,
+ 1.0, 30.0, 1.0, 1.0, 0,
+ TRUE, 0, 0,
+ _("The number of sizes of brushes to use"),
+ NULL);
+ g_signal_connect (sizenumadjust, "value-changed",
+ G_CALLBACK (gimp_int_adjustment_update),
+ &pcvals.size_num);
+
+ sizefirstadjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Minimum size:"),
+ 150, -1, pcvals.size_first,
+ 0.0, 360.0, 1.0, 10.0, 0,
+ TRUE, 0, 0,
+ _("The smallest brush to create"),
+ NULL);
+ g_signal_connect (sizefirstadjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.size_first);
+
+ sizelastadjust =
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Maximum size:"),
+ 150, -1, pcvals.size_last,
+ 0.0, 360.0, 1.0, 10.0, 0,
+ TRUE, 0, 0,
+ _("The largest brush to create"),
+ NULL);
+ g_signal_connect (sizelastadjust, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &pcvals.size_last);
+
+ box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_box_pack_start (GTK_BOX (thispage), box2,FALSE,FALSE,0);
+ gtk_widget_show (box2);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box2), box3, FALSE, FALSE, 0);
+ gtk_widget_show (box3);
+
+ tmpw = gtk_label_new (_("Size depends on:"));
+ gtk_box_pack_start (GTK_BOX (box3), tmpw,FALSE,FALSE,0);
+ gtk_widget_show (tmpw);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX( box2), box3, FALSE, FALSE, 0);
+ gtk_widget_show (box3);
+
+ create_size_radio_button (box3, SIZE_TYPE_VALUE, _("Value"),
+ _("Let the value (brightness) of the region determine the size of the stroke"),
+ &radio_group);
+
+ create_size_radio_button (box3, SIZE_TYPE_RADIUS, _("Radius"),
+ _("The distance from the center of the image determines the size of the stroke"),
+ &radio_group);
+
+ create_size_radio_button (box3, SIZE_TYPE_RANDOM, _("Random"),
+ _("Selects a random size for each stroke"),
+ &radio_group);
+
+ create_size_radio_button (box3, SIZE_TYPE_RADIAL, _("Radial"),
+ _("Let the direction from the center determine the size of the stroke"),
+ &radio_group);
+
+ box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (box2), box3,FALSE,FALSE, 0);
+ gtk_widget_show (box3);
+
+ create_size_radio_button (box3, SIZE_TYPE_FLOWING, _("Flowing"),
+ _("The strokes follow a \"flowing\" pattern"),
+ &radio_group);
+
+ create_size_radio_button (box3, SIZE_TYPE_HUE, _("Hue"),
+ _("The hue of the region determines the size of the stroke"),
+ &radio_group);
+
+ create_size_radio_button (box3, SIZE_TYPE_ADAPTIVE, _("Adaptive"),
+ _("The brush-size that matches the original image the closest is selected"),
+ &radio_group);
+
+
+ box4 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (box3), box4, FALSE, FALSE, 0);
+ gtk_widget_show (box4);
+
+ create_size_radio_button (box4, SIZE_TYPE_MANUAL, _("Manual"),
+ _("Manually specify the stroke size"),
+ &radio_group
+ );
+
+ size_type_restore ();
+
+ tmpw = gtk_button_new_with_mnemonic (_("_Edit"));
+ gtk_box_pack_start (GTK_BOX (box4), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (create_sizemap_dialog_helper), NULL);
+ gimp_help_set_help_data (tmpw, _("Opens up the Size Map Editor"), NULL);
+
+ gtk_notebook_append_page_menu (notebook, thispage, label, NULL);
+}
diff --git a/plug-ins/gimpressionist/size.h b/plug-ins/gimpressionist/size.h
new file mode 100644
index 0000000..b2891f0
--- /dev/null
+++ b/plug-ins/gimpressionist/size.h
@@ -0,0 +1,40 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef __SIZE_H
+#define __SIZE_H
+
+enum SIZE_TYPE_ENUM
+{
+ SIZE_TYPE_VALUE = 0,
+ SIZE_TYPE_RADIUS = 1,
+ SIZE_TYPE_RANDOM = 2,
+ SIZE_TYPE_RADIAL = 3,
+ SIZE_TYPE_FLOWING = 4,
+ SIZE_TYPE_HUE = 5,
+ SIZE_TYPE_ADAPTIVE = 6,
+ SIZE_TYPE_MANUAL = 7,
+};
+
+void size_restore (void);
+
+void create_sizepage (GtkNotebook *);
+
+int size_type_input (int in);
+void size_map_free_resources (void);
+
+#endif /* #ifndef __SIZE_H */
diff --git a/plug-ins/gimpressionist/sizemap.c b/plug-ins/gimpressionist/sizemap.c
new file mode 100644
index 0000000..591c299
--- /dev/null
+++ b/plug-ins/gimpressionist/sizemap.c
@@ -0,0 +1,553 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "gimpressionist.h"
+#include "ppmtool.h"
+#include "size.h"
+#include "infile.h"
+
+#include "preview.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+#define RESPONSE_APPLY 1
+
+#define MAPFILE "data.out"
+
+static GtkWidget *smwindow;
+static GtkWidget *smvectorprev;
+static GtkWidget *smpreviewprev;
+static GtkWidget *prev_button;
+static GtkWidget *next_button;
+static GtkWidget *add_button;
+static GtkWidget *kill_button;
+
+static GtkAdjustment *smvectprevbrightadjust = NULL;
+
+static GtkAdjustment *sizadjust = NULL;
+static GtkAdjustment *smstradjust = NULL;
+static GtkAdjustment *smstrexpadjust = NULL;
+static GtkWidget *size_voronoi = NULL;
+
+#define OMWIDTH 150
+#define OMHEIGHT 150
+
+static smvector_t smvector[MAXSIZEVECT];
+static int numsmvect = 0;
+
+static double
+getsiz_from_gui (double x, double y)
+{
+ return getsiz_proto (x,y, numsmvect, smvector,
+ gtk_adjustment_get_value (smstrexpadjust),
+ gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi)));
+}
+
+static void
+updatesmpreviewprev (void)
+{
+ gint x, y;
+ static ppm_t nsbuffer;
+ guchar black[3] = {0, 0, 0};
+ guchar gray[3] = {120, 120, 120};
+
+ if (! PPM_IS_INITED (&nsbuffer))
+ {
+ ppm_new (&nsbuffer, OMWIDTH, OMHEIGHT);
+ }
+ fill (&nsbuffer, black);
+
+ for (y = 6; y < OMHEIGHT-4; y += 10)
+ {
+ for (x = 6; x < OMWIDTH-4; x += 10)
+ {
+ gdouble siz = 5 * getsiz_from_gui (x / (double)OMWIDTH,
+ y / (double)OMHEIGHT);
+ ppm_drawline (&nsbuffer, x-siz, y-siz, x+siz, y-siz, gray);
+ ppm_drawline (&nsbuffer, x+siz, y-siz, x+siz, y+siz, gray);
+ ppm_drawline (&nsbuffer, x+siz, y+siz, x-siz, y+siz, gray);
+ ppm_drawline (&nsbuffer, x-siz, y+siz, x-siz, y-siz, gray);
+ }
+ }
+
+
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (smpreviewprev),
+ 0, 0, OMWIDTH, OMHEIGHT,
+ GIMP_RGB_IMAGE,
+ nsbuffer.col,
+ OMWIDTH * 3);
+}
+
+static gint selectedsmvector = 0;
+static ppm_t update_vector_preview_backup = {0,0,NULL};
+static ppm_t update_vector_preview_sbuffer = {0,0,NULL};
+
+static void
+updatesmvectorprev (void)
+{
+ static int ok = 0;
+ gint i, x, y;
+ gdouble val;
+ static gdouble last_val = 0.0;
+ guchar gray[3] = {120, 120, 120};
+ guchar red[3] = {255, 0, 0};
+ guchar white[3] = {255, 255, 255};
+
+ if (smvectprevbrightadjust)
+ val = 1.0 - gtk_adjustment_get_value (smvectprevbrightadjust) / 100.0;
+ else
+ val = 0.5;
+
+ if (!ok || (val != last_val))
+ {
+#if 0
+ if (!PPM_IS_INITED (&infile))
+ updatepreview (NULL, (void *)2); /* Force grabarea () */
+ ppm_copy (&infile, &update_vector_preview_backup);
+#else
+ infile_copy_to_ppm (&update_vector_preview_backup);
+#endif
+ ppm_apply_brightness (&update_vector_preview_backup, val, 1,1,1);
+
+ if (update_vector_preview_backup.width != OMWIDTH ||
+ update_vector_preview_backup.height != OMHEIGHT)
+ resize_fast (&update_vector_preview_backup, OMWIDTH, OMHEIGHT);
+
+ ok = 1;
+ }
+ ppm_copy (&update_vector_preview_backup, &update_vector_preview_sbuffer);
+
+ for (i = 0; i < numsmvect; i++)
+ {
+ x = smvector[i].x * OMWIDTH;
+ y = smvector[i].y * OMHEIGHT;
+ if (i == selectedsmvector)
+ {
+ ppm_drawline (&update_vector_preview_sbuffer, x-5, y, x+5, y, red);
+ ppm_drawline (&update_vector_preview_sbuffer, x, y-5, x, y+5, red);
+ }
+ else
+ {
+ ppm_drawline (&update_vector_preview_sbuffer, x-5, y, x+5, y, gray);
+ ppm_drawline (&update_vector_preview_sbuffer, x, y-5, x, y+5, gray);
+ }
+ ppm_put_rgb (&update_vector_preview_sbuffer, x, y, white);
+ }
+
+ gimp_preview_area_draw (GIMP_PREVIEW_AREA (smvectorprev),
+ 0, 0, OMWIDTH, OMHEIGHT,
+ GIMP_RGB_IMAGE,
+ update_vector_preview_sbuffer.col,
+ OMWIDTH * 3);
+
+ gtk_widget_set_sensitive (prev_button, (numsmvect > 1));
+ gtk_widget_set_sensitive (next_button, (numsmvect > 1));
+ gtk_widget_set_sensitive (add_button, (numsmvect < MAXORIENTVECT));
+ gtk_widget_set_sensitive (kill_button, (numsmvect > 1));
+}
+
+void
+size_map_free_resources (void)
+{
+ ppm_kill (&update_vector_preview_backup);
+ ppm_kill (&update_vector_preview_sbuffer);
+}
+
+static gboolean smadjignore = FALSE;
+
+static void
+updatesmsliders (void)
+{
+ smadjignore = TRUE;
+ gtk_adjustment_set_value (sizadjust, smvector[selectedsmvector].siz);
+ gtk_adjustment_set_value (smstradjust, smvector[selectedsmvector].str);
+ smadjignore = FALSE;
+}
+
+static void
+smprevclick (GtkWidget *w, gpointer data)
+{
+ selectedsmvector--;
+ if (selectedsmvector < 0)
+ selectedsmvector = numsmvect-1;
+ updatesmsliders ();
+ updatesmvectorprev ();
+}
+
+static void
+smnextclick (GtkWidget *w, gpointer data)
+{
+ selectedsmvector++;
+
+ if (selectedsmvector == numsmvect)
+ selectedsmvector = 0;
+ updatesmsliders ();
+ updatesmvectorprev ();
+}
+
+static void
+smaddclick (GtkWidget *w, gpointer data)
+{
+ smvector[numsmvect].x = 0.5;
+ smvector[numsmvect].y = 0.5;
+ smvector[numsmvect].siz = 50.0;
+ smvector[numsmvect].str = 1.0;
+ selectedsmvector = numsmvect;
+ numsmvect++;
+ updatesmsliders ();
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+}
+
+static void
+smdeleteclick (GtkWidget *w, gpointer data)
+{
+ int i;
+
+ for (i = selectedsmvector; i < numsmvect-1; i++)
+ {
+ smvector[i] = smvector[i+1];
+ }
+ numsmvect--;
+ if (selectedsmvector >= numsmvect)
+ selectedsmvector = 0;
+ updatesmsliders ();
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+}
+
+static void
+smmapclick (GtkWidget *w, GdkEventButton *event)
+{
+ if (event->button == 1)
+ {
+ smvector[selectedsmvector].x = event->x / (double)OMWIDTH;
+ smvector[selectedsmvector].y = event->y / (double)OMHEIGHT;
+ }
+ else if (event->button == 2)
+ {
+ if (numsmvect + 1 == MAXSIZEVECT)
+ return;
+ smvector[numsmvect].x = event->x / (double)OMWIDTH;
+ smvector[numsmvect].y = event->y / (double)OMHEIGHT;
+ smvector[numsmvect].siz = 0.0;
+ smvector[numsmvect].str = 1.0;
+ selectedsmvector = numsmvect;
+ numsmvect++;
+ updatesmsliders ();
+ }
+#if 0
+ else if (event->button == 3)
+ {
+ double d;
+ d = atan2 (OMWIDTH * smvector[selectedsmvector].x - event->x,
+ OMHEIGHT * smvector[selectedsmvector].y - event->y);
+ smvector[selectedsmvector].dir = radtodeg (d);
+ updatesmsliders ();
+ */
+ }
+#endif
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+}
+
+static void
+angsmadjmove (GtkWidget *w, gpointer data)
+{
+ if (!smadjignore)
+ {
+ smvector[selectedsmvector].siz = gtk_adjustment_get_value (sizadjust);
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+ }
+}
+
+static void
+strsmadjmove (GtkWidget *w, gpointer data)
+{
+ if (!smadjignore)
+ {
+ smvector[selectedsmvector].str = gtk_adjustment_get_value (smstradjust);
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+ }
+}
+
+static void
+smstrexpsmadjmove (GtkWidget *w, gpointer data)
+{
+ if (!smadjignore)
+ {
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+ }
+}
+
+static void
+smresponse (GtkWidget *widget,
+ gint response_id,
+ gpointer data)
+{
+ switch (response_id)
+ {
+ case RESPONSE_APPLY:
+ case GTK_RESPONSE_OK:
+ {
+ gint i;
+
+ for (i = 0; i < numsmvect; i++)
+ pcvals.size_vectors[i] = smvector[i];
+
+ pcvals.num_size_vectors = numsmvect;
+ pcvals.size_strength_exponent = gtk_adjustment_get_value (smstrexpadjust);
+ pcvals.size_voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi));
+ }
+ break;
+ }
+
+ if (response_id != RESPONSE_APPLY)
+ gtk_widget_hide (widget);
+}
+
+static void
+initsmvectors (void)
+{
+ if (pcvals.num_size_vectors)
+ {
+ gint i;
+
+ numsmvect = pcvals.num_size_vectors;
+ for (i = 0; i < numsmvect; i++)
+ {
+ smvector[i] = pcvals.size_vectors[i];
+ }
+ }
+ else
+ {
+ /* Shouldn't happen */
+ numsmvect = 1;
+ smvector[0].x = 0.5;
+ smvector[0].y = 0.5;
+ smvector[0].siz = 0.0;
+ smvector[0].str = 1.0;
+ }
+ if (selectedsmvector >= numsmvect)
+ selectedsmvector = numsmvect-1;
+}
+
+#if 0
+static void
+update_sizemap_dialog (void)
+{
+ if (smwindow)
+ {
+ initsmvectors ();
+
+ gtk_adjustment_set_value (smstrexpadjust, pcvals.size_strength_exponent);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (size_voronoi),
+ pcvals.size_voronoi);
+
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+ }
+}
+#endif
+
+void
+create_sizemap_dialog (GtkWidget *parent)
+{
+ GtkWidget *tmpw, *tmpw2;
+ GtkWidget *table1;
+ GtkWidget *table2;
+ GtkWidget *hbox;
+
+ initsmvectors ();
+
+ if (smwindow)
+ {
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+ gtk_window_present (GTK_WINDOW (smwindow));
+ return;
+ }
+
+ smwindow = gimp_dialog_new (_("Size Map Editor"), PLUG_IN_ROLE,
+ gtk_widget_get_toplevel (parent), 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+
+ _("_Apply"), RESPONSE_APPLY,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (smwindow),
+ GTK_RESPONSE_OK,
+ RESPONSE_APPLY,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (smwindow, "response",
+ G_CALLBACK (smresponse),
+ NULL);
+ g_signal_connect (smwindow, "destroy",
+ G_CALLBACK (gtk_widget_destroyed),
+ &smwindow);
+
+ table1 = gtk_table_new (2, 5, FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER (table1), 6);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (smwindow))),
+ table1, TRUE, TRUE, 0);
+ gtk_widget_show (table1);
+
+ tmpw2 = tmpw = gtk_frame_new (_("Smvectors"));
+ gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
+ gtk_table_attach (GTK_TABLE (table1), tmpw, 0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
+ gtk_widget_show (tmpw);
+
+ tmpw = hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,0);
+ gtk_container_add (GTK_CONTAINER (tmpw2), tmpw);
+ gtk_widget_show (tmpw);
+
+ tmpw = gtk_event_box_new ();
+ gimp_help_set_help_data (tmpw, _("The smvector-field. Left-click to move selected smvector, Right-click to point it towards mouse, Middle-click to add a new smvector."), NULL);
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, FALSE, 0);
+ tmpw2 = tmpw;
+
+ tmpw = smvectorprev = gimp_preview_area_new ();
+ gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT);
+ gtk_container_add (GTK_CONTAINER (tmpw2), tmpw);
+ gtk_widget_show (tmpw);
+ gtk_widget_add_events (tmpw2, GDK_BUTTON_PRESS_MASK);
+ g_signal_connect (tmpw2, "button-press-event",
+ G_CALLBACK (smmapclick), NULL);
+ gtk_widget_show (tmpw2);
+
+ smvectprevbrightadjust = (GtkAdjustment *)
+ gtk_adjustment_new (50.0, 0.0, 100.0, 1.0, 1.0, 1.0);
+ tmpw = gtk_scale_new (GTK_ORIENTATION_VERTICAL, smvectprevbrightadjust);
+ gtk_scale_set_draw_value (GTK_SCALE (tmpw), FALSE);
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw,FALSE,FALSE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (smvectprevbrightadjust, "value-changed",
+ G_CALLBACK (updatesmvectorprev), NULL);
+ gimp_help_set_help_data (tmpw, _("Adjust the preview's brightness"), NULL);
+
+ tmpw2 = tmpw = gtk_frame_new (_("Preview"));
+ gtk_container_set_border_width (GTK_CONTAINER (tmpw), 2);
+ gtk_table_attach (GTK_TABLE (table1), tmpw, 1,2,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
+ gtk_widget_show (tmpw);
+
+ tmpw = smpreviewprev = gimp_preview_area_new ();
+ gtk_widget_set_size_request (tmpw, OMWIDTH, OMHEIGHT);
+ gtk_container_add (GTK_CONTAINER (tmpw2), tmpw);
+ gtk_widget_show (tmpw);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
+ gtk_table_attach_defaults (GTK_TABLE (table1), hbox, 0, 1, 1, 2);
+ gtk_widget_show (hbox);
+
+ prev_button = tmpw = gtk_button_new_with_mnemonic ("_<<");
+ gtk_box_pack_start (GTK_BOX (hbox), tmpw, FALSE, TRUE, 0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (smprevclick), NULL);
+ gimp_help_set_help_data (tmpw, _("Select previous smvector"), NULL);
+
+ next_button = tmpw = gtk_button_new_with_mnemonic ("_>>");
+ gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (smnextclick), NULL);
+ gimp_help_set_help_data (tmpw, _("Select next smvector"), NULL);
+
+ add_button = tmpw = gtk_button_new_with_mnemonic ( _("A_dd"));
+ gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (smaddclick), NULL);
+ gimp_help_set_help_data (tmpw, _("Add new smvector"), NULL);
+
+ kill_button = tmpw = gtk_button_new_with_mnemonic (_("_Kill"));
+ gtk_box_pack_start (GTK_BOX (hbox),tmpw,FALSE,TRUE,0);
+ gtk_widget_show (tmpw);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (smdeleteclick), NULL);
+ gimp_help_set_help_data (tmpw, _("Delete selected smvector"), NULL);
+
+ table2 = gtk_table_new (3, 4, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table2), 4);
+ gtk_table_attach_defaults (GTK_TABLE (table1), table2, 0, 2, 2, 3);
+ gtk_widget_show (table2);
+
+ sizadjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 0,
+ _("_Size:"),
+ 150, 6, 50.0,
+ 0.0, 100.0, 1.0, 10.0, 1,
+ TRUE, 0, 0,
+ _("Change the angle of the selected smvector"),
+ NULL);
+ g_signal_connect (sizadjust, "value-changed",
+ G_CALLBACK (angsmadjmove), NULL);
+
+ smstradjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 1,
+ _("S_trength:"),
+ 150, 6, 1.0,
+ 0.1, 5.0, 0.1, 0.5, 1,
+ TRUE, 0, 0,
+ _("Change the strength of the selected smvector"),
+ NULL);
+ g_signal_connect (smstradjust, "value-changed",
+ G_CALLBACK (strsmadjmove), NULL);
+
+ smstrexpadjust = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table2), 0, 2,
+ _("St_rength exp.:"),
+ 150, 6, 1.0,
+ 0.1, 10.9, 0.1, 0.5, 1,
+ TRUE, 0, 0,
+ _("Change the exponent of the strength"),
+ NULL);
+ g_signal_connect (smstrexpadjust, "value-changed",
+ G_CALLBACK (smstrexpsmadjmove), NULL);
+
+ size_voronoi = tmpw = gtk_check_button_new_with_mnemonic ( _("_Voronoi"));
+ gtk_table_attach_defaults (GTK_TABLE (table2), tmpw, 3, 4, 0, 1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), FALSE);
+ gtk_widget_show (tmpw);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tmpw), pcvals.size_voronoi);
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (smstrexpsmadjmove), NULL);
+ gimp_help_set_help_data (tmpw, _("Voronoi-mode makes only the smvector closest to the given point have any influence"), NULL);
+
+ gtk_widget_show (smwindow);
+
+ updatesmvectorprev ();
+ updatesmpreviewprev ();
+}
diff --git a/plug-ins/gimpressionist/utils.c b/plug-ins/gimpressionist/utils.c
new file mode 100644
index 0000000..16244ae
--- /dev/null
+++ b/plug-ins/gimpressionist/utils.c
@@ -0,0 +1,411 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+ * utils.c - various utility routines that don't fit anywhere else. Usually
+ * these routines don't affect the state of the program.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <libgimp/gimp.h>
+
+#include "gimpressionist.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+/* Mathematical Utilities */
+
+double
+dist (double x, double y, double end_x, double end_y)
+{
+ double dx = end_x - x;
+ double dy = end_y - y;
+ return sqrt (dx * dx + dy * dy);
+}
+
+double
+getsiz_proto (double x, double y, int n, smvector_t *vec,
+ double smstrexp, int voronoi)
+{
+ int i;
+ double sum, ssum, dst;
+ int first = 0, last;
+
+ if ((x < 0.0) || (x > 1.0))
+ g_warning ("HUH? x = %f\n",x);
+
+#if 0
+ if (from == 0)
+ {
+ n = numsmvect;
+ vec = smvector;
+ smstrexp = gtk_adjustment_get_value (GTK_ADJUSTMENT (smstrexpadjust));
+ voronoi = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (size_voronoi));
+ }
+ else
+ {
+ n = pcvals.num_size_vectors;
+ vec = pcvals.size_vectors;
+ smstrexp = pcvals.size_strength_exponent;
+ voronoi = pcvals.size_voronoi;
+ }
+#endif
+
+ if (voronoi)
+ {
+ gdouble bestdist = -1.0;
+ for (i = 0; i < n; i++)
+ {
+ dst = dist (x, y, vec[i].x, vec[i].y);
+ if ((bestdist < 0.0) || (dst < bestdist))
+ {
+ bestdist = dst;
+ first = i;
+ }
+ }
+ last = first+1;
+ }
+ else
+ {
+ first = 0;
+ last = n;
+ }
+
+ sum = ssum = 0.0;
+ for (i = first; i < last; i++)
+ {
+ gdouble s = vec[i].str;
+
+ dst = dist (x,y,vec[i].x,vec[i].y);
+ dst = pow (dst, smstrexp);
+ if (dst < 0.0001)
+ dst = 0.0001;
+ s = s / dst;
+
+ sum += vec[i].siz * s;
+ ssum += 1.0/dst;
+ }
+ sum = sum / ssum / 100.0;
+ return CLAMP (sum, 0.0, 1.0);
+}
+
+
+/* String and Path Manipulation Routines */
+
+
+static GList *parsepath_cached_path = NULL;
+
+/* This function is memoized. Once it finds the value it permanently
+ * caches it
+ * */
+GList *
+parsepath (void)
+{
+ gchar *rc_path, *path;
+
+ if (parsepath_cached_path)
+ return parsepath_cached_path;
+
+ path = gimp_gimprc_query ("gimpressionist-path");
+ if (path)
+ {
+ rc_path = g_filename_from_utf8 (path, -1, NULL, NULL, NULL);
+ g_free (path);
+ }
+ else
+ {
+ gchar *gimprc = gimp_personal_rc_file ("gimprc");
+ gchar *full_path = gimp_config_build_data_path ("gimpressionist");
+ gchar *esc_path = g_strescape (full_path, NULL);
+
+ g_message (_("No %s in gimprc:\n"
+ "You need to add an entry like\n"
+ "(%s \"%s\")\n"
+ "to your %s file."),
+ "gflare-path", "gflare-path",
+ esc_path, gimp_filename_to_utf8 (gimprc));
+
+ g_free (gimprc);
+ g_free (esc_path);
+
+ rc_path = gimp_config_path_expand (full_path, TRUE, NULL);
+ g_free (full_path);
+ }
+
+ parsepath_cached_path = gimp_path_parse (rc_path, 256, FALSE, NULL);
+
+ g_free (rc_path);
+
+ return parsepath_cached_path;
+}
+
+void
+free_parsepath_cache (void)
+{
+ if (parsepath_cached_path != NULL)
+ return;
+
+ g_list_free_full (parsepath_cached_path, (GDestroyNotify) g_free);
+ parsepath_cached_path = NULL;
+}
+
+gchar *
+findfile (const gchar *fn)
+{
+ GList *rcpath;
+ GList *thispath;
+ gchar *filename;
+
+ g_return_val_if_fail (fn != NULL, NULL);
+
+ rcpath = parsepath ();
+
+ thispath = rcpath;
+
+ while (thispath)
+ {
+ filename = g_build_filename (thispath->data, fn, NULL);
+ if (g_file_test (filename, G_FILE_TEST_IS_REGULAR))
+ return filename;
+ g_free (filename);
+ thispath = thispath->next;
+ }
+ return NULL;
+}
+
+/* GUI Routines */
+
+void
+reselect (GtkWidget *view,
+ gchar *fname)
+{
+ GtkTreeModel *model;
+ GtkTreeSelection *selection;
+ GtkTreeIter iter;
+ char *tmpfile;
+
+ tmpfile = strrchr (fname, '/');
+ if (tmpfile)
+ fname = ++tmpfile;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ {
+ gboolean quit = FALSE;
+ do
+ {
+ gchar *name;
+
+ gtk_tree_model_get (model, &iter, 0, &name, -1);
+ if (!strcmp(name, fname))
+ {
+ GtkTreePath *tree_path;
+ gtk_tree_selection_select_iter (selection, &iter);
+ tree_path = gtk_tree_model_get_path (model,
+ &iter);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view),
+ tree_path,
+ NULL,
+ TRUE,
+ 0.5,
+ 0.5);
+ gtk_tree_path_free (tree_path);
+ quit = TRUE;
+ }
+ g_free (name);
+
+ } while ((!quit) && gtk_tree_model_iter_next (model, &iter));
+ }
+}
+
+static void
+readdirintolist_real (const char *subdir,
+ GtkWidget *view,
+ char *selected,
+ gboolean with_filename_column,
+ gchar *(*get_object_name_cb) (const gchar *dir,
+ gchar *filename,
+ void *context),
+ void *context)
+{
+ gchar *fpath;
+ const gchar *de;
+ GDir *dir;
+ GList *flist = NULL;
+ GtkTreeIter iter;
+ GtkListStore *store;
+ GtkTreeSelection *selection;
+
+ store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (view)));
+
+ if (selected)
+ {
+ if (!selected[0])
+ selected = NULL;
+ else
+ {
+ char *nsel;
+
+ nsel = strrchr (selected, '/');
+ if (nsel) selected = ++nsel;
+ }
+ }
+
+ dir = g_dir_open (subdir, 0, NULL);
+
+ if (!dir)
+ return;
+
+ for (;;)
+ {
+ gboolean file_exists;
+
+ de = g_dir_read_name (dir);
+ if (!de)
+ break;
+
+ fpath = g_build_filename (subdir, de, NULL);
+ file_exists = g_file_test (fpath, G_FILE_TEST_IS_REGULAR);
+ g_free (fpath);
+
+ if (!file_exists)
+ continue;
+
+ flist = g_list_insert_sorted (flist, g_strdup (de),
+ (GCompareFunc)g_ascii_strcasecmp);
+ }
+ g_dir_close (dir);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ while (flist)
+ {
+ gtk_list_store_append (store, &iter);
+ /* Set the filename */
+ gtk_list_store_set (store, &iter, PRESETS_LIST_COLUMN_FILENAME,
+ flist->data, -1);
+ /* Set the object name */
+ if (with_filename_column)
+ {
+ gchar * object_name;
+ object_name = get_object_name_cb (subdir, flist->data, context);
+ if (object_name)
+ {
+ gtk_list_store_set (store, &iter,
+ PRESETS_LIST_COLUMN_OBJECT_NAME,
+ object_name, -1);
+ g_free (object_name);
+ }
+ else
+ {
+ /* Default to the filename */
+ gtk_list_store_set (store, &iter, 1, flist->data, -1);
+ }
+ }
+
+ if (selected)
+ {
+ if (!strcmp (flist->data, selected))
+ {
+ gtk_tree_selection_select_iter (selection, &iter);
+ }
+ }
+ g_free (flist->data);
+ flist = g_list_remove (flist, flist->data);
+ }
+
+ if (!selected)
+ {
+ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
+ gtk_tree_selection_select_iter (selection, &iter);
+ }
+}
+
+void
+readdirintolist_extended (const char *subdir,
+ GtkWidget *view,
+ char *selected,
+ gboolean with_filename_column,
+ gchar *(*get_object_name_cb) (const gchar *dir,
+ gchar *filename,
+ void *context),
+ void *context)
+{
+ char *tmpdir;
+ GList *thispath = parsepath ();
+
+ while (thispath)
+ {
+ tmpdir = g_build_filename ((gchar *) thispath->data, subdir, NULL);
+ readdirintolist_real (tmpdir, view, selected, with_filename_column,
+ get_object_name_cb, context);
+ g_free (tmpdir);
+ thispath = thispath->next;
+ }
+}
+
+void
+readdirintolist (const char *subdir,
+ GtkWidget *view,
+ char *selected)
+{
+ readdirintolist_extended (subdir, view, selected, FALSE, NULL, NULL);
+}
+
+/*
+ * Creates a radio button.
+ * box - the containing box.
+ * orient_type - The orientation ID
+ * label, help_string - self-describing
+ * radio_group -
+ * A pointer to a radio group. The function assigns its value
+ * as the radio group of the radio button. Afterwards, it assigns it
+ * a new value of the new radio group of the button.
+ * This is useful to group buttons. Just reset the variable to NULL,
+ * to create a new group.
+ * */
+GtkWidget *
+create_radio_button (GtkWidget *box,
+ int orient_type,
+ void (*callback) (GtkWidget *wg, void *d),
+ const gchar *label,
+ const gchar *help_string,
+ GSList **radio_group,
+ GtkWidget **buttons_array)
+{
+ GtkWidget *tmpw;
+
+ buttons_array[orient_type] = tmpw =
+ gtk_radio_button_new_with_label ((*radio_group), label);
+ gtk_box_pack_start (GTK_BOX (box), tmpw, FALSE, FALSE, 0);
+ gtk_widget_show (tmpw);
+
+ g_signal_connect (tmpw, "clicked",
+ G_CALLBACK (callback), GINT_TO_POINTER (orient_type));
+ gimp_help_set_help_data (tmpw, help_string, NULL);
+
+ *radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (tmpw));
+
+ return tmpw;
+}
+