From 3ce369e6876c49ad7a101ad222048bd5446b7125 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= <vslavik@fastmail.fm> Date: Sun, 17 Oct 1999 13:03:40 +0000 Subject: [PATCH] added HTML printing git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4030 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 5 +- distrib/msw/tmake/filelist.txt | 2 + docs/latex/wx/classes.tex | 3 + docs/latex/wx/htdcrend.tex | 129 +++++++ docs/latex/wx/hteasypr.tex | 151 ++++++++ docs/latex/wx/htmlprn.tex | 67 +--- docs/latex/wx/htprint.tex | 96 +++++ include/wx/html/htmprint.h | 239 ++++++++++++ samples/html/printing/Makefile.in | 2 +- samples/html/printing/mondrian.xpm | 44 --- samples/html/printing/pic.png | Bin 31315 -> 0 bytes samples/html/printing/printing.cpp | 430 +++++++++------------- samples/html/printing/printing.h | 76 ---- samples/html/printing/test.htm | 300 +++++++++------ src/html/htmprint.cpp | 570 +++++++++++++++++++++++++++++ src/msw/makefile.b32 | 2 +- src/msw/makefile.bcc | 2 +- src/msw/makefile.dos | 2 +- src/msw/makefile.g95 | 3 +- src/msw/makefile.sc | 2 +- src/msw/makefile.vc | 3 +- src/msw/makefile.wat | 2 +- src/wxvc.dsp | 4 + src/wxvc6.dsp | 4 + src/wxvc_dll.dsp | 4 + 25 files changed, 1586 insertions(+), 556 deletions(-) create mode 100644 docs/latex/wx/htdcrend.tex create mode 100644 docs/latex/wx/hteasypr.tex create mode 100644 docs/latex/wx/htprint.tex create mode 100644 include/wx/html/htmprint.h delete mode 100644 samples/html/printing/mondrian.xpm delete mode 100644 samples/html/printing/pic.png delete mode 100644 samples/html/printing/printing.h create mode 100644 src/html/htmprint.cpp diff --git a/Makefile.in b/Makefile.in index 2d7560d84a..31ccbd8703 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,5 @@ # -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T! # @@ -607,6 +607,7 @@ HTML_HEADERS = \ html/htmlpars.h \ html/htmltag.h \ html/htmlwin.h \ + html/htmprint.h \ html/m_templ.h \ html/winpars.h @@ -1811,6 +1812,7 @@ HTMLOBJS = \ htmlpars.o \ htmltag.o \ htmlwin.o \ + htmprint.o \ m_fonts.o \ m_hline.o \ m_image.o \ @@ -1831,6 +1833,7 @@ HTMLDEPS = \ htmlpars.d \ htmltag.d \ htmlwin.d \ + htmprint.d \ m_fonts.d \ m_hline.d \ m_image.d \ diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index 5ddfbf0a73..44145dab9f 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -413,6 +413,7 @@ m_list.cpp H m_pre.cpp H m_tables.cpp H search.cpp H +htmprint.cpp H arrimpl.cpp W listimpl.cpp W @@ -846,6 +847,7 @@ htmltag.h L htmlwin.h L winpars.h L m_templ.h L +htmprint.h L caret.h N choicdgg.h N diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex index f52ddd10e6..b3b967630e 100644 --- a/docs/latex/wx/classes.tex +++ b/docs/latex/wx/classes.tex @@ -90,9 +90,12 @@ \input htcell.tex \input htcolor.tex \input htcontnr.tex +\input htdcrend.tex +\input hteasypr.tex \input htfilter.tex \input hthelpct.tex \input htparser.tex +\input htprint.tex \input httag.tex \input httaghnd.tex \input httagmod.tex diff --git a/docs/latex/wx/htdcrend.tex b/docs/latex/wx/htdcrend.tex new file mode 100644 index 0000000000..42858c8b0f --- /dev/null +++ b/docs/latex/wx/htdcrend.tex @@ -0,0 +1,129 @@ +% +% automatically generated by HelpGen from +% htmprint.h at 17/Oct/99 12:48:02 +% + + +\section{\class{wxHtmlDCRenderer}}\label{wxhtmldcrenderer} + +This class can render HTML document into specified area of DC. You can use it +in your own printing code, although use of \helpref{wxHtmlEasyPrinting}{wxhtmleasyprinting} +or \helpref{wxHtmlPrintout}{wxhtmlprintout} is strongly recommended. + + +\wxheading{Derived from} + +\helpref{wxObject}{wxobject} + + + +\latexignore{\rtfignore{\wxheading{Members}}} + + +\membersection{wxHtmlDCRenderer::wxHtmlDCRenderer}\label{wxhtmldcrendererwxhtmldcrenderer} + +\func{}{wxHtmlDCRenderer}{\void} + +Constructor. + + +\membersection{wxHtmlDCRenderer::SetDC}\label{wxhtmldcrenderersetdc} + +\func{void}{SetDC}{\param{wxDC* }{dc}, \param{int }{maxwidth}} + +Assign DC instance to the renderer. + +\wxheading{Parameters} + +\docparam{maxwidth}{width of the area (on this DC) that is equivalent to screen's width, +in pixels (you should set it to page width minus margins). + +{\bf Note:} In current implementation +screen width is always 800 pixels : it gives best results and ensures (almost) same printed outputs +across platforms and differently configured desktops.} + +Also see \helpref{SetSize}{wxhtmldcrenderersetsize} + + + +\membersection{wxHtmlDCRenderer::SetSize}\label{wxhtmldcrenderersetsize} + +\func{void}{SetSize}{\param{int }{width}, \param{int }{height}} + +Set size of output rectangle, in pixels. Note that you {\bf can't} change +width of the rectangle between calls to \helpref{Render}{wxhtmldcrendererrender}! +(You can freely change height.) +If you set width equal to maxwidth then HTML is rendered as if it were displayed in fullscreen. +If you set width = 1/2 maxwidth the it is rendered as if it covered half the screen +and so on. + + +\membersection{wxHtmlDCRenderer::SetHtmlText}\label{wxhtmldcrenderersethtmltext} + +\func{void}{SetHtmlText}{\param{const wxString\& }{html}, \param{const wxString\& }{basepath = wxEmptyString}, \param{bool }{isdir = TRUE}} + +Assign text to the renderer. \helpref{Render}{wxhtmldcrendererrender} then draws +the text onto DC. + + +\wxheading{Parameters} + +\docparam{html}{HTML text. (NOT file!)} + +\docparam{basepath}{base directory (html string would be stored there if it was in +file). It is used to determine path for loading images, for example.} + +\docparam{isdir}{FALSE if basepath is filename, TRUE if it is directory name +(see \helpref{wxFileSystem}{wxfilesystem} for detailed explanation)} + + +\membersection{wxHtmlDCRenderer::Render}\label{wxhtmldcrendererrender} + +\func{int}{Render}{\param{int }{x}, \param{int }{y}, \param{int }{from = 0}, \param{int }{dont\_render = FALSE}} + +Renders HTML text to the DC. + +\wxheading{Parameters} + + +\docparam{x,y}{ position of upper-left corner of printing rectangle (see \helpref{SetSize}{wxhtmldcrenderersetsize})} + + +\docparam{from}{y-coordinate of the very first visible cell} + +\docparam{dont\_render}{if TRUE then this method only returns y coordinate of the next page +and does not output anything} + +Returned value is y coordinate of first cell than didn't fit onto page. +Use this value as {\it from} in next call to Render in order to print multipages +document. + + +\wxheading{Caution!} + +Following 3 methods {\bf must} always be called before any call to Render (preferably +in this order): + +\begin{itemize} + +\item \helpref{SetDC}{wxhtmldcrenderersetdc} +\item \helpref{SetSize}{wxhtmldcrenderersetsize} +\item \helpref{SetHtmlText}{wxhtmldcrenderersethtmltext} + +\end{itemize} + +{\bf Render() changes DC's user scale and does NOT restore it!!} + + + +\membersection{wxHtmlDCRenderer::GetTotalHeight}\label{wxhtmldcrenderergettotalheight} + +\func{int}{GetTotalHeight}{\void} + +Returns height of the HTML text. This is important if area height (see \helpref{SetSize}{wxhtmldcrenderersetsize}) +is smaller that total height and thus the page cannot fit into it. In that case you're supposed to +call \helpref{Render}{wxhtmldcrendererrender} as long as it's return value is smaller than GetTotalHeight's. + + + + diff --git a/docs/latex/wx/hteasypr.tex b/docs/latex/wx/hteasypr.tex new file mode 100644 index 0000000000..0b7c4192e4 --- /dev/null +++ b/docs/latex/wx/hteasypr.tex @@ -0,0 +1,151 @@ +% +% automatically generated by HelpGen from +% htmprint.h at 17/Oct/99 12:48:02 +% + + +\section{\class{wxHtmlEasyPrinting}}\label{wxhtmleasyprinting} + + +This class provides very simple interface to printing +architecture. It allows you to print HTML documents only +with very few commands. + + +\wxheading{Note} +Do not create this class on stack only. You should create an instance on app +startup and use this instance for all printing operations. The reason is that +this class stores various settings in it. + + +\wxheading{Derived from} + +\helpref{wxObject}{wxobject} + + +\latexignore{\rtfignore{\wxheading{Members}}} + + +\membersection{wxHtmlEasyPrinting::wxHtmlEasyPrinting}\label{wxhtmleasyprintingwxhtmleasyprinting} + +\func{}{wxHtmlEasyPrinting}{\param{const wxString\& }{name = "Printing"}, \param{wxFrame* }{parent\_frame = NULL}} + +Constructor. + +\wxheading{Parameters} + +\docparam{name}{Name of the printing. Used by preview frames and setup dialogs.} + +\docparam{parent\_frame}{pointer to the frame that will own preview frame and setup dialogs. May be NULL.} + + + +\membersection{wxHtmlEasyPrinting::PreviewFile}\label{wxhtmleasyprintingpreviewfile} + +\func{void}{PreviewFile}{\param{const wxString\& }{htmlfile}} + +Previews HTML file. + + +\membersection{wxHtmlEasyPrinting::PreviewText}\label{wxhtmleasyprintingpreviewtext} + +\func{void}{PreviewText}{\param{const wxString\& }{htmltext}, \param{const wxString\& }{basepath = wxEmptyString}} + +Previews HTML text (not file!). + +\wxheading{Parameters} + +\docparam{htmltext}{HTML text.} + +\docparam{basepath}{base directory (html string would be stored there if it was in +file). It is used to determine path for loading images, for example.} + + + +\membersection{wxHtmlEasyPrinting::PrintFile}\label{wxhtmleasyprintingprintfile} + +\func{void}{PrintFile}{\param{const wxString\& }{htmlfile}} + +Prints HTML file. + + +\membersection{wxHtmlEasyPrinting::PrintText}\label{wxhtmleasyprintingprinttext} + +\func{void}{PrintText}{\param{const wxString\& }{htmltext}, \param{const wxString\& }{basepath = wxEmptyString}} + +Prints HTML text (not file!). + +\wxheading{Parameters} + +\docparam{htmltext}{HTML text.} + +\docparam{basepath}{base directory (html string would be stored there if it was in +file). It is used to determine path for loading images, for example.} + + +\membersection{wxHtmlEasyPrinting::PrinterSetup}\label{wxhtmleasyprintingprintersetup} + +\func{void}{PrinterSetup}{\void} + +Displays printer setup dialog and allows the user to modify settings. + + +\membersection{wxHtmlEasyPrinting::PageSetup}\label{wxhtmleasyprintingpagesetup} + +\func{void}{PageSetup}{\void} + +Displays page setup dialog and allows the user to modify settings. + + +\membersection{wxHtmlEasyPrinting::SetHeader}\label{wxhtmleasyprintingsetheader} + +\func{void}{SetHeader}{\param{const wxString\& }{header}, \param{int }{pg = wxPAGE\_ALL}} + +Sets page header. + +\wxheading{Parameters} + +\docparam{header}{HTML text to be used as header. You can use macros in it: +\begin{itemize} +\item @PAGENUM@ is replaced by page number +\item @PAGESCNT@ is replaced by total number of pages +\end{itemize} +} + +\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.} + + +\membersection{wxHtmlEasyPrinting::SetFooter}\label{wxhtmleasyprintingsetfooter} + +\func{void}{SetFooter}{\param{const wxString\& }{footer}, \param{int }{pg = wxPAGE\_ALL}} + +Sets page footer. + +\wxheading{Parameters} + +\docparam{footer}{HTML text to be used as footer. You can use macros in it: +\begin{itemize} +\item @PAGENUM@ is replaced by page number +\item @PAGESCNT@ is replaced by total number of pages +\end{itemize} +} + + +\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.} + + + + +\membersection{wxHtmlEasyPrinting::GetPrintData}\label{wxhtmleasyprintinggetprintdata} + +\func{wxPrintData*}{GetPrintData}{\void} + +Returns pointer to \helpref{wxPrintData}{wxprintdata} instance used by this class. You can +set its parameters (via SetXXXX methods). + +\membersection{wxHtmlEasyPrinting::GetPageSetupData}\label{wxhtmleasyprintinggetpagesetupdata} + +\func{wxPageSetupDialogData*}{GetPageSetupData}{\void} + +Returns pointer to \helpref{wxPageSetupDialogData}{wxpagesetupdialogdata} instance used by +this class. You can set its parameters (via SetXXXX methods). diff --git a/docs/latex/wx/htmlprn.tex b/docs/latex/wx/htmlprn.tex index 0fea5d25ff..6ce81cf5cf 100644 --- a/docs/latex/wx/htmlprn.tex +++ b/docs/latex/wx/htmlprn.tex @@ -1,63 +1,14 @@ -\membersection{Printing}\label{printing} +\membersection{HTML Printing}\label{printing} -The wxHTML library provides printing facilities. +The wxHTML library provides printing facilities with several levels of complexity. -You can redirect output displayed by \helpref{wxHtmlWindow}{wxhtmlwindow} -to the printer DC using this (or similar) code (see {\bf printing} sample for -more details) : +The easiest way to print an HTML document is to use +\helpref{wxHtmlEasyPrinting class}{wxhtmleasyprinting}. It lets you print HTML documents with only one +command and you don't have to care about wxPrintouts etc. at all. It is only simple wrapper around +\helpref{wxHtmlPrintout}{wxhtmlprintout}, normal wxWindows printout class. -\begin{verbatim} -// -// This method prints page number one to dc: -// -void MyPrintout::DrawPageOne(wxDC *dc) -{ - int leftMargin = 20; - int topMargin = 50; - // You must compute the margins there. - // Caution! These values are NOT in printer DC's units. - // These values are in screen pixels. - // (see bellow) - - // Here we obtain internal cell representation of HTML document: - // (html is our pointer to wxHtmlWindow object) - wxHtmlContainerCell *cell = html -> GetInternalRepresentation(); - - // Now we have to check in case our real page size is reduced - // (e.g. because we're drawing to a print preview memory DC) - int pageWidth, pageHeight; - int w, h; - dc->GetSize(&w, &h); // DC size - GetPageSizePixels(&pageWidth, &pageHeight); // real size - - // Now we must scale it. This equation will map wxHtmlWindow - // to page in this way: - // |--this is whole page as printed---------| - // | | | | - // | | | | - // |-margin-|-----wxHtmlWindow-----|-margin-| - // - // So page width is 2*leftMargin + [wxHtmlWindow size] - // (measured in screen pixels). - // We will scale the printer DC so that wxHtmlWindow's content - // spreads from left to right: - float scale = (float)( - (float)(pageWidth) / - (float)(2 * leftMargin + cell -> GetMaxLineWidth())); - - // If printer pageWidth == current DC width, then this doesn't - // change. But w might be the preview bitmap width, so scale down. - float overallScale = scale * (float)(w/(float)pageWidth); - - // Set the user scale so that our computations take effect: - dc->SetUserScale(overallScale, overallScale); - dc->SetBackgroundMode(wxTRANSPARENT); - - // And this is - finally - HTML stuff: - cell -> Draw(*dc, leftMargin, topMargin, 0, cell -> GetHeight()); -} -\end{verbatim} - -(Thanks to Julian Smart for sample) +And finally there is low level class \helpref{wxHtmlDCRenderer}{wxhtmldcrenderer} which you can use to +render HTML into rectangular area on any DC. It supports rendering into multiple rectangles with same +width. (Most common use is placing one rectangle on each page or printing into two columns.) diff --git a/docs/latex/wx/htprint.tex b/docs/latex/wx/htprint.tex new file mode 100644 index 0000000000..a3bb4b60e2 --- /dev/null +++ b/docs/latex/wx/htprint.tex @@ -0,0 +1,96 @@ +% +% automatically generated by HelpGen from +% htmprint.h at 17/Oct/99 12:48:02 +% + + +\section{\class{wxHtmlPrintout}}\label{wxhtmlprintout} + +This class serves as printout class for HTML documents. + +\wxheading{Derived from} + +\helpref{wxPrintout}{wxprintout} + + +\latexignore{\rtfignore{\wxheading{Members}}} + + +\membersection{wxHtmlPrintout::wxHtmlPrintout}\label{wxhtmlprintoutwxhtmlprintout} + +\func{}{wxHtmlPrintout}{\param{const wxString\& }{title = "Printout"}} + +Constructor. + + + +\membersection{wxHtmlPrintout::SetHtmlText}\label{wxhtmlprintoutsethtmltext} + +\func{void}{SetHtmlText}{\param{const wxString\& }{html}, \param{const wxString\& }{basepath = wxEmptyString}, \param{bool }{isdir = TRUE}} + +Prepare the class for printing this HTML text. + +\wxheading{Parameters} + +\docparam{html}{HTML text. (NOT file!)} + +\docparam{basepath}{base directory (html string would be stored there if it was in +file). It is used to determine path for loading images, for example.} + +\docparam{isdir}{FALSE if basepath is filename, TRUE if it is directory name +(see \helpref{wxFileSystem}{wxfilesystem} for detailed explanation)} + + + +\membersection{wxHtmlPrintout::SetHtmlFile}\label{wxhtmlprintoutsethtmlfile} + +\func{void}{SetHtmlFile}{\param{const wxString\& }{htmlfile}} + +Prepare the class for printing this HTML {\bf file}. The file may be located on +any virtual file system or it may be normal file. + + + +\membersection{wxHtmlPrintout::SetHeader}\label{wxhtmlprintoutsetheader} + +\func{void}{SetHeader}{\param{const wxString\& }{header}, \param{int }{pg = wxPAGE\_ALL}} + +Sets page header. + +\wxheading{Parameters} + +\docparam{header}{HTML text to be used as header. You can use macros in it: +\begin{itemize} +\item @PAGENUM@ is replaced by page number +\item @PAGESCNT@ is replaced by total number of pages +\end{itemize} +} + +\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.} + + +\membersection{wxHtmlPrintout::SetFooter}\label{wxhtmlprintoutsetfooter} + +\func{void}{SetFooter}{\param{const wxString\& }{footer}, \param{int }{pg = wxPAGE\_ALL}} + +Sets page footer. + +\wxheading{Parameters} + +\docparam{footer}{HTML text to be used as footer. You can use macros in it: +\begin{itemize} +\item @PAGENUM@ is replaced by page number +\item @PAGESCNT@ is replaced by total number of pages +\end{itemize} +} + +\docparam{pg}{one of wxPAGE\_ODD, wxPAGE\_EVEN and wxPAGE\_ALL constants.} + + +\membersection{wxHtmlPrintout::SetMargins}\label{wxhtmlprintoutsetmargins} + +\func{void}{SetMargins}{\param{float }{top = 25.2}, \param{float }{bottom = 25.2}, \param{float }{left = 25.2}, \param{float }{right = 25.2}, \param{float }{spaces = 5}} + +Sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space +between text and header and/or footer + diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h new file mode 100644 index 0000000000..c35df126ec --- /dev/null +++ b/include/wx/html/htmprint.h @@ -0,0 +1,239 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmprint.h +// Purpose: html printing classes +// Author: Vaclav Slavik +// Created: 25/09/99 +// RCS-ID: $Id$ +// Copyright: (c) +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_HTMPRINT_H_ +#define _WX_HTMPRINT_H_ + +#ifdef __GNUG__ +#pragma interface +#endif + +#include <wx/defs.h> + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/html/htmlcell.h" +#include "wx/html/winpars.h" + +#include "wx/print.h" +#include "wx/printdlg.h" + + +//-------------------------------------------------------------------------------- +// wxHtmlDCRenderer +// This class is capable of rendering HTML into specified +// portion of DC +//-------------------------------------------------------------------------------- + + +class wxHtmlDCRenderer : public wxObject +{ + public: + wxHtmlDCRenderer(); + ~wxHtmlDCRenderer(); + + // Following 3 methods *must* be called before any call to Render: + void SetDC(wxDC *dc, int maxwidth); + // asign DC to this render + // maxwidth is width of area (on this DC) that is equivalent to screen's width, in pixels + // (you should set it to page width minus margins) + // Also see SetSize + void SetSize(int width, int height); + // sets size of output rectangle, in pixels. Note that you *can't* change + // width of the rectangle between calls to Render! (You can freely change height.) + // If you set width = maxwidth then HTML is rendered as if it were displayed in fullscreen. + // If you set width = 1/2 maxwidth the it is rendered as if it covered half the screen + // and so on.. + void SetHtmlText(const wxString& html, const wxString& basepath = wxEmptyString, bool isdir = TRUE); + // sets the text to be displayed + // + // basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is FALSE if basepath is filename, TRUE if it is directory name + // (see wxFileSystem for detailed explanation) + + int Render(int x, int y, int from = 0, int dont_render = FALSE); + // [x,y] is position of upper-left corner of printing rectangle (see SetSize) + // from is y-coordinate of the very first visible cell + // Returned value is y coordinate of first cell than didn't fit onto page. + // Use this value as 'from' in next call to Render in order to print multiple pages + // document + // If dont_render is TRUE then nothing is rendered into DC and it only counts + // pixels and return y coord of the next page + // + // CAUTION! Render() changes DC's user scale and does NOT restore it! + + int GetTotalHeight(); + // returns total height of the html document + // (compare Render's return value with this) + + private: + + wxDC *m_DC; + wxHtmlWinParser *m_Parser; + wxFileSystem *m_FS; + wxHtmlContainerCell *m_Cells; + int m_MaxWidth, m_Width, m_Height; + double m_Scale; +}; + + + + + +enum { + wxPAGE_ODD, + wxPAGE_EVEN, + wxPAGE_ALL +}; + + + +//-------------------------------------------------------------------------------- +// wxHtmlPrintout +// This class is derived from standard wxWindows printout class +// and is used to print HTML documents. +//-------------------------------------------------------------------------------- + + +class wxHtmlPrintout : public wxPrintout +{ + public: + wxHtmlPrintout(const wxString& title = "Printout"); + ~wxHtmlPrintout(); + + void SetHtmlText(const wxString& html, const wxString &basepath = wxEmptyString, bool isdir = TRUE); + // prepares the class for printing this html document. + // Must be called before using the class, in fact just after constructor + // + // basepath is base directory (html string would be stored there if it was in + // file). It is used to determine path for loading images, for example. + // isdir is FALSE if basepath is filename, TRUE if it is directory name + // (see wxFileSystem for detailed explanation) + + void SetHtmlFile(const wxString &htmlfile); + // same as SetHtmlText except that it takes regular file as the parameter + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + void SetMargins(float top = 25.2, float bottom = 25.2, float left = 25.2, float right = 25.2, + float spaces = 5); + // sets margins in milimeters. Defaults to 1 inch for margins and 0.5cm for space + // between text and header and/or footer + + // wxPrintout stuff: + bool OnPrintPage(int page); + bool HasPage(int page); + void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + bool OnBeginDocument(int start, int end); + + private: + + void RenderPage(wxDC *dc, int page); + // renders one page into dc + wxString TranslateHeader(const wxString& instr, int page); + // substitute @PAGENUM@ and @PAGESCNT@ by real values + void CountPages(); + // counts pages and fills m_NumPages and m_PageBreaks + + + private: + int m_NumPages; + int m_PageBreaks[HTML_PRINT_MAX_PAGES]; + + wxString m_Document, m_BasePath; + bool m_BasePathIsDir; + wxString m_Headers[2], m_Footers[2]; + + int m_HeaderHeight, m_FooterHeight; + wxHtmlDCRenderer *m_Renderer, *m_RendererHdr; + float m_MarginTop, m_MarginBottom, m_MarginLeft, m_MarginRight, m_MarginSpace; +}; + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlEasyPrinting +// This class provides very simple interface to printing +// architecture. It allows you to print HTML documents only +// with very few commands. +// +// Note : do not create this class on stack only. +// You should create an instance on app startup and +// use this instance for all printing. Why? The class +// stores page&printer settings in it. +//-------------------------------------------------------------------------------- + +class wxHtmlEasyPrinting : public wxObject +{ + public: + + wxHtmlEasyPrinting(const wxString& name = "Printing", wxFrame *parent_frame = NULL); + ~wxHtmlEasyPrinting(); + + void PreviewFile(const wxString &htmlfile); + void PreviewText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Preview file / html-text for printing + // (and offers printing) + // basepath is base directory for opening subsequent files (e.g. from <img> tag) + + void PrintFile(const wxString &htmlfile); + void PrintText(const wxString &htmltext, const wxString& basepath = wxEmptyString); + // Print file / html-text w/o preview + + void PrinterSetup(); + void PageSetup(); + // pop up printer or page setup dialog + + void SetHeader(const wxString& header, int pg = wxPAGE_ALL); + void SetFooter(const wxString& footer, int pg = wxPAGE_ALL); + // sets header/footer for the document. The argument is interpreted as HTML document. + // You can use macros in it: + // @PAGENUM@ is replaced by page number + // @PAGESCNT@ is replaced by total number of pages + // + // pg is one of wxPAGE_ODD, wxPAGE_EVEN and wx_PAGE_ALL constants. + // You can set different header/footer for odd and even pages + + wxPrintData *GetPrintData() {return m_PrintData;} + wxPageSetupDialogData *GetPageSetupData() {return m_PageSetupData;} + // return page setting data objects. + // (You can set their parameters.) + + private: + + wxHtmlPrintout *CreatePrintout(); + void DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2); + void DoPrint(wxHtmlPrintout *printout); + + wxPrintData *m_PrintData; + wxPageSetupDialogData *m_PageSetupData; + wxString m_Name; + wxString m_Headers[2], m_Footers[2]; + wxFrame *m_Frame; +}; + + + + +#endif // wxUSE_PRINTING_ARCHITECTURE + +#endif // _WX_HTMPRINT_H_ + diff --git a/samples/html/printing/Makefile.in b/samples/html/printing/Makefile.in index 5bd7d8beca..a430ce270c 100644 --- a/samples/html/printing/Makefile.in +++ b/samples/html/printing/Makefile.in @@ -13,7 +13,7 @@ top_srcdir = @top_srcdir@ top_builddir = ../../.. program_dir = samples/html/printing -DATAFILES = test.htm pic.png +DATAFILES = test.htm PROGRAM=printing diff --git a/samples/html/printing/mondrian.xpm b/samples/html/printing/mondrian.xpm deleted file mode 100644 index 409f27a843..0000000000 --- a/samples/html/printing/mondrian.xpm +++ /dev/null @@ -1,44 +0,0 @@ -/* XPM */ -static char *mondrian_xpm[] = { -/* columns rows colors chars-per-pixel */ -"32 32 6 1", -" c Black", -". c Blue", -"X c #00bf00", -"o c Red", -"O c Yellow", -"+ c Gray100", -/* pixels */ -" ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" oooooo +++++++++++++++++++++++ ", -" ", -" ++++++ ++++++++++++++++++ .... ", -" ++++++ ++++++++++++++++++ .... ", -" ++++++ ++++++++++++++++++ .... ", -" ++++++ ++++++++++++++++++ .... ", -" ++++++ ++++++++++++++++++ .... ", -" ++++++ ++++++++++++++++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++++++++++++++++ ++++ ", -" ++++++ ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" ++++++ OOOOOOOOOOOO XXXXX ++++ ", -" " -}; diff --git a/samples/html/printing/pic.png b/samples/html/printing/pic.png deleted file mode 100644 index fcc18c1296d650b9ad75f9dc61b15d6cb0d09b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31315 zcmbrlRa9JE&@I}yO9;}qO9;V&y9IX-?(PJK4xZo^+}$;}y9Rf6_uv-J=KIfixZ~V$ zU+zN&Vbgo{l3G=>X3Yvwl$St5CO`&(Kxk5uV#**8lmzh40udf~()*kHC-4K-Tv$#R z1Qndca*&`80+E5F#DrDdmrmMz90<)J`wyq^6E7fdVVHs;8abKhvTCvjo1Rd8i^|Uh z=6kHyzc{m1D#YSaN8JB9mCo2wkDaacFP4vtt<Bk`t(b0~>{;n()Ul7Ps^*w9@Kvmw zgvZ`gurpatr-Y1Na$%jgQw=6aDbD%Ig+OQY%iO(8x~HIFGOdCnWB#6N_fdq*_b(%? zua8`LQ4w-TQelP6&?RR;V}*!OaK!?@cEyNM#2`ij&&3?5VkD{jDS^MdBa#9hY)DeX zNWx0|e}DA<&%6KE*Zf}({@<pUmtMro50@uQM<ro%={8y-c^w|@+5#+&AB9SPg76n& z#@ix%B|E8r;b6b`Q@t&O42w<*Sc-5AnG~>Y#Bf-txAiGfNybW+i^*-k_Un@4+Icf@ zA|Jec%&(g1(u$JIo{CmBrz%BEF;6iS*qwLaC$vnDc+lGj0$T>*ePFOk7udOTkeiDW z3e-nID->I=%jWK1o7*|4S&I}+&0OH`{9ZlT%_VLOuV+B%H!e~vl~ZKi>M_Ara5N6Q zTv&?%wjiPJHwdcnEGHFGG%)YOV8lZ9Pf-0}HaQq$)SjLmx<q2=gb|`(!$x1WaCT^_ zkZ!A~2(*4V`5N^8%}qn*{!VU*ra!uPA9|aRb-o@$4|e2p!UIcN@~Igns;PM=61E<S zRq<oaihq4Diw-r&f13mtzef`eG`Mo2S%oz8E;W=bPY>9G9fHc#z~k*Sug(Ks#lR)` z##3x-ST^ElJ8V16`+jf8n<)&z?F3tgdy1S|1mt3SNP#A5xr}lhfmv-xHeU){Lw{S% zqbu9w(eoWf&gF!$%*silv>bp|zUB_?n4h0-(fjc?>c2&z;G`N3cp#;vGJ=8Us~H23 zjL-j#vb4yI3KL$8ChzF(-ncey(P+!J>r@97p1v{I-8F9#2TZ~#f>)2?+wDKQ;2eu> zLk2CkM83{pe5bd8Eq}<UgSj|Y&Fqz`+r1xH!N$y}JubgS4X_J&JJO+WcEG^tPDQ-e z;tZOlNV5ynFNO-tIiQ#`MMz!}J&O@@$cy$ID8-p+eGuEkT8?1cRs*TY+apdT{DfD) zB&y7`Mzz1D^(4+i8LzM|e8NF1AbUrI6xo6pt&P!#req;U!G#5O%j-2EQL>Ee^Bf_^ zA_Kn9pR&yW_*RaebLw&b`@(U`|35At_P>~eCThT1N#R(uO1~@_<}~a`pbF(|E@AOL zs#T6VURZ6PFIW(<a;DB{HRy3jQrP||8oz``e`#g5;c7z?f=Kw-*2NBSff~Iu!!o@E zqPzt<cBAtk5?EcA@IQ=8U$Xi*ic)ah?(`h{{mZ+V=Uh?A`Yx@th?)gL4i7Csoqb_= zF(c^`*;V2WR7#q1N1se?psS(WZ;&`r;13?D*yI8#j$O>_S6na-vJ9Oo>2bM3`y%io zr>Ca}O;{(`(89v(Z9b4mQTcD9(QSfxq2$xd!PbCruziBkoreNFJUi*5D+^7I-+akX zIw3R$Tc<|0C~Cs&e+38oQA$J#&Aa3&KPk4>G*UArn(@Wbm9=;E9Ayc)WX1U#f(Q2# zl^Sbns4w2#xjda(QpKeZZiNxUGwEt|9al0L9k%K8y!>X4Cdw4z@j(Pdk7o2uO(6%( z0rpVr#)Vwvey44TE@R9RtV$23J8uZ?7jpJuK$Sg}Y69U3nS=|g;bS3{Z~iSUg<pg4 zhV}J**>P%u=j3MJ1vyO&NCMZMNKnK<mL}c5f3wH(WHC;J?@Y+T)D$0&3F3SH{nZQY z%-YJTdsKAKsYz&d)77{i_8SJNyzw{HfC5Vc8<?LZ!vyulIJ1_tz2n<`c>2BF-Tq$7 zTeoa-%QeUxT`^Q*+yjJ)Dk|?A_cOd4H#(tY<&S<25Hmw{?&L*=gh<IMtosKA%}0-# zDKR)Pd@Ao`o?Ce~#;k)@WyO~O7JT?^DJZ9ewb!T&DpZe5JUP^2rZ|uGJptRP6diI; zLx<1sr>QhA+T%TXe3fE^Sh2B~opEk?IXMH@+jpF@X5qrqY*g<FuxI@g7k9XvIl^=p ze|$Et;qrN$4aQWvCVWKF)>bQs8{#@^Ifs&!J4CZnQX}*m1dIMErgMC+R6tQdO`x+A z&knOcwtvx$!nAdLs6j{*80L>osu+}>Mj4W}jaH@^zB$HwE>0gWLXlkuM+rKSISsOO zny>SK`k-ELonyipDZ6Kf7akWE`95Nx4nFa~CA9lf=vA9`HEaJxC(P%@Zy%y`&iER+ z`sp!Y2Ki$VBlFItT!?>Q6lRwYW|x9;@uWeD^zkcvJCnKizeb1vbIfw@vn&qjOR9wQ z?OnO}OpT&=iauKSs6~RZee32wc&c%5OXtU;yd)<-#f&or1aYnyUk+=H;0V2i#F-6( zC?am?eoddCka{GpH0OD4@!ZK~8E28T<YfFEC+-1ubq@tQhUD<=i%mAL%DX7*p9Ac& zNAG`HBOyd9?Yp;b)^Razf}v*aD$E#(pv<K<`R`W367@WXY|RSGzXD!CS;JC`$k^Ce zQEiW>n@%OW=nq`nk)w6NP&H?K_g^Ox>wfx#tB+isYyp)W_eSFb(ek9-8T=mr<5*~! zAM!xHqZ3-Nvdq=!qZpX^6)Doyxs>8}viN%=&DdqOb72AeO?RNlx#^P^N%6ZhF^5*a z-fkiKI*gP8@|Xn&YiQY_yg6L4r`vo*2B)&Jooq`2J&)bl41%(BV@dLKd1K{Fp~new zS=j?!!-Zie6pdtAo==jCHghiV4eJ?eGgR_#5W$w6eYdf;=f~7Ssx-T=)DC9fxfy1k z5h^fjRtf6eiZj!{zf2t@e0e09om~NzC+mqz-(JgWYkv)3;I4N*tiV~M1k2I{sM60m z$o5f4uoiE2A($T>m*91A52V_+SDSt`0r1E+8r4@rFllDzTHA*e$i(4CY=_OXdFK#$ zJ*If+CXb=f?55xW5--&6FA<dpu4X9-o$Wp!!u#19GOOc};b3Ux(>kxl1p)JE)mEK! zA^!dQxBF3Xp~Jm{rwStEzUr!xYk%TK3P21Sl7C?exM*lNN_wH`n{?2}`L0lLad8d6 zr7m1&J(t@9ES#JTA66p!z^uur1-E%TdpBBY)or8O;kK^D(BW?%&-niDqup{eSOFeH zs{nbwXoK7Fa&5mkIWDk-wf6b*XD*kcU(2oX6t>BSS%n67VbyfEr!wq;`7$ydM1l~a z?~jGF4rgg9L1ql0fD<pwctqoSI{8h99WK`pFP-o3bb45ShZ9zvaQZoPs_`fvKO8vy z#Exg846n1M;Jv@!cp{7k1b#d`c&vEruMX~C-Io`BCuC~9*rK@)*$r@8Pqzdw$h;lh zC+c7x!~t~%CqCeq+;`*Q<_}F-@&AmE8@syV9$u5DaXCT*JGTH!)(?&(8Rhz@X!PgQ z&1RQ`a1-oWxn5=zvwdxia-S>s*c1F@Y}go-ph_R4;A4dgZ0|<ecCvZKBAdGih}Gx9 zVC0D$z=)(@eOh;m0eeR)XAL&o_@W?#Ude-r^@-!~8$mb=-_@UUiqug%|EP*%G{fKX zA6N_gSzM+it2Z|{>m^3H2VNf##_hBs2TSD-I;yICb;gjkF^HwN2V*D)&3?PzE}Cnv zt*y-nSZGl=P^SUN7SgNAs6m)g^u6jn7=<v~8-j1&T8%ipGvQ)xxei2!w}V1EE7RN= zi|sKXQcrGSmZjM~+ab}-6l2AATg?TT*2)z<?P1_vp4w+xdFWLSUJidm0gew_T>}j} zjA(kgp_AU3fq}umlzN@@TF_ww^k2Y{I<VKypcm1CO1016Yx+Q>tEJ`m1jp@0P!7Z& zz>6Dz#YdJ`lOWsAKvcawaqPUF5ETqT5M&7}E=H<iR%CSkrByb>h|8^azck;BtMK>1 z6!11>Wefq;bO6x8J1GCQ(dpMd=Nl)vDmHsWC`6Hm6BO;d&sYmL(Q@7%1|Y)lC<UQu zB2e3vE3S%4#H^XUB!j$j!i}TbGyX<d=#VwiuaVh$@|&$K3?7p2toW7scJG=i=D*X# zjO;qx+SHrw^2SR~q9_0Wr8#Ie!tgTwV|jX(VcF)Y+j^fL48qEb@mSi>Rz%;IKLV`B z-GBTHaz9#={OwFaE*CIj$Q%!Fjzqz8lFV1$@P;u<bKbdnKv!ftPW%iEA3d_WvW2yQ zx^GKOKNt<<92)GU6m=<wnv5E&4qpR1tHH~)UlY{!n8Ve|Dl4~FnotJ!i7(OwzqfDR z)-2i_N7R=@VD7Da^TNJ*;A_9F!>e{X?{BQNgL|)(Wr^O@=NR&I(X9?j1i-JA(%2<@ z+yR`4tnFeHU0OD$!Xcb0M{3_t9Ia0T^heyL7Hfm*K>+d$1fg*Mk|wPBJh~CF6x6LH zYMLq}NwF_^Bz1gzY-d-c`K@Gft$2|UTv~(?#;@;|LP%Z?Lk)P9=j6|vN?VPVsFIPA zKP6022do;^(YhF63UHt}<&x^re7Bc)F0wb-ayu^jDb6~+_q%u*i6~b7-Q!FpR|v3s zivSY%!G1MO@6-jEojbOlm;UfDV9yaW5E;-bwg<-1>UTBGzrs4Z%{uJccK+jk*PHad z52KWRZj>Oj$Vdmxcoj8!kXq-1hJg<H=1qgCch#dn%~$i#v7NlLVy8O+Glq0|d*pHM zeNFApMOpwdjpg~6sV{Eml8YE8@C`8q_xzxwwIbH}{kqQsRYm(hqKxO-pr{CK15a2M z8Yl;G!r-PL`Z%Q>bmkwJ-RujJgQ%qmK@x(N+Y%!jYrNla*99L2K)%KUkx(ErbMw_% z9$^*OWZ44KI!~9`EWC``{2U<gZxYQD(02pzz~N+JUyJd{dam5qxBl_f=;cJPf8g!~ z5y8HWrD6m;Z4&;)l*$AjD^AH2E0}E74@sxg{*M{`*f}`PVW6EEau(NV&;O5uZJX=g zW3Ql}Avh^BQ^JYvew)Yj<jp~``A!Zw6SyCjH_+wL0RAmqjls#}xB05s8Q`hrA*WpE z>&aa+Gh!phRm>M5J><`of_PoV5`L*_NYp*u1c^!<P<0I17R$^yge-Q(h_NVQAWe3W z`{lBr#17l-y6H}RABpauD=di32sk79(m}jW;oucx?E5zJaH9Oy@2D|&PuZutLWk%3 z%hAY0`%a~kSV;;1NL!Wm^^rEpEroOUSZ6{WEr|sGVQ}c)ZeU-0mhkh!_`%F)l4}v{ zV7J)6Qw6KrKsG?=hD67Tq_hxC*0YBT5;9fOEP?AmHGHwck@?v9sJ5Y}2A5j%&Ny;J z_PjEC@D(j`)g0=$v!NZM^?MU9`1N2>uy-;yS#H0)9A8sMM@%4-c3<-CDu2uzx3|jr zx0snOA&@yRtsr>nzw_B`IH`px{E!Nmg=qXI9d#2~bQvy(R5V*<5fM97x|}K{f0#im zXV8aI!xavs6%NZyC*i)~eB@4gaL8hG5-Kyun{ua}iMV@Unw2pv@glLX<bJ$z_TqMG zZ@}^1fuQ5=&-vEoq69~}1|66#o~!*bB2F7wd`Tks4UyDd>!F8*g#if!8rp(_zyp<R z+&0GR1%~6m!VmW?VWjO#f?r9f{Z!%Ne#KmhVM~q4>>^5AzN<NXibkwCRelzTAm+TU zU>RtZ0wE)g98?1(GOF_)_KyglDnm+mq+(Glh=+3jD;w=LuOO)XMjY*Y&sHb?*2wPc zGZ*A}eno0y)L<u#GIjI~vL3?G0%r5Cx3qI>ivqRBx4_aah!fZN9zp;4>xz!9n8hw! zcnP7w3>#rC3w|hakqa|@O<;{_Lm)*`pvAOQJs<o~bNE4fTcnH_w%Tl<DU+x;EUM6A zLUtBBIug=?<N<3V{PT+xVP*>2W{)ZUV%W$}dF(E3iEINl*$;S(lgy~zH>LWkY>(k@ zybO<(<0YD#K<?+Hu0`kFr}gI!mfA<?oE{-M3L;}PrFtlFs4ptj<d<_})xCanFeXtw zwN&s1OHifsxybLyEwO6KvT{;Dw`8bf*eY2wjGfSAi60HB-o=?<Cr5yPJ6`2Q{5?V{ zYx|4be%Id?9gAV)z9pZh{2_@(qIf5q+3PSr@gRuCHtau6rA4xQPTlKfNMUS?GxHJc zMD7&G1vT%(wwc$T;B$~MLl+EW{d=jxC9JF13oTex&rNHSRq}Ctu?-l6MQZ;w;DsBq z!%D`D5lY1vCVr9()p?y;g;7m3SmYE=far8|f63ZnvztG9ko=Xlo(5yu(~Sd)HO%d` zWx%6VqEj$#`{QVtzPYQi-gCDWVk1Ky>=X%bC@u1&5-m-Upeg_iTs3*f9>m@Ee|JX~ zEnWAen8geo1gqIr6~TRtCojbc1{GPD2rbs=Dk6U|go#$%>WtpMcJhD@tyuv{;)R1S zGn_p8N<b&1P>R}}5K^l-4`%pYEOI(}(5QIKGI;-Eqq<gC9XrZME><kYFc{f6ji;wb z`OTrG+%)JiU9SK8%l&Ko**H8Z5K}E(Q7it_;EjfMyp5O%LMTncig&J7f<X<9@h}mc zIMh6UbH%%lzHEoh{XfgtT1(49k-k2%lx)&>E9%Z8g0ek7b1%U8%2fSARIKoYLZmif zwu7N2L`J|`LahC$;b;I2R-gwVzVSpKvg~HL&g9x7kZ}DrqUg1M0u~{>%HHj00V<Jo zdeK>28suCmBat_z9JiSDBGTS7$Hwo(R$M(8kD;VjgzGM<Tnk}?R!+n94^gCoEh684 zezar<RUZua!ulTY3Rxm1N9lekDl=%)?7DM?l>~C49Z|Q_xC`eyXs-eau$pzGXxN}4 zB^CwxUjiND**JR}^n9fsIdt8cD^6Dt32eKK;!s`EJ~;BdNcp;I+H9=iGjoL=*&jgo zP>LRSxM!jaj=XsQ3FWX+U+R8PfjOqXMTdLnLTejg@vsrG1s?Ft{4Uv_QH-d`-;DM} zMA5YL?8HVa8TRX{Z*~JFW%rR;9eppIG;#P%^ipV9EmzL8JQR($<JDK_Kpf}o^PfwI zV~-v<A5lZ_41QDDutO&_!c#-#75Yg<Skb%@0|A;~E<S2w&lzYHMW)U`%+eMKT<5<( zYv{=->;q@)Bz2->`!JFArR6KC<A--6Zk9H!z#9rY<h2^JhjLlY-vd=_;KV>UAH%In zIo1RbcAV98bUg9;>PWexx_)&Y@x^zSRBjTq6=`dL-WWS{mC|yo+ejFUb!w<;X6)j< zj0$n8B%GEr5MfslYm<PJY;f^{;t1AoYxRSdWa*E|44vEt%<VMhAcy-7?mj%cZ-s>G zUq?5tc?JrioBM6c%GEFS7FiP*#iNO;F^xIS_%+2?9PwE|8lj!}rR)yBYdk(8yfK{6 zN6Qr9@htpS!sVL2^eq*WWuROoB-uz%5u46AL7EhA4x&mhLbwq_vZ1ZjBV!_MR?*n& zJL<Z3{$i@M0~W6qFu~A}QN?Q>2@G&$`4U~3^!?^CHMW4NQaR|kBygDxrL<oSHCYJX z*HDtKEa>9j5;I8alPGXImJSM1MHDI32Bl$z(CVbo6p8ogK5$Uw*BtVQMrRGi5=xhv zBAHG5`&y{@^}9qQi7nP*#u9uSSI-M|fQumijrVi3BvXT4s;V)_{*!}F6Lfea^w2vL z&QdHI7eeZ@&PE$(Yge!k8eA@N60G=J(k?tLit{U5sEPp_395))M_fHWIGSL=V)ar4 z%c4zoBAzWInr#szPn#xy*3=|7a7@%DKk3}0EY;m&ZhhaSEu;x|TS_iwDm2Le7}^M| zDpHkfR*v+~>`>~VejE~L1KYzZ>1hvud(f@0qJo9P$y%#|;i`z~vtj<ah^-7mD1?n; z<<>+Nhq*fz3bucW1W|%!PE0xT>gj0|ALNZ28D>hpNIY8xRo5$b9rj_Z@#1x7e86w$ z7g5B9a>n;PRiFPf9c;?;im^E6v0?@)8V3kTs=8>kJvt}+-A7m=YV{w|3y%I2d68_% zLQws|$m|<`3`|l-l{L|_ZM1&YXzS1oPeqY$OQf$FhV`EV3wv6mmw%lQf6#)Ju&-t& zs3V{48Z?26RrM>AuKLrz{acoh!9-Zy+CUjjdv#CpECxW%`CDomCpCe2@GE?<vZDU{ zHpVNz323G$cyJ??KFJ^!3r*H{fjf`eqSkO&fXjhiIEcJ63~P1ETK01#$=Jr}$5;pZ zovk{%b)%UkSDR*clbi2yEOP%X&u8j%W?kl@sc3Xe-`bIPlG1SbSc;9P*cFq<Z^;JF zf!Dd1L0R&I1QjX<l%S)K$O$@9gL~%zvD}_Z6uQe%)-I^Esn=6dm)#n%l$@^QcW`sC zsn{<W+tP91o;T?TFDATGPe0aP=|<p2s%*9Ep_gzFON<8Bcjk<xCpJ#!t({;6ojCQj ztt6BFxXjJhn%}3!H3m3Ja9B69x+OZmVc#pM0EwR4N7P42d{J^j!DhP6zs(WJE!0Gk zL5`oTZQvQSIk3Mv=~9BQ)f$%x+(i%J7e{^;Wj7O|*8TaQUdCKvhGyg=>{0HI;e_?J z@#Okl*F`~xQuw(_g|TBMrYh{Kspi-QJ9C&PHGUtdHwf3+FWV>i*NcvM01%yh%;VHV z1W*oD*LsW&_EbT00By{OU~<OF%tB9IG2=_&aHNg9rd@MU++s?Hv|-l81)l^&^)zC5 zC^9o?I@Tei!u(=SV)s5>v|PH6j9^M5Au$;`o=ADFzH`PIhdpn!hINL`u{Ltlh(Knn z8Xe~P*m)M*N|1)MY0*1`ET(iM!_5`u(7rRq31;=KCYT9;F_jB5Hr!<2xf;>b(#qyU zd)uVRCwS2#X?$Z*j_!B9UH$oC?9Xa-!3bv|<Q!^n3~bm&MzMi8$PHD7QYwn7_@>j) zc|#HT!S#cr9DDD+ETC~^I~%I`8*1LKS>ukSRgxD6U2Z@Khr}Am!*932GAsS@Sc+`v zb9wQl4V!;{u=<+z8vUdB3nY?{s^5gBv69l$gABnyDy~YLK~u(B7|)R>mm{^&qIf#@ z5=yju(gpo(6xx_vvejR@PuyLsE5J>AA<?Pedzfi}0T$SX?8rA{zJU+8Es9&DjirVL zO!m!!N(NBA9W9-g+bGCu&2+{OB5=)S<m}|eeCXk*J;cd#NZ|>VE#z!W1dT@0Me244 z;yAx{mK8~wP`(_R@x4A@4VsO+j*`>FIRaU|nVDJEF%L*c4PQ2{hgsbaY)yxa+WN3Z z$Q)i*QI$WD0+d7&KQg`Wuec?mLoA`{M(`8^1BYi>+yB*s2Q&m;Rxf{A!D?Vh09k1v z8eo|$`(=ewYfk-w5jTZXThqJ;{2>-XLZYp=g=&?nKsd(SNTZWnmtwiUwuE1R+m}vk zbA=P7*<b?K0%#=1(r`Mer1~H1D~{p2PWY|r0ll}~(ko%vz5G?V#y?q!vBrDM02;uX zME{=?Nm{C|UqAQ2l=50ouBB5EeNS&M6%7rIVG7YuUa(4`Ucn-OJhmg~a9uq~&|ttM zB;ro5M8Wn?NUc{#uR+<R=P;nHf}jS$qODVmw6?rL8ee`DP}n?X1UI^arV<N58|W+A z_EvuE`!!rshiPbc*q~BY<Oh1jO5SDKJQ}McW$Kj#*c@rt?4M|A732hP6b_+`u3<_R z)OMo3hDJ=Yc2;nP=g5oVyf8DGF-mv>s)iLgh%FZXK<PYg2>%%y+v>yXn0sdt)J?$U z=9H_V!gG5j*R-E}v#hEHuREW89H)B~t(rv673*5;jw2aa!sWDsh^0j|SroZUdav)W zsr^di+7z6vWMIM&cvFg7QLfF5(%CW(`dWvnLJ^IFpQfQyK1b$>HeZU`V~9YtSrvpt zV|Y-2DZqh*iV*@YU3jS@ON5Yyxx_f{%z3jV6QV&tY%-ZlV4}rJp9GR23d|7<)!IU| z0%2o-+d{>20ZZ=d?iQJ!Xx7{T$hyH@C$#K3#7Zb%mf%ZAVxS_>-fa!Uwc3%+!EX6U z^0*-~t-_fi2*RzvbEV^1haj4&Uy&)fqY9$Ul;!k?Mc<rYW<D!nxg<Iq(?K(E!V#C$ zVi`2zeBy~mnpM%BUly}UM)8&@*)Rp2BSK9+k4>8ptgqIWVE#wPKw1GfkE3bC(m!ws z8hVoS^r9kRqSI{a;|h$4qC7sB@88FvZPrZy^$)5zt$9~cr>Hm2gj#AE^k4OWaDpyg z8a#X6If?**3OdQ8R4?~+F5J{cn-#TW_cvq@47o(iQ6l7MAbZ3PyIGTn`(Z$6%KR0o zVVDF_x`Gh<JBlW9p+zFKszFbQoo}^HEm<E8)C);3I*GmShK2X`eOolPFGDKPqy;v> zApYy%b4Lmb6YTsWi+%Zc>IF5F^j^<8CD?iY-~~vY)|j0-!3f5v`N~5sk-!`I%18|> zH-g<2s#TA<cv-*b5hZ+;aiV)zk!e7`gWcDlubDvuYBi4=D~d=4X88idtt$(ebhq^t zykbz|DqNLTFR#c3T399V0af&02RT<mCVC6AWPO@99qH&{_Pyhr#lo1MI{jdN_9YPt zG{gbXT4!q`jWS){y;unHf3yGrEPEo8Z0XYgaWyv&)S%!s!Nl5LgZx-TQZ1wWH5SCG z1t=0wlAy+$!8Dja(iiR$95N!PVQLhs!S2U+L{!3`5`Ia#U&LJ1N15L@cBfYxx^hF) z@XngWh}z7>D;p;&O@4zv#~sBC4UJg1AaHlbrS$p^AL{DWV=9wFKYft|1{>RbZUA_E z_!L};%_-^mUob!cxOaCXG5gpvz<Q@O5GWz=o}0vs@B7^FVUZz4<`EaT@<*yC&kG); zl2fGRjecA4G(kUyiDr71_$7lo9D^ur2B%rRK|oP8V!Ck2lVk!H49Zr6SFGR_9U3J^ zPNb_h#uO@3>plB1_Ns0|!~z#h8?{LjrTwe%w{7X@HGCF~#oz~d`6Ien&bp@BEgf?! z<$>pCK7g84=$vSaS*CZ^X?1@Gl)zmMN;Xzt_lXi2cMZX%s^R4Ci0pf-w7AO6ghD5l zPzFgQO76*?601hovEva9)T^4&e+`o-C8&7p#UO)_h{o*M!-J#0f+kT!?X(O^uDmQ3 z@NwU%ST`1|p?a+2aW;LK%-BXt57Nf=#s01!%N6yBz!V@WP<uL0PAIuN{#H7i=~Ns$ z_m&DVx{*AzPETaWlltc{>oot8V006>FhKsF+W_FSjn)|seOjGl7%AeR76@DdYp~4X ztM5%I`$BB^krf;teGk31K}on#-p$@Gmb&25V+TVEbpl$aR2-B`!~N#X!Bb5IqRxwZ z(JDRzY_!$2=OVmtJ-X2KYOp9nf3&O>5J()x0F)3(#O?1ba6WRw4bpMe<uDFka+8D| zAY{*5+lh96!ti7xaOq-mwIGq+;$V0k)u_7NZh#tO4ijpE4Wz`)u{yRzM9%1_tl(`L zDWQGgN+@dSo{Z{AxyLqA$y}?=7M_fxJo2jt<pNy%m=d-QsPKT|A6_CmDvSc(C2afC z>N%_)<td!0U?ox$P~5ge2#C?(6jcKKa9&f~t>c%u6u;rceAwyeuUpaI?D_pltT8|C zyUePIU!?wgI!O`AtAtb4gCQcXj+wE5!NK0}!3I~pI!@apoLy+rr7UAQt%E(OK*cX3 z)eD>Hxi7@lM-HfLhic5FeR>D5rc-0TKnVLpNS`7vk$k32Q=ksv)UGG^?AAB~?$&ui ztUuc4wEkoKgHGzHR)dKzFB&5qEz%&QBq(O_ERVXL=CthG%7({$yC)dnTfJ(Wku;HA zf_imz1>gx&Y{qh%<v`*wxj|&nBI*Co@Z=^N=&j_dBO^4;=H`*ciE#*L;_R|u##3<a zfrT}`9iZ0Peyy*>vi3vmYmf=|M;V*N4`zcgu;R6tIX1Af_v@lMEgo?)*CLZB+l>hh zqQ?E;oXLI)*$XB(G@u^SwX%}S<+uf_xSH{7SUuR)Ee|8mG(f1pR&xUHM~MRSWUsK@ zw4Wi$lkS?02nycBW=iR?7Q|}%L4Nfjw?8|h%?VYHAG+o*<J`zZM7g1w|H9Mn%5(Gg z!}Atid(~-xO`naFQ`8QT6z>H4F!Eaw>vALDGg`dH<l|Ja<aUtyXFlDkFZOpn#G4{* z^BR03*R8fZYwIsZV=b&n={~Sb?e{syC-tJ?#Rjrpii9?ABB+ux{0S-3{`JzDT^{5* zXDB+0mK-se+#J*6#MiY&S{&W#sdIga(FhkObPg|%Y{H|CBY+%+DKt;J1?H|<g;ZMv zxT69Y_)ruj($kYKZJgut6cc|4lEOP0++|d%eodGKt*)^s9^si(H=BLjwkmXG-^<*m zvrJ&C%sZ2Qcl5Yon+J-T%A#Edi38%CnSkJ5KZyw=ME44=gga{H{sxS7cUBt@Fn|91 z`;adN#aU=4u%fiIpQaIRRP@m$v0UV!+&|}z<@IDc>J8aCWUSUtG`pLkRZnuYISz5h z)+<x?P}Xar7g>%WFme#sACg4@wndxyY$UOOh*w;K8WOlS@&Vo@PA{UrPL8~GUYI5> z<s7ZX(=E#R%(;PhYnF%1IDCZ?2;4YWqztq}=ekU`^{9oJ-hZV4j*WSafCD;dY)@NW z^0*K*6_$FvhX+MQU}}f>$>1<(OMUmih^6qHC4On&o5e=OySJ2(oC7Krpb&5e>79Lx z2}zqh^S`PmE%yv`cZy=XP?30;a9~;lrdn&5l8Av%gN#c3N7Qi{VbcIseB*LpKV~%J zOSSBAfz%F>J>vXe=~%OVj{~Ha(M!*~@%5HX;Pqjgl4RbSQ^BjpT5kFgIbAzwG9++L z(ZLe^rh)R6HdqDJ33%miK2zzM-`eyP06@aFff4H);<n+BSh&Bp$IQ!nym#(DsNHrp z|0!~A^CT#zz*3T?E+PBH)yha@U}c4<jCH+!A_YihZR2__pp^rsfeIr~YrJb+8PiU? zJe$YD4%cf~NYiK~VYa!^+~41SM;Kwh>}l;3#Tj|<^eyoNw}9Wcw;4K6UtqeoNP!<~ zI=&UtQ+c*ajKXf}6Z3grxd$EPrjVFEft@~Na`9GD>-g6{U-^;Dau*dihrY2bKz`7_ z9W{P;TGUEj?+d`&U(&6+ojUe#1VW+}zn9&sk55Uy-)KPancA+W>e2E5VUN@@YJbm< z>H8pkE<ifMj(P9ivu+eKpHAgg_<(4>fU11%;@T72^khyVL?7Rs{CV;CQ7g`iiYvAr z6iy+QmY%*^6Hi?}!zXRS`-qK@5h`f~+^GBJ?ii31uoLgVg#|PhGWy<FDk_f&!CBBh zN3(BSZ$8+?vnIFroI1++QXwhTc_v!eohhw&XqYXZReGqDu2ukbO7z@?2>nRl4mI`T zE_Db7>EEwZw?ARMG!LXtg?^^P2_q_2MJ}FcC;mM`1{J#@d2|KyE{x^Rs1JMtsjR(+ z<U%X*zIe>Sn2XuozX)5jw;KByAj&vsj?DCVb_B^|Y^lrtZc@_Cz32aY1#-ukx8)}P z&(r&o`sYe~24_w*Q0J{#nR~Xy%NGJ8n^z5>U915+CKzjENIQS8BFMhqEY6Z(^HFzI zzUTlQ>sqg{{Fq0%7~9>&oZA?hsw+mv7{uH!z73QKlV)gFru(MaPgCrEYeOB5rhAgY z82?F6YM&+{e4D(%^;HfXYDxmI$5sn--=b5M;9PWDkV4n?2U?DEe79ZEJE?`v^psZZ zezZ?=GZ~(*VFS93mNSnQ5o;zJR}}12;R9QvyNvel`orAiM_kv(?BO}nPr)g@L)=(k zpTPQ2(z9}O5AC`uopIbu^?@z^0yAc(F#w{08avvSQl*9GT?$z{L^*pY5TwRpIv0ci z&6K-NPf2yK1zYH>TCO2tFB!Zb+mEr)%_0Z=Za>{9_StfhLcFBW+_~Nf)ZcxB?C03m z&ihVd0{pxa{ILOmh45H-dM>@RsL~57;iL9AaF(6Ja&#!#pi89^TX9Nq@UHAF+x~08 z`I9<sy|36eleK639*dbFK5c!H&iNHS?NDUP@nk(ygd^3q$r2wBZmwikC}ATP6xusN zDQ=-EIaBIjzi;3bE?D+h%{qv;3{BhbH$XmraSJdiWM1@o)x&JyEijWffHU|=dpOFE zyzle+@)=M8XmoL}Po~<(07i@j=8wgJ?^l(Tm2D>5O3SUXB1@jo5#kXwuah&dsQY5g zYrY4k^7$LAr0jGuE+gmzQ4&}E-m;DBZ%Efk+v}c=A+N;pGu$NF->oFUt7LBPQ)?!Q zRQ~0vTuP|ew+TzrY;UaCEChF=_$e3fbO$)o+FaWyP4HQjsU<C;(%XO0Q0;50!io;( zJY}D@OZ$5DI@;8|H^T9wXEd_%{Y9%b&(C!1wq@ShC5XCOIyv_1Q^zybze9Weh<Sbe z6&(FmSV{kFi6wTP38idHB>l*rEVLLO>KQMfS(9f740eKyc-`68qX6YlXSu<`>9=!_ zQFIQHd96JxZ9gU73VhGC*VKkooY$~rtcvUQC-aM^jyqJy3ulH1V`58oq8uPWYSHVC z@Nf>*;{==1=S&v049$wWw?Wm&TUYUN^PRf{rCP7y8e&?J*h~_Ugki3w%3vE@`B&n= zj?mb*uxS3)-c8$n8`x|7nGv#Gyxt4Qbt31JQ&M~jr~%E1d`fPW_<tA#eg42EnE-A- zKRAtKpD_D3XuJRQ&no`}(ny`$LkHO%)7iXNs&-psiyFxkij@7}Dv>K^%dnY2Jxbpf zZER!ID9Ei++PH3KV*54I5;PO8v1I<Op^XhH$l-G9i$#i`w}3)q+*{53tLd4)qqn#5 zM_9S(=(2rMiEY9s(FSMN0RKf-c_^%C23!xA4Njq^7zCV8Jn4U9((B`Ink9OeF~bhs z{|?bsH#Yu!Pb*&=s9Qbw_J2UyQ~ZG#kO-bxN00BP&)X4tQV#(ckDyb<JE0z{h~f{c zaQdv->?b&%h!i-@=Sv)$-*drX^WbRtcaEK#YV8VYr|-iR;3br6d882MImB;q?vLH5 z#%C)s16cU}bR9wf2y7}_YbI`!@bK`uJeFRjr1O<;TF>cGjcu37q?SmeI4ts~<bAh+ z#1&w$0GZF5%H~Pg>s^GnZUZ=iwZSM&){5V+=;3wm3K=dpd$Wa5mbc3-`naQ|Jo-|7 zv9EnuZ~rhT*CBe1iBN7DGmIt8^8p)jiK5>*H6`sOp{uVHC)*z*eHu`}eX2G#PS3^J zz&As4*C>~H&a^3W&7fmH4<uem_Y1~Rn}adD%si}9nBo{17y&H7laq#kkR(PD93$zr zz3z>F{yMrJFHN*r<*dbZveMqj1Vw%6cIA<NHsIAnCUo*`d267axPcJ;$Ljjl-)^`t zJbG+&N^JC88>a<O$t*oZ40E^PzN=kwhB%;LbJK$$sg>S1hD^&)zqhuA@7`oCC@5fI zWknT&Hb#v#$yHryp5=V){+Iq;Dzmd34=rN>zS?15_nGYz`k0JlA%>yZ9uy!86yGMm zLK-dCaYJ@%lg}rer#KrpPbh<=8<s*ful_@KS~iLTUw*-g;vLs!8(x{#+Ex7GD9-f< z(EFk2yJKNMjOI8yotuc(ysyweoq&ApuHEjJEe$}Se^LQ58bGm0AMan_k^%jhmp4q6 zewRo5-QN%l?UsqD^Nguenw45)-KXT|=`+vM$luGCPeC2-kxRnL&usft=>?u=xPg$X z;`Ix(2BR2bOG`Ku6qH7%zRv4wwy8tWvz^Rzk~%<SGXG`Bga{BB0r4=HNb?FI#W@lX zOW|dDo6L;{)dl3}&(9%KjG|Ylu;it0U%^xe+t+R2{aYnVmSk(baB5ozDzjzfwp@ch z%t^b<1$puAQ4Ad&-{CRo^<G?5J()`K5(5^k{P${<pPk(gP%#3Uwm1DPq{);ty`T?p zJ$#qF?}3n+ecXHuPJO}+Xl4^cAM+wS6<OL_{(G#o%)M$SKY^k8(kR7574-hDS+X(! zd$Z1AqT}DO0-P%ZP<SPC;#~sjOCxu8aI-*@>1WEfTjZ9n2?j1QdGfbTcOXCA4h;oD zvt;2k8aHdlS^4yXu(LlT;T5iFm5khFV$VeoeICW@vXuiyS&~Z<Y7n@a4-XHWQE?i6 zfZj6<kIBee#|<R)0OWJUX9Rb7%p4p5pW*~iQo2m9(}MgMy7Meb>;83Wbf<W+!Yihg ziOa|?&dHF-(Qy#!JF^CuJj6;s;Z&I6S+cJ;Zo?6Fw>Ba?fAa~Y^1r#JThF)<1DQOa z<mH7FeFeWsT>&-SesiB4X}{iIkJXYsh&``lT@&eo>u}Jm^V1r03l3Ro={#_7ng6Z} zecJX$FFxXOqZ;G*zW;JE^9diwcWs~QBP04*fSGy=VDudDrIB$E47^w1^D|LC){L;b z6F!FxwKJ?=Ps;<adtpZdOq#I$GRmNOxiTQ8ZyL~liPt|ndNk=<jG{^Y2I+OgVJs(0 z95MW+ntPG5A&Ir!|BOoQevqBndvankj$W;@Hi}^pur@$uSWk>|Y8NFVG<i(c7n&L$ z&j%`WdQr*rDH}O0iVQHJXgCy7RtNum;A7Ms76mrJ@;rMYWux)q4#NkT&A+=N#Lf}b z;GUToSO@?(7tsozpfov?9?)iA)}k`2TJVbCT#_L~Mx3;(^u4&&l|f$5&-;SwQ~aI? z@YY(;;a^tQ^=MN@(tqSsJ!;v+FL?pty7K6yA$IvW=ZJLOT(vze*AwT)?|V?|)8BZ| zk`R%rv+kxXMa#1Wz%xh)O@e|At4ACuqBfU7)GOP6{=7*UwK~pZT?~sXQ}$^$v5k_D z$K+bC<Z*}c-s_DZ2hGC{L`4JQGa@br5Fm;In96kGy?fY5V%|OUXvCx8=lZtml(;J| zQb;1p?K1pK7!3MRS>IpL!sfCjwNv13T1lTT&28)Y{l5IYNrq;OBO@d4{;Asmxg05y zvsFw#m#+7lGxI>C5BlLZo~oY9<FjXMWB<lRz3v4)^$S?Pdv%@l76EOx&9Iy)bJBF{ zhosg%qH}vDGN>#?&8xuqry?#<hi8kxnW0N0Sp|jdVH_AhZ$7X*S<3~?ajrq;2tjr= zEuR!&QRX}^bNR1I#O<*eFZZ(Rtmh>Agf}k$iYeozZIO%HqG5dj0Uc<~$3gmR7u6UI zAe>nE`A@k9FK$}}rC<k+_Xu2kumB2@%b8}`ky@6apIJ~a>Ko6h#vtL2lkg@1wn%_O zTw8EY+co#?UoglVba`^pg9dWRTF~_Vs;}?%dRviiZnzKWO)RW9o_UgVXsyN}j4<}r zkzh<b*2<o9AqKXgVpne*vLes))B|ffch*;Z8#j)Mh4lpG#-z^%A-xJO^xeZYB5>ot zwiPnM&#{2sU-?EGNZ3!nsNWu5UCmNhBNuNC(DVe#fVBWJUl%WhepMjbqKq55CVGVT z6D}O$P46BiBRgf!J7=#X$ctS=IcWJ1H^dg6ZXKKhpbJ%pc1v>K&oF<zeVBs;CWhI8 zLexO|Hi5DHxmLD;!C~82h0-(@U}c)~w{Z~qp*Er6mZ<A2yZOq1D`)LhqP%tXU5Lhe zmu4OM_`l(qpN~6aHd+G#4JL3bK7z@!JPe}=4L}coroO%ePkM00@wG5O+qyfci&(gy zx9KcL#P=eHE-o%6;8+QIFn4%#l10-2iaqmiH-t{T-GMH&lJhBh!$JG?ymcmj&2aL# zrjczTIdFf<F=n5_<uCzqP@SAU*P1Z|kb`w5@mzGHhHSX6idxbB;6eiFew+dHrUI{@ z{X&r;D_Tt4?Do@5nrIYrSWit+5T|(UY67!~jni9Ab2Ac$SGVsKT)Y^euP-M;2Miy- zas15zZnAq%Q~%48il)}ETbUxvThoD?>Dd`R{p!kBrXJ$ZFKe#r`|1Ppqo#0euMmx% zZ!o$O--6b4tZ3pEXL?6V5nHKC)%Jk5jcshg1!Mu@Zh#$H{wXqtdB<sgnYaH!oZQSx z`VKALE(;ks#r2MSW1;myb>e1mxs9Oz+(tssCjv6Q?!M~6X>=gbdekWK1<7qy`zHXZ z*`1IX#(tf5=ihn}4FK6yAx2$#>ozSPk=XZjGLZ@4ph96%i3VhE+8<!H%;Wtgc^dXV zfCJd^*lvaW;;24}T2mvR&E9p{EES$PynkieQ*6SD-k;QxyOAX{jf4&nm8ver10~Vi z?Xm`RGY(pTJNgP;BV94I8DJfcbBIgz@%sseP4!6Kv!@WkHX2(*tym7de0<uBryD-^ z8elm)JGYZf9DhsCdXnZ`PbjHL@Zxdf+0#ondq7)!TFo>oO{;1c{(i6MNp@!(&po_L z-#?Ik%2H${=dcowWv}x;gHhIU?Z3sjQ{MEHs+Mw?TgncP5i;I?a6^W-1Uwi#*yp!j zW=2@tOP{?|iv2)e#fU?(ToF_OD9|#-9?DsxDX}`l9vbawXIHVS$tsARzdpnZNso7k z(B55mK6{xu|05}=c<%CgYSy<MfD$mWYxOcxi`}@jDzgK~8tfvh%POPx(%jM)lcZ0t z)P5eqr|HpmLDFK~4pZmlZntXuD}s?~h^;$dzNOk*V}7RXo6rKfa463S+Wvk%Om%(_ zD5UM4<OQdjy^3L<Tzl<I@`O%>}m%WXFK1XRCBdVOwxdpjzm4sG!NSV)`x5w+3y zMAc0Ubc;Eh9Iz#aDhRL=E>y$508MWYUf<eBvd40)ryv=o-=t6YmUE{bXS+?OJ5Cs+ zB(h54O5JC8^dTFK*1EX`)K%^6k<RBP%X(&3R?q+ivjSlz9;~*R1)vs{j<F&L4Vn40 z0<YKfj)$D?Ksr}FF=T-Ku@jR>YO4nzodNf<!tR(cw6beAwS!03cJg6Wrjc$;MeVyY zrPo(<@J!Hy%XeWff`De1j&ex=w(RT}6de8<QPTlBv6{UX;}9cZoFe{-Sb+c<gzDl1 z*fS$c3EF?>J469xUT3B|TG1|35Km68rgX?`31=-QmvTkSMq?Oty@=v32MMnKs;eeF zp<uztzDmlgmQ0z6v;wd;2jT&$6~+mqb3H5-)yW&6%0<HNR%?mFSm=<Cxp3Z+<H-so z3!n5JdbbK?>y$ar0EE~iI=Wf=yB;q>FL*h2^}=&?cY>+tneQyindYUP!|@Xf=&raK z4j-$_QNw?d*S>Q3r0v_I!9f4HI%%WuY1b6W&o8^p9?aGqDzyQPQXO}*BmWj(D(dX+ zlGx-32Z{P`Zd}|d-(J59n!N$^Xjo?lMC_l=&_&U(&d`QOYnv51NN?4bV;;HNg-?F0 zo+qFRuUasD2;4gs%Pl)sV+EQRE-o$#e9Qotqx)Xo+0LJ3?@VgtOf=6D$?cPiAn)Tt zkXYsEXKQOfPJYCGz7VBy(no#Q5?YvO>zGPv?_Af>z@%GmytYl{Z+yY&(8%&^gC`yG zBGel!6|lrHqwtd`Pq1?ON5_0yt(RpEy620!UERDIpRkTs%K*Jo-3zw_8W8G<bKe1L z*l+GX64zX{HF7RZ-+5fkT#C{@c2Qjj{=BE_MtYK;vv&9oLCNFX6i0zcrFWTFv?K0Y zFNr_^5f|Xq?YxRM%}=dAx<8J7hjU~OuzSLsJ<9S)6sCc>fqv9e!GfGMB=TKkQO24m z2N;6c2Hs9w^w<+|cJzY<@e=Q&E@4}Ir^T7`iA$qhCFmUQwoU%v@b2Fe5>R`5gKB>7 zfzY%=@R^^sh*+q^c6{2U?G%CLK(-4akMWpof96aC>;1wbCzy5QMz2^I7sazG-oY&) z7dGF}r<-2|pfZ)~27aGGw4Q^dsJ)k}>tk$$YJ{+L;+tnsk;eR-b!k+lj%{>^m@vZX zV^bw$qv$wpj6{qr;>SkgXB}gETQmTVRW+|7_*Yx_<WlXSzy_opotkrJHb%J`>Qo*V zFY7YVfxL9tv1f>Hd4|j<2uSB!#^8WnKew{9wJ+u)FmltK9>unLF)YCrVbRM`ghZ-m zV;DrO4tI7H>_4IVvfQ9hw~PXOJtm%(uK#Lr9bYFFgGC)y(hW>xS5*ToXDcYNBgB1r zI?oX%&f8}pf{l<g;|>rBm8$0uEqwChv`o_JsmsY1qf`EUnq5MmSy6`J<eI}utJ@`l zqRg%Vp{~GEab~T+6Cr(NnvrSVdaY{N#naERVfz%}?+ZHmEsC(9Ww>4*aR2pMB}dl* zd%Oo)Jjr!Ph-aDk_)h$5zW$eAc}{yk!dTnn&ybd|SFI0LiY2Ge-P0o*W=;KN=kUcE zNp_r0^XS?>p}6e%Gsam{ah;*Uedy<UDoc_h4P@rpAFEF@{7!C-IZ%sZc&465pp`zS zP*J^V39<jZZsjTXAxsZ`)=G<L*9j-Mx}H+s7>ip%pEMT8w1BoS0A}YZG8=${f5)1z zt<56{{^TX--Mc=W;X`Yke>$R_Ul_k<7p!QU50O~iSdqDM1yWDx(;lz$-TIvypuMjF zC%W&W_2BMU4>Kymr`_sitLs{<f@RZyiqtdHTcd^{R){AI0?S#c#*dYeHJ-NM>D7|; zw5v{E>~xHWXI4MJW}o^><<(d+_4|QAfi?#%^)h^w7)cAiG)=*WI$<>3169YH;~Y;% z<2LlRQ&V;0j%9Yh2~6*_-@dnUjX+l|zD(V4hZ$m?1DGG6$_Mn>eS%V<zsyi~zUH-_ zI7euI0QagUkvSaHbsz7u3TL#~p|c)16JR$3U5i{y50Fo3^~|`4MQ=<lVr3XnaP{6^ zn5SHU{cM@A;6tP9SoN}4Mi#kc2PUc5;M&Kmm$i)FjGm)+)klw1s69|6Za(eqXT~gh zwb4o{_mS_~u%Y5dcC#!AfJP@=JUsr9zq0z=MRtbv(eP&HyI%w<;wZ!VG<#TFODZs+ zy&?96iTj2VzUZD_5TcELFU7&s`N4+1)pT6@28KXRX3u>ZautiR262u9`aLEK6VkTp zxd(whOHk*ZKjBY?R`7Bi#<kBnZkWF@w7DfZd}3Bf%%ekAAv%T=FEvj??5-_sKud}3 z>f^tc4@CSa!u0V@DtJZ?QUaM0m%~d1Bogm(c&F3TPJLW-2LO$KKnqojb8AItAGplv z327AQEaULPP5!g`)-u46TCSjp)b84xx^1<O9l%vDKmUGU<rBg|TZHQX9^0?eJ=N6J zs&y#B)eK(2#KUikK>NV+!<B8fIWfSg2OE+B6egx8XGbA&5PPo?4ahN>-9n2fCBb3E z)MwJKLZNxqaZG0Hc@)<dxZ+;uOj_*z14gK%sjbam(f^|bV0KiH?zf%xEt>;5=sY?i zes?Ch-}LI)SXntyttc}Dl;0+-Zh(G(GIQJwtxiigYt|BSTZqm|)e!d{dyHk!)^7LP zS(aVn15d!3bk3^j@5Kgff53m}Fe3D5-oRDu&G*vV@36wraVAvO1Xl?pjws1sb~#>1 zqeDfle%hSI&}?*J@V_@fq%Yk{(1ZmU&~pq22f2+WUd+a^KQCHG@VmAmUjWMgr!y}Q zh9DnG53`mX^z3K^?C2%C{y?RQ%@{ZGKAlK?*1+T;B%o14knAKu;l}GBE73AvhjISm z3ti`dkaZK2#y}~kgb<F6i4Mq`wzqi-3clq{BRHPvAltV;z$YZAcXpG}N;#aY^9!UQ zZ6?0{z_cT&XUQls)JbH)`u$E>l+fN?@+Y+jSJ~pdxe6;faoI-HzxNmacKersP8o;C z>r%yE%o*-mNMLc}QiW)o&*>Xjy+|&{UsTohDk3kNW9$Yd$MQp_U()73M*Hgt4qhU- z+`V-i>^hy<{%i}VHxkHgm=^L?R_f*g8n}RhnUGTVTMr45rp80T9WQz0#)0<hK{dbo zh69N)C)9f+Ldq1>Pw%W=$>XSsLNFo!;yM8V=j*aFPHS7B9QmzV#}hFCc$oX&ijT#3 ztcW20J%Z)*b!7OotAr7FFH8En?Ry?S-k(<|vmYMQ@egU|54`aSG&S94KiB_BUaKW8 z)eHR+3A8Fc1-ZU;0t2nT0F-dhJ4&LZg`1bC(0b|I<g+6v7M`{Vx4^=7$vbutq0eH) zzcZtH?ou&ask6VrW8J5b&xGLUzZ_{)1M2wveDCE}Wx)wlr}j(%3Hv0HnNe8&%H>PA zA?w>_LAS!=dY;OMrtLIi$4dlsaF0V6ZBX}8ed~8_PM`z=XjR^rr>&`c9MD)jO8VS$ z+#t8>42lBAVvi`t)+MaCv2_tE5~b5S_Gu^s+Aq0S*ecz+9|&Kc!wjE~D^)K8u3SYk zezM@$x830W+hUUUb&gzI{0g|Y_LZ1*Z(UkE{MvCA$%UmcDL6O}!6tFR0nA#FQ~yeD zq`5vk#pesTvUvr(4it7c>7sBEIpMlLEG>5~I@$?<&bX*W-IKQuT*~>&9+c|JLexq{ zcq_5j1$lY}*L*Ds?j2<fKJsaxtd2fLe;L*+-<)N*K=@A3ZN1pfY07%&?G?t6DM6av z)9zFJ38~s&WD38pzq;P6u}MO1+IxTP*?(mGe^vHXL2-0lw1W=>hY;Ltu;3Eh88paX z!QI^@xVu|`;O;KL39ey~0KwfgSm4h0zut#ich^+SOLz6DKGn7NUVE)|-UPuf+u-VN zuWf;kl{a~jf^cc}SmMdGJTJ(Bcg$K>f09Grd^CUB2DswAPGE^Hr|;nZI)X`!bIFd+ z3d~}St*ygc;t|vi6&~hgw}V~}0$OIsQT4;daX)9G(rpLMRS#pQGbbW=SrMc;-_*x_ zVX*IRtKJNmAc@LT8w;fcw|iYt!?JFq94$JGzE+8zB)81>(5c`0>+x(lMruG?p9dQ= zLbVElgBj6JC|RPm?nWj$a{NQF>cp2K;_r)c0!+^N*Wl;Oo}j^o7nbeDb6NR&!$CQ{ z@bp9+V&nl-)U7160h+vxEl&K7=mKLRJTR(c5vPHVKgNgaRa15unegu?DMqnWq?lb> zJO?nX*$bf>BRV)4yRnMB3Q=ZU;AxgGz;cv4J)<BTj^0qR__cgW7rjAy?lB#MpHW&N zlszZus$>QV6I>Ofdso6T_3P=3@}|n$EuyC8b&sow_^Ng1-bD7B1Ka4skKV8JE}j!u ztu{f|DKw{aONT$=-LH_A_pQ+r;wg#KjI6~Nsc5(duuaqkv5pVEWaC-K%D?y1eqFv7 z&~xY<CTutqW8q1CAAU8*^YZ#;x3jXL5oL!cn}6T_=b05m3?rT=sVCMJ!0>`%<abp+ zyhnv20t37h|7aBB{2ID>G=F)_&+q$BObe4YdaRw$0byTi;kx%Q^#*q#%P4NI0fP(H z_Hsxd|L9en;ltZ!-k?VBmaEukRH=n<3OGfDD6#0$OHbSP3$drX`@~Qmp#6f@c<P!S z43Ntdrrn8m115-ahyFDrZa{TJ9I35UO=B&`K~?P8&pWSCTbkUQ#sRQEf96R6W!*^L zb}gwLdgh+{@r$OF^Ms-f@}4;j0{k18zdgCjt?!b#tk$TlS<@FAI$>Tf|Lfyt)SgN{ z>%lTZD6i3-o`IZ;%|ELz@i0gDu?3rWlYA%ia9QaT(eX^AYXhoxH-^KKngxc}r5quQ zFc0H1UPS>H-z<jc<#0(?13oVhFGM1?<fW^@K4z#hTB|T3&u%F62fyr!+uC*}`M^j* z_~p!32ePq(DT?iZlJ~H|%6}xO%hRTrZI~wbKd~~!;dd&}#D4TYCq9EV)83Rz2bP>L zX!kF?h$t6v$T+uT{RB>`(xy$rK43oe+fu7p(NDfN4VbVoJWOF2+h%-dG2$0AZfX2~ z?Abfe=jp{-7+^a17vSso&eTf+SwSvx6cQ>!_>-Q_B?)n4v33rlAV<OmN7ENt<r^zQ zr)Wzc;@%d^5Wv)IO;1txiP;(k9K*%~51wzY3C`EMW9fmnB+6}_ezQ7Zx%Y{v$4{Tg zVm92w%eqbL1STD3$|@I$3!@s%`My4;*&U2LXS=?uk^yFDjRVuPTK9hFbvJ6xaAlvn zm764WtpeW`$k2W!zpoFy3Da*FsQneEA{FU|ID+vnBf!0lRgWfSC9+Wl8*~iB*RgSm z6JIYX`JJeQnr<^_5ts~keN_bhrLg|7Ed#jj+W3bFQ*sNujO7a@+#I;}3=W9f%e0JT zdC}k8cF8J;st<;+h1@=OyFY*NvvwF4^eIG0wY$XagF(^tPUg^o_dUYXs($@wls*Zf zrSK{u-SIS@q3or6Jr_)iKik~yMTh@m90rALB>ax{Tf|dlAeOKx_?#~-eAS<%gc=KH znjH%(3wrOhfhc9a1p(7aFbU;VTAfhB$ACux*yL-WuWI>h4K`A|YDb2cJDewR>`z=F zVVI)ujFsg>+1DMkLZK3c84YxlNad&4b`FEPEhm5cgk6CTM=R_O;FZKIbORSL10LJN ziT4Zbagln%i3HTY{ZqHRo;En2b9%YV>S`T@Sip1G=Ew_&KS}h=8%bm$kQeSK0a>#) z{9aXYJNXb@$0Hs4YBSNd7p=>S*MAf{U&;(*3XC4mDty;@p=2X7%cVHl>%2R}8a;Ix z^8T}A@F8msR&H;lnBhuG4fal$sqH(&XK85sZ3T_k;jk4pwgdso0-kW*cUp98iG*Na zqN3G_+c~T6@D@%U-O=qnF2(DMJWOp6HP(#s?~a$GAJicb4vbK4U3{)uz>W?D&>%8% z#^)>uX|uo?L2Ewyk`+-au-jr1qM*tF<ZN)G*M6>h$~_E6On9B=tcw=I7$&%|#OnOg z9t8tA<0Y|w=l;1^gcqkjzdg2C?HJQcFr95%opxs`;EcBNbL8%2_>WI-PlHAx4JbYH zn^VSuV5`?|Sne*7_XIy<g(hXD>N76Zu=WLJqT<7`F9T58n<a);<D6ce9JvJXQ9FdA zI9A~6(XER)NZB9H>aTdW0XAv9l8h#U(Tdce@7d{t!qN*EF$s$lgR3=hl1jq$igY9m zA;%8J_swiH8jY7XO~&2M27j7|>Zv9%5E=*S+aHkgy!VOp+7kz7-d-ANO=p4wEj|kj zDYqSY=6cOub}fAbIAXT^^0|?iD#+1kEGWkvPggg(>6Fnbp~9c4`b<X>sFA;~A*s0j zsuP`HVJ4J{Dqi7Oz}7eFO}4)#qv!&#hHmUMaI$8vK%DSDr&6axj!ihgNo&HGne4PB z!MIC$D5FJ|s<nU9uXKTdh~WxGR1*l&2<5#x)Ysv*8Vfk(1>0gl%e<#q=;Av(FM|T_ zME&ag3kC((xM6}%W<ziCgPHu12Ge{=`jjJEBfF0wmLbYS7s&16Q_iP%t=V-uxwV4= zvMrMZGIVWA4J!gaX%F5Y6B01)j0HSB;3w@G%sv8-_;O3v{!7HvpB9yYkA9r7S5g>! zP3+N$*n1?{by)y>lv9o|YlUcVU>t%}_d2{R+|L4>1u_b3^YW0Xa3M7$N@F?qpW-^D zag4N5S$Mx0_pOB8H2Z3Z3nv4s9d=0~gmOAT$8y5?&B7ablG*6K^8+>Au3qb;7Wuvm z{~5K!d=TwB5Pf?LUrGEy!1L*Bc)qIWba?pAN58iXIt3*_3m2Se)Nt9%tnQLYO6k$9 z7FP)U%#~|>X`>Tdu?!@MJNne6hoCOO&uP8&LigRuVa9TQkz@0nD9H594MSJrC(m-C z(1mpr0=;Yesx7<?eZRv}-<9a=bRt>8=;u9R83|lkx~<mL(aPQ0fcwfqd6Go4Ksr=H z&4RH;l+d`(h*E^C_A$1I0O>~TUuK887@}Nw16l8Id;Cim?|cTp(L%+Zw^@di59=`{ z`5e~bBei#~`n^X%%6+W(=rcZMDtLY!XdRfNTXS=t<i4fG=weBhJPl8f_rWr!DpLEi zDd*SQf;g`F%YwPvPnb+-6#?>&i-7^$b(^(6c%-s^c~hO2BBIVcg|bE=BnGLCS#!jI zr+2hJYDIc=!Nm^(G#=j^FIGcnyN+*qT+g5HZ{22WG_&;^7J+88Vwo*T_Vsa8D(@7H zlyHJ2?NXwnAZ%SMjN6f+qqdc}yjMkwycKp%!_^Ans*LDg;)B!iL7{P1!JvkQVH;W^ zk6W?lS(~y0_h*r(ycE%C;lFvl&mJm&g*?c8dn#+sj}F{6TzhZ+{XwruryZ`2OP93) zEAxjpKCdD=Yv^H7OU+rJEls9s`X>}9i0k(W113X3U$4qAzV&{)kJI_A0=NrB3&ysb z{w7}btG`6ygY)hv&YIh=$?P5A;)x1r37hXX<<*@<Nv!AYxK6|Y_G&sAfRjC5BRqS2 zdXpk@0RhBhGQ%jNh{Qz-HIW|ltu!dVo2Fkvtp4{Nu;U${@0<*(nm(Q=yTawiKk$BU ztRP*Tv}0TVMIeQyM$NmSg3H`eoJ5Q0<)LniZjO3Z)(P_0$cYMZjxD%SXqb62E{C!r zFWgXlE<O6MAmdN$HRN`d@T2LCNpqdX1Z{gas5)V$w?^3TDbef64qLp5GXE}A`i-;) zA`{dwx#-z3Ha{L5H-UVrWk3wVEHEDUjL=`90rnx-bYHi|!#<`~^|wb&*$=I|e<S`0 zcdZ{t7Cr1|eWAi0cQz<7F=TojE=WHNM87048wTOLv63c4wwNgfQiTr!CsU20T$d^3 zd`Yd*G6}>9T>^2WD&W}r+6XcK$X%@|^reN7rx!i#bda|^L=$b687N%-p+LbT=XRFN zu?&(4E=8Ip$IcRi??Vn!8h*3KhR-8n3P)fU37W_-@q5#HJ#)1AO`^JMN5cGtw00w0 z;S85U9%=a&1G_QXuo$;F*W%0yVWh+<77&k<S{Qe7*3Px)IrgU)e+3cSHT#hQqZyO% zA!!L+8I!`oVrFJ$XLn3x>)~pr#XKV9B?AiEP>F=?i!UcPBQ^I#_Xh4?7g{Fo+0h&7 zXOB)~Xy>>;xJs9M97GYxPVy5|MoMU^#pfxADPaz7U)uHAYI_Z1p!Z(VNAvY&JMdr3 z@dSNwK>YKU9)ZG#q<<rzDC{3!cBb1C-(sG^ETA91M1q59FTv%kEU7-vj{zFnmXfv; z@V5EIYp@Go1HhOG+e7r;i(bMWpW%QXiXAL9LE#39k4w|e6{9L<_cbtzF*N?f#YYBZ zz^l31LQQgg+!Tj7@^FVXorDX>mDnG^(WnvIAE&PxQl*n`6Wz3~CS7N?u10#}qM}gO zTqanAW@;eTgW0o~YC0sUp3tS(UyPnLGbGX=%;)w0`l7V7G+ihVP<*3ZOKLBRe2yzc z6_Q0Z)12Xc1`gu(B_Y5m2B8!o9&)e`O8rv4I?jNr6Ot1v589)oQQ4DV`G9=UUo4^D zNpGZPG>_2ZD0-PL2>SDkyh-t+|0in%V=0N)VCf|ZB1ZmR<y_%_Nuh8b_wXYe-X&}B z?52}q@)vHQi6e8=k=y*Q8q6a&4XmcP<Q={JBuYl}IZ{O}nPsb^<L?39>#n)-@4RrN zQ<Yu8(K)#b!ffK>Zz`Yq2MLhg5p`14{{~;3;`NQZF_3`xx#V!BCMP$~y8_TCUN%u& zMRys|?1YmJ<93N^E$^p%s8<k*7IH0}t%J4(!eS5%yDqL7#Om_k6Ik0>`~9W}!eDh} z2!6bR!nkt_GkoxRB29dd!-q&h>1^y`aC9b#k#lfK;`T7a$USV!B%%<{rP^$mFMKNT zr%BC*Q%Fz-5ANhC7yG)|C9yQ9NJ+{$<f8ae$Y{Rh=1o;sJD&Mf%bTq{3<K)AwGxK! z*)2Fb7Efcc3eU-F>2$=TJrp#Fp5FB7SWz=A&@TcIpUH}WBAFkcWZqu%5<sLqDyENy zg>FTXnFYQ&Z~H9tsu*2WMVNyKm_vFhh#()hnF+w6c)g5xzNR_>nsOyKwsqQ=3+Hp3 z{*dI2a`?MFyL7(|Y#f!wRmSJ+D=C@s!6uENj5d=rM<5SO{rq`V%oi7c9?H>&$D^hw z#-hG<fCupKK*LAE%EKVk;YG>i-s(gTrLAvjp?holgrjO-Obx!a*yvkPA>E7!*bAl~ z%{_E|8Tc2`VeI@lg~klybD0%#0q)LsQdY2-dqP~*b!#*wWTS{8s+pYW!wvrB?=Qgf z*QB_%q^EtpH#FG<@?kCVf7i=rKX`*xSA*<#Z${1_9Z47TBq}VPUU~n%R}LqGRHQ4j z4se%w#gyW~5rYNjJt+hA{C4>RO<~tf;Ak*I*iyax2fiCft5r0C(#^p&YJ3!O#6_`_ zez4}dWyjC_Qn9$TxJ9v*&!OnTmM#JNlZ6&Pa^>TVU$}82c~us45M!c|tkshZ!z;wo zD3_}6+vJT)Rg<)k&7`s*hF-P6>E=~Z&kboOE1!S6_$;i2zjTJOxGXP8WCQTZlyfWT z;#7m_NwP4SAnW6@N01Jpo2C$c@lj&$8&s&?6x3K+yi%Y&nUai|hHc!Xu-QM`ke-;7 z7wo#RBPIDjv$r#a>g=1%-b|vHIcI=&{F!jdfV{q%NyfdVqL@FDu`HMV^$E-UxsePU zpNBEK%c-5vr#z`f!of4&nttIlYg)uKP@@rVtx+zk(_<b1I!#CVc=GIJMf`9?VemFn zcmFphC+9y2!+#xI5Qdv9k2hbAkSrwdL^Wja6KVxlCyI2XX~~KspPl93_X$fCvOM{V zuHYz2VU^64cxf>^8m&~!_ZPpuiPf^fIs49!rItz0I<PnEZvR`OM{;KrYGVwtf0AJ% zUyy5VkRcI)DDuk$9)UKi^6jjH*Q|G!r#Kx<C2+p{=q`mkkwSvk<fYrwdccFAN@n=! z{ze#wJvF$KTPwja;KvGIrtJ@Tm#?ov%HQ~dewC>tl)$zF$k+AdQAXoH_Xi`&onCX( z*L34qP}Wj1VO2ljNJ-&?7>|0B2KOq#2Z8v(ee`&p#1dLD@2+)h*SPYro0uB62WMb} zBtNl%fVPg35{cyx*$P5>OF^aX>ZHw62288qHSq33t!b4RUDs40LAkm{$7lzed(ZGX za*K1&H?T<r$ZlY^b8KLt2ATdI?<FPwd(JjWw~sr=36?kR#=}!ql7C{3wX$P)owM-H zd*n13`C)!V0T~V?9)WEy@kA4IS_x?J^pt~2@dCDB&;f4yLb!rGcFy44FcLs7KPIVf zg@-3*gqCVN#)(IjTNgiG_DS*R&f!pe^POh`1!Y{QV}2`8&KJV9sZ1>^c595UjXh`M z&S4=C-$j<Z3<<`P1n6TDGhFsLTTu*>TyQ%ro$fDmBP+yY=J>)hyq=)KNGu8Fiw@xe zKeA{nBc{@cWD1X62iZ?2kZRQ9Ki**m-T@^DG8Anqh)bfYC6Fxv95zAAVCCe2)7Hij zudl4&dilsa=3t>hGTnfq)9(wdbG+ZaU;HR#9RAu?_Afy&j#TT4+v}S|{6{(bCFRto zdeGPb_`+jP+ddmDfpQ<e**>rp_}f0-@WtA6y+5mx;`(?`!Rxf4>0$eWG~E=VH5W;R z713Tx5!38l_fq{|@?t{BUS=o`@h+!{L_e37T&_>5R2GWVx39q(;CWZDayo>9&fV&( zDr(Xv3D)sI73jA=Kr;<Nd4F?PtARZD*B2~$Zt-*4JwlG`zgEqR@}(`=`7H;tdqyi! z`)#0h%Wa+rwU-?}qMUgL(bK4opBqn$D|*85#~(<;+<x*bji?r$fL{$xevplj$t8Ep zaO|#F)Zkj`2ro+4(TVd4rA}@#>BvJEQPrOC=s@y#`p5>AIIb(EE;NZEP8(P*!EUjD zU&?sTSnMw=jy$lHAiB_c>9WW#9<El9WfZRNEp?|%Yf8%0SxapO57KWJukz8@xWAo~ zpnf&-aCLF5Gw2EBvYg(W%;GvB|Hk8R>$L_BIpJ6xfn+d&7IBJWH5uAbaf;;n`c11G z|9sY8=#)=<{Fil|Vg`z;J1@ko{GHk%ADdG^T7qTxM2<n%=JnfpyA%}ucAwP6E$+Z4 zFs^}og!pmnEpbnr$eaByyqSn@pSK9s%AM3XjU(RL8ubIT?aOjoT?^>=YI`_FTl)~5 zE<<%{-Fa#yZn}{Odcltt)LAPydy&a3Yu+k9x;<}E^F#va%~t|<tU)WR8?>%e#%;Yp zpBAtJ&MZ28(93|cyBmYRSv$O!%ZZsID!o;ucx&pL!BY7nJZD;uN%1t!uJ=s+Rp2g; zGH;uiVl2|mv`t~r&Ti}c=Si*`NmOh6y;hx$gh7L*ysX8Y<a5fsc5H;HSWNANRKHL< z>ZwRogNdJv@d|UdaU#hY9~)`>JGg|8(=1EuRG-lJ+>54Diwbr>@cASBQtz`h_zHfe zY)c`%8SV&osiw(TkF3OkRLW-k{$-^;OCUaB?sY)&)6td}sGyKr;F`wwJJCa909HEk zPAq93V7VWuiR5?5$6~!EMD($VM(o-37ShYw-97QzT5C?Qpk+m}qBh1aJVB0~(zN}5 zyu{idO<FiC!yT}bCK-~h1XJd)M*l;}j5l%oAkcGXT2;($`t&b8WYoM(a>^fZXo!F1 zX3kN4SzWBF|1!waZW?gUf1ZZ_OEUvk^ZjPKYuktti=l!(rf-6)%H-CZEXDBO^d5vp ziEAbTK@Npb`YD?<V3myv;aCk)g%AqV#SxML8XPOdM;7rD9qrQdChwohitheXWz`B1 zXf*g&t9>@vlu@`yhbIVs%04Cdm-{!eZVF;uFSKv<{P%<9N~?}qe38^Qz9M1^jgt1H zH&cym%oVe-=J+CPXZ&qg0U}Y>1Sn$QEsUH~tKFe&(&dqj8)tEY-lo%bEK1XX@BEKD zRqc_?O!z-bHJ3zp?*zt_QCvRezrB*_rR=oOMonIf?qGV^rFGso{bAfQJu4}9zv~L6 zx;|_<fd7L&T%56eaM8+VXV81!64Bsj=&Jw&m$LhF?gC;Z(#5d{N)#dsO-QTG+8>Hk za);K|@c0*WCHR=syvoNEL}Xj0KUs9+UqMc?Ap_M<^h;}fsRvbvdiInJ(7oD{+ASSJ zxeY9K*N`ABQos97jU>0S7aAK+at;LgW!K7v`&|Y^D&PPctODy*+M52{?eVh@<&UwE zq3O$CH<%Hu2Z87fm+azR*J|X3BWX$d+>C*O{!`DpWxoBPOqOX_50V1&gT<lL9a2o` zb46dK4U;6YBca=~5-iGUcZt&sVX(=l5YHIh_eW&(4_ayr)uh{D5@;(!?>;w2|LC`P zu%yoIyE>Yr!$&R8AGtpLFCJHQ^qTr{UC&fleq$`q^#Nzor|_caB&yXyrYVA=7vtpk z+3WJz!uj@46(;PDuU_NT#o%&?-(_sFmw|kf?3MK+ir+D@ZU|8ccvb!O>CPKbAtvyb zM4N1%>D&)N6MSbqjRthVQm6xe<wqTeF$AyM=ZpR4LXlEr<JvT+8M+m5O>*&i>BHP0 zT;A8dgZz#Q9@s7t^beG*Ri~$M4#%&Dnj(^%ue7Hq9*RRmMW}%MvdgT<F5YaLicuDo zuo~(oXB}+BCg=oP;hO*7b^juz5wb!aWuD1)GLOYod3!xKcoG$1fe6v3)X%Z~^Clwa z3tR#NI4aI94b>VRMGn6QI}cB9TWV^*<YPa44Xi-G7j<6p7Wx-BL-D{zvD`%4QDf0! zhfUnbKjS$$(TbnH;~>30rtZo45DL6&AH{Y>>oV_mR8MS;%TOwPc+97?O(!51^1>6j zE%0^T9zrD*a50-A`jrF0;HvC(qCsp+ikJ9rJ#Uv+rvLd^e##9d#EFVuuKe6=|2?O{ zTn$esy{EnMcNh8huUZWB^{e>mXY_w=vsEruF1qcx%zzFk>>2-fkW4%&_ixQn`hbhK zcc-ODJPQ$}@opGIjK)@qIBV#b^Ce#E%oyE|P+`BTIwC#1@2z&jdz+VA6hmJ&eE9yn z?6+-3d_8och>9zk<(1bg`f9L#Bb#N<b-r2GWI40_y1^ek(&Jo8IqVnIVzeBS$Yns! zIfLoW2rxLl*Z0)(Jjq_Gc0ZFs#0fRLKSJ?){U_S?7unN(Barn;N;!PKI=<6HS%#E# zP_+{C{+K$ILEE|-p7W;j9f0&aHVQ#C_V2&cD2I<>0yp&CTNsWo0s^|hze>T&@zo2M zMJ*Q%sBMZmUpyi1+B+mq^!$10Q3$&9O~jvgB%W;0G$FU<U+wd{w4!BWlBL5sKe8SB ztmZ!$8no|3?V@B+a6z!Fj90b3C;YhH8b?YavsKMO;IW)J_M;KuZ=5TJ0HM?$8h6lr zeE9D&0Dx%!zcT`qI1(|33)n7$0<1O#?^(V+{_(X{cMDINw<x`cE&Rl%hS8Mt>8wgi z@V_mCv6;g!zIyiDcg#!AH7NqnX+e|6J?@pXL3KP&w?1Nbf+KU+pVNNiG}s#|Xwm`| z)QVO3$;W=r@+qJc`iR}D`6Lh@O-`NETiGH<ZYp+7aR?6^8+rlCRPxVhhE&JQitgri zOqeTOka>=TJ(VZt1$=J#ka10w6ETBO!o#QJ$LCzZ6>v@2--H?E{e`i&*_qj3<{)k8 zHrq94slJ~u1;s+-T-uV#UIG-{o6*E^wNeTG@DE>Je}S3XEjYr66puWp&NWZ_&XvZC zf=7=3J?Zg-=+j)nHVonL+6q&!b)3#xvf$C2v`~<fZ=o=4seSTMkE#r#xlo|NVUMFR zR@Ulzv~^hn{MTrk7wbae8+(3xWVb+oka?13*9(F)os3Fa)W#~rGNBLO<56em___Pp zSH0i^u17`|NnP2id%X2reYDwj7*&s^xKFCyMraJZ5dZ%1{rEcbft>v8`BR{+x;C5a zAlsx3!x7bXNLo=P@n0Wj2}o%9L7{x?75OV!tCE0B6sJ48Lfj|{8j(0CtxTSJhh;KX zF%^1I#3Wa@op2|F`G-F9H_FSVJ$^>-KS0mb9hZM7$EavK(f%!e&(EpKaGevb{|0-8 zod@JX_sc7<k+;}h^drUn^5Zz8rLUl!U=*Iv<r8{$cP052Ld37i(aD5++Fz97bFKy% z_R?=%uvL}6Rpc`SRaH6{fwu(R#h20&qNF2|ee9YsLTkfF%5-6lR_K2Fy?*?BbxUd% zBo*OA;Wf44L~d`7H#h(3FPt{~|HhfgR3-Yq&rqwZ9#d?HAVp<X_FJiH&?RnPN;8G_ zc9Iqof!IvVD<YL6V(2m7#*rF71ccZhBRcFJb5yRJL2HGe*)u;nC9B$UGk1?0zHA|n zob|g3X69`#&-BKrylpiosT&t%_J`!PL7?o==Mc)F5G;{U&z>6~x!+}hJ4kf{89m2% z-UukrmvVh8+oI5R%QHT7@uQZss+a=ttHW>&3oA{0=ri-NiyMJ%`%Xp%@Sd?&KtRML zfMZnlPO!4PHKLNlwNuOEymOutR{2<>bp~GGhSnn0DLFse6XZQrsqFNlP!LxREvjR1 zO~)RpLJ!+ZeeYgJ$OU8mb|3us->W!ZTk901iG*YL@+4%^!Gl+dER?YzV_5fLuUywU z8GpyBqg?MKT0l^!^>TY)GEZ}6wUE@mjJ=9XUC}D#D|yyWE~cbYDA^Zei{cAaNFpos z?)@u_YKO`3?R5d=vZXGUNT8mR4P3)>VvZk7vUE@(a<JAR@bXl*5kVvSCkoaeIxagN ztpZvC^UMSJo6V-mO$7m4uFW9O9{>5?T^X`|r45H3cfaYob@u+p7|?5f@AG0FByLqA z9uiPQ>cwVxJ6;ju>rJ(YW1{c$lL1kjQPFmW7078UrjENSf{@}6t@2vtJEEq3f;t;Z zQb6uW?s4~c0F$h~J|}F$T$CTyVI-VZM`vuki0{Tunc!?@SwOu2a~wEPzq7>p$A==Q z`_U)PLu&sRHP&dQPyJ!jXC)4=zVAbKe(x~~zu;u>F`%XV=70-OgIU1~H4sAS3zl4Y zB#2Sf<3szH_+P3QSb+k;i8S4#PToN#=4qQ9F(74sJgbd+&6nwm7hZ=S?jHX8`#`$z zFL9K>xuZy?449N~vrA<v?tPd+3Zc^Gy(D5?7g6RP6%JvzQ%3+wDF%0TUvWm^Tp?Yr zsVi1SqbAs(^hmCS5zJwR!NSJ2Sz?ZG@u~H16wY$^bw4GiOOtN7jCiaI+~Qr*YE?{Q zwruI2^x=Qbt=>pfD9#`W<t-WEAx!D6{`yQp%GMx3EZPS{Ltnz)TLqX2`z<3Tg@~S- zbrH5<?uIjIBWX#V&$6$<kKg@82_n%uBMCb&>-8^c{X2rxaNU+!Vu^uY5T|JYg!KXw z&jRu$8n#s@@k<VRuI`m>l*1CN@@l)zC?7uYZP`<FIq4^weC<xyKID1)KC`~G*{ZZ9 z2%;B;Pl5j`iO$2P*q8r(6V#_3n7y4Wvv(rAH^Yvyk-m{pCN>^~7)a#84saeaDiuow z{K%v+*w>avC1pp%88%hXA1+Gxie&wJFxT@>){I?i<8cBd(AH6FY_f5(AOUJT`@FcG zK7$&JJtO)CQ$swew_o%;hw8qZ3ndq~(e-vM*=-py_lqzLn;~4%qc_tldhr_ZBO)8K zqi&kfX5I6PF&NDkH}k^sag}=XI=d8KWKwA`{;#}IeZ^pG1!n#3dZSIUx7Uu7Xu`S* zoqwbMFwO<7$qO7*v`fSkfAL|j6h0168txeI)tuOjn*PKILl@5ILl;N~wByu|DqSka zPQ1haXmGyO@geA<NA3#Bpf0q86YBMFY25wx?_wm0Mi!a3a+yWCo&47$tiSZSo%^_R zd-QP|*5(;Gw^z`+kzpz!wEeL%@}L-W3o(6?L5Of*XXk;PV8H&Mj+pnQ_(pDT)SHGv zrX^?5C|9?-%BkY%eG$2ndC<-o1y-G)+8S?@ZkTQqWmg^|Z^T7n&*6#zyX_+NQ0K*v zK7dMoD3iS}4p(o#uqxIRE>FQ(l4cmopF$ivLi-Hf@cB2<H(_6b|E%X{UQd0m_W62| zV6=ZHea~tSiz1Cdbk4C7Yrms;X}xwQ9GEJ?>tQS6>R~6rkW1oJJ)smEv6L=*-Q^uS zi!((G;pV(rSgg|{qTp99vi(*Np2><Ea-wVjY_0Bl9^GfAmUUm$x=Y8enkX6{UrDTL ziOJM8hTChls}rq-8prH;2-WEl*2NM}9w|`VDRnW`hH$Vy0gf)Kk+l)c4fLoE*=XAv zX%}`jghnpgKJeGpri1NZ4ME$w2Z_PkQ`cps)_M@^%mY$>_K+NhY!Hq?ZbH2eD}}lt zUidbyG!+5Cr%V_s2g@li39!KA)RZv{^crCQO(20N#lD|T5|r~>LSVXCz~Y{$-J4=? zHx+g1{d&Rzt^`D2TroPg5FQ1I1^Qgs5e<<@6&WsJ8@WcSulE6p{(V+4{5#||m0EPd zI3<~;65F}=NmG^RSAZTePc9+B*dNqg0V}oj`nMJ~h}0QyM@9@$6=5yR>fb(&<n2$S z*+zB6M|>yxAm}h|RIVUjgzLfnWywc>RG10BRog1;_n-OJ<fP))6+USAS-Vx+J9RzW z4HHYab#|s#gVWvoD_Fmtng1a}*%Ho}v1iC5$vA)By;0MgKEhm8JKai0#{L~4CGK(R zjz>*Ri->EYt_E0@Zm2xN$k-fpJ=1^>=a9@^Q&yORBD0>*Kqj;>qDVVZNIgM(^Do8< zu}q>nZIk-Ko^I*Q_h<O&n?{}jBf@k5VXT=z0x3>WJs8bKtzE+m?(|0BzAFZ(xR9)d z9qQdHx#8)&A8Tc_)v4@pR=A!w?x+CsDt7Q7>vzwcZ+ZG7NEELcD^)(Qujsa`iaaqY z)7F^3!$|91^AfI%e=BT2KkSlcGD-{#!3@MC&}1ag3=DYc%EtFhok_X_8pR+GP>pq6 zl^?6-QmN|$pkbV`l%B!SdKZ?@p_CAObO53LifDp{vJbKe340BGI%=~Y{Kl3oQ|lA$ z=`asoEmZelJvf{}H?1Lb(8l#aha*-=4S>&4;M8O&WE>dh!r&xGy;@3GHKhIHOe$zw zi{$_$uNIq(B;<R9t(lSEFPwjDqqc^+YxRsTE){6EB|v~<KfX55&8F;u459qQhIFu^ zN%6gyX|Kg5d@*aaiz7;pK1h%;b?3T}QtlX=A7{iw=;2OXM0}9>C7!tQB5BalWJ*=N z-ETfL@E86ia<y@%@K7dZ=1=e_Q(?2}1Ku2k70wXh&b0&<a}~bI6hr$3)tSng>MrA| z_*h`<;hvn!FI}e5)A|FEQ3;OstjQ)oJU;=st@dGf5G{uM{=@g=x=*<4U__>rJ_yuG zP%IfV5}C55LLh^_4%}>5_G5_|XcO@J^6`?%thlq@gb<J|TLm}QI*9<Nd-!L+(O!B| zqzw8w$4Q#OBut;7Fl9jp@{o+@NA6rFoM7(TIq+@2D9}#Xo~9ka4>vb5mZl9-NRBn7 zj2EyIM3&&_m28%j7+XjmO2jK(qhcP)Vy+HMBi5GNm}Hlz=34TESN$1#z#v8Xp7ls) zsLuz{Ik5tqLNNY~6M)$C3;!b<XAQaRdLLN>{W=W%Ml)>RQIo33KM-)Z|4rB&BwK+c zp?PzM37CjsA)yOid$GisQFq35a_cI@JsU{FR}l)}`g)?$TNLG7mTWqSu}mZm-=`)u zg!+w9M9vrpY>N2Zkz9;9=5NQ@xo&xV3sOoY!2d?SZAIkqo8{3`Bf?{yx`qo{muADx zv{6xv%?V}fs*sJ+5DQy5%of9rnO9VbAH<PC$C$vz<M7q96AGntj+Da)Tn;50WJD6- zZ6rVLT+N8@NX}qfbiG=3Da($>qlq_l>oTb<V}#kYv7RHl_$@U+t}kWv^5{Y7czyN2 zLc6>oNge0pk7&OHc}=yca9WnAA{6XH8?5XJ*rEfnmZMCR8HEm^H4!e?w&<yfE=O$| zs7=aBnCfXew7Zy}sE+sd%I%+uYT3&M%?pTWWUyV~0}C<$R5bN0MkVjGORc6#luqEG z8-*WSZ#gp(4hhTwm?#OT{4ITnfEB4pi<tcr)6f6j>P<z*+4*6*-)2qQNsBam?{AdH zI8vx1F&{Zz&fdX3$M*v8eXFA6$^VrDyx=5y(0uVFmAo`6K%BPnJ?VHLo0uI!j5GQO z^>_M+G?4rNS{i7q@w7{0u2*wAvfl%(aT3hUH3Ig8(7swQNRp{)hKPiWI)0`YKL+!h z(#jKF4>>N<Xh(;Fr%b{b-&>2Y?E%F$vq^Ed0uxW(i@+BmI+2Mds#4n|LN%J!E)MZ& z_n-S`ugIXLqLX1XQwQS3j7Z{JcuJI$Y{BIyEY+W@YiS>z@JM^_<O-vl+mebj67yf7 zE(+!&@ZWD2T*;!jRZ*GW&z--A-vG}|DLOK64NKAnb4$XTjBF~<Uf>+539jnbh_rw# z&9tVj(@M<u9C45|rmkAx`E7Z2$>_vrDN-OD10$pT)LT{wxbfTt{`Bsnz~oSxQyfHn z%`TAM#o;}0fV`eiJySC}DzZpGJk(m)7!I4P|7<dVSzlnApC!cXJ(v54L*i4N;Ll^z zcpM`Eqv)_-b@=bpq(pRS<)t7Ko@~VrEh!w{Z6e)W8KiKV{sEumUN?MuC*UHP!dOa7 zK==Z_0?tfdslY%0wwXo8MX?yXc=q}!50Udv3-m=AU{d7xw|cAERSfSxdGgtN^R!xE z^*nqv<4P%=GD?&*XAJfCkYCY>P!|7+Z$l&_+s}wN(%Hq@dN``b2JoRcvLD&};sN5= zCrBbd@WAY-W&j`V3B8gUBKszdbmpV`-ZE^s*RpALWXZ|V?eh|jV+Iv&>LZ+t?xa`* z7Jlvw#vhC{cF5Z)%Kv5Ktddw1Z78U7{&3}c;n^WcXcAcpSeKJBMlyyU;9y(WJC=uE zD$v%fKHNvVj%?>g01)j)?b>ZmitcD58dHvN<A=gFMJtojre|#n%^A%cq!yjsVl5fs z!Uo|Hkn@J&RnzdyI7Oesf(gTH6mcwUy0osSZ*h${c&|6)B^?O={bjYt*&dQ=fa?NK z#{^@;e*k&0_$8>edZ%;JHj=K1ceJ|K;#y0{QiVjhyjJ>jLuIg!33vA1JNsYJg&V#U z-?N_UxR6G%;Dtx34@t3rf5CVA!K<YKq&~&aDnc`|K8nyQ&2uv-Sr?9kQtu8Zw%Mlw zxg^x0zbO>PGP^n!7m|i{e)YNLQ9TZE(|Yz(=5$obqctAFrZc(04sfjw?X$rG`XYh{ zur0Z)ntdj}(nxzFIcKr>qR#5T{U!qcgbR_RS|~ES7aqSQ7vnC9q%pQR2t!Nbp<JDI z{&T1>fzy<)6NL@I^8s~<M#lPe%Mo(;T`&#T<t_}hL)%MDae1TP9^SEKnAc$%vp2Qu z3JkDBCpUuFAf*~QHVCmyv`OPepNGn=juRn@+SomcDm7hqPrqVzqi9go<3hD=b}KO- zsWB=>4O4~~Aw}F}pP0i0e&E7$P#q!<Y_!)i$z7KOZocf{&*;y+BLg^yGLAEq`33un zj06$LP9V_h8JPs{o{YLPqAR#n{}t+MO``Dhu0D$v)j1<%Q^2I78h=L4nn@-M3;4E6 ze>;FSRfA~#DD((_*&sSM<h2eOX}PR>YyX@+^2gS7fKfNqSOBC^!aYnTDdkLKK3&>f zgKMRnhr^5%f*wN|7!--xm@1+~{*Ftp63in}o4pCS5sXh4m+Qc9q#XJx+f6I|J)f|s znDVEdHRATYJZ+>Z(@$uv!EOkYR$KuGW&W?WHWB_Ir#9tbA^$$7n0kgGGq|y?v5KCq zEOQ1IArc3fwheQrLD}VGf1Gnz{iDmv!5f*i$-=m^+e?*acW~RJCDQ6DBHJEiD_q3w z^SWZy+a2tj4DHe1+GC}N5<26!ToKXqShY#}`)%238ew)5^eW|@ws*xx7Ro-}jfhE~ zTdJ7B4$5`az+oWJRriTFgl%HX`4w$2<zw{)pVG>-$2G~qcAqW4k7W4Hi8LD-vl&${ zXB#=+)G+0{d0D%+d^0B(>q4dMowgQh#HZA%j-i%jM2$4yceD3WvD8X(U{(X2(snPN z;di-$mm>l9eA$FN0uJ!TJ<#numFsEd;J!wDin6b96+<8>Lj%ht?U)K76#XM|Sk#sx zHCD>*xZ1vfrh25=ZIdXZNHJPXy!@+70V8J`A;A#gJy4UH@(4}~Avi2>M<U{H)`DQ} zEpLVxmTMaKU!FigM;wwV3=!F1dzsd*+=@n>($_m5{SzR;%>ok$UhX*sZcV$kjDJ-# z5**X8OY+spEdknSpmYSQmhv%Y+pCXnc@wM|rkn~mjV$mvA2z;JP9@@av9W@be@Wz7 z(5lCFheOm-=e4r(X;b%#kBGOuAz@iL9$CSOJ*AzaW`rDiI*D!Xh8c@$j1wqLxV7Rw zA|YmcvIg@Qs1);~JNlJO>E{e^dFO95C=0_ER;Ai-jK<B9H$0UelP84&DYc?G`1-a7 zIK4oHUiZ=TGD`7Fgl{hl_6|DS3>-_l9X9nW1-wy`TeM-E)ijDDMjZ*2l}s_KS-Ox( z4sd2;sUDpaQC2EiVG2$$v0nx5PBdu=Hkzvs)n*9?YBuS+ms~+<hZ@?E3S{;z=e5*| z;V9JkGV-dN?|OU#NHk1s+A4ZlRH&+Vrt)dpkZ3?XDPTQut3+D=tZ>X3WpiD0+i7XH zUeRa(G}@?a?2|R9AD3P=o~)f!hl^US&p7#M`}F1pRLrP!SgBi$OB0wZuzrRLeVE*% z_Ls&p6&3d>wK`gK6DTDK^GQVn{hNh&j_WQ4%Lnh7DqOpLd*QE*TpE>nRsI0P-86~V zPI=>77_rMSKF$X`obrvAPKZ8p<a{YTjA8uHW9#yL!WbDuOh4O#y2kkK#Z1*HsXH$) z8=s01yR@S-*0^6LIYVA;6+R|ypJ+v?Wqa6tR1Aid;9w6iUc566w`4=8YM>u7KD?Jg zinX=q)z3IMPcwjbqnfmJ*3(u_<W$weHV{vTiwz<%fY8avPu7yaRdGx~xA!1qUUTEl zAGXeyrmj&B;ExwdSj0*2>FO#c2G*GJiZnaQj|7U!rNtO!0EdVuS1o1JCwR6PFU!o1 zd-48oYQmkRm%`&aI(MR#<)uO3`Kl(|0Ty9J*g%>iT82t&?L87E?3Md|g!@1M-jJy& z7;|3Qw2vTTQ(>GyEG60gd-F1YsD&WJDS-*xDB&KXLzQ>ukHr3B@FPH#?x%xHrr}q; z9Fv{QMZhAhTt~lmJS7iNs`?n`M<s|WEi;k6s{9Q`Lk1<o@Nl4MiGmY|@?p}@%4A`; zeI(MwP`&ynJvSX*koUlwDBm&aH3%2aAq#j?Ury_!^}gukxg?M>8p~?99gHXd#a?2q zTi&Gw|IVXq7nc%Ph@F|VBrgLJi6>IlS<OeQrtG*E(EBG4h>W8x2#tq>T=4hKhT+m! zAT8yZy)1~Nh<vstYk-9Xawv7ClNA0Ji;v~BI#Urfo#1kioQ8WwxxDIriA?PFG3U}y z`PkJHwfuMfxzOa|l1K|O?@Bb)uw%pO<Q+qik`p^V1#wM?85wwgM1^W%{%S&xc0Oz# zgD4nwiifd?Y%DdHFd2q(+)*mO^?Liia0?g&Fnkl5t2E<>Vu$i=rPfu+`Iyh6Z&&Ns zPBxpYnQ)PaQGhE)8i-@x;qE%5(&8M?HV2lZQjh8N=O&t(zc+dbq?cBTCuUNuWFQUH zgH+OLLlSHzILN#@JS;rYXyKCZKs5k>e|jKy+RYTJ!js%9ZV<b2H2vbD<sVHo3* zgccRpU(KFE)rVfTO;(<(4kM>u-2a`>j{?{Q%e0N?rpQaBz@6%E99=d4q6BAl$=_$A z^9a~jSy`QeKmWsn{aabNEX=}Ux4ZxrW2%y{NGS@31-&c=EMN<SMK&o9H!S{l=l|n| j|NlGw??;?MUIGFya?+BI(qKnM0{~!YWvN;Tqu~DoHk{<v diff --git a/samples/html/printing/printing.cpp b/samples/html/printing/printing.cpp index 2febc3bd6c..4b5b1d7b1e 100644 --- a/samples/html/printing/printing.cpp +++ b/samples/html/printing/printing.cpp @@ -1,312 +1,244 @@ -/* - * File: printing.cc - * Purpose: Printing demo for wxWindows class library - * Author: Julian Smart - * modified by Vaclav Slavik (wxHTML stuffs) - * Created: 1995 - * Updated: - * Copyright: (c) 1995, AIAI, University of Edinburgh - */ - -/* static const char sccsid[] = "%W% %G%"; */ - -#ifdef __GNUG__ -#pragma implementation -#endif +///////////////////////////////////////////////////////////////////////////// +// Name: printimg.cpp +// Purpose: wxHtmlEasyPrinting testing example +///////////////////////////////////////////////////////////////////////////// + // For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" +#include <wx/wxprec.h> #ifdef __BORLANDC__ #pragma hdrstop #endif +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP -#include "wx/wx.h" +#include <wx/wx.h> #endif -#if !wxUSE_PRINTING_ARCHITECTURE -#error You must set wxUSE_PRINTING_ARCHITECTURE to 1 in setup.h to compile this demo. -#endif - -// Set this to 1 if you want to test PostScript printing under MSW. -// However, you'll also need to edit src/msw/makefile.nt. - -//!!! DON'T DO THAT! This is wxHTML sample now -#define wxTEST_POSTSCRIPT_IN_MSW 0 +#include <wx/image.h> +#include <wx/html/htmlwin.h> -#include <ctype.h> -#include "wx/metafile.h" -#include "wx/print.h" -#include "wx/printdlg.h" +#include <wx/html/htmprint.h> -#include "wx/accel.h" -#if wxTEST_POSTSCRIPT_IN_MSW -#include "wx/generic/printps.h" -#include "wx/generic/prntdlgg.h" -#endif - -#include <wx/wxhtml.h> -#include <wx/wfstream.h> -#include "printing.h" +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- -#ifndef __WXMSW__ -#include "mondrian.xpm" -#endif - -// Global print data, to remember settings during the session -wxPrintData *g_printData = (wxPrintData*) NULL ; +// Define a new application type, each program should derive a class from wxApp +class MyApp : public wxApp +{ + public: + // override base class virtuals + // ---------------------------- -// Global page setup data -wxPageSetupData* g_pageSetupData = (wxPageSetupData*) NULL; + // this one is called on application startup and is a good place for the app + // initialization (doing it here and not in the ctor allows to have an error + // return: if OnInit() returns false, the application terminates) + virtual bool OnInit(); +}; -// Declare a frame -MyFrame *frame = (MyFrame *) NULL; -wxHtmlWindow *html = NULL; -int orientation = wxPORTRAIT; +// Define a new frame type: this is going to be our main frame +class MyFrame : public wxFrame +{ + public: + // ctor(s) + + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); + + // event handlers (these functions should _not_ be virtual) + void OnQuit(wxCommandEvent& event); + void OnAbout(wxCommandEvent& event); + + void OnPrintSetup(wxCommandEvent& event); + void OnPageSetup(wxCommandEvent& event); + void OnPrint(wxCommandEvent& event); + void OnPreview(wxCommandEvent& event); + void OnOpen(wxCommandEvent& event); + + + private: + wxHtmlWindow *m_Html; + wxHtmlEasyPrinting *m_Prn; + wxString m_Name; + // any class wishing to process wxWindows events must use this macro + DECLARE_EVENT_TABLE() +}; + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// IDs for the controls and the menu commands +enum +{ + // menu items + Minimal_Quit = 1, + Minimal_About, + Minimal_Print, + Minimal_Preview, + Minimal_PageSetup, + Minimal_PrintSetup, + Minimal_Open + +}; + +// ---------------------------------------------------------------------------- +// event tables and other macros for wxWindows +// ---------------------------------------------------------------------------- + +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. It can be also done at run-time, but for the +// simple menu events like this the static method is much simpler. +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(Minimal_Quit, MyFrame::OnQuit) + EVT_MENU(Minimal_About, MyFrame::OnAbout) + EVT_MENU(Minimal_Print, MyFrame::OnPrint) + EVT_MENU(Minimal_Preview, MyFrame::OnPreview) + EVT_MENU(Minimal_PageSetup, MyFrame::OnPageSetup) + EVT_MENU(Minimal_PrintSetup, MyFrame::OnPrintSetup) + EVT_MENU(Minimal_Open, MyFrame::OnOpen) +END_EVENT_TABLE() -// Main proc +// Create a new application object: this macro will allow wxWindows to create +// the application object during program execution (it's better than using a +// static object for many reasons) and also declares the accessor function +// wxGetApp() which will return the reference of the right type (i.e. MyApp and +// not wxApp) IMPLEMENT_APP(MyApp) +// ============================================================================ +// implementation +// ============================================================================ -MyApp::MyApp() +// ---------------------------------------------------------------------------- +// the application class +// ---------------------------------------------------------------------------- +// `Main program' equivalent: the program execution "starts" here +bool MyApp::OnInit() { -} +#if wxUSE_LIBPNG + wxImage::AddHandler(new wxPNGHandler); +#endif +#if wxUSE_LIBJPEG + wxImage::AddHandler(new wxJPEGHandler); +#endif +#if wxUSE_GIF + wxImage::AddHandler(new wxGIFHandler); +#endif -// The `main program' equivalent, creating the windows and returning the -// main frame -bool MyApp::OnInit(void) -{ - g_printData = new wxPrintData; - g_pageSetupData = new wxPageSetupDialogData; + MyFrame *frame = new MyFrame("Printing test", + wxPoint(150, 50), wxSize(640, 480)); - // Create the main frame window - frame = new MyFrame((wxFrame *) NULL, (char *) "wxWindows Printing Demo", wxPoint(0, 0), wxSize(600, 400)); + // Show it and tell the application that it's our main window + // @@@ what does it do exactly, in fact? is it necessary here? + frame->Show(TRUE); + SetTopWindow(frame); - // Give it a status line - frame->CreateStatusBar(2); - // Load icon and bitmap - frame->SetIcon( wxICON( mondrian) ); + // success: wxApp::OnRun() will be called which will enter the main message + // loop and the application will run. If we returned FALSE here, the + // application would exit immediately. + return TRUE; +} - // Make a menubar - wxMenu *file_menu = new wxMenu; +// ---------------------------------------------------------------------------- +// main frame +// ---------------------------------------------------------------------------- - file_menu->Append(WXPRINT_PRINT, "&Print...", "Print"); - file_menu->Append(WXPRINT_PRINT_SETUP, "Print &Setup...", "Setup printer properties"); - file_menu->Append(WXPRINT_PAGE_SETUP, "Page Set&up...", "Page setup"); - file_menu->Append(WXPRINT_PREVIEW, "Print Pre&view", "Preview"); - // Accelerators - wxAcceleratorEntry entries[1]; - entries[0].Set(wxACCEL_CTRL, (int) 'V', WXPRINT_PREVIEW); - wxAcceleratorTable accel(1, entries); - frame->SetAcceleratorTable(accel); +// frame constructor +MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) + : wxFrame((wxFrame *)NULL, -1, title, pos, size) +{ + // create a menu bar + wxMenu *menuFile = new wxMenu; + wxMenu *menuNav = new wxMenu; + + menuFile->Append(Minimal_Open, "Open...\tCtrl-O"); + menuFile->AppendSeparator(); + menuFile->Append(Minimal_PageSetup, "Page Setup"); + menuFile->Append(Minimal_PrintSetup, "Printer Setup"); + menuFile->Append(Minimal_Print, "Print..."); + menuFile->Append(Minimal_Preview, "Preview..."); + menuFile->AppendSeparator(); + menuFile->Append(Minimal_About, "&About"); + menuFile->AppendSeparator(); + menuFile->Append(Minimal_Quit, "&Exit"); + + // now append the freshly created menu to the menu bar... + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append(menuFile, "&File"); + + // ... and attach this menu bar to the frame + SetMenuBar(menuBar); + + CreateStatusBar(1); + + m_Html = new wxHtmlWindow(this); + m_Html -> SetRelatedFrame(this, "HTML : %s"); + m_Html -> SetRelatedStatusBar(0); + m_Name = "test.htm"; + m_Html -> LoadPage(m_Name); - file_menu->AppendSeparator(); - file_menu->Append(WXPRINT_QUIT, "E&xit", "Exit program"); - - wxMenu *help_menu = new wxMenu; - help_menu->Append(WXPRINT_ABOUT, "&About", "About this demo"); - - wxMenuBar *menu_bar = new wxMenuBar; - - menu_bar->Append(file_menu, "&File"); - menu_bar->Append(help_menu, "&Help"); - - // Associate the menu bar with the frame - frame->SetMenuBar(menu_bar); - - frame->Centre(wxBOTH); - frame->Show(TRUE); - - frame->SetStatusText("Printing demo"); - - SetTopWindow(frame); - - return TRUE; + m_Prn = new wxHtmlEasyPrinting("Easy Printing Demo", this); + m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)<hr>", wxPAGE_ALL); } -int MyApp::OnExit() -{ - delete g_printData; - delete g_pageSetupData; - return 1; -} -BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(WXPRINT_QUIT, MyFrame::OnExit) - EVT_MENU(WXPRINT_PRINT, MyFrame::OnPrint) - EVT_MENU(WXPRINT_PREVIEW, MyFrame::OnPrintPreview) - EVT_MENU(WXPRINT_PRINT_SETUP, MyFrame::OnPrintSetup) - EVT_MENU(WXPRINT_PAGE_SETUP, MyFrame::OnPageSetup) - EVT_MENU(WXPRINT_ABOUT, MyFrame::OnPrintAbout) -END_EVENT_TABLE() +// event handlers -// Define my frame constructor -MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size): - wxFrame(frame, -1, title, pos, size) +void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { - html = new wxHtmlWindow(this); - html -> LoadPage("test.htm"); + delete m_Prn; + // TRUE is to force the frame to close + Close(TRUE); } -void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event)) -{ - Close(TRUE); -} -void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxPrinter printer; - MyPrintout printout("My printout"); - if (!printer.Print(this, &printout, TRUE)) - wxMessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wxOK); + wxMessageBox("HTML printing sample\n\n(c) Vaclav Slavik, 1999"); } -void MyFrame::OnPrintPreview(wxCommandEvent& WXUNUSED(event)) -{ - wxPrintData printData; - printData.SetOrientation(orientation); - - // Pass two printout objects: for preview, and possible printing. - wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout, & printData); - if (!preview->Ok()) - { - delete preview; - wxMessageBox("There was a problem previewing.\nPerhaps your current printer is not set correctly?", "Previewing", wxOK); - return; - } - - wxPreviewFrame *frame = new wxPreviewFrame(preview, this, "Demo Print Preview", wxPoint(100, 100), wxSize(600, 650)); - frame->Centre(wxBOTH); - frame->Initialize(); - frame->Show(TRUE); -} void MyFrame::OnPrintSetup(wxCommandEvent& WXUNUSED(event)) { - wxPrintDialogData printDialogData(* g_printData); - wxPrintDialog printerDialog(this, & printDialogData); - - printerDialog.GetPrintDialogData().SetSetupDialog(TRUE); - printerDialog.ShowModal(); - - (*g_printData) = printerDialog.GetPrintDialogData().GetPrintData(); -} - -void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event)) -{ - (*g_pageSetupData) = * g_printData; - - wxPageSetupDialog pageSetupDialog(this, g_pageSetupData); - pageSetupDialog.ShowModal(); - - (*g_printData) = pageSetupDialog.GetPageSetupData().GetPrintData(); - (*g_pageSetupData) = pageSetupDialog.GetPageSetupData(); + m_Prn -> PrinterSetup(); } - -void MyFrame::OnPrintAbout(wxCommandEvent& WXUNUSED(event)) +void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event)) { - (void)wxMessageBox("wxWindows printing demo\nAuthor: Julian Smart julian.smart@ukonline.co.uk\n\nModified by Vaclav Slavik to show wxHtml features", - "About wxWindows printing demo", wxOK|wxCENTRE); + m_Prn -> PageSetup(); } -bool MyPrintout::OnPrintPage(int page) -{ - wxDC *dc = GetDC(); - if (dc) - { - if (page == 1) - DrawPageOne(dc); - - return TRUE; - } - else - return FALSE; -} - -bool MyPrintout::OnBeginDocument(int startPage, int endPage) +void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) { - if (!wxPrintout::OnBeginDocument(startPage, endPage)) - return FALSE; - - return TRUE; + m_Prn -> PrintFile(m_Name); } -void MyPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) -{ - *minPage = 1; - *maxPage = 1; - *selPageFrom = 1; - *selPageTo = 1; -} -bool MyPrintout::HasPage(int pageNum) +void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event)) { - return (pageNum == 1); + m_Prn -> PreviewFile(m_Name); } -void MyPrintout::DrawPageOne(wxDC *dc) +void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event)) { - int leftMargin = 20; - int topMargin = 40; - -/* You might use THIS code to set the printer DC to ROUGHLY reflect - * the screen text size. This page also draws lines of actual length 5cm - * on the page. - */ - // Get the logical pixels per inch of screen and printer - int ppiScreenX, ppiScreenY; - GetPPIScreen(&ppiScreenX, &ppiScreenY); - int ppiPrinterX, ppiPrinterY; - GetPPIPrinter(&ppiPrinterX, &ppiPrinterY); - - // Here we obtain internal cell representation of HTML document: - wxHtmlContainerCell *cell = html -> GetInternalRepresentation(); - - // Now we have to check in case our real page size is reduced - // (e.g. because we're drawing to a print preview memory DC) - int pageWidth, pageHeight; - int w, h; - dc->GetSize(&w, &h); - GetPageSizePixels(&pageWidth, &pageHeight); - - // Now we must scale it somehow. The best would be to suppose that html window - // width is equal to page width: - - float scale = (float)((float)(pageWidth - 0 * leftMargin)/((float)cell -> GetMaxLineWidth() + 2 * leftMargin)); - - // If printer pageWidth == current DC width, then this doesn't - // change. But w might be the preview bitmap width, so scale down. - float overallScale = scale * (float)(w/(float)pageWidth); - dc->SetUserScale(overallScale, overallScale); - - // Calculate conversion factor for converting millimetres into - // logical units. - // There are approx. 25.1 mm to the inch. There are ppi - // device units to the inch. Therefore 1 mm corresponds to - // ppi/25.1 device units. We also divide by the - // screen-to-printer scaling factor, because we need to - // unscale to pass logical units to DrawLine. - - dc->SetBackgroundMode(wxTRANSPARENT); - - // TESTING - - int pageWidthMM, pageHeightMM; - GetPageSizeMM(&pageWidthMM, &pageHeightMM); - - - // This is all the printing : - cell -> Draw(*dc, leftMargin, topMargin, 0, cell -> GetHeight()); + wxFileDialog dialog(this, "Open HTML page", "", "", "*.htm", 0); + + if (dialog.ShowModal() == wxID_OK) + { + m_Name = dialog.GetPath(); + m_Html -> LoadPage(m_Name); + m_Prn -> SetHeader(m_Name + "(@PAGENUM@/@PAGESCNT@)<hr>", wxPAGE_ALL); + } } - diff --git a/samples/html/printing/printing.h b/samples/html/printing/printing.h deleted file mode 100644 index ba50b4e216..0000000000 --- a/samples/html/printing/printing.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * File: printing.h - * Purpose: Printing demo for wxWindows class library - * Author: Julian Smart - * Created: 1995 - * Updated: - * Copyright: (c) 1995, AIAI, University of Edinburgh - */ - -/* sccsid[] = "%W% %G%" */ - -#ifdef __GNUG__ -#pragma interface -#endif - -// Define a new application -class MyApp: public wxApp -{ - public: - MyApp() ; - bool OnInit(); - int OnExit(); -}; - -DECLARE_APP(MyApp) - -class MyCanvas; - -// Define a new canvas and frame -class MyFrame: public wxFrame -{ - public: - MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size); - - void OnPrint(wxCommandEvent& event); - void OnPrintPreview(wxCommandEvent& event); - void OnPrintSetup(wxCommandEvent& event); - void OnPageSetup(wxCommandEvent& event); -#if defined(__WXMSW__) && wxTEST_POSTSCRIPT_IN_MSW - void OnPrintPS(wxCommandEvent& event); - void OnPrintPreviewPS(wxCommandEvent& event); - void OnPrintSetupPS(wxCommandEvent& event); - void OnPageSetupPS(wxCommandEvent& event); -#endif - - void OnExit(wxCommandEvent& event); - void OnPrintAbout(wxCommandEvent& event); -DECLARE_EVENT_TABLE() -}; - - -class MyPrintout: public wxPrintout -{ - public: - MyPrintout(char *title = "My printout"):wxPrintout(title) {} - bool OnPrintPage(int page); - bool HasPage(int page); - bool OnBeginDocument(int startPage, int endPage); - void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); - - void DrawPageOne(wxDC *dc); -}; - -#define WXPRINT_QUIT 100 -#define WXPRINT_PRINT 101 -#define WXPRINT_PRINT_SETUP 102 -#define WXPRINT_PAGE_SETUP 103 -#define WXPRINT_PREVIEW 104 - -#define WXPRINT_PRINT_PS 105 -#define WXPRINT_PRINT_SETUP_PS 106 -#define WXPRINT_PAGE_SETUP_PS 107 -#define WXPRINT_PREVIEW_PS 108 - -#define WXPRINT_ABOUT 109 - diff --git a/samples/html/printing/test.htm b/samples/html/printing/test.htm index ca2d7dfba1..9cbd004977 100644 --- a/samples/html/printing/test.htm +++ b/samples/html/printing/test.htm @@ -1,126 +1,186 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> - <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="GENERATOR" CONTENT="Mozilla/4.06 [en] (X11; I; Linux 2.0.35 i686) [Netscape]"> + <TITLE>wxWindows Roadmap</TITLE> </HEAD> -<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088"> -This is - - default text, now switching to -<CENTER> -<P>center, now still ctr, now exiting</CENTER> - -<P>exited!.<A HREF="#downtown">[link to down]</A> -<P>Hello, this *is* default charset (helvetica, probably) and it is displayed -with one <FONT COLOR="#FF0000">COLOR CHANGE</FONT>. Of course we -can have as many color changes as we can, what about this <FONT COLOR="#FF0000">M</FONT><FONT COLOR="#FFFF00">A</FONT><FONT COLOR="#33FF33">D</FONT><B><FONT COLOR="#FFFFFF"><FONT SIZE=+1>N</FONT></FONT></B>E<FONT COLOR="#999999">S</FONT><FONT COLOR="#CC33CC">S?</FONT> -<P><FONT COLOR="#000000">There was a space above.</FONT> -<BR> -<HR WIDTH="100%">This was a line. <TT>(BTW we are in <B>fixed</B> font -/ <I><U>typewriter</U> font</I> right now :-)</TT> -<BR>This is in <B>BOLD</B> face. This is <I>ITALIC.</I> This is <B><I><U>E -V E R Y T H I N G</U></I></B>. -<BR> -<BR> -<BR> -<BR> -<BR> -<CENTER> -<P>Right now, <FONT COLOR="#0000FF"><FONT SIZE=+4>centered REALLY Big Text</FONT></FONT>, -how do you like (space) it?</CENTER> - -<DIV ALIGN=right>RIGHT: <FONT SIZE=-2>text-2, </FONT><FONT SIZE=-1>text-1, -</FONT>text+0, -<FONT SIZE=+1>text+1, -</FONT><FONT COLOR="#FF0000"><FONT SIZE=+2>text+2, -</FONT></FONT><FONT SIZE=+3>text+3, -</FONT><FONT SIZE=+4>text+4</FONT> -<BR><U><FONT SIZE=+1>we are right now</FONT></U></DIV> - -<CENTER><U><FONT SIZE=+1>we are center now</FONT></U></CENTER> -<U><FONT SIZE=+1>we are left now.</FONT></U> -<P><I><FONT COLOR="#3366FF">Blue italic text is displayed there....</FONT></I> -<H1> - -<HR ALIGN=LEFT SIZE=10 WIDTH="50%">This is heading one.</H1> -this is normal -<CENTER> -<H1> -This is <FONT COLOR="#33FF33">CENTERED</FONT> heading one</H1></CENTER> -<IMG SRC="pic.png" ALT="Testing image image" >and this is text...... -<BR> -<UL> -<LI> -item 1</LI> - -<LI> -item 2</LI> - -<UL> -<LI> -nested item</LI> - -<LI> -nested item 2</LI> -</UL> - -<LI> -item 3</LI> -</UL> - -<OL> -<LI> -item one</LI> - -<LI> -item two</LI> - -<OL> -<LI> -nsted item</LI> -</OL> - -<LI> -last numbered item</LI> -</OL> - -<H1> -Heading 1</H1> -<I>Italic text now...</I> -<H2> -<I>Heading 2</I></H2> -<I>and now?</I> -<H3> -Heading 3</H3> - -<H4> -Heading 4</H4> - -<H5> -Heading 5</H5> - -<H6> -Heading 6</H6> -And this is normal text, once again :-) -<P>And yes, we're in <FONT SIZE=+4>HTML DOCUMENT, </FONT><FONT SIZE=+1>so -what about some nice <A HREF="fft.html">hypertext link</A>??</FONT> -<P>hello? + +<BODY> + +<a name="top"></a> + +<font face="Arial, Lucida Sans, Helvetica"> + +<table width=100% border=4 cellpadding=5 cellspacing=0> +<tr> +<td bgcolor="#660000"> +<font size=+1 face="Arial, Lucida Sans, Helvetica" color="#FFFFFF"> +wxWindows Roadmap +</font> +</td> +</tr> +</table> + +<P> + <CENTER> -<P>This is <A NAME="downtown"></A>centered paragraph</CENTER> - -<P>Now, you will see some PRE text: -<PRE>// This is sample C++ code: - -void main(int argc, char *argv[]) -{ - printf("Go away, man!\n"); - i = 666; - printf("\n\n\nCRASH\n DOWN NOW. . . \n"); -}</PRE> - -<H3> -WWW</H3> -<A HREF="http://www.kde.org">This is WWW link to KDE site!</A> -<BR><A HREF="http://www.ms.mff.cuni.cz/~vsla8348/wxhtml/index.html">(one -folder up)</A> +<a href="#schedule">Schedule</a> | <a href="#todo">To-Do List</a> +</CENTER> + +<P> + +This page represents current thinking about where wxWindows is going in the near, +medium and long-term. It also serves as a schedule for new releases so +that both developers and users can know what to expect when, at least approximately.<P> + +Note (1): as the wxWindows effort is voluntary, these are not hard-and-fast deadlines: +but we will endeavour to follow them as closely as possible.<P> + +Note (2): the releases described are for wxGTK, wxMSW and wxMotif ports. wxMac currently follows +its own development path. Also, minor snapshot releases for specific platforms may be +available at dates convenient to the developers.<P> + +<HR> <FONT SIZE=+2><I><B><a name="schedule">Schedule</a></B></I></FONT> <HR> +<P> + +<H4>Release 2.1.10</H4> + +<ul> +<li>Release date: October 3rd, 1999 +<li>This beta is intended to be the last stable snapshot before wxWindows +is split into base and GUI libraries. +<li>New wxGrid in beta. +</ul> + +<P> + +<H2>Release 2.1.11 (final)</H2> + +<ul> +<li>Release date: November 7th, 1999 +<li>Splits wxWindows into base and GUI libraries. Most, but not all makefiles +are expected to support this: for the rest, the makefiles will build a valid +combined base/GUI library for GUI applications only. +<li>New wxGrid. +<li>wxSocket working. +<li>wxHTML printing (possibly). +<li>Animation classes (possibly). +<li>PCX writing capability (possibly). +<li>wxImage handlers in separate .h and .cpp files. +<li>Rewritten timer.cpp, possible wxChrono class. +<li>Bug tracking system in place. +</ul> + +<P> + +<H4>Release 2.1.12</H4> + +<ul> +<li>Release date: January 9th, 2000 +<li>Miscellaneous fixes and small enhancements. +</ul> + +<P> + +<H4>Release 2.1.13</H4> + +<ul> +<li>Release date: March 5th, 2000 +<li>Miscellaneous fixes and small enhancements. +<li>wxDateTime class in beta. +</ul> + +<P> + +<H4>Release 2.2.0</H4> + +<ul> +<li>Release date: May 7th, 2000 +<li>Unicode compilation starting to work in wxGTK and wxMSW. +</ul> + +<P> + +<H2>Release 2.2.x (final)</H2> + +<ul> +<li>Release date: c. July 2nd, 2000 +<li>Unicode compilation working in wxGTK and wxMSW. +<li>wxDateTime class. +</ul> + +<P> + +<H2>Release 2.3.x (final)</H2> + +<ul> +<li>Release date: unknown +<li>WinCE port available. +</ul> + +<P> + +<HR> <FONT SIZE=+2><I><B><a name="todo">To-Do List</a></B></I></FONT> <HR> + +<P> + +Developers: please feel free to add to these, and delete them when they are done. + +<P> + +<B><I>General</I></B><P> + +<ul> +<li>wxHTML printing. When finished, this will allow an application to generate +printed reports with very little effort. +<li>wxSocket. +<li>Split library into several, for base (classes and functions usable by console and GUI +applications), console (classes and functions usable by console application only) +and GUI (classes and functions usable by GUI application only). +<li>Extend and unify drag and drop handling (e.g. we need to specify multiple drop targets +that can handle multiple formats). +<li>Expand the number of controls that can be specified in a WXR file. +<li>Rewrite Dialog Editor. +<li>PCX writing code. +<li>GIF animation code. +<li>Tidying of timer code, addition of wxChrono class. +<li>wxDateTime class. +<li>MGL port (see Backroom/Future Ports page). +<li>Rotated text support. +<li>FreeType support. +<li>Support for 'skins', perhaps using a set of alternative control and window classes +written generically in wxWindows. +<li>Book, tutorial. +<li>More examples. +</ul> + +<P> + +<B><I>wxMSW</I></B><P> + +<ul> +<li>Windows CE port. +<li>Cure bug whereby in a panel within another panel, all buttons become +default buttons (heavy black border). +<li>Write a RC->WXR converter. +</ul> + +<P> + +<B><I>wxGTK</I></B><P> + +<ul> +<li>GNOME/KDE integration libraries. +</ul> + +<P> + +<B><I>wxMotif</I></B><P> + +<ul> +<li>Allow wxSystemSettings to be configurable, perhaps via a control +panel application. +</ul> + + </BODY> </HTML> + diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp new file mode 100644 index 0000000000..da2b0d5e15 --- /dev/null +++ b/src/html/htmprint.cpp @@ -0,0 +1,570 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmprint.cpp +// Purpose: html printing classes +// Author: Vaclav Slavik +// Created: 25/09/99 +// RCS-ID: $Id$ +// Copyright: (c) Vaclav Slavik, 1999 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + + +#ifdef __GNUG__ +#pragma implementation +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#if wxUSE_PRINTING_ARCHITECTURE + +#include "wx/print.h" +#include "wx/printdlg.h" +#include "wx/html/htmprint.h" +#include "wx/wxhtml.h" +#include "wx/wfstream.h" + + +//-------------------------------------------------------------------------------- +// wxHtmlDCRenderer +//-------------------------------------------------------------------------------- + + +wxHtmlDCRenderer::wxHtmlDCRenderer() : wxObject() +{ + m_DC = NULL; + m_Width = m_Height = 0; + m_Cells = NULL; + m_Parser = new wxHtmlWinParser(NULL); + m_FS = new wxFileSystem(); + m_Parser -> SetFS(m_FS); + m_Scale = 1.0; +} + + + +wxHtmlDCRenderer::~wxHtmlDCRenderer() +{ + if (m_Cells) delete m_Cells; + if (m_Parser) delete m_Parser; + if (m_FS) delete m_FS; +} + + + +void wxHtmlDCRenderer::SetDC(wxDC *dc, int maxwidth) +{ + int dx, dy; + + wxDisplaySize(&dx, &dy); + m_MaxWidth = maxwidth; +#if 0 + m_Scale = (float)dx * 2 / 3 / (float)maxwidth; + // let the width of A4 is approximately 2/3 the screen width +#endif + m_Scale = (float)800 / (float)maxwidth; + // for now, assume screen width = 800 => good results + + m_DC = dc; + m_Parser -> SetDC(dc); +} + + + +void wxHtmlDCRenderer::SetSize(int width, int height) +{ + m_Width = (int)(width * m_Scale); + m_Height = (int)(height * m_Scale); +} + + + +void wxHtmlDCRenderer::SetHtmlText(const wxString& html, const wxString& basepath, bool isdir) +{ + if (m_DC == NULL) return; + + if (m_Cells != NULL) delete m_Cells; + + m_FS -> ChangePathTo(basepath, isdir); + m_DC -> SetUserScale(1.0, 1.0); + m_Cells = (wxHtmlContainerCell*) m_Parser -> Parse(html); + m_Cells -> SetIndent(0, HTML_INDENT_ALL, HTML_UNITS_PIXELS); + m_Cells -> Layout(m_Width); +} + + + +int wxHtmlDCRenderer::Render(int x, int y, int from, int dont_render) +{ + int pbreak; + + if (m_Cells == NULL || m_DC == NULL) return 0; + + pbreak = (int)(from * m_Scale + m_Height); + while (m_Cells -> AdjustPagebreak(&pbreak)) {} + + if (!dont_render) { + int w, h; + m_DC -> GetSize(&w, &h); + float overallScale = (float)(w/(float)m_MaxWidth) / m_Scale; + m_DC -> SetUserScale(overallScale, overallScale); + + m_DC -> SetBrush(*wxWHITE_BRUSH); + + m_DC -> SetClippingRegion(x * m_Scale, y * m_Scale, m_Width, m_Height); + m_Cells -> Draw(*m_DC, + x * m_Scale, (y - from) * m_Scale, + y * m_Scale, pbreak + (y - from) * m_Scale); + m_DC -> DestroyClippingRegion(); + } + + if (pbreak < m_Cells -> GetHeight()) return (int)(pbreak / m_Scale); + else return GetTotalHeight(); +} + + + +int wxHtmlDCRenderer::GetTotalHeight() +{ + if (m_Cells) return (int)(m_Cells -> GetHeight() / m_Scale); + else return 0; +} + + + + + + + + + + + + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlPrintout +//-------------------------------------------------------------------------------- + + + +wxHtmlPrintout::wxHtmlPrintout(const wxString& title) : wxPrintout(title) +{ + m_Renderer = new wxHtmlDCRenderer; + m_RendererHdr = new wxHtmlDCRenderer; + m_NumPages = HTML_PRINT_MAX_PAGES; + m_Document = m_BasePath = wxEmptyString; m_BasePathIsDir = TRUE; + m_Headers[0] = m_Headers[1] = wxEmptyString; + m_Footers[0] = m_Footers[1] = wxEmptyString; + m_HeaderHeight = m_FooterHeight = 0; + SetMargins(); // to default values +} + + + +wxHtmlPrintout::~wxHtmlPrintout() +{ + delete m_Renderer; + delete m_RendererHdr; +} + + + +bool wxHtmlPrintout::OnBeginDocument(int start, int end) +{ + int pageWidth, pageHeight, mm_w, mm_h; + float ppmm_h, ppmm_v; + + if (!wxPrintout::OnBeginDocument(start, end)) return FALSE; + + GetPageSizePixels(&pageWidth, &pageHeight); + GetPageSizeMM(&mm_w, &mm_h); + ppmm_h = (float)pageWidth / mm_w; + ppmm_v = (float)pageHeight / mm_h; + + /* prepare headers/footers renderer: */ + + m_RendererHdr -> SetDC(GetDC(), pageWidth); + m_RendererHdr -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), + ppmm_v * (mm_h - m_MarginTop - m_MarginBottom)); + if (m_Headers[0] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[0], 1)); + m_HeaderHeight = m_RendererHdr -> GetTotalHeight(); + } + else if (m_Headers[1] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[1], 1)); + m_HeaderHeight = m_RendererHdr -> GetTotalHeight(); + } + if (m_Footers[0] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[0], 1)); + m_FooterHeight = m_RendererHdr -> GetTotalHeight(); + } + else if (m_Footers[1] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[1], 1)); + m_FooterHeight = m_RendererHdr -> GetTotalHeight(); + } + + /* prepare main renderer: */ + m_Renderer -> SetDC(GetDC(), pageWidth); + m_Renderer -> SetSize(ppmm_h * (mm_w - m_MarginLeft - m_MarginTop), + ppmm_v * (mm_h - m_MarginTop - m_MarginBottom) - + m_FooterHeight - m_HeaderHeight - + ((m_HeaderHeight == 0) ? 0 : m_MarginSpace * ppmm_v) - + ((m_FooterHeight == 0) ? 0 : m_MarginSpace * ppmm_v) + ); + m_Renderer -> SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir); + CountPages(); + + return TRUE; +} + + +bool wxHtmlPrintout::OnPrintPage(int page) +{ + wxDC *dc = GetDC(); + if (dc) { + if (HasPage(page)) + RenderPage(dc, page); + return TRUE; + } else + return FALSE; +} + + +void wxHtmlPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) +{ + *minPage = 1; + *maxPage = HTML_PRINT_MAX_PAGES; + *selPageFrom = 1; + *selPageTo = 1; +} + + + +bool wxHtmlPrintout::HasPage(int pageNum) +{ + return (pageNum >= 1 && pageNum <= m_NumPages); +} + + + +void wxHtmlPrintout::SetHtmlText(const wxString& html, const wxString &basepath, bool isdir) +{ + m_Document = html; + m_BasePath = basepath; + m_BasePathIsDir = isdir; +} + + + +void wxHtmlPrintout::SetHtmlFile(const wxString& htmlfile) +{ + wxFileSystem fs; + wxFSFile *ff = fs.OpenFile(htmlfile); + wxInputStream *st = ff -> GetStream(); + char *t = new char[st -> GetSize() + 1]; + st -> Read(t, st -> GetSize()); + t[st -> GetSize()] = 0; + + wxString doc = wxString(t); + delete t; + delete ff; + + SetHtmlText(doc, htmlfile, FALSE); +} + + + +void wxHtmlPrintout::SetHeader(const wxString& header, int pg) +{ + if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) + m_Headers[0] = header; + if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) + m_Headers[1] = header; +} + + + +void wxHtmlPrintout::SetFooter(const wxString& footer, int pg) +{ + if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) + m_Footers[0] = footer; + if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) + m_Footers[1] = footer; +} + + + +void wxHtmlPrintout::CountPages() +{ + wxBusyCursor wait; + int pageWidth, pageHeight, mm_w, mm_h; + float ppmm_h, ppmm_v; + + GetPageSizePixels(&pageWidth, &pageHeight); + GetPageSizeMM(&mm_w, &mm_h); + ppmm_h = (float)pageWidth / mm_w; + ppmm_v = (float)pageHeight / mm_h; + + int pos = 0; + + m_NumPages = 0; + + m_PageBreaks[0] = 0; + do { + pos = m_Renderer -> Render(ppmm_h * m_MarginLeft, + ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight, + pos, TRUE); + m_PageBreaks[++m_NumPages] = pos; + } while (pos < m_Renderer -> GetTotalHeight()); +} + + + +void wxHtmlPrintout::RenderPage(wxDC *dc, int page) +{ + wxBusyCursor wait; + + int pageWidth, pageHeight, mm_w, mm_h; + float ppmm_h, ppmm_v; + + GetPageSizePixels(&pageWidth, &pageHeight); + GetPageSizeMM(&mm_w, &mm_h); + ppmm_h = (float)pageWidth / mm_w; + ppmm_v = (float)pageHeight / mm_h; + + m_Renderer -> SetDC(dc, pageWidth); + + dc -> SetBackgroundMode(wxTRANSPARENT); + + m_Renderer -> Render(ppmm_h * m_MarginLeft, + ppmm_v * (m_MarginTop + (m_HeaderHeight == 0 ? 0 : m_MarginSpace)) + m_HeaderHeight, + m_PageBreaks[page-1]); + + m_RendererHdr -> SetDC(dc, pageWidth); + if (m_Headers[page % 2] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Headers[page % 2], page)); + m_RendererHdr -> Render(ppmm_h * m_MarginLeft, ppmm_v * m_MarginTop); + } + if (m_Footers[page % 2] != wxEmptyString) { + m_RendererHdr -> SetHtmlText(TranslateHeader(m_Footers[page % 2], page)); + m_RendererHdr -> Render(ppmm_h * m_MarginLeft, pageHeight - ppmm_v * m_MarginBottom - m_FooterHeight); + } +} + + + +wxString wxHtmlPrintout::TranslateHeader(const wxString& instr, int page) +{ + wxString r = instr; + wxString num; + + num.Printf("%i", page); + r.Replace("@PAGENUM@", num); + + num.Printf("%i", m_NumPages); + r.Replace("@PAGESCNT@", num); + + return r; +} + + + +void wxHtmlPrintout::SetMargins(float top, float bottom, float left, float right, float spaces) +{ + m_MarginTop = top; + m_MarginBottom = bottom; + m_MarginLeft = left; + m_MarginRight = right; + m_MarginSpace = spaces; +} + + + + + + +//-------------------------------------------------------------------------------- +// wxHtmlEasyPrinting +//-------------------------------------------------------------------------------- + + +wxHtmlEasyPrinting::wxHtmlEasyPrinting(const wxString& name, wxFrame *parent_frame) +{ + m_Frame = parent_frame; + m_Name = name; + m_PrintData = new wxPrintData; + m_PageSetupData = new wxPageSetupDialogData; + m_Headers[0] = m_Headers[1] = m_Footers[0] = m_Footers[1] = wxEmptyString; + + m_PageSetupData -> EnableMargins(TRUE); + m_PageSetupData -> SetMarginTopLeft(wxPoint(25, 25)); + m_PageSetupData -> SetMarginBottomRight(wxPoint(25, 25)); + +#if defined(__WXGTK__) || defined(__WXMOTIF__) + m_PrintData -> SetPrinterCommand("lpr"); +#endif +} + + + +wxHtmlEasyPrinting::~wxHtmlEasyPrinting() +{ + delete m_PrintData; + delete m_PageSetupData; +} + + + +void wxHtmlEasyPrinting::PreviewFile(const wxString &htmlfile) +{ + wxHtmlPrintout *p1 = CreatePrintout(); + p1 -> SetHtmlFile(htmlfile); + wxHtmlPrintout *p2 = CreatePrintout(); + p2 -> SetHtmlFile(htmlfile); + DoPreview(p1, p2); +} + + + +void wxHtmlEasyPrinting::PreviewText(const wxString &htmltext, const wxString &basepath) +{ + wxHtmlPrintout *p1 = CreatePrintout(); + p1 -> SetHtmlText(htmltext, basepath, TRUE); + wxHtmlPrintout *p2 = CreatePrintout(); + p2 -> SetHtmlText(htmltext, basepath, TRUE); + DoPreview(p1, p2); +} + + + +void wxHtmlEasyPrinting::PrintFile(const wxString &htmlfile) +{ + wxHtmlPrintout *p = CreatePrintout(); + p -> SetHtmlFile(htmlfile); + DoPrint(p); +} + + + +void wxHtmlEasyPrinting::PrintText(const wxString &htmltext, const wxString &basepath) +{ + wxHtmlPrintout *p = CreatePrintout(); + p -> SetHtmlText(htmltext, basepath, TRUE); + DoPrint(p); +} + + + +void wxHtmlEasyPrinting::DoPreview(wxHtmlPrintout *printout1, wxHtmlPrintout *printout2) +{ + // Pass two printout objects: for preview, and possible printing. + wxPrintDialogData printDialogData(*m_PrintData); + wxPrintPreview *preview = new wxPrintPreview(printout1, printout2, &printDialogData); + if (!preview -> Ok()) { + delete preview; + wxMessageBox(_("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _("Previewing"), wxOK); + } + + else { + wxPreviewFrame *frame = new wxPreviewFrame(preview, m_Frame, + m_Name + _(" Preview"), + wxPoint(100, 100), wxSize(500, 500)); + frame -> Centre(wxBOTH); + frame -> Initialize(); + frame -> Show(TRUE); + } +} + + + +void wxHtmlEasyPrinting::DoPrint(wxHtmlPrintout *printout) +{ + wxPrintDialogData printDialogData(*m_PrintData); + wxPrinter printer(&printDialogData); + + if (!printer.Print(m_Frame, printout, TRUE)) + wxMessageBox(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _("Printing"), wxOK); + else + (*m_PrintData) = printer.GetPrintDialogData().GetPrintData(); +} + + + +void wxHtmlEasyPrinting::PrinterSetup() +{ + wxPrintDialogData printDialogData(*m_PrintData); + wxPrintDialog printerDialog(m_Frame, &printDialogData); + + printerDialog.GetPrintDialogData().SetSetupDialog(TRUE); + + if (printerDialog.ShowModal() == wxID_OK) + (*m_PrintData) = printerDialog.GetPrintDialogData().GetPrintData(); +} + + + +void wxHtmlEasyPrinting::PageSetup() +{ + m_PageSetupData -> SetPrintData(*m_PrintData); + wxPageSetupDialog pageSetupDialog(m_Frame, m_PageSetupData); + + if (pageSetupDialog.ShowModal() == wxID_OK) { + (*m_PrintData) = pageSetupDialog.GetPageSetupData().GetPrintData(); + (*m_PageSetupData) = pageSetupDialog.GetPageSetupData(); + } +} + + + +void wxHtmlEasyPrinting::SetHeader(const wxString& header, int pg) +{ + if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) + m_Headers[0] = header; + if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) + m_Headers[1] = header; +} + + + +void wxHtmlEasyPrinting::SetFooter(const wxString& footer, int pg) +{ + if (pg == wxPAGE_ALL || pg == wxPAGE_EVEN) + m_Footers[0] = footer; + if (pg == wxPAGE_ALL || pg == wxPAGE_ODD) + m_Footers[1] = footer; +} + + + +wxHtmlPrintout *wxHtmlEasyPrinting::CreatePrintout() +{ + wxHtmlPrintout *p = new wxHtmlPrintout(m_Name); + + p -> SetHeader(m_Headers[0], wxPAGE_EVEN); + p -> SetHeader(m_Headers[1], wxPAGE_ODD); + p -> SetFooter(m_Footers[0], wxPAGE_EVEN); + p -> SetFooter(m_Footers[1], wxPAGE_ODD); + + p -> SetMargins(m_PageSetupData -> GetMarginTopLeft().y, + m_PageSetupData -> GetMarginBottomRight().y, + m_PageSetupData -> GetMarginTopLeft().x, + m_PageSetupData -> GetMarginBottomRight().x); + + return p; +} + + + +#endif // wxUSE_PRINTING_ARCHITECTURE diff --git a/src/msw/makefile.b32 b/src/msw/makefile.b32 index 4a13bde399..09cd8ae564 100644 --- a/src/msw/makefile.b32 +++ b/src/msw/makefile.b32 @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE B32.T! # diff --git a/src/msw/makefile.bcc b/src/msw/makefile.bcc index b25de61c34..0c027309fe 100644 --- a/src/msw/makefile.bcc +++ b/src/msw/makefile.bcc @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE BCC.T! # diff --git a/src/msw/makefile.dos b/src/msw/makefile.dos index c717c3c56e..54d2a93843 100644 --- a/src/msw/makefile.dos +++ b/src/msw/makefile.dos @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE DOS.T! # diff --git a/src/msw/makefile.g95 b/src/msw/makefile.g95 index 3f3fe7b866..f947d366c2 100644 --- a/src/msw/makefile.g95 +++ b/src/msw/makefile.g95 @@ -1,5 +1,5 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE G95.T! # @@ -156,6 +156,7 @@ HTMLOBJS = \ $(HTMLDIR)/htmlpars.$(OBJSUFF) \ $(HTMLDIR)/htmltag.$(OBJSUFF) \ $(HTMLDIR)/htmlwin.$(OBJSUFF) \ + $(HTMLDIR)/htmprint.$(OBJSUFF) \ $(HTMLDIR)/m_fonts.$(OBJSUFF) \ $(HTMLDIR)/m_hline.$(OBJSUFF) \ $(HTMLDIR)/m_image.$(OBJSUFF) \ diff --git a/src/msw/makefile.sc b/src/msw/makefile.sc index 342f65c38f..fb6d66d2f5 100644 --- a/src/msw/makefile.sc +++ b/src/msw/makefile.sc @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE SC.T! # Symantec C++ makefile for the msw objects diff --git a/src/msw/makefile.vc b/src/msw/makefile.vc index 64c55f907d..9a5e4edf45 100644 --- a/src/msw/makefile.vc +++ b/src/msw/makefile.vc @@ -1,4 +1,4 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE VC.T! # File: makefile.vc @@ -314,6 +314,7 @@ HTMLOBJS = ..\html\$D\helpctrl.obj \ ..\html\$D\htmlpars.obj \ ..\html\$D\htmltag.obj \ ..\html\$D\htmlwin.obj \ + ..\html\$D\htmprint.obj \ ..\html\$D\m_fonts.obj \ ..\html\$D\m_hline.obj \ ..\html\$D\m_image.obj \ diff --git a/src/msw/makefile.wat b/src/msw/makefile.wat index c8e0ca2d00..7b72555a8e 100644 --- a/src/msw/makefile.wat +++ b/src/msw/makefile.wat @@ -1,6 +1,6 @@ -# This file was automatically generated by tmake at 14:54, 1999/10/14 +# This file was automatically generated by tmake at 22:30, 1999/10/16 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE WAT.T! #!/binb/wmake.exe diff --git a/src/wxvc.dsp b/src/wxvc.dsp index 8bd26d3c34..2641b3336f 100644 --- a/src/wxvc.dsp +++ b/src/wxvc.dsp @@ -563,6 +563,10 @@ SOURCE=.\html\htmlwin.cpp # End Source File # Begin Source File +SOURCE=.\html\htmprint.cpp +# End Source File +# Begin Source File + SOURCE=.\html\m_fonts.cpp # End Source File # Begin Source File diff --git a/src/wxvc6.dsp b/src/wxvc6.dsp index 043c132fc2..9ec20280e6 100644 --- a/src/wxvc6.dsp +++ b/src/wxvc6.dsp @@ -578,6 +578,10 @@ SOURCE=.\html\htmlwin.cpp # End Source File # Begin Source File +SOURCE=.\html\htmprint.cpp +# End Source File +# Begin Source File + SOURCE=.\html\m_fonts.cpp # End Source File # Begin Source File diff --git a/src/wxvc_dll.dsp b/src/wxvc_dll.dsp index e1ec62776f..bc5ee9cbdf 100644 --- a/src/wxvc_dll.dsp +++ b/src/wxvc_dll.dsp @@ -571,6 +571,10 @@ SOURCE=.\html\htmlwin.cpp # End Source File # Begin Source File +SOURCE=.\html\htmprint.cpp +# End Source File +# Begin Source File + SOURCE=.\html\winpars.cpp # End Source File # Begin Source File -- 2.45.2