dclock-2.2.2/0000755000175000017500000000000011142412752013405 5ustar bdefreesebdefreesedclock-2.2.2/Imakefile0000644000175000017500000000057411033061777015232 0ustar bdefreesebdefreeseLOCAL_LIBRARIES = $(XTOOLLIB) $(XLIB) SYS_LIBRARIES = -lm # CDEBUGFLAGS = -O2 CDEBUGFLAGS = -g # Comment out the following 3 lines for systems without freetype CCOPTIONS = -I/usr/include/freetype2 DEFINES = -DXFT_SUPPORT EXTRA_LIBRARIES = -lXft SRCS = Dclock.c dclock.c OBJS = Dclock.o dclock.o ComplexProgramTarget(dclock) dclock.o: Dclock.h Dclock.o: DclockP.h dclock-2.2.2/DClock0000644000175000017500000000077507014302233014473 0ustar bdefreesebdefreese! sample dclock defaults dclock*geometry: 240x87+271+5 dclock*foreground: chartreuse dclock*background: DarkSlateGray dclock*led_off: DarkGreen dclock*borderColor: white dclock*borderWidth: 2 dclock*widthFactor: 0.143 dclock*spaceFactor: 0.062 dclock*bellFile: /usr/share/sound/bell.wav dclock*alarmFile: /usr/share/sound/digital.wav dclock*font: *helvetica-medium-r-normal--14* dclock*audioPlay: /usr/bin/play dclock-2.2.2/README0000644000175000017500000000715511034563276014305 0ustar bdefreesebdefreesedclock -- a digital clock for the X11 environment Copyright (c) Dan Heller 1988 v.2.0 Modifications by Tim Edwards 1993 v.2.1 More modifications 1999, 2000, 2001, 2002 v.2.2 Added support for antialiased fonts using freefont (Xft), 2008 (20th anniversary of dclock!) Thanks to Amir J. Katz for beta-testing v.2.0 and the Imakefile. Thanks to David A. Marks for replacing the missing Makefile.orig for compilation on Sun, HP, and other systems. Thanks to Andy Peterson for the UTC patch. ----------------------------------------------------------------------- Compile with xmkmf in the standard way: xmkmf make depend make For those people not using xmkmf: cp Makefile.orig Makefile make Read the comments below about possible compilation complications. ----------------------------------------------------------------------- Compiler notes: 1) Systems with no usleep() call should compile Dclock.c with -DNO_USLEEP. 2) Systems without freefont (Xft) libraries and include files should remove "-DXFT_SUPPORT" from the Imakefile before running xmkmf. 3) Some systems may require changing "#include" to "#include" in Dclock.c. 4) This code is K&R standard, not ANSI standard. Beware with systems which normally expect ANSI code in order to compile. May want to use "gcc -traditional" to compile if your system has gcc. ----------------------------------------------------------------------- When the program is running and the mouse is in the window, you can type the following keys: r -- toggle reverse video s -- toggle seconds display b -- toggle the bell to ring on half hours j -- toggle jump or smooth scrolling d -- toggle date string display m -- toggle military (24hr) time format a -- toggle the alarm clock f -- toggle fade : -- toggle blinking of the colon / -- increase angle of digits \ -- decrease angle of digits + -- increase thickness of digit segments - -- decrease thickness of digit segments > -- increase spacing between digits < -- decrease spacing between digits q -- quit To set the alarm time, use the third mouse button and click on the digits with the first and second buttons (to increase and decrease the number, respectively), until the time is set correctly. Alarm time is set in 24-hour format to distringuish between am and pm. If there is an asterisk on the same line as the date, then the alarm is set. Use the 'a' key to set the alarm, or click on the date area with any mouse button. ----------------------------------------------------------------------- Typical uses: # set alarm for noon dclock -fg green -bg black -led_off gray20 -alarmTime 12:00 -alarm # set date string and have bell go off on hour/half-hour intervals dclock -date "Today is %A, %B %d" -fg yellow -bg brown -led_off brown4 -bell # set date more simply, use 24-hour military time format and display secs dclock -date "%a, %b %d" -miltime -seconds # the traditional red glow, no slant dclock -fg red -bg darkblue -led_off #500050 -slope 50 # a pleasant blue glow dclock -fg cyan -bg darkblue -led_off blue4 # Matt Magri's LCD dclock (magri@anarcho.com) dclock -miltime -seconds -date "= %A, %d %B %Y =" -dateup \ -fg black -bg gray56 -led_off gray53 \ -fn "-adobe-helvetica-bold-r-normal--*-100-*-*-*" \ -geometry 256x80+0+0 & ----------------------------------------------------------------------- dclock-2.2.2/dclock.c0000644000175000017500000001364711034560166015026 0ustar bdefreesebdefreese/* * Copyright (c) 1988 Dan Heller * dclock -- program to demonstrate how to use the digital-clock widget. * To specify a date, the date format is a string corresponding to the * syntax of strftime(3). * To specify seconds to be displayed, use "-seconds" or use the resource * manager: *Dclock.seconds: on */ #include #include #include #include "Dclock.h" static XrmOptionDescRec options[] = { {"-date", "*Dclock.date", XrmoptionSepArg, NULL }, {"-dateup", "*Dclock.dateUp", XrmoptionNoArg, "TRUE" }, {"-nodateup", "*Dclock.dateUp", XrmoptionNoArg, "FALSE" }, {"-seconds", "*Dclock.seconds", XrmoptionNoArg, "TRUE" }, {"-miltime", "*Dclock.militaryTime",XrmoptionNoArg, "TRUE" }, {"-nomiltime", "*Dclock.militaryTime",XrmoptionNoArg, "FALSE" }, {"-stdtime", "*Dclock.militaryTime",XrmoptionNoArg, "FALSE" }, {"-utc", "*Dclock.utcTime", XrmoptionNoArg, "TRUE" }, {"-noutc", "*Dclock.utcTime", XrmoptionNoArg, "FALSE" }, {"-disptime", "*Dclock.displayTime", XrmoptionNoArg, "TRUE" }, {"-audioPlay", "*Dclock.audioPlay", XrmoptionSepArg, NULL }, {"-bell", "*Dclock.bell", XrmoptionNoArg, "TRUE" }, {"-nobell", "*Dclock.bell", XrmoptionNoArg, "FALSE" }, {"-bellFile", "*Dclock.bellFile", XrmoptionSepArg, NULL }, {"-alarm", "*Dclock.alarm", XrmoptionNoArg, "TRUE" }, {"-noalarm", "*Dclock.alarm", XrmoptionNoArg, "FALSE" }, {"-persist", "*Dclock.alarmPersist",XrmoptionNoArg, "TRUE" }, {"-nopersist", "*Dclock.alarmPersist",XrmoptionNoArg, "FALSE" }, {"-alarmTime", "*Dclock.alarmTime", XrmoptionSepArg, NULL }, {"-alarmFile", "*Dclock.alarmFile", XrmoptionSepArg, NULL }, {"-blink", "*Dclock.blink", XrmoptionNoArg, "TRUE" }, {"-noblink", "*Dclock.blink", XrmoptionNoArg, "FALSE" }, {"-tails", "*Dclock.tails", XrmoptionNoArg, "TRUE" }, {"-notails", "*Dclock.tails", XrmoptionNoArg, "FALSE" }, {"-scroll", "*Dclock.scroll", XrmoptionNoArg, "TRUE" }, {"-noscroll", "*Dclock.scroll", XrmoptionNoArg, "FALSE" }, {"-fade", "*Dclock.fade", XrmoptionNoArg, "TRUE" }, {"-nofade", "*Dclock.fade", XrmoptionNoArg, "FALSE" }, {"-fadeRate", "*Dclock.fadeRate", XrmoptionSepArg, NULL }, {"-slope", "*Dclock.angle", XrmoptionSepArg, NULL }, {"-thickness", "*Dclock.widthFactor", XrmoptionSepArg, NULL }, {"-smallsize", "*Dclock.smallRatio", XrmoptionSepArg, NULL }, {"-spacing", "*Dclock.spaceFactor", XrmoptionSepArg, NULL }, {"-second_gap","*Dclock.secondGap", XrmoptionSepArg, NULL }, {"-led_off", "*Dclock.led_off", XrmoptionSepArg, NULL }, #ifdef XFT_SUPPORT {"-fontName", "*Dclock.fontName", XrmoptionSepArg, NULL }, #endif }; static void Usage(name, args) String name, *args; { static char *help_message[] = { "where options include:", " -help print this help text", " -bg color field background color", " -fg color segment foreground color", " -fn font font name", " -geometry geom size of mailbox", " -display host:dpy X server to contact", " -led_off color segment background color", " -date \"date format\" show the date in strftime(3) format", " -[no]dateup [don't] put the date up at the top", " -[no]seconds [don't] display seconds", " -[no]miltime [don't] display time in 24 hour format", " -[no]utc [don't] display the UTC time instead of local", " -[no]blink [don't] blink the colon", " -[no]scroll turn on [off] scrolling of numbers", " -[no]tails draw [remove] tails on digits 6 and 9", " -[no]fade [don't] fade numbers", " -[no]bell [don't] ring bell each half hour", " -[no]persist [don't] leave in reverse video after alarm", " -bellFile filename sound file for bell sound", " -[no]alarm turn on/off alarm", " -alarmTime hh:mm time alarm goes off", " -alarmFile filename sound file for alarm sound", " -audioPlay filename executable to use to play bell and alarm", " -fadeRate int_val wait between fade steps (in msec)", " -slope float_val set angle of the digits", " -smallsize float_val set size ratio of the small to large digits", " -second_gap float_val set spacing between minutes and seconds digits", " -thickness float_val set segment thickness as ratio to digit width", " -spacing float_val set digit spacing as ratio to digit width", #ifdef XFT_SUPPORT " -fontName name name of freefont font to use for date string", #endif NULL }; char **cpp; fprintf(stderr, "Invalid Args:"); while (*args) fprintf(stderr, " \"%s\"", *args++); fputc('\n', stderr); fprintf(stderr, "usage: %s [-options ...]\n", name); for (cpp = help_message; *cpp; cpp++) fprintf(stderr, "%s\n", *cpp); exit(1); } static void quit() { exit(0); } static XtActionsRec actionsList[] = { { "quit", quit }, }; main(argc, argv) char *argv[]; { XtAppContext app; Widget toplevel, clock_w; char *name, *rindex(); XWMHints *wmhints; /* for proper input focus */ if (name = rindex(argv[0], '/')) name++; else name = argv[0]; setlocale(LC_TIME, ""); toplevel = XtAppInitialize(&app, "Dclock", options, XtNumber(options), &argc, argv, (String *)NULL, (ArgList)NULL, 0); XtAppAddActions(app, actionsList, 1); if (argc != 1) Usage(name, argv+1); clock_w = XtCreateManagedWidget(name, dclockWidgetClass, toplevel, NULL, 0); XtOverrideTranslations(clock_w, XtParseTranslationTable("q: quit()")); XtRealizeWidget(toplevel); wmhints = XGetWMHints(XtDisplay(toplevel), XtWindow(toplevel)); wmhints->input = True; wmhints->flags |= InputHint; XSetWMHints(XtDisplay(toplevel), XtWindow(toplevel), wmhints); XFree(wmhints); XtAppMainLoop(app); return 0; } dclock-2.2.2/Makefile0000644000175000017500000006757311033062013015055 0ustar bdefreesebdefreese# Makefile generated by imake - do not edit! # $Xorg: imake.c,v 1.6 2001/02/09 02:03:15 xorgcvs Exp $ # ---------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $Xorg: Imake.tmpl,v 1.4 2000/08/17 19:41:46 cpqbld Exp $ # $XdotOrg: xc/config/cf/Imake.tmpl,v 1.6 2004/07/28 03:24:29 gisburn Exp $ # # # # # $XFree86: xc/config/cf/Imake.tmpl,v 3.155 2003/12/24 18:58:41 dickey Exp $ # ---------------------------------------------------------------------- all:: .SUFFIXES: .i # $XdotOrg: xc/config/cf/Imake.cf,v 1.4 2004/08/11 21:14:01 kem Exp $ # $Xorg: Imake.cf,v 1.4 2000/08/17 19:41:45 cpqbld Exp $ # $XFree86: xc/config/cf/Imake.cf,v 3.88 2003/12/16 21:30:21 herrb Exp $ # Keep cpp from replacing path elements containing i486/i586/i686 # ----------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # site: $TOG: site.sample /main/r64_final/1 1998/02/05 16:28:49 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.24 2000/06/25 20:17:29 dawes Exp $ # $XFree86: xc/config/cf/xf86site.def,v 3.186 2003/06/25 18:06:22 eich Exp $ # ---------------------------------------------------------------------- # platform-specific configuration parameters - edit linux.cf to change # $XdotOrg: xc/config/cf/linux.cf,v 1.13 2004/08/11 21:14:01 kem Exp $ # platform: $Xorg: linux.cf,v 1.3 2000/08/17 19:41:47 cpqbld Exp $ # platform: $XFree86: xc/config/cf/linux.cf,v 3.220 2003/12/30 22:38:33 tsi Exp $ # operating system: Linux 2.6.9 i686 [ELF] (2.6.9) # libc: (6.3.3) # binutils: (215) # $Xorg: lnxLib.rules,v 1.3 2000/08/17 19:41:47 cpqbld Exp $ # $XFree86: xc/config/cf/lnxLib.rules,v 3.52 2003/10/31 20:49:03 herrb Exp $ # $XdotOrg: xc/config/cf/xorg.cf,v 1.27.2.2 2004/09/17 15:38:18 kem Exp $ # $Xorg: xfree86.cf,v 1.4 2000/08/17 19:41:49 cpqbld Exp $ XORG_VERSION_CURRENT = (((6) * 10000000) + ((8) * 100000) + ((1) * 1000) + 0) RELEASE_VERSION = RELEASE-1 AFB_DEFS = -DUSE_AFB DRIVERSDKDIR = $(USRLIBDIR)/Server DRIVERSDKMODULEDIR = $(USRLIBDIR)/Server/modules DRIVERSDKINCLUDEDIR = $(USRLIBDIR)/Server/include XF86SRC = $(SERVERSRC)/hw/xfree86 XF86COMSRC = $(XF86SRC)/common XF86PARSERSRC = $(XF86SRC)/parser XF86OSSRC = $(XF86SRC)/os-support XF86DRIVERSRC = $(XF86SRC)/drivers DRIVERSRC = $(XF86DRIVERSRC) XFREE86DOCDIR = $(DOCDIR) XFREE86PSDOCDIR = $(DOCPSDIR) XFREE86PDFDOCDIR = $(DOCPDFDIR) XFREE86HTMLDOCDIR = $(DOCHTMLDIR) XFREE86JAPANESEDOCDIR = $(DOCDIR)/Japanese # $Xorg: xf86.rules,v 1.3 2000/08/17 19:41:48 cpqbld Exp $ # $XFree86: xc/config/cf/xf86.rules,v 3.34tsi Exp $ # ---------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # site: $TOG: site.sample /main/r64_final/1 1998/02/05 16:28:49 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.24 2000/06/25 20:17:29 dawes Exp $ # --------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # rules: $Xorg: Imake.rules,v 1.3 2000/08/17 19:41:46 cpqbld Exp $ # rules: $XdotOrg: xc/config/cf/Imake.rules,v 1.6 2004/08/13 17:21:43 krh Exp $ # # # # # rules: $XFree86: xc/config/cf/Imake.rules,v 3.128 2003/11/15 03:25:17 dawes Exp $ .PHONY: all interfaces install install.man install.lib install.sdk depend includes cleandir _NULLCMD_ = @ echo -n X_BYTE_ORDER = X_LITTLE_ENDIAN GLIDE2INCDIR = GLIDE3INCDIR = /usr/include/glide3 GLIDE3LIBNAME = glide3 TKLIBNAME = TKLIBDIR = TCLLIBNAME = TCLIBDIR = PATHSEP = / SHELL = /bin/sh -e TOP = . CURRENT_DIR = . IMAKE = imake DEPEND = gccmakedep MKDIRHIER = mkdir -p REVPATH = revpath EXPORTLISTGEN = RMAN = rman RMANBASENAME = rman RMANOPTIONS = -f HTML CONFIGSRC = $(TOP)/config IMAKESRC = $(CONFIGSRC)/imake DEPENDSRC = $(CONFIGSRC)/util INCROOT = /usr/X11R6/include USRLIBDIR = /usr/X11R6/lib VARDIR = /var VARLIBDIR = $(VARDIR)/lib SYSTEMUSRLIBDIR = /usr/lib SYSTEMUSRINCDIR = /usr/include SHLIBDIR = /usr/X11R6/lib LINTLIBDIR = $(USRLIBDIR)/lint MANPATH = /usr/X11R6/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)5 MISCMANDIR = $(MANSOURCEPATH)7 DRIVERMANDIR = $(MANSOURCEPATH)4 ICONDIR = /usr/share/icons XCURSORPATH = "~/.icons:/usr/share/icons:/usr/share/pixmaps" LOGDIRECTORY = $(VARDIR)/log VARRUNDIR = $(VARDIR)/run VARDBDIR = $(VARDIR)/lib AR = ar clq # Nice try but useless: make will inherit BOOTSTRAPCFLAGS # from top Makefile BOOTSTRAPCFLAGS = -O2 -pipe -m32 -march=i386 -mtune=pentium4 -pipe CC = gcc -m32 AS = gcc -m32 -c -x assembler -Wa,--noexecstack .SUFFIXES: .cc CXX = c++ -m32 CXXFILT = c++filt CXXLIB = -lstdc++ CXXDEBUGFLAGS = -O2 -pipe -m32 -march=i386 -mtune=pentium4 -fno-strict-aliasing -pipe CXXDEPENDINCLUDES = CXXEXTRA_DEFINES = CXXEXTRA_INCLUDES = CXXSTD_DEFINES = -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE $(CXXPROJECT_DEFINES) CXXOPTIONS = CXXINCLUDES = $(INCLUDES) $(TOP_INCLUDES) $(CXXEXTRA_INCLUDES) CXXDEFINES = $(CXXINCLUDES) $(CXXSTD_DEFINES) $(THREADS_CXXDEFINES) $(DEFINES) $(CXXEXTRA_DEFINES) CXXFLAGS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) COMPRESS = compress GZIPCMD = gzip CPP = cpp $(STD_CPP_DEFINES) RAWCPP = cpp -undef $(STD_CPP_OPTIONS) PREPROCESSCMD = gcc -m32 -E $(STD_CPP_DEFINES) INSTALL = install INSTALLFLAGS = -c LD = gcc -m32 -nostdlib LEX = flex -l M4 = m4 M4FLAGS = LEXLIB = -lfl YACC = bison -y CCYACC = bison -y LINT = lint LINTLIBFLAG = -C LINTOPTS = -axz LN = ln -s MAKE = make MV = mv -f CP = cp RANLIB = ranlib RANLIBINSTFLAGS = RM = rm -f PERL = perl PERLOPTS = PERLENVSETUP = env LC_ALL=C MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 5x MISCMANSUFFIX = 7x DRIVERMANSUFFIX = 4x ADMINMANSUFFIX = 8 MANSRCSUFFIX = man MANNEWSUFFIX = _man MANDEFS = -D__apploaddir__=$(XAPPLOADDIR) -D__appmansuffix__=$(MANSUFFIX) -D__filemansuffix__=$(FILEMANSUFFIX) -D__libmansuffix__=$(LIBMANSUFFIX) -D__miscmansuffix__=$(MISCMANSUFFIX) -D__drivermansuffix__=$(DRIVERMANSUFFIX) -D__adminmansuffix__=$(ADMINMANSUFFIX) -D__projectroot__=$(PROJECTROOT) -D__xconfigfile__=$(XCONFIGFILE) -D__xconfigdir__=$(XCONFIGDIR) -D__xlogfile__=$(XLOGFILE) -D__xservername__=$(XSERVERNAME) $(XORGMANDEFS) $(VENDORMANDEFS) COMPRESSMANCMD = gzip -n TROFF = groff -Tps NROFF = nroff MSMACROS = -ms MANMACROS = -man TBL = tbl EQN = eqn NEQN = neqn COL = col COLFLAGS = -b MODCC = gcc -m32 MODCPP = cpp MODCFLAGS = $(CFLAGS) MODAS = gcc -m32 -c -x assembler -Wa,--noexecstack MODASFLAGS = MODLD = gcc -m32 -nostdlib MODLDFLAGS = MODLDCOMBINEFLAGS = -r MODAR = ar clq MODRANLIB = ranlib STD_INCLUDES = STD_CPP_OPTIONS = -traditional STD_CPP_DEFINES = -traditional -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE $(PROJECT_DEFINES) STD_DEFINES = -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE $(PROJECT_DEFINES) EXTRA_LOAD_FLAGS = EXTRA_LDOPTIONS = EXTRA_LIBRARIES = TAGS = ctags PARALLELMFLAGS = SHAREDCODEDEF = SHLIBDEF = SHLIBLDFLAGS = -shared $(SHLIBGLOBALSFLAGS) PICFLAGS = -fPIC CXXPICFLAGS = -fPIC PROTO_DEFINES = -DFUNCPROTO=15 -DNARROWPROTO INSTPGMFLAGS = INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4711 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -m 4711 PROJECTROOT = /usr/X11R6 CDEBUGFLAGS = -O2 -pipe -m32 -march=i386 -mtune=pentium4 -fno-strict-aliasing -pipe CCOPTIONS = ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(INSTALLED_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(THREADS_DEFINES) $(MODULE_DEFINES) $(DEFINES) $(EXTRA_DEFINES) CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(MODULE_CFLAGS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) $(DEPEND_DEFINES) LDPRELIB = -L$(USRLIBDIR) $(INSTALLED_LIBS) LDPOSTLIB = LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_LDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) CXXLDOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_CXXLDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) LDLIBS = $(LDPOSTLIBS) $(THREADS_LIBS) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) CCLINK = $(CC) CXXLINK = $(CXX) LDSTRIPFLAGS = -x LDCOMBINEFLAGS = -r DEPENDFLAGS = DEPEND_DEFINES = # Not sure this belongs here TKLIBDIR = TKINCDIR = TKLIBNAME = TKLIBRARY = -L$(TKLIBDIR) -l$(TKLIBNAME) TCLLIBDIR = TCLINCDIR = TCLLIBNAME = TCLLIBRARY = -L$(TCLLIBDIR) -l$(TCLLIBNAME) MACROFILE = linux.cf RM_CMD = $(RM) IMAKE_DEFINES = IMAKE_WARNINGS = -Wundef IRULESRC = $(CONFIGDIR) IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES) $(IMAKE_WARNINGS) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/X11.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(IRULESRC)/xfree86.cf $(IRULESRC)/xf86.rules $(IRULESRC)/xorgsite.def $(IRULESRC)/host.def $(EXTRA_ICONFIGFILES) # $Xorg: X11.rules,v 1.4 2000/08/17 19:41:46 cpqbld Exp $ # $XFree86: xc/config/cf/X11.rules,v 1.6 2001/01/17 16:22:31 dawes Exp $ # ---------------------------------------------------------------------- # X Window System Build Parameters and Rules # $XdotOrg: xc/config/cf/X11.tmpl,v 1.35 2004/09/03 16:18:18 kem Exp $ # $Xorg: X11.tmpl,v 1.6 2000/08/17 19:41:46 cpqbld Exp $ # # # # # $XFree86: xc/config/cf/X11.tmpl,v 1.248 2004/02/16 04:07:37 dawes Exp $ STICKY_DEFINES = -DHAS_STICKY_DIR_BIT FCHOWN_DEFINES = -DHAS_FCHOWN # ----------------------------------------------------------------------- # X Window System make variables; these need to be coordinated with rules XTOP = $(TOP) BINDIR = /usr/X11R6/bin BUILDINCROOT = $(TOP)/exports BUILDINCDIR = $(BUILDINCROOT)/include BUILDINCTOP = ../.. BUILDLIBDIR = $(TOP)/exports/lib BUILDLIBTOP = ../.. BUILDBINDIR = $(TOP)/exports/bin BUILDBINTOP = ../.. BUILDMODULEDIR = $(BUILDLIBDIR)/modules BUILDI18NDIR = $(BUILDLIBDIR)/locale BUILDMODULETOP = $(BUILDLIBTOP)/.. XBUILDINCROOT = $(XTOP)/exports XBUILDINCDIR = $(XBUILDINCROOT)/include/X11 XBUILDINCTOP = ../../.. XBUILDBINDIR = $(XBUILDINCROOT)/bin INCDIR = $(INCROOT) ADMDIR = /var/log LIBDIR = /usr/X11R6/lib/X11 LIBEXECDIR = /usr/X11R6/libexec MODULEDIR = $(USRLIBDIR)/modules TOP_X_INCLUDES = XBINDIR = $(PROJECTROOT)/bin INSTSRCDIR = /usr/X11R6/src ETCX11DIR = /etc/X11 CONFDIR = $(ETCX11DIR) DOCDIR = $(LIBDIR)/doc DOCHTMLDIR = $(DOCDIR)/html DOCPSDIR = $(DOCDIR)/PostScript DOCPDFDIR = $(DOCDIR)/PDF FONTDIR = $(LIBDIR)/fonts ENCODINGSDIR = $(FONTDIR)/encodings XINITDIR = /etc/X11/xinit XDMDIR = /etc/X11/xdm XDMVARDIR = $(VARLIBDIR)/xdm TWMDIR = $(LIBDIR)/twm XSMDIR = $(LIBDIR)/xsm NLSDIR = $(LIBDIR)/nls XLOCALEDIR = $(LIBDIR)/locale LBXPROXYDIR = /etc/X11/lbxproxy PROXYMANAGERDIR = /etc/X11/proxymngr XPRINTDIR = /etc/X11/xserver XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t INSTAPPFLAGS = $(INSTDATFLAGS) RGB = $(XBINDIR)/rgb FONTC = $(XBINDIR)/bdftopcf MKFONTSCALE = $(XBINDIR)/mkfontscale MKFONTDIR = $(XBINDIR)/mkfontdir MKHTMLINDEX = $(XBINDIR)/mkhtmlindex UCS2ANY = $(XBINDIR)/ucs2any BDFTRUNCATE = $(XBINDIR)/bdftruncate UCSMAPPREFIX = $(FONTDIR)/util/map- XCURSORGEN = $(XBINDIR)/xcursorgen HTMLINDEXCMD = HtmlIndexCmd DOCUTILSRC = $(XTOP)/doc/util CLIENTSRC = $(TOP)/clients DEMOSRC = $(TOP)/demos XDOCMACROS = $(DOCUTILSRC)/macros.t XIDXMACROS = $(DOCUTILSRC)/indexmacros.t PROGRAMSRC = $(TOP)/programs LIBSRC = $(XTOP)/lib FONTSRC = $(XTOP)/fonts ENCODINGSSRC = $(FONTSRC)/encodings INCLUDESRC = $(BUILDINCROOT)/include XINCLUDESRC = $(INCLUDESRC)/X11 SERVERSRC = $(XTOP)/programs/Xserver CONTRIBSRC = $(XTOP)/../contrib UNSUPPORTEDSRC = $(XTOP)/unsupported DOCSRC = $(XTOP)/doc RGBSRC = $(XTOP)/programs/rgb BDFTOPCFSRC = $(PROGRAMSRC)/bdftopcf MKFONTDIRSRC = $(PROGRAMSRC)/mkfontdir FONTSERVERSRC = $(PROGRAMSRC)/xfs FONTINCSRC = $(XTOP)/include/fonts EXTINCSRC = $(XTOP)/include/extensions FTSOURCEDIR = FreeTypeSrcDir DRMSRCDIR = $(TOP)/extras/drm MESASRCDIR = $(TOP)/extras/Mesa OGLSAMPLESRCDIR = $(TOP)/extras/ogl-sample PSWRAPSRC = $(XTOP)/config/pswrap TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) CONNECTION_FLAGS = -DUNIXCONN -DTCPCONN $(STICKY_DEFINES) $(FCHOWN_DEFINES) -DIPv6 XTRANS_FAILDEFINES = VENDORMANNAME = X.Org VENDORMANVERSION = `echo 6 8 1 | sed -e 's/ /./g' -e 's/^/Version\\\ /'` XORGMANDEFS = -D__xorgversion__='"$(XORGRELSTRING)" "$(XORGMANNAME)"' VENDORMANDEFS = -D__vendorversion__="$(VENDORMANVERSION) $(VENDORMANNAME)" VENDORNAME = The X.Org Foundation VENDORNAMESHORT = X.Org VENDORWEBSUPPORT = http://wiki.X.Org VENDORSUPPORTDEFS = -D__VENDORDWEBSUPPORT__='"$(VENDORWEBSUPPORT)"' XKBDEFRULES = xorg XKBDEFRULESDEFS = -D__XKBDEFRULES__='"$(XKBDEFRULES)"' XCONFIGFILE = xorg.conf XCONFIGDIR = /etc/X11 XLOGFILE = Xorg XSERVERNAME = Xorg XENVLIBDIR = $(USRLIBDIR) CLIENTENVSETUP = LD_LIBRARY_PATH=$(XENVLIBDIR) XLOCALEDIR=$(BUILDLIBDIR)/locale # $Xorg: lnxLib.tmpl,v 1.3 2000/08/17 19:41:47 cpqbld Exp $ # $XFree86: xc/config/cf/lnxLib.tmpl,v 3.19 2003/10/15 22:47:48 herrb Exp $ XLIBSRC = $(LIBSRC)/X11 SOXLIBREV = 6.2 DEPXONLYLIB = XONLYLIB = -lX11 LINTXONLY = $(LINTLIBDIR)/llib-lX11.ln DEPXLIBONLY = $(DEPXONLYLIB) XLIBONLY = $(XONLYLIB) LINTXONLYLIB = $(LINTXONLY) XEXTLIBSRC = $(LIBSRC)/Xext SOXEXTREV = 6.4 DEPEXTENSIONLIB = EXTENSIONLIB = -lXext LINTEXTENSION = $(LINTLIBDIR)/llib-lXext.ln LINTEXTENSIONLIB = $(LINTEXTENSION) DEPXLIB = $(DEPEXTENSIONLIB) $(DEPXONLYLIB) XLIB = $(EXTENSIONLIB) $(XONLYLIB) LINTXLIB = $(LINTXONLYLIB) XSSLIBSRC = $(LIBSRC)/Xss SOXSSREV = 1.0 DEPXSSLIB = XSSLIB = -lXss LINTXSS = $(LINTLIBDIR)/llib-lXss.ln XXF86MISCLIBSRC = $(LIBSRC)/Xxf86misc SOXXF86MISCREV = 1.1 DEPXXF86MISCLIB = XXF86MISCLIB = -lXxf86misc LINTXXF86MISC = $(LINTLIBDIR)/llib-lXxf86misc.ln XXF86VMLIBSRC = $(LIBSRC)/Xxf86vm SOXXF86VMREV = 1.0 DEPXXF86VMLIB = XXF86VMLIB = -lXxf86vm LINTXXF86VM = $(LINTLIBDIR)/llib-lXxf86vm.ln XXF86DGALIBSRC = $(LIBSRC)/Xxf86dga SOXXF86DGAREV = 1.0 DEPXXF86DGALIB = XXF86DGALIB = -lXxf86dga LINTXXF86DGA = $(LINTLIBDIR)/llib-lXxf86dga.ln XXF86RUSHLIBSRC = $(LIBSRC)/Xxf86rush SOXXF86RUSHREV = 1.0 DEPXXF86RUSHLIB = XXF86RUSHLIB = -lXxf86rush LINTXXF86RUSH = $(LINTLIBDIR)/llib-lXxf86rush.ln XVLIBSRC = $(LIBSRC)/Xv SOXVREV = 1.0 DEPXVLIB = XVLIB = -lXv LINTXV = $(LINTLIBDIR)/llib-lXv.ln XVMCLIBSRC = $(LIBSRC)/XvMC SOXVMCREV = 1.0 DEPXVMCLIB = XVMCLIB = -lXvMC LINTXVMC = $(LINTLIBDIR)/llib-lXvMC.ln XINERAMALIBSRC = $(LIBSRC)/Xinerama SOXINERAMAREV = 1.0 DEPXINERAMALIB = XINERAMALIB = -lXinerama LINTXINERAMA = $(LINTLIBDIR)/llib-lXinerama.ln XRESLIBSRC = $(LIBSRC)/XRes SOXRESREV = 1.0 DEPXRESLIB = XRESLIB = -lXRes LINTXRES = $(LINTLIBDIR)/llib-lXRes.ln DMXLIBSRC = $(LIBSRC)/dmx DEPDMXLIB = $(USRLIBDIR)/libdmx.a DMXLIB = -ldmx LINTDMX = $(LINTLIBDIR)/llib-ldmx.ln DPSLIBSRC = $(LIBSRC)/dps SODPSREV = 1.0 DEPDPSLIB = DPSLIB = -ldps LINTDPS = $(LINTLIBDIR)/llib-ldps.ln DPSTKLIBSRC = $(LIBSRC)/dpstk SODPSTKREV = 1.0 DEPDPSTKLIB = DPSTKLIB = -ldpstk LINTDPSTK = $(LINTLIBDIR)/llib-ldpstk.ln PSRESLIBSRC = $(LIBSRC)/psres SOPSRESREV = 1.0 DEPPSRESLIB = PSRESLIB = -lpsres LINTPSRES = $(LINTLIBDIR)/llib-lpsres.ln GLULIBSRC = $(LIBSRC)/GLU SOGLUREV = 1.3 DEPGLULIB = GLULIB = -lGLU LINTGLU = $(LINTLIBDIR)/llib-lGLU.ln GLXLIBSRC = $(LIBSRC)/GL SOGLREV = 1.2 DEPGLXLIB = GLXLIB = -lGL LINTGLX = $(LINTLIBDIR)/llib-lGL.ln GLWIDGETSRC = $(LIBSRC)/GLw SOGLWREV = 1.0 DEPGLWLIB = GLWLIB = -lGLw LINTGLW = $(LINTLIBDIR)/llib-lGLw.ln XRENDERLIBSRC = $(LIBSRC)/Xrender SOXRENDERREV = 1.2.2 DEPXRENDERLIB = XRENDERLIB = -lXrender LINTXRENDER = $(LINTLIBDIR)/llib-lXrender.ln XRANDRLIBSRC = $(LIBSRC)/Xrandr SOXRANDRREV = 2.0 DEPXRANDRLIB = XRANDRLIB = -lXrandr LINTXRANDR = $(LINTLIBDIR)/llib-lXrandr.ln XFIXESLIBSRC = $(LIBSRC)/Xfixes SOXFIXESREV = 3.0 DEPXFIXESLIB = XFIXESLIB = -lXfixes LINTXFIXES = $(LINTLIBDIR)/llib-lXfixes.ln XDAMAGELIBSRC = $(LIBSRC)/Xdamage SOXDAMAGEREV = 1.0 DEPXDAMAGELIB = XDAMAGELIB = -lXdamage LINTXDAMAGE = $(LINTLIBDIR)/llib-lXdamage.ln XCOMPOSITELIBSRC = $(LIBSRC)/Xcomposite SOXCOMPOSITEREV = 1.0 DEPXCOMPOSITELIB = XCOMPOSITELIB = -lXcomposite LINTXCOMPOSITE = $(LINTLIBDIR)/llib-lXcomposite.ln XEVIELIBSRC = $(LIBSRC)/Xevie SOXEVIEREV = 1.0 DEPXEVIELIB = XEVIELIB = -lXevie LINTXEVIE = $(LINTLIBDIR)/llib-lXevie.ln XCURSORLIBSRC = $(LIBSRC)/Xcursor SOXCURSORREV = 1.0.2 DEPXCURSORLIB = XCURSORLIB = -lXcursor LINTXCURSOR = $(LINTLIBDIR)/llib-lXcursor.ln APPLEWMLIBSRC = $(LIBSRC)/apple DEPAPPLEWMLIB = $(USRLIBDIR)/libAppleWM.a APPLEWMLIB = -lAppleWM LINTAPPLEWM = $(LINTLIBDIR)/llib-lAppleWM.ln WINDOWSWMLIBSRC = $(LIBSRC)/windows DEPWINDOWSWMLIB = $(USRLIBDIR)/libWindowsWM.a WINDOWSWMLIB = -lWindowsWM LINTWINDOWSWM = $(LINTLIBDIR)/llib-lWindowsWM.ln XFONTCACHELIBSRC = $(LIBSRC)/Xfontcache SOXFONTCACHEREV = 1.2 DEPXFONTCACHELIB = XFONTCACHELIB = -lXfontcache LINTXFONTCACHE = $(LINTLIBDIR)/llib-lXfontcache.ln XAUTHSRC = $(LIBSRC)/Xau DEPXAUTHLIB = $(USRLIBDIR)/libXau.a XAUTHLIB = -lXau LINTXAUTH = $(LINTLIBDIR)/llib-lXau.ln XDMCPLIBSRC = $(LIBSRC)/Xdmcp DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp LINTXDMCP = $(LINTLIBDIR)/llib-lXdmcp.ln XMUSRC = $(LIBSRC)/Xmu SOXMUREV = 6.2 DEPXMULIB = XMULIB = -lXmu LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln XMUUSRC = $(LIBSRC)/Xmuu SOXMUUREV = 1.0 DEPXMUULIB = XMUULIB = -lXmuu LINTXMUU = $(LINTLIBDIR)/llib-lXmuu.ln OLDXLIBSRC = $(LIBSRC)/oldX DEPOLDXLIB = $(USRLIBDIR)/liboldX.a OLDXLIB = -loldX LINTOLDX = $(LINTLIBDIR)/llib-loldX.ln XPLIBSRC = $(LIBSRC)/Xp SOXPREV = 6.2 DEPXPLIB = XPLIB = -lXp LINTXP = $(LINTLIBDIR)/llib-lXp.ln TOOLKITSRC = $(LIBSRC)/Xt SOXTREV = 6.0 DEPXTOOLONLYLIB = XTOOLONLYLIB = -lXt LINTXTOOLONLY = $(LINTLIBDIR)/llib-lXt.ln DEPXTOOLLIB = $(DEPXTOOLONLYLIB) $(DEPSMLIB) $(DEPICELIB) XTOOLLIB = $(XTOOLONLYLIB) $(SMLIB) $(ICELIB) LINTXTOOLLIB = $(LINTXTOOLONLYLIB) XALIBSRC = $(LIBSRC)/Xa SOXAREV = 1.0 DEPXALIB = XALIB = -lXa LINTXA = $(LINTLIBDIR)/llib-lXa.ln AWIDGETSRC = $(LIBSRC)/Xaw AWIDGET7SRC = $(LIBSRC)/Xaw7 SOXAW7REV = 7.0 DEPXAW7LIB = XAW7LIB = -lXaw LINTXAW7 = $(LINTLIBDIR)/llib-lXaw.ln SOXAWREV = SharedXawRev DEPXAWLIB = XAWLIB = -lXaw LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln AWIDGET6SRC = $(LIBSRC)/Xaw6 SOXAW6REV = 6.1 DEPXAW6LIB = XAW6LIB = -lXaw LINTXAW6 = $(LINTLIBDIR)/llib-lXaw.ln XILIBSRC = $(LIBSRC)/Xi SOXINPUTREV = 6.0 DEPXILIB = XILIB = -lXi LINTXI = $(LINTLIBDIR)/llib-lXi.ln XTESTLIBSRC = $(LIBSRC)/Xtst SOXTESTREV = 6.1 DEPXTESTLIB = XTESTLIB = -lXtst LINTXTEST = $(LINTLIBDIR)/llib-lXtst.ln DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTXBSD = $(LINTLIBDIR)/llib-lXbsd.ln ICESRC = $(LIBSRC)/ICE SOICEREV = 6.3 DEPICELIB = ICELIB = -lICE LINTICE = $(LINTLIBDIR)/llib-lICE.ln SMSRC = $(LIBSRC)/SM SOSMREV = 6.0 DEPSMLIB = SMLIB = -lSM LINTSM = $(LINTLIBDIR)/llib-lSM.ln XKEYSRC = $(LIBSRC)/Xkey SOXKEYREV = 6.0 DEPXKEYLIB = XKEYLIB = -lXkey LINTXKEY = $(LINTLIBDIR)/llib-lXkey.ln FSLIBSRC = $(LIBSRC)/FS SOFSREV = 6.0 DEPFSLIB = FSLIB = -lFS LINTFS = $(LINTLIBDIR)/llib-lFS.ln FONTLIBSRC = $(LIBSRC)/font SOFONTREV = 1.5 DEPFONTLIB = FONTLIB = -L$(FREETYPELIBDIR) -L$(FONTLIBSRC) -lXfont LINTXFONT = $(LINTLIBDIR)/llib-lXfont.ln # SOFONTREV = 1.5 DEPXFONTLIB = XFONTLIB = -lXfont LINTXFONT = $(LINTLIBDIR)/llib-lXfont.ln FONTSTUBLIBSRC = $(FONTLIBSRC)/stubs DEPFONTSTUBLIB = $(USRLIBDIR)/libfntstubs.a FONTSTUBLIB = -lfntstubs LINTFONTSTUB = $(LINTLIBDIR)/llib-lfntstubs.ln DEPFONTLIB = $(DEPXFONTLIB) $(DEPFONTSTUBLIB) FONTLIB = $(XFONTLIB) $(FONTSTUBLIB) $(FREETYPE2LIB) FONTENCLIBSRC = $(LIBSRC)/fontenc SOFONTENCREV = 1.0 DEPXFONTENCLIB = XFONTENCLIB = -lfontenc LINTXFONTENC = $(LINTLIBDIR)/llib-lfontenc.ln XPMLIBSRC = $(LIBSRC)/Xpm SOXPMREV = 4.11 DEPXPMLIB = XPMLIB = -lXpm LINTXPM = $(LINTLIBDIR)/llib-lXpm.ln FREETYPE2DIR = /usr FREETYPE2LIBDIR = /usr/lib FREETYPE2INCDIR = /usr/include FREETYPE2LIB = -lfreetype FREETYPE2INCLUDES = -I$(FREETYPE2INCDIR)/freetype2 -I$(FREETYPE2INCDIR)/freetype2/config FREETYPE2DEFINES = -DFREETYPE2 EXPATLIBSRC = $(LIBSRC)/expat SOEXPATREV = 0.4 DEPEXPATLIB = EXPATLIB = -lexpat LINTEXPAT = $(LINTLIBDIR)/llib-lexpat.ln EXPATDIR = /usr EXPATLIBDIR = /usr/lib EXPATINCDIR = /usr/include EXPATINCLUDES = EXPATLIB = -lexpat EXPATDEFINES = -DEXPAT XFT1LIBSRC = $(LIBSRC)/Xft1 SOXFT1REV = 1.1 DEPXFT1LIB = XFT1LIB = -lXft LINTXFT1 = $(LINTLIBDIR)/llib-lXft.ln XFTLIBSRC = $(LIBSRC)/Xft SOXFTREV = 2.1.2 DEPXFTLIB = XFTLIB = -lXft LINTXFT = $(LINTLIBDIR)/llib-lXft.ln FONTCONFIGDIR = /usr FONTCONFIGLIBDIR = /usr/lib FONTCONFIGINCDIR = /usr/include FONTCONFIGBINDIR = /usr/bin FONTCONFIGLIB = -lfontconfig FONTCONFIGINCLUDES = FCCACHE = $(FONTCONFIGBINDIR)/fc-cache FONTCONFIGDEFINES = -DFONTCONFIG XFTINCLUDES=$(FONTCONFIGINCLUDES) $(FREETYPE2INCLUDES) LIBPNGINCDIR = /usr/include LIBPNGINC= LIBPNGDIR = /usr LIBPNGLIBDIR = /usr/lib LIBPNGINCDIR = /usr/include LIBPNGLIB = -lpng XKBFILELIBSRC = $(LIBSRC)/xkbfile SOXKBFILEREV = 1.0 DEPXKBFILELIB = XKBFILELIB = -lxkbfile LINTXKBFILE = $(LINTLIBDIR)/llib-lxkbfile.ln XKBCOMPCMD = $(XBINDIR)/xkbcomp XKBUILIBSRC = $(LIBSRC)/xkbui SOXKBUIREV = 1.0 DEPXKBUILIB = XKBUILIB = -lxkbui LINTXKBUI = $(LINTLIBDIR)/llib-lxkbui.ln EXTRAXAWREQS = EXTRAXAWCLIENTDEPLIBS = EXTRAXAWCLIENTLIBS = XTRAPLIBSRC = $(LIBSRC)/XTrap SOXTRAPREV = 6.4 DEPXTRAPLIB = XTRAPLIB = -lXTrap LINTXTRAP = $(LINTLIBDIR)/llib-lXTrap.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) DEPLIBS4 = $(DEPLIBS) DEPLIBS5 = $(DEPLIBS) DEPLIBS6 = $(DEPLIBS) DEPLIBS7 = $(DEPLIBS) DEPLIBS8 = $(DEPLIBS) DEPLIBS9 = $(DEPLIBS) DEPLIBS10 = $(DEPLIBS) XFTPRELOADPATTERN = libXft.so.? XRENDERPRELOADPATTERN = libXrender.so.? XFONTPRELOADPATTERN = libXfont*.so.? XMULIBONLY = -lXmu XMULIB = $(XMULIBONLY) $(XTOOLLIB) $(XLIB) CONFIGDIR = $(LIBDIR)/config USRLIBDIRPATH = $(USRLIBDIR) LDPRELIBS = -L$(USRLIBDIR) $(INSTALLED_LIBS) LDPOSTLIBS = TOP_INCLUDES = -I$(INCROOT) $(TOP_X_INCLUDES) PROJECT_DEFINES = VENDOR_DEFINES = -DXVENDORNAME='"$(VENDORNAME)"' -DXVENDORNAMESHORT='"$(VENDORNAMESHORT)"' CXXPROJECT_DEFINES = # ---------------------------------------------------------------------- # start of Imakefile LOCAL_LIBRARIES = $(XTOOLLIB) $(XLIB) SYS_LIBRARIES = -lm # CDEBUGFLAGS = -O2 CDEBUGFLAGS = -g # Comment out the following 3 lines for systems without freetype CCOPTIONS = -I/usr/include/freetype2 DEFINES = -DXFT_SUPPORT EXTRA_LIBRARIES = -lXft SRCS = Dclock.c dclock.c OBJS = Dclock.o dclock.o PROGRAM = dclock all:: dclock dclock: $(OBJS) $(DEPLIBS) $(RM) $@ $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) install:: dclock @if [ -d $(DESTDIR)$(BINDIR) ]; then \ set +x; \ else \ if [ -h $(DESTDIR)$(BINDIR) ]; then \ (set -x; rm -f $(DESTDIR)$(BINDIR)); \ fi; \ (set -x; $(MKDIRHIER) $(DESTDIR)$(BINDIR)); \ fi $(INSTALL) $(INSTALLFLAGS) $(INSTPGMFLAGS) dclock $(DESTDIR)$(BINDIR)/dclock all:: dclock.$(MANNEWSUFFIX) dclock.$(MANNEWSUFFIX): dclock.$(MANSRCSUFFIX) $(RM) $@ if test -z "$(PREPROCESSMANPAGES)" ; then \ cd `dirname dclock` && \ $(LN) `basename dclock.$(MANSRCSUFFIX)` `basename $@`; \ else \ $(RAWCPP) $(MANDEFS) $(EXTRAMANDEFS) \ < dclock.$(MANSRCSUFFIX) | sed -e '/^# *[0-9][0-9]* *.*$$/d' -e '/^#line *[0-9][0-9]* *.*$$/d' -e '/^[ ]*XCOMM$$/s/XCOMM/#/' -e '/^[ ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/#/' -e '/^[ ]*XHASH/s/XHASH/#/' -e '/\@\@$$/s/\@\@$$/\\/' >$@; \ fi cleandir:: $(RM) dclock.$(MANNEWSUFFIX) install.man:: dclock.$(MANNEWSUFFIX) @if [ -d $(DESTDIR)$(MANDIR) ]; then \ set +x; \ else \ if [ -h $(DESTDIR)$(MANDIR) ]; then \ (set -x; rm -f $(DESTDIR)$(MANDIR)); \ fi; \ (set -x; $(MKDIRHIER) $(DESTDIR)$(MANDIR)); \ fi $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) dclock.$(MANNEWSUFFIX) $(DESTDIR)$(MANDIR)/dclock.$(MANSUFFIX) depend:: $(DEPEND) $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS) lint: $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS) lint1: $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS) cleandir:: $(RM) dclock dclock.o: Dclock.h Dclock.o: DclockP.h # ---------------------------------------------------------------------- # common rules for all Makefiles - do not edit .c.i: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.c > $@ .SUFFIXES: .ii .cc.ii: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.cc > $@ .SUFFIXES: .s .c.s: $(RM) $@ $(CC) -S $(CFLAGS) $(_NOOP_) $*.c .cc.s: $(RM) $@ $(CC) -S $(CFLAGS) $(_NOOP_) $*.cc emptyrule:: cleandir:: $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"* Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS man_keywords:: html_index:: clean:: cleandir distclean:: cleandir # ---------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.sdk:: @echo "install.sdk in $(CURRENT_DIR) done" Makefiles:: includes:: depend:: distclean:: $(RM) Makefile Makefile.dep # ---------------------------------------------------------------------- # dependencies generated by makedepend dclock-2.2.2/Dclock.c0000644000175000017500000020645711034563143014767 0ustar bdefreesebdefreese/* * Dclock.c (v.2.0) -- a digital clock widget. * Copyright (c) 1988 Dan Heller * Modifications 2/93 by Tim Edwards */ #include #include #include #include #include #include #include #include #include #include #include #include #include "DclockP.h" static void Initialize(), Resize(), ResizeNow(), Realize(), Destroy(), Redisplay(), GetGC(), invert_bitmap(), build_segments(), timeout(), toggle_bell(), toggle_reverse_video(), toggle_scroll(), toggle_seconds(), show_bell(), toggle_military_time(), toggle_date(), make_number(), make_number_one(), set_alarm(), show_date(), show_alarm(), scroll_time(), toggle_alarm(), outline_digit(), toggle_fade(), toggle_tails(), increase_slope(), decrease_slope(), widen_segment(), thin_segment(), increase_space(), decrease_space(), toggle_blink(), print_help(), print_dump(), playbell(), toggle_dateup(); static void XfFillArc(), XfFillPolygon(); /* some definitions */ #define BORDER 5 #define CLOCK_WIDTH 220 #define CLOCK_HEIGHT 80 #define DATE_FMT "%A, %B %d, %Y" #define when break;case #define otherwise break;default #define sign(a) ((a) < 0.0 ? -1 : 1) #define abs(a) ((a) < 0 ? -(a) : (a)) /* the x-value of the colon as measured from the window x=0 */ #define cx (int)(digit_w + (w->dclock.miltime ? digit_w : \ w->dclock.space_factor * 2 * digit_w + segxwidth)) /* A few variables and initial values */ static Boolean SetValues(), show_time(); static Dimension winwidth = CLOCK_WIDTH; static Dimension winheight = CLOCK_HEIGHT; static Boolean false = False; static Boolean true = True; static int fade_rate = 50; static float y_ratio; static float sslope = 6.0; static float sspacer = 0.09; static float smallrat = 0.67; static float secgap = 0.3; static float widfac = 0.13; static Pixmap old_pix[4]; static int old_digs[4]; static struct tm before; static char *saved_date; static cur_position; /* outline current digit for setting alarm */ static struct { int hrs, mins; } Alarm; static int TopOffset = 0; /* define what keys do what when pressed in the window */ static char defaultTranslations[] = "b: toggle-bell() \n\ j: toggle-scroll() \n\ f: toggle-fade() \n\ s: toggle-seconds() \n\ r: toggle-reverse-video() \n\ colon: toggle-blink() \n\ m: toggle-military-time() \n\ d: toggle-date() \n\ u: toggle-dateup() \n\ t: toggle-tails() \n\ a: toggle-alarm() \n\ h: print-help() \n\ Shiftslash: print-help() \n\ v: print-dump() \n\ +: widen-segment() \n\ -: thin-segment() \n\ slash: slope-increase() \n\ backslash: slope-decrease() \n\ Shiftcomma: space-decrease() \n\ Shiftperiod: space-increase() \n\ : set-alarm()"; static XtActionsRec actionsList[] = { { "toggle-bell", toggle_bell }, { "toggle-scroll", toggle_scroll }, { "toggle-fade", toggle_fade }, { "toggle-seconds", toggle_seconds }, { "toggle-reverse-video", toggle_reverse_video }, { "toggle-blink", toggle_blink }, { "toggle-military-time", toggle_military_time }, { "toggle-date", toggle_date }, { "toggle-dateup", toggle_dateup }, { "toggle-tails", toggle_tails }, { "toggle-alarm", toggle_alarm }, { "widen-segment", widen_segment }, { "thin-segment", thin_segment }, { "slope-decrease", decrease_slope }, { "slope-increase", increase_slope }, { "space-decrease", decrease_space }, { "space-increase", increase_space }, { "set-alarm", set_alarm }, { "print-help", print_help }, { "print-dump", print_dump }, }; /* Initialization values for all of the X resources */ static XtResource resources[] = { { XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), XtOffset(Widget,core.width), XtRDimension, (caddr_t)&winwidth }, { XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), XtOffset(Widget,core.height), XtRDimension, (caddr_t)&winheight }, { XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), XtOffset(DclockWidget,dclock.foreground), XtRString, "Chartreuse"}, { XtNled_off, XtCForeground, XtRPixel, sizeof(Pixel), XtOffset(DclockWidget,dclock.led_off), XtRString, "DarkGreen"}, { XtNbackground, XtCBackground, XtRPixel, sizeof(Pixel), XtOffset(DclockWidget,dclock.background), XtRString, "DarkSlateGray"}, { XtNtails, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.tails), XtRBoolean, (caddr_t)&true}, { XtNfade, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.fade), XtRBoolean, (caddr_t)&true}, { XtNfadeRate, XtCTime, XtRInt, sizeof (int), XtOffset(DclockWidget,dclock.fade_rate), XtRInt, (caddr_t)&fade_rate}, { XtNscroll, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.scroll), XtRBoolean, (caddr_t)&false}, { XtNdisplayTime, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.display_time), XtRBoolean, (caddr_t)&true}, { XtNalarm, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.alarm), XtRBoolean, (caddr_t)&false}, { XtNalarmTime, XtCTime, XtRString, sizeof (char *), XtOffset(DclockWidget,dclock.alarm_time), XtRString, "00:00" }, { XtNalarmPersist, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.alarm_persist), XtRBoolean, (caddr_t)&false}, { XtNbell, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.bell), XtRBoolean, (caddr_t)&false}, { XtNseconds, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.seconds), XtRBoolean, (caddr_t)&false}, { XtNblink, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.blink), XtRBoolean, (caddr_t)&true}, { XtNmilitaryTime, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.miltime), XtRBoolean, (caddr_t)&false}, { XtNutcTime, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.utc), XtRBoolean, (caddr_t)&false}, { XtNdate, XtCString, XtRString, sizeof (String), XtOffset(DclockWidget,dclock.date_fmt), XtRString, NULL}, { XtNdateUp, XtCBoolean, XtRBoolean, sizeof (Boolean), XtOffset(DclockWidget,dclock.dateup), XtRBoolean, (caddr_t)&false}, { XtNfont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), XtOffset(DclockWidget,dclock.font), XtRString, "fixed"}, #ifdef XFT_SUPPORT { XftNfontName, "fontName", XtRString, sizeof(String), XtOffset(DclockWidget,dclock.xftfontname), XtRString, "charter"}, #endif { XtNangle, "Slope", XtRFloat, sizeof(float), XtOffset(DclockWidget,dclock.angle), XtRFloat, (caddr_t)&sslope}, { XtNwidthFactor, "Ratio", XtRFloat, sizeof(float), XtOffset(DclockWidget,dclock.width_factor), XtRFloat, (caddr_t)&widfac}, { XtNsmallRatio, "Ratio", XtRFloat, sizeof(float), XtOffset(DclockWidget,dclock.small_ratio), XtRFloat,(caddr_t)&smallrat}, { XtNsecondGap, "Ratio", XtRFloat, sizeof(float), XtOffset(DclockWidget,dclock.sec_gap), XtRFloat, (caddr_t)&secgap}, { XtNspaceFactor, "Ratio", XtRFloat, sizeof(float), XtOffset(DclockWidget,dclock.space_factor), XtRFloat,(caddr_t)&sspacer}, { XtNalarmFile, "alarmFile", XtRString, sizeof(String), XtOffset(DclockWidget,dclock.alarmfile), XtRString, (String)NULL}, { XtNbellFile, "bellFile", XtRString, sizeof(String), XtOffset(DclockWidget,dclock.bellfile), XtRString, (String)NULL}, { XtNaudioPlay, "audioPlay", XtRString, sizeof(String), XtOffset(DclockWidget,dclock.audioplay), XtRString, "/usr/bin/play"}, }; /* Define the Dclock widget */ DclockClassRec dclockClassRec = { { /* core fields */ /* superclass */ &widgetClassRec, /* class_name */ "Dclock", /* widget_size */ sizeof(DclockRec), /* class_initialize */ NULL, /* class_part_initialize */ NULL, /* class_inited */ FALSE, /* initialize */ Initialize, /* initialize_hook */ NULL, /* realize */ Realize, /* actions */ actionsList, /* num_actions */ XtNumber(actionsList), /* resources */ resources, /* resource_count */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ TRUE, /* visible_interest */ FALSE, /* destroy */ Destroy, /* resize */ Resize, /* expose */ Redisplay, /* set_values */ SetValues, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback_private */ NULL, /* tm_table */ defaultTranslations, /* query_geometry */ NULL, } }; WidgetClass dclockWidgetClass = (WidgetClass) &dclockClassRec; #ifdef NO_USLEEP #define usleep(x) { struct timeval st_delay; \ st_delay.tv_usec = (x); st_delay.tv_sec = 0; \ select(32, NULL, NULL, NULL, &st_delay); } #endif /* * These stipples give different densities for the * different stages of fading. */ static unsigned char stpl_1_8th[] = { 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08, 0x80, 0x80, 0x08, 0x08 }; static unsigned char stpl_1_4th[] = { 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22 }; static unsigned char stpl_3_8ths[] = { 0xA2, 0xA2, 0x15, 0x15, 0xA8, 0xA8, 0x45, 0x45, 0x2A, 0x2A, 0x51, 0x51, 0x8A, 0x8A, 0x54, 0x54, 0xA2, 0xA2, 0x15, 0x15, 0xA8, 0xA8, 0x45, 0x45, 0x2A, 0x2A, 0x51, 0x51, 0x8A, 0x8A, 0x54, 0x54 }; static unsigned char stpl_one_half[] = { 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA }; /* * fade_stip[] eventually contains the pixmaps used for each * iteration of fading (initialized in Initialize()). * If smooth color variations are used instead, then the * colormap index values are held in fadevector[]. */ #define FADE_ITER 8 static Pixmap fade_stip[FADE_ITER]; int fadevector[FADE_ITER]; int bsave = 0; Boolean use_stipple; #define MAX_PTS 6 /* max # of pts per segment polygon */ #define NUM_SEGS 7 /* number of segments in a digit */ /* * These constants give the bit positions for the segmask[] * digit masks. */ #define TOP 0 #define MIDDLE 1 #define BOTTOM 2 #define TOP_LEFT 3 #define BOT_LEFT 4 #define TOP_RIGHT 5 #define BOT_RIGHT 6 #define msk(i) (1 << (i)) /* * segmask[n] contains a bitmask of the segments which * should be lit for digit 'n'. */ int segmask[11] = { /* 0 */ msk(TOP) | msk(TOP_RIGHT) | msk(BOT_RIGHT) | msk(BOTTOM) | msk(BOT_LEFT) | msk(TOP_LEFT), /* 1 */ msk(TOP_RIGHT) | msk(BOT_RIGHT), /* 2 */ msk(TOP) | msk(TOP_RIGHT) | msk(MIDDLE) | msk(BOT_LEFT) | msk(BOTTOM), /* 3 */ msk(TOP) | msk(TOP_RIGHT) | msk(MIDDLE) | msk(BOT_RIGHT) | msk(BOTTOM), /* 4 */ msk(TOP_LEFT) | msk(MIDDLE) | msk(TOP_RIGHT) | msk(BOT_RIGHT), /* 5 */ msk(TOP) | msk(TOP_LEFT) | msk(MIDDLE) | msk(BOT_RIGHT) | msk(BOTTOM), /* 6 */ msk(TOP_LEFT) | msk(BOT_LEFT) | msk(MIDDLE) | msk(BOTTOM) | msk(BOT_RIGHT), /* 7 */ msk(TOP) | msk(TOP_RIGHT) | msk(BOT_RIGHT), /* 8 */ msk(TOP_LEFT) | msk(BOT_LEFT) | msk(MIDDLE) | msk(TOP) | msk(BOTTOM) | msk(TOP_RIGHT) | msk(BOT_RIGHT), /* 9 */ msk(TOP) | msk(TOP_LEFT) | msk(TOP_RIGHT) | msk(MIDDLE) | msk(BOT_RIGHT), /* blank */ 0 }; /* * num_segment_pts indicates the number of vertices on the * polygon that describes a segment */ static int num_segment_pts = 6; float slope_add, segxwidth, sxw; /* Clipping masks to prevent angled digits from obscuring one another */ Region clip_norm, clip_small, clip_colon; XPoint clip_pts[5]; typedef struct { float x; float y; } XfPoint; typedef XfPoint segment_pts[NUM_SEGS][MAX_PTS]; segment_pts tiny_segment_pts; segment_pts norm_segment_pts; /* ARGSUSED */ static void Initialize (request, new) DclockWidget request; DclockWidget new; { int i, n; Display *dpy = XtDisplay(new); Drawable root; Colormap cmap = DefaultColormap (dpy, DefaultScreen(dpy)); XColor cvcolor, cvfg, cvbg; float frac; root = RootWindow(dpy, DefaultScreen(dpy)); if (new->dclock.alarm_time) { if (sscanf(new->dclock.alarm_time, "%2d:%2d", &Alarm.hrs, &Alarm.mins) != 2 || Alarm.hrs >= 24 || Alarm.mins >= 60) { XtWarning("Alarm Time is in incorrect format."); new->dclock.alarm_time = "00:00"; Alarm.hrs = Alarm.mins = 0; } new->dclock.alarm_time = strcpy(XtMalloc(strlen(new->dclock.alarm_time)+1), new->dclock.alarm_time); } /* control allowable features */ if (new->dclock.fade) new->dclock.scroll = False; if (new->dclock.angle < 1.0) new->dclock.angle = 1.0; if (new->dclock.angle > 2 * winheight) new->dclock.angle = 2 * winheight; if (new->dclock.space_factor > 0.8) new->dclock.space_factor = 0.8; if (new->dclock.space_factor < 0.0) new->dclock.space_factor = 0.0; if (new->dclock.small_ratio < 0.1) new->dclock.small_ratio = 0.1; if (new->dclock.small_ratio > 1.0) new->dclock.small_ratio = 1.0; if (new->dclock.width_factor > 0.24) new->dclock.width_factor = 0.24; if (new->dclock.width_factor < 0.01) new->dclock.width_factor = 0.01; if (new->dclock.sec_gap < 0.0) new->dclock.sec_gap = 0.0; #ifdef XFT_SUPPORT new->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy), XFT_FAMILY, XftTypeString, new->dclock.xftfontname, XFT_SIZE, XftTypeDouble, ((float)new->core.height / 6.0) - 4.0, NULL); new->dclock.xftdraw = NULL; #endif GetGC(new); /* Get RGB values for the foreground and background */ cvfg.pixel = new->dclock.foreground; XQueryColor(dpy, cmap, &cvfg); cvbg.pixel = new->dclock.led_off; XQueryColor(dpy, cmap, &cvbg); /* Attempt to initialize a color vector of FADE_ITER points between */ /* foreground and background */ use_stipple = False; for (i = 0; i < FADE_ITER; i++) { frac = (float)i / (float)(FADE_ITER - 1); /* gamma correction */ frac = pow(frac, 0.5); cvcolor.green = cvbg.green + (int)((float)(cvfg.green - cvbg.green) * frac); cvcolor.blue = cvbg.blue + (int)((float)(cvfg.blue - cvbg.blue) * frac); cvcolor.red = cvbg.red + (int)((float)(cvfg.red - cvbg.red) * frac); if (!XAllocColor(dpy, cmap, &cvcolor)) { use_stipple = True; break; } fadevector[i] = cvcolor.pixel; } if (use_stipple) { fade_stip[1] = XCreateBitmapFromData(dpy, root, stpl_1_8th, 16, 16); fade_stip[2] = XCreateBitmapFromData(dpy, root, stpl_1_4th, 16, 16); fade_stip[3] = XCreateBitmapFromData(dpy, root, stpl_3_8ths, 16, 16); fade_stip[4] = XCreateBitmapFromData(dpy, root, stpl_one_half, 16, 16); invert_bitmap(stpl_1_8th, 16, 16); invert_bitmap(stpl_1_4th, 16, 16); invert_bitmap(stpl_3_8ths, 16, 16); fade_stip[5] = XCreateBitmapFromData(dpy, root, stpl_3_8ths, 16, 16); fade_stip[6] = XCreateBitmapFromData(dpy, root, stpl_1_4th, 16, 16); fade_stip[7] = XCreateBitmapFromData(dpy, root, stpl_1_8th, 16, 16); for (n = 1; n != FADE_ITER; ++n) if (!fade_stip[n]) { fprintf(stderr, "dclock: Couldn't create stipple!\n"); exit(1); } } if (!new->dclock.date_fmt || !*new->dclock.date_fmt) saved_date = DATE_FMT; if (new->dclock.date_fmt && !*new->dclock.date_fmt) new->dclock.date_fmt = NULL; if (new->dclock.dateup && new->dclock.date_fmt) #ifdef XFT_SUPPORT TopOffset = new->core.height / 6; #else TopOffset = new->dclock.font->ascent + new->dclock.font->descent; #endif else TopOffset = 0; /* Shouldn't be necessary, but play it safe anyway */ for (n = 0; n < 10; n++) { new->dclock.digits[n] = 0; new->dclock.tiny_digits[n] = 0; } new->dclock.digit_one[0] = new->dclock.digit_one[1] = 0; new->dclock.colon[0] = new->dclock.colon[1] = 0; new->dclock.interval_id = (XtIntervalId)NULL; new->dclock.punt_resize = (XtIntervalId)NULL; } static void GetGC(w) DclockWidget w; { XGCValues xgcv; XtGCMask gc_mask = GCGraphicsExposures | GCFont | GCForeground | GCBackground; xgcv.font = w->dclock.font->fid; xgcv.graphics_exposures = FALSE; xgcv.foreground = w->dclock.foreground; xgcv.background = w->dclock.background; w->dclock.foreGC = XtGetGC ((Widget) w, gc_mask, &xgcv); xgcv.foreground = w->dclock.background; xgcv.background = w->dclock.foreground; w->dclock.backGC = XtGetGC ((Widget) w, gc_mask, &xgcv); } static void invert_bitmap(bm, h, w) unsigned char *bm; int h, w; { int i, *wp; for (wp = (int *) bm, i = (h*w) / (8*sizeof(int)); i != 0; --i, ++wp) *wp = ~(*wp); } static void Realize (w, valueMask, attrs) Widget w; XtValueMask *valueMask; XSetWindowAttributes *attrs; { Display *dp = XtDisplay(w); DclockWidget dw = (DclockWidget)w; int sc = DefaultScreen(dp); Visual *vs = DefaultVisual(dp, sc);; *valueMask |= CWBitGravity; attrs->bit_gravity = ForgetGravity; vs = DefaultVisual(dp, sc); XtCreateWindow(w, InputOutput, (Visual *)CopyFromParent, *valueMask, attrs); #ifdef XFT_SUPPORT if (dw->dclock.xftdraw == NULL) { XColor color; Colormap cm = DefaultColormap(dp, sc); dw->dclock.xftdraw = XftDrawCreate(dp, XtWindow(w), vs, cm); color.pixel = dw->dclock.foreground; XQueryColor(dp, cm, &color); dw->dclock.xftfg.color.red = color.red; dw->dclock.xftfg.color.green = color.green; dw->dclock.xftfg.color.blue = color.blue; dw->dclock.xftfg.color.alpha = 0xffff; dw->dclock.xftfg.pixel = color.pixel; color.pixel = dw->dclock.background; XQueryColor(dp, cm, &color); dw->dclock.xftbg.color.red = color.red; dw->dclock.xftbg.color.green = color.green; dw->dclock.xftbg.color.blue = color.blue; dw->dclock.xftbg.color.alpha = 0xffff; dw->dclock.xftbg.pixel = color.pixel; } #endif ResizeNow(w); } static void Destroy (w) DclockWidget w; { int n; /* Be nice and free up memory before exiting. */ if (w->dclock.interval_id != (XtIntervalId)NULL) XtRemoveTimeOut(w->dclock.interval_id); if (w->dclock.punt_resize != (XtIntervalId)NULL) XtRemoveTimeOut(w->dclock.punt_resize); XtReleaseGC ((Widget)w, w->dclock.foreGC); XtReleaseGC ((Widget)w, w->dclock.backGC); for (n = 0; n < 10; n++) { XFreePixmap(XtDisplay(w), w->dclock.digits[n]); XFreePixmap(XtDisplay(w), w->dclock.tiny_digits[n]); } XFreePixmap(XtDisplay(w), w->dclock.digit_one[0]); XFreePixmap(XtDisplay(w), w->dclock.digit_one[1]); if (w->dclock.colon[0]) XFreePixmap(XtDisplay(w), w->dclock.colon[0]); if (w->dclock.colon[1]) XFreePixmap(XtDisplay(w), w->dclock.colon[1]); XDestroyRegion(clip_norm); XDestroyRegion(clip_small); XDestroyRegion(clip_colon); #ifdef XFT_SUPPORT XftFontClose(XtDisplay(w), w->dclock.xftfont); #endif } /* ARGSUSED */ static void ResizeNow (w) DclockWidget w; { int i, j; float digit_w, digit_h, seg_width; Pixmap pix; GC gc = w->dclock.foreGC; Display *dpy = XtDisplay(w); if (!XtIsRealized((Widget)w)) return; winwidth = w->core.width; winheight = w->core.height; #ifdef XFT_SUPPORT XftFontClose(dpy, w->dclock.xftfont); w->dclock.xftfont = XftFontOpen(dpy, DefaultScreen(dpy), XFT_FAMILY, XftTypeString, w->dclock.xftfontname, XFT_SIZE, XftTypeDouble, ((float)winheight / 6.0) - 4.0, NULL); #endif y_ratio = (float)winheight / CLOCK_HEIGHT; if (w->dclock.date_fmt || !w->dclock.display_time || w->dclock.alarm || w->dclock.bell) /* make win temporarily shorter so digits will fit on top of date */ #ifdef XFT_SUPPORT winheight -= w->core.height / 6; #else winheight -= w->dclock.font->ascent + w->dclock.font->descent; #endif /* * if the width of all segments are equal, then the width in x is the * segment width times the cosine of the slope angle. */ sxw = (w->dclock.width_factor * sqrt(1 + (w->dclock.angle)*(w->dclock.angle)))/(w->dclock.angle); /* height of the digit, leaving some room for a border */ digit_h = winheight - y_ratio * BORDER*2; /* the amount of skew measured along x due to the slope of the digits */ slope_add = digit_h / (w->dclock.angle); /* calculate the width of the digit based on everything. */ /* All attributes are calculated as ratios to the digit width. */ /* The colon is 1/2 the digit width; */ /* All other ratios are widget attributes. */ digit_w = (winwidth - slope_add * !(w->dclock.seconds) - (slope_add * w->dclock.small_ratio) * w->dclock.seconds) / (3.5 + w->dclock.miltime + w->dclock.seconds * (2 * w->dclock.small_ratio + w->dclock.sec_gap) + (2 * w->dclock.space_factor + sxw) * !(w->dclock.miltime)); /* segment widths as measured in x and y */ segxwidth = sxw * digit_w; seg_width = w->dclock.width_factor * (digit_w + slope_add); /* create the clipping masks */ clip_pts[0].x = clip_pts[4].x = 0; clip_pts[1].x = (int)(slope_add); clip_pts[2].x = (int)(slope_add + digit_w); clip_pts[3].x = (int)digit_w; clip_pts[1].y = clip_pts[2].y = 0; clip_pts[0].y = clip_pts[4].y = clip_pts[3].y = digit_h; clip_norm = XPolygonRegion(clip_pts, 5, WindingRule); for(i = 0; i < 5; i++) { clip_pts[i].x = (int)((float)clip_pts[i].x * w->dclock.small_ratio); clip_pts[i].y = (int)((float)clip_pts[i].y * w->dclock.small_ratio); } clip_small = XPolygonRegion(clip_pts, 5, WindingRule); clip_pts[1].x = (int)slope_add; clip_pts[2].x = (int)(slope_add + 0.5 * digit_w); clip_pts[3].x = (int)(0.5 * digit_w); clip_pts[0].y = clip_pts[4].y = clip_pts[3].y = digit_h; clip_colon = XPolygonRegion(clip_pts, 5, WindingRule); /* printf("segxwidth = %f\n", segxwidth); printf("winwidth = %d\n", winwidth); printf("digit_w = %f\n", digit_w); */ w->dclock.digit_w = digit_w; w->dclock.digit_h = digit_h; if (w->dclock.tails) { segmask[6] |= msk(TOP); segmask[9] |= msk(BOTTOM); } else { segmask[6] &= ~msk(TOP); segmask[9] &= ~msk(BOTTOM); } build_segments(w, norm_segment_pts, slope_add + digit_w, digit_h); /* printf("Tiny Segment Relative Points Dump:\n"); for (i = 0; i < 7; i++) for (j = 0; j < 6; j++) printf("digit[%d] point[%d]: x=%d, y=%d\n", i, j, tiny_segment_pts[i][j].x, tiny_segment_pts[i][j].y); */ if (w->dclock.seconds) build_segments(w, tiny_segment_pts, w->dclock.small_ratio * (slope_add + digit_w), w->dclock.small_ratio * digit_h); for (i = 0; i < 10; i++) { /* Make the big digit */ if (w->dclock.digits[i]) XFreePixmap(XtDisplay(w), w->dclock.digits[i]); w->dclock.digits[i] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)(slope_add + digit_w), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.digits[i], w->dclock.backGC, 0, 0, (int)(slope_add + digit_w), (int)digit_h); make_number(w, w->dclock.digits[i], gc, i, norm_segment_pts); /* make smaller version of this digit for use by "seconds" */ if (w->dclock.tiny_digits[i]) XFreePixmap(XtDisplay(w), w->dclock.tiny_digits[i]); if (w->dclock.seconds) { w->dclock.tiny_digits[i] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)( (slope_add + digit_w) * w->dclock.small_ratio), (int)(w->dclock.small_ratio * digit_h), DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.tiny_digits[i], w->dclock.backGC, 0, 0, (int)((slope_add + digit_w) * w->dclock.small_ratio), (int)(w->dclock.small_ratio * digit_h)); make_number(w, w->dclock.tiny_digits[i], gc, i, tiny_segment_pts); } else w->dclock.tiny_digits[i] = (Pixmap)NULL; } /* digit_one is either the number "1" or a blank */ if (w->dclock.digit_one[1]) XFreePixmap(XtDisplay(w), w->dclock.digit_one[1]); w->dclock.digit_one[1] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)(slope_add + digit_w), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.digit_one[1], w->dclock.backGC, 0, 0, (int)(slope_add + digit_w), (int)digit_h); make_number_one(w, w->dclock.digit_one[1], gc, 1, norm_segment_pts); if (w->dclock.digit_one[0]) XFreePixmap(XtDisplay(w), w->dclock.digit_one[0]); w->dclock.digit_one[0] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)(slope_add + digit_w), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.digit_one[0], w->dclock.backGC, 0, 0, (int)(slope_add + digit_w), (int)digit_h); make_number_one(w, w->dclock.digit_one[0], gc, 10, norm_segment_pts); /* The colon[0] area is blank (segment "off" color) */ if (w->dclock.colon[0]) XFreePixmap(XtDisplay(w), w->dclock.colon[0]); w->dclock.colon[0] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)(slope_add + 0.5 * digit_w), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.colon[0], w->dclock.backGC, 0, 0, (int)(slope_add + 0.5 * digit_w), (int)digit_h); /* The additive 2 for the Arc diameter keeps the colon from looking too small at small display sizes. */ XfFillArc(XtDisplay(w), w->dclock.colon[0], gc, (slope_add + digit_w) * 0.25 - 0.5, 0.75 * digit_h - 0.5, 1 + seg_width/2, 0); XfFillArc(XtDisplay(w), w->dclock.colon[0], gc, slope_add * 0.75 + digit_w * 0.25 - 0.5, 0.25 * digit_h - 0.5, 1 + seg_width/2, 0); /* colon[1] area has two circles */ if (w->dclock.colon[1]) XFreePixmap(XtDisplay(w), w->dclock.colon[1]); w->dclock.colon[1] = XCreatePixmap(XtDisplay(w), XtWindow(w), (int)(slope_add + 0.5 * digit_w), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); XFillRectangle(XtDisplay(w), w->dclock.colon[1], w->dclock.backGC, 0, 0, (int)(slope_add + 0.5 * digit_w), (int)digit_h); /* The additive 2 for the Arc diameter keeps the colon from looking too small at small display sizes. */ XfFillArc(XtDisplay(w), w->dclock.colon[1], gc, (slope_add + digit_w) * 0.25 - 0.5, 0.75 * digit_h - 0.5, 1 + seg_width/2, FADE_ITER); XfFillArc(XtDisplay(w), w->dclock.colon[1], gc, slope_add * 0.75 + digit_w * 0.25 - 0.5, 0.25 * digit_h - 0.5, 1 + seg_width/2, FADE_ITER); XSetForeground(XtDisplay(w), gc, fadevector[FADE_ITER - 1]); /* to optimize scrolling information (see scroll_time()) */ old_pix[0] = w->dclock.digits[0]; old_pix[1] = old_pix[2] = old_pix[3] = 0; old_digs[0] = old_digs[1] = old_digs[2] = old_digs[3] = 0; if (w->dclock.date_fmt || !w->dclock.display_time || w->dclock.alarm || w->dclock.bell) /* restore size */ winheight = w->core.height; w->dclock.punt_resize = (XtIntervalId)NULL; Redisplay(w); } /* ARGSUSED */ static void Resize (w) DclockWidget w; { /* Punt for 1/10 second on the resize, so that multiple events */ /* created by an opaque resize do not overload the processor. */ XtAppContext app; app = XtWidgetToApplicationContext((Widget)w); if (w->dclock.punt_resize != (XtIntervalId)NULL) XtRemoveTimeOut(w->dclock.punt_resize); w->dclock.punt_resize = XtAppAddTimeOut(app, (unsigned long)100, ResizeNow, (XtPointer)w); } static void build_segments(wi, seg_pts, w, h) DclockWidget wi; segment_pts seg_pts; float w, h; { XfPoint *pts; float spacer, hskip, fslope, bslope, midpt, seg_width, segxw; float invcosphi, invsinphi, invcospsi, invsinpsi, slope; float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy5, dy6; float xfactor, temp_xpts[4]; /* define various useful constants */ segxw = sxw * w; slope = wi->dclock.angle; seg_width = wi->dclock.width_factor * w; spacer = (float)w * wi->dclock.space_factor; hskip = (float)seg_width * 0.125; fslope = 1 / (segxw/seg_width + 1/slope); bslope = -1 / (segxw/seg_width - 1/slope); midpt = h / 2; /* define some trigonometric values */ /* phi is the forward angle separating two segments; psi is the reverse angle separating two segments. */ invsinphi = sqrt(1 + fslope * fslope) / fslope; invcosphi = sqrt(1 + 1/(fslope * fslope)) * fslope; invsinpsi = sqrt(1 + bslope * bslope) / -bslope; invcospsi = sqrt(1 + 1/(bslope * bslope)) * bslope; /* define offsets from easily-calculated points for 6 situations */ dx1 = hskip * invsinphi / (slope/fslope - 1); dy1 = hskip * invcosphi / (1 - fslope/slope); dx2 = hskip * invsinpsi / (1 - slope/bslope); dy2 = hskip * invcospsi / (bslope/slope - 1); dx3 = hskip * invsinphi; dx4 = hskip * invsinpsi; dx5 = hskip * invsinpsi / (1 - fslope/bslope); dy5 = hskip * invcospsi / (bslope/fslope - 1); dx6 = dy5; dy6 = dx5; /* calculate some simple reference points */ temp_xpts[0] = spacer + (h - seg_width)/slope; temp_xpts[1] = spacer + (h - seg_width/2)/slope + segxw/2; temp_xpts[2] = spacer + h/slope + segxw; temp_xpts[3] = temp_xpts[0] + segxw; xfactor = w - 2 * spacer - h / slope - segxw; /* calculate the digit positions */ pts = seg_pts[TOP]; pts[0].y = pts[1].y = 0; pts[0].x = temp_xpts[2] - dx3; pts[1].x = w - spacer - segxw + dx4; pts[2].y = pts[5].y = (seg_width / 2) - dy5 - dy6; pts[5].x = temp_xpts[1] + dx5 - dx6; pts[2].x = pts[5].x + xfactor; pts[3].y = pts[4].y = seg_width; pts[4].x = temp_xpts[3] + dx4; pts[3].x = temp_xpts[0] + xfactor - dx3; pts = &(seg_pts[MIDDLE][0]); pts[0].y = pts[1].y = midpt - seg_width/2; pts[0].x = spacer + (h - pts[0].y)/slope + segxw; pts[1].x = pts[0].x - segxw + xfactor; pts[2].y = pts[5].y = midpt; pts[3].y = pts[4].y = midpt + seg_width/2; pts[5].x = spacer + (h - pts[5].y)/slope + segxw/2; pts[2].x = pts[5].x + xfactor; pts[4].x = pts[0].x - seg_width/slope; pts[3].x = spacer + (h - pts[3].y)/slope + xfactor; pts = &(seg_pts[BOTTOM][0]); pts[3].y = pts[4].y = h; pts[2].y = pts[5].y = h - (seg_width / 2) + dy5 + dy6; pts[0].y = pts[1].y = h - seg_width; pts[0].x = spacer + segxw + seg_width/slope + dx3; pts[1].x = spacer + (h - pts[1].y)/slope + xfactor - dx4; pts[4].x = spacer + segxw - dx4; pts[5].x = spacer + segxw/2 + (h - pts[5].y)/slope + dx6 - dx5; pts[2].x = pts[5].x + xfactor; pts[3].x = spacer + xfactor + dx3; pts = &(seg_pts[TOP_LEFT][0]); pts[0].y = seg_width / 2 - dy6 + dy5; pts[1].y = seg_width + dy2; pts[2].y = seg_pts[MIDDLE][0].y - 2 * dy1; pts[3].y = seg_pts[MIDDLE][5].y - 2 * dy6; pts[4].y = seg_pts[MIDDLE][0].y; pts[5].y = seg_width - dy1; pts[0].x = temp_xpts[1] - dx5 - dx6; pts[1].x = temp_xpts[3] - dx2; pts[2].x = seg_pts[MIDDLE][0].x + 2 * dx1; pts[3].x = seg_pts[MIDDLE][5].x - 2 * dx6; pts[4].x = spacer + (h - pts[4].y)/slope; pts[5].x = temp_xpts[0] + dx1; pts = &(seg_pts[BOT_LEFT][0]); pts[0].y = seg_pts[MIDDLE][5].y + 2 * dy5; pts[1].y = seg_pts[MIDDLE][4].y + 2 * dy2; pts[2].y = seg_pts[BOTTOM][0].y - dy1; pts[3].y = seg_pts[BOTTOM][5].y - 2 * dy6; pts[4].y = h - seg_width + dy2; pts[5].y = midpt + seg_width/2; pts[0].x = seg_pts[MIDDLE][5].x - 2 * dx5; pts[1].x = seg_pts[MIDDLE][4].x - 2 * dx2; pts[2].x = seg_pts[BOTTOM][0].x - dx3 + dx1; pts[3].x = seg_pts[BOTTOM][5].x - 2 * dx6; pts[4].x = spacer + seg_width / slope - dx2; pts[5].x = spacer + (midpt - seg_width/2) / slope; pts = &(seg_pts[TOP_RIGHT][0]); pts[0].y = seg_width/2 - dy5 + dy6; pts[1].y = seg_width - dy2; pts[2].y = midpt - seg_width/2; pts[3].y = midpt - 2 * dy5; pts[4].y = pts[2].y - 2 * dy2; pts[5].y = seg_width + dy1; pts[0].x = temp_xpts[1] + xfactor + dx5 + dx6; pts[1].x = temp_xpts[3] + xfactor + dx1; pts[2].x = seg_pts[MIDDLE][0].x + xfactor; pts[3].x = seg_pts[MIDDLE][5].x + xfactor + dx5 * 2; pts[4].x = seg_pts[TOP_LEFT][4].x + xfactor + dx2 * 2; pts[5].x = temp_xpts[0] + xfactor - dx1; pts = &(seg_pts[BOT_RIGHT][0]); pts[0].y = seg_pts[MIDDLE][2].y + 2 * dy6; pts[1].y = midpt + seg_width / 2; pts[2].y = h - seg_width + dy1; pts[3].y = h - (seg_width / 2) + dy6 - dy5; pts[4].y = h - seg_width - dy2; pts[5].y = seg_pts[MIDDLE][3].y + 2 * dy1; pts[0].x = seg_pts[MIDDLE][2].x + 2 * dx6; pts[1].x = seg_pts[MIDDLE][3].x + segxw; pts[2].x = seg_pts[BOTTOM][1].x + dx4 + segxw - dx1; pts[3].x = seg_pts[BOTTOM][2].x + 2 * dx5; pts[4].x = seg_pts[BOTTOM][1].x + dx4 + dx2; pts[5].x = seg_pts[MIDDLE][3].x - 2 * dx1; } /*------------------------------------------------------------------------*/ /* find the squared length of a wire (or distance between two points in */ /* user space). */ /*------------------------------------------------------------------------*/ float sqwirelen(userpt1, userpt2) XfPoint *userpt1, *userpt2; { float xdist, ydist; xdist = userpt2->x - userpt1->x; ydist = userpt2->y - userpt1->y; return (xdist * xdist + ydist * ydist); } /* Point-to-line segment distance measure */ float find_mindist(x, y, seglist, num_segs) float x, y; XfPoint *seglist; int num_segs; { int i; double fd, mind = MAXFLOAT; float a, b, c, d, frac; float protod; XfPoint *pt1, *pt2, testpt; testpt.x = x; testpt.y = y; for (i = 0; i < num_segs; i++) { pt1 = seglist + i; pt2 = seglist + ((i + 1) % num_segs); c = sqwirelen(pt1, pt2); a = sqwirelen(pt1, &testpt); b = sqwirelen(pt2, &testpt); frac = a - b; if (frac >= c) d = b; else if (-frac >= c) d = a; else { protod = c + a - b; d = a - ((protod * protod) / (c * 4)); } if (d < 0) /* due to roundoff error */ fd = 0; else fd = sqrt((double)d); if (fd < mind) mind = fd; } return mind; } /*------------------------*/ /* Simple insideness test */ /*------------------------*/ int test_insideness(x, y, seglist, num_segs) float x, y; XfPoint *seglist; int num_segs; { int i, stval = 0; XfPoint *pt1, *pt2; float stdir; for (i = 0; i < num_segs; i++) { pt1 = seglist + i; pt2 = seglist + ((i + 1) % num_segs); stdir = (pt2->x - pt1->x) * (y - pt1->y) - (pt2->y - pt1->y) * (x - pt1->x); stval += sign(stdir); } return (abs(stval) == num_segs) ? 1 : 0; } /*------------------------------------------------------*/ /* Antialiasing circle-filling routine */ /*------------------------------------------------------*/ static void XfFillArc(dpy, pix, gc, center_x, center_y, radius, fgi) Display *dpy; Drawable pix; GC gc; float center_x, center_y, radius; int fgi; { int i, j, color; float minx, miny, maxx, maxy, dist, xdist, ydist, rsq; minx = center_x - radius; miny = center_y - radius; maxx = center_x + radius; maxy = center_y + radius; rsq = radius * radius; /* scan through pixel centers in region */ for (j = (int)(miny - 1.0); j < (int)(maxy + 1.0); j++) { for (i = (int)(minx - 1.0); i < (int)(maxx + 1.0); i++) { xdist = center_x - ((float)i + 0.5); ydist = center_y - ((float)j + 0.5); dist = radius - (float)sqrt(xdist * xdist + ydist * ydist); if (dist > 0) { if ((dist >= 1.0) && (fgi > 0)) color = fadevector[fgi - 1]; else color = fadevector[(int)(dist * fgi)]; XSetForeground(dpy, gc, color); XDrawPoint(dpy, pix, gc, i, j); } } } } /*------------------------------------------------------*/ /* Wrapper for XFillPolygon, using floats for points */ /* Antialiasing goes here, if you have a good fill */ /* algorithm for it. . . */ /*------------------------------------------------------*/ static void XfFillPolygon(dpy, pix, gc, float_pts, num_pts, fgi) Display *dpy; Drawable pix; GC gc; XfPoint *float_pts; int num_pts, fgi; { int i, j, color; float minx, miny, maxx, maxy, dist; Boolean inside; /* find boundaries */ minx = miny = 100000.0; maxx = maxy = -100000.0; for (i = 0; i < num_pts; i++) { if (float_pts[i].x < minx) minx = float_pts[i].x; if (float_pts[i].x > maxx) maxx = float_pts[i].x; if (float_pts[i].y < miny) miny = float_pts[i].y; if (float_pts[i].y > maxy) maxy = float_pts[i].y; } /* scan through pixel centers in region */ for (j = (int)(miny - 1.0); j < (int)(maxy + 1.0); j++) { inside = False; for (i = (int)(minx - 1.0); i < (int)(maxx + 1.0); i++) { dist = find_mindist((float)i + 0.5, (float)j + 0.5, float_pts, num_pts); if (dist < 2.0) inside = test_insideness((float)i + 0.5, (float)j + 0.5, float_pts, num_pts); if (inside) { if ((dist >= 1.0) && (fgi > 0)) color = fadevector[fgi - 1]; else { color = fadevector[(int)(dist * fgi)]; } XSetForeground(dpy, gc, color); XDrawPoint(dpy, pix, gc, i, j); } } } } /*------------------------------------------------------*/ static void make_number(dw, pix, gc, n, seg_pts) DclockWidget dw; Pixmap pix; GC gc; int n; segment_pts seg_pts; { Display *dpy = XtDisplay(dw); int i; for (i = 0; i != NUM_SEGS; ++i) { if (segmask[n] & msk(i)) XfFillPolygon(dpy, pix, gc, seg_pts[i], num_segment_pts, FADE_ITER); else XfFillPolygon(dpy, pix, gc, seg_pts[i], num_segment_pts, 0); } XSetForeground(dpy, gc, fadevector[FADE_ITER - 1]); } /*----------------------------------------------------------------------*/ /* Variation of "make_number" to handle the first digit of "civilian */ /* time", which may be the number "1" (2 segments only) or blank. */ /*----------------------------------------------------------------------*/ static void make_number_one(dw, pix, gc, n, seg_pts) DclockWidget dw; Pixmap pix; GC gc; int n; segment_pts seg_pts; { Display *dpy = XtDisplay(dw); int color; color = (n == 1) ? FADE_ITER : 0; XfFillPolygon(dpy, pix, gc, seg_pts[TOP_RIGHT], num_segment_pts, color); XfFillPolygon(dpy, pix, gc, seg_pts[BOT_RIGHT], num_segment_pts, color); XSetForeground(dpy, gc, fadevector[FADE_ITER - 1]); } /*------------------------------------------------------*/ /*------------------------------------------------------*/ static void make_fade_number(dw, pix, gc, on_msk, turn_on_msk, turn_off_msk, iter) DclockWidget dw; Pixmap pix; GC gc; int on_msk, turn_on_msk, turn_off_msk; int iter; { Display *dpy = XtDisplay(dw); Pixmap on_stipple = fade_stip[iter], off_stipple = fade_stip[FADE_ITER - iter]; int i; if (!use_stipple) XSetFillStyle(dpy, gc, FillSolid); for (i = 0; i != NUM_SEGS; ++i) { if (on_msk & msk(i)) { if (use_stipple) XSetFillStyle(dpy, gc, FillSolid); XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, FADE_ITER); } else if (turn_on_msk & msk(i)) { if (use_stipple) { XSetStipple(dpy, gc, on_stipple); XSetFillStyle(dpy, gc, FillOpaqueStippled); } XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, iter); } else if (turn_off_msk & msk(i)) { if (use_stipple) { XSetStipple(dpy, gc, off_stipple); XSetFillStyle(dpy, gc, FillOpaqueStippled); } XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, FADE_ITER - iter - 1); } } if (use_stipple) XSetFillStyle(dpy, gc, FillSolid); XSetForeground(dpy, gc, fadevector[FADE_ITER - 1]); } /*------------------------------------------------------*/ /*------------------------------------------------------*/ static void make_fade_number_one(dw, pix, gc, on_msk, turn_on_msk, turn_off_msk, iter) DclockWidget dw; Pixmap pix; GC gc; int on_msk, turn_on_msk, turn_off_msk; int iter; { Display *dpy = XtDisplay(dw); Pixmap on_stipple = fade_stip[iter], off_stipple = fade_stip[FADE_ITER - iter]; int i; if (!use_stipple) XSetFillStyle(dpy, gc, FillSolid); for (i = TOP_RIGHT; i < NUM_SEGS; ++i) { if (on_msk & msk(i)) { if (use_stipple) XSetFillStyle(dpy, gc, FillSolid); XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, FADE_ITER); } else if (turn_on_msk & msk(i)) { if (use_stipple) { XSetStipple(dpy, gc, on_stipple); XSetFillStyle(dpy, gc, FillOpaqueStippled); } XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, iter); } else if (turn_off_msk & msk(i)) { if (use_stipple) { XSetStipple(dpy, gc, off_stipple); XSetFillStyle(dpy, gc, FillOpaqueStippled); } XfFillPolygon(dpy, pix, gc, norm_segment_pts[i], num_segment_pts, FADE_ITER - iter - 1); } } if (use_stipple) XSetFillStyle(dpy, gc, FillSolid); XSetForeground(dpy, gc, fadevector[FADE_ITER - 1]); } /* Play the bell---sophisticated version, with ability to configure */ /* separate audio files for the alarm and hourly bell */ static void playbell(DclockWidget w, int alarmtype) { /* Try using an audio process. If that fails, ring the bell */ int status = 1; if ((((alarmtype == 0) && (w->dclock.alarmfile != (String)NULL && strcasecmp(w->dclock.alarmfile, "NULL"))) || ((alarmtype == 1) && (w->dclock.bellfile != (String)NULL && strcasecmp(w->dclock.bellfile, "NULL")))) && w->dclock.audioplay) { pid_t cpid, bell_proc; char *locargv[4]; char *proot = strrchr(w->dclock.audioplay, '/'); if (proot == NULL) proot = w->dclock.audioplay; else proot++; locargv[0] = proot; if (alarmtype == 0) locargv[1] = w->dclock.alarmfile; else locargv[1] = w->dclock.bellfile; locargv[2] = NULL; if ((cpid = fork()) < 0) { fprintf(stderr, "dclock: Fork error. Reverting to system bell.\n"); w->dclock.audioplay = (String)NULL; } else if (cpid == 0) { execv(w->dclock.audioplay, locargv); fprintf(stderr, "dclock: Unable to exec \"%s\".\n", w->dclock.audioplay); exit(-1); } else { if (waitpid(cpid, &status, 0) != cpid) { fprintf(stderr, "dclock: Waitpid error (%d)\n", errno); exit(-1); } if (WEXITSTATUS(status) != 0) { fprintf(stderr, "dclock: \"%s\" returned an error. Reverting to" " system bell.\n", w->dclock.audioplay); w->dclock.audioplay = (String)NULL; } } } if (WEXITSTATUS(status) != 0) { XBell(XtDisplay(w), 50); if (alarmtype == 0) XBell(XtDisplay(w), 50); } } /* ARGSUSED */ static void Redisplay (w) DclockWidget w; { XtAppContext app; Boolean save_scroll = w->dclock.scroll; Boolean save_fade = w->dclock.fade; long t; if (!XtIsRealized((Widget)w)) return; if (w->dclock.punt_resize != (XtIntervalId)NULL) return; if (w->dclock.interval_id != (XtIntervalId)NULL) { XtRemoveTimeOut(w->dclock.interval_id); w->dclock.interval_id = (XtIntervalId)NULL; } XFillRectangle(XtDisplay(w), XtWindow(w), w->dclock.backGC, 0, 0, w->core.width, w->core.height); before.tm_min = before.tm_hour = before.tm_wday = -1; old_pix[0] = w->dclock.digits[0]; old_pix[1] = old_pix[2] = old_pix[3] = 0; old_digs[0] = old_digs[1] = old_digs[2] = old_digs[3] = 0; w->dclock.scroll = FALSE; w->dclock.fade = FALSE; (void) show_time(w); w->dclock.scroll = save_scroll; w->dclock.fade = save_fade; app = XtWidgetToApplicationContext((Widget)w); if (w->dclock.display_time) if (w->dclock.seconds || w->dclock.blink) w->dclock.interval_id = XtAppAddTimeOut(app, (unsigned long)1000, timeout, (XtPointer)w); else { t = time(0); w->dclock.interval_id = XtAppAddTimeOut(app, (unsigned long)(60 - (t % 60)) * 1000, timeout, (XtPointer)w); } } static void draw_seconds(w, sec_val) DclockWidget w; int sec_val; { int digitxpos, digitypos; float digit_w = w->dclock.digit_w; float digit_h = w->dclock.digit_h; Display *dpy = XtDisplay(w); Window win = XtWindow(w); GC gc = w->dclock.foreGC; XSetRegion(dpy, gc, clip_small); digitxpos = (int)(winwidth - (2 * digit_w + slope_add) * w->dclock.small_ratio); digitypos = (int)(BORDER*y_ratio + (1.0 - w->dclock.small_ratio) * digit_h)+TopOffset; XSetClipOrigin(dpy, gc, digitxpos, digitypos); XCopyArea(dpy, w->dclock.tiny_digits[sec_val/10], win, gc, 0, 0, (int)((digit_w + slope_add) * w->dclock.small_ratio), (int)(digit_h * w->dclock.small_ratio), digitxpos, digitypos); digitxpos += (int)(digit_w * w->dclock.small_ratio); XSetClipOrigin(dpy, gc, digitxpos, digitypos); XCopyArea(dpy, w->dclock.tiny_digits[sec_val%10], win, gc, 0, 0, (int)((digit_w + slope_add) * w->dclock.small_ratio), (int)(digit_h * w->dclock.small_ratio), digitxpos, digitypos); } static Boolean show_time(w) DclockWidget w; { char buf[11]; Boolean alarm_went_off = False; long t = time(0); register struct tm *l_time = localtime(&t); float digit_w = w->dclock.digit_w; float digit_h = w->dclock.digit_h; int digitxpos, digitypos; Display *dpy = XtDisplay(w); Window win = XtWindow(w); GC gc = w->dclock.foreGC; if (w->dclock.utc == True) l_time = gmtime(&t); if (w->dclock.display_time == True) { if (w->dclock.miltime) (void) sprintf(buf, "%02d%02d", l_time->tm_hour, l_time->tm_min); else (void) sprintf(buf, "%02d%02d", (l_time->tm_hour) ? ((l_time->tm_hour <= 12) ? l_time->tm_hour : l_time->tm_hour - 12) : 12, l_time->tm_min); } else /* display the alarm time */ (void) sprintf(buf, "%02d%02d", Alarm.hrs, Alarm.mins); /* Copy the pre-defined pixmaps onto the viewing area.*/ /* Start with the colon. */ XSetRegion(dpy, gc, clip_colon); digitxpos = cx; digitypos = (int)(BORDER*y_ratio)+TopOffset; XSetClipOrigin (dpy, gc, digitxpos, digitypos); XCopyArea(dpy, w->dclock.colon[!w->dclock.blink || l_time->tm_sec & 1], win, gc, 0, 0, (int)(slope_add + 0.5 * digit_w), (int)digit_h, digitxpos, digitypos); /* Next the seconds. */ if (w->dclock.seconds) draw_seconds(w, l_time->tm_sec); /* The large digits are displayed by the scrolling/fading routine. */ if (l_time->tm_min != before.tm_min || l_time->tm_hour != before.tm_hour) scroll_time(w, buf); XSetClipMask(dpy,gc,None); if ((w->dclock.date_fmt && before.tm_wday != l_time->tm_wday) || (!w->dclock.display_time)) show_date(w, l_time); if (w->dclock.alarm) show_alarm(w); if (w->dclock.bell) show_bell(w); before = *l_time; if (w->dclock.alarm && Alarm.hrs == l_time->tm_hour && Alarm.mins == l_time->tm_min && l_time->tm_sec < 5) { bsave |= 0x4; /* set alarm_active state */ playbell(w, 0); toggle_reverse_video(w); alarm_went_off = True; } else { /* if alarm didn't go off, check for hour/half-hour bell */ if (w->dclock.bell && (!w->dclock.seconds || l_time->tm_sec == 0) && (l_time->tm_min == 0 || l_time->tm_min == 30)) { playbell(w, 1); if (l_time->tm_min == 0) playbell(w, 1); } /* avoid leaving clock in reverse_video state after alarm, unless */ /* alarmPersist is set, in which case we always leave dclock in */ /* reverse video after an alarm. */ if (bsave & 0x4) { if (((bsave & 0x1) == ((bsave & 0x2) >> 1)) ^ ((w->dclock.alarm_persist) ? 0 : 1)) toggle_reverse_video(w); bsave &= 0x3; /* clear alarm_active state */ } } return alarm_went_off; } static void scroll_time(w, p) DclockWidget w; register char *p; { int chgd[4], J = winheight - BORDER*2*y_ratio + 1; register int i, j, incr; float digit_w = w->dclock.digit_w; float digit_h = w->dclock.digit_h; Display *dpy = XtDisplay(w); Window win = XtWindow(w); GC gc = w->dclock.foreGC; Pixmap new_pix[4]; int new_digs[4], digitxpos, digitypos; int cur_sec = 0; long t; register struct tm *now; /* definitions for the window x and y positions of each of the large digits. */ #define x (int)((i>1)*(digit_w / 2) + digit_w * i - (!w->dclock.miltime) \ *((1 - 2 * w->dclock.space_factor) * digit_w - segxwidth)) #define y (int)((BORDER * y_ratio)+TopOffset) for (i = 0; i < 4; i++) new_digs[i] = *p++ - '0'; if (w->dclock.miltime) new_pix[0] = w->dclock.digits[new_digs[0]]; else new_pix[0] = w->dclock.digit_one[new_digs[0]]; for (i = 1; i < 4; i++) new_pix[i] = w->dclock.digits[new_digs[i]]; digitypos = (int)(BORDER*y_ratio)+TopOffset; /* digit scrolling routine. */ if (w->dclock.scroll) { for (i = 0; i < 4; i++) /* if pixmaps don't match, scroll it */ chgd[i] = (new_pix[i] != old_pix[i]); if (w->dclock.date_fmt || !w->dclock.display_time) J -= w->dclock.font->ascent + w->dclock.font->descent; if ((incr = J / 30) < 1) incr = 1; XSetRegion(dpy, gc, clip_norm); for (j = 0; j <= J; j += incr) for (i = 0; i < 4; i++) if (chgd[i]) { digitxpos = x; XSetClipOrigin(dpy, gc, digitxpos, digitypos); if (old_pix[i]) XCopyArea(dpy, old_pix[i], win, gc, 0, j, (int)(digit_w + slope_add), (int)(digit_h) - j, digitxpos, y); XCopyArea(dpy, new_pix[i], win, gc, 0, 0, (int)(digit_w + slope_add), j, digitxpos, y + (int)digit_h - j); } XSetClipMask(dpy, gc, None); } /* digit fading routine */ else if (w->dclock.fade) { Pixmap tmp_pix[4]; int oldmask, newmask; int stay_on[4], turn_on[4], turn_off[4]; unsigned long fade_rate = w->dclock.fade_rate * 1000; for (i = 0; i < 4; i++) /* if pixmaps don't match, fade it */ if (chgd[i] = (new_pix[i] != old_pix[i])) { tmp_pix[i] = XCreatePixmap(dpy, win, (int)(digit_w + slope_add), (int)digit_h, DefaultDepthOfScreen(XtScreen(w))); oldmask = segmask[old_digs[i]]; newmask = segmask[new_digs[i]]; stay_on[i] = oldmask & newmask; turn_on[i] = ~oldmask & newmask; turn_off[i] = oldmask & ~newmask; } else tmp_pix[i] = (Pixmap)NULL; XSetClipMask(dpy, gc, None); for (j = 1; j != FADE_ITER; ++j) { for (i = 0; i < 4; i++) if (chgd[i]) { XFillRectangle(dpy, tmp_pix[i], w->dclock.backGC, 0, 0, (int)(digit_w + slope_add), (int)digit_h); if (i == 0 && !w->dclock.miltime) make_fade_number_one(w, tmp_pix[i], gc, stay_on[i], turn_on[i], turn_off[i], j); else make_fade_number(w, tmp_pix[i], gc, stay_on[i], turn_on[i], turn_off[i], j); digitxpos = x; XSetRegion(dpy, gc, clip_norm); XSetClipOrigin(dpy, gc, digitxpos, digitypos); XCopyArea(dpy, tmp_pix[i], win, gc, 0, 0, (int)(digit_w + slope_add), (int)digit_h, digitxpos, y); XSetClipMask(dpy, gc, None); } XFlush(dpy); usleep(fade_rate); /* Keep tabs on time; it's necessary to update the seconds */ /* if fade_rate * FADE_ITER + (overhead) > 1 second */ t = time(0); now = localtime(&t); if (w->dclock.seconds && (now->tm_sec != cur_sec)) { cur_sec = now->tm_sec; draw_seconds(w, cur_sec); XSetClipMask(dpy,gc,None); } } for (i = 0; i < 4; ++i) if (tmp_pix[i]) XFreePixmap(dpy, tmp_pix[i]); } XSetRegion(dpy, gc, clip_norm); for (i = 0; i < 4; i++) { digitxpos = x; XSetClipOrigin(dpy, gc, digitxpos, digitypos); XCopyArea(dpy, new_pix[i], win, gc, 0,0, (int)(digit_w + slope_add), (int)digit_h, digitxpos, y); } XSetClipMask(dpy, gc, None); if (!w->dclock.display_time) outline_digit(w, cur_position, True); for (i = 0; i < 4; i++) { old_pix[i] = new_pix[i]; old_digs[i] = new_digs[i]; } #undef x #undef y } static void show_date(w, now) DclockWidget w; struct tm *now; { Display *dpy = XtDisplay(w); Window win = XtWindow(w); char datestr[128]; register char *p; int x, datep; #ifdef XFT_SUPPORT int tsize = w->core.height / 6; XGlyphInfo xftextents; #else int tsize = w->dclock.font->ascent + w->dclock.font->descent; #endif if (!w->dclock.display_time) datep = strlen(strcpy(datestr, "Push HERE to Set/Unset Alarm")); else datep = strftime(datestr, 128, w->dclock.date_fmt, now); #ifdef XFT_SUPPORT XftTextExtents8(dpy, w->dclock.xftfont, datestr, datep, &xftextents); x = (w->core.width - xftextents.width) / 2; #else x = (w->core.width - XTextWidth(w->dclock.font, datestr, datep)) / 2; #endif if (x < 2) x = 2; if (TopOffset) { #ifdef XFT_SUPPORT XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, 0, winwidth, tsize); XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x, (BORDER/2) + tsize - 2, datestr, datep); #else XFillRectangle(dpy, win, w->dclock.backGC, 0, 0, winwidth, tsize); XDrawString(dpy, win, w->dclock.foreGC, x, ((BORDER/2)+w->dclock.xftfont->height), datestr, datep); #endif } else { #ifdef XFT_SUPPORT XftDrawRect(w->dclock.xftdraw, &w->dclock.xftbg, 0, winheight - tsize, winwidth, tsize); XftDrawString8(w->dclock.xftdraw, &w->dclock.xftfg, w->dclock.xftfont, x, winheight - BORDER - 2, datestr, datep); #else XFillRectangle(dpy, win, w->dclock.backGC, 0, winheight - tsize, winwidth, tsize); XDrawString(dpy, win, w->dclock.foreGC, x, winheight - BORDER, datestr, datep); #endif } } static void show_alarm(w) DclockWidget w; { Display *dpy = XtDisplay(w); Window win = XtWindow(w); int tsize = w->dclock.font->ascent + w->dclock.font->descent; int ccentx = BORDER; int hcsize = tsize >> 1; int ccenty; if (TopOffset) ccenty = BORDER + (hcsize/2); else ccenty = winheight - BORDER - hcsize; hcsize /= 2; XDrawArc(dpy, win, w->dclock.foreGC, ccentx - hcsize, ccenty - hcsize, hcsize << 1, hcsize << 1, -2800, 5600); hcsize *= 2; XDrawArc(dpy, win, w->dclock.foreGC, ccentx - hcsize, ccenty - hcsize, hcsize << 1, hcsize << 1, -2800, 5600); hcsize *= 1.5; XDrawArc(dpy, win, w->dclock.foreGC, ccentx - hcsize, ccenty - hcsize, hcsize << 1, hcsize << 1, -2800, 5600); } static void show_bell(w) DclockWidget w; { Display *dpy = XtDisplay(w); Window win = XtWindow(w); int tsize = w->dclock.font->ascent + w->dclock.font->descent; int hcsize = tsize >> 1; int ccentx = BORDER + ((w->dclock.alarm) ? (tsize * 3 / 2) : (tsize / 3)); int ccenty; if (TopOffset) ccenty = BORDER + (hcsize/2); else ccenty = winheight - BORDER - hcsize; XDrawArc(dpy, win, w->dclock.foreGC, ccentx - tsize / 3, ccenty - tsize / 2, tsize * 2 / 3, tsize * 2 / 3, 0, 11520); XDrawLine(dpy, win, w->dclock.foreGC, ccentx - tsize / 3, ccenty - tsize / 6, ccentx - tsize / 3, ccenty + tsize / 3); XDrawLine(dpy, win, w->dclock.foreGC, ccentx + tsize / 3, ccenty - tsize / 6, ccentx + tsize / 3, ccenty + tsize / 3); XDrawArc(dpy, win, w->dclock.foreGC, ccentx - tsize * 2 / 3, ccenty + tsize / 6, tsize / 3, tsize / 3, 17280, 5760); XDrawArc(dpy, win, w->dclock.foreGC, ccentx + tsize / 3, ccenty + tsize / 6, tsize / 3, tsize / 3, 11520, 5760); XDrawLine(dpy, win, w->dclock.foreGC, ccentx - tsize / 2, ccenty + tsize / 2, ccentx + tsize / 2, ccenty + tsize / 2); XDrawArc(dpy, win, w->dclock.foreGC, ccentx - tsize / 12, ccenty + tsize / 2, tsize / 6, tsize / 6, 0, 23040); } static void timeout(w, id) DclockWidget w; XtIntervalId *id; { struct timeval now; int next_intr; Boolean alarm_went_off = show_time(w); XtAppContext app; /* Try to catch the next second on the second boundary. */ /* NO! This is a BAD IDEA, and leads to catching the */ /* time sometimes before the second, sometimes after, and */ /* thereby skipping seconds all the time. Instead, we */ /* should aim for a few milliseconds LATE (try 5ms). */ gettimeofday(&now, NULL); /* next_intr = (1e6 - now.tv_usec) / 1e3; */ next_intr = (1e6 - now.tv_usec + 5000) / 1e3; app = XtWidgetToApplicationContext((Widget)w); w->dclock.interval_id = XtAppAddTimeOut(app, (unsigned long)((alarm_went_off || w->dclock.seconds || w->dclock.blink) ? next_intr : 59000 + next_intr), timeout, (XtPointer)w); } /* ARGSUSED */ static Boolean SetValues (current, request, new) DclockWidget current, request, new; { Boolean do_redraw = False; if (current->dclock.display_time != new->dclock.display_time) { before.tm_min = before.tm_hour = before.tm_wday = -1; new->dclock.miltime = True; /* old state needs to be saved */ do_redraw = True; } if (current->dclock.alarm_time != new->dclock.alarm_time) { if (sscanf(new->dclock.alarm_time, "%2d:%2d", &Alarm.hrs, &Alarm.mins) != 2 || Alarm.hrs >= 24 || Alarm.mins >= 60) { XtWarning("Alarm Time is in incorrect format."); new->dclock.alarm_time = "00:00"; Alarm.hrs = Alarm.mins = 0; } new->dclock.alarm_time = strcpy(XtMalloc(strlen(new->dclock.alarm_time)+1), new->dclock.alarm_time); do_redraw = True; } if (new->dclock.foreground != current->dclock.foreground || new->dclock.background != current->dclock.background || new->dclock.tails != current->dclock.tails || new->dclock.fade != current->dclock.fade || new->dclock.miltime != current->dclock.miltime) { XtReleaseGC ((Widget)current, current->dclock.foreGC); XtReleaseGC ((Widget)current, current->dclock.backGC); GetGC(new); ResizeNow(new); /* pixmaps need to be redrawn */ do_redraw = True; } if (new->dclock.seconds != current->dclock.seconds) { if (current->dclock.interval_id != (XtIntervalId)NULL) { XtRemoveTimeOut(current->dclock.interval_id); current->dclock.interval_id = (XtIntervalId)NULL; } ResizeNow(new); do_redraw = True; } if (new->dclock.date_fmt != current->dclock.date_fmt) { do_redraw = True; before.tm_wday = -1; } if (new->dclock.alarm != current->dclock.alarm) do_redraw = True; return do_redraw; } /* The following routines are called by the various keypress events. */ static void decrease_space(w) DclockWidget w; { w->dclock.space_factor *= 0.95; if (w->dclock.space_factor < 0.0) w->dclock.space_factor = 0; ResizeNow(w); Redisplay(w); } static void increase_space(w) DclockWidget w; { w->dclock.space_factor *= 1.05; if (w->dclock.space_factor > 0.25) w->dclock.space_factor = 0.25; ResizeNow(w); Redisplay(w); } static void decrease_slope(w) DclockWidget w; { w->dclock.angle *= 1.05; if (w->dclock.angle > 2 * winheight) w->dclock.angle = 2 * winheight; ResizeNow(w); Redisplay(w); } static void increase_slope(w) DclockWidget w; { w->dclock.angle *= 0.95; if (w->dclock.angle < 1.0) w->dclock.angle = 1.0; ResizeNow(w); Redisplay(w); } static void widen_segment(w) DclockWidget w; { w->dclock.width_factor *= 1.05; if (w->dclock.width_factor > 0.4) w->dclock.width_factor = 0.4; ResizeNow(w); Redisplay(w); } static void thin_segment(w) DclockWidget w; { w->dclock.width_factor *= 0.95; if (w->dclock.width_factor < 0.01) w->dclock.width_factor = 0.01; ResizeNow(w); Redisplay(w); } static void print_help(w) DclockWidget w; { fprintf(stderr, "In-Window single-character commands:\n\n"); fprintf(stderr, " r Toggles Reverse Video.\n"); fprintf(stderr, " s Toggles the seconds display.\n"); fprintf(stderr, " b Toggles the bell attribute.\n"); fprintf(stderr, " j Toggles the jump/scroll attribute.\n"); fprintf(stderr, " f Toggles the fade attribute.\n"); fprintf(stderr, " d Toggles the date format.\n"); fprintf(stderr, " u Toggles the location of the date (top/bottom).\n"); fprintf(stderr, " m Toggles the military time format.\n"); fprintf(stderr, " a Toggles the alarm clock.\n"); fprintf(stderr, " t Toggles the tails attribute.\n"); fprintf(stderr, " v Ascii dump of the values of various attributes.\n"); fprintf(stderr, " h Print this help screen.\n"); fprintf(stderr, " ? Same as h.\n"); fprintf(stderr, " : Toggles the blinking colon.\n"); fprintf(stderr, " / Increases the slope of the digits.\n"); fprintf(stderr, " \\ Decreases the slope of the digits.\n"); fprintf(stderr, " + Increases the thickness of the digit segments.\n"); fprintf(stderr, " - Decreases the thickness of the digit segments.\n"); fprintf(stderr, " > Increases spacing between the digits.\n"); fprintf(stderr, " < Decreases spacing between the digits.\n"); fprintf(stderr, " q quit the program.\n"); fprintf(stderr, " Toggle Alarm-time display\n"); fprintf(stderr, " Increment number in alarm-time display\n"); fprintf(stderr, " Decrement number in alarm-time display\n"); fprintf(stderr, "\n\n"); } static void print_dump(w) DclockWidget w; { fprintf(stderr, "Window attributes:\n\n"); fprintf(stderr, " window width = %d\n", winwidth); fprintf(stderr, " window height = %d\n", winheight); fprintf(stderr, " slope = %f\n", w->dclock.angle); fprintf(stderr, " segment width ratio = %f\n", w->dclock.width_factor); fprintf(stderr, " seconds gap ratio = %f\n", w->dclock.sec_gap); fprintf(stderr, " small digit ratio = %f\n", w->dclock.small_ratio); fprintf(stderr, " digit spacing ratio = %f\n", w->dclock.space_factor); fprintf(stderr, " fade rate = %d\n", w->dclock.fade_rate); fprintf(stderr, " date format = %s\n", (w->dclock.date_fmt) ? (w->dclock.date_fmt) : ""); fprintf(stderr, " date location = %s\n", (w->dclock.dateup ? "top" : "bottom")); fprintf(stderr, "\n\n"); } static void toggle_date(w) DclockWidget w; { char *tmp; if (!w->dclock.display_time) { XBell(XtDisplay(w), 50); return; } tmp = w->dclock.date_fmt; w->dclock.date_fmt = saved_date; saved_date = tmp; if (w->dclock.dateup && w->dclock.date_fmt) #ifdef XFT_SUPPORT TopOffset = w->core.height / 6; #else TopOffset = w->dclock.font->ascent + w->dclock.font->descent; #endif else TopOffset = 0; before.tm_wday = -1; ResizeNow(w); Redisplay(w); } static void toggle_dateup(w) DclockWidget w; { Arg arg; int tmp; if (!w->dclock.display_time) { XBell(XtDisplay(w), 50); return; } XtSetArg(arg, XtNdateUp, !w->dclock.dateup); XtSetValues((Widget)w, &arg, 1); if (w->dclock.dateup && w->dclock.date_fmt) #ifdef XFT_SUPPORT TopOffset = w->core.height / 6; #else TopOffset = w->dclock.font->ascent + w->dclock.font->descent; #endif else TopOffset = 0; ResizeNow(w); Redisplay(w); } static void toggle_bell(w) DclockWidget w; { if (w->dclock.bell = !w->dclock.bell) { playbell(w, 1); } ResizeNow(w); Redisplay(w); } static void toggle_scroll(w) DclockWidget w; { w->dclock.scroll = !w->dclock.scroll; } static void toggle_reverse_video(w) DclockWidget w; { Display *dpy = XtDisplay(w); int i, itemp; if (!(bsave & 0x1)) { XSetForeground(dpy, w->dclock.backGC, w->dclock.foreground); bsave |= 0x1; /* set reverse-video state */ } else { XSetForeground(dpy, w->dclock.backGC, w->dclock.background); bsave &= 0x5; /* clear reverse-video state */ } if (!(bsave & 0x4)) bsave = (bsave & 0x1) ? 0x3 : 0x0; for (i = 0; i < (FADE_ITER >> 1); i++) { itemp = fadevector[i]; fadevector[i] = fadevector[FADE_ITER - i - 1]; fadevector[FADE_ITER - i - 1] = itemp; } ResizeNow(w); Redisplay(w); } static void toggle_military_time(w) DclockWidget w; { Arg arg; if (!w->dclock.display_time) { XBell(XtDisplay(w), 50); return; } XtSetArg(arg, XtNmilitaryTime, !w->dclock.miltime); XtSetValues((Widget)w, &arg, 1); } static void toggle_blink(w) DclockWidget w; { Arg arg; if (!w->dclock.display_time) { XBell(XtDisplay(w), 50); return; } XtSetArg(arg, XtNblink, !w->dclock.blink); XtSetValues((Widget)w, &arg, 1); } static void toggle_seconds(w) DclockWidget w; { Arg arg; if (!w->dclock.display_time) { XBell(XtDisplay(w), 50); return; } XtSetArg(arg, XtNseconds, !w->dclock.seconds); XtSetValues((Widget)w, &arg, 1); } static void toggle_fade(w) DclockWidget w; { Arg arg; XtSetArg(arg, XtNfade, !w->dclock.fade); XtSetValues((Widget)w, &arg, 1); if (w->dclock.fade && w->dclock.scroll) toggle_scroll(w); } static void toggle_tails(w) DclockWidget w; { Arg arg; XtSetArg(arg, XtNtails, !w->dclock.tails); XtSetValues((Widget)w, &arg, 1); } static void toggle_alarm(w) DclockWidget w; { Arg arg; XtSetArg(arg, XtNalarm, !w->dclock.alarm); XtSetValues((Widget)w, &arg, 1); } static void set_alarm(w, event) DclockWidget w; XButtonEvent *event; { static saved_secs, saved_miltime, saved_fade, saved_blink; if (event->button == 3) { if (!(w->dclock.display_time = !w->dclock.display_time)) { XtRemoveTimeOut(w->dclock.interval_id); saved_secs = w->dclock.seconds, w->dclock.seconds = False; saved_miltime = w->dclock.miltime, w->dclock.miltime = True; saved_fade = w->dclock.fade, w->dclock.fade = False; saved_blink = w->dclock.blink, w->dclock.blink = False; w->dclock.interval_id = (XtIntervalId)NULL; } else { w->dclock.seconds = saved_secs; w->dclock.miltime = saved_miltime; w->dclock.fade = saved_fade; w->dclock.blink = saved_blink; } ResizeNow(w); Redisplay(w); } else if (!w->dclock.display_time && (event->button == 1 || event->button == 2)) { /* get the digit under the position (1-4) the mouse is over * and increment (possibly wrap around) to next digit. */ int i, x, y = (int)((BORDER/2)*y_ratio) + TopOffset; /* first check to see if user toggles the alarm */ #ifdef XFT_SUPPORT if (TopOffset) i = (BORDER + (w->core.height / 6)) - event->y; else i = event->y - (winheight - (w->core.height / 6)); #else if (TopOffset) i = (BORDER + (w->dclock.font->ascent + w->dclock.font->descent)) - event->y; else i = event->y - (winheight - (w->dclock.font->ascent + w->dclock.font->descent)); #endif if (i >= 0) toggle_alarm(w); else for (i = 0; i < 4; i++) { x = i * w->dclock.digit_w + (i>1) * (w->dclock.digit_w / 2) + (w->dclock.digit_h - event->y) / w->dclock.angle; if (event->x < x + w->dclock.digit_w) { if (cur_position == i) { int digit = w->dclock.alarm_time[i>1?i+1:i] - '0'; int mod; switch (i) { case 0: if (Alarm.hrs > 13 && digit == 1) digit++; mod = 3; before.tm_hour = -1; when 1 : mod = (Alarm.hrs < 20)? 10 : 4; before.tm_hour = -1; when 2: mod = 6; before.tm_min = -1; when 3 : mod = 10; before.tm_min = -1; } if (event->button == 1) digit = (digit + 1) % mod; else if (--digit < 0) digit = mod-1; w->dclock.alarm_time[i>1?i+1:i] = digit + '0'; (void) sscanf(w->dclock.alarm_time, "%2d:%2d", &Alarm.hrs, &Alarm.mins); (void) show_time(w); outline_digit(w, cur_position, True); } else { outline_digit(w, cur_position, False); outline_digit(w, cur_position = i, True); } break; } } } else XBell(XtDisplay(w), 50); } /* Draw a box around the digit, for use with the alarm-time setting function.*/ static void outline_digit(w, i, draw_it) DclockWidget w; int i; Boolean draw_it; { int xbase, y, xadd; XPoint rectpts[5]; xbase = w->dclock.digit_w * i + (i>1) * (w->dclock.digit_w / 2); xadd = (int)(w->dclock.space_factor * w->dclock.digit_w / 4); y = 0.5 * BORDER * y_ratio; rectpts[0].x = rectpts[4].x = xbase + xadd; rectpts[1].x = rectpts[0].x + ((w->dclock.digit_h + 2 * y) / w->dclock.angle); rectpts[2].x = rectpts[1].x + w->dclock.digit_w - xadd; rectpts[3].x = rectpts[0].x + w->dclock.digit_w - xadd; rectpts[0].y = rectpts[4].y = rectpts[3].y = (w->dclock.digit_h + 3 * y) + TopOffset; rectpts[1].y = rectpts[2].y = y + TopOffset; XDrawLines(XtDisplay(w), XtWindow(w), draw_it? w->dclock.foreGC : w->dclock.backGC, rectpts, 5, CoordModeOrigin); } dclock-2.2.2/sounds/0000755000175000017500000000000007014302261014714 5ustar bdefreesebdefreesedclock-2.2.2/sounds/digital.wav0000644000175000017500000011032407014302261017051 0ustar bdefreesebdefreeseRIFFÌWAVEfmt "V"Vdata§€€€€€€~|{|}~~~}}€€~{yz|~~}}‚ƒ„‚|yy|€~}~„†…ƒ{xy}~}ƒ†‡†‚~zxy}€||€„†‡…€zvvz~{z}‚†ˆ†‚|vtw|€{x{€†ˆ†‚|vsuz€|xx~…ˆ‰…yvw{€ƒ{z~…ŠŒŠ…€|{}‚††}€‡ŒŽˆ„€~ƒ‡‰…€„ŠŽ‹…€}}€…ˆ…~ƒŠŽŽŠƒ|xw{€„zw|„ŠŒŠƒ{soqv}ysszƒŠŠ…}tnms{zrqwˆ‹‡€wqosz€~vrx‰‹…}wuw}„†xy‚Œ‘‘‹ƒ}z|ˆ‹†|{‚‹“•‘‰‚|{~„‰ˆwz„‘ˆwsu{‚ƒyqs}†‹Š‚zqmms{yols}†‰†umkow~}tnr|†ŒŠ„|soqx€‚zru‰Šyttzƒ‡ƒzw}‡”‘Šzvz‚‰‰€y|†–”Ž…|xy€ˆŠƒz{„Ž””‡~wuz‚ˆ†|v{†’„zrqx€…vszƒ‹Ž‹„{rnpx€€xqu‰ŒŠƒyplnwyqrz„‹Œ‡~smmu‚zqrz„Œ‰wons}ƒ~try„ŒŽ‹„zspu}…„{uxƒ’Š€xux‰‰€y|†•”†}xy€‰Œ…{{…••‡}vv~‡Š„{y‹‘’Ž…{try‚‡‚wt{…Œ„{rnr|„‚xqu‰‹…|snpxƒ{st|‡Ž‰xqqw…€wu|†ŽŒ…|trw€†ƒzw~ˆ’އ~vsv~†…}w{„ŒŽˆvqs{ƒ„{tv€ŠŽŒ…|rmox€€wqt}†‹Š…}tmlr{€{rpw‰‹‰‚xpmpz€xru~‡Œˆvpry‚„}vxŠŒ„{vv{„ˆ„{yŠ‘”‘Šzw|„‹‰€z~ˆ‘•“„{wxˆ‰yy‹‘“†|urw†‚xu|‡ŽŠ€wppxƒ|sryƒŠŒŠƒzqnr|‚~tpv€Š‹…|tprzƒ„{sv€‹ˆ~vsw€ˆ†}vz„“’Œ„{vw~†‰‚xw‰’‡}vsx‡„ysx„Œ„zros|ƒvos}‡Œ‹„{rmox€€vor|†‹‹…|snow€‚zrs|†ŽŠ‚yrrw†ƒyuz„’Šytw€ˆˆ€x{…””Ž…|vwˆŠƒzy‹’”ˆ~vuzƒ‰…{v|†’ˆ~urv€†wsyƒ‹ŽŒ…|rnrz‚xqt~‡Œ‹†}snox‚yqr|‡Œ†~upry‚„}tt|†Œ„|urw†…|vz„‘Šytv~†ˆ€wx‹‘Œ‚yrszƒ†€vtz„Œ†}torzƒ‚xru‰Œ‹…{rnqy€xqt}†ŒŒ‡vpqw€„€wty‚Љ€xtw€‡†|x~‰“ˆyvz‚‰ˆz{‚‹‘’Ž…|vuzƒ‡xv|…ŒŽŒ…|sos{‚vpv‡Š‡wnjnw~~vnpx‚‡‡ƒzqllt|ypov€‡‰‡yqot}ƒwtyƒ‹Ž‡xuyˆˆ€z|†””Ž…}z~†Œƒ|€Š’—•†~{~…Œ‹‚{~‡“’Œ„zvx‡ˆ€wv}‡ŽŒ…{spu~„€vpu~‡‹Š„{snpy€wpr{…ŠŠ…}toqx€‚zst|†Œˆ€xst{„†€wv|†Ž‘އ~vuz‚ˆƒzw~ˆ…{tsy‚†€wu|†ŒŽŠƒzrpu|ƒxrt}†‹‹†~uopw‚{srzƒŠ‹‰xpns}‚}tryƒŠŒˆ€wpou~ƒvsx‚‰‹…}uqt|„„|uwŠŠ‚ytu}†‡€xyŠ‘’ކ}vuzƒŠ‡~wz„Ž’‘Š€xty„‰ƒyv|†ŽŠ€xst|„†€wv~‰Šxrszƒ‡wt{†Œ„zsryƒ‡~ut~ˆ‹‚yrqx†€vry„ŒŒ…|tpt}„‚ysv€ŠŽŽˆvpt|„„|tv~ˆ‹„zsrw€…xu|†Œ„{tsy‚†yw~‡ŽŒ…|uty‚‡ƒzv{„ŒŠxst|„…~vxŠŽˆvpry‚„}tt|…Œ‰‚xqou~ƒ~vrx‚ŠŠƒzrpt~ƒvtz„ŒŠ„{squ~…‚zvz„ŒŽ‡~vsw†…|wz„‘‰wsw†„|w{„ŒŽˆ€wrt{ƒ…~wv}†‹ƒyrqw€…€wtzƒ‹ŽŒ†|tpt}ƒxtx‚Š‹…|tpsz‚ƒ|uv~‡ŽŠ‚zrrw€…€xv|…ŒŽ‡~vsv~…„|wzƒ‹‹ƒztsz‚‡xw‰Šxsv~……}vx€‰Ž‹„{trx€„wu|‡ŽŠ‚yrqv„€xty‚ŠŒ…|sorz‚‚ysu~‡ŒŒ†~uoqx‚zst|†Œˆxqpu~…xsyƒŒŽ†}usxˆ…|w{…Ž’’Œƒzux‰ˆ€xz„Ž“’Œ„ztv~‡ˆ€xxŠ‘…|utzƒˆƒyu{†Ž‘އ~urw‡„ztyƒ‘‰€wrt|…‡uu~‰‘‹‚yssz„‡€us|‡Œƒxrrzƒ†~ss|‡ŽŒ„zqou~…vqvŠ‹„{qmpzƒvot~ˆŒ‹„zpmq{‚€wps|†‹Œ‰xpou…€vry„Œ†|tqv‡…{tx„’‰€wsv‡†|uyƒŒ‘Šxst|…‡vv€Š‹‚xrs{„†~vu~ˆ‹ƒyqqx…€wtzƒŒ‰€wqr{„…|ux‚ŒŽˆ~vrt}…†wv}†ŽŽ‡~vsx‚‡ƒyu|†Ž’Šxtv~†‡~vx‚‹‘‘‹‚xrszƒ†vu}†‹ƒyrpv„vrx‚ŠŒ…{rnqz‚xqt‰Œ‡~toqy‚ƒ|st|‡ŽŠ‚xqrz„†~tt}ˆ‘Œ„zstz„‡€wv~‰’…{utz„‰„yv}ˆ’‡}usyƒˆ„yuz…Ž‘‰vru~†„zsw‚‹Žˆ~upr{ƒ„{su€ŠŽ†|sos}„ƒyru~ˆŽŠxqqw…vsz„Œ†|spu~†‚xsy„†|trv†„{vyƒŒ‘‘‹‚ytu|…‡€xx‹‘’…{tsy‚†‚yv|‡ŽŒ„zrpv~„wsx‚Š‹„{rnqy€€xsv€ˆŒ‹…|snqy‚{uv~ˆŽ‰xrrx…yw}†Ž‘‡}trx‚†€yy‚‹‘‘…|urw…‚{w{„Œ†}tpt}„‚ytxŠŽ‡~tprz‚‚ysv€‰Œ‡~topw€‚{st}‡‰€wppv„~vsz„ŒŒ„zrpv…xtz…ކ|urv†„{vz…Ž’‘Š€wsw€ˆ†~x|†“’Œ‚ytw€‡‡€y|„’’…{tszƒ‡yw~ˆ‘…{trx†yv|…†}tqv~…xtzƒ‹Žˆ~ups|ƒƒztx‚‹‡}tps|„ƒzsw€‰ŽŽˆ~uprz‚ƒ{st}‡ˆ~unpxƒzqs|†ŒŒ‡uoou~ƒ}tqxƒ‹Š‚yqot}„wrvŠŽŽˆ€vps{„„|tv€ŠŠxst|…‡xw~ˆ“ˆwuz„І|w}‡”’‹yuy‚‰‡}w|†Ž“’Œ„{uu|…ˆ‚ywŠ’„ysu}……|tvˆŽŠ‚yrpu}ƒupwŠŒ‰womr|‚€vpu‰‹„zqns~„€vqw‚ŠŽ†}tpt|„„{tv€ŠŠxrszƒ†€wv~‰‘„ztt{„ˆ‚xw‰’‡|tszƒ‡xv~Š‘Œƒyrszƒ†vv‰‹‚xst{„†vv~ˆŒ…{trx‚‡‚xu{†Ž‘ކ|trw€‡„zty„Œ‰vqt}……|uv‰ŽŽ‰€vpqy‚‚zqs~ˆŒ†|snow€zrs{…‹Œ‰wppv€„~us{…Œƒzrrx‚…vv~ˆŽŒ…|usx€†ƒ{w|…‘‰wsv~††~xz‚Š‹ƒyst{ƒ…~wx€ˆ‰xqpv~‚}wuz‚‰‹ˆ‚zrosz€~xvy€†‰ˆƒ|tpsz€{wy…‰Šˆƒ|usw~ƒ|{€‡Œ‰ƒ{wx}ƒ…‚~~ƒˆŽˆ{y{…„€~†‹Œ‡zwy~‚ƒ|}†ˆˆ…xtuz~|xy|€ƒƒ}wsruz|zwwy}€€~zvtvz}~|z|ƒ„…ƒ€}zz~ƒ€€ƒ†ˆˆ‡…„†…ƒƒ„†ˆ‰‰‡„€ƒ…„ƒ‚‚„…†…„‚~~€€~~€€€€~}|||}}||||}~~~~}||||}}}}}}~~~~~~~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~~}}|||||{{{zzzzyyyyyyyyyyyyyyzzzzzzzz{{{||||}}~~~€€‚‚‚ƒƒƒ„„………†††††‡‡‡‡‡‡ˆ‡ˆˆˆˆˆˆˆˆˆˆ‡‡‡‡‡††††……„„„„ƒƒƒ‚‚‚€€€~~~}}|||{{{zzzyyxxxxwwwwvvvvvvvvvvwwwwwxxxxyyyyzzz{{{|||}}}~~€€‚‚ƒƒƒ„„…………†††††††‡‡‡‡‡‡‡‡‡‡‡‡†††††……„„„ƒƒ‚‚‚€€€~~~}}}}}}|||||||||||||}|}}}}}}~~~~~~~€€€€€€€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}|||{{{zzzzyyyxxxxxxxxxxyyyyyyzzzz{{{{{|||}}}~~€€€‚‚ƒƒƒƒƒ„„„………………†††††††††††††††††………„„„„ƒƒƒ‚‚‚‚€€€~~~}}}}||{{{{{{zzzzzzzzzzzzzzzzzzzzz{{{{|||||}}}}}~~~~~€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚€€€€€~~~~~~~~}}}|||||||||||||||||||||}}}}}}~~~€€€€‚‚‚ƒƒƒƒ„„„„„………………†††††††††††††††††††††††††…………„„„„ƒƒƒ‚‚‚‚€€€€~~~}|||{{{zzyyyyxxxxxwwwwvvvvvvvvvvvvvvvvwwwwxxxyyyyzz{{||}}~€€‚ƒƒ„„„…†††‡‡‡‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‡‡‡††††……„„ƒƒ‚‚‚€€€~~}||{{zyyxxwwwwwvvwvvvvvwwwwwxxxxyyyz{{||}~~€€‚‚ƒ„„………†‡‡ˆˆˆˆ‰‰‰‰‰ŠŠŠŠŠŠŠŠŠŠ‰‰‰‰ˆˆˆˆ‡‡‡†††…„„„ƒƒ‚€€~~}}||{{zyyxxxwwvvvvvuuuuttutuutuuuuvvvwwwwxxyyzz{{||}}}~€€‚ƒƒƒ„„……†††‡‡‡‡ˆˆˆˆ‰ˆ‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆ‡‡‡††††……„„ƒƒ‚‚‚€€€€~~~~}}}||||||{{{{{zz{{{{{{zzz{{zz{{{{{{{{{|||||||}}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€‚€€€€€€€~~~~~~}}}}}}}}}}}}}}~}~~~~~€€€€€€€€€‚‚‚‚‚ƒƒƒƒƒ„„„…„„……„…………………………„„„„„ƒƒƒ‚‚‚‚€€€~~~}}||||{{zzzzzzzzzzzzzzzzz{{{{{{||||}}}~~~~€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚€€€€~~~~~}}}|||||||{{{{{z{{{{{{{{||||||}}}}}~~~€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚€€€~~~~~}}|||||{{{{{{zz{{zz{{{{{{{||||}}}}~~~~€€€‚‚‚‚‚‚ƒƒƒƒƒ„ƒ„„„„„ƒ„ƒƒƒƒƒƒƒ‚‚‚‚‚€€€€~~~~}}||||||{{{{zzzzzzzzzzz{{{{{|||||}}}}~~~€€‚‚ƒƒƒ„„………††††‡‡‡‡‡‡ˆˆˆˆˆˆˆˆ‡‡‡‡†††………„„„„ƒƒ‚€€~~}|||{{zzzyyxxxwwwvvvvvvvvvvvvvwwwwwxxxyyzzz{{||}}~~€€‚‚ƒ„„„……†††‡‡‡‡‡ˆ‡ˆ‡ˆ‡‡‡‡‡‡‡‡††††………„„„ƒƒ‚‚€€~~~~}|||{{{zzzzyyyyyyyyyyyyyyyyyzzzzz{{{{{|||}}}}~~~~€€€€€‚‚‚‚‚ƒƒƒƒ„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~}}}}}}||||||||{{{{{{{{zz{{zzzzzzz{{{{{{{|||||}}}~~~~€€€‚‚‚ƒƒ„„„…………††††††‡‡‡‡‡‡‡†††††……„„„„ƒƒƒ‚‚‚€€€~~~~}}}|||||{zzzzzzyyyxxyxxxxxxxxxxyyyyyzzz{{{{||}}}~~€€‚‚‚ƒƒƒƒƒ„„„„„…………†††††††††††††……††………„„„„„ƒƒ‚‚‚‚€€€€~~~~~~}}}}|||||||{{||{{{|||||||||||}}}}}}~~~~~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€~~~~~~~~~~~~~~~~}}}}}}}}}}||}}|}}}}}}}}}}}~~~~~~~~~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚€€€€€€€€~~~~~}}}}}}}}|}}}}}|}}}}}}}}}}}}}}}}}}}~}}~~~~~~~~~€€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚€€€~~~~~~}}}}||||||||{{{{{{{||||||||||||}}}}~€€€‚‚ƒƒƒƒ„„„………††††‡‡‡‡‡‡‡‡‡‡‡††††††††……………„„„„ƒƒƒ‚‚‚€€€€~}}}|||{{zzzyyxxxxwwwwvvvvvwwwwwwwxxxxxxyyyzzzz{{{|||}}}}~~~€€€€€€€€‚‚‚ƒƒƒƒ„„„„„„………………………………………………„„„„ƒƒƒ‚‚‚‚‚‚‚€€€€€€~~~~~~~~~~~~}}}}}}}}}}}}}}|}}||||||||||||||||||||||}}}}}}}~~~~~~~€€€€‚‚ƒƒƒƒ„„„„„„„…………………………………„„„„„„„„„„„„ƒƒƒ‚‚‚‚€€~~~}}}}||||||||{{{zzzzzzzzzzz{{{{|||||}}}~~~€€€‚‚‚‚ƒƒƒƒƒ„„„„„…„……………………………„„„„„ƒƒƒƒ‚‚‚‚€€€~~~}}}|||{{zzzyyyxxxxxxwwwwwwxxxxxxxxxyyzzzz{{{||}}~~~€€‚‚ƒƒƒƒ„„„„…………†††††††‡‡‡‡‡‡‡††††††††………„„„ƒƒ‚€€€~~~}|||{zzzyxxxxxxxxxxwwxxxxxxxxxxyyyzzzz{{||||}}~~~€€€‚‚‚ƒƒ„„„………†††‡‡‡‡‡‡‡ˆˆˆˆ‡‡‡‡‡‡‡††††……„„„ƒƒ‚‚‚‚€€~~~~}}||||{{{zzzzzzyyyyyyyyyyyyyyyyyzzzzz{{|||||}}~~€€€‚‚ƒƒƒ„„„………†††††‡‡‡‡‡†‡‡‡††††††………„„„„„ƒƒ‚‚‚‚‚€€€€~~~~~~}}}}|}|||||||{{{{||||||||||||||}|}|}}}}}}}}}}~~~~}}}}~}}~~~~}}}}}}}}}}}}~~~~~~~~~€€€€€€‚‚‚‚€€€€‚‚‚ƒ………„ƒ€‚„„ƒ‚ƒ…†ˆˆ‡…‚„…„‚ƒ…‡ˆ‡„{z|€}{|~ƒƒ|wttw{|xvw{|vrqsx{{xvw{‚„‚~yutx~€||„ˆ‹Š†‚}{}‚‡‡ƒ€ƒ‰Žˆƒ~}€…‰ˆƒ€‚‡Šƒ}z{€…†||‡ŒŒ‰‚zuuy‚~wv|ƒˆ‰…~wrqt{€}vrv†‰‡xrpt{€xtx€ˆŒŠ„|vtw~„‚zv{„‹Œ†~yvy…‡zz‚Š’…~yy~„‰…}z€Š“ˆywz‡…}x|…އ~vsu{‚‚{uwˆŒ…|soqy€€xqt|†‹‹…}toqw€yrt|…‹Œˆ€wrqv~„€wu|‡Š‚zuu{ƒ†yxˆ’އ}vvz‚ˆ…|x~‡’ˆvsv}„„{ux‚‹Œ„zros|ƒ€vqv€‰Œ‹…{rnqyxrt~‡ŒŒ†}topw€‚{tu~ˆŽ‡~vqs{ƒ†€xw~ˆ’އ}vu{…‰„{|„Ž““ކ}ww{ƒˆ†z~‡’‰~vsw†„|vy‚ŠŽŽˆ~tnpw€yrs|…ŠŠ…|slkr{€{rpwˆŠ‡vnmr{‚€xsv‰ŽŽ‰€wrs{„†€xy‚‹’“ކ}vv|†Š…|{ƒŽ”•‡}vw~‡Š„|{ƒ“”†|ut{„‡‚yx‰Œ„{spu~„xty„ŒŒ„zros}„‚yswŠŽ‡~torzƒƒ{svˆŽŽˆ€vppw„~ut|‡Ž‹‚xqqw€…€vsz„…{spu~…ƒyrv€Š‰~uoqzƒ„{ru€ŠŽ‡~upry‚„~ut|‡Ž„zrpv†‚xtz„‘ˆ~ups|…„{tyƒŒŽ‡}tps|„„|tu~‰‹‚xrryƒ†ut}ˆ’ކ|tqv€‡ƒxtz…Ž’‰vqt{…‡us|‡‘‹‚wpr{„„zru‰Š‚yrpv~„wrwƒŒ…zrpu~…‚xru€Šˆ~upr{„„zqt‰ŽŠ€wppw…~trz…Œ„zrpt~…ƒyrw‚Œ‘‰~uqu~†…{txƒŒ’‘Œƒyst|…‡€ww‹’’„zst{…ˆxwŠ’Ž…{tszƒ‡xv}†Ž‘ˆvqt|…ƒ{twŠŽˆ€vpqy‚„}tt|†ŽŠ‚xqpv„vryƒ‹†}tpt}„xsyƒŒ…{spu}„ƒyrv€‰ŽŽˆvpry‚„|sr|†ŽŠwpqyƒ„{su~‰ŽŽ‰€wqqw…vs{†ŽŒ…{srw‡ƒytyƒ‘‰€wrv‡…|vy„‘Š€wrt}…†~vv€Š‘Œƒyrryƒ‡€vt|†Ž‘އ~tpu~…ƒyswŠŽŽˆ€wqqx‚…~tuЇ}tpu~…ƒztw€‰ŽŒ„{trw…€xu|‡ŽŒ„{squ}„‚zuyƒ‹ŽŒ…|spt}„‚ytx‰ˆ€wppw€ƒ}ut|†ŒŽŠƒzrpt}„yuz„Œ†|tqu†‚zvz„ŒŠ€wru~††}wz„’‘‹‚xtv‡‡~xz„’‹‚ytv~‡ˆ€ww€Š’ކ|tsy‚ˆƒytz…ޑއ}tqt}…„zsvŠŽ†}torzƒƒzqs}‡‡~tnpy‚‚yqt~ˆŒ‡~tnow€ƒ|srz…Œˆ€wonu€„~trz…‹‚yrqx‚…vu}‡ŽŽ‡~vsw€‡†|vz…Ž“’Œƒztwˆ‰yy‚Œ““„ztv‡‡~wx‚‹‹ƒzsrx…vt|†‹ƒyrpv€…€vsz„Œ‹„zqpu…€wsx‚ŠŽˆ€wpqy‚…}uv€‹Ž‡~uqu}……}vwˆ‘†|usy‚ˆƒyv}ˆ’ˆwsu}…†}vyƒŒ‰vqu}…„{tw€‰ŽŽˆvpqyƒ|ts{…ŒŽ‹„zqos|ƒ€vqw‚ŠŽŒ„zrpt}„‚ysw€ŠŽˆvqu~†„|uyƒŒ‘Šxsv~†…|w{„‘Š€xsu}…†xx‰‹ƒzsszƒ†vu}‡Ž‹ƒzrqw€…wt{…ŒŽ‹„zspt}„‚ztw‚ŠŽŒ…{rpt~„€wsz„ŒŽ‹„zrpv…xtz„†|spu~†ƒzty„Œ…zrqw€…€wsyƒŒ‡~upt}…„{tw‹Šxrs{„†€wv‰‘Œƒztu}†‡wx‚‹‘’Ž…|ut{„ˆƒzv}‡Ž’ˆ~urv†„ztx‚‹ŽŒ†|spt|„‚zsu}‡Œ‰wpov€„|suŠŽ†|sor{ƒƒ|tt|†‹ƒzrqx‚†€vs{…އ~uqu}…„{tw‹‰vqs|„…|uw€ŠŠxqrzƒ†~ut{……{squ†‚xrxƒŒŽ‡}tpt}†…{sv€‹‰€wqt}††|tv€Œ‘Šwqs{„‡€vt|†’‰~vqu~‡†|uw‚Œ’‘Œ‚xrt}†‡~uvŠ’„zssyƒˆvt|‡ŽŽ†}tqu~†„{tx‚Œ‰vqu~†„{twŠŠ€vprzƒ„{st}‡Œ‰vnnt~‚|spx‚‰‹ˆxpnr{‚vpt~‡ŒŒ†}tnqz‚‚zrt~‡‰xrqw€…€wu{…†}usw€†…|vyƒŒ‘Šytv~†ˆwx‚Œ’‘Œƒyss{„ˆwu}ˆ’‡}uru}†‡ut|†Ž‘…zrryƒ†}tu~‡ŽŽŒ…|spt|„ƒ{tvˆŽŽŠ‚xrrzƒ†€xv|…Žˆwsw€‡…{w|†Ž’‰€xsv}……~wyŠŒƒzsrw€…yuz„Œ…|sos|ƒ€xsw€ˆŒŒ†~tnow€zst|…‹Œˆvoou~‚}ut{…ŒŽŠƒzssy‚†zxˆ’Šyvy‚‰ˆ€z}‡”“Ž…|vw~‡Š„|z‚Œ’“‡}vty‚‡„zuy‚‹Žˆ~tor{ƒ‚xqt~ˆŒŠ„zplnw€€wopz„ŠŠ…}smmu‚zppxƒŠŒ‰‚xppv€„~ut|†Œ…|usw€†…|w{…’Šxux€ˆˆ€y{ƒŒ’’…{uv}…†xxŠ‹‚yrqwƒ~vt{„‹Œ‰wpns}}trx‚‰ŒŠƒzqnr{‚wsvˆŒŒˆxqpv„wu}ˆŽ‹xsu}††xyВއ~wv|…‰„|z‚Œ’“ˆ~wvzƒˆ…|x~ˆ‘…{tszƒ†vu~‡ŽŽŠwoovƒ|spw‚‰‹ˆxokox€wps|†‹Š„|rnpyysu~ˆˆ€wqs|„„}vy‚‹Œ„{uv}…ˆ‚z{ƒŒ’“‡~xx~†Š…}{‚‹’”‘Šyw|„‰†~z€ˆ’Šxtv~…„}wz‚ŠŽˆvqry‚|uu|…Š‹‡unov~€zsu}†ŠŠ…}tnov~€zst|…ŠŠ†~uopx€‚{tvˆˆ€wrs{ƒ„~xy‰Œ…|uty‚‡ƒ{x‰‘†}vty‚‡ƒzv{…†|trw€†xtz…ŒŒ†}tps|ƒƒ{su~ˆˆvprzƒ„{ss|†ŒŽŠxqry‚…~usz„ŒŽˆ€wsu}†…|uz…ޑކ|uu{„ˆƒzw|…‘‰€xux€‡…|v|†Ž‘Šytu|„†wx€ŠŠ€wqt|„ƒ{tv~‡ŒŒˆ€wpou~‚|try‚‰Œ‰‚xqns|~urx‚ŠŒŠƒzrpu~„xtyƒ‹Ž‡~vsw€†ƒzv|‡‘Žˆ~wuy‚‡„{x~‡’Šyuv}…‡yy‹‘…|usy†‚yv{…Œ†|spt}‚vrx‚ŠŒŠƒyqnr{‚wrvˆ‹Š„{ros|‚€wtyƒ‹Ž‡~urv†„|wzƒŒ‘‘Œ„{uw~‡‰‚z{„““Ž…{vw‡ˆyy€‰‘†|usx†xtzƒŠŒ…|snqy€€xqs{„‰‰„{rlow~}ups{ƒˆˆ„}uoou}€|ut{„ŠŒŠ„{trv…‚{x}…ŒŠ‚zvw~…†‚|}‚‰Ž‰€yv{ƒ‡ƒ}}ƒŠ‰‚zuuz€ƒ€{y}‚†ˆ‡‚{tpsy~}yvw|„…‚}wrrw}~{xx}‚…†„€zuuy~€||„‡ˆˆ…€{y{€„„‚€„‡ŠŠŠ‡‚~}€„…„‚ƒ†ˆ‰ˆ…~}~ƒ‚€€ƒ„……ƒ€}{|€€~}}€~{z{}~}}||}~~|{{|~~~~~~€~}}~€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€~~~}}}|||{{{{zzzzzzzzzzzyyyzzzzz{{{{{||||||}}}}}~~~~~€€€€‚‚‚ƒƒƒƒ„„„„„„„„„„„„„„„„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€€€~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}~~~~~~~~~€€€€€‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒ„ƒ„„„„„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚‚€€€€~~~~}}}||||{{{zzzzyyyyyyyyyyyyyyzzzzz{{{{{||||}}~~~€€‚‚‚‚ƒƒƒ„„„„…………………………………………………………………„„„„„„ƒƒ‚‚‚‚€€€~~~}}|||{{zz{zzzzyyyyyyyyyyyyyzzzzzzzzzzzz{{{{|||}}}}}~~~~~€€€€€‚‚‚‚‚ƒƒƒƒ„„„„„„„…„……„„„„„„„„ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~~}}}}|||||||{{{{{{zz{{{{{{{{{{|||||}}}~~~€€€‚‚‚ƒƒƒ„„„„……………………………†……………………„„„„„„ƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~~~~~}}}}}}|}}|}}}}}}}}}}}}}}}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~}}}}}}}}}}|||||||||||||||||||||||||||}}}}}}~~~~€€€‚‚‚ƒƒƒƒƒ„„„„„„……………………………………„„„„„„„ƒƒƒƒ‚‚‚‚‚€€€~~}}}}|||{{{{{{{{zzzzzzzzzzzzzzzz{{{{{{|||||}}}~~€€€‚‚‚ƒƒƒ„„„„„…………†††‡‡‡‡‡‡‡‡‡‡††††††………„„„„ƒƒ‚‚‚€€€€~~~~}}}||||||||||||||{{||{||||||||||}}}}}}}}~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~~~~~}}}}}}}||}||}}}}}}}}}}}}}}}}}}}}}~~~~~~~€€€€‚€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒ‚‚‚‚‚€€€€€€€~~~~}}}}|||||{{{{{{{{{{{{{{{{||||||||}}}}}}}~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚€€€€€~~~}}}}}}|}|||}}}}|}|}}}|||}}}}}}}}}}~~~~~~~~~~~~~~€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„ƒƒƒƒƒ‚‚‚‚‚€€€€~~}}}}}||||{{{{{{zzzzzzzz{{z{{{|||||}}}}}~~~€€€€‚‚‚‚‚ƒƒƒƒƒƒ„„„„„„„„…„„…………………………„„„„„„„„ƒƒƒ‚‚‚‚€€€€~~}}}}}||||{{{{{{zzzzzzzzzzzzz{{{{{{||||||}|}}}}}~~~~€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~}}}}}}}}}}||||||}||}}}}}}}}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚ƒƒƒƒ„„„„„…………………………………………………„„„„„„ƒƒ‚‚‚‚‚€€€€€€€€€€€~~~~~~~}}}}|||||||||||||||||||||||||}}|}}}}}}}}}}~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~€€€€‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚€€€€~~~~~~}}}}}|||||||||||||||||||||}}}}}~~~€€‚‚‚‚‚ƒƒƒƒ„„„„……………………………………………„„„…„„„„ƒƒƒƒ‚‚‚‚‚€€€~~~~}}}|||{{zzzzyyyyyxxyxxxxxyxxxxxyyyyzzzz{{{{|||}}}~~~~€€€€‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„„„„„„„ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€~~~~~}}}}||||}}}}}}}}~~~~~€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€€~~~~}}}||||{{{zzzzzyyyyxxxxxxxxxxxxxxxyyyyzzz{{{|||}}~~€€€‚‚ƒƒƒƒ„„„„„………………†††……††……………………………„„„„ƒƒ‚‚‚‚‚‚€€€€€€€€€€€€‚‚‚‚‚ƒƒ‚ƒƒƒƒƒƒƒƒƒ‚ƒ‚‚‚‚€€€€€~~~~~}}}||||{{{{zzzzzzzzzzzzzzzzz{{{{{{{{||||||}}}~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~}}}}}}}}}}}|}}|}}}}}}~~~~~~€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€~~~~~~}}}}|||||||{{{{zzzzzzzzzzyzyzzzyzzzzz{{{||}}~~€€‚‚‚ƒƒ„„„……†††††††††††††††††††……………„„„ƒƒƒ‚‚‚‚€€€€€~~~}}|||{{zzzzzyyyyyxxxxxxxxyyyyyyzzzzz{{{|||}}}~~€€€‚‚‚‚ƒƒƒƒƒ„„„„„„……………………………………„„„„ƒƒƒ‚‚‚€€€€~~~~}}}}|||||||||||}||}}}|}}}}}}}}}~~~~~€€€€€€€€€‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~}}}}}|||||||||||{|||||||||||||||||}}}}}}~~~~~€€€‚‚‚‚ƒƒ„„„„………………††††††††††††††……………………„„„„ƒƒƒ‚‚€€~}}}||||{{zzzzyyxxxxxwwwwwwwwwwwwwwxxxyxyyyzzz{{||}}~~€€‚‚ƒƒ„„……††‡‡ˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆˆ‡‡†††……„„„ƒƒƒ‚‚€€€~~}}|||{{zzzyyyyxxxxxxwwwwwxxxxxyyyyyyyzzzzz{{{||||}}}~~~€€€€‚‚‚ƒƒƒƒƒ„„„„„„„„„……„„„„„„„„„„ƒƒƒƒ‚‚‚‚€€€€€€~~~~~}}}|}||||{{{{zzzzzzzzzzzzzzzz{{{{{||||}}}}~~€€€€‚‚‚‚ƒƒƒ„„„…„…………………†………………………„„„„„„ƒƒƒ‚‚‚‚‚€€€€~~~~~}}||||{{{{{zzzzzzzyzyzzzzzzzzz{{{{|||||}}}}~~~~€€€€€‚‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~}}}}}}}}|}|||||||||||||||||}|}|}}}~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€~~~~~}}}||||||{{{{{zzzzzyyyyyyyyyyyyyzzz{{{||}}~~€€€‚‚ƒƒ„„…††‡‡ˆˆ‰‰ŠŠŠ‹‹‹‹ŒŒŒŒŒŒŒŒ‹‹‹‹ŠŠŠ‰‰ˆˆ‡‡†……„„ƒ‚‚€~}|{zzyxwvuuttssrqqpppppppppppqqqrrssttuvvwxyyz{|}~~€ƒƒ„„…†‡‡ˆˆ‰ŠŠŠ‹‹‹ŒŒŒŒŒŒŒŒŒŒ‹‹‹‹ŠŠ‰‰ˆˆ‡††…„ƒƒ‚€~}||{zzyyxxxwwwwwvvwwwwwwxxxyyyzzz{{||}}}~~€€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚€€€€~~~~}}}||||||{{{{{{{zzzzzzzzzz{{{{{{{{{|||||||}}}}~~~€€€€‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„„„„…„„„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~~~~~~}}}}}}}}}}}}}~~~}}}}}}}}}}}}}}}}|}||}}|}}}}}}}}~~~~~€€€€€€€€‚‚‚‚‚€€€€€€€€€~~~~~~~~~~€€€€€€€€€‚‚‚‚‚‚ƒƒƒƒƒ„ƒ„„„„„„„„„„„„„„„„„„ƒƒƒƒ‚‚‚‚‚‚€€€€€~~~~~~~}||}|||{{{{{{zzzzzzzzzyyyzzzzzz{{{{{||||}}}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒ‚ƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒƒ‚‚‚‚‚‚‚€€€€~~~~~}}}}}}|||||{{{{{{{zzzz{{{{{{{{||||||}}}}}}~~~~~~~~~~~~~€€€€€€€€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}||||||{{{zz{{zz{{{{{{{{||||||||||}}}}~~~~€€€€‚‚‚ƒƒƒƒƒ„„…………††††††‡‡‡‡‡‡‡‡‡‡ˆ‡‡‡‡‡‡‡‡††††……„„ƒƒƒ‚‚€€~~}}|||{{zzyyxxxxwwwwwvvvvvvvvwwwwwwwwwxxxxxyyzz{{{||}}}~~€€€‚‚‚ƒƒƒƒ„„„„„„…………††††††††††††††††††……………„„„„„ƒƒƒƒ‚‚€€€~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~~€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚€€€€~~~~}}}}|||||{{{{{{{{{{{{||||||||||}}}}}}}}}~~~~~~~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~}}}}}}}}|}|}}}}}}}~~~~€€€€‚‚‚ƒƒƒƒ„„„„„„„„………„………„„„„„„„„„„ƒ„„„ƒƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}}||||{{zzzzzzzzyyyyyyyyyyyyyyzzzzz{{{{{||||}}}}}}~~€€‚‚‚ƒƒƒƒ„„„„„„„…„…………„„„„„„„„„„„………„ƒ‚€€~~~~~~€~}|||{{{||||}}}}~~~~€€€€€€€€€€~~~~~}}||||||||||||||}}~~~€€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒ‚ƒƒ„„„„„„„ƒ€€€€€€€€€€€€€€€€~~~~€€€€€€€€~}{{zzyyxwwwwwwxyzzzzzzzzzzzzz{{{{{{{|}‚‚‚‚ƒƒƒƒ„†‡‡ˆˆ‰‰ˆˆˆˆ‡†…„ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚ƒ„†‡ˆˆˆˆˆˆˆˆˆ‰ŠŒŒŒŒ‹‹Š‰ˆ†…„ƒ‚€~}||{zzyyxxwwwwwwvvwwwwxxyyyzzzz{{||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}|||||||||{{|||{{{{{{{{{{zz{{{{{z{{{{{|||||||}}}}}}~~~~€€€‚‚‚ƒƒ„„„………††‡‡‡‡ˆˆˆˆˆ‰‰‰‰ŠŠŠŠŠ‹‹‹‹‹ŠŠŠŠŠŠŠ‰‰‰‰‰ˆˆ‡‡†††……„„„ƒƒ‚‚€€~~~~}}}}||||||||{{{{{{{{{zzzzzzzzzzzzzzzzzz{{zzzzz{zz{{{zzz{{{{{{{{{{{{{{{{{||||||||}}}}}}}}~~~~~~€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~~}}||||||||||||||||}}|}}}}}~~~~~~€€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚€€€€€€€€€€~~~~~~}}}||}|||||||||||||{{{{{{{{{|||||||||||||||||}}}}}~~~€€€€‚‚‚‚‚‚ƒƒƒƒƒƒ‚‚ƒƒƒ‚‚‚‚‚‚‚€€€€~~~~~}}}|||||||||{{{{{{{{{{{{{{|{|||||||}}}}}}~~~~~~€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚€€€€~~~~~}}}}}||||||||||||}|}}}}}~~~€€€‚‚ƒƒƒƒƒ„„„……………††††‡‡‡‡‡‡‡‡‡‡††††††………„„„„„ƒƒƒ‚‚€€~~~~}}}||||||{{{{{{{{{{{||||||}}}}~~~~€€‚‚‚ƒƒƒƒƒ„„„„„„„„………………………„„„„„„ƒƒƒƒ‚‚€€~~}}}|||{{{zzzyyxxxxwwwwvvvvvvvvvvvvvvvvwwwwxxxxyyyzzzz{{{{|||}}}~~~€€€‚‚‚ƒƒƒƒ„„„„„„„„„„„……„„„„„„„„ƒƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€€~~~~}}}|||||{{{{{{{{{{{{{{|||||||}}}}}~~~~~€€€‚‚‚ƒƒƒ„„………†††‡‡‡‡ˆˆˆˆˆˆˆ‰ˆˆˆˆˆˆˆˆˆ‡‡‡††††……„„„„ƒƒ‚‚‚€€€€~~~~}}}|||{{{zzzyyyxxxxxxxxxxxxxxyyyzzz{{|||}}~~€€‚‚ƒƒƒ„„„……………†††††††‡††‡‡††‡‡††††††………………„„„„„ƒƒƒ‚‚‚‚€€€~~}}|||{{{zzzyyxxxxwwwwwwvvvvvwwvwwwwwxxxxxxxyyyyyzzz{{{{|||}}~~€€‚‚‚ƒƒƒƒƒƒ„ƒ„„„„„„„„„„„„ƒƒ‚ƒƒ‚‚‚‚‚‚‚€€€€€€~~~~}}}||||{{{{{{zzzzzzzzzzz{{{{||}}|}~~~€€‚‚ƒƒƒƒ„„„„…………………………………………………„„„„„„ƒƒƒ‚‚‚‚‚‚€€€€€~~~}}||{{zzzzyyyxxxxxxxxxxxxxyyyyzzz{{||}}~~€€€‚‚ƒ„„………†‡‡ˆˆˆ‰‰‰‰‰‰‰ŠŠ‰Š‰‰‰‰‰‰‰‰‰‰ˆˆˆˆ‡‡††……„„„„ƒƒ‚‚€€€€~~~}}}|||||{{{{zz{zzzzzzz{{{{{|||||||||||||}}}}}~~~~~~~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~~}}}}}||||||||||||||||||||}}}}~~~~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~}}}|||||||{{{{{{{{{{{{{{{{||||||||}}}}}}~~~~~~~~~€€€€€€€‚‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€~~~~~~~~~~~~~~~~€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~~~~€€€€€‚‚‚ƒƒƒƒ„„……………………†††††††††††††††…………„„„„„ƒƒ‚‚‚‚€€€€~~~}}||{{{zzzzyyyxxxxxxxxxxxxxxxxyyyyzyzzzzz{{{|||}}}~~€€€‚‚‚‚ƒƒƒƒƒ„„„„„„„„„„„„„„„ƒƒƒƒ‚‚‚‚€€€€~~~~}}}}}||||||}|}|||||||||}|||}}}}~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~~~}}}}|}|||||{{{{{{{{{{{{|||||}}}}~~€€‚‚ƒƒƒƒ„„„„„………„……„„…………„„„„„ƒƒƒ‚‚‚‚‚‚‚€€€€€€€~~~~}}}||||{{{zzzzzzzzyyyyzzzzzzz{{{{||}}~~€€‚‚ƒƒ„„…………††††††††††††††………„„„„ƒƒƒ‚‚‚€€~~~}}|||{{{zzzzzzzyyyyyyyyyyyyyyyyyyzzzz{{{{||}}~~~€‚‚‚ƒƒƒ„„„…………†††††††††††††……………„„„ƒƒ‚‚‚‚€€€~~~~}||{{{zzzzzyyyxxxxxxxxxxxxyyyyyzz{{{|||}}~~~€€‚‚ƒƒƒ„„„……………†††††††‡‡†††††‡††††………„„„„ƒƒƒ‚‚‚‚€€~~~}}}}}|||||||}||}}}}}}}}}~~~~€€€€€€‚‚€€€€€~~~~}}}|||{{{{{zzzzyyyyyyxyxxyyyyyyyyyzzzz{{{|||}}}~~€€‚‚ƒƒƒ„„„………†††††‡‡‡‡‡‡‡‡‡††††††………„„„„ƒƒƒ‚‚€€~~}|||{zzzzyyyyyyyyyyyyzzzz{{{|||}}~~€€‚‚ƒƒ„„„„………††††††††††††††††††††………………„„„ƒƒ‚‚€€€~~}}}|||{{zzzzyyyyxxxxxxxxxxxxxxyyyyzzzz{{{||}}}}~~~€€€‚‚‚ƒƒƒƒƒ„„„„……………………†††††††††…………………„„„„ƒƒƒ‚‚€€€~~~~}}}}}|||{{{{{{{zzzzzzzzzzzzzzzzzzz{{{{|||||}}~~€€‚‚‚‚ƒƒƒƒƒƒ„„„„„„ƒƒƒƒƒƒ‚‚‚‚€€€€€€~~~}}}}}|||||||{{{{{{{{{{{{{{{{{{{||||}}}}~~~€€€‚‚‚ƒƒƒ„„„…………………………††††††………………„„„„„„„ƒƒƒƒ‚‚‚‚‚€€€~~}}}||{{zzzyyxxwwvvvvvvvvvvvvvvvvwxxxyyz{{||}}~~€€€‚‚ƒƒƒ„„……††‡‡‡‡ˆˆ‰‰‰‰‰‰‰‰‰‰‰Š‰‰‰‰‰ˆˆˆˆ‡‡††……„„„„ƒƒ‚‚€€~~~}|||{{{zzzzyyyyyyyyyyyyyyyyzzzz{{{{{|||||}}}~~€€€‚‚‚‚‚ƒƒƒƒ‚ƒƒ‚‚‚‚‚‚‚‚€€€€~~~~~~~~~}}}}|}}|||}}}}}|}}}}}}}}}}}}}}}~~~~~~~~~~~€€€€€€€€‚‚‚‚ƒƒƒƒƒƒ„„„„„……………………………………„„„„„„ƒƒ‚‚‚‚€€€€~~~~}}}||||||{{|{{{{{{{{|||||||}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~}}}}}}}}}}}}|}}}}|}}}}||||||||||{|{{||||||||||}}}~~~~~€€€€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„ƒƒƒƒƒƒƒ‚‚‚‚€€€€~~~~~}}}}}||||||{{{{{{{{{{{{{{|||||||||||||}}}}}~~~~€€‚ƒƒƒ‚‚ƒƒ‚‚„……††„ƒ€€‚ƒƒ‚‚ƒ„……„~||~€€}}~€ƒƒ‚{xwz}~{{~ƒ„ƒ€{wvy~€||~‚…‡‡ƒ~ywz~ƒƒ€…‰ŒŠ†€||€…‡†‚‚…ŠŽŒ‡}|~ƒ†„€~‚†Š‹‰„~ywz~‚}z}‚†ˆ†ztsuz~~yvz€„†…xqoqw||vsv}ƒ‡…wolow}}vru|…ˆ‡‚zroqv~€{tt{„ŠŒˆytty†‚yw}‡‘Žˆ€zy|ƒŠ‰€y}‡“‘Š‚|{~„‹Š€y{„’’Œ„|xy~†Šƒwt|ˆ‘Œ‚xssyƒ‡~rpz…‹‚xpnr{„ƒwnoy„Š€unpyƒƒwnr~ŠŽ†|tpsz„‡~sqxƒ‘‡|utz„‰ƒwt{‡“ˆxw|…Œ‡{v|ˆ‘”‡~xw|„‹ˆ}v|‡“‘‰€xvy‰ˆ~tv€Š‘’ƒxppw†~rox„ŒŽŠ€umkq{‚|qlr~ˆ‹ˆ€ulkq|‚{pmuŠŒ‰wppv€…~trz„ŒŽ‡wux€‰ˆ€y{…Ž”•†}y{ƒŒ„|~ˆ’—–‘ˆyy€ˆŒ‡}y‰“‘Š€wrt|…„{su~ˆŒ…{qlnx€~tlpzƒˆ‡xojks|~vmmvˆ‰…|smmt~ƒ}rqz„ŒŒ„{tsx‚ˆ†|uz„Ž“’Œƒzux€‰Šxx‚Œ“”†|uu|†‰‚wv~‰‘Œ„zsrx‚‡‚wrxƒŒ…{sot}…ƒxqu€ŠŽ‡}tnpyƒ„{qr|‡ŽŽŠxpov€†‚wrw‚ŒŽ†{rpw‚†ut}‡Ž†}uqt}…„{tw‚Œˆ~uqt|……}uv~ˆŽ‹‚xrryƒ…~uu~ˆ‹‚xqqw…vt|‡Ž„yrpv€†‚xsx‚‹‰uprz„†}tt~ˆŒ„zrryƒ‡€vt}ˆ’Ž…{ts{…‰wv~‰‘“‡}usyƒ‰„yu{†“‰vswˆ…{uz…Ž’‰~urv€ˆ†{tv€ŠŠwpqx‚…}rqz…ŒŽŠvnmt~ƒ|qox„Œˆummt~ƒ|rovŠŒŠwoms}ƒ~sowƒŒŒ„yqot~…wrx‚‹Šxrs{„‡€vu~‰’Ž…{tsyƒˆ‚wu|ˆ’‡|tryƒˆ‚xu|‡’ˆ~urv€ˆ†|ux‚‹‘‘Œ‚xrs{…†|suŠ‹‚wpqyƒ…}trz…ŒŽ‡}tprz„†}stŠŠ~urw€‡„ysx‚‹‘Œƒyst{…‡€ut~‰’„zssyƒ‡vsz…Ž…zrqxƒ†~sr{†‹ƒyqpv€…tqxƒ‹†|spt}†„zrv€Š‹wrt|…‡~ut~ˆ’ކ|tszƒˆ‚wu}‰’†{sryƒˆwu|‡‘ކ{sqv€‡‚wrw‚Љ€vpr{„„zrt~ˆŽŠ€unpy‚„|rr|‡Ž‹‚xpov€†€vqy„Œ…zrpv€†€uqz…Œ„zqot†vqxƒŒŽ†|sos}…ƒxqv‹Ž‡}sor|…„zsu‰Ž‹‚xqqx‚‡wt|‡’‡|trx‚‰…ztz„Ž“’‹wsw€ˆ†|vy„’“Ž…{tsz„ˆƒyu|‡“‰~urwˆƒytz…Ž‘ˆ}tpt}…„{tvˆŽŒ…{spu€†€us}ˆŽ‰uopx„}tsz„‹ŽŒ…{rnr{„‚xruˆŒˆunnv€ƒ{qq{†ŒŒˆ~tmnv€ƒ{rqz„‹ŽŠƒypou…€vryƒŒ‰upt~†…{tx‚Œ‘‘‹‚xsu}†ˆ€wx‹’’ކ|uu}†‰‚xx‚Œ’“†|vu|†Š„zx€‹’”ˆ~usx‚‰†|vz„’‹vqs|……|tt~‡ŽŽŠwoou€„}spxƒ‹ŽŒ…zqnr{„‚yru€ŠŽˆ~tpt}†„zswŠ‹‚yrsz„‡€vu}ˆ‘„yrqx‚‡vs{†Ž„zrou†wqv€‰Žˆ~tmoxƒzpqz…Œˆ€unmu„}rpy„‹ŽŒ„zqpu†‚xrv€Š‹‚xrt|†‡~tu€‹‘’ƒysu}‡‰€vv€‹’“‡}vuzƒ‹ˆ~vx‚Œ“”Ž„ytw€‰ˆ}u{†“‘Šxrs{„‡ut|‡ŽŒ„xpov€…uqxŠŽŒ†|snpz‚wptˆŒ†|rnqz‚‚yrt~ˆŽ‹‚xss{„‡‚xv|‡“’Š€xtx‰‡}vy„’’ƒyst|†ˆvv‹‘‹€vqt}†…{sv€Š‰~uor{„„zrs|†ŽŠ‚xpou€…tpw‚‹Ž…{rpu†‚wrwƒŒ‰uqt}†‡~tu~‰‘…{tszƒ‰‚wt|ˆ’ކ{ssyƒ‰ƒxtz†Ž‘‡}tqv‡…yrw‚Œ‘ˆ}sos}†ƒxqvŠŽˆ}snqz„„zqr{†ŽŠwoow„|sr{†Œ„zrpv†wsz„ޑކ|trw€‡…{uyƒŒ’’„ztu|…ˆww‰“†|tsy‚‡ƒyv|†Žˆ~ups|„…|tv€ŠŽˆ}snr}„wqvˆˆ~tnpxƒzqr{†Œ‰€voou…vqw‚‹†}tqv€‡„ytyƒ’‘Œ‚ytvˆ‰€wx‹’“†|utz„‰…ytz„Ž’Š~uqu~‡†zrt~‰‹‚wppxƒ†|qoy…Œƒxpnu€†€tot€‰ŽŽ‰uprz„†}rq{†Ž‘†|tryƒ‰…ysxƒ’“ƒytv~ˆŠ‚wu|‡“‘Šwsx‰‡}tw‹’ƒxrt|†‡}st}ˆŽ‹‚wpov„~sov€‰ŒŠ„zployvnq{…‹Œˆ~tnov€„}spw‚ŠŽ‡}sos|…„zrv‹Švqt|†‡~tuŠ‘’Ž…{ts{„‰ƒyv}‡“‘‹wsw€ˆ‡}uxƒŒ‘‘‹wrt}††}tv€ŠŒƒxrry‚†€wsx‚ŠŠxqrz„…|tv‹Žˆ~uqt}……}vwˆŽ„{tsyƒ‡xv|†Žˆ€wrt|„„|uw€ŠŽŽˆuorz‚ƒ|tt}†Œ‰€vppxƒ}ut{…‹‹„zrpu„€wsyƒŠŒ†|tqu}„ƒzuz„އ~vtyƒˆ„zw}‡’‘Š€xuzƒ‰†}w|…’‘Œƒysu}…‡vu}‡Ž‹‚xqqx‚„{rrz„‹Œ‰‚xpou~ƒ~tpv€‰‹Š„{ros|ƒwqv€‰‹…|tpu~…‚ysw€‰ŽŠxsu|…†~vxŠ‘„ztt{…‡€wv}‡ŽŽ‡}urv†‚ytw€‰ŽŽ‰€vpszƒ„{tt|†ŒŽ‹„yrpw€„usz„Œ…{sqv€†‚xtxŠŠwrt|…†~vwŠ‘Œƒyst}††~vw€ŠŒ„zsrx‡ƒyswŠˆ|rou…~sr{†ŒŽŠ‚xpns~ƒupu€‰‹„zpns}„wqt~ˆŽˆupr{„…{suŠ‘…{tt{…‰ƒyv~‰‘”‘ˆ~vv|†Œ‡|w|†””Ž„ztw€‰‰€ww‹‘’†|tszƒ‡€vt|‡ŽŒƒxpqyƒ…|ss|‡‹‚wppw…~trxƒ‹Ž†|sos}…ƒyrvЉ~ups|……|tv€Š‘Œƒxrs{…‡€vu}‡Ž‘‡|sqv€‡ƒxsxƒŒ…{rns}„vquˆŒŒ†|rmpy‚‚wpr}ˆŒ†|rnr{„ƒyruˆŽ‹‚xqqx‚‡‚xtz„Žˆ~urv€‡„yty„‘ˆ~urw‡ƒytz„‘Šxrt|…‡€wv~ˆ’ކ|tsyƒˆ‚wu|ˆ’ކ|tryƒˆ‚xu{…‘‘‹‚xrsz„ˆ€vvŠ‘Œwru‡„ztwŠŠ‚xqqx‚…|st}ˆŽ‹‚xqpu…wrw‚‹Ž†|spu†‚wsyƒ‹†}tpt|„ƒzuyƒ‹Šwrs{„†wwˆŽŒ„zrpv…yuy‚‰Œ‡~tpt}ƒxuz‚‰‹Šƒzsqu~ƒxv|ƒ‰‹Š…}vtw…„~{~„ŠŽŒ†~yy~…ˆƒ~„ŠŽŒ†~yy}„†ƒ~~†Š‹Š…yvy~‚‚}z|€„††ƒ}wstz~~zwy|‚{vrrvz{ywwz}€}yvvx|}|{{}‚€~|{}€€‚ƒ„„„‚€€‚‚‚‚‚ƒƒ„„„ƒ‚‚‚‚€€€€€~~~~~~~~~~~~~~~~~~~~}}}~}}}}}~~~~~~~~~~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~~}}}}}}}||||||||||||||||||||}|}}}}}~~~~~€€€€‚‚‚‚ƒƒƒƒƒ„„„„„„„„„……………………………………„„„„„„ƒƒƒƒ‚‚‚€€€~~~~~~}}}}||||||{{{{{{{{{{{{{{zz{{{{{{{{{|||||||}}}}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€~~~}}}|||||{{{{{zzzzzzzzzzzzzzzzzzzzzzz{{{{{{||||}}}~~~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚ƒƒ‚‚ƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€~~~~~}}}}}}}|||||||||||||}}}}}}}}~~~~~~~~~~~€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒ„„„„„„„„ƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~~~~}}}}}}}}||}}}}}}}}}}}}}}}~~~~~~€€€€€€‚‚‚‚€€€€€€€€~~~~~~~~~~~~~~}}}}}}}}}}}}}}}||}|}}|}||||}}|}}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚ƒ‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~}}}}}}}}}}}}}}}|}}||}|||||||}}}}}}}}}}}}}~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~}}}}}}}}}}|||||||||||||||||||||||}}}}}}}}~~~€€€€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€~~~~}}}}|||||||||||||||}}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}|}}||}}}}}}~~~~~~~€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~}}}}}}}}}}}}}}}}}}~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~}~}}}}}}}}|}}||||||||||||}}}}}}}~~~~€€‚‚‚‚‚ƒƒƒƒƒƒ„„„„…………………†††††††††††††††………………„„„„„ƒƒƒ‚‚‚€€€€~~~}}||}|||||{{{{{{{{{{{{{{{{{{{||||}}}}}}}~~~€€€€€€€€€€€€~~~~~~}}}}}}}}}||||||||||||||||||||||||||}}}}}}}~~~~~~€€‚‚‚ƒƒ„„„„……………†††††††††††††††††………„„„„ƒƒƒƒ‚‚‚€€€€~~}}}||||{{zzzzyzyyyyyyyyyyyyyyyyzzzzzz{{{{{||||}}~~~€€€‚‚‚‚ƒƒ„„„……………††††‡‡††‡‡††‡†††††……„„„„„„„ƒƒƒ‚‚‚€€€€€~~~~~~~~~~~}}}}}}}}|||||||||||||||}|}}}}}}}}}}~~~~~~~~~~~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~}}}}}|||||||||||}|}}}}}}}}}}}}}}}}}}~~~~~~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}|||}}}}}|}}}}}|}}}}}}}}}}}}~~~~~€€€€‚‚‚‚‚‚ƒƒƒƒƒ„„„„„„„„„„„„„„„„„„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€~~~~~~~}}|}||||||||{{{{{{{{{{{{{{{{||||||}}}}}~~~~~~€€€‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒ„„„„„„„„„„„„„„„„„„„„„ƒƒƒƒƒƒƒ‚‚‚‚€€€€~~~~~~}}}}}||||||||||{||||||||||||||||||}}}}}}~~~€€€€‚‚‚‚‚‚‚ƒƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~}}}}}|||||||||||||||||}}}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€~~~~~€€€€€€€€€~~~~€€€~~~~€€~~€€€€‚ƒƒƒ~~€€€€‚ƒ„ƒ}|}€~ƒ…„‚|zz}€}}€ƒ…†…‚}yxz~€~|~‚†ˆˆ…€{xx}‚ƒ~~‚‡Š‹‰„{{~ƒ†„€~‡‹ŒŠ…|{}‚…ƒ}{~„ˆŠˆ„}xvw{€|wx~„ˆ‡‚{soqv}~yssz†‡„|tnnrz|tpu}„ˆˆƒ{sopw{tsz‚ŠŒ‰‚ztty‡„zv{…‘Žˆ€{z}„‹Šz|„““އ€||ˆŒ‡}z€Š“ˆ€zx|ƒˆ†|x|…Œ†~vsuz‚„~vtzƒŠŒŠ‚xpns|€zrry‚ˆ‰†~vompx~}vps{ƒ‰‰…|tpqw€ƒ}utzƒ‹ŽŒ…|vv{ƒˆ„{x‰’ˆ€{y}„‹Š‚|‡•”‡z{‰‡~z€Š’”’Š€xuy‚ˆ…ztyƒ‹†}tnpx‚yppyƒŠŠ†|rklt~xnnw‚‰Š…|smnu‚{qpxƒ‹Šƒzsqu~†…|ux‚‹’‘Œ‚zux€‰‹‚xy‚“”‡~wv|†‹†{w}‡’Š€wrs{„†}tt~ˆˆunnu~‚{row‚‰‹‡umlr|‚}sov€Š‹„zqnr{ƒ‚ztwŠŠ‚yst{„ˆƒzw‰‘“ˆxv{…Ї}x~‡”“Œƒzuw€ˆ‰xzƒ’‘Œƒyst{„‡€wu}‡ŽŠxppw…~trz„Œ‰€voms~ƒ~tpw‰Œ‹…|snow„}ts|‡ŽŽ‡}sot}…ƒzsvˆŽ‹‚ysqw†wt{…†|tpt|„…|tu~‰Ž‰~ups|„ƒyru‰ŽŽ‰€vpqx‚…}ts}‡ŽŒƒyrqx‚‡wt|‡’ކ|tsyƒ‰„yu|†“‘‹xtx‰†|v|‡”’‹wtx‰‡~vz„Ž“’Œ‚xtv~‡ˆ~uv€Š’ކ{tryƒˆ‚ws{†Ž‘ކ{spu†ƒxqu€ŠŽ‡}snqzƒƒypr|†Œˆ€unnv€ƒ{qpz…‹Œˆ€vnnt}ƒ~sovŠŒŠ‚xons~„tpw‚ŠŽŒ„{rot}„‚xrvŠŽ‰€wqs{„†~tu‰‘Œƒyrs{„‡€vu~‰’ކ{tszƒˆwv~‰’Ž…{tsyƒˆƒyu|‡’‰~usx‚ˆ…ztz„’‘‹wru‡†}uv‰‘†{sqv‡vt~‰‰upt}……|tt}‡Œ…{sqv€†vrz…Œ…{ros|„ƒxqu€ŠŽ…zqns}„vpu‰Œ†|rnqzƒ‚xqt~ˆ‰€wppw…~us{†Ž…{srx‚‡ƒyu{†Ž’‰wtyƒŠ…{w~‰‘”‘Š€xuz„І|w}‡“‘Š€wtw‰‡}vy„Œ‘’Œƒyrt|…†~uv‰Ž‹‚xqpw…~urxƒŠŠƒypnt~„€vqw‰‹„zqns~„€upw‚ŠŽŽ‡~uprzƒ…}tu~‰Šwqs{…†}tuŠŠwqryƒ†~tsz„Œ…|sos|…„zru€ŠŽŽ‡~tor{……zrt~‰‰vpr{„…}ss|†…|sqv€‡„ysxƒ‘‰~urwˆ…{uy„‘‘‹‚xsu}†ˆ€wu}‡‘‡}trxƒ‡vwЉ€wrsz‚…xw~†Œ‹„{tqw€„€xw}…‹‹…|tqt|‚€zv{„ŠŒŠ‚zrpt|~xvz‡‹Š„|tpszyux†ŠŠ†~vqqv}€|vv|„Š‹‰‚ztrwƒ{z~†‰€xvzƒˆ„~}ƒ‹’”‘Šzx~‡‹‡€}ƒŒ’•“Œƒ{wz‚Љz{„’‘Œƒyst|…†}tu~ˆˆunnu~‚{qnu€ˆŠ‡€vmjoy€}smq|†Š‰‚xomr|ƒupuˆŒŒ‡~uqt|……|tv‹Š€wsx‚‰‡|uz„’’Œƒzux€‰‰€ww€Š‘“‡|utz„‰ƒxt{†Ž‡|spu†‚wqw‚‹‹ƒxpnt~ƒ~souˆŒ‹†|snox‚‚zpq{…Œˆ€voqy‚„|ss}‡Ž‹ƒzssy‚ˆ„zuz„Ž’‘‹€wtz…Š„zx‚““ކ}vv|…‰…{w|‡’‡}usyƒˆ‚xt{…Œ†}tpt}„xsxƒ‹Šwpot~ƒ~urx‚‰ŒŠ‚yqos|ƒysv‰ŽŽ‰€xrs|„…}wy‚ŒŠ‚ytv~‡‡xzƒŒ‘‘Œƒztv~††~xzƒŒŠ€xsu~†„|vy‚‹Žˆ€wrs{ƒ…}vv~‡ŽŠxqqx‚„}uu~ˆŽŠxqrx‚…~vu|†Ž‹ƒzrpu~…wrxƒ‹Ž‹ƒyqpv€…€vryƒ‹ŽŒ†|tpt}…ƒzsw‹ˆ}tpu‡„ztx‚‹‰€wrt|…†vt}‡Ž‘ކ|trw‡„ytz…Ž’‰~vswˆ…{tz…Ž’ˆ~urxˆ…ztx‚‹‹‚xrs{„†~tt}‡ŽŒƒyqqx‚…~ts{†‹ƒyrpu~…ƒyru~ˆŽ‰upt~…‚wry„ŒŒ…|spr{ƒƒzrs|†ˆuopw„}sryƒ‹ŽŒ†|sps}„ƒysxƒŒŽ‡}tqt}…„{tv‹Š€wqs{„‡€vu|‡‘Ž…{srw‚‡‚xu{†Ž‘ˆ}tqv€‡„zty„Ž’ˆ~tqu‡„ztyƒŒ‘Š€wrt}…†~vw€Š‘„{tsy‚‡„zv|‡’‘Š€wsw€‡†|vz„ŒŠ€wrt|„„|tu}‡ŽŠ‚yqot}ƒvqwŠŒ…{rnr{‚xru~‡Œˆvpqxƒ{st}†ŒŽŠ‚xqpv„€wtyƒ‹Žˆ~uqs{ƒ…}uu}‡ŽŒ„zrqw…€wt{…އ}tpu~…ƒytz„އ~uqt}…†}vvŠ’„zrrxƒˆ‚wt{†’‡}tqv€ˆ„zty„‘Œƒyrrx‚‡‚wt|ˆ‘Œƒxqr{…†~tt}‡…|tps|„ƒzsw‹†}tps{ƒ„}vv‰Šwqs|……|vx‰Ž‹ƒzsrx…€xv}‡Œ…|tqv~„‚zv{„Œ†}uru~…ƒ{w{„‹Žˆ€xsv}…„}x|„Œ‰€wsu}…„}y|„Œ‰xrt{‚„~xx~†ŒŽŒ…|tpt|‚zux‰ŒŒ†}torzztv~†ŒŒ‰xqpvƒwuz„‹ŽŒ…|tpt|ƒxsxŠŽ†}uprz‚ƒ{tv‰ŽŽ‰vpry‚„|tu}‡Ž‹„zsqv~„€xuy‚ŠŽ‡vpqx€‚}vv}†ŒŒ…|trv~„‚|x|„ŒŠxsv}„…z|„‹Œ…|vty…|{€ˆŽ‘‰€xtw~„„~{~…Œ‹ƒ{uu{‚„€|{€‡ŒŽŒ†~vrt|zx~†‹Œˆ€xqot{}xvz€‡Š‰„|snpw~~yvy€‡‹Š…~uopv}{vx‡‹‹†~upqw}xy‡Œ„{tqv„{x}…‰€wqrzƒ…~xx‰‘…{sqw†yw~‡’‡}trx‡ƒzx~ˆ“‰wtxˆ…}x}‡”’‹xtx‚‰ˆ~x|†“’Œƒysv€ˆ†}wz„Œ‘Š€vprzƒ„|tt|†Œ‰€vnmt}{rpw‚‰‹‡~sllt~ypow‚‰‹ˆ€woms}ƒ~tqy„‹wpqxƒ†vu}‡Ž…{srw‡ƒyu{…Ž’ˆ~uqu‡„ztx‚Œ‰vprz„…|tu~‰Š€vprz„…}tt}‡ŽŒ„zrqx‚†€vt|‡Ž‘…{sryƒˆxv~ˆ“ˆ~vtxˆ‡~wz‚Œ’“Ž„ztw€ˆ‡}x~ˆ“Š€xst|„†€xw‰Š€wprz‚ƒ|tu}†‹Šwpnu‚{ss|†‹‹…|smnv~{sryƒŠ‹ƒzqpu~„€xtz„ŒŽ‡~vrw€‡„{w|…‘‹‚ytv~‡ˆyz‚‹‘‘„ztu|†‡€yzŠŽ‹ƒzst{ƒ…~xx‡‹Œ‰‚xrpv~ƒ~wuz‚‡‰‡xqot}~wuy€†ˆ‡‚{tqt{€zwz€…ˆ‰†zuu{‚„€{|‡‹‹ˆ‚|xy~„„}~‚†‰Šˆ…zy}‚„~~„‡ˆ†ƒ~{z}‚~~‚„„„‚|z{}~|}~€€~|{{|~~}}}~€€}}}}~~~€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~}}}}|||||||||||||||||||||||}}}}}}}}~~~~~~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~}}}}}}}}|||||||||||{||{{{{{||||||||||||}}}}}}}~~~~€€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€€€€€€€€~~~~~~~~€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~~~~~~~~}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}}||||||||{{{{zzzzzzzzyzyyyyyyyyzzzzzz{{{{|||}}}~~~~€€‚‚‚‚ƒƒ„„„„„……………††††††††††††††††††…………„„„„„ƒƒ‚‚‚‚‚€€€~~~~~~~~}}}}}}}|||||||||||||||||||||||}}}}}}}}}~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~€€€€€€€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€~~~~}}}}}||||||{{{{{zzzzyzyyyyyyyyyyyyyzyzzz{{{{||||}}}~~€€‚‚‚ƒƒƒƒ„„…………††††‡‡‡‡‡‡‡‡‡‡‡ˆ‡ˆ‡‡‡‡‡††††……„„„ƒƒ‚‚€€~~}|||{{zzyyxxxxxwwwwwwwwwwwwwwwxxxxxyyzzz{{{||}}}}~~€€‚‚ƒƒ„„„………††††††‡‡‡‡‡‡‡‡‡‡†††††††……„„„„„ƒƒ‚‚‚‚‚€€€~~~}}}|||{{{zzzzzyyyyyyyyyyyyyyyyzzzzzz{{{|||}~~€€‚‚ƒƒƒƒ„„……………†††‡‡‡‡‡‡‡‡‡‡‡‡††††††††††………………„„„„„„ƒƒƒ‚‚‚€€€€~~~}}|||{{{{zzzzyyyyyxxxxwwwwwwwwwwwxxxxxxyyyyzzzzz{{{||||}}}~~~€€‚‚ƒƒ„„„…………†††††††††††††††††…………………„„„„ƒƒ‚‚€€€€€~~~}}}|||{{{{zzzzzzzyyyyyyyyzzzzzz{{{{||||}}~~~€€‚‚ƒ„„………†††††‡‡‡‡‡‡‡‡‡‡‡‡††††††…………„„„ƒƒ‚‚‚€€€~~~}}|||{{zzzzzyyxxxwwwwvvvvvvvvvvvvwwwwwxxxxyyyzzz{|||}}~~€€‚‚ƒƒ„„………††‡‡‡‡ˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆˆ‡‡‡‡‡††††………„„ƒƒƒ‚‚‚€€€~~}}}||{{zzzyyyyxxxxxwxwwwwwwwxwwxxxyyyyyzzzz{{|||}}}~~€€‚‚‚ƒƒƒƒ„„„„„………………………………………„„„„ƒƒ‚‚‚‚€€~~}}}||{{{{zzzyyyxxxxxxxxxxwxxxxxxyyyzzz{{|||}}~~€€‚‚ƒƒ„„……††‡‡ˆˆˆ‰‰‰‰ŠŠŠŠŠŠŠŠŠŠŠŠ‰‰‰ˆˆˆˆ‡‡‡††……„„ƒƒ‚€€€~}}||{zzyyxxwwwvvvvvuuuuttttuuuuuvvvwwxxyzz{||}~~€€‚‚ƒ„„„………†††‡‡ˆˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆˆˆ‡‡‡‡†††……„„ƒƒ‚‚‚€€€~~}||{{{zzzyyxxxxxxxxwwwwwwwwxxxxyyyyzzz{{{||}}}~~€€€‚‚‚ƒƒƒƒƒƒ„„„„„„„„„„„„„„„„„ƒƒƒ‚‚‚‚‚€€€€€~~~~~~~~~~~~~~}}}}}}}}}}|}}}}}}}}}}}}}}}}}}}}}~~~~~~~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€€~~~~}}}|||||||{{{{{{{{{{{{|||||||}}}}}~~~~~€€€‚‚‚‚‚ƒƒƒƒƒƒ„ƒ„ƒ„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€€€€€~~~~~~~~~}}}}}}}}}}}}}}}}}}~~~~€€€€‚‚‚‚‚‚ƒƒƒƒ„„„„„„„„„„„„„ƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€~~~~}}}||||{{{zzzzyzyyyyyyzzzzzzz{{{{{{||||}}}~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~}}}}}}}|}}}}}|||}}}}~~~~€€€‚‚‚‚‚‚ƒƒƒƒƒ„ƒ„„„„ƒ„ƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€‚‚‚‚‚‚ƒ‚‚ƒƒƒƒ‚ƒƒ‚‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~}}}||||||{{{{{{{{{{{{{{zz{{{{{{{{||||}}}}}}~~~~~€€‚‚‚ƒƒƒƒ„„„…………………………………………„„„„ƒƒ‚‚‚‚€€~~~}||||{{{zzzzyyyyyyzzzzz{{{{||||}}}}}}~~~€€€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚€€€€€€€~~~~~~~~~~~~~~}~~~}}}}~~}}}}}}~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€~~~~}}}}||||||||||||||}}}}}}}~~~~€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„ƒ„„ƒƒƒƒƒƒƒƒ‚‚‚‚‚€€€€~~~~~~~}}}}}}}}}}}}}}}}}}}}}~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~~~}}}}}}|||||||{{{{{{{{{{{{{{{|||||}}}}~~~~€€€‚‚ƒƒƒƒƒ„„„„„………………………………………„…„„„„„„„„ƒƒƒƒƒ‚‚‚‚‚€€€~~}}|||{{zzzzzzyyyyyyyyyyyyyyyzzzzzzz{{|||||}}}}~~~~€€€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ„„„ƒƒƒƒƒƒƒ‚‚‚‚‚‚€€€€€€€€~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~€€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚‚‚‚€€€€€€~~~~~~~}}}||||{{{{zzzzzzyzzyyyyyyyyyyyzzzzz{{{{|||||}}}}~~€€€€‚‚‚‚ƒƒƒƒƒ„„„„„„„……………………………„„„„„„„„ƒƒƒ‚‚‚€€€~~}}||||{{{{{{zzzzzzzzzzzzz{{{{{|||}}}~~~~€€€‚‚‚ƒƒƒ„„„„„………††††††††††††††††††……†………„„„„ƒƒƒ‚‚‚‚€€€€~~}}}}|||{{{zzzzyyyyyxxxxxxxxxxxxxxxxxyxyyyyyzz{{{||}}}~~€€‚‚ƒƒ„„……†††‡‡‡ˆˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰ˆˆˆ‡‡‡†††……„„„„ƒƒ‚‚€~}}}|||{zzzyyxxxwwwwwvvvvvvvvvvwwxxxxyyzz{{|||}}~~€€€‚‚‚ƒƒƒƒ„„„„„„„„…„……„……„„…„„„„„„„ƒƒƒ‚‚‚€€€~~~~~~}}||||||||{{{||||||||||}}}}~~~~~€€€€€€€€€€€€€€€€€€€€€€€~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}~~~~€€€€€‚‚‚‚‚‚‚ƒƒ‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ„ƒƒƒƒƒƒƒƒ‚‚‚‚‚‚‚‚€€€€~~}}}||||{{{zzzzz{{zz{{{{{{|||}}~~~~€€€‚‚‚‚ƒƒƒƒ„„„„………………………††††……………………………„…„„„„„ƒƒƒ‚‚‚€€€~~}}||{{zzzyyxxxxwwwvvvvvvvvvvvvvwwwwxxxyyyzzz{{{||||}}~~~€€€‚‚ƒƒƒƒ„„„„……………†††††††††††††††………………„„„„„„ƒƒ‚‚‚‚‚€€€~~~~~~~}}}}}}||||||||{{{{{||||||||||}}}}}}}~~~~~~~~€€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€€dclock-2.2.2/sounds/bell.wav0000644000175000017500000006526007014302254016364 0ustar bdefreesebdefreeseRIFF¨jWAVEfmt ++datai€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~~~~€~}„™¯Ðíîæ·‡€}‹–sM,)Mbt‚Ž‘‘Š–¡£¤£Ÿ€cky¤°·¾½D75Rq€Œ’’jB63d™Èì®f12d|Š„iSj‰ºçòò½T0Nu‘«³´£ŒlPDAo¢Òô¯`,>n Ê轈U*7OŒÇÏÉRC=AM¹Õå·‡ƒ…–¨°µ«›sL3$:YÜØÄ{3 GˆÃð½}C"Iw¸ñíÙ…2&*l³ËØ«xg[TUr•Íûà¸w7!H®Ò¢i5 +m±ÞûÌ’PjºÜïÁ‹\4=R”Õç뺂aEAE[v›¼¸¬u?>I‹Ê¼¡qC3*8N²»º’gA#Hv»øÝ´i![¡ÆãÝϱŽY,Gn£Ò¼œtM5%6P…¶ÁÀ—iI0Kk„™–ŽhB/(k³ÝüåÄ“aNFo›§­ v]I=^„¯ÕÓÅ„@-%9R\hŒ¬Ÿ‹dA\}¥ÈµšpHP^tŠ”œ—sˆ ·É´•rL-8Lo‘¡¬¦™uSGCZv–±£Œ_3!2VœÝÝÏœhioƒ—œ–Œƒ{sp†Ÿ¼Ñ³pTPQ]l|ˆ~p[G4)Lw·îÞ¿v.@tžÂ¿²lTEs§ÑòÚ¹›|dPUa{”’‹{jgh{‹…wgN900`’±Æ§‚R(;Yžáèá®uF*C€¾ãüÝ´t8C[‡²­¡ŽxS0"R‰¬Å«Š_8CW} ¦¤{N' :r³íóì²r<>v°ãàÑ›a; Gx°ã䨣jG,-6Kd„Ÿ„c>!Jy À°˜qKBBf¯ËÀ­vCOg¦ãôùË“L7jžµÄ¶žl;13_°ÇªƒO0W“Êij…X]jŒ¯¾Æ¨…[8IeŸ×åæ´|bPgƒ—§¡”pK4%.>c‰®Ë¯‹eBBHVgzЉ…p]WYŒÁ×㼑ƒy‚Žš¤™‰pY_j‡£´¾«’sVE:ALavwukaVNT_…ª·¼¡_B>Cq¢ÂÚ¤Œw‰Ÿ°¼¬—Œ€lYSSjƒˆŠwohffhkorngK2/6e—ÂäÑ´†Z_lЍ³¹§rV]l“ºÅʹ¢|m`WQYdkqcUTWeu„‘š~]B.Hi‘µ¬›pITiÑêùÙ¯xE<>dµÓ¾ŸrIQb~›¢¤”Y4 &J}«¨œyWTYzœ¸Ì«‚Q&3L‡Ãã÷Ó¦|We|¦ÍÍÂX7.Grž±»¡eK<4Ib}“€gF+=XŒ¿ÎÕ»œ€gmyŸÂ¾±OGKµÛöÙ²|I;8Ni‘†uW:.*KrœÀ»«†_>$0F{®»À ~mc…«ËåÔ»Œ_NGl•§³œpbkxŠ›š“y\A*$'A`z’•’ƒrljx‰ž¯®¦‚_OIt¤ÄÝÍ·¢Œ‹Œ–ž”‡oXH>Ri’Œuic_bghifdb`XS[h‰«ÆÚϽ—rfay•¬¾«’w`p„œ²³¯žˆnTH@FNT[`eowz{vqŒycRFYr—¹»·£ŽŽ’¥·ÁĪŒjLKQlŠ—ž“„€{unhcefb]TKFEQ`~›ª´¢zizŽ ­™‚jWdx£ÍÜàÁœ}a`dzކjMA:Lczšž˜mM7)@]y’’zilv›ÂÙçʧzQT`…«²³—xh^v‘©»¬–tQ9(2BZr{{pfeh|Ÿ©‘uV=Nf޵ÇÒ¿§|‹ž´Å°”f<9?f£¯…lUV\k{€p^G33<[~ž¹ÂèŠoYfy™¶°¤€^Z_„­ÌåÔºbYWk~zbJA=Rj€“—•†taPMNZjz‰ŒŒ‡ƒ…‹ µËÛÇ­XRUu—¤«—€um{Œ›¥˜…b@51CXdolhikx†——”‰~rg_ep«¿ÍÀ¯˜‚‚‡œ¯§štO@9Qn‡ž—†tkdfigeZPQVbpu{‚‹­´µ¢}pz†—ˆ‚}Š˜«»·®”xdT[ekpbTPP_q}ˆ…ysqoie_\`i—§´­£ ©´¶³›‚kX_l‚—šš‹{vs€Ž‹sXC39ETemuŒ’•Œ|x‹“˜ƒthnzœ¿ÕâÉ©‡ikq‘ˆ}eOOTj–„ufa][ZURTXcpy‚Œ–ª¼ÅÇ®‘yfmy”­±¯”xnjˆ¨ÀаˆZ0-3Kfpwk^ZZiy‡”“Ž|h]UYbr„™¬´¹«œ“¥½ÌÔ±ˆZ36DqŸ·Å§‚aDO_{”‰yW6/.E_wŽ”–“ŽŒ‹‹Š†‚}zy{†“°ËÔÖ¸–w]j}”¦’yR/*.V£¾©‹d>;?Vosuj_dm“¢¯¶º·±£•ˆ}€†‘š—‘ƒvtv“°¿Æ sC'Oy‡ŽyaRH\t’¬§œ„kdbisx~†¢³º½³¨¡š—“ŠvlmqŒ‘p_Rar‡—€d='P{–«§ž“ˆˆŠ—‘‹†‚Š“–˜’Œ•§¸»¸¢Švd`^^_XRSVk€œŒw[BEOhƒtgkq‚•¢®³¶ºº³©•kY_kް»¿¤…o]hw‰xeSDDHR]`dio›£™‹vbaduˆ‘𠥝¸¸µ¤“ˆ€‹—¡§’yU56@mœ±½žy[@BIVdca]Zajyˆ“œš––—›Ÿœ˜‰‹Ž’ŠƒŒ—³ËÉ¿‘a=!1Jp”–lF5,Mt”°¤‘tWPNZjvƒ‹“¦®³³¯¨Ÿš”‹ƒzszƒ•¥Ÿ•w[WYz›¦©ƒY, TЧ¼¢ƒgO^sŒ£ ™Œ~}~…Ž— ¨°²±© —Œˆ„~n_PFSd†¥©¥|Q5"<\€ —‡c@:=dŽ®Éö£‹‰ˆˆ†…Œ“›¢¡Ÿ™’Ž‹‡vk`^^elhbQBHSyŸ®µ“lL1?Vxœ¨°¤–†©´°©¢š–’†zmclw‰™™”ƒqh`ad_ZPHMUkŠŽ~lfdz“¥´¨˜…rrv…–¡¬°±²±ª¢ygZes†—Œ}cKKPf}…‰}obWVY^dfjs}‘¤¯¶ª›…‹”›¡œ–“‘”—“…}~‚œ›”uS6 /Fl•’z_UN_r‚Œ‡}uvz„–›Ÿ¢ª°¯­¢—‘‚wmeq’¢›pPB9Oi‚–†oL,1>g’¨¸«˜†vvy„‘™  Ÿ››œœžžŸ‚rehmwseRBN]{—›™xT;)>Y‚¨­«Žqig±Â¾´¤’‡~ƒŒ•› —Œ€wpsx{|m\K=HWo††jTQTp¡¯Ÿ‹oW^k¯¾Ç¹§›‘“”••“‘…{rjjksz~€xn`TVZeplg[Q\k‡¢§§“}sm”§¸³©–„€ §ª¤›“‰€vj`^_itxzqh^UZao}|yl_agy‹’‹„‰ ¯²²¥—…‡Œ”›š–‡…ƒƒƒxme_hqtufVKDRcv‡‰ˆ~spoy„‹‘Ž”œ¥¦¦ž–––œ¡žš€xruyzyrkiirzytaMFDYqƒ’‰~pdhp…™¦®¦œŽ‚„ˆ’œŸ ¢££¡—‹€ux}‚†{naVZamywseXVWhz†qbWg{—±¶µ¤’ˆ‰“¦¦£œ”‡‚~…‹Š†udXOV_isni`Y_hyˆŒ‹{jdcz”©º¯Ÿ‹y‰°¶·«›‹{tou}…ŒŒŠ€tgZVU`ku{pcUKUbx‘‘…xz~ŽŸ¦ª›Œ‚{ˆ˜©·³¬›‰|„…‡ƒ}umfa^]bgpy{{n`UN[k|Œ‰…~x‚«¬©›ŽŠˆ“Ÿ¥ªžƒw|„˜”qh`][YY_fnutrjccetƒŽ–Žƒxnw‚•§¬­¦œ›Ÿ£ŸšŽ|x~„†‡~tninsttkb]Z^cegedipŽ—–Ž…}„Œ—¢ œ•Ž’—Ÿ§£ž•Œ‰†„ƒzqf\\_isvwphfdkqqphachxˆ‘˜“ŒŒ—£¬³«¢“…‚ˆ‘“•”‘މ„yohbeikld[TNXewˆ‹Šsqp|ˆŒ‰‚ƒ‡•¤¯·²ªŸ“Ž’ˆ~usqtvuttuz}xqaRLIUdq}|zvs}ˆ˜¦¦£•‡ƒ‚š £›‘‹”Ÿ¥ª¡”„sibaacfjnqtqlf`elw‚~ob\[l—¬¯¯¤˜——Ÿ§¤Ÿ‘‚~{„Ž’•ކ}~}zrjaYTQSV]ep{†Ž‰~sqs€Ž–›“Š„Ÿ¯¼¹±£“‡ˆˆ‚{pfdeoz†€ypfb_^__adhmsvy|€›ª¶±©•yu‚‘§£ž—’•˜™’‰{me_`cba]Z^er„‡wpkjklnsz†“¦¦¥¡Ÿ¢§«¤›‹{rmv€Š“‹ƒ{zywui^RHKQ]kqwxy~ƒŠ‘‘ˆ‡……††ˆŒ’¨²¹µ­ž‚xxxvtmeddluy|wrolnpmjaXVWds†˜¡§¤Ÿšš›˜”މˆˆŒ‘’’’•˜™™ƒsc[TUWY\^bjs}†‡…|snkpw|‚‚„¬¸¹·­¢›“މ€xrnrwˆŠ‹†€yqke_[WVWZ_fkpv}Š–¡ª¤œ‹ztr}Š• ¡¡ž›Ÿ¢¥¦Ÿ–ˆynfcbaabciow~‚~wpha\ZZajyˆ”žŸŸœšŸ£¨¬£™ˆysq|ˆ”žž›”Œ‰…‚}qeWKHIS_jty|~~€‚ƒ„…ƒ€zust~‹Ÿ²½Å½±Ÿ†€ƒ‡„vkhgp{…ŒŠ…{qjea_ZWTSYaqœ¢¤ ›“Œ‡ƒ…‡Œ‘’“’—¡«°°¢zdZTX_cgfehku…ˆ‚znc_^dls{€„‹“¦®³´²ª ’„xoqv‚ޕ𖉂~|zpeXLHHR^iuz…‰•”‘‡}uorx‚Ž˜¡¦ª¬¬«©£œ”‹‚yphb_chs†Œˆ‚xnhb`^ZXXZdp€˜   Ÿžž˜“‹ƒ~{€†‘›¢¦¥¢–ƒuh]UTUY_diotz‚ƒ}ytqnlkmq{‡—§³½»¶©›’‹‰‰†ƒ|uss{ƒŒ“’†|sjc\UPOPU]iu‚Ž–š™–‰‚}}~ƒ‰Œ‘“—œ§±¶¸¬ˆsh_`dgklmoqx„ˆ‚zna[WZ_fnt{‚‰“¦®±²«¢’ƒxos{‰—ž£ž—‘ŠŠŠ‹‰~p^NFCLYgu{‚‚„†‡‡yqjiks~‹™£¬¯¯«§£Ÿœ˜‘‰|pf`em|‹•›“ˆyjd_`a^[URW^m~Œ˜Ÿ›—“‹‡„€~ƒŒ—£­³µ®¤•†xkgdfihgc`djwƒ‹ˆ~ob\X\biqy‚—¢«°²­¦œ’‹†ƒ‚€~€…Š”——•…yiZOFHNYenw{~‚„ˆŒŒ†xqru}†Ž–ž¤«±´´­£”…xnjiknrw{‚ƒ‚€{vqkd^XTTV^ix‡”ž£¤¢Ÿš•އ€{|ˆ’™ŸŸžšš™•ƒvgYQLQYdpxƒ„„‚}xrlighkpu}‡’¦­¯®ª¥Ÿ™‘‰€wqmry†“™ž—Ž‚umfdb^[VRTYdp}‰‘––•‹…~zxy|€†Ž—¢«±´°©„ytqqrnjebfmzˆ’‰}m]UPTZclt|ƒŠ’™ ¥¦¤Ÿ˜ˆƒ~€…ŠŽ“–™œžž›‘…saTJLR^krwvtuv}ƒˆ‹…~sifemw…“ž¨­¯¯¬§¡™‡xsrrw}„Š‹‰„|xvtng\QKHQ]q…’œœ™“Œ‰†‡ˆ†…„ƒ…ˆŽ”›¢¨«©¥œ’†zofa^^`eku~„‰†€wnhcdgjnnops~‰˜§®³¯¨ž“Š‚~{|„Š•——•’Œ†~vng`ZWVX]cjr{„Œ‘“ކ{qmjpwŒ“™¡¤§©©¥Ÿ—Ž…|vpmklow†ŒŒŠ‚xmc\WWX]cksz‚‡Œ‘•šžœ”Œƒ|z{‚‹”¢¤¤¢Ÿš‘ˆ|pg`_`dikmoquy~‚ƒ‚|ulea`gp}‹—¢§ª¨¤Ÿš˜•‘އ|xz~…Œ’‹‡|vne[SONV`n}…ŒŒŠ‡ƒ‚‚„……„‚€€†˜¢«²±­¡”‡|vrqqonnotz„ƒyqkeeefhffgkuž¥ª§¡˜Ž†€€‚‡Œ””“’‘“•––ˆ{ncZXY^dinrv|…ˆ…vmigmt~‡‘”–™¢¦¨¨¢›ƒzqpqx€ˆŽŽ‡€ztqnjga\ZZ`hqz„ˆŠŽ‘““‰‚{yzŠ•Ÿ¤¨¦¢–‘‹†}xsnifefls{ƒ‚|ungdcdfjnu}†–œœœš—––•”‹†€†“˜˜–‘Šxnf`]^`diloqsvz~ƒƒ~{xxy|†•¤ª«ª¢˜‡ƒ}{yxy{~~~|xtoje`]\]bjt~†ŽŒ‹Š‰‰‹Œ‘’“””—šœ™“‡{pgdcfknqrstuvwusqnmnortvz}„‹“› ¤£¡˜’Œ‡ƒƒƒ†ŠŽ‘ˆ‚~zyxuqjb]Y[^emtz}€‚„„„}|~‡’—šœžŸŸŸœ™•Š…zuponrw}€~vnhccdfhijlot{‚‰Ž“•–––•“ŒŠˆŠ’–™›š˜”Š„}upkiiiihhggkpv|}}xsolnrw~ƒ‰”™ ¢ žš—”’Œˆ…‚‚„…„‚{wsmha\ZY^dlsx{||~€…‰‹Œ‹ˆ‡‡‰Œ•™ ¢£¢ž™‘ˆ{wutsrqppqrssqoljiiiihikow€Š“™œ›™—””””“’‘’’’‘Їƒ}vnfa]^`cgjmoruwxywuuuy}‚†Š“˜£§§¦ š”މ†ƒ€~~€€~{vqmigeca_]^`fmt{€…‰ŒŽŽŒŠŠ‹”™ŸŸžœ›š˜–Š‚zsnkihhhiknqrqokgedfimrv{€†Œ“˜Ÿ  Ÿžœ˜•Œ‹Š’“‘ˆ|wsnhc^ZZ[_cfjmptw{€€~}}~‚‡”™ž¢¥§§¥¡œ–’Ї‚~yussuwwxtpkeb_^^^^`dkrzƒˆŒŽ‘’”–––•”“”•—šœžœš•ˆvnifffffeeegjmopomljlosx|†Œ“𠦧§¤Ÿ›—”’ދЉˆ‡…‚~zvrnjd_YUVX^djptwz|‚„††††ˆŒ‘–›ž ¡¢£££¢—‡€zvsqpppqqqplieb``acefhkpv‡Ž•˜š››››š˜–”””–™›œš—“ˆƒ~ysmgb`^^_`behlprttsqpru{‡’—›Ÿ£¦§§¤¡™–’ŽŠ†‚€~~zvoid`][ZZ[]bhmsw{‚†ŠŽ‘‘‘‘“—œ £¤¥¤¢Ÿš”…~ytrpnligfegijjigeccdgkotz‰‘—œžŸŸœœœ›š—•”’’’Ž‹‡‚~xrkd^YXX\`dgiklnqtwz|}…ŠŽ“—›Ÿ¢¦©ªª¦¡š“މ†ƒ~|zxwurnjgca`__^]]^bhpy‡‹Ž‘’”•–—˜™š ¡¢ žœ™–’މ‚{smhecbbbcefhiihfeegkqw|…ˆŽ“™Ÿ£¦§¦£ ž›˜•’ŽŒŠ‡‚}wqlgc`]ZYY[^aehkpty~‚…††††Š•œ¡¥¦§¦¥¤¢Ÿ›–‘‹†}yuqnmklljheb_\\\]`cgmsz‡Œ’”–šœŸ¡ žœšššœœ˜”‰ƒ|vpjeb`_`_```acfikmopruy}‚‡Œ‘—œ¢§ªª¨¤ œš˜—•’ŽŠ…‚|zwsokgc`\ZWVWZ^djpuy|‚…‰Œ‘”—š ¢££¢¢¢¢¡™‘‰zurpnljhedcba`_^^`bfjmqtx~…Œ“™ž ¢¢¡¡ žœ››››š–’Œ†}yuqlga]YXXZ\^adgkortvwy{€†”™ ¢£¤¦¦¦¦£ œ—’Œ‡‚~zywvtqlga]ZYYZ[\]`cinty}‚†‹•˜›œœœ›Ÿ¢¥¦¦¤ ›–‹…€{wrnjgc_]\]^`ccdccegkoty~„Š–œ £££¢¢££¤£ —’Ž‹‰‡…‚}xslfa\YWWXZ]`acfhmrw|€„‡ŠŽ‘–š ¢£¦¨ª«©¦Ÿ˜’‹‡„‚|wrmheba`_^^]\\]^`diov}„‰‘”˜› ¡¢¢¢£¤¤£¡™”ŒŠ‡‚}vnga][[\]^^^_`acfimqv{€…‰Ž’–›Ÿ¤§©ª©¨¦¤ œ˜“‹‰‡„|void`_^^][YWWY]bhmrw|…‰“–™ ¤§¨©¨§¥¢Ÿœ˜“Š…€ztnhd````a`^[YYZ^bglpty}ƒ‰•™œŸ¢¥§¨¨§¥¢Ÿœš˜–“Œ‡{tnhc`^]\[ZXWWY]bhnrvxz~‡’˜›Ÿ¢¥¨«««©¥¢ž›—”‘Œ‡€zuoligeca^\YVUUW[aglruy}‡“™œŸ¡¢£¤¦§§¦¤¡Ÿœš˜”‡€xqlhecb`][YWWXZ]afimpsvy„Œ“š £¥¦§¨©©¨¦£ œ™•’Š…~xsnlifc^ZVRQRUY^cgkorvz~ƒ‰•š ¡£¤¦¨ªªª§¤ ›–‘Œ†ysnkhgeb_[WUTVY\`bdginsy€ˆ•šž¡£¤¥¥¦¦§§¦¤¡™•‘Œ‡‚|vpkgc_\XTRRTW\adghilou{‚‰Ž“—›ž¢¥¨ª«¬¬ª¨¤ š•‹†‚}yuqmiea]YVSSSVY\`behlsz‚Š”—˜›œ ¢¥¨©ª©¨§¤¡˜“‡{vqlgb^[YWVWWY[]_abdfkqxˆ”˜›ž¡¥©¬­­«¨¥¡ž›˜•Œ‡‚~ytoic]XUSSSTVY[^aeimry…ŠŽ’”—šž¤©­°°®«¨¤¡™”Žˆ‚|wsokgc_\YXWWWWWXY\`els{‚‰Ž“—šœŸ¢¦©«««©¦¤¡ ž›˜’Œ…~wqlfa\YVUUVXYZ[\^`eiouz„‰Ž“™ž£¨¬¯°°®ª¦¢Ÿ›™–’ˆ‚|wrnje`\XTSRRSTVY\bhov|…‰Œ”˜¢¦©«­­­¬ª§¤¡˜“Œ„}vpkheb_\ZXWWWWWXY\_ekry„Е𠦩¬¬¬«©§¦¤£¡Ÿœ˜“‡€ysmhc_ZWTRQRSVY\_cglqvz~‚†‹‘˜Ÿ¥ª­¯¯¯®­«©¥¡œ–Š…{vrnjfb_ZVSQPPQTW[`elrx„‰Ž’—œ ¤§¨©©©©ª««ª¦¡š“Œ…~xrmhc_\YWVUUUVXZ\_aeimsz€‡Ž•œ¢§ª­®­¬«ª¨§¦£Ÿš•І}xrle_ZURONNPRVZ^bgkoty~ƒ‰Ž“˜¡¥©¬®°°°¯­ª¦Ÿ˜‘‰„~zvsoje`\YVUSRRRSUY]agmt{‚Š—›Ÿ¢¤¦§©ª««««ª¨¥¡›•Žˆ‚|vqjc]WTRRRTVWXZ[^adhmrx~…“šŸ¤¨«®°±±°­ª¦¢˜“І‚}ytng`ZUQOOOPQSUX]bhou{€…‹”˜œŸ¢¦ª­°²³±¯«¦ š”Žˆ|vqlfb]ZWVUUUUTTTUX]cjrzˆŽ”šŸ£¦¨ª¬­­­¬ª¨¥¡žš–’‡€yqjc\WSPPPQSTVWY\_diouz„‰•›¡§«¯²´´³±­¨£˜”‹‡‚}wqkfa\XUSQONNOPSX^emu|‚‡‹“—œ ¥¨«­¯°°°®«§£ž™“†wohc^[YWWVUTSSSTVY]cjpw}„Š–£¨­°°°¯­¬©§¤¡ž›—“Žˆ‚{skd^YVSQONNNPRV[`flqvzƒ‡’™ ¦¬°²³³³±¯¬¨£ž˜’Œ†€ztoiea^[YVSPMKLNRW]dkqw~ƒ‰”šŸ¤¨ª¬­­­­­­¬ª§¢–ˆ€yqjd^[XVUTSQPQRUX\aejnsx~†•¤©­°²²±°®¬ª§¤ œ—‘Œ†{unhc]YUQNLJJKOSZ`flptx}‚ˆ•›¡¥©¬®°²³³²°¬¨¢œ•†ysnjea^[XURPNMMORW\bglrx‡—£§©««¬­®®®®¬ª¦¢—‘Šƒ|ungb\XTQONNNPRUY]beimqv|„Œ•£¨«®°±³´³²¯«¦ ›–‹†€{vpke`ZUQMKJJLNRW\aglqw}„‹‘˜¡¤¦©«®±´µ´²®©£—Šƒ|voie`\XURQOOOPRTWZ^bhnv~†Ž–œ¢¦©«­¯°±²±°¬¨¤Ÿ›—’‡€yqjc]XTPMLKLNQTX[_cglrx†“™ž¢§«¯³¶··µ²­§¡œ—’ˆ‚|uoid_[WSPMLKLNPSW\ahow†’—›ž¢¦ª­±³´´²°¬¨¤Ÿš•ˆ€xpic]ZWTRQOONPQSVY]agmu}…Œ’˜¢§¬°³µµµ²®«§£ œ™”ˆyrkd_ZVROMKJKMPTX]bgmsz€†Œ‘•šŸ¥«°´·¸¶´°­©¥¡œ—‰‚zsmgc_[XUROMKKLNQUZ`fmt{ƒ‰•šŸ¤©­°²´³±¯­«¨¦£Ÿ™’Šyqje`[XTQOMLLMORUZ^chntz€‡”›¡§­±´¶¶´²¯¬©¦¤ ›”†~wqlgc^YTPLJHIJMQU[`flrx}ƒ‰–œ¢§¬¯²³´³²±¯­ª¦¡š’‰yrmiea]XTPMKKKMORVZ_djpw~„Œ“›¡§«®±±²±°°¯­«¨¥Ÿ™‘‰ztnie_ZTOKHHILORVZ^bglrx~…Œ“𡧬¯±²³³³³±¯¬§¡š“‹„~xsoje`ZTOKIHJLNRUX\agnu|ƒŠ‘—£§«­¯°±²³³³°­§¡™’‹„}xrmga[VQMKJKMORTVY\afmu|„Œ“™ ¥ª­°±²³´´³±®©£œ–‰„ztmf_YSNKIIJLOQTWZ^cjqy€‡Ž”™ž£¨¬¯²´¶¶¶µ²®¨¡š”‡‚}wqjc]WSPMLLLMNPRUY^dks{ƒ‹‘—œ ¥©­°²´µµ´²¯«¦ š”މƒ}vog_YSPMMMMNNOQSW[agnu|ƒŠ–œ¡¦«°³¶·¸¶´±­¨£ž˜’‡{umf_YTQONMLKLLNRW]dkry€†Œ’—œ¡§«¯³µ··¶³°­©¤Ÿ™’Œ…~wphb\WSQPONMLLMOSX^ekry†Œ“š ¥ª¯²µ¶¶µ³°­ª¦¢ž™’Œ…}voha[VSPNLKJJKMQV\biouz†Œ’™ ¦«°³µ¶·¶´±®ª¦¡œ–ˆ€yrlfa]XTQNLJIIJMQV\cipv|‚ˆ—ž¤©­°²³´´³²±®«§¢œ–‡wpid^ZVROLJJJKNQTY^djotzˆ˜Ÿ¦¬¯²³´´´´²°­©¤ž˜’‹„}wpje`[VQMIHGHJMRV[`flrx~„‹’š ¦ª­°±³´µµ´³¯ª£–‡€zsnhc^YUQMKIIJLORVZ_djpx€ˆ—ž¤¨¬®°±²³´´³°­¨¢›”Žˆ‚|unga[UPLJIIJLORVY]aekry‰—£§«¯²´¶··¶³°ª¤–Š…€zungaZUQMJIHIKMPTX\bhnv~†Ž”šž¢¦ª­°³µ··¶³¯«¤ž—‹…~xqjc\WROMMLLMNOQTW[agnv‡–œ¡¥©­°³¶··µ³¯«¦ ›–‘Œ†€yrjaZTPMKKKKLMORV[`flszˆ”™ž£¨­±¶¹ºº¸´¯ª¥Ÿ™”މƒ|unga[VRPNMLKKKLOSY_gov~…Œ’˜œ¡¥©­±´···´±­©¥ œ—‘Š‚zqib[WSQONNMMMNORV\bhov}ƒŠ‘—£©®³¶¸¹¸¶²®©¥¡žš•‰yqjc^YUQNLJIIJLOTY`gnuz€…‹–œ¢¨­²¶¸¹¸¶´°¬§£ž™“‹ƒ{slea]ZWTQNLJIJLOSY_fmt{ˆŽ•›¡§¬°³´µµ´²¯­ª¨¤ š”Œ„{rjd^ZWSPMKJIJLPTY]bhmsy…Œ”›¢¨®³¶··¶µ²°¬©¥ ›•އ€yrlfb]YUPLIFFGJOTY_ejpw}ƒŠ–œ¢§¬¯²´µµ´³²°­¨£œ”Œ„|unid`\XTQNKJIKNQUY]bgmt{ƒ‹“š ¦ª®±²³³²²°¯­ª¦¡›”…~xrke_ZUPLIHHJLPTX\`einu{ƒŠ‘˜ž¤©­°³µ¶¶µ³±­©£–ˆ‚|wrlga\VRNKIIIKNRUZ^djqx€‡Ž•šŸ£§ª­°²³´´³±®ª¥ž˜‰‚|vpic]XTPNMMMNPQSVZ^chow†Ž•› ¥©­°²´µ´³°­ª¥ ›•Š„~xrkd]WRNLKKLMOQTW\afmsz€‡“˜¢§«¯³µ¶¶µ²¯ª¥ š”Žˆ‚|vpic^YURPNNMMNOQUY`fmu|ƒ‰•šŸ£¨«®±³´³²¯¬©¥¡œ–Šƒ|tmf`[WSQPOOOOPQTW\ahnt{‡”š ¥ª®²´µ´³±®ª¦¢žš•‰‚|unhb]XURONMLMNPTY_ekqw|‚‡“™Ÿ¤©­°²³´³±¯¬¨¤Ÿš”ކxqkfb^ZWTRONMMNQTY^djpv|‚ˆ–œ¢§«­°°±±°¯­ª§¤ ›•އxrkfa]YURPNMMOQTX\afkpu{‡Ž•œ¢¨«®°±²²±¯­«§£˜’Œ…~xrmhd_[VROMLMNQUY]bglqw}ƒŠ—¢¦©¬®¯°±±°¯¬¨£—‘Šƒ}wqlgc^ZVRPNNOQSVY]aejpv}„‹’˜ž£§©«­¯°°°¯­ª¦¡œ–Š„~xsmhb]XTQONNPSUX[^afkqx~…Œ’˜¡¥©¬®°±²²°­©¤Ÿ™”މ„~ysmgb]XTQPOPQSUXZ^bgls{‚‰Ž”˜¡¤¨«®°±²±¯¬¨£ž˜“Žˆƒ}wqke_ZWTSQQQRTVXZ^bgnu|ƒŠ•™¡¦©­¯±±±¯¬©¥¡œ—’ˆ‚|voic]YVTRRRRSTUX[_djpw~„Š”™¢¦«®±²²°®«§¤Ÿ›–‘Œ‡{tnhb]YWUSSRRRSUX\agmtz€†‹•™ž¢§«®±±±¯¬©¦£Ÿ›–‘‹…~xqkea]ZWUTSSRRSUY]ciou{†‹–› ¥©¬¯°°¯¬ª¨¥¢ž›–Šƒ}vpje`\YWUTSRRSTW[`ekqv{€…‹–œ¡¦ª­¯¯¯®¬©§¤¡™”އztojea]ZWUSRQQRUX]bgmsx}‚‡Œ’˜£§ª¬­®®­«ª§¥¡˜’Œ…~xrmhda]ZWUSRRRTVZ^chmsx}‚ˆŽ”𠤍ª¬¬¬¬«ª¨¦¤ œ–‘Š„~xrlhd`\XUSRQRSVY]aejnsx}‚ˆ•› ¥¨ª«¬¬¬«ª¨¦¢˜“‡‚|wrmhd`\YUSQQRTVZ]bfkpuz€†Œ‘—œ ¤§¨ª««¬¬«©¦¢˜’Œ†€{upkgc_[XVTSSTVX[_bfjou{‡Ž”™ž¢¥§©ª««««©§¤ ›–‘‹†|vqkfa]YVTSSTUXZ]adhlqv|‚ˆŽ”™¡¤§©«­­­¬©¦¢˜“މ„zupkfb^ZWUTTTUWZ]`dinsy€†Œ‘–𠣦¨ª¬¬¬«¨¥¡˜“މƒ~xsmhc_\YXWVVWXY[^aeinty€†Œ’—›Ÿ¢¥¨ª¬¬¬ª¨¥¢ž›—’މ„ysmhc_[XWVUVVXZ]`dhmrw|‚‡Œ‘•šž¢¥¨«­­­«¨¥¡™•‹†{vqlgc`][YWVVVWX[^chmsy„‰Ž“—›Ÿ¢¥§©ªªª¨¦¤¡žš–‘Œ†€ysniea^\ZYXWXXY[^aeinsy~ƒˆ“˜¡¥¨ª««ª¨¦¤¡ž›—”‹…ztojfb_\YWVUVWY\`dhmrw{€„‰Ž’—œ ¤§©ªªª©§¥£Ÿ›—’Œ‡{vqmifca^[YWVVWY\_cglqw|†Œ‘–šž¢¤¦§§§¦¦¥£¢Ÿ›—’‡{upkgd`^[YXWWXZ]`cfjmqvz€…‹–› £¦¨¨¨¨§¦¤¢Ÿœ˜“މ„{vrnjfb^[XVUVWY]`dhlpuy~ƒˆ’–šž¡£¥¦§¨¨§¦¤¡˜’Œ‡|xtplhea_\ZYYYZ[^`cgjnsx~…‹•š ¢£¤¥¥¥¥¤£¡ž›–’‡ƒ~ytpkfb^[YXXYZ\^adgimpty~„‰”˜œŸ¢¤¦§¨¨§¥£Ÿ›—’‰„€}yuqlhc_\ZYXXY[]`cfjnsx}ƒˆ‘•˜›Ÿ¡£¥§§§¦£ œ˜“މ„{vqmiea_]\\\\]^_aceimrw}ƒ‰Ž“—šŸ¡£¥¥¦¥¤¢Ÿœ˜•‘ŽŠ†|xrmhc`][ZZ[\^_acfimquz„ˆ‘”˜›Ÿ¢¤§¨¨§¥¢žš–’ŽŠ†ƒ~zuqmieb`^\\[[\]_adhmsx~ƒˆŒ“–˜›ž £¤¥¦¥£¡ž›˜”‘Œˆƒ}xrnifca`_^^^__`acfinrw|‚†‹“—›Ÿ¡¤¥¥¥¤¢ š—•’‹‡ƒ~ytnjfc`^]\\\\^`cfjnrw{ƒ†Š‘•™ £¥¦¦¥£¡ž›˜”‘Œˆƒzuqnjhfdb`^]\\]_aeimrw|…‰‘”˜›ž ¡¢¢¢¡ Ÿ›™–’މ„~ytokhecb`__^__acehloswzƒ‡Œ‘•šž¡£¤¤£¢ Ÿ›˜–“‹‡‚~zvrnkgdb_]\\\^`cgkosvz}…‰Œ”˜›ž ¡¢£¢¢¡Ÿš–’ˆƒ~zvspmjheca`_^^_acfimquy~‚‡Œ”˜›žŸ  ŸŸŸž›™–’މ„{wsokheb`_^_`acegjloruy}†Š”˜›žŸ¡¡¢¡¡ ž›™•‘‰†‚~{xuqnjfc`_^^^`bdgjmquy}…‰”–˜šœžŸ ¡¡¡Ÿš–’‰„€|xuqnkhfdbaaabcdegilosw|†‹“–™šœžžŸŸž›™–“Œ‰†‚~zvqmifca```acdfhjloruy}…‰“–™œžŸ¡¡¡ ž›—”Œ‰†ƒ€}yurnkhedbaaaabdfhlosx}…‰Œ‘“–˜šœŸŸŸžš˜•‘ŽŠ‡ƒ{vrnkhfeedddddefgilosw|€„ˆŒ’•˜šœžŸŸž›™–”‘Ї„€|wrnjhfdccbbccegimpswz~„‡Š“—šœž  Ÿ›™–“‘Ž‹ˆ„€|xuqoljihfedcbbdfilptx|€ƒ‡Š’•—™›œœ›š˜–•“‰„€{wsomjihgfeeeefgilorux{~‚…‰”—šœžœ›™—•”’‹‡ƒ{xtqoljhfdcccdehknrux{}€ƒ†‰Œ“–˜šœœœœ›š™—•“Œˆ„€|xusqonljhfeddefhknqtwz~…ˆŒ’•—™™ššš™™˜—–•“Œ‰„€|xurpnljhfeefghjlnpsuwz}€„ˆŒ“–˜š›››šš™˜–•’Œ‰†‚|ywtromjhfddefhjmortwy|€ƒ†‰Œ’”–—˜™™ššš™—•’‹‡„€}zwusqoljigggghjkmnpruy|€„ˆŒ‘“•–—˜˜˜˜˜——•“‘Ž‹‡„~{xuroljhggghijlmoqrtwz}„‡‹’”–˜™™šš™˜–”‘Ž‹ˆ…‚€~{yvspmkihgghijkmnpsvy}€ƒ†‰ŒŽ‘“”–—˜˜˜˜—•“‘Ž‹ˆ…‚|yvsqnlkjjjjjkklmnpsvy}€„‡ŠŒ‘’”•——˜——•”’ŽŒŠ‡…‚€}yvspmkjiiijjklmoqsvx{~ƒ†ˆ‹’”–—˜˜˜—•“‘Šˆ…ƒ€~{xusqomlkkjjjjklnqtwz}€ƒ…‡ŠŒŽ’“•––––•”’‘‹ˆ†ƒ€|yvsqonmlllkkklmnpruwz}‚„‡ŠŒ‘“•–––•”“’ŒŠˆ…‚|yvtrpomlkkkkklnpruwz|~€‚„‡‰ŒŽ‘“”••••”“’‘‹ˆ†ƒ€}zxvtsqponmlkkkmnpsuxz}„†‰‹‘’““““““’‘‹ˆ…‚|zwusrqpnmmllmnoqsuwxz|~ƒ†‰ŒŽ’““”““’’‘‹‰†„|zxvtsqonmlllmnprtvxz|}€‚…‡ŠŒŽ‘’’’“““’’Ї…‚}{yxvtsqponmmnopqsuvxz|~„†‰‹‘‘‘‘‘‘‘‘ŽŒ‰‡„‚}{yxvtrponnnooqrsuvwxz|~„‡‰Œ‘‘’’’‘‘ŽŒŠ‡…ƒ}|zxvtrponnnopqstuwxz|~ƒ†ˆŠ‹ŒŽŽ‘‘’’‘‹ˆ†„‚€~|zywusrppoopqrrstuvxz|‚„‡‰‹ŒŽŽ‘‹‰ˆ†„‚€~|zxvtrqppppqrsttuvwy{}€‚…‡ˆŠ‹ŒŽ‘‘‘‹‰‡†„‚~|zxvtrqqqqqqrsttuwy{}€‚„†‡ˆ‰Š‹ŽŽŒ‹‰‡…ƒ‚€~|{xwussrrrrrssstuvwy{~€‚„†‡ˆŠ‹ŒŽŽŒ‹‰ˆ†…ƒ‚€~|zxvtsrrrrsssttuvwy{}‚„…‡ˆ‰‹ŒŽŽŒ‹‰ˆ†…„‚}{yxvutsssssssstuwy{}€‚„…†‡ˆ‰‹ŒŽŽŽŒ‹Š‰ˆ†…ƒ~|zxwuutttttttttuvxy{}€‚ƒ…†ˆ‰ŠŒŒŒ‹Š‰‰‡†…„‚}{yxvuutttsstttuwxz{}~‚ƒ„†‡‰ŠŒŒŒŒ‹Š‰ˆ‡…„‚~|zyxwwvuutttttuvwy{|~‚ƒ„†‡ˆŠŠ‹‹Œ‹‹‹‹ŠŠ‰ˆ‡…„‚€~|{yxwwvvuuuuuuvwxyz{}~€‚ƒ…†ˆ‰Š‹‹‹‹‹‹ŠŠ‰ˆ‡†…„‚€~}{zyxwvuutttuvwxy{|}~€‚„…‡ˆ‰ŠŠ‹‹‹‹‹ŠŠ‰ˆ‡…„‚~|{zzyxwwvvuuuvvwyz{|}€ƒ„†‡ˆ‰‰ŠŠŠŠ‰ŠŠ‰‰ˆˆ†…„‚€~|{zyxwwvvvvvwxxyz{|}~€ƒ„†‡‰‰ŠŠŠŠŠŠŠ‰‰ˆ‡†„ƒ‚€~}|{{zxwwvvuvvwxyz{|}~€ƒ„…†‡ˆˆˆ‰‰‰‰ŠŠŠ‰ˆ‡…„‚€~}|{zzyxxwwwwwxyyz{{|}~ƒ„†‡ˆ‰‰‰‰‰‰‰‰‰‰ˆ‡†…„ƒ‚€}|{zyxwvvvwwxyz{||}}~‚ƒ…†‡‡ˆˆ‰‰‰‰ŠŠ‰‰ˆ†…ƒ‚€~~}|{zyxxwwwwxxyz{{|}~‚„…†‡‡‡‡‡‡ˆˆ‰‰‰‰ˆ‡†„ƒ‚€~}|{zyxxwwwxxyyzz{{||}~€ƒ„†‡‡ˆˆˆˆˆ‰‰ˆˆˆ‡†…ƒ‚€~}|zyxwwvwwxyzz{|}}~€‚ƒ„…†††‡‡‡ˆˆ‰‰‰‰ˆ‡…„‚€~~}|{zyyxxxxxxyyzz{{|}~€‚ƒ…†‡‡‡‡‡‡‡ˆˆˆˆˆ‡†…„ƒ‚€€~}|{zxwwwwwxxyzz{{||}~‚ƒ„…†‡‡‡ˆˆ‰‰‰‰ˆ‡†„ƒ‚€€~~}|{yxxwwwwxxyyzz{|~€‚ƒ„…†††††‡‡ˆˆˆ‰ˆˆ‡†„ƒ‚€~}|zyxxwwwxxzzzz{{{|}~‚ƒ„……†††‡‡‡‡‡‡††…„ƒ‚‚€}|{zyxxxxxyyzz{{|}~€‚ƒƒ„„……††‡‡ˆˆˆˆ‡†…ƒ‚€~~}|{zyyyyyyyyyyyz{|}~‚ƒ„……††††‡‡‡‡‡‡††…„„ƒ‚€~}|zyyxxxxyyyzzz{{|}~€‚ƒ„…††‡‡ˆˆ‰‰ˆˆ‡†…„ƒ‚‚€~|{zyyxxxwwwxxyyz{}~€‚ƒ„……††‡ˆˆ‰‰‰‰‰‰ˆ‡†…„ƒ‚~}{zyxxwwwwwwwwxxyz{|~‚ƒ…†‡ˆ‰‰ŠŠŠŠŠŠ‰ˆ‡‡†…„ƒ‚€~|{yxwvvuuuuuvvwxy{|}€‚„…†‡ˆ‰Š‹ŒŒŒŒ‹‹Š‰ˆ†…„‚~|{zyxwvuutttttuvwxz|}‚„…†ˆ‰Š‹ŒŒŒŒ‹ŠŠ‰ˆ†…ƒ}{zxwvutsssssstuvwxz{}~€‚„…‡‰ŠŒŽŽŽŽŽŒ‹Š‰‡†„‚€}{yxvutsrqqqqrrtuvxz|}ƒ…†ˆŠ‹ŒŽŽŽŽŒ‹Šˆ†„‚€}{zxvutsrqppppqrstuwy{}„†ˆŠ‹Ž‘‘ŽŒŠˆ†„‚€}{ywusrqponnnopqrtuwy{}‚„†ˆŠŒŽ‘’’’’’’‘ŽŒŠˆ†„}{xvtsqonmmmmmnoqrtvy{~€ƒ…‡ŠŒŽ‘’““””““’‘‹‰†„|zwusqonmlllllmnprsvx{}€ƒ…ˆ‹‘“”•••••”“‘Ž‹‰†„~|yvtrpnlkjjjjklmoqsvx{~€ƒ†‰‹Ž’”•–———–•”“‘ŽŒ‰†„~{xuspnmkjiihiiklnprux{~„‡Š’”•——˜˜˜—–•“’Ї„€}zwtqomkihgggghjkmpruwz~„‡‹Ž‘“•—˜™ššš™˜–•’Іƒ€}yvtqnlihfeeeeghjlnqtw{~‚…‰Œ’”–˜™šš››š™—•“‰†‚|xuroljhfeeeefghjlnqtw{‚†Š“•—™š››››š™—”’Œ‰†‚{xtqnkigeddddeghjloruy|€„‡‹Ž‘“–˜™›œœœœš™—”‘Ž‹ˆ„}zvspmkhfeddddefhjlorvy}…ˆ‹‘”–˜š›œœœ›š˜–”‘Ž‹‡„€|yurnligeddccdefhjlpsvz~‚…‰Œ’•—š›œœ›š˜•“Іƒ|xtqnkhfeccccdefhkmptx{ƒ†Š“–˜šœžœš˜–“‰†‚~zwspmjhfedcccdefhknquy|€„ˆ‹Ž‘”—™›žœ›™—•“Œ‰…}yvrnligedcbbccefilorvy}…ˆŒ’–˜šœžžžž›™—•’Œˆ„€|xuqnkhfecbbbbcegilpsw{~‚†‰”—™›žžžž›š—•’‹‡ƒ{wspmjhfdcbbbbcegjmptw{ƒ‡ŠŽ’•˜šœžžŸžž›™—”‘ŽŠ†‚~zvsoligecbaaabcehjnqux|€ƒ‡‹“–™›žŸŸŸž›™—”‘‰…}yurnkifdbaaaabcfhknquy}…‰”—šœžŸŸŸž›™–“Œˆ„€|xtqmjgecba``abdfikorvy}†ŠŽ’•˜šœžŸŸŸŸž›™–’‹‡ƒ{wspmigdba```abdgilosw{ƒ‡‹“–˜›žŸ  Ÿž›˜•’ŽŠ†‚~zvrokhfdba```acegilptw{€„ˆŒ“–™›ŸŸ  Ÿžœš—”‘‰…}yuqnjgeca````acegjmqtx}…‰‘”—šœžŸ ¡ Ÿžœ™—“Œˆ„€|xtpmigdba`_``acegjnquy~‚†ŠŽ’•˜šž  ¡ Ÿž›™–“Œˆƒ{wsokhfcb`````acehknrvzƒ‡‹’–™›Ÿ ¡¡ Ÿ›˜•’Ž‹‡ƒ~zvrnkheca`___`bcfhlosw{€„ˆŒ“–™œžŸ ¡¡ žœš˜•‘ŽŠ…}yuqmjgeca`___`bdfimptx}…‰‘”˜šŸ ¡¡ Ÿžœš—”‘‰…€|xtplifdb`____abdgjnquy}…ŠŽ‘•˜›žŸ ¡¡ Ÿžœ™—“Œˆƒ{wsolifca`_^^_`behknrvz~ƒ‡‹“–™œžŸ ¡¡ Ÿžœ™–“‹‡‚~yurnkheca`_^^`acehkosw{ƒˆŒ”—šŸ ¡¡¡ Ÿ›™–’ŽŠ†}yuqmjgdb`_^^_`bdfimptx|€…‰‘•˜›Ÿ ¡¡¡ Ÿ›˜•‘‰…€|xtpmifdb`_^^_`bdgjmquy}†ŠŽ’–™›Ÿ ¡¡¡ Ÿš—”Œˆ„{wsolheca_^^__abegjnquy~‚‡‹“—šœž ¡¢¢¡ žœš–“‹‡ƒ{vrokgeb`_^^^`acehkosw{„ˆŒ”—šŸ ¡¢¢¢ žœ™–’ŽŠ†‚~yuqmjgdb`_^^_`acehkosw|…‰Ž‘•˜›Ÿ ¢¢¢¡ ž›˜•‘ŽŠ…}xtplifca`_^^_`bdfilptx}†ŠŽ’•™œž ¡¢¢¢¡Ÿš—”‰„€|xsolheca_^^^_`bdgjnqvz~ƒ‡‹“–™œž ¡¢¢¢¡Ÿš—“Œˆƒzvrnkgeca`_^^_`bdgjnrv{„ˆŒ”—šŸ ¡¢¢¡ žœ™–“‹‡‚~zuqmjfdb`_^^^_acehlosw|€„ˆ‘”˜› ¡¢¢¢¡ ž›˜•‘ŽŠ…}xtpmifca`^^]^_acfilptx}†ŠŽ’•˜›ž ¡¢¢¢¡Ÿ›˜•‘‰„€{wsokheca_^^^_`adfjmquy}‚†‹“–šœž ¡¢¢¡ žœš—”Œˆƒ{vrnkgeb`_^]^_`bdgknrvz~ƒ‡‹“—šŸ ¡¢¢¡ žœ™–“І‚~yuqnjgdb`_^^^_`behkosw{€„ˆ‘”˜šŸ ¡¢¡¡ žœ™–’ŽŠ†}xtplifca`^^^_`acfilpsx|€…‰Ž’•™›ž ¡¢¢¢¡Ÿ›˜•‘‰…€|xtplifca_^^^_`bdgjmquy}‚†ŠŽ’–™œž ¡¢¢¢¡Ÿš—”Œˆƒ{wsokheca_^^^_`bdgjnqvzƒˆŒ“—šœž ¡¢¢¡ žœš—“‹‡ƒzvrnjgdb`_^^_`acehkosw{„ˆŒ”—šŸ¡¢¢¢¡ žœ™•’ŽŠ†‚~yuqnjgdb`_^^_`acfilptx|…‰‘•˜›Ÿ¡¢¢¢¡ ž›˜•‘‰…}xtplifdb`____`bdfimpuy}‚†ŠŽ’–™œž ¡¢¢¡ Ÿš—”‰„€|wsokheca`_^__abegjnrvz~‚‡‹“–™œž ¡¢¢¡ žœ™–“‹‡ƒ{vrokheca`____acehkosw{€„ˆŒ”—šœŸ ¡¢¢¡ žœ™–“‹‡‚~yuqmjgdba`___`acfilpsw|€„‰‘”˜›Ÿ ¡¢¡ Ÿ›˜•‘ŽŠ†}ytpmifdb`_^^_`bdgjmquy}…‰‘•˜›Ÿ ¡¡¡ Ÿš—”Œˆ„€{wsplifdb`____`bdgjnrvz~‚‡‹’–™œžŸ ¡¡¡ žœš—“Œˆƒ{vrokheca`___`acehknrvzƒ‡‹“—šœž ¡¡¡ Ÿ›™•’Ž‹†‚~zvrnkheca`___`bdfilpsw{€„ˆŒ“—šœžŸ ¡¡ Ÿ›˜•‘‰…}yuqmjgeba`___`bdfimptx|…‰‘•˜šœž    Ÿžœš—”‘‰…€|xtpmifdba`__`acehknquy}‚†ŠŽ’•˜›Ÿ ¡¡ Ÿžœ™–“‹‡ƒ{wsplifdb``__`acehkorvzƒ‡‹’–˜›Ÿ    Ÿ›™–’‹‡‚~zvrokhfcba```abdfilosw{„ˆŒ“–™œŸ   Ÿžœš˜•‘ŽŠ†‚~zvrnkheca````acegjmqtx|…‰”—šœžŸ   Ÿžœš—”‰…}yuqnjhecba``abcehknruy~‚†ŠŽ‘”—šœžŸ   Ÿ›™–“Œˆ„€|xtpmjgecba`aabdfikorvz~‚†ŠŽ’•˜›žŸ  Ÿžš˜•’‹‡ƒ{wsoligdca``aacdgjmptw{ƒ‡‹’–™›žŸ  Ÿžœš˜•‘ŽŠ†‚~zvrolifdcbaaabcegjmqtx|€„ˆŒ“–™›žŸŸŸžœ™—”‘‰…}yurnkhfdbaaaabdfhknruy}…‰”—™œžŸŸŸž›˜–“Œˆ„€|xtqnkhfdbaaaacdfilosvz~‚†ŠŽ‘”—™œžŸŸžžœš˜•’‹‡ƒ{wtpmjhedbbabbcegjmpsw{ƒ‡‹Ž’•˜šœžŸŸž›™—”‘ŽŠ†‚{wspmjgecbaabcdfhknqtx|€„ˆ‹’•˜šœžžžž›™–“‰…}zvroligecbbabcdfhknquy}…‰Œ“–˜šœžžžœš˜–“Œˆ„€}yurnkifdcbbbcdegilorvz~…‰“–˜›œžžž›™—”‘Ž‹‡ƒ€|xuqnkhfdcbbbcdfhjmpsw{‚†Š‘”–™›œžžœ›™–”‘І‚{wtpmjhfdccbccefhkmqtx|ƒ‡‹Ž‘”—™›œœ›š˜•“‰…‚~zvspljhfdccccdegiloruy|€„ˆ‹Ž’•—™›œœ›™—•’Œˆ…}yvsoljhfdccccdfhjlosvz~…ˆŒ’•—™›œœ›™—”‘Ž‹‡„€|yuroligfedcddefhkmptw{~‚†‰“–˜š›œœ›š˜–“‘Їƒ|xtqnkigeddcddfgilnqux|ƒ†Š“–˜š›œœœ›™—•“‰†‚~{wtqnkigfedddefhjloruy}€„‡‹Ž‘”–˜š›œœœ›š™—•’Œ‰…~zwspmkigfeddefgikmpsvz}„ˆŒ’”—™š›œœœ›š˜–”‘Ž‹ˆ„}zvspmkigeeddefgilnqtw{~‚…‰Œ’•—™š›œœ››™˜–“Їƒ|xuromjhgfeeeefhjloqux{ƒ†Š“•—™š››››š™—•’‰†‚|xuroljhgfeeefgikmpruy|€ƒ‡Š“•—™š›››š™˜–”‘Ž‹ˆ…‚~{wtqoljhgfeeefhiknpsvz}„‡‹Ž“•—™šš››š™—•“‘Ž‹‡„€}zvspnljhgffffghjlnqtwz~…ˆ‹Ž‘“–—™šššš™˜–•’Їƒ€}yvspmkihgffffhikmorux{~‚…ˆŒ‘”–˜™šššš™˜–”‘Œ‰†‚|yvspmkihgfffghikmpsvy|€ƒ†‰Œ’”–—˜™šš™˜—•“‘Ž‹ˆ…‚~{xuromkihggfggijlnpsvy}€ƒ†Š’”–˜˜™™™˜—–”’Ї„~{wtromkihgggghikmortwz~„‡Š’”–—™™™™˜—–”’Œ‰†ƒ€}zwtqomkihgggghjkmorux{~‚…ˆ‹Ž’”–—˜™™˜˜—•“‘Œ‰†ƒ€|yvsqnlkihhghhijlnpsvy|‚…ˆ‹Ž‘“•–—˜™˜˜—–”’Ž‹ˆ…‚|yvsqnlkihhghhjkmoqtwz}€ƒ†‰ŒŽ‘“•–—˜˜˜˜—–”’Ї„~{xuspnlkjihhhijlmortwz}„‡Š‘“•–—˜˜˜—–•“‘ŒŠ‡„~{xurpnljiihhijkmnpsux{~„‡Š’”•–—˜˜˜—–”’Ž‹‰†ƒ€}zwurpnlkiihiijkmoqtvy|‚…ˆ‹’“•–————–•”’‹ˆ…‚|yvtrpnlkjjjjjkmnpruwz}€ƒ†‰‹Ž’“•–––––•”’ŽŒ‰‡„~|yvtqonlkjjjjklnoqtvx{~ƒ†‰‹Ž’“”•–––•”“‘‹ˆ†ƒ€}{xvtqpnmlkkkklmoprtwz|‚…‡ŠŒŽ‘“””•••”“’ŽŒŠ‡…‚}zwusqonmlllllmnpqsvxz}€‚…‡ŠŒŽ’“”””””“’‹ˆ†„|zwusqonmllllmnoqsuwy|~ƒ†ˆŠŒŽ‘’“””““’‘ŽŒŠ‡…ƒ€~{ywusqponmmmmnoprtvxz|„†‰‹Ž‘’’““’’‘Ž‹‰‡„‚}{xvtsqponnnnnopqsuwy{}€‚„‡‰‹Ž‘’’’’’‘‹Šˆ…ƒ|zxvtsqpoonnoopqrtvxz|~ƒ…‡‰‹Ž‘‘‘‘‘ŽŒ‹‰‡…‚€~|zxvtsrqpoooopqrsuwy{}ƒ†ˆ‰‹Ž‘‘Ž‹Šˆ†„‚}{ywvtsrqpppppqrsuvxz|~€‚„†ˆŠ‹ŽŽŒŠˆ‡…ƒ}{ywvtsrqqqpqqrstvwy{}ƒ…†ˆŠ‹ŽŽŽŒ‹‰ˆ†„‚€~|zywvtsrrqqqrrstuwxz{}ƒ…‡ˆŠ‹ŒŽŽŽŽŽŽŒ‹Šˆ†…ƒ}|zxwvtssrrrrrstuvwy{|~€‚„…‡‰Š‹ŒŽŽŽŒ‹Š‰‡†„‚€}{zxwvttsrrrsstuvwxz{}€‚„†‡‰Š‹ŒŽŒŒ‹Šˆ‡…„‚€~}{zxwvutsssssstuvwyz|}ƒ„†‡‰Š‹ŒŒ‹Š‰ˆ†…ƒ€~|{yxwvutssssstuuwxy{|~€ƒ…†ˆ‰Š‹ŒŒŒŒ‹Šˆ‡†„ƒ~|{yxwvuttsssttuvwxz{}~€‚ƒ…†ˆ‰Š‹ŒŒŒ‹Š‰ˆ‡…„‚~|{yxwvuttttttuvwxyz|}‚„…‡ˆ‰Š‹ŒŒŒŒŒŒŒ‹Š‰ˆ†…ƒ‚€}|zyxwvuuttttuuvwxy{|~‚„…‡ˆ‰Š‹ŒŒŒŒŒŒ‹Š‰ˆ‡†„ƒ‚€}|zyxwvuutttuuvvxyz{}~€ƒ„…‡ˆ‰Š‹‹ŒŒŒŒ‹‹Š‰ˆ‡…„ƒ€~}{zyxwvuuuuuuuvwxyz|}€‚ƒ…†‡ˆ‰Š‹‹‹‹‹‹‹Š‰‰‡†…„‚~|{zyxwvuuuuuuvwwxz{|}€‚ƒ„†‡ˆ‰Š‹‹‹‹‹‹ŠŠ‰ˆ‡†„ƒ‚€}|{zyxwvuuuuuvvwxyz{}~‚ƒ…†‡ˆ‰ŠŠ‹‹‹‹‹Š‰‰ˆ‡…„ƒ€~}|{zyxwvvvuuvvwwxyz{}~€‚„…†‡ˆ‰ŠŠŠ‹‹ŠŠŠ‰ˆ‡†…„‚€~}|{yxxwvvvvvvwwxyz{|}€ƒ„…†‡ˆ‰ŠŠŠŠŠŠŠ‰ˆ‡‡…„ƒ‚~}|zyxxwvvvvvvwwxyz{|~€‚ƒ„…†‡ˆ‰‰ŠŠŠŠŠ‰‰ˆ‡†…„ƒ‚€~|{zyxxwwvvvvwwxyyz{}~€‚ƒ„…†‡ˆ‰‰ŠŠŠŠ‰‰ˆ‡‡†…„ƒ€~|{zyxxwwvvvwwwxyz{|}~€‚ƒ„…†‡ˆ‰‰‰ŠŠŠ‰‰ˆ‡†…„ƒ‚€~}|{zyyxwwwwwwwxxyz{|~€‚ƒ…††‡ˆˆ‰‰‰‰‰‰ˆˆ‡†…„ƒ‚~}|{zyxxwwwwwwxxyz{|}~€‚„…†‡‡ˆˆ‰‰‰‰‰ˆˆ‡†……„ƒ€~}|{zyyxxwwwwxxyyz{|}~€‚ƒ„…†‡‡ˆˆ‰‰‰‰‰ˆˆ‡†…„ƒ‚€~}|{zyyxxxwwxxxyzz{|}€‚ƒ„…†‡‡ˆˆˆˆˆˆˆˆ‡‡†…„ƒ‚€}||{zyyxxxxxxxyzz{|}~€‚ƒ„…†‡‡ˆˆˆˆˆˆˆ‡‡†…„ƒƒ€~~}|{zyyxxxxxxyyz{{|}~€‚ƒ„…†‡‡ˆˆˆˆˆˆˆ‡‡†…„ƒ‚€~}|{{zyyyxxxxyyzz{|}~€‚ƒ„……†‡‡ˆˆˆˆˆ‡‡‡††…„ƒ‚€~}|{{zyyyxxxyyyz{{|}~€‚ƒ„„…†‡‡‡ˆˆˆˆ‡‡††…„ƒ‚‚€~}|{{zzyyyxyyyzz{||}~€‚ƒ„……††‡‡‡ˆ‡‡‡‡††…„ƒ‚€~~}|{{zzyyyyyyzz{{|}~~€‚ƒ„……†‡‡‡‡‡‡‡‡††…„„ƒ‚€~~}|{{zzyyyyyzzz{||}~€‚ƒ„……††‡‡‡‡‡‡††……„ƒ‚€~}}|{{zzyyyyyzzz{||}~€‚ƒƒ„……†††‡‡‡‡†††…„„ƒ‚€€~}||{zzzzzzzzzz{||}~~€‚ƒƒ„……††‡‡‡‡†††……„ƒƒ‚€~}||{zzzzyzzzz{{|}}~€€‚ƒƒ„……††††††††……„„ƒ‚€~}}|{{{zzzzzzzz{{|}}~€‚ƒ„„……†††††††………„ƒƒ‚€€~}}|{{zzzzzzz{{{||}~~€‚ƒ„„……††††††………„„ƒ‚‚€~}}||{{zzzzzz{{||}}~€€‚‚ƒ„„………†††††………„„ƒ‚€~~}||{{{{zzz{{{{||}~~€‚ƒƒ„„…………†…………„„„ƒƒ‚€€~~}||{{{{zz{{{{||}}~€‚ƒƒ„„………†††………„„ƒƒ‚‚€€~~}}||{{{{{{{{||}}~~€€‚‚ƒ„„„………………………„„ƒƒ‚€~}}|||{{{{{{{|||}}~€‚ƒƒ„„„……………………„„ƒƒ‚‚€~}}|||{{{{{{|||}}~~€‚ƒƒ„„„……………………„„ƒƒ‚€€~~}}||||{{{{{|||}}~€€‚‚ƒƒ„„„………………„„„ƒƒ‚‚€~~}}||||{{{||||}}~~€€‚‚ƒƒ„„„………………„„„ƒƒ‚€€~~}}|||{{{{||||}}~~€€‚‚ƒƒ„„„„„……„„„„ƒƒ‚‚€~~}}}||||||||||}}~~€€‚ƒƒƒ„„„„„„„„„„ƒƒƒ‚‚€€~~}}}|||||||||}}}~~€‚‚ƒƒƒ„„„„„„„„„ƒƒƒ‚‚€€~~}}}|||||||||}}~~€€‚‚ƒƒƒ„„„„„„„„„ƒƒƒ‚‚€€~~}}}|||||||||}}}~~€€‚‚ƒƒƒ„„„„„„„ƒƒƒƒ‚‚€€~~}}}||||||||}}}~~€€‚‚‚ƒƒƒ„„„„„„„ƒƒƒ‚‚‚€€~~}}}}||||||}}}}~~€€‚‚ƒƒƒƒƒ„„„„„ƒƒƒƒ‚‚€€~~~}}}||||||}}}}~~€€‚‚ƒƒƒƒ„„„„„ƒƒƒƒ‚‚€€~~~}}}}|||||}}}~~~€€‚‚‚ƒƒƒƒƒ„„„ƒƒƒƒƒ‚‚€€€~~~}}}}}}}}}}}~~~€€€‚‚ƒƒƒƒƒ„„„ƒƒƒƒƒ‚‚‚€€~~}}}}}}}}}}}}~~€€‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~}}}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€€‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~~}}}}}}}~~~~€€€‚‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~~}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~~}}}}}}~~~~~€€‚‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚‚€€~~~~}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€€‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~}}}}}}}}~~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}~~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~~}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}}~~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}}~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~}}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒƒƒƒ‚‚‚€€~~~}}}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}}}}~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒƒ‚‚‚€€€~~~~}}}}}}}}}}~~~€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~}}}}}}}}}}~~~~€€‚‚‚ƒƒƒƒƒƒƒƒƒ‚‚‚‚€€~~~}}}}}}}}}}~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}}~~~€€€‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒƒ‚‚‚‚€€€~~~}}}}}}}}}~~~~€€€‚‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚‚€€€~~~~}}}}}}}~~~~€€€‚‚‚‚ƒƒƒƒƒƒƒ‚‚‚‚€€€~~~~}}}}}}~~~~~€€€‚‚‚‚‚ƒƒƒƒƒƒ‚‚‚‚€€€~~~~~}}}}}~~~~~~€€€‚‚‚‚‚ƒƒƒƒƒ‚‚‚‚‚€€€~~~~~}}}}}~~~~~€€€€‚‚‚‚‚ƒƒƒƒ‚‚‚‚‚‚€€€~~~~~~}}}}~~~~~€€€‚‚‚‚‚‚ƒƒ‚‚‚‚‚‚€€€~~~~~~}}}~~~~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€~~~~~~}}~~~~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€~~~~~~~~~~~~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€~~~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€~~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€~~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~~~€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€~~~~~~~~~~~€€€€‚‚‚‚‚‚‚‚‚‚‚€€€€€~~~~~~~~~€€€€€‚‚‚‚‚‚‚‚€€€€€~~~~~~~€€€€€‚‚‚‚‚€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€LIST”INFOICMTwebICOP5/97ICRD 1997-05-07IENGMarty FancherINAM Chime-BellISBJSongs of the WindchimesISFTSound Forge 4.0cue dataLIST<adtlltxtirgn lablRecord Take 001dclock-2.2.2/Dclock.ad0000644000175000017500000000077511033063011015110 0ustar bdefreesebdefreese! sample dclock defaults dclock*geometry: 240x87+271+5 dclock*foreground: chartreuse dclock*background: DarkSlateGray dclock*led_off: DarkGreen dclock*borderColor: white dclock*borderWidth: 2 dclock*widthFactor: 0.143 dclock*spaceFactor: 0.062 dclock*bellFile: /usr/share/sound/bell.wav dclock*alarmFile: /usr/share/sound/digital.wav dclock*font: *helvetica-medium-r-normal--14* dclock*audioPlay: /usr/bin/play dclock-2.2.2/Makefile.orig0000644000175000017500000000204311023024150015770 0ustar bdefreesebdefreese# # This is a Makefile for those people not using xmkmf to compile dclock. # # Remember to add the path to your X include files to CFLAGS and to # add the path to your X libraries to the front of LIBS. # prefix= /usr/local bindir= $(prefix)/bin mandir= $(prefix)/man/man1 appdir= ${prefix}/etc/X11/app-defaults PROGRAM= dclock SRCS= Dclock.c dclock.c OBJS= Dclock.o dclock.o HFILES= Dclock.h DclockP.h patchlevel.h ADFILE= DClock CC= gcc CFLAGS= -O LDFLAGS= LIBS= -lm -lXt -lX11 $(PROGRAM): ${OBJS} ${CC} ${LDFLAGS} ${OBJS} ${LIBS} -o $(PROGRAM) $(ADFILE): Dclock.ad cp -p $< $@ clean: ; rm -f ${OBJS} core $(PROGRAM) $(ADFILE) install: $(PROGRAM) $(ADFILE) install -d $(bindir) $(mandir) install --mode=0755 $(PROGRAM) $(bindir) install --mode=0644 $(ADFILE) $(appdir) install -d ${prefix}/man/man1 install -d ${prefix}/bin install -d ${prefix}/etc/X11/app-defaults shar: ; shar README Makefile dclock.man ${HFILES} ${SRCS} > dclock.shar tar: ; tar fcv - README Makefile dclock.man ${HFILES} ${SRCS} | \ compress > dclock.tar.Z dclock-2.2.2/Dclock.h0000644000175000017500000000504111033062636014756 0ustar bdefreesebdefreese/* * Dclock.c -- a digital clock widget. * Copyright (c) 1988 Dan Heller */ #ifndef _XtDclock_h #define _XtDclock_h /* Parameters: Name Class RepType Default Value ---- ----- ------- ------------- alarm Boolean Boolean False alarmTime Time long 00:00:00 alarmPersist Boolean Boolean False displayTime Boolean Boolean True bell Boolean Boolean False border BorderColor pixel Black borderWidth BorderWidth int 1 date String String NULL dateUp Boolean Boolean False destroyCallback Callback Pointer NULL foreground Foreground Pixel Chartreuse led_off Foreground Pixel ForestGreen background Background Pixel DarkSlateGray height Height int 80 mappedWhenManaged MappedWhenManaged Boolean True seconds Boolean Boolean False blink Boolean Boolean True scroll Boolean Boolean False fade Boolean Boolean True fadeRate Time int 50 tails Boolean Boolean True time Time long current time x Position int 0 y Position int 0 fontName String String "charter:italic" */ #ifndef XtRDimension #define XtRDimension "dimension" #endif /* XtRDimension */ #define XtRTime "Time" #define XtCTime "Time" #define XtNled_off "led_off" #define XtNseconds "seconds" #define XtNalarm "alarm" #define XtNalarmTime "alarmTime" #define XtNdisplayTime "displayTime" #define XtNtime "time" #define XtNbell "bell" #define XtNscroll "scroll" #define XtNfade "fade" #define XtNfadeRate "fadeRate" #define XtNtails "tails" #define XtNdate "date" #define XtNdateUp "dateUp" #define XtNmilitaryTime "militaryTime" #define XtNutcTime "utcTime" #define XtNangle "angle" #define XtNwidthFactor "widthFactor" #define XtNsmallRatio "smallRatio" #define XtNsecondGap "secondGap" #define XtNspaceFactor "spaceFactor" #define XtNblink "blink" #define XtNalarmFile "alarmFile" #define XtNbellFile "bellFile" #define XtNaudioPlay "audioPlay" #define XtNalarmPersist "alarmPersist" #ifdef XFT_SUPPORT #define XftNfontName "fontname" #endif typedef struct _DclockRec *DclockWidget; typedef struct _DclockClassRec *DclockWidgetClass; extern WidgetClass dclockWidgetClass; #endif /* _XtDclock_h */ dclock-2.2.2/TODO0000644000175000017500000000047107121761456014111 0ustar bdefreesebdefreesePossible things to come: 1) AM/PM in graphics window 2) AM/PM format allowed in alarm-time display and command line 3) Choose date string font size as a fraction of the window size 4) Send stderr print statements to a static text window 5) Stopwatch option 6) Timer (countdown) option 7) Timezone option dclock-2.2.2/dclock.man0000777000175000017500000000000011142374640016662 2dclock.1ustar bdefreesebdefreesedclock-2.2.2/DclockP.h0000644000175000017500000000435411034562531015104 0ustar bdefreesebdefreese/* * Dclock.c -- a digital clock widget. * Copyright (c) 1988 Dan Heller */ #ifndef _XtDclockP_h #define _XtDclockP_h #include #include "Dclock.h" /* Add -DXFT_SUPPORT in the Imakefile for freefont support */ #include typedef struct { Pixel foreground; Pixel led_off; Pixel background; Boolean tails; /* put tails on 6 & 9 */ Boolean scroll; Boolean fade; int fade_rate; /* millisec. betw. fade steps */ float angle; /* rise over run */ float width_factor; /* ratio of digit to segment width */ float small_ratio; /* ratio of small to large digits */ float sec_gap; /* gap between normal digits and seconds, as ratio to digit width */ float space_factor; /* ratio of digit width to border sp.*/ Boolean seconds; Boolean blink; /* colon blinks the seconds */ Boolean bell; Boolean miltime; Boolean utc; Boolean display_time; /* when false, display alarm time */ Boolean alarm; /* alarm goes off at alarm time */ String alarm_time; /* time alarm goes off "14:30:00" */ Boolean alarm_persist; /* stays in reverse vid after alarm */ String date_fmt; Boolean dateup; String alarmfile; /* audio file to play for alarm */ String bellfile; /* audio file to play for hour bell */ String audioplay; /* executable to use to play bell */ XFontStruct *font; #ifdef XFT_SUPPORT String xftfontname; XftFont *xftfont; XftDraw *xftdraw; XftColor xftbg; XftColor xftfg; #endif /* non-resources (e.g. user can't set) */ XtIntervalId interval_id; XtIntervalId punt_resize; GC foreGC, backGC; float digit_w, digit_h; Pixmap digit_one[2]; /* "1" or blank, for civilian time */ Pixmap digits[10]; Pixmap tiny_digits[10]; Pixmap colon[2]; Boolean holdoff; /* Resize/Expose holdoff */ } DclockPart; typedef struct _DclockRec { CorePart core; DclockPart dclock; } DclockRec; typedef struct {int dummy;} DclockClassPart; typedef struct _DclockClassRec { CoreClassPart core_class; DclockClassPart dclock_class; } DclockClassRec; extern DclockClassRec dclockClassRec; #endif /* _XtDclockP_h */ dclock-2.2.2/dclock.10000644000175000017500000002707411023023404014726 0ustar bdefreesebdefreese.TH DCLOCK 1 "1 March 1988" "X Version 11" .SH NAME dclock - digital clock for X .SH SYNOPSIS .B dclock [-\fItoolkitoption\fP ...] [-option ...] .SH DESCRIPTION The .I dclock program displays the time in digital format only. The time is updated on a per second basis or on a per minute basis. This program is nothing more than a wrapper around the dclock widget not associated with any particular widget set. .sp When the clock is running, the user may change attributes by typing: .in +2 .ta 2i .nf \fBr\fP Toggles \fBReverse Video\fP. \fBs\fP Toggles the \fBseconds\fP display. \fBb\fP Toggles the \fBbell\fP attribute. \fBj\fP Toggles the \fBjump/scroll\fP attribute. \fBf\fP Toggles the \fBfade\fP attribute. \fBd\fP Toggles the \fBdate\fP format. \fBu\fP Toggles the location of \fBdate\fP (top/bottom). \fBm\fP Toggles the \fBmilitary time\fP format. \fBa\fP Toggles the \fBalarm clock\fP. \fBt\fP Toggles the \fBtails\fP attribute. \fB:\fP Toggles the \fBblinking colon\fP. \fB/\fP Increases the tilt of the numbers. \fB\\\fP Decreases the tilt of the numbers. \fB+\fP Increases the thickness of the numbers. \fB-\fP Decreases the thickness of the numbers. \fB>\fP Increases the spacing between numbers. \fB<\fP Decreases the spacing between numbers. \fBq\fP quits the program. .sp .fi .in -2 The third mouse button puts the clock in the mode where the alarm clock can be set. The alarm must be set in 24-hour format to distringuish between am and pm time. Digits can be changed by selecting the digit with the left or middle mouse button. The Left button advances the time while the Middle button moves the time backwards. Using the left or middle button over the text at the bottom of the clock toggles the alarm from actually being set (or, use the 'a' key). .SH OPTIONS .I Dclock accepts all of the standard X Toolkit command line options along with the additional options listed below: .TP 8 .B \-help This option indicates that a brief summary of the allowed options should be printed on the standard error. .TP 8 .B \-bell .TP 8 .B \-nobell .br This option, if enabled, indicates that the bell will beep once on the half hour and twice on the hour. .TP 8 .B \-bellFile \fIfilename\fP This specifies a sound file to use to play the dclock hourly chime. If unspecified, or the string "NULL" is used, the system beep is used instead. The sound file format must be understood by the executable specified by option "audioPlay". The "NULL" value is a means to override a system-level setting to disable external sound playing. .TP 8 .B \-miltime .TP 8 .B \-nomiltime .br This option, if enabled, causes the clock to display the time in 24 hour (military) time format. .TP 8 .B \-utc .TP 8 .B \-noutc .br This option, causes the clock to display the UTC (GMT) time rather than the default local time. .TP 8 .B \-tails .TP 8 .B \-notails .br This option places [or removes] "tails" on the digits 6 and 9. .TP 8 .B \-scroll .TP 8 .B \-noscroll .br When the time changes, the digits scroll from the previous digit to the next digit. The -noscroll option turns the behavior off. .TP 8 .B \-blink .TP 8 .B \-noblink .br The colon separating hours from minutes blinks on and off once per second. With the -noblink option, it remains on permanently. .TP 8 .B \-persist .TP 8 .B \-nopersist .br This option determines whether or not the clock display remains in the reverse video state after the alarm goes off. .TP 8 .B \-fade .TP 8 .B \-nofade .br This option, when enabled, causes the display to fade from one digit to the next instead of jumping or scrolling. If fade is specified, the \fBscroll\fP attribute will be automatically disabled. .TP 8 .B \-fadeRate \fIn\fP The fadeRate attribute takes an integer value which specifies the number of milliseconds to wait between iterations when fading from one digit to the next. A larger value will make the fade slower and more pronounced. The default is 50. .TP 8 .B \-audioPlay \fIfilename\fP Specifies an executable to use to play audio files for the bell and alarm. The default is none, which falls back to using the system bell for both the dclock bell and alarm. .TP 8 .B \-date \fI"format"\fP The date is printed under the time in the specified font. The string displayed is in the "format" argument. The format corresponds to the system call strftime() (see strftime(3)). .br .sp .ti +2 dclock -date "Today is %A" .sp Useful examples of strftime() formatting: .in +2 .nf %A Full weekday name %a Three-char weekday name (Sun, Mon, Tue...) %B Full month name %b Three-char month name (Jan, Feb, Mar...) %d The date (numerical day number of the month) %Y Full year (4 digits) %y 2-digit year number .fi .in -2 .TP 8 .B \-dateup By default, the date string is at the bottom of the display. This option starts it at the top, instead. .TP 8 .B \-alarm .TP 8 .B \-noalarm .br The alarm is turned on or off. Alarm rings bell and toggles reverse video. .br .TP 8 .B \-alarmTime \fIHH:MM\fP If alarm is set, it goes off at time specified in 24-hour format. .TP 8 .B \-alarmFile \fIfilename\fP This specifies a sound file to use to play the dclock alarm. If unspecified, or the string "NULL" is used, the system beep is used instead. The sound file format must be understood by the executable specified by option "audioPlay". The "NULL" string is a means to override a system-level setting to disable external sound playing. .TP 8 .B \-seconds This option will update the clock every second and display the time including the seconds. .TP 8 .B \-slope \fIvalue\fP Sets the angle of the digits according to the (floating-point) slope value \fIvalue\fP. .TP 8 .B \-thickness \fIwidth_factor\fP Sets the segment thickness as a (floating-point) ratio to digit width. .TP 8 .B \-spacing \fIspace_factor\fP Sets the digit spacing as a (floating-point) ratio to digit width. .TP 8 .B \-smallsize \fIspace_factor\fP Sets the seconds digit size as a (floating-point) ratio to the digit size of the minutes and hours digits. .TP 8 .B \-second_gap \fIspace_factor\fP Sets the spacing of the seconds digits from the other digits as a (floating-point) ratio to digit width. .B \-bg \fIcolor\fP This option specifies the color to use for the background of the window. The default is ``darkslategray''. .TP 8 .B \-bd \fIcolor\fP This option specifies the color to use for the border of the window. The default is ``black.'' .TP 8 .B \-bw \fInumber\fP This option specifies the width in pixels of the border surrounding the window. .TP 8 .B \-fg \fIcolor\fP This option specifies the color to use for displaying text and digit segments. The default is ``chartreuse''. .TP 8 .B \-led_off \fIcolor\fP This option specifies the color to use for displaying digit segments when turned off. The default is ``darkgreen''. .TP 8 .B \-fn \fIfont\fP This option specifies the font to be used for displaying normal text. The default is ``Fixed.'' .TP 8 .B \-geometry \fIgeometry\fP This option specifies the prefered size and position of the clock window. .TP 8 .B \-display \fIhost\fP:\fIdisplay\fP This option specifies the X server to contact. .TP 8 .B \-xrm \fIresourcestring\fP This option specifies a resource string to be used. This is especially useful for setting resources that do not have separate command line options. .SH X DEFAULTS It understands all of the core resource names and classes as well as: .PP .TP 8 .B width (\fPclass\fB Width) Specifies the width of the clock. .TP 8 .B height (\fPclass\fB Height) Specifies the height of the clock. .TP 8 .B foreground (\fPclass\fB Foreground) Specifies the color for the digits. Using the class specifies the color for all things that normally would appear in the foreground color. The default is ``chartreuse''. .TP 8 .B background (\fPclass\fB Background) Specifies the background color, by default ``DarkSlateGray''. .TP 8 .B led_off (\fPclass\fB Foreground) Specifies the color of the digit segments when ``off''. This can be set to be the background color, or it can be set to a color just slightly different from the background, matching the segment colors, to give just a hint of color. Default ``DarkGreen'' works well with the default segment color of ``chartreuse''. .TP 8 .B bell (\fPclass\fB Boolean) Specifies whether or not a bell should be rung on the hour and half hour. .TP 8 .B font (\fPclass\fB Font) Specifies the font to be used for the date. .TP 8 .B militaryTime (\fPclass\fB Boolean) Specifies whether the military (24hr) time format should be used. .TP 8 .B utc (\fPclass\fB Boolean) Specifies whether UTC (GMT) time should be used, rather than local time. .TP 8 .B reverseVideo (\fPclass\fB ReverseVideo) Specifies that the foreground and background colors should be reversed. .TP 8 .B scroll (\fPclass\fB Boolean) Specifies whether the digits should scroll or not. .TP 8 .B fade (\fPclass\fB Boolean) Specifies whether the digits should fade or not. .TP 8 .B fadeRate (\fPclass\fB Time) The number of milliseconds of delay between iterations of fading. .TP 8 .B seconds (\fPclass\fB Boolean) Specifies whether the seconds should be displayed or not. .TP 8 .B bell (\fPclass\fB Boolean) Specifies whether the bell should sound on the half hour and on the hour. .TP 8 .B tails (\fPclass\fB Boolean) Specifies whether tails should be put on the digits 6 and 9. .TP 8 .B blink (\fPclass\fB Boolean) Specifies whether the colon separating hours from minutes should blink on and off once per second or remain on permanently. .TP 8 .B alarm (\fPclass\fB Boolean) Specifies whether the alarm should go off at the specified time (alarmTime). .TP 8 .B alarmTime (\fPclass\fB String) Specifies the time alarm goes off if alarm is set. .TP 8 .B alarmPersist (\fPclass\fB Boolean) Specifies whether the alarm should remain in reverse video after the alarm goes off, or return to normal video. .TP 8 .B angle (\fPclass\fB Float) Defines the slope of the digits (default 6). .TP 8 .B smallRatio (\fPclass\fB Float) Defines the size of the seconds digits compared to the minutes digits (default 2/3). .TP 8 .B secondGap (\fPclass\fB Float) Defines the amount of space between the minutes digits and the seconds digits (default 0.3). .TP 8 .B widthFactor (\fPclass\fB Float) Determines the width of segments as a ratio to digit width (default 0.13). .TP 8 .B spaceFactor (\fPclass\fB Float) Determines the spacing between digit as a ratio to digit width (default 0.09). .TP 8 .B bellFile (\fPclass\fB String) Specifies an audio file to play for the hourly bell (no default). .TP 8 .B alarmFile (\fPclass\fB String) Specifies an audio file to play for the alarm (no default). .TP 8 .B audioPlay (\fPclass\fB String) Specifies an executable to use to play the bell and alarm audio files, if they are specified. Otherwise, the system bell is used (default is "/usr/bin/play"). .SH ENVIRONMENT .PP .TP 8 .B DISPLAY to get the default host and display number. .B XENVIRONMENT to get the name of a resource file that overrides the global resources stored in the RESOURCE_MANAGER property. .SH "SEE ALSO" X(1), xrdb(1), time(3C). .SH BUGS .I Dclock believes the system clock. .PP Scrolling from 9 to 10 O'Clock seems weird, but chances are you won't notice it. .PP Scrolling can take so long that dclock may lag behind system time by a fraction of a second and eventually skip a second to catch up. In modern times, it should be dealing with this by tracking seconds with a separate thread. .SH COPYRIGHT Copyright (c) 1988, Dan Heller. Revisions copyright (c) 1993 and 1999, Tim Edwards. .SH AUTHOR .nf Original dclock by Dan Heller (1988) or .br Fade & tails by Steve Reinhardt, .br Derived geometry by Tim Edwards (1993) .br Antialiasing, color fades, and audio play by Tim Edwards (1999) .fi