diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2008-02-12 21:22:58 -0800 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2008-02-12 21:22:58 -0800 |
commit | 4256beee1897d25700b9cd6bf51728bc31c86627 (patch) | |
tree | b5e053ff765d0a51ae02a5bc2aefae69264f90e5 | |
parent | 014e25b8ac7d68d70cb9110c59cdad0508879b82 (diff) |
1.0-76641.0-7664
45 files changed, 10663 insertions, 355 deletions
@@ -39,13 +39,14 @@ SHELL = /bin/sh INSTALL = install -m 755 BUILD_OS := $(shell uname) +BUILD_ARCH := $(shell uname -m) ifndef CC CC = gcc endif ifndef CFLAGS - CFLAGS = -Wall -fpedantic + CFLAGS = -Wall endif ifndef PKG_CONFIG @@ -53,7 +54,11 @@ ifndef PKG_CONFIG endif ifndef X11R6_LIB_DIR - X11R6_LIB_DIR = /usr/X11R6/lib + ifeq ($(BUILD_OS)-$(BUILD_ARCH),Linux-x86_64) + X11R6_LIB_DIR = /usr/X11R6/lib64 + else + X11R6_LIB_DIR = /usr/X11R6/lib + endif endif ifndef X11R6_INC_DIR @@ -79,6 +84,17 @@ else prefix = /usr/local endif +# default echo within SunOS sh does not have -n option. Use /usr/ucb/echo instead. +# Solaris install has a different argument syntax +ifeq ($(BUILD_OS),SunOS) +ECHO=/usr/ucb/echo +INSTALL_RULE=$(INSTALL) -f $(bindir) $(NVIDIA_SETTINGS) +LD_RUN_FLAG=-R/usr/X11R6/lib +else +ECHO=echo +INSTALL_RULE=$(INSTALL) $(NVIDIA_SETTINGS) $(bindir)/$(NVIDIA_SETTINGS) +endif + exec_prefix = $(prefix) bindir = $(exec_prefix)/bin @@ -87,13 +103,7 @@ X11R6_CFLAGS = -I $(X11R6_INC_DIR) GTK_CFLAGS := $(shell $(PKG_CONFIG) --cflags gtk+-2.0) GTK_LDFLAGS := $(shell $(PKG_CONFIG) --libs gtk+-2.0) -ifeq ($(BUILD_OS),SunOS) -LIBXV = -lXv -else -LIBXV = -Wl,-Bstatic -lXv -Wl,-Bdynamic -endif - -X11R6_LIBS := -L $(X11R6_LIB_DIR) -Wl,-Bstatic -lXxf86vm -Wl,-Bdynamic $(LIBXV) -lX11 -lXext +X11R6_LIBS := -L $(X11R6_LIB_DIR) -Wl,-Bstatic -lXxf86vm -Wl,-Bdynamic -lX11 -lXext XNVCTRL_LIB := src/libXNVCtrl/libXNVCtrl.a @@ -113,7 +123,7 @@ SRCDIRS := $(addprefix $(CURDIR)/, $(RELATIVE_SRCDIRS)) INC_FLAGS := $(addprefix -I , $(RELATIVE_SRCDIRS)) ALL_CFLAGS = $(CFLAGS) $(X11R6_CFLAGS) $(GTK_CFLAGS) $(INC_FLAGS) -ALL_LDFLAGS = $(LDFLAGS) $(GTK_LDFLAGS) $(X11R6_LIBS) +ALL_LDFLAGS = $(LD_RUN_FLAG) $(LDFLAGS) $(GTK_LDFLAGS) $(X11R6_LIBS) CPPFLAGS = $(ALL_CFLAGS) @@ -129,7 +139,8 @@ STAMP_C = g_stamp.c # Define the files in the SAMPLES directory -SAMPLES = Makefile README nv-control-dvc.c nv-control-info.c +SAMPLES = Makefile README nv-control-dvc.c nv-control-info.c \ + nv-control-events.c nv-ddcci-client.c # initialize SRC and EXTRA_DIST, then include each of the subdirectory # Makefiles so that they can append to SRC and EXTRA_DIST @@ -159,13 +170,6 @@ DEPS_DIR = .deps OBJS := $(patsubst %.c,$(OBJS_DIR)/%.o,$(ALL_SRC)) DEPS := $(patsubst %.c,$(DEPS_DIR)/%.d,$(SRC)) -# default echo within SunOS sh does not have -n option. Use /usr/ucb/echo instead. -ifeq ($(BUILD_OS),SunOS) -ECHO=/usr/ucb/echo -else -ECHO=echo -endif - # and now, the build rules: default: all @@ -174,7 +178,7 @@ all: $(NVIDIA_SETTINGS) install: $(NVIDIA_SETTINGS) $(STRIP) $< - $(INSTALL) $< $(bindir)/$< + $(INSTALL_RULE) $(OBJS_DIR)/%.o: %.c @ mkdir -p $(OBJS_DIR) diff --git a/samples/Makefile b/samples/Makefile index 0c3d0e1..544d634 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -34,6 +34,9 @@ # X11R6_INC_DIR = /usr/X11R6/include # X11R6_LIB_DIR = /usr/X11R6/lib/ +BUILD_OS := $(shell uname) +BUILD_ARCH := $(shell uname -m) + ifndef CC CC = gcc endif @@ -51,7 +54,11 @@ ifndef X11R6_INC_DIR endif ifndef X11R6_LIB_DIR - X11R6_LIB_DIR = /usr/X11R6/lib/ + ifeq ($(BUILD_OS)-$(BUILD_ARCH),Linux-x86_64) + X11R6_LIB_DIR = /usr/X11R6/lib64 + else + X11R6_LIB_DIR = /usr/X11R6/lib + endif endif LIBXNVCTRL_DIR = ../src/libXNVCtrl @@ -61,7 +68,7 @@ ALL_CFLAGS = $(CFLAGS) -I $(LIBXNVCTRL_DIR) -I $(X11R6_INC_DIR) ALL_LDFLAGS = $(LDFLAGS) -L $(LIBXNVCTRL_DIR) -L $(X11R6_LIB_DIR) \ -lXNVCtrl -lXext -lX11 -SAMPLES = nv-control-info nv-control-dvc nv-control-events +SAMPLES = nv-control-info nv-control-dvc nv-control-events nv-ddcci-client all: $(SAMPLES) diff --git a/samples/README b/samples/README index 126c489..3992ba8 100644 --- a/samples/README +++ b/samples/README @@ -13,12 +13,15 @@ source package). Sample applications: nv-control-info: demonstrates how to query for extension - presense, basic information + presense, basic information. nv-control-dvc: demonstrates how to query and assign an integer attribute (NV_CTRL_DIGITAL_VIBRANCE); also shows how to handle multiple display devices. nv-control-events: demonstrates how to register to receive and - interpret NV-CONTROL events + interpret NV-CONTROL events. + + nv-ddcci-client: demonstrates how to use the implementation of the + DDC/CI interface with the NV-CONTROL X extension. diff --git a/samples/nv-control-events.c b/samples/nv-control-events.c new file mode 100644 index 0000000..2f89eaa --- /dev/null +++ b/samples/nv-control-events.c @@ -0,0 +1,165 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +/* + * nv-control-events.c - trivial sample NV-CONTROL client that + * demonstrates how to handle NV-CONTROL events. + */ + +#include <stdio.h> + +#include <X11/Xlib.h> + +#include "NVCtrl.h" +#include "NVCtrlLib.h" + +static const char *attr2str(int n); + +int main(void) +{ + Display *dpy; + Bool ret; + int event_base, error_base, screen; + XEvent event; + XNVCtrlAttributeChangedEvent *nvevent; + + /* + * Open a display connection, and make sure the NV-CONTROL X + * extension is present on the screen we want to use. + */ + + dpy = XOpenDisplay(NULL); + if (!dpy) { + fprintf(stderr, "Cannot open display '%s'.\n", XDisplayName(NULL)); + return 1; + } + + screen = DefaultScreen(dpy); + + if (!XNVCTRLIsNvScreen(dpy, screen)) { + fprintf(stderr, "The NV-CONTROL X not available on screen " + "%d of '%s'.\n", screen, XDisplayName(NULL)); + return 1; + } + + /* + * check if the NV-CONTROL X extension is present on this X server + */ + + ret = XNVCTRLQueryExtension(dpy, &event_base, &error_base); + if (ret != True) { + fprintf(stderr, "The NV-CONTROL X extension does not exist on '%s'.\n", + XDisplayName(NULL)); + return 1; + } + + /* + * register to receive NV-CONTROL events: whenever any NV-CONTROL + * attribute is changed by an NV-CONTROL client, any other client + * can receive notification of the change. + */ + + ret = XNVCtrlSelectNotify(dpy, screen, ATTRIBUTE_CHANGED_EVENT, True); + if (ret != True) { + fprintf(stderr, "Unable to register to receive NV-CONTROL events " + "on '%s'.\n", XDisplayName(NULL)); + return 1; + } + + /* + * Loop forever, processing events + */ + + while (True) { + + /* block for the next event */ + + XNextEvent(dpy, &event); + + /* if this is not one of our events, then bail out of this iteration */ + + if (event.type != (event_base + ATTRIBUTE_CHANGED_EVENT)) continue; + + /* cast the X event as an XNVCtrlAttributeChangedEvent */ + + nvevent = (XNVCtrlAttributeChangedEvent *) &event; + + /* print out the event information */ + + printf("received NV-CONTROL event [attribute: %d (%s) value: %d]\n", + nvevent->attribute, + attr2str(nvevent->attribute), + nvevent->value); + } + + return 0; +} + + + +/* + * attr2str() - translate an attribute integer into a string + */ + +static const char *attr2str(int n) +{ + switch (n) { + case NV_CTRL_FLATPANEL_SCALING: return "flatpanel scaling"; break; + case NV_CTRL_FLATPANEL_DITHERING: return "flatpanel dithering"; break; + case NV_CTRL_DIGITAL_VIBRANCE: return "digital vibrance"; break; + case NV_CTRL_SYNC_TO_VBLANK: return "sync to vblank"; break; + case NV_CTRL_LOG_ANISO: return "log aniso"; break; + case NV_CTRL_FSAA_MODE: return "fsaa mode"; break; + case NV_CTRL_TEXTURE_SHARPEN: return "texture sharpen"; break; + case NV_CTRL_FORCE_GENERIC_CPU: return "force generic cpu"; break; + case NV_CTRL_OPENGL_AA_LINE_GAMMA: return "opengl aa line gamma"; break; + case NV_CTRL_FLIPPING_ALLOWED: return "flipping allowed"; break; + case NV_CTRL_TEXTURE_CLAMPING: return "texture clamping"; break; + case NV_CTRL_CURSOR_SHADOW: return "cursor shadow"; break; + case NV_CTRL_CURSOR_SHADOW_ALPHA: return "cursor shadow alpha"; break; + case NV_CTRL_CURSOR_SHADOW_RED: return "cursor shadow red"; break; + case NV_CTRL_CURSOR_SHADOW_GREEN: return "cursor shadow green"; break; + case NV_CTRL_CURSOR_SHADOW_BLUE: return "cursor shadow blue"; break; + case NV_CTRL_CURSOR_SHADOW_X_OFFSET: return "cursor shadow x offset"; break; + case NV_CTRL_CURSOR_SHADOW_Y_OFFSET: return "cursor shadow y offset"; break; + case NV_CTRL_FSAA_APPLICATION_CONTROLLED: return "fsaa application controlled"; break; + case NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED: return "log aniso application controlled"; break; + case NV_CTRL_IMAGE_SHARPENING: return "image sharpening"; break; + case NV_CTRL_TV_OVERSCAN: return "tv overscan"; break; + case NV_CTRL_TV_FLICKER_FILTER: return "tv flicker filter"; break; + case NV_CTRL_TV_BRIGHTNESS: return "tv brightness"; break; + case NV_CTRL_TV_HUE: return "tv hue"; break; + case NV_CTRL_TV_CONTRAST: return "tv contrast"; break; + case NV_CTRL_TV_SATURATION: return "tv saturation"; break; + case NV_CTRL_TV_RESET_SETTINGS: return "tv reset settings"; break; + case NV_CTRL_GPU_CORE_TEMPERATURE: return "gpu core temperature"; break; + case NV_CTRL_GPU_CORE_THRESHOLD: return "gpu core threshold"; break; + case NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD: return "gpu default core threshold"; break; + case NV_CTRL_GPU_MAX_CORE_THRESHOLD: return "gpu max core_threshold"; break; + case NV_CTRL_AMBIENT_TEMPERATURE: return "ambient temperature"; break; + case NV_CTRL_USE_HOUSE_SYNC: return "use house sync"; break; + default: + return "Unknown"; + } +} /* attr2str() */ diff --git a/samples/nv-ddcci-client.c b/samples/nv-ddcci-client.c new file mode 100644 index 0000000..003f7cb --- /dev/null +++ b/samples/nv-ddcci-client.c @@ -0,0 +1,796 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + + +/* nv-ddcci-client: A tool for exercising all the display-supported DDC/CI VCP codes + * + * This test program does the following: + * - Check for the available displays + * - For each available display: + * + Get the timing report + * + Get the monitor capabilities (list of vcp supported codes) + * + Write and reads each supported vcp code + * + Try to excercise the special vcp codes. These are vcp codes + * that cannot be implemented with the XNVCTRLSetAttribute...() + * interface. + * + * Usage: + * Just run the client on a display + * + * Options: + * -defaults: Tries to restore the display defaults only. Does not run the test + * + * If the monitor does not support the factory defaults reset through DDC/CI, + * it is strongly recommended to do so through the OSD. + * After the test all monitor settings are changed, and the client tries to + * restore the factory defaults. + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <X11/Xlib.h> +#include <string.h> + +#include "NVCtrl.h" +#include "NVCtrlLib.h" + +static void Do_Capable(Display *dpy, int screen, unsigned int *ddcci_devices); +static void Do_Timing_Report(Display *dpy, int screen, unsigned int ddcci_devices); +static void Do_VCP_List(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_vcp_supported, unsigned int *possible_values_offset, + unsigned int *possible_values_size, unsigned int *nvctrl_vcp_possible_values); +static void Do_String_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_string_vcp_supported); +static void Do_Special_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask); +static Bool Do_Capabilities(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int **nvctrl_vcp_supported, unsigned int **possible_values_offset, + unsigned int **possible_values_size, unsigned int **nvctrl_vcp_possible_values, + unsigned int **nvctrl_string_vcp_supported); +static void RestoreDefaults(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_vcp_supported); + +#define DISPLAY_DEVICES 0xFF +#define TRUE 1 +#define FALSE 0 + +#define RETRIES 1 + +#define VERSION "1.0" + +int main(int argc, char **argv) { + Display *dpy; + int screen; + int bit; + unsigned int display_mask; + unsigned int ddcci_devices; + unsigned int *nvctrl_vcp_supported; + unsigned int *possible_values_offset; + unsigned int *possible_values_size; + unsigned int *nvctrl_vcp_possible_values; + unsigned int *nvctrl_string_vcp_supported; + int defaults=0; + Bool ret; + + printf("nv-ddcci-client v%s\n\n", VERSION); + + + if(argc==2 && !strcmp(argv[1], "-defaults") ) { + defaults=1; + } + else if(argc!=1) { + printf("Usage: nv-ddcci-client [-defaults]\n"); + printf("Option -defaults: Tries to restore the display defaults only\n"); + return 1; + } + + dpy = XOpenDisplay(NULL); + if(dpy==NULL) { + printf("Cannot open display\n"); + return 1; + } + screen=DefaultScreen(dpy); + + Do_Capable(dpy, screen, &ddcci_devices); + if(ddcci_devices==0) { + printf("No capable devices found.\n"); + printf("Please make sure you allowed DDC/CI with the X config option\n"); + printf("\"AllowDDCCI\" set to \"1\" in the device section of your X config file, i.e.:\n"); + printf("Option \"AllowDDCCI\" \"1\"\n"); + return 1; + } + + if(defaults==0) + Do_Timing_Report(dpy, screen, ddcci_devices); + + for (bit = 0; bit < 24; bit++) { + display_mask = (1 << bit); + ret=Do_Capabilities(dpy, screen, ddcci_devices, display_mask, + &nvctrl_vcp_supported, &possible_values_offset, + &possible_values_size, &nvctrl_vcp_possible_values, + &nvctrl_string_vcp_supported); + if(ret==FALSE) + continue; + + if(defaults==0) { + Do_VCP_List(dpy, screen, ddcci_devices, display_mask, + nvctrl_vcp_supported, possible_values_offset, + possible_values_size, nvctrl_vcp_possible_values); + Do_String_VCP(dpy, screen, ddcci_devices, display_mask, + nvctrl_string_vcp_supported); + Do_Special_VCP(dpy, screen, ddcci_devices, display_mask); + } + RestoreDefaults(dpy, screen, ddcci_devices, display_mask, nvctrl_vcp_supported); + } + return 0 ; +} + +/* + * - RestoreDefaults + * Restore display defaults + * If the display does not support this command, the display has to be reset manually + */ +static void RestoreDefaults(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_vcp_supported) { + int display_devices=DISPLAY_DEVICES; + + if ((display_mask & display_devices) == 0x0) return; + if ((display_mask & ddcci_devices) == 0x0) return; + + printf("Restoring defaults\n"); + printf("------------------\n"); + + printf(" Display Mask 0x%x\n", display_mask); + if(nvctrl_vcp_supported[NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS]) { + printf(" Sending request\n"); + XNVCTRLSetAttribute (dpy, screen, display_mask, NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS, 1); + } + else + printf(" Code not supported on display. PLEASE RESET YOUR DISPLAY MANUALLY !\n"); + printf("================================================================================\n\n"); + +} + +/* + * - Do_Capable + * Returns in ddcci_devices a mask of DDC/CI capable displays + */ +static void Do_Capable(Display *dpy, int screen, unsigned int *ddcci_devices) { + int status; + unsigned int display_mask; + int bit; + unsigned int display_devices=DISPLAY_DEVICES; + int val; + + *ddcci_devices=0; + printf("DDC/CI Capable\n"); + printf("--------------\n"); + + for (bit = 0; bit < 24; bit++) { + display_mask = (1 << bit); + + if ((display_mask & display_devices) == 0x0) continue; + + printf(" Display Mask 0x%x\n", display_mask); + + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, NV_CTRL_DDCCI_CAPABLE, &val); + if (!status) { + printf(" Error when querying attribute\n"); + } + else if(val==1) { + printf(" Display is DDC/CI capable\n"); + *ddcci_devices |= display_mask; + } + else + printf(" Display is not DDC/CI capable\n"); + } + printf("================================================================================\n\n"); +} + + +/* + * - Do_Timing_Report + * Prints the timing report + */ +static void Do_Timing_Report(Display *dpy, int screen, unsigned int ddcci_devices) { + int status; + unsigned int display_mask; + int bit; + int display_devices=DISPLAY_DEVICES; + unsigned int sync_freq_out_range, unstable_count, positive_h_sync, positive_v_sync, + h_freq, v_freq; + + printf("Timing Report\n"); + printf("-------------\n"); + + for (bit = 0; bit < 24; bit++) { + display_mask = (1 << bit); + + if ((display_mask & display_devices) == 0x0) continue; + if ((display_mask & ddcci_devices) == 0x0) continue; + + printf(" Display Mask 0x%x\n", display_mask); + + status = XNVCTRLQueryDDCCITimingReport (dpy, screen, display_mask, + &sync_freq_out_range, &unstable_count, &positive_h_sync, &positive_v_sync, + &h_freq, &v_freq); + if (!status) { + printf(" Error when querying Timing Report\n"); + continue; + } + + if(sync_freq_out_range) printf(" - Sync out of range\n"); + if(unstable_count) printf(" - Unstable count\n"); + if(positive_h_sync) printf(" - Positive H sync\n"); else printf(" - Negative H sync\n"); + if(positive_v_sync) printf(" - Positive V sync\n"); else printf(" - Negative V sync\n"); + printf(" - H Freq = %d\n", h_freq); + printf(" - V Freq = %d\n", v_freq); + } + printf("================================================================================\n\n"); +} + +/* - Do_Capabilities + * Gets the supported NV-CONTROL DDC/CI attributes + */ +static Bool Do_Capabilities(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int **nvctrl_vcp_supported, unsigned int **possible_values_offset, + unsigned int **possible_values_size, unsigned int **nvctrl_vcp_possible_values, + unsigned int **nvctrl_string_vcp_supported) { + int status; + int display_devices=DISPLAY_DEVICES; + int i; + + if ((display_mask & display_devices) == 0x0) return FALSE; + if ((display_mask & ddcci_devices) == 0x0) return FALSE; + + printf("Capabilities Query\n"); + printf("------------------\n"); + + printf(" Display Mask 0x%x\n", display_mask); + + status = NVCTRLQueryDDCCICapabilities (dpy, screen, display_mask, + nvctrl_vcp_supported, possible_values_offset, + possible_values_size, nvctrl_vcp_possible_values, + nvctrl_string_vcp_supported); + + if (!status) { + printf(" Error when querying Capabilities\n"); + return FALSE; + } + + printf(" Supported NV_CTRL:"); + for(i=0;i<NV_CTRL_DDCCI_LAST_VCP+1;i++) { + if((*nvctrl_vcp_supported)[i]) { + printf(" %d", i); + if((*possible_values_offset)[i]!=-1) { + unsigned int of=(*possible_values_offset)[i]; + unsigned int sz=(*possible_values_size)[i]; + int p; + printf(" ("); + for(p=0;p<sz;p++) + printf(" %d", (*nvctrl_vcp_possible_values)[of+p]); + printf(")"); + } + } + } + printf("\n"); + printf(" Supported String NV_CTRL:"); + for(i=0;i<NV_CTRL_STRING_LAST_ATTRIBUTE+1;i++) { + if((*nvctrl_string_vcp_supported)[i]) { + printf(" %d", i); + + } + } + printf("\n"); + printf("================================================================================\n\n"); + return TRUE; +} + +/* - Do_VCP_List + * Excercies the simple NV-CONTROL DDC/CI attributes. Setting and Querying + */ +static void Do_VCP_List(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_vcp_supported, unsigned int *possible_values_offset, + unsigned int *possible_values_size, unsigned int *nvctrl_vcp_possible_values) { + int status; + int attr, val; + NVCTRLAttributeValidValuesRec valid; + int boolean, integer, range, bitmask, writable, readable; + int display_devices=DISPLAY_DEVICES; + int retry; + + if ((display_mask & display_devices) == 0x0) return; + if ((display_mask & ddcci_devices) == 0x0) return; + + printf("NVCTRL_ Attributes\n"); + printf("------------------\n"); + + printf(" Display Mask 0x%x\n", display_mask); + + for(attr=NV_CTRL_DDCCI_FIRST_VCP; + attr<=NV_CTRL_DDCCI_LAST_VCP;attr++) { + if(!nvctrl_vcp_supported[attr]) continue; + printf(" Testing attribute %d\n", attr); + + retry=RETRIES; + do { + status = XNVCTRLQueryValidAttributeValues (dpy, screen, display_mask, attr, &valid); + if (!status) { + printf(" Error when querying valid values for attribute"); + if(retry) + printf(" ... retrying\n"); + else + printf("\n"); + } + else + retry=0; + } while(retry--); + + boolean=integer=range=writable=readable=0; + + if(status) switch(valid.type) { + case ATTRIBUTE_TYPE_INTEGER: + printf(" Type is integer\n"); + break; + case ATTRIBUTE_TYPE_BITMASK: + printf(" Type is bitmask\n"); + bitmask=1; + break; + case ATTRIBUTE_TYPE_BOOL: + printf(" Type is boolean\n"); + boolean=1; + break; + case ATTRIBUTE_TYPE_RANGE: + printf(" Type is range: %d-%d\n", valid.u.range.min, valid.u.range.max); + range=1; + break; + case ATTRIBUTE_TYPE_INT_BITS: + printf(" Type is integer bits\n"); + break; + default: + printf(" Error: Unknown type\n"); + break; + } + + if(status && (valid.permissions & ATTRIBUTE_TYPE_WRITE)) { + printf(" Writable\n"); + writable=1; + } + if(status && (valid.permissions & ATTRIBUTE_TYPE_READ)) { + printf(" Readable\n"); + readable=1; + } + + if(range) { + int set_val; + int error=0; + retry=RETRIES;; + if(readable && writable) { + for(set_val=valid.u.range.min; set_val<=valid.u.range.max; set_val++) { + printf(" Setting attribute to %d - ", set_val);fflush(stdout); + status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val); + if(!status) + printf("failed - "); + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val); + if (!status) { + printf("Error when querying attribute \n"); + error=1; + } + else { + if(val==set_val) { + printf("Reading back correct value %d\r", val);fflush(stdout); + retry=RETRIES; + } + else { + error=1; + if(retry--) { + printf("Reading back value: %d - retrying \n", val); + set_val--; + } + else { + printf("Error when reading back value: %d \n", val); + retry=1; + } + } + } + } + } + else if(readable) { + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val); + if (!status) { + printf(" Error when querying attribute \n"); + error=1; + } + else { + printf(" Reading back current value is %d\r", val);fflush(stdout); + } + } + // There is no WO range + if(error) + printf(" Errors occured \n"); + else + printf(" Attribute setting and reading back complete \n"); + + } + + else if(boolean) { + int set_val=NV_CTRL_DDCCI_OFF; + retry=RETRIES+1; + while(1) { + if(writable) { + printf(" Setting attribute to %d - ", set_val);fflush(stdout); + status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val); + if(!status) + printf("failed."); + } + if(readable) { + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val); + if (!status) + printf(" Error when querying attribute"); + else if(writable) { + if(val==set_val) { + printf(" Reading back correct value %d", val); + retry=0; + } + else { + printf(" Error when reading back value: %d", val); + retry--; + } + } + else + printf(" Current value is %d", val); + } + else { + printf("OK"); + retry=0; + } + printf("\n"); + + if(!writable) + break; + + if(retry==0) { + if(set_val==NV_CTRL_DDCCI_ON) + break; + set_val=NV_CTRL_DDCCI_ON; + retry=RETRIES; + } + } + + } + + else if(integer||bitmask) { + int set_val; + int offset=possible_values_offset[attr]; + int size=possible_values_size[attr]; + int index; + retry=RETRIES; + + + for(index=offset;offset!=-1 && index<offset+size;index++) { + set_val=nvctrl_vcp_possible_values[index]; + if(writable) { + printf(" Setting attribute to %d - ", set_val);fflush(stdout); + status=XNVCTRLSetAttributeAndGetStatus (dpy, screen, display_mask, attr, set_val); + if(!status) + printf("failed - "); + } + if(readable) { + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val); + if (!status) + printf(" Error when querying attribute"); + else if(writable) { + if(val==set_val) { + printf(" Reading back correct value %d", val); + retry=RETRIES; + } + else { + printf(" Error when reading back value: %d", val); + if(retry--) + index--; + else + retry=RETRIES; + } + } + else + printf(" Current value is %d", val); + } + printf("\n"); + } + if(offset==-1 && readable) { + status = XNVCTRLQueryAttribute (dpy, screen, display_mask, attr, &val); + if (!status) + printf(" Error when querying attribute"); + printf(" Current value is %d\n", val); + } + } + } + printf("================================================================================\n\n"); +} + + +/* - Do_String_VCP + * Excercises the String NV-CONTROL DDC/CI atytributes + */ +static void Do_String_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask, + unsigned int *nvctrl_string_vcp_supported) { + int display_devices=DISPLAY_DEVICES; + int status; + int attr; + int retry; + + if ((display_mask & display_devices) == 0x0) return; + if ((display_mask & ddcci_devices) == 0x0) return; + + printf("NVCTRL_ String Attributes\n"); + printf("-------------------------\n"); + + printf(" Display Mask 0x%x\n", display_mask); + if(nvctrl_string_vcp_supported[NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR]) + { + char *ptr=NULL; + char *str="New String for NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR"; + printf(" Testing attribute NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR\n"); + + attr=NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR; + retry=RETRIES; + do { + printf(" Setting attribute... "); fflush(stdout); + XNVCTRLSetStringAttribute(dpy, screen, display_mask, attr, str); + if(status) + printf("success\n"); + else { + printf("failed.\n"); + } + + printf(" Querying attribute... "); fflush(stdout); + status=XNVCTRLQueryStringAttribute(dpy, screen, display_mask, attr, &ptr); + if (!status) { + printf("Error when querying attribute"); + if(retry) { + retry--; + printf(". Retrying ..."); + } + printf("\n");; + } + else if(strcmp(ptr, str)) { + printf("Error when reading back string: %s", ptr); + if(retry) { + retry--; + printf(". Retrying ..."); + } + printf("\n"); + } + else { + printf("Reading back correct string: %s\n", ptr); + retry=0; + } + free(ptr); + } while (retry--); + } + + if(nvctrl_string_vcp_supported[NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA]) + { + char *str="New String for NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA"; + printf(" Testing attribute NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA\n"); + + attr=NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA; + printf(" Setting attribute... "); fflush(stdout); + status=XNVCTRLSetStringAttribute(dpy, screen, display_mask, attr, str); + if(status) + printf("success\n"); + else + printf("failed\n"); + } + printf("================================================================================\n\n"); +} + +/* - Do_Special_VCP + * Excercises the scpecial VCP codes, that are neither simple or string NV-CONTROL attributes + * These correspond to VCP code that handle multiple values at once + */ +static void Do_Special_VCP(Display *dpy, int screen, unsigned int ddcci_devices, unsigned int display_mask) { + int display_devices=DISPLAY_DEVICES; + int status; + int retry, error; + + if ((display_mask & display_devices) == 0x0) return; + if ((display_mask & ddcci_devices) == 0x0) return; + + printf("NVCTRL_ String Attributes\n"); + printf("-------------------------\n"); + + printf(" Display Mask 0x%x\n", display_mask); + + printf(" Testing function XNVCTRLQueryDDCCILutSize\n"); + { + unsigned int red_entries; + unsigned int green_entries; + unsigned int blue_entries; + unsigned int red_bits_per_entries; + unsigned int green_bits_per_entries; + unsigned int blue_bits_per_entries; + + printf(" Querying attribute... "); fflush(stdout); + status=XNVCTRLQueryDDCCILutSize (dpy, screen, display_mask, + &red_entries, &green_entries, &blue_entries, + &red_bits_per_entries, &green_bits_per_entries, &blue_bits_per_entries); + if (!status) { + printf("Error when querying attribute.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + } + else { + printf("red_entries=%d; green_entries=%d; blue_entries=%d\n", red_entries, green_entries, blue_entries); + printf("red_bits_per_entries=%d; green_bits_per_entries=%d; blue_bits_per_entries=%d\n", + red_bits_per_entries, green_bits_per_entries, blue_bits_per_entries); + } + } + + printf(" Testing function XNVCTRLSetDDCCISinglePointLutOperation\n"); + printf(" XNVCTRLQueryDDCCISinglePointLutOperation\n"); + { + unsigned int offset; + unsigned int red_value, ret_red_value; + unsigned int green_value, ret_green_value; + unsigned int blue_value, ret_blue_value; + + offset=0; + red_value=1; + green_value=2; + blue_value=3; + + retry=RETRIES; + do { + error=0; + printf(" Setting attribute... "); fflush(stdout); + status=XNVCTRLSetDDCCISinglePointLutOperation(dpy, screen, display_mask, offset, red_value, green_value, blue_value); + if(status) + printf("success\n"); + else { + printf("failed.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + } + printf(" Querying attribute... "); fflush(stdout); + + status=XNVCTRLQueryDDCCISinglePointLutOperation(dpy, screen, display_mask, offset, + &ret_red_value, &ret_green_value, &ret_blue_value); + if (!status) { + printf("Error when querying attribute.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + error=1; + } + else { + if(red_value!=ret_red_value) { + printf(" Error when reading back red_value: %d\n", ret_red_value); + error=1; + } + if(red_value!=ret_red_value) { + printf(" Error when reading back green_value: %d\n", ret_green_value); + error=1; + } + if(red_value!=ret_red_value) { + printf(" Error when reading back blue_value: %d\n", ret_blue_value); + error=1; + } + } + if(error) { + if(retry) { + printf(" Retrying...\n"); + } + } + } while(retry--); + } + + printf(" Testing function XNVCTRLSetDDCCIBlockLutOperation\n"); + printf(" XNVCTRLQueryDDCCIBlockLutOperation\n"); + { + unsigned int color; // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT + unsigned int offset; + unsigned int size=2; + unsigned int value[2], *ret_value; + int i; + + color=NV_CTRL_DDCCI_RED_LUT; + offset=0; + value[0]=1; + value[1]=2; + + retry=RETRIES; + do { + printf(" Setting attribute... "); fflush(stdout); + status=XNVCTRLSetDDCCIBlockLutOperation(dpy, screen, display_mask, color, offset, size, value); + if(status) + printf("success\n"); + else { + printf("failed.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + } + + printf(" Querying attribute... "); fflush(stdout); + status=XNVCTRLQueryDDCCIBlockLutOperation(dpy, screen, display_mask, color, offset, size, &ret_value); + if (!status) { + printf("Error when querying attribute.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + error=1; + } + else { + for(i=0;i<size;i++) + if(value[i]!=ret_value[i]) { + printf("Error when reading back value[%d]: %d", i, ret_value[i]); + error=1; + } + free(ret_value); + } + if(error) { + if(retry) { + printf(" Retrying...\n"); + } + } + } while(retry--); + } + + printf(" Testing function XNVCTRLSetDDCCIRemoteProcedureCall\n"); + { + unsigned int offset; + unsigned int size=2; + unsigned int red_lut[2]; + unsigned int green_lut[2]; + unsigned int blue_lut[2]; + unsigned int increment[2]; + + offset=0; + red_lut[0]=1;red_lut[1]=2; + green_lut[0]=3;green_lut[1]=4; + blue_lut[0]=5;blue_lut[1]=6; + increment[0]=7;increment[1]=8; + + printf(" Setting attribute... "); fflush(stdout); + status=XNVCTRLSetDDCCIRemoteProcedureCall(dpy, screen, display_mask, offset, size, + red_lut, green_lut, blue_lut, increment); + if(status) + printf("success\n"); + else + printf("failed\n"); + } + + printf(" Testing function XNVCTRLQueryDDCCIDisplayControllerType\n"); + { + unsigned char *controller_manufacturer; + unsigned int controller_type; + int status; + + printf(" Querying attribute... "); fflush(stdout); + status=XNVCTRLQueryDDCCIDisplayControllerType(dpy, screen, display_mask, &controller_manufacturer, &controller_type); + if (!status) { + printf("Error when querying attribute.\n"); + printf(" (normal if this attribute is not supported by the display)\n"); + } + else { + printf("Controller manufacturer =%s\n", controller_manufacturer); + printf("Controller type =%d\n", controller_type); + free(controller_manufacturer); + } + } + printf("================================================================================\n\n"); +} diff --git a/src/gtk+-2.x/Makefile.inc b/src/gtk+-2.x/Makefile.inc index 0501eb3..947c560 100644 --- a/src/gtk+-2.x/Makefile.inc +++ b/src/gtk+-2.x/Makefile.inc @@ -50,7 +50,9 @@ SRC += \ ctkthermal.c \ ctkgvo.c \ ctkdropdownmenu.c \ - ctkrandr.c + ctkrandr.c \ + ctkclocks.c \ + ctkutils.c EXTRA_DIST += \ @@ -79,5 +81,6 @@ EXTRA_DIST += \ ctkthermal.h \ ctkgvo.h \ ctkdropdownmenu.h \ - ctkrandr.h - + ctkrandr.h \ + ctkclocks.h \ + ctkutils.h diff --git a/src/gtk+-2.x/ctkclocks.c b/src/gtk+-2.x/ctkclocks.c new file mode 100644 index 0000000..23d7533 --- /dev/null +++ b/src/gtk+-2.x/ctkclocks.c @@ -0,0 +1,1588 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +/**** INCLUDES ***************************************************************/ + +#include <gtk/gtk.h> +#include <gdk/gdkx.h> + +#include "clocks_banner.h" + +#include "ctkclocks.h" + +#include "ctkscale.h" +#include "ctkhelp.h" +#include "ctkevent.h" +#include "ctkconstants.h" + + + +/**** DEFINES ****************************************************************/ + +/* GUI padding space around frames */ + +#define FRAME_PADDING 5 + + + +/**** MACROS *****************************************************************/ + +/* Setting/Getting GPU and Memory frequencies from packed int */ + +#define GET_GPU_CLOCK(C) ( (C) >> 16 ) +#define GET_MEM_CLOCK(C) ( (C) & 0xFFFF ) +#define MAKE_CLOCKS(G, M) ( ((G) << 16) | ((M) & 0xFFFF) ) + + + +/**** PROTOTYPES *************************************************************/ + +static void overclocking_state_update_gui(CtkClocks *ctk_object); +static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data); +static void overclocking_state_received(GtkObject *object, gpointer arg1, + gpointer user_data); + +static void auto_detection_state_received(GtkObject *object, gpointer arg1, + gpointer user_data); + +static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks); + +static void set_clocks_value(CtkClocks *ctk_object, int clocks, + int which_clocks); +static void adjustment_value_changed(GtkAdjustment *adjustment, + gpointer user_data); + +static void clock_menu_changed(GtkOptionMenu *option_menu, gpointer user_data); + +static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data); +static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data); +static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data); + +static void clocks_received(GtkObject *object, gpointer arg1, + gpointer user_data); + +static void license_scrolled(GtkRange *range, + gpointer user_data); + + + +/**** GLOBALS ****************************************************************/ + +/* Tooltips */ + +static const char * __enable_button_help = +"The Enable Overclocking checkbox enables access to GPU and graphics card " +"memory interface overclocking functionality. Note that overclocking your " +"GPU and/or graphics card memory interface is not recommended and is done " +"at your own risk. You should never have to enable this."; + +static const char * __clock_menu_help = +"Selects which clock frequencies to modify. Standard (2D) only affects 2D " +"applications. Performance (3D) only affects 3D applications."; + +static const char * __gpu_clock_help = +"The GPU Clock Frequency is the core clock speed that the NVIDIA GPU will be " +"set to when the graphics card is operating in this mode (2D/3D)."; + +static const char * __mem_clock_help = +"The Memory Clock Frequency is the clock speed of the memory interface on " +"the graphics card. On some systems, the clock frequency is required to " +"be the same for both 2D and 3D modes. For these systems, setting the 2D " +"memory clock frequency will also set the 3D memory clock frequency."; + +static const char * __apply_button_help = +"The Apply button allows you to set the desired clock frequencies for the " +"GPU and graphics card memory interface. Slider positions are only applied " +"after clicking this button."; + +static const char * __detect_button_help = +"The Auto Detect button determines the maximum clock setting that is safe " +"on your system at this instant. The maximum clock setting determined here " +"can vary on consecutive runs and depends on how well the system handles the " +"auto-detection stress tests. This is only available for 3D clock " +"frequencies. You must click the Apply button to set the results found."; + +static const char * __cancel_button_help = +"The Cancel Detection button allows you to cancel testing for the optimal 3D " +"clock frequencies."; + +static const char * __reset_button_help = +"The Reset Hardware Defaults button lets you restore the original GPU and " +"memory interface clock frequencies."; + + +/* Messages */ + +static const char * __enable_confirm_msg = +"To use the features on the Clock Frequencies panel you\n" +"must agree to the terms of the preceding license agreement.\n" +"Do you agree accept this agreement?"; + +static const char * __detect_confirm_msg = +"To find the best 3D clock frequencies your system supports,\n" +"a series of tests will take place. This testing may take several " +"minutes.\n"; + + +static const char * __detect_wait_msg = +"Optimal 3D clock frequencies are being probed, please wait..."; + +static const char * __canceled_msg = +"Probing for optimal 3D clock frequencies has been canceled."; + + +static const char * __license_pre_msg = +"Please read the following license agreement."; + +static const char * __license_msg = +"<b>TERMS AND CONDITIONS</b>\n" +"\n" +"WARNING: THE SOFTWARE UTILITY YOU ARE ABOUT TO \n" +"ENABLE (\"UTILITY\") MAY CAUSE SYSTEM DAMAGE AND \n" +"VOID WARRANTIES. THIS UTILITY RUNS YOUR COMPUTER \n" +"SYSTEM OUT OF THE MANUFACTURER'S DESIGN \n" +"SPECIFICATIONS, INCLUDING, BUT NOT LIMITED TO: \n" +"HIGHER SYSTEM VOLTAGES, ABOVE NORMAL \n" +"TEMPERATURES, EXCESSIVE FREQUENCIES, AND \n" +"CHANGES TO BIOS THAT MAY CORRUPT THE BIOS. YOUR \n" +"COMPUTER'S OPERATING SYSTEM MAY HANG AND RESULT \n" +"IN DATA LOSS OR CORRUPTED IMAGES. DEPENDING ON \n" +"THE MANUFACTURER OF YOUR COMPUTER SYSTEM, THE \n" +"COMPUTER SYSTEM, HARDWARE AND SOFTWARE \n" +"WARRANTIES MAY BE VOIDED, AND YOU MAY NOT \n" +"RECEIVE ANY FURTHER MANUFACTURER SUPPORT. \n" +"NVIDIA DOES NOT PROVIDE CUSTOMER SERVICE SUPPORT \n" +"FOR THIS UTILITY. IT IS FOR THESE REASONS THAT \n" +"ABSOLUTELY NO WARRANTY OR GUARANTEE IS EITHER \n" +"EXPRESS OR IMPLIED. BEFORE ENABLING AND USING, YOU \n" +"SHOULD DETERMINE THE SUITABILITY OF THE UTILITY \n" +"FOR YOUR INTENDED USE, AND YOU SHALL ASSUME ALL \n" +"RESPONSIBILITY IN CONNECTION THEREWITH.\n" +"\n" +"\n" +"<b>DISCLAIMER OF WARRANTIES</b>\n" +"\n" +"ALL MATERIALS, INFORMATION, AND SOFTWARE \n" +"PRODUCTS, INCLUDED IN OR MADE AVAILABLE THROUGH \n" +"THIS UTILITY ARE PROVIDED \"AS IS\" AND \"AS AVAILABLE\" \n" +"FOR YOUR USE. THE UTILITY IS PROVIDED WITHOUT \n" +"WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, \n" +"INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF \n" +"MERCHANTABILITY, FITNESS FOR A PARTICULAR \n" +"PURPOSE, OR NONINFRINGEMENT. NVIDIA AND ITS \n" +"SUBSIDIARIES DO NOT WARRANT THAT THE UTILITY IS \n" +"RELIABLE OR CORRECT; THAT ANY DEFECTS OR ERRORS \n" +"WILL BE CORRECTED; OR THAT THE UTILITY IS FREE OF \n" +"VIRUSES OR OTHER HARMFUL COMPONENTS. YOUR USE \n" +"OF THE UTILITY IS SOLELY AT YOUR RISK. BECAUSE SOME \n" +"JURISDICTIONS DO NOT PERMIT THE EXCLUSION OF \n" +"CERTAIN WARRANTIES, THESE EXCLUSIONS MAY NOT \n" +"APPLY TO YOU.\n" +"\n" +"\n" +"<b>LIMITATION OF LIABILITY</b>\n" +"\n" +"UNDER NO CIRCUMSTANCES SHALL NVIDIA AND ITS \n" +"SUBSIDIARIES BE LIABLE FOR ANY DIRECT, INDIRECT, \n" +"PUNITIVE, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL \n" +"DAMAGES THAT RESULT FROM THE USE OF, OR INABILITY \n" +"TO USE, THE UTILITY. THIS LIMITATION APPLIES WHETHER \n" +"THE ALLEGED LIABILITY IS BASED ON CONTRACT, TORT, \n" +"NEGLIGENCE, STRICT LIABILITY, OR ANY OTHER BASIS, \n" +"EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF \n" +"SUCH DAMAGE. BECAUSE SOME JURISDICTIONS DO NOT \n" +"ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR \n" +"CONSEQUENTIAL DAMAGES, NVIDIA'S LIABILITY IN SUCH \n" +"JURISDICTIONS SHALL BE LIMITED TO THE EXTENT \n" +"PERMITTED BY LAW. \n" +"\n" +"IF YOU HAVE READ, UNDERSTOOD, AND AGREE TO ALL OF \n" +"THE ABOVE TERMS AND CONDITIONS, CLICK THE \"YES\" \n" +"BUTTON BELOW. \n" +"\n" +"IF YOU DO NOT AGREE WITH ALL OF THE ABOVE TERMS \n" +"AND CONDITIONS, THEN CLICK ON THE \"NO\" BUTTON \n" +"BELOW, AND DO NOT ENABLE OR USE THE UTILITY. \n\n"; + + + + +/**** FUNCTIONS **************************************************************/ + +/***** + * + * Returns the gpu overclocking ctk object type. + * + */ +GType ctk_clocks_get_type(void) +{ + static GType ctk_object_type = 0; + + if (!ctk_object_type) { + static const GTypeInfo ctk_object_info = { + sizeof (CtkClocksClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof(CtkClocks), + 0, /* n_preallocs */ + NULL, /* instance_init */ + }; + + ctk_object_type = g_type_register_static + (GTK_TYPE_VBOX, "CtkClocks", &ctk_object_info, 0); + } + + return ctk_object_type; + +} /* ctk_clocks_get_type() */ + + +/***** + * + * Main CTK widget creation. + * + */ +GtkWidget* ctk_clocks_new(NvCtrlAttributeHandle *handle, + CtkConfig *ctk_config, + CtkEvent *ctk_event) +{ + GObject *object; + CtkClocks *ctk_object; + GtkObject *adjustment; + GtkWidget *alignment; + GtkWidget *scale; + GtkWidget *menu; + GtkWidget *menu_item; + GtkWidget *scrollWin; + GtkWidget *event; + GdkColor color; + + GtkWidget *label; + + GtkWidget *frame; + GtkWidget *hbox; + GtkWidget *vbox; + + + ReturnStatus ret; /* NvCtrlxxx function return value */ + int value; + int clocks_2D; + NVCTRLAttributeValidValuesRec ranges_2D; + int clocks_3D; + NVCTRLAttributeValidValuesRec ranges_3D; + + Bool overclocking_enabled; + Bool probing_optimal; + Bool can_access_2d_clocks; + Bool can_access_3d_clocks; + + + /* Make sure we have a handle */ + + g_return_val_if_fail(handle != NULL, NULL); + + /* If we can't query the overclocking state, don't load the page */ + + ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_OVERCLOCKING_STATE, + &value); + if ( ret != NvCtrlSuccess ) + return NULL; + overclocking_enabled = + (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False; + + /* Check if overclocking is busy */ + + if ( overclocking_enabled ) { + ret = NvCtrlGetAttribute(handle, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, + &value); + if ( ret != NvCtrlSuccess ) + return NULL; + probing_optimal = (value==NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); + } else { + probing_optimal = FALSE; + } + + /* Can we access the 2D clocks? */ + + can_access_2d_clocks = True; + ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_2D_CLOCK_FREQS, &clocks_2D); + if ( ret != NvCtrlSuccess ) + can_access_2d_clocks = False; + ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_2D_CLOCK_FREQS, + &ranges_2D); + if ( ret != NvCtrlSuccess ) + can_access_2d_clocks = False; + + /* Can we access the 3D clocks? */ + + can_access_3d_clocks = True; + ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_3D_CLOCK_FREQS, &clocks_3D); + if ( ret != NvCtrlSuccess ) + can_access_3d_clocks = False; + ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GPU_3D_CLOCK_FREQS, + &ranges_3D); + if ( ret != NvCtrlSuccess ) + can_access_3d_clocks = False; + + /* If we can't access either of the clocks, don't load the page */ + + if ( !can_access_2d_clocks && !can_access_3d_clocks ) + return NULL; + + /* Create the ctk object */ + + object = g_object_new(CTK_TYPE_CLOCKS, NULL); + ctk_object = CTK_CLOCKS(object); + + /* Cache the handke and configuration */ + + ctk_object->handle = handle; + ctk_object->ctk_config = ctk_config; + ctk_object->license_accepted = // = overclocking_enabled + ctk_object->overclocking_enabled = overclocking_enabled; + ctk_object->probing_optimal = probing_optimal; + + /* Create the Clock menu widget */ + + menu = gtk_menu_new(); + + if ( can_access_2d_clocks ) { + menu_item = gtk_menu_item_new_with_label("2D Clock Frequencies"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); + } + + if ( can_access_3d_clocks ) { + menu_item = gtk_menu_item_new_with_label("3D Clock Frequencies"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); + } + + ctk_object->clock_menu = gtk_option_menu_new (); + gtk_option_menu_set_menu + (GTK_OPTION_MENU(ctk_object->clock_menu), menu); + + g_signal_connect(G_OBJECT(ctk_object->clock_menu), "changed", + G_CALLBACK(clock_menu_changed), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, ctk_object->clock_menu, + __clock_menu_help); + + gtk_widget_set_sensitive(ctk_object->clock_menu, + overclocking_enabled && !probing_optimal); + + /* Create the GPU clock frequency slider widget */ + + if ( can_access_2d_clocks ) { + adjustment = + gtk_adjustment_new(GET_GPU_CLOCK(clocks_2D), + GET_GPU_CLOCK(ranges_2D.u.range.min), + GET_GPU_CLOCK(ranges_2D.u.range.max), + 1, 5, 0.0); + ctk_object->clocks_being_modified = CLOCKS_2D; + } else { + adjustment = + gtk_adjustment_new(GET_GPU_CLOCK(clocks_3D), + GET_GPU_CLOCK(ranges_3D.u.range.min), + GET_GPU_CLOCK(ranges_3D.u.range.max), + 1, 5, 0.0); + ctk_object->clocks_being_modified = CLOCKS_3D; + } + + scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "GPU (MHz)", + ctk_config, G_TYPE_INT); + ctk_object->gpu_clk_scale = scale; + + g_signal_connect(adjustment, "value_changed", + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, + CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale, + __gpu_clock_help); + + gtk_widget_set_sensitive(ctk_object->gpu_clk_scale, + overclocking_enabled && !probing_optimal); + + /* Create the Memory clock frequency slider widget */ + + if ( can_access_2d_clocks ) { + adjustment = + gtk_adjustment_new(GET_MEM_CLOCK(clocks_2D), + GET_MEM_CLOCK(ranges_2D.u.range.min), + GET_MEM_CLOCK(ranges_2D.u.range.max), + 1, 5, 0.0); + } else { + adjustment = + gtk_adjustment_new(GET_MEM_CLOCK(clocks_3D), + GET_MEM_CLOCK(ranges_3D.u.range.min), + GET_MEM_CLOCK(ranges_3D.u.range.max), + 1, 5, 0.0); + } + + scale = ctk_scale_new(GTK_ADJUSTMENT(adjustment), "Memory (MHz)", + ctk_config, G_TYPE_INT); + ctk_object->mem_clk_scale = scale; + + g_signal_connect(adjustment, "value_changed", + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, + CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale, + __mem_clock_help); + + gtk_widget_set_sensitive(ctk_object->mem_clk_scale, + overclocking_enabled && !probing_optimal); + + /* Create the Enable Overclocking checkbox widget */ + + ctk_object->enable_checkbox = + gtk_check_button_new_with_label("Enable Overclocking"); + + gtk_toggle_button_set_active + (GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox), + overclocking_enabled); + + gtk_widget_set_sensitive(ctk_object->enable_checkbox, + overclocking_enabled && !probing_optimal); + + g_signal_connect(G_OBJECT(ctk_object->enable_checkbox), "toggled", + G_CALLBACK(overclocking_state_toggled), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, ctk_object->enable_checkbox, + __enable_button_help); + + gtk_widget_set_sensitive(ctk_object->enable_checkbox, !probing_optimal); + + /* Create the Apply button widget */ + + ctk_object->apply_button = + gtk_button_new_with_label("Apply"); + + g_signal_connect(G_OBJECT(ctk_object->apply_button), "clicked", + G_CALLBACK(apply_clocks_clicked), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, ctk_object->apply_button, + __apply_button_help); + + gtk_widget_set_sensitive(ctk_object->apply_button, False); + + /* Create the Auto Detect button widget */ + + ctk_object->detect_button = + gtk_button_new_with_label("Auto Detect"); + + g_signal_connect(G_OBJECT(ctk_object->detect_button), "clicked", + G_CALLBACK(detect_clocks_clicked), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, ctk_object->detect_button, + __detect_button_help); + + if ( ctk_object->clocks_being_modified == CLOCKS_2D ) { + gtk_widget_set_sensitive(ctk_object->detect_button, False); + } else { + gtk_widget_set_sensitive(ctk_object->detect_button, + overclocking_enabled && !probing_optimal); + } + + /* Create the Reset hardware button widget */ + + ctk_object->reset_button = + gtk_button_new_with_label("Reset Hardware Defaults"); + + g_signal_connect(G_OBJECT(ctk_object->reset_button), "clicked", + G_CALLBACK(reset_clocks_clicked), + (gpointer) ctk_object); + + ctk_config_set_tooltip(ctk_config, ctk_object->reset_button, + __reset_button_help); + + gtk_widget_set_sensitive(ctk_object->reset_button, False); + + /* Create the enable dialog */ + + ctk_object->enable_dialog = + gtk_dialog_new_with_buttons("License Agreement", + GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_YES, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_NO, + GTK_RESPONSE_REJECT, + NULL + ); + + hbox = gtk_hbox_new(TRUE, 10); + label = gtk_label_new(__license_pre_msg); + + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 10); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox), + hbox, FALSE, FALSE, 10); + + scrollWin = gtk_scrolled_window_new(NULL, NULL); + hbox = gtk_hbox_new(FALSE, 0); + label = gtk_label_new(""); + event = gtk_event_box_new(); + ctk_object->license_window = scrollWin; + + gdk_color_parse("white", &color); + gtk_widget_modify_bg(event, GTK_STATE_NORMAL, &color); + + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_markup(GTK_LABEL(label), __license_msg); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWin), + GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); + + + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); + gtk_container_add(GTK_CONTAINER(event), hbox); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWin), + event); + hbox = gtk_hbox_new(TRUE, 10); + gtk_box_pack_start(GTK_BOX(hbox), scrollWin, TRUE, TRUE, 10); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox), + hbox, TRUE, TRUE, 10); + + + hbox = gtk_hbox_new(FALSE, 10); + label = gtk_label_new(__enable_confirm_msg); + + gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 15); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->enable_dialog)->vbox), + hbox, FALSE, FALSE, 10); + + g_signal_connect((gpointer) + GTK_RANGE(GTK_SCROLLED_WINDOW(scrollWin)->vscrollbar), + "value_changed", + G_CALLBACK(license_scrolled), + (gpointer) ctk_object); + + /* Create the auto detect dialog */ + + ctk_object->detect_dialog = + gtk_dialog_new_with_buttons("Auto Detect Optimal 3D Clock Frequencies?", + GTK_WINDOW(gtk_widget_get_parent(GTK_WIDGET(ctk_object))), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + NULL + ); + + label = gtk_label_new(__detect_confirm_msg); + hbox = gtk_hbox_new(TRUE, 15); + + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 15); + + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctk_object->detect_dialog)->vbox), + hbox, FALSE, FALSE, 15); + + /* + * Now that we've created all the widgets we care about, we're + * ready to compose the panel + */ + + /* Set container properties of the ctk object */ + + gtk_box_set_spacing(GTK_BOX(ctk_object), 10); + + + { /* Banner image */ + const nv_image_t *image_data = &clocks_banner_image; + guint8 *image_buffer = decompress_image_data(image_data); + GdkPixbuf *image_pixbuf = + gdk_pixbuf_new_from_data(image_buffer, GDK_COLORSPACE_RGB, + FALSE, 8, image_data->width, + image_data->height, + image_data->width * image_data->bytes_per_pixel, + free_decompressed_image, NULL); + GtkWidget *image = gtk_image_new_from_pixbuf(image_pixbuf); + + frame = gtk_frame_new(NULL); + + hbox = gtk_hbox_new(FALSE, 0); + + gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); + + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); + + gtk_container_add(GTK_CONTAINER(frame), image); + } + + /* Add Overclocking checkbox */ + + hbox = gtk_hbox_new(FALSE, 0); + + gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(hbox), ctk_object->enable_checkbox, + FALSE, FALSE, 0); + + /* Add Clock frequency frame */ + + frame = gtk_frame_new("Clock Frequencies"); + vbox = gtk_vbox_new(FALSE, 0); + hbox = gtk_hbox_new(FALSE, 0); + + gtk_container_set_border_width(GTK_CONTAINER(vbox), FRAME_PADDING); + + gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(frame), vbox); + + + gtk_box_pack_start(GTK_BOX(hbox), ctk_object->clock_menu, + FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, + FALSE, FALSE, 5); + + gtk_box_pack_start(GTK_BOX(vbox), ctk_object->gpu_clk_scale, + FALSE, FALSE, 5); + + gtk_box_pack_start(GTK_BOX(vbox), ctk_object->mem_clk_scale, + FALSE, FALSE, 5); + + /* Add the Apply, Auto Detect, and Reset buttons */ + + hbox = gtk_hbox_new(FALSE, 5); + + gtk_box_pack_start(GTK_BOX(hbox), ctk_object->apply_button, + FALSE, FALSE, 0); + gtk_container_add(GTK_CONTAINER(hbox), ctk_object->detect_button); + gtk_container_add(GTK_CONTAINER(hbox), ctk_object->reset_button); + + alignment = gtk_alignment_new(1, 1, 0, 0); + gtk_container_add(GTK_CONTAINER(alignment), hbox); + gtk_box_pack_start(GTK_BOX(object), alignment, TRUE, TRUE, 0); + + /* Setup the initial gui state */ + + sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); + + /* Handle events from other NV-CONTROL clients */ + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_OVERCLOCKING_STATE), + G_CALLBACK(overclocking_state_received), + (gpointer) ctk_object); + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_2D_CLOCK_FREQS), + G_CALLBACK(clocks_received), + (gpointer) ctk_object); + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_3D_CLOCK_FREQS), + G_CALLBACK(clocks_received), + (gpointer) ctk_object); + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS), + G_CALLBACK(clocks_received), + (gpointer) ctk_object); + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS), + G_CALLBACK(clocks_received), + (gpointer) ctk_object); + + g_signal_connect(G_OBJECT(ctk_event), + CTK_EVENT_NAME(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE), + G_CALLBACK(auto_detection_state_received), + (gpointer) ctk_object); + + /* Show the widget */ + + gtk_widget_show_all(GTK_WIDGET(ctk_object)); + + return GTK_WIDGET(ctk_object); + +} /* ctk_clocks_new() */ + + + +/***** + * + * GPU overclocking help screen. + * + */ +GtkTextBuffer *ctk_clocks_create_help(GtkTextTagTable *table, + CtkClocks *ctk_object) +{ + GtkTextIter i; + GtkTextBuffer *b; + + b = gtk_text_buffer_new(table); + + gtk_text_buffer_get_iter_at_offset(b, &i, 0); + + ctk_help_title(b, &i, "Clock Frequency Overclocking Help"); + ctk_help_para(b, &i, + "WARNING: Overclocking has the potential of destroying your " + "graphics card, CPU, RAM and any other component. It may " + "also reduce the life expectancy of your components and " + "void manufacturer warranties. DO THIS AT YOUR OWN RISK. " + ); + ctk_help_heading(b, &i, "Enabeling Clock Frequencies"); + ctk_help_para(b, &i, __enable_button_help); + ctk_help_para(b, &i, + "GPU Overclocking functionality is currently limited to " + "GeForce FX and newer non-mobile GPUs." + ); + ctk_help_heading(b, &i, "2D/3D Clock Frequencies"); + ctk_help_para(b, &i, + "The 2D clock frequencies are the standard clock " + "frequencies used when only 2D applications are running." + ); + ctk_help_para(b, &i, + "The 3D clock frequencies are the performance clock " + "frequencies used when running 3D applications." + ); + ctk_help_heading(b, &i, "GPU Clock Frequency"); + ctk_help_para(b, &i, __gpu_clock_help); + ctk_help_heading(b, &i, "Memory Clock Frequency"); + ctk_help_para(b, &i, __mem_clock_help); + ctk_help_heading(b, &i, "Applying Custom Clock Frequencies"); + ctk_help_para(b, &i, __apply_button_help); + ctk_help_heading(b, &i, "Auto Detect Optimal 3D Clock Frequencies"); + ctk_help_para(b, &i, __detect_button_help); + ctk_help_heading(b, &i, "Canceling Optimal 3D Clock Frequency Auto " + "Dection."); + ctk_help_para(b, &i, __cancel_button_help); + ctk_help_para(b, &i, + "This button is only available if the Optimal " + "clocks are currently being probed."); + ctk_help_heading(b, &i, "Restoring Hardware Default Frequencies"); + ctk_help_para(b, &i, __reset_button_help); + + ctk_help_finish(b); + + return b; + +} /* ctk_clocks_create_help() */ + + + +/**** + * + * Updates sensitivity of widgets in relation to the state + * of overclocking. + * + */ +static void sync_gui_sensitivity(CtkClocks *ctk_object) +{ + gboolean enabled = ctk_object->overclocking_enabled; + gboolean probing = ctk_object->probing_optimal; + gboolean modified = ctk_object->clocks_modified; + gboolean moved = ctk_object->clocks_moved; + + + /* Update the enable checkbox */ + + g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox), + G_CALLBACK(overclocking_state_toggled), + (gpointer) ctk_object); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ctk_object->enable_checkbox), + enabled); + + g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox), + G_CALLBACK(overclocking_state_toggled), + (gpointer) ctk_object); + + gtk_widget_set_sensitive(ctk_object->enable_checkbox, + !probing); + + + /* Update the clock selection dropdown */ + + gtk_widget_set_sensitive(ctk_object->clock_menu, enabled && !probing); + + /* Update the GPU clock slider */ + + gtk_widget_set_sensitive(ctk_object->gpu_clk_scale, enabled && !probing); + + /* Update the Memory clock slider */ + + gtk_widget_set_sensitive(ctk_object->mem_clk_scale, enabled && !probing); + + /* Update the Apply button */ + + gtk_widget_set_sensitive(ctk_object->apply_button, + enabled && !probing && moved); + + + /* Enable the Auto Detect button for 3D clocks only */ + + if ( probing ) { + gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Cancel Detection"); + gtk_widget_set_sensitive(ctk_object->detect_button, True); + ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button, + __cancel_button_help); + + } else { + gtk_button_set_label(GTK_BUTTON(ctk_object->detect_button), "Auto Detect"); + gtk_widget_set_sensitive(ctk_object->detect_button, + (ctk_object->clocks_being_modified == CLOCKS_3D)?enabled:False); + ctk_config_set_tooltip(ctk_object->ctk_config, ctk_object->detect_button, + __detect_button_help); + } + + /* Update the Reset hardware defaults button */ + + gtk_widget_set_sensitive(ctk_object->reset_button, + enabled && !probing && (moved || modified)); + +} /* sync_gui_sensitivity() */ + + + +/**** + * + * Updates widgets in relation to current overclocking state. + * + */ +static void overclocking_state_update_gui(CtkClocks *ctk_object) +{ + ReturnStatus ret; + int value; + gboolean enabled; + + + /* We need to check the overclocking state status with + * the server everytime someone tries to change the state + * because the set might have failed. + */ + + ret = NvCtrlGetAttribute(ctk_object->handle, + NV_CTRL_GPU_OVERCLOCKING_STATE, + &value); + if ( ret != NvCtrlSuccess ) + enabled = False; + else + enabled = (value==NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL)?True:False; + + ctk_object->overclocking_enabled = enabled; + + + /* We need to also make sure the server is not busy probing + * for the optimal clocks. + */ + + if ( enabled ) { + ret = NvCtrlGetAttribute(ctk_object->handle, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, + &value); + if ( ret == NvCtrlSuccess ) + ctk_object->probing_optimal = + (value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); + } + + /* Sync the gui to be able to modify the clocks */ + + sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); + + /* Update the status bar */ + + ctk_config_statusbar_message(ctk_object->ctk_config, + "GPU overclocking %sabled.", + enabled?"en":"dis"); + +} /* overclocking_state_update_gui() */ + + + +/***** + * + * Signal handler - Called when the user toggles the "Enable Overclocking" + * button. + * + */ +static void overclocking_state_toggled(GtkWidget *widget, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + gboolean enabled; + ReturnStatus ret; + int value; + gint result; + + /* Get enabled state */ + + enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + + value = (enabled==1) ? NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL : + NV_CTRL_GPU_OVERCLOCKING_STATE_NONE; + + /* Verify user knows the risks involved */ + + if ( enabled && !ctk_object->license_accepted ) { + + /* Reset dialog window size */ + + gint w, h; + GdkScreen * s = + gtk_window_get_screen(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog))); + + gtk_window_get_size(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog)), + &w, &h); + + /* Make license dialog default to 75% of the screen height */ + + h = (gint)(0.55f * gdk_screen_get_height(s)); + w = 1; + + gtk_window_resize(GTK_WINDOW(GTK_DIALOG(ctk_object->enable_dialog)), + w, h); + + /* Reset scroll bar to the top */ + + gtk_adjustment_set_value(GTK_ADJUSTMENT( + GTK_RANGE( + GTK_SCROLLED_WINDOW( + ctk_object->license_window)->vscrollbar)->adjustment) + ,0.0f); + + + /* Disable the YES button */ + + gtk_dialog_set_response_sensitive(GTK_DIALOG(ctk_object->enable_dialog), + GTK_RESPONSE_ACCEPT, + FALSE); + + gtk_widget_show_all(ctk_object->enable_dialog); + result = gtk_dialog_run (GTK_DIALOG(ctk_object->enable_dialog)); + gtk_widget_hide(ctk_object->enable_dialog); + + switch (result) + { + case GTK_RESPONSE_ACCEPT: + ctk_object->license_accepted = TRUE; + break; + + case GTK_RESPONSE_REJECT: + default: + /* Cancel */ + g_signal_handlers_block_by_func(G_OBJECT(ctk_object->enable_checkbox), + G_CALLBACK(overclocking_state_toggled), + (gpointer) ctk_object); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), + FALSE); + + g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->enable_checkbox), + G_CALLBACK(overclocking_state_toggled), + (gpointer) ctk_object); + return; + } + } + + + /* Update the server */ + + ret = NvCtrlSetAttribute(ctk_object->handle, + NV_CTRL_GPU_OVERCLOCKING_STATE, value); + + /* Update the GUI */ + + overclocking_state_update_gui(ctk_object); + +} /* enable_overclocking_toggled() */ + + + +/***** + * + * Signal handler - Called when another NV-CONTROL client has set the + * overclocking state. + * + */ +static void overclocking_state_received(GtkObject *object, + gpointer arg1, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + + /* Update GUI with enable status */ + + overclocking_state_update_gui(ctk_object); + +} /* overclocking_state_update_received() */ + + + +/***** + * + * Signal handler - Called when overclocking becomes busy due to + * an NV-CONTROL client probing for the optimal clocks. + * + */ +static void auto_detection_state_received(GtkObject *object, + gpointer arg1, gpointer user_data) +{ + CtkEventStruct *event_struct = (CtkEventStruct *) arg1; + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + + + /* Update GUI with probing status */ + + ctk_object->probing_optimal = + (event_struct->value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY); + sync_gui_sensitivity(ctk_object); + + /* Update the status bar */ + + if ( ctk_object->probing_optimal ) { + ctk_config_statusbar_message(ctk_object->ctk_config, + __detect_wait_msg); + } else { + ctk_config_statusbar_message(ctk_object->ctk_config, + __canceled_msg); + } + +} /* auto_detection_state_received() */ + + + +/***** + * + * Syncs the gui to properly display the correct clocks the user wants to + * modify, or has modified with another NV_CONTROL client. + * + */ +static void sync_gui_to_modify_clocks(CtkClocks *ctk_object, int which_clocks) +{ + GtkRange *gtk_range; + GtkAdjustment *gtk_adjustment_gpu; + GtkAdjustment *gtk_adjustment_mem; + + ReturnStatus ret; + int clk_values; + int default_clk_values; + NVCTRLAttributeValidValuesRec clk_ranges; + + + + /* Obtain the current value and range of the desired clocks */ + + switch (which_clocks) { + case CLOCKS_2D: + ret = NvCtrlGetAttribute(ctk_object->handle, + NV_CTRL_GPU_2D_CLOCK_FREQS, &clk_values); + if ( ret != NvCtrlSuccess ) + return; + ret = NvCtrlGetValidAttributeValues(ctk_object->handle, + NV_CTRL_GPU_2D_CLOCK_FREQS, + &clk_ranges); + if ( ret != NvCtrlSuccess ) + return; + break; + + case CLOCKS_3D: + ret = NvCtrlGetAttribute(ctk_object->handle, + NV_CTRL_GPU_3D_CLOCK_FREQS, &clk_values); + if ( ret != NvCtrlSuccess ) + return; + ret = NvCtrlGetValidAttributeValues(ctk_object->handle, + NV_CTRL_GPU_3D_CLOCK_FREQS, + &clk_ranges); + if ( ret != NvCtrlSuccess ) + return; + break; + + case CLOCKS_NONE: + default: + return; + } + + + /* See if the clocks were modified */ + + ret = NvCtrlGetAttribute(ctk_object->handle, + which_clocks==CLOCKS_2D? + NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS: + NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS, + &default_clk_values); + + ctk_object->clocks_modified = + ((ret == NvCtrlSuccess) && (default_clk_values != clk_values)); + + if ( ctk_object->clocks_being_modified != which_clocks ) { + ctk_object->clocks_moved = False; + } + + ctk_object->clocks_being_modified = which_clocks; + + + /* Make sure the dropdown reflects the right clock set */ + + g_signal_handlers_block_by_func(G_OBJECT(ctk_object->clock_menu), + G_CALLBACK(clock_menu_changed), + (gpointer) ctk_object); + + gtk_option_menu_set_history(GTK_OPTION_MENU(ctk_object->clock_menu), + (which_clocks==CLOCKS_2D)?0:1); + + g_signal_handlers_unblock_by_func(G_OBJECT(ctk_object->clock_menu), + G_CALLBACK(clock_menu_changed), + (gpointer) ctk_object); + + + /* Make GPU and Memory clocks reflect the right range/values */ + + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); + gtk_adjustment_gpu = GTK_ADJUSTMENT(gtk_range->adjustment); + + g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_gpu), + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + gtk_range_set_range(gtk_range, + GET_GPU_CLOCK(clk_ranges.u.range.min), + GET_GPU_CLOCK(clk_ranges.u.range.max)); + + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); + gtk_adjustment_mem = GTK_ADJUSTMENT(gtk_range->adjustment); + + g_signal_handlers_block_by_func(G_OBJECT(gtk_adjustment_mem), + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + gtk_range_set_range(gtk_range, + GET_MEM_CLOCK(clk_ranges.u.range.min), + GET_MEM_CLOCK(clk_ranges.u.range.max)); + + set_clocks_value(ctk_object, clk_values, which_clocks); + + g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_mem), + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + + g_signal_handlers_unblock_by_func(G_OBJECT(gtk_adjustment_gpu), + G_CALLBACK(adjustment_value_changed), + (gpointer) ctk_object); + + + /* Update the gui sensitivity */ + + sync_gui_sensitivity(ctk_object); + +} /* sync_gui_to_modify_clocks() */ + + + +/***** + * + * Helper function - Sets the value of the clock frequencies scales + * + */ +static void set_clocks_value(CtkClocks *ctk_object, int clocks, + int which_clocks) +{ + GtkRange *gtk_range; + + + /* Update the clock values */ + + if ( ctk_object->gpu_clk_scale ) { + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); + gtk_range_set_value(gtk_range, GET_GPU_CLOCK(clocks)); + } + + if ( ctk_object->mem_clk_scale ) { + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); + gtk_range_set_value(gtk_range, GET_MEM_CLOCK(clocks)); + } + +} /* set_clocks_value() */ + + + +/***** + * + * Signal handler - Handles slider adjustments by the user. + * + */ +static void adjustment_value_changed(GtkAdjustment *adjustment, + gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + + + /* Enable the apply button */ + + gtk_widget_set_sensitive(ctk_object->apply_button, True); + + + /* Enable the reset button */ + + gtk_widget_set_sensitive(ctk_object->reset_button, True); + + + /* Set the clocks moved flag */ + + ctk_object->clocks_moved = True; + +} /* adjustment_value_changed() */ + + + +/***** + * + * Signal handler - User selected a clock set from the clock menu. + * + */ +static void clock_menu_changed(GtkOptionMenu *option_menu, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + gint history; + + + /* Sync to allow user to modify the clocks */ + + history = gtk_option_menu_get_history(option_menu); + switch (history) { + default: + /* Fall throught */ + case 0: /* 2D */ + sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D); + break; + case 1: /* 3D */ + sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D); + break; + } + +} /* clock_menu_changed() */ + + + +/***** + * + * Signal handler - User clicked the "apply" button. + * + */ +static void apply_clocks_clicked(GtkWidget *widget, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + GtkRange *gtk_range; + + ReturnStatus ret; + int gpu_clk; + int mem_clk; + int clocks; + + + /* Update server clocks with values from scales */ + + if ( !ctk_object->gpu_clk_scale || !ctk_object->mem_clk_scale ) + return; + + + /* Get new clock values from sliders */ + + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); + gpu_clk = gtk_range_get_value(gtk_range); + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); + mem_clk = gtk_range_get_value(gtk_range); + clocks = MAKE_CLOCKS(gpu_clk, mem_clk); + + + /* Set clocks on server */ + + ret = NvCtrlSetAttribute(ctk_object->handle, + (ctk_object->clocks_being_modified==CLOCKS_2D) ? + NV_CTRL_GPU_2D_CLOCK_FREQS : + NV_CTRL_GPU_3D_CLOCK_FREQS, + clocks); + if ( ret != NvCtrlSuccess ) { + ctk_config_statusbar_message(ctk_object->ctk_config, + "Failed to set clock frequencies!"); + return; + } + + + /* Clear the clocks moved flag */ + + ctk_object->clocks_moved = False; + + + /* Sync up with the server */ + + sync_gui_to_modify_clocks(ctk_object, ctk_object->clocks_being_modified); + + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->gpu_clk_scale)->gtk_scale); + gpu_clk = gtk_range_get_value(gtk_range); + gtk_range = GTK_RANGE(CTK_SCALE(ctk_object->mem_clk_scale)->gtk_scale); + mem_clk = gtk_range_get_value(gtk_range); + + ctk_config_statusbar_message(ctk_object->ctk_config, + "Set %s clocks to (GPU) %i MHz, " + "(Memory) %i MHz", + (ctk_object->clocks_being_modified==CLOCKS_2D)? + "2D":"3D", + gpu_clk, + mem_clk); + +} /* apply_clocks_clicked() */ + + + +/***** + * + * Signal handler - User clicked the 'reset hardware defaults' button. + * + */ +static void reset_clocks_clicked(GtkWidget *widget, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + int clocks; + ReturnStatus ret; + + + /* Get the default clock frequencies */ + + ret = NvCtrlGetAttribute(ctk_object->handle, + (ctk_object->clocks_being_modified==CLOCKS_2D) ? + NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS : + NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS, + &clocks); + if ( ret != NvCtrlSuccess ) + goto fail; + + /* Set clock frequencies to use default values */ + + ret = NvCtrlSetAttribute(ctk_object->handle, + (ctk_object->clocks_being_modified==CLOCKS_2D) ? + NV_CTRL_GPU_2D_CLOCK_FREQS : + NV_CTRL_GPU_3D_CLOCK_FREQS, + clocks); + if ( ret != NvCtrlSuccess ) + goto fail; + + /* Set slider positions */ + + set_clocks_value(ctk_object, clocks, ctk_object->clocks_being_modified); + + ctk_config_statusbar_message(ctk_object->ctk_config, + "Reset %s clock frequency " + "hardware defaults.", + (ctk_object->clocks_being_modified==CLOCKS_2D)? + "2D":"3D"); + + /* Disable the apply button */ + + gtk_widget_set_sensitive(ctk_object->apply_button, False); + + /* Disable the reset button */ + + gtk_widget_set_sensitive(ctk_object->reset_button, False); + + return; + + + fail: + ctk_config_statusbar_message(ctk_object->ctk_config, + "Failed to reset clock frequencies!"); + return; + +} /* reset_clocks_clicked() */ + + + +/***** + * + * Signal handler - User clicked the 'auto detect/cancel' button. + * + */ +static void detect_clocks_clicked(GtkWidget *widget, gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + ReturnStatus ret; + gint result; + + + if ( ctk_object->probing_optimal ) { + + /* Stop the test for optimal clock freqs */ + ret = NvCtrlSetAttribute(ctk_object->handle, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL); + } else { + + /* User must hit the OK button to start the testing */ + + gtk_widget_show_all(ctk_object->detect_dialog); + result = gtk_dialog_run (GTK_DIALOG (ctk_object->detect_dialog)); + gtk_widget_hide(ctk_object->detect_dialog); + + switch (result) + { + case GTK_RESPONSE_ACCEPT: + + /* Start the test for optimal clock freqs */ + ret = NvCtrlSetAttribute(ctk_object->handle, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START); + break; + + case GTK_RESPONSE_REJECT: + default: + /* Do nothing. */ + return; + } + } + + return; + +} /* detect_clocks_clicked() */ + + + +/***** + * + * Signal handler - Handles incoming NV-CONTROL messages caused by clocks + * being changed. + * + */ +static void clocks_received(GtkObject *object, gpointer arg1, + gpointer user_data) +{ + CtkEventStruct *event_struct = (CtkEventStruct *) arg1; + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + int clocks = event_struct->value; + + /* Some hardware requires that the memory clocks be the same for + * both the 2D and 3D clock frequency setting. Therefore, we + * always need to check what the current clocks we're modifying + * have been set to on clock events. + */ + + switch (event_struct->attribute) { + case NV_CTRL_GPU_2D_CLOCK_FREQS: + sync_gui_to_modify_clocks(ctk_object, CLOCKS_2D); + + ctk_config_statusbar_message(ctk_object->ctk_config, + "Set 2D clocks to (GPU) %i MHz, " + "(Memory) %i MHz", + GET_GPU_CLOCK(clocks), + GET_MEM_CLOCK(clocks)); + break; + case NV_CTRL_GPU_3D_CLOCK_FREQS: + sync_gui_to_modify_clocks(ctk_object, CLOCKS_3D); + + ctk_config_statusbar_message(ctk_object->ctk_config, + "Set 3D clocks to (GPU) %i MHz, " + "(Memory) %i MHz", + GET_GPU_CLOCK(clocks), + GET_MEM_CLOCK(clocks)); + break; + case NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS: + ctk_object->probing_optimal = False; + + ctk_config_statusbar_message(ctk_object->ctk_config, + "Found optimal 3D clocks: (GPU) %i MHz, " + "(Memory) %i MHz", + GET_GPU_CLOCK(clocks), + GET_MEM_CLOCK(clocks)); + + /* Only update gui if user is on 3D clocks */ + + if ( ctk_object->clocks_being_modified == CLOCKS_3D ) { + + /* Update clock values */ + + set_clocks_value(ctk_object, clocks, CLOCKS_3D); + + /* Allow user to apply the settings */ + + if ( ctk_object->apply_button ) + gtk_widget_set_sensitive(ctk_object->apply_button, True); + } + + break; + default: + break; + } + +} /* clocks_received() */ + + + +/***** + * + * Callback Function - This function gets called when the GPU Overclocking + * page gets selected from the tree view. + * + */ +void ctk_clocks_select(GtkWidget *widget) +{ + CtkClocks *ctk_object = CTK_CLOCKS(widget); + ReturnStatus ret; + int value; + + /* See if we're busy probing for optimal clocks so we can tell the user */ + + ret = NvCtrlGetAttribute(ctk_object->handle, + NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE, + &value); + + if ( ret == NvCtrlSuccess && + value == NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY ) { + ctk_config_statusbar_message(ctk_object->ctk_config, + __detect_wait_msg); + } +} + + + +/***** + * + * Callback Function - This function gets called when the user scrolls + * the license agreement text. Once the user has scrolled to the end + * of the document, the YES button is activated. + * + */ + +static void license_scrolled(GtkRange *range, + gpointer user_data) +{ + CtkClocks *ctk_object = CTK_CLOCKS(user_data); + GtkAdjustment *adj = gtk_range_get_adjustment(range); + + + /* Enable the dialog's "YES" button once user reaches end of license */ + if ( adj->value + adj->page_size >= adj->upper ) { + + gtk_dialog_set_response_sensitive(GTK_DIALOG(ctk_object->enable_dialog), + GTK_RESPONSE_ACCEPT, + TRUE); + } +} diff --git a/src/gtk+-2.x/ctkclocks.h b/src/gtk+-2.x/ctkclocks.h new file mode 100644 index 0000000..da42299 --- /dev/null +++ b/src/gtk+-2.x/ctkclocks.h @@ -0,0 +1,105 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +#ifndef __CTK_CLOCKS_H__ +#define __CTK_CLOCKS_H__ + +#include "ctkevent.h" +#include "ctkconfig.h" + +G_BEGIN_DECLS + +#define CTK_TYPE_CLOCKS (ctk_clocks_get_type()) + +#define CTK_CLOCKS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), CTK_TYPE_CLOCKS, CtkClocks)) + +#define CTK_CLOCKS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), CTK_TYPE_CLOCKS, CtkClocksClass)) + +#define CTK_IS_CLOCKS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CTK_TYPE_CLOCKS)) + +#define CTK_IS_CLOCKS_CLASS(class) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), CTK_TYPE_CLOCKS)) + +#define CTK_CLOCKS_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), CTK_TYPE_CLOCKS, CtkClocksClass)) + +#define CLOCKS_NONE 0 +#define CLOCKS_2D 2 +#define CLOCKS_3D 3 + + +typedef struct _CtkClocks CtkClocks; +typedef struct _CtkClocksClass CtkClocksClass; + +struct _CtkClocks +{ + GtkVBox parent; + + NvCtrlAttributeHandle *handle; + CtkConfig *ctk_config; + + GtkWidget *enable_dialog; + GtkWidget *detect_dialog; + + Bool license_accepted; + GtkWidget *license_window; + + + GtkWidget *enable_checkbox; /* Overclocking available */ + GtkWidget *clock_menu; /* 2D/3D dropdown selector */ + + GtkWidget *gpu_clk_scale; /* Current 2D or 3D clock sliders */ + GtkWidget *mem_clk_scale; + + GtkWidget *apply_button; /* Apply target clock frequencies */ + GtkWidget *detect_button; /* Auto detects best 3D clock frequencies */ + GtkWidget *reset_button; /* Reset hardware default frequencies */ + + int clocks_being_modified; /* Wether we're editing the 2D or 3D clocks */ + Bool clocks_modified; /* The clocks were modified by the user */ + Bool clocks_moved; /* The clock sliders were moved by the user */ + + Bool overclocking_enabled; /* Overclocking is enabled */ + Bool probing_optimal; /* Optimal clocks being probed */ +}; + +struct _CtkClocksClass +{ + GtkVBoxClass parent_class; +}; + +GType ctk_clocks_get_type (void) G_GNUC_CONST; +GtkWidget *ctk_clocks_new (NvCtrlAttributeHandle *, CtkConfig *, + CtkEvent *); + +GtkTextBuffer *ctk_clocks_create_help (GtkTextTagTable *, CtkClocks *); + +void ctk_clocks_select (GtkWidget *widget); + +G_END_DECLS + +#endif /* __CTK_CLOCKS_H__ */ diff --git a/src/gtk+-2.x/ctkconfig.c b/src/gtk+-2.x/ctkconfig.c index 7f31732..669d1de 100644 --- a/src/gtk+-2.x/ctkconfig.c +++ b/src/gtk+-2.x/ctkconfig.c @@ -297,6 +297,7 @@ GtkWidget* ctk_config_new(ConfigProperties *conf) ctk_config->timer_list_box = gtk_hbox_new(FALSE, 0); ctk_config->timer_list = create_timer_list(ctk_config); + g_object_ref(ctk_config->timer_list); ctk_config->timer_list_visible = FALSE; gtk_box_pack_start(GTK_BOX(ctk_config), ctk_config->timer_list_box, @@ -501,12 +502,13 @@ static void timer_enable_toggled(GtkCellRendererToggle*, gchar*, gpointer); enum { - ENABLE_COLUMN = 0, + USER_ENABLE_COLUMN = 0, TIME_INTERVAL_COLUMN, DESCRIPTION_COLUMN, FUNCTION_COLUMN, DATA_COLUMN, HANDLE_COLUMN, + OWNER_ENABLE_COLUMN, NUM_COLUMNS, }; @@ -528,12 +530,13 @@ static GtkWidget *create_timer_list(CtkConfig *ctk_config) ctk_config->list_store = gtk_list_store_new(NUM_COLUMNS, - G_TYPE_BOOLEAN, /* ENABLE_COLUMN */ + G_TYPE_BOOLEAN, /* USER_ENABLE_COLUMN */ G_TYPE_UINT, /* TIME_INTERVAL_COLUMN */ G_TYPE_STRING, /* DESCRIPTION_COLUMN */ G_TYPE_POINTER, /* FUNCTION_COLUMN */ G_TYPE_POINTER, /* DATA_COLUMN */ - G_TYPE_UINT); /* HANDLE_COLUMN */ + G_TYPE_UINT, /* HANDLE_COLUMN */ + G_TYPE_BOOLEAN); /* OWNER_ENABLE_COLUMN */ model = GTK_TREE_MODEL(ctk_config->list_store); @@ -547,7 +550,7 @@ static GtkWidget *create_timer_list(CtkConfig *ctk_config) g_signal_connect(renderer, "toggled", G_CALLBACK(timer_enable_toggled), ctk_config); column = gtk_tree_view_column_new_with_attributes("Enabled", renderer, - "active", ENABLE_COLUMN, + "active", USER_ENABLE_COLUMN, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); @@ -639,6 +642,8 @@ static void time_interval_edited(GtkCellRendererText *cell, GSourceFunc function; gpointer data; guint interval; + gboolean user_enabled; + gboolean owner_enabled; interval = strtol(new_text, (char **)NULL, 10); @@ -656,17 +661,24 @@ static void time_interval_edited(GtkCellRendererText *cell, TIME_INTERVAL_COLUMN, interval, -1); gtk_tree_model_get(model, &iter, + USER_ENABLE_COLUMN, &user_enabled, + OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &function, DATA_COLUMN, &data, -1); - g_source_remove(handle); - - handle = g_timeout_add(interval, function, data); + /* Restart the timer if it is already running */ - gtk_list_store_set(ctk_config->list_store, &iter, - HANDLE_COLUMN, handle, -1); + if (user_enabled && owner_enabled) { + + g_source_remove(handle); + + handle = g_timeout_add(interval, function, data); + + gtk_list_store_set(ctk_config->list_store, &iter, + HANDLE_COLUMN, handle, -1); + } } static void timer_enable_toggled(GtkCellRendererToggle *cell, @@ -681,32 +693,38 @@ static void timer_enable_toggled(GtkCellRendererToggle *cell, GSourceFunc function; gpointer data; guint interval; - gboolean enabled; + gboolean user_enabled; + gboolean owner_enabled; path = gtk_tree_path_new_from_string(path_string); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, - ENABLE_COLUMN, &enabled, + USER_ENABLE_COLUMN, &user_enabled, + OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, FUNCTION_COLUMN, &function, DATA_COLUMN, &data, TIME_INTERVAL_COLUMN, &interval, -1); - enabled ^= 1; + user_enabled ^= 1; - if (enabled) { - handle = g_timeout_add(interval, function, data); - gtk_list_store_set(ctk_config->list_store, &iter, - HANDLE_COLUMN, handle, -1); - } else { - g_source_remove(handle); + /* Start/stop the timer only when the owner widget has enabled it */ + + if (owner_enabled) { + if (user_enabled) { + handle = g_timeout_add(interval, function, data); + gtk_list_store_set(ctk_config->list_store, &iter, + HANDLE_COLUMN, handle, -1); + } else { + g_source_remove(handle); + } } gtk_list_store_set(ctk_config->list_store, &iter, - ENABLE_COLUMN, enabled, -1); + USER_ENABLE_COLUMN, user_enabled, -1); } void ctk_config_add_timer(CtkConfig *ctk_config, @@ -716,17 +734,16 @@ void ctk_config_add_timer(CtkConfig *ctk_config, gpointer data) { GtkTreeIter iter; - guint handle; - handle = g_timeout_add(interval, function, data); - + /* Timer defaults to user enabled/owner disabled */ + gtk_list_store_append(ctk_config->list_store, &iter); gtk_list_store_set(ctk_config->list_store, &iter, - ENABLE_COLUMN, TRUE, + USER_ENABLE_COLUMN, TRUE, + OWNER_ENABLE_COLUMN, FALSE, TIME_INTERVAL_COLUMN, interval, DESCRIPTION_COLUMN, descr, FUNCTION_COLUMN, function, - HANDLE_COLUMN, handle, DATA_COLUMN, data, -1); /* make the timer list visible if it is not */ @@ -747,15 +764,26 @@ void ctk_config_remove_timer(CtkConfig *ctk_config, GSourceFunc function) GSourceFunc func; gboolean valid; guint handle; + gboolean user_enabled; + gboolean owner_enabled; + model = GTK_TREE_MODEL(ctk_config->list_store); valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { - gtk_tree_model_get(model, &iter, FUNCTION_COLUMN, &func, + gtk_tree_model_get(model, &iter, + FUNCTION_COLUMN, &func, + USER_ENABLE_COLUMN, &user_enabled, + OWNER_ENABLE_COLUMN, &owner_enabled, HANDLE_COLUMN, &handle, -1); if (func == function) { - g_source_remove(handle); + + /* Remove the timer if it was running */ + + if (user_enabled && owner_enabled) { + g_source_remove(handle); + } gtk_list_store_remove(ctk_config->list_store, &iter); break; } @@ -772,4 +800,83 @@ void ctk_config_remove_timer(CtkConfig *ctk_config, GSourceFunc function) } } +void ctk_config_start_timer(CtkConfig *ctk_config, GSourceFunc function) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GSourceFunc func; + gboolean valid; + guint handle; + guint interval; + gboolean user_enabled; + gboolean owner_enabled; + gpointer data; + + model = GTK_TREE_MODEL(ctk_config->list_store); + valid = gtk_tree_model_get_iter_first(model, &iter); + while (valid) { + gtk_tree_model_get(model, &iter, + USER_ENABLE_COLUMN, &user_enabled, + OWNER_ENABLE_COLUMN, &owner_enabled, + HANDLE_COLUMN, &handle, + FUNCTION_COLUMN, &func, + DATA_COLUMN, &data, + TIME_INTERVAL_COLUMN, &interval, + -1); + if (func == function) { + + /* Start the timer if is enabled by the user and + it is not already running. */ + + if (user_enabled && !owner_enabled) { + handle = g_timeout_add(interval, function, data); + gtk_list_store_set(ctk_config->list_store, &iter, + HANDLE_COLUMN, handle, -1); + } + gtk_list_store_set(ctk_config->list_store, &iter, + OWNER_ENABLE_COLUMN, TRUE, -1); + break; + } + valid = gtk_tree_model_iter_next(model, &iter); + } +} + +void ctk_config_stop_timer(CtkConfig *ctk_config, GSourceFunc function) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GSourceFunc func; + gboolean valid; + guint handle; + guint interval; + gboolean user_enabled; + gboolean owner_enabled; + gpointer data; + + model = GTK_TREE_MODEL(ctk_config->list_store); + + valid = gtk_tree_model_get_iter_first(model, &iter); + while (valid) { + gtk_tree_model_get(model, &iter, + USER_ENABLE_COLUMN, &user_enabled, + OWNER_ENABLE_COLUMN, &owner_enabled, + HANDLE_COLUMN, &handle, + FUNCTION_COLUMN, &func, + DATA_COLUMN, &data, + TIME_INTERVAL_COLUMN, &interval, + -1); + if (func == function) { + + /* Remove the timer if was running. */ + + if (user_enabled && owner_enabled) { + g_source_remove(handle); + } + gtk_list_store_set(ctk_config->list_store, &iter, + OWNER_ENABLE_COLUMN, FALSE, -1); + break; + } + valid = gtk_tree_model_iter_next(model, &iter); + } +} diff --git a/src/gtk+-2.x/ctkconfig.h b/src/gtk+-2.x/ctkconfig.h index d0e3688..8599701 100644 --- a/src/gtk+-2.x/ctkconfig.h +++ b/src/gtk+-2.x/ctkconfig.h @@ -101,6 +101,9 @@ GtkTextBuffer *ctk_config_create_help (GtkTextTagTable *); void ctk_config_add_timer(CtkConfig *, guint, gchar *, GSourceFunc, gpointer); void ctk_config_remove_timer(CtkConfig *, GSourceFunc); +void ctk_config_start_timer(CtkConfig *, GSourceFunc); +void ctk_config_stop_timer(CtkConfig *, GSourceFunc); + gboolean ctk_config_slider_text_entry_shown(CtkConfig *); G_END_DECLS diff --git a/src/gtk+-2.x/ctkcursorshadow.c b/src/gtk+-2.x/ctkcursorshadow.c index 856c62a..3f13256 100644 --- a/src/gtk+-2.x/ctkcursorshadow.c +++ b/src/gtk+-2.x/ctkcursorshadow.c @@ -33,12 +33,11 @@ * * TODO: * - * - Use color selection dialog * - provide mechanism for configuring ARGB cursor themes, etc... */ - +#include <stdio.h> /* sprintf */ #include <gtk/gtk.h> #include "NvCtrlAttributes.h" @@ -68,7 +67,7 @@ static const char *__alpha_help = "shadow is."; static const char *__color_selector_help = -"The Cursor Shadow Color Selector checkbox toggles " +"The Cursor Shadow Color Selector button toggles " "the Cursor Shadow Color Selector window, which allows " "you to select the color for the cursor shadow."; @@ -146,6 +145,8 @@ static gboolean color_selector_window_destroy(GtkWidget *widget, GdkEvent *event, gpointer user_data); +static void post_color_selector_changed(CtkCursorShadow *ctk_cursor_shadow, + gint red, gint green, gint blue); static void color_selector_changed(GtkColorSelection *colorselection, gpointer user_data); @@ -207,10 +208,13 @@ GtkWidget* ctk_cursor_shadow_new(NvCtrlAttributeHandle *handle, GtkWidget *vbox; GtkWidget *check_button; GtkWidget *label; + GdkColor color; ReturnStatus ret; gint enabled; guint8 *image_buffer = NULL; const nv_image_t *img; + gint red, green, blue; + char str[16]; /* check to see if we can support cursor shadow */ @@ -317,25 +321,81 @@ GtkWidget* ctk_cursor_shadow_new(NvCtrlAttributeHandle *handle, (gpointer) ctk_cursor_shadow); - /* "Color Shadow Selector" check box */ + /* "Color Shadow Selector" button */ - ctk_cursor_shadow->color_selector_check_button = - gtk_check_button_new_with_label("Cursor Shadow Color Selector"); + ctk_cursor_shadow->color_selector_button = + gtk_toggle_button_new(); - gtk_box_pack_start(GTK_BOX(vbox), - ctk_cursor_shadow->color_selector_check_button, - FALSE, FALSE, 0); + /* Cursor Shadow Color Box */ + + frame = gtk_aspect_frame_new(NULL, 0, 0, 1, FALSE); + + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); + + gtk_container_set_border_width(GTK_CONTAINER(frame), 1); + + + ctk_cursor_shadow->cursor_shadow_bg = gtk_event_box_new(); + + gtk_widget_set_size_request(ctk_cursor_shadow->cursor_shadow_bg, 10, 10); + + /* Grab current cursor shadow color */ + + NvCtrlGetAttribute(ctk_cursor_shadow->handle, + NV_CTRL_CURSOR_SHADOW_RED, &red); + + NvCtrlGetAttribute(ctk_cursor_shadow->handle, + NV_CTRL_CURSOR_SHADOW_GREEN, &green); + + NvCtrlGetAttribute(ctk_cursor_shadow->handle, + NV_CTRL_CURSOR_SHADOW_BLUE, &blue); + + sprintf(str, "#%2.2X%2.2X%2.2X", red, green, blue); + + gdk_color_parse (str, &color); + + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_NORMAL, &color); + + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_ACTIVE, &color); + + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_PRELIGHT, &color); + + /* pack cursor color selector button */ + + gtk_container_add(GTK_CONTAINER(frame), + ctk_cursor_shadow->cursor_shadow_bg); + label = gtk_label_new("Cursor Shadow Color Selector"); + + hbox = gtk_hbox_new(FALSE, 0); + + gtk_box_pack_start( GTK_BOX(hbox), frame, TRUE, TRUE, 2); + + gtk_box_pack_end( GTK_BOX(hbox), label, FALSE, FALSE, 5); + + gtk_container_add(GTK_CONTAINER(ctk_cursor_shadow->color_selector_button), + hbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), + ctk_cursor_shadow->color_selector_button, + FALSE, FALSE, 0); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5); + gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button), + (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button), FALSE); - g_signal_connect(G_OBJECT(ctk_cursor_shadow->color_selector_check_button), - "toggled", G_CALLBACK(color_toggled), + g_signal_connect(G_OBJECT(ctk_cursor_shadow->color_selector_button), + "clicked", G_CALLBACK(color_toggled), (gpointer) ctk_cursor_shadow); ctk_config_set_tooltip(ctk_config, - ctk_cursor_shadow->color_selector_check_button, + ctk_cursor_shadow->color_selector_button, __color_selector_help); /* Color Selector */ @@ -596,6 +656,9 @@ static void reset_defaults(GtkButton *button, gpointer user_data) gtk_color_selection_set_current_color (GTK_COLOR_SELECTION(ctk_cursor_shadow->color_selector), &color); + + post_color_selector_changed(ctk_cursor_shadow, + color.red, color.green, color.blue); g_signal_handlers_unblock_matched (G_OBJECT(ctk_cursor_shadow->color_selector), @@ -717,6 +780,8 @@ static void set_cursor_shadow_sensitivity(CtkCursorShadow *ctk_cursor_shadow, gtk_widget_set_sensitive(ctk_cursor_shadow->color_selector, enabled); + gtk_widget_set_sensitive(ctk_cursor_shadow->color_selector_button, enabled); + /* * We separately track whether the reset button should be * sensitive because, unlike the sliders (which should be @@ -963,7 +1028,7 @@ color_selector_close_button_clicked(GtkButton *button, gpointer user_data) CtkCursorShadow *ctk_cursor_shadow = CTK_CURSOR_SHADOW(user_data); gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button), + (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button), FALSE); } /* color_selector_close_button_clicked() */ @@ -977,7 +1042,7 @@ color_selector_window_destroy(GtkWidget *widget, GdkEvent *event, CtkCursorShadow *ctk_cursor_shadow = CTK_CURSOR_SHADOW(user_data); gtk_toggle_button_set_active - (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_check_button), + (GTK_TOGGLE_BUTTON(ctk_cursor_shadow->color_selector_button), FALSE); return TRUE; @@ -1033,6 +1098,23 @@ static int get_value_and_range(CtkCursorShadow *ctk_cursor_shadow, static void post_color_selector_changed(CtkCursorShadow *ctk_cursor_shadow, gint red, gint green, gint blue) { + GdkColor color; + char str[16]; + sprintf(str, "#%2.2X%2.2X%2.2X", red, green, blue); + + + /* Update the color square */ + + gdk_color_parse(str, &color); + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_NORMAL, &color); + + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_ACTIVE, &color); + + gtk_widget_modify_bg(ctk_cursor_shadow->cursor_shadow_bg, + GTK_STATE_PRELIGHT, &color); + /* make the reset button sensitive */ ctk_cursor_shadow->reset_button_sensitivity = TRUE; diff --git a/src/gtk+-2.x/ctkcursorshadow.h b/src/gtk+-2.x/ctkcursorshadow.h index 1519ece..83b6432 100644 --- a/src/gtk+-2.x/ctkcursorshadow.h +++ b/src/gtk+-2.x/ctkcursorshadow.h @@ -64,7 +64,8 @@ struct _CtkCursorShadow CtkEvent *ctk_event; GtkWidget *scales[3]; GtkWidget *reset_button; - GtkWidget *color_selector_check_button; + GtkWidget *color_selector_button; + GtkWidget *cursor_shadow_bg; GtkWidget *cursor_shadow_check_button; GtkWidget *color_selector; GtkWidget *color_selector_window; diff --git a/src/gtk+-2.x/ctkdevice.c b/src/gtk+-2.x/ctkdevice.c index ec0bb03..6ee5d3b 100644 --- a/src/gtk+-2.x/ctkdevice.c +++ b/src/gtk+-2.x/ctkdevice.c @@ -29,18 +29,13 @@ #include "big_banner_penguin.h" #include "big_banner_bsd.h" +#include "big_banner_sun.h" #include "image.h" #include "ctkdevice.h" #include "ctkhelp.h" - -static void add_table_row(GtkWidget *table, - const gint row, - const gint value_alignment, - const gchar *name, - const gchar *value); - +#include "ctkutils.h" #define N_GDK_PIXBUFS 45 @@ -202,7 +197,7 @@ GtkWidget* ctk_device_new( } else if (os_val == NV_CTRL_OPERATING_SYSTEM_FREEBSD) { img = &big_banner_bsd_image; } else if (os_val == NV_CTRL_OPERATING_SYSTEM_SUNOS) { - img = &big_banner_penguin_image; /* XXX To be replaced with Sun Logo */ + img = &big_banner_sun_image; } else { img = &big_banner_penguin_image; /* Should never get here */ } @@ -261,26 +256,6 @@ GtkWidget* ctk_device_new( return GTK_WIDGET(object); } - -static void add_table_row(GtkWidget *table, - const gint row, - const gint value_alignment, - const gchar *name, - const gchar *value) -{ - GtkWidget *label; - - label = gtk_label_new(name); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, - GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); - - label = gtk_label_new(value); - gtk_misc_set_alignment(GTK_MISC(label), value_alignment, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row + 1, - GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); -} - GtkTextBuffer *ctk_device_create_help(GtkTextTagTable *table, const gchar *screen_name) diff --git a/src/gtk+-2.x/ctkdisplaydevice-dfp.c b/src/gtk+-2.x/ctkdisplaydevice-dfp.c index 06d2f20..8909ccc 100644 --- a/src/gtk+-2.x/ctkdisplaydevice-dfp.c +++ b/src/gtk+-2.x/ctkdisplaydevice-dfp.c @@ -32,6 +32,7 @@ #include "ctkimagesliders.h" #include "ctkconfig.h" #include "ctkhelp.h" +#include "ctkutils.h" static GtkWidget *make_scaling_radio_button(CtkDisplayDeviceDfp @@ -71,6 +72,7 @@ static void dfp_update_received(GtkObject *object, gpointer arg1, #define __SCALING (1<<0) #define __DITHERING (1<<1) +#define __INFO (1<<2) static const char *__scaling_help = @@ -85,6 +87,10 @@ static const char *__dithering_help = "properly display on a flatpanel; this option allows " "you to control the dithering behavior."; +static const char *__info_help = +"This section describes basic informations about the " +"DVI connection to the digital flat panel."; + GType ctk_display_device_dfp_get_type(void) { @@ -137,6 +143,8 @@ GtkWidget* ctk_display_device_dfp_new(NvCtrlAttributeHandle *handle, GtkWidget *radio3; GtkWidget *alignment; + GtkWidget *table; + ReturnStatus ret; guint8 *image_buffer = NULL; @@ -202,11 +210,64 @@ GtkWidget* ctk_display_device_dfp_new(NvCtrlAttributeHandle *handle, "The Reset Hardware Defaults button restores " "the DFP settings to their default values."); - /* create the hbox to store scaling and dithering */ + /* create the hbox to store dfp info, scaling and dithering */ hbox = gtk_hbox_new(FALSE, FRAME_PADDING); gtk_box_pack_start(GTK_BOX(object), hbox, TRUE, TRUE, FRAME_PADDING); + /* DFP info */ + ret = NvCtrlGetDisplayAttribute(handle, display_device_mask, + NV_CTRL_FLATPANEL_CHIP_LOCATION, &val); + if (ret == NvCtrlSuccess) { + char *chip_location, *link, *signal; + gint tmp; + + /* NV_CTRL_FLATPANEL_CHIP_LOCATION */ + ret = NvCtrlGetDisplayAttribute(handle, display_device_mask, + NV_CTRL_FLATPANEL_CHIP_LOCATION, &tmp); + chip_location = NULL; + if (ret == NvCtrlSuccess) { + if (tmp == NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL) chip_location = "Internal"; + if (tmp == NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL) chip_location = "External"; + } + + ret = NvCtrlGetDisplayAttribute(handle, display_device_mask, + NV_CTRL_FLATPANEL_LINK, &tmp); + link = NULL; + if (ret == NvCtrlSuccess) { + if (tmp == NV_CTRL_FLATPANEL_LINK_SINGLE) link = "Single"; + if (tmp == NV_CTRL_FLATPANEL_LINK_DUAL) link = "Dual"; + } + + ret = NvCtrlGetDisplayAttribute(handle, display_device_mask, + NV_CTRL_FLATPANEL_SIGNAL, &tmp); + signal = NULL; + if (ret == NvCtrlSuccess) { + if (tmp == NV_CTRL_FLATPANEL_SIGNAL_LVDS) signal = "LVDS"; + if (tmp == NV_CTRL_FLATPANEL_SIGNAL_TMDS) signal = "TMDS"; + } + + frame = gtk_frame_new("Flat Panel Information"); + gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 0); + + table = gtk_table_new(3, 2, FALSE); + gtk_container_add(GTK_CONTAINER(frame), table); + + gtk_table_set_row_spacings(GTK_TABLE(table), 3); + gtk_table_set_col_spacings(GTK_TABLE(table), 15); + + gtk_container_set_border_width(GTK_CONTAINER(table), 5); + + + add_table_row(table, 0, 0, "Chip location:", chip_location); + add_table_row(table, 1, 0, "DVI connection link:", link); + add_table_row(table, 2, 0, "Signal:", signal); + + ctk_display_device_dfp->active_attributes |= __INFO; + } + else + ctk_display_device_dfp->active_attributes &= ~__INFO; + /* FlatPanel Scaling */ ret = NvCtrlGetDisplayAttribute(handle, display_device_mask, @@ -750,6 +811,28 @@ GtkTextBuffer *ctk_display_device_dfp_create_help(GtkTextTagTable *table, ctk_help_title(b, &i, "%s Help", ctk_display_device_dfp->name); + if (ctk_display_device_dfp->active_attributes & __INFO) { + ctk_help_heading(b, &i, "FlatPanel Information"); + ctk_help_para(b, &i, __info_help); + + ctk_help_term(b, &i, "Chip Location"); + ctk_help_para(b, &i, "Report whether the flatpanel is driven by " + "the on-chip controller (internal), or a " + " separate controller chip elsewhere on the " + "graphics board (external)"); + + ctk_help_term(b, &i, "Link"); + ctk_help_para(b, &i, "Report whether the specified display device " + "is driven by a single link or dual link DVI " + "connection."); + + ctk_help_term(b, &i, "Signal"); + ctk_help_para(b, &i, "Report whether the flatpanel is driven by " + "an LVDS or TMDS signal"); + + ret = TRUE; + } + if (ctk_display_device_dfp->active_attributes & __SCALING) { ctk_help_heading(b, &i, "FlatPanel Scaling"); ctk_help_para(b, &i, __scaling_help); diff --git a/src/gtk+-2.x/ctkevent.c b/src/gtk+-2.x/ctkevent.c index 5eb49e5..e77d7d1 100644 --- a/src/gtk+-2.x/ctkevent.c +++ b/src/gtk+-2.x/ctkevent.c @@ -187,7 +187,13 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class) MAKE_SIGNAL(NV_CTRL_GVO_VIDEO_FORMAT_REFRESH_RATE); MAKE_SIGNAL(NV_CTRL_GVO_X_SCREEN_PAN_X); MAKE_SIGNAL(NV_CTRL_GVO_X_SCREEN_PAN_Y); - + MAKE_SIGNAL(NV_CTRL_GPU_OVERCLOCKING_STATE); + MAKE_SIGNAL(NV_CTRL_GPU_2D_CLOCK_FREQS); + MAKE_SIGNAL(NV_CTRL_GPU_3D_CLOCK_FREQS); + MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS); + MAKE_SIGNAL(NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE); + MAKE_SIGNAL(NV_CTRL_USE_HOUSE_SYNC); + #undef MAKE_SIGNAL /* @@ -197,7 +203,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class) * knows about. */ -#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GVO_X_SCREEN_PAN_Y +#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_USE_HOUSE_SYNC #warning "There are attributes that do not emit signals!" #endif @@ -279,11 +285,12 @@ static gboolean ctk_event_check(GSource *source) { CtkEventSource *event_source = (CtkEventSource *) source; - if (event_source->event_poll_fd.revents & G_IO_IN) { - return XPending(event_source->dpy); - } - - return FALSE; + /* + * XXX We could check for (event_source->event_poll_fd.revents & G_IO_IN), + * but doing so caused some events to be missed as they came in with only + * the G_IO_OUT flag set which is odd. + */ + return XPending(event_source->dpy); } static gboolean ctk_event_dispatch(GSource *source, diff --git a/src/gtk+-2.x/ctkframelock.c b/src/gtk+-2.x/ctkframelock.c index 1b336fb..39b5c25 100644 --- a/src/gtk+-2.x/ctkframelock.c +++ b/src/gtk+-2.x/ctkframelock.c @@ -84,7 +84,7 @@ static void add_member_to_list_store(CtkFramelock *ctk_framelock, static void apply_parsed_attribute_list(CtkFramelock *ctk_framelock, ParsedAttribute *p); -static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock); +static GtkWidget *add_house_sync_controls(NvCtrlAttributeHandle *handle, CtkFramelock *ctk_framelock); static void update_house_sync_controls(CtkFramelock *ctk_framelock); static void add_columns_to_treeview(CtkFramelock *ctk_framelock); @@ -323,7 +323,7 @@ GtkWidget* ctk_framelock_new(NvCtrlAttributeHandle *handle, /* Sync Interval and House Sync Format controls */ - hbox = add_house_sync_controls(ctk_framelock); + hbox = add_house_sync_controls(handle, ctk_framelock); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, TRUE, 0); hseparator = gtk_hseparator_new(); @@ -453,6 +453,8 @@ static gchar *houseFormatStrings[] = { "Composite, Tri-Level", /* VIDEO_MODE_COMPOSITE_TRI_LEVEL */ }; +static void use_house_sync_released(GtkToggleButton *togglebutton, + gpointer user_data); static void detect_house_sync_format_toggled(GtkToggleButton *togglebutton, gpointer user_data); @@ -640,26 +642,136 @@ static void detect_house_sync_format_toggled(GtkToggleButton *togglebutton, } /* detect_house_sync_format_toggled() */ +/* + * When the use_house_sync button is released, check to see if we + * have a house signal (if applicable) then try to set the state of + * the hardware (i.e. P294). We do this as a release instead of a toggler + * because if + * the hardware change is not successful, we must toggle the button + * back, which would end up triggering toggle function from the toggle function. + */ + +static void use_house_sync_released(GtkToggleButton *togglebutton, + gpointer user_data) +{ + + NvCtrlAttributeHandle *handle = NULL; + CtkFramelock *ctk_framelock = CTK_FRAMELOCK(user_data); + gboolean enabled; + gint val; + + + enabled = gtk_toggle_button_get_active(togglebutton); + if (find_master(ctk_framelock, NULL, &handle)) + { + if (enabled) + { + if (( NvCtrlGetAttribute( + handle, NV_CTRL_FRAMELOCK_HOUSE_STATUS, &val)) != + NvCtrlSuccess) + { + ctk_config_statusbar_message(ctk_framelock->ctk_config, + "Framelock could not determine house sync status."); + gtk_toggle_button_set_active(togglebutton, !enabled); + return; + } + else if (!val) + { + ctk_config_statusbar_message(ctk_framelock->ctk_config, + "Framelock could not find house sync signal."); + gtk_toggle_button_set_active(togglebutton, !enabled); + return; + } + } + if (( NvCtrlSetAttribute(handle, NV_CTRL_USE_HOUSE_SYNC, enabled)) != + NvCtrlSuccess) + { + ctk_config_statusbar_message(ctk_framelock->ctk_config, + "Framelock could not %sable house sync.", + enabled ? "en" : "dis"); + gtk_toggle_button_set_active(togglebutton, !enabled); + return; + } + } + else + { + ctk_config_statusbar_message(ctk_framelock->ctk_config, + "Framelock could not establish master."); + gtk_toggle_button_set_active(togglebutton, !enabled); + return; + } + + gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, enabled); + gtk_widget_set_sensitive(ctk_framelock->house_format_frame, enabled); + + ctk_config_statusbar_message(ctk_framelock->ctk_config, + "Framelock %s house sync.", + enabled ? "using" : "not using"); + +} /* use_house_sync_released() */ /* * add_house_sync_controls() - */ -static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock) +static GtkWidget *add_house_sync_controls(NvCtrlAttributeHandle *handle, CtkFramelock *ctk_framelock) { + GtkWidget *hboxroot; GtkWidget *hbox; + GtkWidget *vbox; GtkWidget *hbox2; GtkWidget *label; + GtkWidget *check_button; GList *glist; + gint val = 0; + gboolean use_house_sync_option = FALSE; + ReturnStatus ret; + + hboxroot = gtk_vbox_new(FALSE, 5); + + ctk_framelock->house_sync_frame = gtk_frame_new(NULL); + gtk_box_pack_start(GTK_BOX(hboxroot), ctk_framelock->house_sync_frame, + FALSE, TRUE, 0); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(ctk_framelock->house_sync_frame),vbox); + + ctk_framelock->use_house_sync_button = NULL; + + ret = NvCtrlGetAttribute(handle, NV_CTRL_USE_HOUSE_SYNC, &val); + if (ret == NvCtrlSuccess) { + use_house_sync_option = TRUE; + + hbox = gtk_hbox_new(FALSE, 5); + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5); + + label = gtk_label_new("Use House Sync"); + + check_button = gtk_check_button_new(); + gtk_container_add(GTK_CONTAINER(check_button), label); + ctk_framelock->use_house_sync_button = check_button; + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button), val); + + gtk_box_pack_start(GTK_BOX(hbox), check_button, FALSE, FALSE, 5); + + // see callback definition for why we use "released" + g_signal_connect(G_OBJECT(check_button), "released", + G_CALLBACK(use_house_sync_released), + (gpointer) ctk_framelock); + } + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5); /* sync interval */ ctk_framelock->sync_interval_frame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(hbox), ctk_framelock->sync_interval_frame, - FALSE, TRUE, 0); + FALSE, TRUE, 5); hbox2 = gtk_hbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(ctk_framelock->sync_interval_frame),hbox2); @@ -734,7 +846,14 @@ static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock) G_CALLBACK(detect_house_sync_format_toggled), ctk_framelock); - return hbox; + /* disable these controls until use_house_sync is selected */ + if (use_house_sync_option) + { + gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, FALSE); + gtk_widget_set_sensitive(ctk_framelock->house_format_frame, FALSE); + } + + return hboxroot; } /* add_house_sync_controls() */ @@ -748,7 +867,7 @@ static GtkWidget *add_house_sync_controls(CtkFramelock *ctk_framelock) static void update_house_sync_controls(CtkFramelock *ctk_framelock) { GtkTreeModel *model = GTK_TREE_MODEL(ctk_framelock->list_store); - gboolean house = FALSE, sensitive; + gboolean house = FALSE, sensitive, use_house; gint sync_interval, house_format; gchar str[32]; GtkTreeIter iter; @@ -772,8 +891,27 @@ static void update_house_sync_controls(CtkFramelock *ctk_framelock) (GTK_ENTRY(GTK_COMBO(ctk_framelock->house_format_combo)->entry), houseFormatStrings[house_format]); } - - if (ctk_framelock->framelock_enabled) { + + use_house = TRUE; + + if (ctk_framelock->use_house_sync_button) + { + use_house = + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync_button)); + } + + if (ctk_framelock->framelock_enabled) + { + sensitive = FALSE; + } else { + sensitive = TRUE; + } + + // This includes the checkbutton for selecting house sync + gtk_widget_set_sensitive(ctk_framelock->house_sync_frame, sensitive); + + if (ctk_framelock->framelock_enabled || !use_house) { sensitive = FALSE; } else { sensitive = TRUE; @@ -1062,7 +1200,7 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column, static GdkPixbuf *led_green_pixbuf = NULL; static GdkPixbuf *led_red_pixbuf = NULL; static GdkPixbuf *led_grey_pixbuf = NULL; - gboolean value, master, framelock_enabled; + gboolean value, master, framelock_enabled, use_house; gpointer obj; gint column, house = 0; @@ -1079,9 +1217,15 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column, COLUMN_MASTER, &master, -1); framelock_enabled = FALSE; + use_house = TRUE; if (obj) { CtkFramelock *ctk_framelock = CTK_FRAMELOCK(obj); if (ctk_framelock->framelock_enabled) framelock_enabled = TRUE; + if (ctk_framelock->use_house_sync_button) { + use_house = + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(ctk_framelock->use_house_sync_button)); + } } gtk_tree_model_get(model, iter, COLUMN_HOUSE, &house, -1); @@ -1091,10 +1235,12 @@ static void led_renderer_func(GtkTreeViewColumn *tree_column, * (otherwise, it will be red when framelock is enabled, which is * confusing). * - * If we are receiving house sync, then light the LED green. + * If we are receiving house sync, then light the LED green, unless + * the user has opted to not use it (e.g. p294) */ - if ((column == COLUMN_TIMING) && master && framelock_enabled && !house) { + if ((column == COLUMN_TIMING) && master && framelock_enabled && + (!house || !use_house)) { if (!led_grey_pixbuf) led_grey_pixbuf = gdk_pixbuf_new_from_xpm_data(led_grey_xpm); g_object_set(GTK_CELL_RENDERER(cell), "pixbuf", led_grey_pixbuf, NULL); @@ -1717,7 +1863,13 @@ static void remove_x_screen(GtkWidget *button, gint response, model = GTK_TREE_MODEL(ctk_framelock->list_store); valid = gtk_tree_model_get_iter_first(model, &iter); if (!valid) { + // Nothing to house sync to + if (ctk_framelock->use_house_sync_button) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + ctk_framelock->use_house_sync_button), FALSE); + } gtk_widget_set_sensitive(ctk_framelock->sync_state_button, FALSE); + update_house_sync_controls (ctk_framelock); } } @@ -2139,11 +2291,6 @@ static void toggle_sync_state_button(GtkWidget *button, gtk_widget_set_sensitive(ctk_framelock->remove_x_screen_button, FALSE); gtk_widget_set_sensitive(ctk_framelock->test_link_button, TRUE); - /* disable the house sync controls */ - - gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, FALSE); - gtk_widget_set_sensitive(ctk_framelock->house_format_frame, FALSE); - } else { if (ctk_framelock->framelock_enabled) { gtk_container_remove @@ -2162,15 +2309,12 @@ static void toggle_sync_state_button(GtkWidget *button, selection = gtk_tree_view_get_selection(ctk_framelock->treeview); tree_selection_changed(selection, GTK_OBJECT(ctk_framelock)); - - /* enable the house sync controls */ - - gtk_widget_set_sensitive(ctk_framelock->sync_interval_frame, TRUE); - gtk_widget_set_sensitive(ctk_framelock->house_format_frame, TRUE); } ctk_framelock->framelock_enabled = enabled; + update_house_sync_controls (ctk_framelock); + ctk_config_statusbar_message(ctk_framelock->ctk_config, "FrameLock %s.", enabled ? "enabled" : "disabled"); @@ -2386,6 +2530,8 @@ static gboolean check_for_ethernet(gpointer user_data) gchar *display_name; gboolean valid; gint val; + + static gboolean first_error = TRUE; ctk_framelock = CTK_FRAMELOCK(user_data); model = GTK_TREE_MODEL(ctk_framelock->list_store); @@ -2399,23 +2545,27 @@ static gboolean check_for_ethernet(gpointer user_data) NvCtrlGetAttribute(handle, NV_CTRL_FRAMELOCK_ETHERNET_DETECTED, &val); if (val != NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_NONE) { - error_msg(ctk_framelock, "<span weight=\"bold\" size=\"larger\">" - "FrameLock RJ45 Error</span>\n\n" - "Either an Ethernet LAN cable is connected to the " - "framelock board on X Screen '%s' or the linked PC is " - "not turned on. " - "Either disconnect the LAN cable or turn on the linked " - "PC for proper operation.", - display_name); - - ctk_config_remove_timer(ctk_framelock->ctk_config, - (GSourceFunc) check_for_ethernet); - return FALSE; + + if (first_error) { + error_msg(ctk_framelock, "<span weight=\"bold\" " + "size=\"larger\">FrameLock RJ45 Error</span>\n\n" + "Either an Ethernet LAN cable is connected to the " + "framelock board on X Screen '%s' or the linked " + "PC is not turned on. Either disconnect the LAN " + "cable or turn on the linked PC for proper " + "operation.", + display_name); + } + first_error = FALSE; + + return TRUE; } valid = gtk_tree_model_iter_next(model, &iter); } + first_error = TRUE; + return TRUE; } @@ -2735,3 +2885,31 @@ GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *table) return b; } + + +void ctk_framelock_select(GtkWidget *w) +{ + CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w); + + /* Start the framelock timers */ + + ctk_config_start_timer(ctk_framelock->ctk_config, + (GSourceFunc) update_status); + + ctk_config_start_timer(ctk_framelock->ctk_config, + (GSourceFunc) check_for_ethernet); +} + + +void ctk_framelock_unselect(GtkWidget *w) +{ + CtkFramelock *ctk_framelock = CTK_FRAMELOCK(w); + + /* Stop the framelock timers */ + + ctk_config_stop_timer(ctk_framelock->ctk_config, + (GSourceFunc) update_status); + + ctk_config_stop_timer(ctk_framelock->ctk_config, + (GSourceFunc) check_for_ethernet); +} diff --git a/src/gtk+-2.x/ctkframelock.h b/src/gtk+-2.x/ctkframelock.h index e59bb49..11d7984 100644 --- a/src/gtk+-2.x/ctkframelock.h +++ b/src/gtk+-2.x/ctkframelock.h @@ -64,6 +64,8 @@ struct _CtkFramelock GtkWindow *parent_window; + GtkWidget *house_sync_frame; + GtkWidget *use_house_sync_button; GtkWidget *sync_interval_entry; GtkWidget *sync_interval_frame; @@ -115,6 +117,9 @@ GtkTextBuffer *ctk_framelock_create_help(GtkTextTagTable *); void ctk_framelock_config_file_attributes(GtkWidget *, ParsedAttribute *); +void ctk_framelock_select (GtkWidget *); +void ctk_framelock_unselect (GtkWidget *); + G_END_DECLS #endif /* __CTK_FRAMELOCK_H__ */ diff --git a/src/gtk+-2.x/ctkglx.c b/src/gtk+-2.x/ctkglx.c index ebd2754..906c9df 100644 --- a/src/gtk+-2.x/ctkglx.c +++ b/src/gtk+-2.x/ctkglx.c @@ -28,6 +28,8 @@ #include <gtk/gtk.h> #include <NvCtrlAttributes.h> +#include "glxinfo.h" /* xxx_abbrev functions */ + #include "glx_banner.h" #include "ctkglx.h" #include "ctkconfig.h" @@ -36,15 +38,6 @@ #include <GL/glx.h> /* GLX #defines */ - -/* Prototypes */ - -static void ctk_glx_probe_info(GtkWidget *widget, - GtkObject *old_parent, - gpointer data); - - - /* Number of FBConfigs attributes reported in gui */ #define NUM_FBCONFIG_ATTRIBS 30 @@ -208,7 +201,7 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle, GtkWidget *image; GtkWidget *frame; GtkWidget *hseparator; - GtkWidget *hbox, *hbox2; + GtkWidget *hbox; GtkWidget *vbox, *vbox2; GtkWidget *alignment; GtkWidget *table; @@ -286,7 +279,7 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle, /* Determine if GLX is supported */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_SERVER_VENDOR, - &glx_info_str ); + &glx_info_str); free(glx_info_str); if ( ret != NvCtrlSuccess ) { goto fail_glx_not_supported; @@ -468,12 +461,6 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle, gtk_widget_show_all(GTK_WIDGET(object)); - /* Set to probe for GLX info when widget is swapped in */ - ctk_glx->probe_handler_id = - g_signal_connect(G_OBJECT(ctk_glx), "parent-set", - G_CALLBACK(ctk_glx_probe_info), - (gpointer) ctk_glx); - return GTK_WIDGET(object); @@ -503,11 +490,9 @@ GtkWidget* ctk_glx_new(NvCtrlAttributeHandle *handle, /* Probes for GLX information and sets up the results * in the GLX widget. */ -static void ctk_glx_probe_info(GtkWidget *widget, - GtkObject *old_parent, - gpointer data) +void ctk_glx_probe_info(GtkWidget *widget) { - CtkGLX *ctk_glx = (CtkGLX *) data; + CtkGLX *ctk_glx = CTK_GLX(widget); ReturnStatus ret; @@ -532,18 +517,15 @@ static void ctk_glx_probe_info(GtkWidget *widget, GtkWidget *table; - /* Make sure the widget was initialized */ - if ( !ctk_glx || !ctk_glx->glxinfo_vpane || !ctk_glx->probe_handler_id ) { + /* Make sure the widget was initialized and that glx information + * has not yet been initialized. + */ + if ( !ctk_glx || !ctk_glx->glxinfo_vpane || + ctk_glx->glxinfo_initialized ) { return; } - /* Disconnect the handler */ - g_signal_handler_disconnect(G_OBJECT(ctk_glx), - ctk_glx->probe_handler_id); - ctk_glx->probe_handler_id = 0; - - /* Get GLX information */ ret = NvCtrlGetStringAttribute(ctk_glx->handle, NV_CTRL_STRING_GLX_DIRECT_RENDERING, @@ -718,7 +700,7 @@ static void ctk_glx_probe_info(GtkWidget *widget, /* Show the information */ gtk_widget_show_all(GTK_WIDGET(ctk_glx)); - + ctk_glx->glxinfo_initialized = True; /* Fall through */ done: diff --git a/src/gtk+-2.x/ctkglx.h b/src/gtk+-2.x/ctkglx.h index 56a47ae..2390ef1 100644 --- a/src/gtk+-2.x/ctkglx.h +++ b/src/gtk+-2.x/ctkglx.h @@ -59,7 +59,7 @@ struct _CtkGLX CtkConfig *ctk_config; GtkWidget *glxinfo_vpane; - int probe_handler_id; /* Signal handler ID */ + Bool glxinfo_initialized; }; struct _CtkGLXClass @@ -73,6 +73,9 @@ GtkWidget* ctk_glx_new (NvCtrlAttributeHandle *, GtkTextBuffer *ctk_glx_create_help(GtkTextTagTable *, CtkGLX *); +void ctk_glx_probe_info(GtkWidget *widget); + + G_END_DECLS #endif /* __CTK_GLX_H__ */ diff --git a/src/gtk+-2.x/ctkgvo.c b/src/gtk+-2.x/ctkgvo.c index ee0eff1..e06c7d7 100644 --- a/src/gtk+-2.x/ctkgvo.c +++ b/src/gtk+-2.x/ctkgvo.c @@ -169,8 +169,13 @@ static const FormatName videoFormatNames[] = { { NV_CTRL_GVO_VIDEO_FORMAT_1080P_25_00_SMPTE274, "1080p 25.00 Hz (SMPTE274)" }, { NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274, "1080p 29.97 Hz (SMPTE274)" }, { NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274, "1080p 30.00 Hz (SMPTE274)" }, - { NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274, "1080PsF 23.98 Hz (SMPTE274)" }, - { NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274, "1080PsF 24.00 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274, "1080i 47.96 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274, "1080i 48.00 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274, "1080PsF 25.00 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274, "1080PsF 29.97 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274, "1080PsF 30.00 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274, "1080PsF 24.00 Hz (SMPTE274)" }, + { NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274, "1080PsF 23.98 Hz (SMPTE274)" }, { -1, NULL }, }; @@ -643,16 +648,6 @@ static void output_data_format_changed(CtkDropDownMenu *menu, -static gboolean update_status(gpointer user_data) -{ - //CtkGvo *ctk_gvo = CTK_GVO(user_data); - - - return TRUE; -} - - - /* * update_sync_mode_menu() - given the COMPOSITE_SYNC and SDI_SYNC * values, set the sensitivity of each entry in sync_mode_menu. diff --git a/src/gtk+-2.x/ctkmultisample.c b/src/gtk+-2.x/ctkmultisample.c index 1d749af..131d57e 100644 --- a/src/gtk+-2.x/ctkmultisample.c +++ b/src/gtk+-2.x/ctkmultisample.c @@ -753,16 +753,20 @@ static void fsaa_update_received(GtkObject *object, CtkEventStruct *event_struct; CtkMultisample *ctk_multisample; GtkRange *range; + gint val; event_struct = (CtkEventStruct *) arg1; ctk_multisample = CTK_MULTISAMPLE(user_data); range = GTK_RANGE(ctk_multisample->fsaa_scale); + val = map_nv_ctrl_fsaa_value_to_slider(ctk_multisample, + event_struct->value); + g_signal_handlers_block_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), (gpointer) ctk_multisample); - gtk_range_set_value(range, event_struct->value); + gtk_range_set_value(range, val); g_signal_handlers_unblock_by_func(G_OBJECT(range), G_CALLBACK(fsaa_value_changed), diff --git a/src/gtk+-2.x/ctkrandr.c b/src/gtk+-2.x/ctkrandr.c index 12f712c..9077f0a 100644 --- a/src/gtk+-2.x/ctkrandr.c +++ b/src/gtk+-2.x/ctkrandr.c @@ -22,7 +22,7 @@ * */ -#include <stdlib.h> +#include <stdlib.h> /* malloc */ #include <gtk/gtk.h> #include <gdk/gdkx.h> #include <X11/Xlib.h> @@ -39,6 +39,7 @@ #include "rotate_right_off.h" #include "ctkevent.h" +#include "ctkhelp.h" #include "ctkrandr.h" @@ -405,8 +406,6 @@ GtkWidget* ctk_randr_new(NvCtrlAttributeHandle *handle, { GObject *object; CtkRandR *ctk_randr; - GtkWidget *alignment; - GtkWidget *button; Bool ret; /* NvCtrlxxx function return value */ int rotation_supported; diff --git a/src/gtk+-2.x/ctkthermal.c b/src/gtk+-2.x/ctkthermal.c index 9de4f6c..b3b4e4f 100644 --- a/src/gtk+-2.x/ctkthermal.c +++ b/src/gtk+-2.x/ctkthermal.c @@ -53,7 +53,8 @@ static const char *__ambient_temp_help = static const char *__temp_level_help = "This is a graphical representation of the current GPU core " -"temperature relative to the Core Slowdown Threshold."; +"temperature relative to the maximum GPU Core Slowdown " +"Threshold temperature."; GType ctk_thermal_get_type(void) { @@ -97,12 +98,6 @@ static gboolean update_thermal_info(gpointer user_data) return FALSE; } - ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient); - if (ret != NvCtrlSuccess) { - /* thermal information no longer available */ - return FALSE; - } - s = g_strdup_printf(" %d C ", core); gtk_label_set_text(GTK_LABEL(ctk_thermal->core_label), s); g_free(s); @@ -110,9 +105,16 @@ static gboolean update_thermal_info(gpointer user_data) ctk_gauge_set_current(CTK_GAUGE(ctk_thermal->core_gauge), core); ctk_gauge_draw(CTK_GAUGE(ctk_thermal->core_gauge)); - s = g_strdup_printf(" %d C ", ambient); - gtk_label_set_text(GTK_LABEL(ctk_thermal->ambient_label), s); - g_free(s); + if (ctk_thermal->ambient_label) { + ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient); + if (ret != NvCtrlSuccess) { + /* thermal information no longer available */ + return FALSE; + } + s = g_strdup_printf(" %d C ", ambient); + gtk_label_set_text(GTK_LABEL(ctk_thermal->ambient_label), s); + g_free(s); + } return TRUE; } @@ -128,6 +130,7 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, GtkWidget *eventbox, *entry; ReturnStatus ret; + gint trigger, ambient; gint core, upper; guint8 *image_buffer = NULL; const nv_image_t *img; @@ -152,6 +155,12 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, return NULL; } + ret = NvCtrlGetAttribute(handle, NV_CTRL_GPU_CORE_THRESHOLD, &trigger); + if (ret != NvCtrlSuccess) { + /* thermal information unavailable */ + return NULL; + } + /* create the CtkThermal object */ object = g_object_new(CTK_TYPE_THERMAL, NULL); @@ -216,7 +225,7 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, gtk_widget_set_sensitive(entry, FALSE); gtk_entry_set_width_chars(GTK_ENTRY(entry), 5); - s = g_strdup_printf(" %d ", upper); + s = g_strdup_printf(" %d ", trigger); gtk_entry_set_text(GTK_ENTRY(entry), s); g_free(s); @@ -253,25 +262,30 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, /* Ambient Temperature */ - hbox2 = gtk_hbox_new(FALSE, 0); - gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2, - GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); - - label = gtk_label_new("Ambient Temperature:"); - gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); - - frame = gtk_frame_new(NULL); - eventbox = gtk_event_box_new(); - gtk_container_add(GTK_CONTAINER(eventbox), frame); - gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 1, 2, - GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); - - label = gtk_label_new(NULL); - gtk_container_add(GTK_CONTAINER(frame), label); - ctk_thermal->ambient_label = label; - - ctk_config_set_tooltip(ctk_config, eventbox, __ambient_temp_help); + ret = NvCtrlGetAttribute(handle, NV_CTRL_AMBIENT_TEMPERATURE, &ambient); + if (ret == NvCtrlSuccess) { + hbox2 = gtk_hbox_new(FALSE, 0); + gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2, + GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); + + label = gtk_label_new("Ambient Temperature:"); + gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0); + + frame = gtk_frame_new(NULL); + eventbox = gtk_event_box_new(); + gtk_container_add(GTK_CONTAINER(eventbox), frame); + gtk_table_attach(GTK_TABLE(table), eventbox, 1, 2, 1, 2, + GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); + + label = gtk_label_new(NULL); + gtk_container_add(GTK_CONTAINER(frame), label); + ctk_thermal->ambient_label = label; + + ctk_config_set_tooltip(ctk_config, eventbox, __ambient_temp_help); + } else { + ctk_thermal->ambient_label = NULL; + } /* GPU Core Temperature Gauge */ @@ -307,7 +321,8 @@ GtkWidget* ctk_thermal_new(NvCtrlAttributeHandle *handle, return GTK_WIDGET(ctk_thermal); } -GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table) +GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table, + CtkThermal *ctk_thermal) { GtkTextIter i; GtkTextBuffer *b; @@ -324,8 +339,10 @@ GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table) ctk_help_heading(b, &i, "Core Temperature"); ctk_help_para(b, &i, __core_temp_help); - ctk_help_heading(b, &i, "Ambient Temperature"); - ctk_help_para(b, &i, __ambient_temp_help); + if (ctk_thermal->ambient_label) { + ctk_help_heading(b, &i, "Ambient Temperature"); + ctk_help_para(b, &i, __ambient_temp_help); + } ctk_help_heading(b, &i, "Temperature Level"); ctk_help_para(b, &i, __temp_level_help); @@ -334,3 +351,23 @@ GtkTextBuffer *ctk_thermal_create_help(GtkTextTagTable *table) return b; } + +void ctk_thermal_start_timer(GtkWidget *widget) +{ + CtkThermal *ctk_thermal = CTK_THERMAL(widget); + + /* Start the thermal timer */ + + ctk_config_start_timer(ctk_thermal->ctk_config, + (GSourceFunc) update_thermal_info); +} + +void ctk_thermal_stop_timer(GtkWidget *widget) +{ + CtkThermal *ctk_thermal = CTK_THERMAL(widget); + + /* Stop the thermal timer */ + + ctk_config_stop_timer(ctk_thermal->ctk_config, + (GSourceFunc) update_thermal_info); +} diff --git a/src/gtk+-2.x/ctkthermal.h b/src/gtk+-2.x/ctkthermal.h index cac4c66..0cb0bbb 100644 --- a/src/gtk+-2.x/ctkthermal.h +++ b/src/gtk+-2.x/ctkthermal.h @@ -70,7 +70,10 @@ struct _CtkThermalClass GType ctk_thermal_get_type (void) G_GNUC_CONST; GtkWidget* ctk_thermal_new (NvCtrlAttributeHandle *, CtkConfig *); -GtkTextBuffer* ctk_thermal_create_help (GtkTextTagTable *); +GtkTextBuffer* ctk_thermal_create_help (GtkTextTagTable *, CtkThermal *); + +void ctk_thermal_start_timer (GtkWidget *); +void ctk_thermal_stop_timer (GtkWidget *); G_END_DECLS diff --git a/src/gtk+-2.x/ctkutils.c b/src/gtk+-2.x/ctkutils.c new file mode 100644 index 0000000..6436475 --- /dev/null +++ b/src/gtk+-2.x/ctkutils.c @@ -0,0 +1,52 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +#include <gtk/gtk.h> +#include "ctkutils.h" + +#include <stdlib.h> + + +void add_table_row(GtkWidget *table, + const gint row, + const gint value_alignment, + const gchar *name, + const gchar *value) +{ + GtkWidget *label; + + label = gtk_label_new(name); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row + 1, + GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + + if (value == NULL) + label = gtk_label_new("Unknown"); + else + label = gtk_label_new(value); + gtk_misc_set_alignment(GTK_MISC(label), value_alignment, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 1, 2, row, row + 1, + GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); +} + diff --git a/src/gtk+-2.x/ctkutils.h b/src/gtk+-2.x/ctkutils.h new file mode 100644 index 0000000..a58159b --- /dev/null +++ b/src/gtk+-2.x/ctkutils.h @@ -0,0 +1,38 @@ +/* + * nvidia-settings: A tool for configuring the NVIDIA X driver on Unix + * and Linux systems. + * + * Copyright (C) 2004 NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of Version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See Version 2 + * of the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the: + * + * Free Software Foundation, Inc. + * 59 Temple Place - Suite 330 + * Boston, MA 02111-1307, USA + * + */ + +#ifndef __CTK_UTILS_H__ +#define __CTK_UTILS_H__ + +#include <gtk/gtk.h> + + +G_BEGIN_DECLS + +void add_table_row(GtkWidget *, const gint, const gint, const gchar *, + const gchar *); + +G_END_DECLS + +#endif /* __CTK_UTILS_H__ */ diff --git a/src/gtk+-2.x/ctkwindow.c b/src/gtk+-2.x/ctkwindow.c index badeddc..a49f2d6 100644 --- a/src/gtk+-2.x/ctkwindow.c +++ b/src/gtk+-2.x/ctkwindow.c @@ -48,6 +48,7 @@ #include "ctkglx.h" #include "ctkmultisample.h" #include "ctkthermal.h" +#include "ctkclocks.h" #include "ctkdisplaydevice.h" #include "ctkdisplaydevice-crt.h" @@ -65,11 +66,15 @@ enum { CTK_WINDOW_WIDGET_COLUMN, CTK_WINDOW_HELP_COLUMN, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, + CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, + CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, CTK_WINDOW_NUM_COLUMNS }; typedef void (*config_file_attributes_func_t)(GtkWidget *, ParsedAttribute *); +typedef void (*select_widget_func_t)(GtkWidget *); +typedef void (*unselect_widget_func_t)(GtkWidget *); static void ctk_window_class_init(CtkWindowClass *); @@ -77,7 +82,9 @@ static void ctk_window_real_destroy(GtkObject *); static void add_page(GtkWidget *, GtkTextBuffer *, CtkWindow *, GtkTreeIter *, const gchar *, - config_file_attributes_func_t func); + config_file_attributes_func_t func, + select_widget_func_t load_func, + unselect_widget_func_t unload_func); static GtkWidget *create_quit_dialog(CtkWindow *ctk_window); @@ -220,12 +227,17 @@ static void tree_selection_changed(GtkTreeSelection *selection, GtkWidget *widget; GtkTextBuffer *help; + select_widget_func_t select_func; + unselect_widget_func_t unselect_func; + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, CTK_WINDOW_LABEL_COLUMN, &str, -1); gtk_tree_model_get(model, &iter, CTK_WINDOW_WIDGET_COLUMN, &widget, -1); gtk_tree_model_get(model, &iter, CTK_WINDOW_HELP_COLUMN, &help, -1); + gtk_tree_model_get(model, &iter, CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, + &select_func, -1); /* * remove the existing widget from the page viewer, if anything is @@ -238,15 +250,37 @@ static void tree_selection_changed(GtkTreeSelection *selection, ctk_window->page = NULL; } + /* Call the unselect func for the existing widget, if any */ + + if ( ctk_window->widget ) { + gtk_tree_model_get(model, &(ctk_window->iter), + CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, + &unselect_func, -1); + if ( unselect_func ) { + (*unselect_func)(ctk_window->widget); + } + } + + /* Pack the new widget */ + if (widget) { ctk_window->page = widget; gtk_box_pack_start(GTK_BOX(ctk_window->page_viewer), widget, TRUE, TRUE, 2); } + /* Call the select func for the new widget */ + + if (select_func) (*select_func)(widget); + /* update the help page */ ctk_help_set_page(CTK_HELP(ctk_window->ctk_help), help); + + /* Keep track of the selected widget */ + + ctk_window->iter = iter; + ctk_window->widget = widget; } /* tree_selection_changed() */ @@ -426,11 +460,14 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, /* create the tree model */ - ctk_window->tree_store = gtk_tree_store_new(CTK_WINDOW_NUM_COLUMNS, - G_TYPE_STRING, - G_TYPE_POINTER, - G_TYPE_POINTER, - G_TYPE_POINTER); + ctk_window->tree_store = + gtk_tree_store_new(CTK_WINDOW_NUM_COLUMNS, + G_TYPE_STRING, /* Label */ + G_TYPE_POINTER, /* Main widget */ + G_TYPE_POINTER, /* Help widget */ + G_TYPE_POINTER, /* Config file attr func */ + G_TYPE_POINTER, /* Load widget func */ + G_TYPE_POINTER); /* Unload widget func */ model = GTK_TREE_MODEL(ctk_window->tree_store); /* create the tree view */ @@ -516,7 +553,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, if (child) { help = ctk_color_correction_create_help(tag_table); add_page(child, help, ctk_window, &iter, - "X Server Color Correction", NULL); + "X Server Color Correction", NULL, NULL, NULL); } /* xvideo settings */ @@ -525,7 +562,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, if (child) { help = ctk_xvideo_create_help(tag_table, CTK_XVIDEO(child)); add_page(child, help, ctk_window, &iter, - "X Server XVideo Settings", NULL); + "X Server XVideo Settings", NULL, NULL, NULL); } /* randr settings */ @@ -534,7 +571,7 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, if (child) { help = ctk_randr_create_help(tag_table, CTK_RANDR(child)); add_page(child, help, ctk_window, &iter, - "Rotation Settings", NULL); + "Rotation Settings", NULL, NULL, NULL); } /* cursor shadow */ @@ -543,7 +580,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, if (child) { help = ctk_cursor_shadow_create_help(tag_table, CTK_CURSOR_SHADOW(child)); - add_page(child, help, ctk_window, &iter, "Cursor Shadow", NULL); + add_page(child, help, ctk_window, &iter, "Cursor Shadow", + NULL, NULL, NULL); } /* opengl settings */ @@ -551,7 +589,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, child = ctk_opengl_new(handles[i], ctk_config, ctk_event); if (child) { help = ctk_opengl_create_help(tag_table, CTK_OPENGL(child)); - add_page(child, help, ctk_window, &iter, "OpenGL Settings", NULL); + add_page(child, help, ctk_window, &iter, "OpenGL Settings", + NULL, NULL, NULL); } @@ -560,7 +599,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, child = ctk_glx_new(handles[i], ctk_config, ctk_event); if (child) { help = ctk_glx_create_help(tag_table, CTK_GLX(child)); - add_page(child, help, ctk_window, &iter, "OpenGL/GLX Information", NULL); + add_page(child, help, ctk_window, &iter, "OpenGL/GLX Information", + NULL, ctk_glx_probe_info, NULL); } @@ -570,16 +610,17 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, if (child) { help = ctk_multisample_create_help(tag_table, CTK_MULTISAMPLE(child)); - add_page(child, help, ctk_window, &iter, - "Antialiasing Settings", NULL); + add_page(child, help, ctk_window, &iter, "Antialiasing Settings", + NULL, NULL, NULL); } /* thermal information */ child = ctk_thermal_new(handles[i], ctk_config); if (child) { - help = ctk_thermal_create_help(tag_table); - add_page(child, help, ctk_window, &iter, "Thermal Monitor", NULL); + help = ctk_thermal_create_help(tag_table, CTK_THERMAL(child)); + add_page(child, help, ctk_window, &iter, "Thermal Monitor", + NULL, ctk_thermal_start_timer, ctk_thermal_stop_timer); } /* gvo (Graphics To Video Out) */ @@ -587,8 +628,17 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, child = ctk_gvo_new(handles[i], ctk_config); if (child) { help = ctk_gvo_create_help(tag_table); - add_page(child, help, ctk_window, &iter, - "Graphics to Video Out", NULL); + add_page(child, help, ctk_window, &iter, "Graphics to Video Out", + NULL, NULL, NULL); + } + + /* clocks (GPU overclocking) */ + + child = ctk_clocks_new(handles[i], ctk_config, ctk_event); + if (child) { + help = ctk_clocks_create_help(tag_table, CTK_CLOCKS(child)); + add_page(child, help, ctk_window, &iter, "Clock Frequencies", + NULL, ctk_clocks_select, NULL); } /* display devices */ @@ -616,7 +666,9 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, add_page(widget, ctk_framelock_create_help(tag_table), ctk_window, NULL, "FrameLock", - ctk_framelock_config_file_attributes); + ctk_framelock_config_file_attributes, + ctk_framelock_select, + ctk_framelock_unselect); break; } @@ -624,7 +676,8 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, add_page(GTK_WIDGET(ctk_window->ctk_config), ctk_config_create_help(tag_table), - ctk_window, NULL, "nvidia-settings Configuration", NULL); + ctk_window, NULL, "nvidia-settings Configuration", + NULL, NULL, NULL); /* * we're done with the current data in the parsed attribute list, @@ -665,7 +718,9 @@ GtkWidget *ctk_window_new(NvCtrlAttributeHandle **handles, gint num_handles, static void add_page(GtkWidget *widget, GtkTextBuffer *help, CtkWindow *ctk_window, GtkTreeIter *iter, - const gchar *label, config_file_attributes_func_t func) + const gchar *label, config_file_attributes_func_t func, + select_widget_func_t select_func, + unselect_widget_func_t unselect_func) { GtkTreeIter child_iter; @@ -683,7 +738,12 @@ static void add_page(GtkWidget *widget, GtkTextBuffer *help, gtk_tree_store_set(ctk_window->tree_store, &child_iter, CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN, func, -1); - + gtk_tree_store_set(ctk_window->tree_store, &child_iter, + CTK_WINDOW_SELECT_WIDGET_FUNC_COLUMN, + select_func, -1); + gtk_tree_store_set(ctk_window->tree_store, &child_iter, + CTK_WINDOW_UNSELECT_WIDGET_FUNC_COLUMN, + unselect_func, -1); } /* add_page() */ diff --git a/src/gtk+-2.x/ctkwindow.h b/src/gtk+-2.x/ctkwindow.h index a8c118f..3256b8e 100644 --- a/src/gtk+-2.x/ctkwindow.h +++ b/src/gtk+-2.x/ctkwindow.h @@ -75,6 +75,9 @@ struct _CtkWindow GtkWidget *quit_dialog; ParsedAttribute *attribute_list; + + GtkTreeIter iter; + GtkWidget *widget; }; struct _CtkWindowClass diff --git a/src/image_data/HOWTO-ADD-IMAGES b/src/image_data/HOWTO-ADD-IMAGES new file mode 100644 index 0000000..98523f6 --- /dev/null +++ b/src/image_data/HOWTO-ADD-IMAGES @@ -0,0 +1,20 @@ + +If I have a png, how do I build it into nvidia-settings? + + - Open the file in gimp: + - make sure the image is in RGB mode (check IMAGE-> Mode -> RGB) + - select the filetype as C-Source, and name the file <something>.h + - click OK, on the subsequent option page, select the following: + + [ ] Save Comment to File + [*] Use Glib Types (guint8*) + [ ] Use Macros instead of Struct + [*] use 1 Byte Run-Length-Encoding + [ ] Save alpha Channel (RGBA/RGB) + + Opacity: 100.0 + + - modify the header file, removing the struct declaration, + following the convention in other header files, like + big_banner_penguin.h. + diff --git a/src/image_data/Makefile.inc b/src/image_data/Makefile.inc index 1713a55..48d28df 100644 --- a/src/image_data/Makefile.inc +++ b/src/image_data/Makefile.inc @@ -30,9 +30,11 @@ SRC += \ image.c EXTRA_DIST += \ + HOWTO-ADD-IMAGES \ antialiasing_banner.h \ big_banner_bsd.h \ big_banner_penguin.h \ + big_banner_sun.h \ color_correction_banner.h \ configuration_banner.h \ frame_lock_banner.h \ @@ -76,5 +78,5 @@ EXTRA_DIST += \ rotation_orientation_horiz_flipped.h \ rotation_orientation_horiz.h \ rotation_orientation_vert_flipped.h \ - rotation_orientation_vert.h - + rotation_orientation_vert.h \ + clocks_banner.h diff --git a/src/image_data/big_banner_sun.h b/src/image_data/big_banner_sun.h new file mode 100644 index 0000000..158d0d3 --- /dev/null +++ b/src/image_data/big_banner_sun.h @@ -0,0 +1,2446 @@ +/* GIMP RGB C-Source image dump 1-byte-run-length-encoded (big_banner_sun.h) */ + +#include "image.h" + +static const nv_image_t big_banner_sun_image = { + 360, 110, 3, + "\377\376\376\376\333\376\376\376\5\231\236v\177\177\177jjkvvw\177\177\177" + "\202\205\205\206\202\212\212\214\7\220\220\217\217\216\224\223\223\224\227" + "\227\231\223\223\224\212\212\214\205\205\206\202\212\212\214\203\205\205" + "\206\2\212\212\214\223\223\224\210\227\227\231\2\217\216\224\205\205\206" + "\203\177\177\177\203\205\205\206\202\177\177\177\202vvw\6\177\177\177\205" + "\205\206\212\212\214\217\216\224\212\212\214\205\205\206\203\177\177\177" + "\10\205\205\206\212\212\214\217\216\224\223\223\224\217\216\224\212\212\214" + "\205\205\206\177\177\177\205vvw\202\177\177\177\5\205\205\206\212\212\214" + "\217\216\224\223\223\224\227\227\231\223\235\235\234\203\227\227\231\2\223" + "\223\224\217\216\224\202\212\212\214\202\205\205\206\1\177\177\177\202\205" + "\205\206\2\212\212\214\217\216\224\202\227\227\231\5\235\235\234\227\227" + "\231\217\216\224\212\212\214\217\216\224\204\223\223\224\1\217\216\224\202" + "\212\212\214\4\223\223\224\227\227\231\223\223\224\220\220\217\203\212\212" + "\214\3\217\216\224\223\223\224\217\216\224\202\212\212\214\205\227\227\231" + "\2\223\223\224\212\212\214\203\205\205\206\1\177\177\177\377\376\376\376" + "\333\376\376\376\6\244\246\230\177\177\177vvw\205\205\206\220\220\217\223" + "\223\224\202\227\227\231\6\235\235\234\240\240\241\245\245\247\253\252\253" + "\245\245\247\235\235\234\204\227\227\231\202\223\223\224\2\227\227\231\245" + "\245\247\202\253\252\253\203\245\245\247\203\253\252\253\5\240\240\241\217" + "\216\224\205\205\206\212\212\214\217\216\224\203\227\227\231\6\212\212\214" + "\205\205\206\177\177\177\205\205\206\212\212\214\227\227\231\202\240\240" + "\241\1\227\227\231\204\217\216\224\2\227\227\231\235\235\234\202\240\240" + "\241\3\227\227\231\212\212\214\205\205\206\202\177\177\177\202\205\205\206" + "\7\212\212\214\223\223\224\227\227\231\240\240\241\245\245\247\253\252\253" + "\255\255\260\230\261\261\260\203\255\255\260\3\253\252\253\245\245\247\240" + "\240\241\202\227\227\231\203\217\216\224\3\223\223\224\235\235\234\245\245" + "\247\203\253\252\253\3\240\240\241\227\227\231\240\240\241\205\245\245\247" + "\202\227\227\231\1\240\240\241\202\245\245\247\1\240\240\241\203\235\235" + "\234\5\240\240\241\245\245\247\235\235\234\227\227\231\240\240\241\204\253" + "\252\253\3\245\245\247\240\240\241\227\227\231\202\220\220\217\1\212\212" + "\214\377\376\376\376\332\376\376\376\16\307\322\237\215\216\206\177\177\177" + "\205\205\206\223\223\224\235\235\234\240\240\241\245\245\247\253\252\253" + "\255\255\260\261\261\260\267\267\272\264\264\265\255\255\260\202\245\245" + "\247\202\253\252\253\4\245\245\247\240\240\241\245\245\247\267\267\272\202" + "\274\274\274\203\267\267\272\203\274\274\274\2\255\255\260\235\235\234\202" + "\227\227\231\5\245\245\247\253\252\253\255\255\260\245\245\247\227\227\231" + "\202\217\216\224\5\227\227\231\245\245\247\255\255\260\264\264\265\255\255" + "\260\202\245\245\247\1\240\240\241\202\245\245\247\202\255\255\260\3\253" + "\252\253\240\240\241\223\223\224\203\217\216\224\6\223\223\224\235\235\234" + "\245\245\247\255\255\260\267\267\272\274\274\274\242\302\302\302\5\274\274" + "\274\267\267\272\264\264\265\255\255\260\245\245\247\203\240\240\241\3\245" + "\245\247\255\255\260\267\267\272\202\274\274\274\1\264\264\265\202\253\252" + "\253\1\264\264\265\204\267\267\272\3\255\255\260\245\245\247\255\255\260" + "\202\267\267\272\1\264\264\265\203\255\255\260\202\264\264\265\3\255\255" + "\260\245\245\247\264\264\265\203\274\274\274\6\267\267\272\264\264\265\255" + "\255\260\240\240\241\227\227\231\223\223\224\377\376\376\376\330\376\376" + "\376\14\364\367\350\325\343\240\244\246\230\177\177\177\205\205\206\223\223" + "\224\240\240\241\245\245\247\255\255\260\264\264\265\267\267\272\274\274" + "\274\202\306\306\310\1\273\273\302\202\264\264\265\202\267\267\272\4\264" + "\264\265\255\255\260\264\264\265\306\306\310\202\314\314\315\203\306\306" + "\310\202\314\314\315\6\306\306\310\267\267\272\245\245\247\240\240\241\255" + "\255\260\267\267\272\202\273\273\302\12\264\264\265\245\245\247\235\235\234" + "\240\240\241\253\252\253\273\273\302\306\306\310\302\302\302\273\273\302" + "\267\267\272\202\264\264\265\1\267\267\272\202\273\273\302\3\264\264\265" + "\245\245\247\235\235\234\202\227\227\231\5\240\240\241\253\252\253\264\264" + "\265\273\273\302\306\306\310\202\314\314\315\204\322\322\323\203\314\314" + "\315\206\306\306\310\204\314\314\315\225\322\322\323\5\321\321\313\314\314" + "\315\306\306\310\273\273\302\267\267\272\202\255\255\260\3\264\264\265\274" + "\274\274\306\306\310\202\314\314\315\4\306\306\310\273\273\302\267\267\272" + "\277\277\310\204\306\306\310\1\302\302\302\202\267\267\272\202\306\306\310" + "\1\302\302\302\203\273\273\302\202\302\302\302\3\274\274\274\267\267\272" + "\302\302\302\202\314\314\315\202\306\306\310\4\302\302\302\267\267\272\245" + "\245\247\227\227\231\377\376\376\376\331\376\376\376\1\307\322\237\202\205" + "\205\206\14\223\223\224\240\240\241\253\252\253\264\264\265\267\267\272\302" + "\302\302\306\306\310\314\314\315\322\322\323\305\305\315\277\277\310\302" + "\302\302\202\306\306\310\1\277\277\310\202\273\273\302\12\314\314\315\333" + "\333\333\327\327\327\324\324\332\316\316\326\322\322\323\327\327\327\333" + "\333\333\327\327\327\306\306\310\202\255\255\260\15\267\267\272\305\305\315" + "\316\316\326\312\312\322\273\273\302\255\255\260\245\245\247\253\252\253" + "\273\273\302\316\316\326\324\324\332\316\316\326\314\314\315\203\305\305" + "\315\202\312\312\322\12\277\277\310\255\255\260\245\245\247\240\240\241\245" + "\245\247\253\252\253\267\267\272\305\305\315\316\316\326\327\327\335\203" + "\333\333\333\10\327\327\335\324\324\332\322\322\323\314\314\315\306\306\310" + "\273\273\302\274\274\274\267\267\272\203\264\264\265\1\261\261\260\203\264" + "\264\265\202\267\267\272\6\273\273\302\302\302\302\314\314\315\322\322\323" + "\327\327\335\337\337\331\212\341\341\341\1\334\334\341\204\333\333\333\3" + "\337\337\331\341\341\341\337\337\331\202\333\333\333\3\316\316\326\305\305" + "\315\302\302\302\202\273\273\302\2\277\277\310\316\316\326\202\333\333\333" + "\4\327\327\327\306\306\310\277\277\310\316\316\326\203\322\322\323\2\324" + "\324\332\322\322\323\202\277\277\310\4\316\316\326\324\324\332\322\322\323" + "\312\312\322\202\314\314\315\5\322\322\323\316\316\326\306\306\310\302\302" + "\302\322\322\323\202\327\327\327\5\322\322\323\314\314\315\306\306\310\267" + "\267\272\245\245\247\377\376\376\376\331\376\376\376\21\231\232\217\177\177" + "\177\220\220\217\235\235\234\253\252\253\264\264\265\273\273\302\306\306" + "\310\314\314\315\322\322\323\333\333\333\324\324\332\314\314\315\305\305" + "\315\312\312\322\322\322\323\312\312\322\202\306\306\310\4\324\324\332\341" + "\341\341\341\341\346\334\334\341\202\327\327\335\23\341\341\341\345\345\346" + "\341\341\341\316\316\326\273\273\302\267\267\272\305\305\315\324\324\332" + "\334\334\341\327\327\335\305\305\315\263\263\277\255\255\260\263\263\277" + "\312\312\322\334\334\341\341\341\346\334\334\341\327\327\335\202\324\324" + "\332\202\327\327\335\23\316\316\326\273\273\302\255\255\260\245\245\247\255" + "\255\260\263\263\277\305\305\315\322\322\323\334\334\341\341\341\346\344" + "\344\351\345\345\346\341\341\346\334\334\341\324\324\332\312\312\322\302" + "\302\302\273\273\302\267\267\272\206\264\264\265\207\267\267\272\1\274\274" + "\274\202\273\273\302\7\302\302\302\306\306\310\314\314\315\322\322\323\333" + "\333\333\341\341\341\351\351\351\203\355\355\351\205\351\351\351\2\345\345" + "\346\344\344\351\202\341\341\346\202\345\345\346\202\351\351\351\4\345\345" + "\346\341\341\341\327\327\335\316\316\326\202\305\305\315\22\312\312\322\327" + "\327\335\341\341\346\345\345\346\341\341\341\324\324\332\312\312\322\327" + "\327\335\334\334\341\327\327\335\334\334\341\341\341\341\334\334\341\316" + "\316\326\312\312\322\327\327\335\341\341\341\334\334\341\202\324\324\332" + "\5\327\327\335\334\334\341\324\324\332\312\312\322\322\322\323\202\341\341" + "\341\5\333\333\333\327\327\327\322\322\323\306\306\310\264\264\265\377\376" + "\376\376\330\376\376\376\12\273\301\235\177\177\177\212\212\214\235\235\234" + "\253\252\253\264\264\265\302\302\302\306\306\310\322\322\323\327\327\335" + "\202\334\334\341\5\324\324\332\316\316\326\324\324\332\333\333\333\327\327" + "\335\202\312\312\322\1\327\327\335\202\351\351\355\7\344\344\351\341\341" + "\341\341\341\346\344\344\351\355\355\355\351\351\355\327\327\335\202\277" + "\277\310\14\316\316\326\341\341\346\351\351\355\341\341\346\316\316\326\273" + "\273\302\263\263\277\277\277\310\334\334\341\351\351\355\355\355\355\351" + "\351\355\204\344\344\351\11\334\334\341\305\305\315\263\263\277\255\255\260" + "\264\264\265\277\277\310\316\316\326\341\341\346\351\351\355\202\354\354" + "\361\6\351\351\355\344\344\351\334\334\341\322\322\323\306\306\310\273\273" + "\302\203\267\267\272\4\274\274\274\273\273\302\302\302\302\306\306\310\202" + "\314\314\315\3\322\322\323\324\324\332\327\327\327\202\327\327\335\203\327" + "\327\327\3\324\324\332\322\322\323\316\316\326\205\314\314\315\4\322\322" + "\323\327\327\335\341\341\341\351\351\351\202\361\361\361\1\365\365\361\203" + "\361\361\361\2\356\356\361\355\355\355\206\351\351\355\17\356\356\361\361" + "\361\361\356\356\361\351\351\351\341\341\346\327\327\335\316\316\326\324" + "\324\332\334\334\341\351\351\355\355\355\355\351\351\355\334\334\341\324" + "\324\332\334\334\341\203\341\341\346\24\346\346\355\351\351\351\327\327\335" + "\324\324\332\334\334\341\351\351\355\344\344\351\341\341\346\341\341\341" + "\341\341\346\344\344\351\334\334\341\322\322\323\334\334\341\351\351\351" + "\345\345\346\341\341\341\327\327\327\314\314\315\302\302\302\377\376\376" + "\376\330\376\376\376\26\220\220\217\205\205\206\223\223\224\245\245\247\264" + "\264\265\273\273\302\306\306\310\322\322\323\333\333\333\341\341\341\341" + "\341\346\333\333\333\324\324\332\327\327\335\341\341\346\334\334\341\324" + "\324\332\316\316\326\327\327\335\351\351\355\356\356\364\351\351\355\202" + "\344\344\351\1\351\351\355\202\361\361\361\1\327\327\335\202\305\305\315" + "\22\327\327\335\354\354\361\362\362\366\351\351\355\324\324\332\277\277\310" + "\263\263\277\312\312\322\346\346\355\362\362\366\365\365\365\360\360\365" + "\356\356\364\356\356\361\356\356\364\354\354\361\327\327\335\277\277\310" + "\202\263\263\277\4\277\277\310\327\327\335\351\351\355\361\361\361\202\365" + "\365\365\23\360\360\365\346\346\355\327\327\335\314\314\315\306\306\310\273" + "\273\302\274\274\274\273\273\302\302\302\302\305\305\315\322\322\323\327" + "\327\335\334\334\341\345\345\346\351\351\355\354\354\361\356\356\361\361" + "\361\361\360\360\365\204\362\362\366\1\360\360\365\202\361\361\361\7\356" + "\356\361\351\351\355\351\351\351\345\345\346\341\341\341\334\334\341\333" + "\333\333\203\327\327\327\6\327\327\335\341\341\346\351\351\355\361\361\361" + "\365\365\365\370\370\365\202\365\365\365\3\362\362\366\360\360\365\354\354" + "\361\202\351\351\355\203\354\354\361\1\356\356\361\202\365\365\365\15\362" + "\362\366\354\354\361\341\341\346\334\334\341\327\327\335\341\341\346\354" + "\354\361\365\365\365\362\362\366\344\344\351\327\327\335\344\344\351\351" + "\351\355\202\344\344\351\11\351\351\360\354\354\361\341\341\346\327\327\335" + "\341\341\346\356\356\361\354\354\361\351\351\351\346\346\355\202\351\351" + "\355\10\334\334\341\327\327\335\351\351\355\355\355\355\345\345\346\333\333" + "\333\322\322\323\306\306\310\377\376\376\376\327\376\376\376\21\256\263\231" + "\177\177\177\212\212\214\235\235\234\255\255\260\274\274\274\306\306\310" + "\322\322\323\333\333\333\341\341\346\344\344\351\341\341\346\327\327\335" + "\334\334\341\344\344\351\346\346\355\334\334\341\202\324\324\332\6\346\346" + "\355\362\362\366\356\356\364\351\351\355\346\346\355\351\351\360\202\365" + "\365\371\14\344\344\351\312\312\322\305\305\315\334\334\341\362\362\366\371" + "\371\371\362\362\366\334\334\341\305\305\315\273\273\302\316\316\326\354" + "\354\361\203\371\371\371\203\365\365\371\10\356\356\361\327\327\335\273\273" + "\302\263\263\277\277\277\310\324\324\332\346\346\355\365\365\371\203\371" + "\371\371\16\356\356\361\344\344\351\322\322\323\306\306\310\277\277\310\302" + "\302\302\306\306\310\314\314\315\322\322\323\334\334\341\345\345\346\355" + "\355\355\360\360\365\362\362\366\202\365\365\371\204\371\371\374\202\374" + "\372\374\205\371\371\374\203\365\365\371\7\362\362\366\360\360\365\356\356" + "\361\351\351\355\351\351\351\345\345\346\341\341\341\202\334\334\341\4\341" + "\341\341\344\344\351\356\356\361\365\365\371\203\371\371\371\202\365\365" + "\371\3\360\360\365\354\354\361\351\351\355\203\354\354\361\2\360\360\365" + "\365\365\371\202\371\371\371\2\365\365\365\351\351\360\202\341\341\346\6" + "\346\346\355\362\362\366\371\371\371\365\365\371\344\344\351\334\334\341" + "\202\351\351\360\11\344\344\354\346\346\355\356\356\364\362\362\366\344\344" + "\351\334\334\341\351\351\355\362\362\366\360\360\365\202\354\354\361\11\356" + "\356\361\351\351\355\334\334\341\341\341\346\355\355\355\351\351\351\341" + "\341\341\327\327\327\306\306\310\377\376\376\376\327\376\376\376\13\215\216" + "\206\205\205\206\227\227\231\245\245\247\264\264\265\302\302\302\314\314" + "\315\327\327\327\341\341\341\345\345\346\341\341\346\202\334\334\341\33\344" + "\344\351\351\351\355\344\344\351\327\327\335\324\324\332\341\341\346\360" + "\360\365\362\362\366\354\354\361\346\346\355\351\351\355\362\362\366\371" + "\371\374\346\346\355\316\316\326\312\312\322\334\334\341\365\365\371\374" + "\372\374\365\365\371\344\344\351\305\305\315\277\277\310\316\316\326\356" + "\356\361\374\372\374\374\374\372\202\371\371\371\202\374\372\374\2\354\354" + "\361\316\316\326\202\273\273\302\3\316\316\326\346\346\355\365\365\371\202" + "\374\372\374\15\374\374\372\365\365\371\346\346\355\324\324\332\305\305\315" + "\302\302\302\306\306\310\314\314\315\322\322\323\334\334\341\351\351\351" + "\354\354\361\360\360\365\202\362\362\366\204\365\365\371\202\371\371\374" + "\204\365\365\371\1\365\365\365\210\362\362\366\1\365\365\365\202\362\362" + "\366\13\360\360\365\361\361\361\355\355\355\351\351\355\351\351\351\345\345" + "\346\341\341\346\345\345\346\351\351\355\361\361\361\365\365\371\202\374" + "\372\374\"\371\371\374\365\365\371\360\360\365\351\351\355\344\344\351\346" + "\346\355\354\354\361\356\356\364\360\360\365\365\365\371\371\371\371\374" + "\372\374\371\371\371\360\360\365\351\351\360\344\344\354\351\351\360\365" + "\365\371\374\372\374\365\365\371\344\344\354\341\341\346\354\354\361\351" + "\351\360\346\346\355\351\351\355\360\360\365\365\365\371\346\346\355\334" + "\334\341\354\354\361\365\365\371\362\362\366\356\356\364\202\360\360\365" + "\7\346\346\355\334\334\341\345\345\346\355\355\355\341\341\341\327\327\327" + "\314\314\315\377\376\376\376\326\376\376\376\13\256\263\231\177\177\177\220" + "\220\217\240\240\241\261\261\260\274\274\274\314\314\315\324\324\332\334" + "\334\341\345\345\346\346\346\355\202\334\334\341\32\341\341\346\354\354\361" + "\351\351\355\334\334\341\324\324\332\334\334\341\356\356\361\362\362\366" + "\354\354\361\346\346\355\351\351\355\360\360\365\365\365\371\354\354\361" + "\316\316\326\312\312\322\341\341\346\365\365\371\374\374\374\371\371\374" + "\344\344\354\305\305\315\277\277\310\324\324\332\362\362\366\374\374\374" + "\203\374\372\374\10\374\374\374\365\365\371\344\344\351\305\305\315\273\273" + "\302\305\305\315\341\341\346\365\365\371\203\374\374\374\12\371\371\374\354" + "\354\361\334\334\341\314\314\315\277\277\310\306\306\310\314\314\315\327" + "\327\335\344\344\351\354\354\361\202\360\360\365\203\362\362\366\202\365" + "\365\371\4\365\365\365\362\362\366\361\361\361\355\355\355\202\351\351\351" + "\1\345\345\346\202\345\345\340\205\341\341\341\202\345\345\340\1\345\345" + "\346\202\351\351\351\3\351\351\355\355\355\355\356\356\361\203\361\361\361" + "\12\356\356\361\355\355\355\351\351\355\351\351\351\345\345\346\351\351\351" + "\351\351\355\362\362\366\371\371\374\374\374\374\202\371\371\374\2\365\365" + "\371\354\354\361\202\341\341\346\5\344\344\351\354\354\361\356\356\364\362" + "\362\366\371\371\371\202\374\374\374\31\365\365\371\356\356\364\351\351\360" + "\354\354\361\365\365\371\374\374\374\371\371\371\346\346\355\344\344\354" + "\356\356\364\351\351\360\344\344\354\346\346\355\360\360\365\365\365\371" + "\346\346\355\341\341\346\354\354\361\365\365\371\362\362\366\360\360\365" + "\362\362\366\360\360\365\341\341\346\327\327\335\202\345\345\346\2\333\333" + "\333\314\314\315\377\376\376\376\325\376\376\376\14\332\337\264\215\216\206" + "\205\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323" + "\333\333\333\341\341\346\351\351\351\341\341\346\202\334\334\341\3\351\351" + "\355\356\356\361\341\341\346\202\327\327\335\3\351\351\355\362\362\366\356" + "\356\364\202\351\351\355\7\354\354\361\365\365\371\354\354\361\324\324\332" + "\305\305\315\334\334\341\371\371\371\202\376\376\376\6\354\354\361\312\312" + "\322\277\277\310\316\316\326\362\362\366\376\376\376\203\374\374\374\24\376" + "\376\376\371\371\374\334\334\341\277\277\310\273\273\302\316\316\326\354" + "\354\361\374\372\374\376\376\376\376\376\374\376\376\376\371\371\374\346" + "\346\355\316\316\326\306\306\310\302\302\302\314\314\315\327\327\327\351" + "\351\351\360\360\365\202\362\362\366\10\361\361\361\362\362\366\365\365\365" + "\365\365\371\365\365\365\361\361\361\355\355\355\351\351\351\202\345\345" + "\340\220\337\337\331\202\345\345\340\1\352\352\343\202\355\355\351\1\355" + "\355\355\203\361\361\361\20\356\356\361\355\355\355\351\351\355\351\351\351" + "\351\351\355\356\356\361\365\365\371\376\376\376\374\374\376\371\371\374" + "\365\365\371\354\354\361\341\341\346\327\327\335\334\334\341\351\351\360" + "\202\356\356\364\1\371\371\371\202\376\376\376\24\371\371\374\360\360\365" + "\354\354\361\360\360\365\374\372\374\376\376\376\371\371\371\344\344\351" + "\351\351\355\356\356\364\346\346\355\344\344\351\346\346\355\360\360\365" + "\371\371\374\346\346\355\341\341\346\362\362\366\371\371\374\365\365\371" + "\202\362\362\366\6\351\351\360\327\327\335\333\333\333\341\341\341\333\333" + "\333\314\314\315\377\376\376\376\325\376\376\376\11\256\263\231\177\177\177" + "\220\220\217\240\240\241\261\261\260\273\273\302\314\314\315\327\327\327" + "\341\341\341\202\345\345\346\202\334\334\341\13\346\346\355\360\360\365\351" + "\351\355\334\334\341\327\327\335\341\341\346\360\360\365\362\362\366\354" + "\354\361\351\351\355\354\354\361\202\362\362\366\4\327\327\335\305\305\315" + "\327\327\335\365\365\371\202\376\376\376\5\365\365\371\324\324\332\277\277" + "\310\316\316\326\356\356\364\205\376\376\376\2\371\371\374\334\334\341\202" + "\277\277\310\2\327\327\335\362\362\366\204\376\376\376\21\365\365\371\341" + "\341\346\312\312\322\306\306\310\314\314\315\327\327\327\351\351\351\360" + "\360\365\365\365\371\365\365\365\362\362\366\365\365\365\365\365\371\365" + "\365\365\361\361\361\355\355\355\351\351\351\206\345\345\340\203\352\352" + "\343\1\355\355\351\211\361\361\354\202\355\355\351\206\352\352\343\1\355" + "\355\351\202\361\361\354\203\361\361\361\203\355\355\355\4\356\356\361\365" + "\365\371\374\374\376\376\376\376\202\371\371\374\2\356\356\364\341\341\346" + "\202\327\327\335!\341\341\346\354\354\361\360\360\365\362\362\366\374\374" + "\376\376\376\376\374\372\374\365\365\371\360\360\365\365\365\371\374\374" + "\376\376\376\376\365\365\371\344\344\354\351\351\360\356\356\364\344\344" + "\354\344\344\351\351\351\355\362\362\366\365\365\371\346\346\355\344\344" + "\351\365\365\371\371\371\374\365\365\371\362\362\366\356\356\364\344\344" + "\351\324\324\332\334\334\341\333\333\333\314\314\315\377\376\376\376\325" + "\376\376\376\27\215\216\206\205\205\206\227\227\231\253\252\253\267\267\272" + "\306\306\310\322\322\323\333\333\333\341\341\346\344\344\351\341\341\341" + "\334\334\341\341\341\346\356\356\361\356\356\364\341\341\346\327\327\335" + "\334\334\341\354\354\361\360\360\365\354\354\361\351\351\360\354\354\361" + "\202\362\362\366\4\341\341\346\312\312\322\324\324\332\365\365\371\202\376" + "\376\376\5\371\371\374\334\334\341\277\277\310\312\312\322\351\351\360\205" + "\376\376\376\6\365\365\371\334\334\341\273\273\302\305\305\315\341\341\346" + "\371\371\374\204\376\376\376\2\360\360\365\327\327\335\202\306\306\310\3" + "\322\322\323\341\341\346\362\362\366\205\365\365\371\4\365\365\365\361\361" + "\361\351\351\351\352\352\343\203\345\345\340\5\352\352\343\357\357\346\361" + "\361\354\365\365\361\370\370\365\202\371\371\371\2\374\374\372\374\374\374" + "\211\376\376\376\1\376\376\374\202\374\374\372\3\371\371\371\370\370\365" + "\365\365\361\202\361\361\354\202\357\357\346\1\355\355\351\202\361\361\354" + "\203\361\361\361\203\355\355\355\16\362\362\366\371\371\374\376\376\376\374" + "\372\374\371\371\374\360\360\365\334\334\341\322\322\323\316\316\326\334" + "\334\341\351\351\360\356\356\364\362\362\366\374\372\374\202\376\376\376" + "\3\371\371\374\365\365\371\371\371\374\202\376\376\376\4\362\362\366\344" + "\344\354\354\354\361\351\351\360\202\341\341\346\16\346\346\355\362\362\366" + "\365\365\371\344\344\351\346\346\355\365\365\371\371\371\374\365\365\371" + "\362\362\366\351\351\355\327\327\335\322\322\323\327\327\327\314\314\315" + "\377\376\376\376\324\376\376\376\13\256\263\231\177\177\177\220\220\217\240" + "\240\241\261\261\260\273\273\302\314\314\315\324\324\332\341\341\341\344" + "\344\351\341\341\341\202\334\334\341\3\354\354\361\362\362\366\351\351\355" + "\202\327\327\335\13\344\344\351\360\360\365\356\356\364\354\354\361\351\351" + "\360\356\356\364\362\362\366\344\344\351\312\312\322\324\324\332\360\360" + "\365\203\376\376\376\7\346\346\355\305\305\315\312\312\322\346\346\355\374" + "\374\376\376\376\376\374\374\376\202\376\376\376\6\365\365\371\327\327\335" + "\277\277\310\312\312\322\354\354\361\374\374\376\204\376\376\376\6\354\354" + "\361\322\322\323\306\306\310\314\314\315\334\334\341\356\356\364\202\371" + "\371\374\203\371\371\371\3\365\365\365\355\355\355\352\352\343\202\345\345" + "\340\10\352\352\343\357\357\346\361\361\354\365\365\361\370\370\365\374\372" + "\374\374\374\374\374\374\376\224\376\376\376\4\376\376\374\374\374\372\370" + "\370\365\365\365\361\205\361\361\354\202\361\361\361\203\355\355\355\16\356" + "\356\361\365\365\371\376\376\376\374\374\376\371\371\374\362\362\366\334" + "\334\341\316\316\326\312\312\322\324\324\332\344\344\351\354\354\361\362" + "\362\366\374\372\374\202\376\376\376\3\371\371\374\365\365\371\371\371\374" + "\202\376\376\376\4\360\360\365\344\344\354\354\354\361\344\344\354\202\341" + "\341\346\1\351\351\355\202\362\362\366\2\341\341\346\351\351\355\202\365" + "\365\371\6\362\362\366\354\354\361\341\341\346\312\312\322\316\316\326\314" + "\314\315\367\376\376\376\2\360\255p\361\266\177\332\376\376\376\12\215\216" + "\206\205\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322" + "\323\333\333\333\341\341\346\344\344\351\202\334\334\341\1\344\344\351\202" + "\360\360\365\15\341\341\346\324\324\332\334\334\341\351\351\360\360\360\365" + "\354\354\361\351\351\360\354\354\361\360\360\365\346\346\355\324\324\332" + "\312\312\322\346\346\355\203\376\376\376\16\360\360\365\316\316\326\277\277" + "\310\334\334\341\371\371\374\376\376\376\374\372\374\374\374\376\376\376" + "\376\371\371\371\327\327\335\277\277\310\312\312\322\354\354\361\205\376" + "\376\376\6\354\354\361\324\324\332\306\306\310\322\322\323\341\341\346\365" + "\365\371\202\374\374\376\202\371\371\374\3\365\365\371\361\361\361\355\355" + "\351\202\345\345\340\202\352\352\343\3\355\355\351\361\361\361\365\365\361" + "\235\365\365\365\3\361\361\361\361\361\354\355\355\351\203\352\352\343\204" + "\351\351\351\17\351\351\355\356\356\361\365\365\371\376\376\376\374\372\374" + "\371\371\374\360\360\365\334\334\341\312\312\322\305\305\315\316\316\326" + "\341\341\346\354\352\362\362\362\366\371\371\374\202\376\376\376\5\374\372" + "\374\371\371\374\374\374\376\376\376\376\374\374\376\202\351\351\360\11\354" + "\354\361\341\341\346\334\334\341\341\341\346\351\351\355\365\365\371\356" + "\356\364\341\341\346\354\354\361\202\365\365\371\3\356\356\361\345\345\346" + "\322\322\323\202\306\306\310\370\376\376\376\3\356\244`\352\2110\371\343" + "\316\217\376\376\376\1\373\354\336\307\376\376\376\13\273\301\235\177\177" + "\177\220\220\217\240\240\241\261\261\260\273\273\302\314\314\315\327\327" + "\327\334\334\341\344\344\351\341\341\341\202\334\334\341\3\356\356\361\365" + "\365\371\351\351\355\202\327\327\335\1\344\344\351\202\356\356\364\202\354" + "\354\361\6\356\356\364\354\354\361\327\327\335\312\312\322\334\334\341\374" + "\372\374\202\376\376\376\6\365\365\371\324\324\332\277\277\310\324\324\332" + "\362\362\366\374\374\376\202\371\371\374\6\376\376\376\371\371\374\334\334" + "\341\277\277\310\312\312\322\354\354\361\204\376\376\376\7\374\374\376\351" + "\351\355\322\322\323\314\314\315\327\327\335\351\351\355\371\371\374\202" + "\376\376\376\4\374\374\376\371\371\374\365\365\365\355\355\351\204\352\352" + "\343\1\326\343z\205\343\346\177\204\342\346x\1\351\352u\203\343\352l\3\336" + "\351g\332\352b\332\344`\203\324\344V\203\316\350Q\202\312\346M\203\304\341" + "M\215\275\333G\23\271\326C\315\333}\341\341\341\345\345\346\351\351\351\354" + "\354\361\365\365\371\374\372\374\374\374\376\371\371\374\360\360\365\327" + "\327\335\305\305\315\277\277\310\312\312\322\334\334\341\354\352\362\360" + "\360\365\371\371\374\202\376\376\376\202\374\374\376\202\376\376\376\4\365" + "\365\371\344\344\354\354\354\361\346\346\355\202\334\334\341\12\341\341\346" + "\354\354\361\365\365\371\351\351\355\341\341\346\360\360\365\365\365\371" + "\356\356\364\351\351\355\327\327\335\202\302\302\302\371\376\376\376\3\352" + "\2110\347x\20\371\343\316\216\376\376\376\1\355\233P\307\376\376\376\12\231" + "\232\217\205\205\206\227\227\231\245\245\247\264\264\265\302\302\302\316" + "\316\326\333\333\333\341\341\346\344\344\351\202\334\334\341\10\346\346\355" + "\365\365\371\360\360\365\334\334\341\324\324\332\334\334\341\354\354\361" + "\360\360\365\202\354\354\361\6\356\356\364\354\354\361\334\334\341\312\312" + "\322\324\324\332\365\365\371\203\376\376\376\4\341\341\346\277\277\310\312" + "\312\322\351\351\360\203\371\371\374\6\374\374\376\371\371\371\334\334\341" + "\277\277\310\316\316\326\360\360\365\205\376\376\376\5\346\346\355\322\322" + "\323\314\314\315\334\334\341\365\365\365\204\376\376\376\2\371\371\371\361" + "\361\354\202\352\352\343\1\357\357\346\202\365\365\361\3\352\352\343\315" + "\333}\373\370\226\204\357\354\205\204\353\352\177\205\351\352u\202\343\352" + "l\4\340\360u\336\360s\333\356m\336\351g\202\326\354c\202\322\354]\202\320" + "\352Y\203\311\350T\202\304\341M\203\275\333G\2\271\333@\271\326C\202\264" + "\322@\202\261\3217\24\246\306(\274\320e\322\322\323\337\337\331\345\345\346" + "\351\351\355\355\355\355\360\360\365\374\372\374\374\374\376\371\371\374" + "\360\360\365\324\324\332\305\305\315\277\277\310\305\305\315\327\327\335" + "\346\346\355\360\360\365\371\371\374\206\376\376\376\4\360\360\365\346\346" + "\355\354\352\362\344\344\351\202\334\334\341\3\341\341\346\356\356\364\365" + "\365\371\202\344\344\351\6\362\362\366\360\360\365\351\351\355\334\334\341" + "\306\306\310\267\267\272\371\376\376\376\4\366\321\256\345o\0\347x\20\371" + "\343\316\215\376\376\376\2\365\310\236\355\233P\305\376\376\376\20\312\316" + "\253\205\205\206\212\212\214\235\235\234\255\255\260\274\274\274\314\314" + "\315\327\327\327\334\334\341\344\344\351\341\341\341\334\334\341\341\341" + "\346\360\360\365\365\365\371\351\351\355\202\327\327\335\3\344\344\351\360" + "\360\365\356\356\364\202\354\354\361\5\356\356\364\344\344\354\316\316\326" + "\312\312\322\351\351\355\203\376\376\376\4\362\362\366\312\312\322\305\305" + "\315\334\334\341\203\365\365\371\202\371\371\374\4\344\344\351\305\305\315" + "\312\312\322\360\360\365\205\376\376\376\5\354\354\361\322\322\323\314\314" + "\315\341\341\341\365\365\371\204\376\376\376\2\365\365\365\355\355\351\202" + "\352\352\343\7\361\361\354\370\370\365\376\376\376\371\371\371\345\345\340" + "\274\320e\373\370\226\206\353\352\177\205\351\352u\202\343\352l\203\336\351" + "g\203\332\352b\202\324\351^\202\320\352Y\1\320\350U\203\311\350T\203\304" + "\341M\204\275\333G\203\271\326C\202\264\322@\6\256\3170\274\320e\302\302" + "\302\322\322\323\341\341\341\345\345\346\202\351\351\355\15\362\362\366\374" + "\372\374\376\376\376\371\371\374\351\351\360\316\316\326\277\277\310\273" + "\273\302\277\277\310\327\327\335\351\351\360\360\360\365\374\372\374\205" + "\376\376\376\1\374\374\376\202\351\351\360\16\346\346\355\334\334\341\327" + "\327\335\334\334\341\344\344\351\362\362\366\356\356\364\341\341\346\351" + "\351\360\360\360\365\351\351\355\341\341\341\316\316\326\267\267\272\372" + "\376\376\376\202\345o\0\1\352\2110\216\376\376\376\2\345o\0\370\332\276\304" + "\376\376\376\12\244\246\230\205\205\206\223\223\224\245\245\247\264\264\265" + "\302\302\302\314\314\315\327\327\335\341\341\346\345\345\346\202\334\334" + "\341\20\354\354\361\365\365\371\362\362\366\341\341\346\324\324\332\334\334" + "\341\351\351\360\360\360\365\356\356\361\354\354\361\356\356\364\351\351" + "\360\327\327\335\305\305\315\341\341\346\374\372\374\202\376\376\376\15\374" + "\372\374\334\334\341\277\277\310\324\324\332\354\354\361\365\365\371\362" + "\362\366\365\365\371\371\371\374\351\351\360\312\312\322\305\305\315\354" + "\354\361\205\376\376\376\5\361\361\361\327\327\327\322\322\323\341\341\341" + "\365\365\371\203\376\376\376\7\374\374\374\365\365\361\357\357\346\352\352" + "\343\357\357\346\370\370\365\374\374\372\202\376\376\376\4\365\365\365\337" + "\337\331\274\320e\373\370\226\203\357\354\205\203\353\352\177\205\351\352" + "u\203\343\352l\203\336\351g\1\332\352b\202\326\354_\1\322\354]\202\320\352" + "Y\1\320\350U\202\311\350T\1\312\346M\203\304\341M\202\275\333G\2\271\333" + "@\275\333G\203\271\326C\202\264\322@\7\256\3170\256\302]\264\264\265\314" + "\314\315\333\333\333\345\345\346\351\351\351\202\351\351\355\6\362\362\366" + "\374\372\374\374\374\376\365\365\371\346\346\355\312\312\322\202\273\273" + "\302\5\277\277\310\327\327\335\351\351\360\360\360\365\374\372\374\205\376" + "\376\376\4\365\365\371\346\346\355\351\351\360\341\341\346\202\327\327\335" + "\5\334\334\341\344\344\354\362\362\366\346\346\355\341\341\346\202\351\351" + "\355\3\341\341\346\324\324\332\273\273\302\345\376\376\376\4\361\266\177" + "\356\244`\363\277\216\371\343\316\221\376\376\376\203\345o\0\1\366\321\256" + "\215\376\376\376\202\352\2110\304\376\376\376\17\215\216\206\212\212\214" + "\235\235\234\253\252\253\267\267\272\306\306\310\322\322\323\333\333\333" + "\345\345\346\341\341\341\327\327\335\341\341\346\365\365\371\371\371\374" + "\354\354\361\202\327\327\335\1\341\341\346\202\356\356\364\7\354\354\361" + "\356\356\364\354\354\361\341\341\346\312\312\322\324\324\332\365\365\371" + "\203\376\376\376\1\354\354\361\202\305\305\315\1\344\344\354\203\362\362" + "\366\5\365\365\371\356\356\361\316\316\326\305\305\315\344\344\351\205\376" + "\376\376\5\361\361\361\333\333\333\322\322\323\345\345\346\371\371\371\203" + "\376\376\376\6\374\374\374\365\365\361\357\357\346\352\352\343\361\361\354" + "\371\371\371\202\376\376\376\6\374\374\374\371\371\371\361\361\361\333\333" + "\333\256\302]\373\370\226\205\376\376\212\202\374\374z\1\360\362x\203\351" + "\352u\203\343\352l\202\336\351g\202\332\352b\202\324\351^\1\322\354]\202" + "\320\352Y\203\311\350T\204\304\341M\202\275\333G\2\271\326C\271\333@\202" + "\271\326C\203\264\322@\6\256\3170\256\302]\261\261\260\314\314\315\333\333" + "\333\345\345\346\203\351\351\351\2\351\351\355\360\360\365\202\374\374\376" + "\3\365\365\371\344\344\351\305\305\315\202\263\263\277\5\277\277\310\327" + "\327\335\351\351\360\362\362\366\374\374\376\205\376\376\376\1\356\356\364" + "\202\346\346\355\1\334\334\341\202\327\327\335\3\334\334\341\351\351\355" + "\360\360\365\202\341\341\346\4\351\351\355\341\341\346\327\327\327\302\302" + "\302\346\376\376\376\5\370\332\276\353\222@\345o\0\350\200\40\365\310\236" + "\217\376\376\376\203\345o\0\1\356\244`\215\376\376\376\3\350\200\40\345o" + "\0\371\343\316\302\376\376\376\12\273\301\235\177\177\177\220\220\217\245" + "\245\247\261\261\260\302\302\302\314\314\315\324\324\332\341\341\341\345" + "\345\346\202\334\334\341\17\354\354\361\371\371\374\365\365\371\344\344\351" + "\324\324\332\334\334\341\351\351\355\356\356\364\356\356\361\354\354\361" + "\356\356\364\344\344\354\316\316\326\312\312\322\351\351\355\203\376\376" + "\376\5\365\365\371\324\324\332\277\277\310\327\327\335\356\356\364\202\360" + "\360\365\5\362\362\366\356\356\364\324\324\332\305\305\315\344\344\351\205" + "\376\376\376\5\365\365\371\333\333\333\322\322\323\345\345\346\371\371\371" + "\203\376\376\376\16\371\371\371\361\361\354\352\352\343\357\357\346\370\370" + "\365\374\374\372\376\376\376\374\374\376\371\371\371\365\365\365\361\361" + "\361\341\341\341\302\302\302z\200Y\203\\\\^\5jjkz\200Y\231\236v\273\306t" + "\342\346x\203\374\374z\2\360\362x\343\352l\204\336\351g\4\332\352b\326\354" + "_\324\351^\322\354]\202\320\352Y\1\320\350U\203\311\350T\203\304\341M\203" + "\275\333G\204\271\326C\203\264\322@\10\256\3170\256\302]\253\252\253\314" + "\314\315\345\345\346\355\355\355\351\351\351\345\345\346\202\344\344\351" + "\2\351\351\355\362\362\366\202\374\374\376\3\365\365\371\334\334\341\273" + "\273\302\202\263\263\277\4\277\277\310\327\327\335\351\351\360\365\365\371" + "\205\376\376\376\4\371\371\374\351\351\355\351\351\360\341\341\346\202\324" + "\324\332\5\327\327\335\334\334\341\354\354\361\351\351\355\334\334\341\202" + "\341\341\346\2\327\327\335\306\306\310\350\376\376\376\1\356\244`\202\345" + "o\0\2\352\2110\373\354\336\214\376\376\376\1\365\310\236\203\345o\0\1\353" + "\222@\214\376\376\376\1\373\354\336\202\345o\0\1\361\266\177\302\376\376" + "\376\10\244\246\230\205\205\206\227\227\231\253\252\253\267\267\272\306\306" + "\310\322\322\323\327\327\335\202\341\341\346\10\334\334\341\341\341\346\365" + "\365\371\374\374\376\362\362\366\334\334\341\327\327\335\341\341\346\202" + "\356\356\364\7\354\354\361\356\356\364\354\354\361\334\334\341\305\305\315" + "\327\327\335\371\371\371\203\376\376\376\4\344\344\351\277\277\310\312\312" + "\322\344\344\351\202\356\356\364\202\360\360\365\4\334\334\341\305\305\315" + "\324\324\332\371\371\371\204\376\376\376\5\376\376\374\345\345\346\327\327" + "\327\341\341\341\365\365\365\203\376\376\376\17\374\372\374\361\361\354\352" + "\352\343\357\357\346\370\370\365\374\374\374\371\371\371\355\355\355\322" + "\322\323\261\261\260\212\212\214jjkIILvvwIIL\207557\5IIL\\\\^z\200Y\274\320" + "e\346\374f\202\370\376k\202\336\351g\202\332\352b\202\324\351^\203\320\352" + "Y\203\311\350T\1\312\346M\203\304\341M\203\275\333G\1\271\333@\203\271\326" + "C\202\264\322@\12\271\326C\256\3170\256\302]\253\252\253\314\314\315\351" + "\351\351\365\365\365\361\361\361\351\351\351\345\345\346\202\344\344\351" + "\6\351\351\355\365\365\371\376\376\376\374\374\376\356\356\364\312\312\322" + "\203\263\263\277\4\277\277\310\341\341\346\356\356\364\371\371\374\205\376" + "\376\376\4\360\360\365\351\351\360\346\346\355\327\327\335\202\324\324\332" + "\10\327\327\335\341\341\346\356\356\361\341\341\346\327\327\335\341\341\341" + "\327\327\335\314\314\315\351\376\376\376\1\352\2110\202\345o\0\1\347x\20" + "\214\376\376\376\1\352\2110\204\345o\0\214\376\376\376\1\360\255p\202\345" + "o\0\1\353\222@\302\376\376\376\11\215\216\206\212\212\214\240\240\241\255" + "\255\260\274\274\274\314\314\315\324\324\332\334\334\341\344\344\351\202" + "\334\334\341\1\354\354\361\202\371\371\374\5\351\351\360\327\327\335\334" + "\334\341\351\351\355\356\356\364\202\354\354\361\5\356\356\364\344\344\354" + "\316\316\326\312\312\322\354\354\361\203\376\376\376\5\365\365\371\316\316" + "\326\277\277\310\327\327\335\351\351\360\202\356\356\364\5\360\360\365\341" + "\341\346\305\305\315\316\316\326\360\360\365\205\376\376\376\4\356\356\361" + "\333\333\333\341\341\341\365\365\361\203\376\376\376\12\374\372\374\361\361" + "\354\352\352\343\357\357\346\365\365\365\351\351\355\306\306\310\212\212" + "\214IIL!\"!\204\0\0\0\5IILjjk\177\177\177vvwjjk\202\\\\^\1IIL\202557\202" + "IIL\4\\\\^jjkz\200Y\305\327T\202\370\376k\4\332\344`\324\351^\326\354_\324" + "\351^\202\320\352Y\1\320\350U\203\311\350T\204\304\341M\203\275\333G\204" + "\271\326C\202\264\322@\12\271\326C\256\3170\232\256S\245\245\247\314\314" + "\315\351\351\351\371\371\371\376\376\376\362\362\366\351\351\351\202\341" + "\341\346\7\344\344\351\351\351\360\371\371\374\374\374\376\371\371\374\344" + "\344\354\305\305\315\203\263\263\277\4\305\305\315\344\344\354\360\360\365" + "\371\371\374\204\376\376\376\1\371\371\374\202\351\351\360\1\341\341\346" + "\203\324\324\332\3\327\327\335\346\346\355\351\351\355\202\327\327\335\2" + "\327\327\327\314\314\315\351\376\376\376\1\365\310\236\203\345o\0\1\353\222" + "@\212\376\376\376\1\363\277\216\205\345o\0\213\376\376\376\1\370\332\276" + "\203\345o\0\1\353\222@\301\376\376\376\10\273\301\235\177\177\177\223\223" + "\224\245\245\247\264\264\265\302\302\302\314\314\315\327\327\327\202\341" + "\341\346\10\334\334\341\341\341\346\365\365\371\376\376\376\365\365\371\341" + "\341\346\327\327\335\341\341\346\202\356\356\364\7\354\354\361\356\356\364" + "\354\354\361\327\327\335\312\312\322\334\334\341\371\371\374\203\376\376" + "\376\4\344\344\351\277\277\310\312\312\322\341\341\346\202\354\354\361\5" + "\356\356\364\346\346\355\316\316\326\305\305\315\351\351\355\205\376\376" + "\376\1\365\365\365\202\337\337\331\2\361\361\361\374\374\374\202\376\376" + "\376\10\374\374\372\361\361\354\352\352\343\357\357\346\327\327\327\235\235" + "\234\\\\^\14\14\15\203\0\0\0\6!\"!\\\\^\177\177\177\220\220\217557z\200Y" + "\203\231\236v\2\215\216\206\212\212\214\202\205\205\206\2\177\177\177vvw" + "\202\\\\^\11vvw\212\212\214vvwz\200Y\260\301O\370\376k\335\370Z\315\347^" + "\324\351^\202\320\352Y\204\311\350T\204\304\341M\203\275\333G\204\271\326" + "C\202\264\322@\7\271\326C\256\3170\232\256S\240\240\241\306\306\310\341\341" + "\341\365\365\371\202\376\376\376\2\365\365\365\344\344\351\203\341\341\346" + "\6\354\354\361\371\371\374\374\374\376\365\365\371\334\334\341\273\273\302" + "\203\263\263\277\4\316\316\326\351\351\360\360\360\365\374\372\374\204\376" + "\376\376\5\362\362\366\351\351\360\344\344\354\324\324\332\316\316\326\202" + "\324\324\332\6\334\334\341\346\346\355\334\334\341\316\316\326\322\322\323" + "\314\314\315\352\376\376\376\204\345o\0\1\370\332\276\211\376\376\376\1\347" + "x\20\205\345o\0\212\376\376\376\2\366\321\256\347x\20\203\345o\0\1\355\233" + "P\214\376\376\376\1\373\354\336\264\376\376\376\23\244\246\230\205\205\206" + "\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323\334\334\341" + "\345\345\346\341\341\346\334\334\341\351\351\355\371\371\371\374\374\376" + "\356\356\361\334\334\341\327\327\335\346\346\355\360\360\365\202\354\354" + "\361\2\356\356\364\346\346\355\202\316\316\326\1\354\354\361\203\376\376" + "\376\5\371\371\371\316\316\326\277\277\310\324\324\332\346\346\355\202\354" + "\354\361\5\351\351\360\327\327\335\305\305\315\334\334\341\374\372\374\204" + "\376\376\376\5\371\371\371\345\345\346\337\337\331\355\355\351\374\372\374" + "\202\376\376\376\6\371\371\371\361\361\354\345\345\340\314\314\315\212\212" + "\214557\203\0\0\0\22\14\14\15\\\\^\240\240\241\245\245\247\212\212\214jj" + "k\\\\^IIL\323\335i\374\374z\360\362x\343\352l\336\351g\316\344d\274\320e" + "\254\266l\231\232\217\220\220\217\202\215\216\206\13\177\177\177vvw\217\216" + "\224\255\255\260\177\177\177z\200Y\324\354W\352\376W\311\350T\320\350U\320" + "\352Y\203\311\350T\1\312\346M\203\304\341M\204\275\333G\203\271\326C\203" + "\264\322@\7\271\326C\256\3170\232\256S\245\245\247\302\302\302\337\337\331" + "\355\355\355\203\376\376\376\6\362\362\366\344\344\351\334\334\341\341\341" + "\346\344\344\351\360\360\365\202\374\374\376\2\362\362\366\312\312\322\203" + "\263\263\277\4\273\273\302\334\334\341\354\354\361\365\365\371\204\376\376" + "\376\4\371\371\374\354\354\361\346\346\355\327\327\335\202\316\316\326\202" + "\324\324\332\5\334\334\341\341\341\346\316\316\326\312\312\322\314\314\315" + "\352\376\376\376\204\345o\0\1\356\244`\210\376\376\376\1\361\266\177\206" + "\345o\0\211\376\376\376\1\360\255p\205\345o\0\1\363\277\216\214\376\376\376" + "\2\370\332\276\365\310\236\263\376\376\376\23\215\216\206\212\212\214\240" + "\240\241\255\255\260\274\274\274\314\314\315\327\327\327\341\341\341\344" + "\344\351\334\334\341\341\341\346\362\362\366\374\374\374\374\372\374\351" + "\351\355\327\327\335\334\334\341\354\354\361\356\356\364\203\354\354\361" + "\4\334\334\341\312\312\322\327\327\335\374\372\374\203\376\376\376\1\351" + "\351\355\202\305\305\315\2\334\334\341\351\351\360\202\354\354\361\4\341" + "\341\346\312\312\322\316\316\326\365\365\365\205\376\376\376\4\356\356\361" + "\337\337\331\345\345\340\370\370\365\202\376\376\376\5\371\371\371\361\361" + "\354\321\321\313\205\205\206!\"!\203\0\0\0\7!\"!vvw\267\267\272\302\302\302" + "\245\245\247\205\205\206jjk\202\\\\^\3jjk\315\333}\376\376\212\203\357\354" + "\205\21\353\352\177\343\352l\336\351g\332\344`\310\330r\273\301\235\245\245" + "\247\240\240\241\235\235\234\220\220\217\205\205\206\245\245\247\263\263" + "\277\\\\^\215\230S\370\376k\323\363P\203\311\350T\204\304\341M\204\275\333" + "G\205\271\326C\202\264\322@\15\271\326C\256\3170\232\256S\245\245\247\302" + "\302\302\330\330\320\345\345\346\365\365\361\374\374\376\376\376\376\374" + "\374\374\360\360\365\341\341\346\202\334\334\341\6\344\344\354\365\365\371" + "\376\376\376\371\371\374\341\341\346\273\273\302\203\263\263\277\4\305\305" + "\315\341\341\346\360\360\365\371\371\374\204\376\376\376\3\362\362\366\351" + "\351\360\341\341\346\202\316\316\326\5\324\324\332\316\316\326\324\324\332" + "\334\334\341\324\324\332\202\306\306\310\352\376\376\376\205\345o\0\210\376" + "\376\376\1\347x\20\206\345o\0\210\376\376\376\1\353\222@\206\345o\0\1\373" + "\354\336\214\376\376\376\2\370\332\276\356\244`\262\376\376\376\23\312\316" + "\253\177\177\177\220\220\217\245\245\247\264\264\265\302\302\302\322\322" + "\323\327\327\335\345\345\346\344\344\351\334\334\341\351\351\355\371\371" + "\371\376\376\376\371\371\371\341\341\346\327\327\335\344\344\351\360\360" + "\365\202\354\354\361\5\356\356\364\346\346\355\316\316\326\312\312\322\354" + "\354\361\203\376\376\376\13\371\371\371\324\324\332\277\277\310\324\324\332" + "\344\344\354\351\351\360\354\354\361\344\344\351\324\324\332\305\305\315" + "\351\351\355\205\376\376\376\1\371\371\371\202\345\345\340\7\365\365\361" + "\374\372\374\374\374\376\371\371\371\341\341\341\227\227\231557\204\0\0\0" + "\11jjk\306\306\310\341\341\341\314\314\315\235\235\234\177\177\177vvw\177" + "\177\177\205\205\206\202\212\212\214\3\273\306t\374\374z\360\362x\205\374" + "\374z\21\351\352u\336\351g\332\344`\323\335i\273\301\235\253\252\253\245" + "\245\247\235\235\234\223\223\224\220\220\217\267\267\272\217\216\224\\\\" + "^\346\374f\352\376W\304\341M\311\350T\204\304\341M\204\275\333G\205\271\326" + "C\202\264\322@\15\271\326C\261\3217\232\256S\253\252\253\314\314\315\337" + "\337\331\345\345\340\345\345\346\361\361\361\374\374\374\376\376\376\374" + "\374\376\356\356\364\203\334\334\341\5\351\351\360\371\371\374\376\376\376" + "\365\365\371\316\316\326\204\263\263\277\3\312\312\322\351\351\360\365\365" + "\371\204\376\376\376\5\371\371\374\354\354\361\344\344\354\324\324\332\312" + "\312\322\203\316\316\326\4\324\324\332\327\327\335\306\306\310\302\302\302" + "\351\376\376\376\1\370\332\276\205\345o\0\1\361\266\177\206\376\376\376\1" + "\363\277\216\207\345o\0\207\376\376\376\1\352\2110\206\345o\0\1\355\233P" + "\215\376\376\376\2\370\332\276\352\2110\262\376\376\376\11\256\263\231\205" + "\205\206\227\227\231\253\252\253\267\267\272\306\306\310\322\322\323\334" + "\334\341\345\345\346\202\341\341\346\10\361\361\361\374\374\374\376\376\376" + "\362\362\366\334\334\341\327\327\335\351\351\355\356\356\364\202\354\354" + "\361\5\356\356\364\334\334\341\312\312\322\327\327\335\371\371\374\203\376" + "\376\376\1\354\354\361\202\305\305\315\10\334\334\341\351\351\355\351\351" + "\360\351\351\355\327\327\335\305\305\315\324\324\332\371\371\371\205\376" + "\376\376\10\355\355\351\337\337\331\355\355\351\370\370\365\371\371\374\365" + "\365\365\273\273\302IIL\204\0\0\0\17""557\302\302\302\345\345\346\302\302" + "\302\240\240\241\205\205\206\177\177\177\205\205\206\215\216\206\227\227" + "\231\240\240\241\235\235\234\231\232\217jjk\\\\^\202IIL\4\\\\^z\200Y\254" + "\266l\332\344`\202\374\374z\17\343\352l\332\344`\324\344V\317\323\213\272" + "\272\264\261\261\260\253\252\253\240\240\241\223\223\224\240\240\241\245" + "\245\247\\\\^\310\332_\352\376W\275\333G\203\304\341M\205\275\333G\205\271" + "\326C\202\264\322@\6\271\326C\261\3217\232\256S\253\252\253\314\314\315\341" + "\341\341\202\345\345\340\6\341\341\341\355\355\355\374\374\374\376\376\376" + "\374\372\374\351\351\360\202\334\334\341\6\341\341\346\360\360\365\376\376" + "\376\374\374\376\346\346\355\273\273\302\204\263\263\277\3\327\327\335\360" + "\360\365\371\371\374\204\376\376\376\4\360\360\365\351\351\360\327\327\335" + "\312\312\322\203\316\316\326\4\312\312\322\324\324\332\312\312\322\274\274" + "\274\351\376\376\376\1\365\310\236\205\345o\0\1\350\200\40\206\376\376\376" + "\1\355\233P\207\345o\0\1\366\321\256\205\376\376\376\1\353\222@\207\345o" + "\0\1\365\310\236\215\376\376\376\2\360\255p\345o\0\262\376\376\376\14\231" + "\232\217\212\212\214\235\235\234\255\255\260\274\274\274\314\314\315\327" + "\327\327\341\341\341\344\344\351\341\341\346\344\344\351\365\365\371\202" + "\374\374\374\13\354\354\361\327\327\335\334\334\341\356\356\361\356\356\364" + "\351\351\360\354\354\361\351\351\360\324\324\332\312\312\322\344\344\354" + "\204\376\376\376\4\334\334\341\277\277\310\312\312\322\341\341\346\202\351" + "\351\360\4\341\341\346\312\312\322\305\305\315\344\344\351\205\376\376\376" + "\10\370\370\365\345\345\340\352\352\343\365\365\361\365\365\365\341\341\346" + "\205\205\206\14\14\15\204\0\0\0\17\177\177\177\345\345\346\314\314\315\227" + "\227\231\205\205\206\212\212\214\215\216\206\220\220\217\235\235\234\240" + "\240\241\212\212\214jjkIILvvwjjk\203IIL\26""557IIL\\\\^jjkz\200Y\305\327" + "T\374\374z\343\352l\336\351g\320\350U\323\335i\312\316\253\274\274\274\272" + "\272\264\253\252\253\235\235\234\220\220\217\227\227\231\\\\^\273\306t\352" + "\376W\275\333G\202\304\341M\205\275\333G\205\271\326C\202\264\322@\13\271" + "\326C\261\3217\232\256S\253\252\253\314\314\315\345\345\346\355\355\351\345" + "\345\340\337\337\331\334\334\341\361\361\361\202\376\376\376\11\365\365\371" + "\344\344\351\327\327\335\334\334\341\344\344\354\365\365\371\376\376\376" + "\365\365\371\316\316\326\204\263\263\277\4\305\305\315\351\351\360\362\362" + "\366\374\374\376\203\376\376\376\3\365\365\371\351\351\360\341\341\346\202" + "\316\316\326\3\324\324\332\316\316\326\305\305\315\202\316\316\326\1\274" + "\274\274\351\376\376\376\1\361\266\177\206\345o\0\1\361\266\177\205\376\376" + "\376\1\353\222@\207\345o\0\1\356\244`\204\376\376\376\1\365\310\236\207\345" + "o\0\1\347x\20\216\376\376\376\2\347x\20\345o\0\262\376\376\376\31\205\205" + "\206\220\220\217\245\245\247\264\264\265\302\302\302\322\322\323\327\327" + "\335\345\345\346\344\344\351\341\341\346\354\354\361\374\372\374\376\376" + "\376\374\372\374\346\346\355\334\334\341\344\344\351\360\360\365\354\354" + "\361\351\351\360\356\356\364\344\344\351\312\312\322\316\316\326\365\365" + "\371\203\376\376\376\13\362\362\366\312\312\322\277\277\310\324\324\332\346" + "\346\355\351\351\360\346\346\355\327\327\335\277\277\310\322\322\323\371" + "\371\371\205\376\376\376\6\355\355\351\345\345\340\355\355\351\365\365\361" + "\306\306\310557\202\0\0\0\1\14\14\15\202\0\0\0\13\302\302\302\345\345\346" + "\245\245\247\205\205\206\212\212\214\223\223\224\231\232\217\235\235\234" + "\212\212\214IIL\14\14\15\203\0\0\0\6jjkvvw\220\220\217\205\205\206\177\177" + "\177vvw\202\\\\^\25\177\177\177\245\245\247\177\177\177z\200Y\374\374z\346" + "\374f\332\352b\324\354W\324\351^\307\322\237\306\306\310\302\302\302\267" + "\267\272\245\245\247\223\223\224\177\177\177\\\\^\254\266l\352\376W\271\333" + "@\304\341M\204\275\333G\211\271\326C\13\261\3217\232\256S\245\245\247\314" + "\314\315\345\345\346\365\365\361\355\355\351\337\337\331\327\327\327\334" + "\334\341\361\361\361\202\376\376\376\5\362\362\366\341\341\346\327\327\335" + "\334\334\341\354\352\362\202\376\376\376\2\346\346\355\273\273\302\204\263" + "\263\277\3\327\327\335\360\360\365\371\371\374\203\376\376\376\5\374\372" + "\374\356\356\364\351\351\355\324\324\332\312\312\322\202\316\316\326\202" + "\305\305\315\2\312\312\322\273\273\302\326\376\376\376\3\371\343\316\363" + "\277\216\356\244`\203\353\222@\3\355\233P\363\277\216\373\354\336\212\376" + "\376\376\1\361\266\177\207\345o\0\1\370\332\276\204\376\376\376\1\353\222" + "@\210\345o\0\1\373\354\336\203\376\376\376\1\353\222@\207\345o\0\1\356\244" + "`\215\376\376\376\1\355\233P\202\345o\0\261\376\376\376\23\312\316\253\205" + "\205\206\223\223\224\245\245\247\267\267\272\306\306\310\322\322\323\334" + "\334\341\345\345\346\341\341\346\344\344\351\362\362\366\374\374\374\376" + "\376\376\365\365\371\341\341\346\334\334\341\354\354\361\360\360\365\202" + "\354\354\361\4\356\356\364\334\334\341\312\312\322\341\341\346\204\376\376" + "\376\4\344\344\351\277\277\310\305\305\315\334\334\341\202\351\351\360\4" + "\341\341\346\312\312\322\305\305\315\351\351\355\205\376\376\376\1\365\365" + "\365\202\345\345\340\4\351\351\351\223\223\224\14\14\15\0\0\0\202\14\14\15" + "\13\0\0\0!\"!\322\322\323\327\327\327\220\220\217\205\205\206\223\223\224" + "\240\240\241\245\245\247\212\212\214557\203\0\0\0\5""557\212\212\214\220" + "\220\217jjk\205\205\206\202\227\227\231\4\231\232\217\223\223\224\220\220" + "\217\215\216\206\202\205\205\206\11\240\240\241\227\227\231IIL\374\374z\352" + "\376W\324\351^\320\352Y\316\350Q\317\323\213\202\314\314\315\10\302\302\302" + "\261\261\260\227\227\231jjkIIL\256\263\231\352\376W\267\3309\204\275\333" + "G\211\271\326C\14\261\3217\232\256S\235\235\234\306\306\310\345\345\346\370" + "\370\365\365\365\365\341\341\341\327\327\327\322\322\323\333\333\333\365" + "\365\371\202\376\376\376\10\356\356\364\334\334\341\327\327\335\341\341\346" + "\365\365\371\376\376\376\371\371\374\316\316\326\202\263\263\277\6\273\273" + "\302\263\263\277\277\277\310\346\346\355\365\365\371\374\374\376\203\376" + "\376\376\12\362\362\366\354\352\362\327\327\335\312\312\322\316\316\326\322" + "\322\323\312\312\322\277\277\310\306\306\310\302\302\302\326\376\376\376" + "\202\370\332\276\3\366\321\256\360\255p\347x\20\204\345o\0\1\361\266\177" + "\211\376\376\376\1\361\266\177\207\345o\0\2\347x\20\371\343\316\203\376\376" + "\376\1\361\266\177\210\345o\0\1\355\233P\203\376\376\376\210\345o\0\1\361" + "\266\177\213\376\376\376\2\370\332\276\352\2110\202\345o\0\1\347x\20\261" + "\376\376\376\17\256\263\231\212\212\214\227\227\231\253\252\253\274\274\274" + "\314\314\315\327\327\327\341\341\341\351\351\351\341\341\346\351\351\355" + "\371\371\371\374\374\374\376\376\376\362\362\366\202\341\341\346\202\360" + "\360\365\6\354\354\361\356\356\361\354\354\361\324\324\332\316\316\326\356" + "\356\361\203\376\376\376\13\374\374\376\327\327\335\273\273\302\312\312\322" + "\344\344\351\351\351\360\346\346\355\327\327\335\277\277\310\324\324\332" + "\371\371\371\205\376\376\376\4\352\352\343\337\337\331\327\327\327vvw\202" + "\0\0\0\1\14\14\15\202\0\0\0\1""557\202\261\261\260\6\205\205\206\212\212" + "\214\227\227\231\253\252\253\240\240\241IIL\204\0\0\0\11\205\205\206\322" + "\322\323\253\252\253vvwIIL\260\301O\323\335i\273\306t\256\263\231\203\261" + "\261\260\26\253\252\253\245\245\247\227\227\231\220\220\217vvwIIL\357\375" + "\216\335\370Z\324\351^\320\352Y\312\346M\317\323\213\302\302\302\313\313" + "\301\302\302\302\264\264\265\240\240\241\\\\^IIL\273\301\235\323\363P\271" + "\333@\203\275\333G\211\271\326C\23\261\3217\232\256S\235\235\234\302\302" + "\302\341\341\341\370\370\365\376\376\376\355\355\355\333\333\333\322\322" + "\323\314\314\315\341\341\346\371\371\374\376\376\376\371\371\374\344\344" + "\351\324\324\332\327\327\335\354\354\361\202\376\376\376\1\344\344\351\202" + "\263\263\277\1\273\273\302\202\263\263\277\3\324\324\332\360\360\365\371" + "\371\374\203\376\376\376\3\371\371\371\354\354\361\341\341\346\202\312\312" + "\322\3\316\316\326\312\312\322\277\277\310\202\273\273\302\333\376\376\376" + "\1\356\244`\204\345o\0\1\353\222@\210\376\376\376\1\361\266\177\211\345o" + "\0\1\361\266\177\202\376\376\376\1\373\354\336\204\345o\0\2\352\2110\350" + "\200\40\203\345o\0\1\363\277\216\202\376\376\376\210\345o\0\1\370\332\276" + "\210\376\376\376\3\371\343\316\361\266\177\352\2110\204\345o\0\1\355\233" + "P\261\376\376\376\10\231\232\217\212\212\214\240\240\241\255\255\260\302" + "\302\302\322\322\323\333\333\333\345\345\346\202\344\344\351\17\354\354\361" + "\374\372\374\374\374\374\376\376\376\360\360\365\334\334\341\346\346\355" + "\362\362\366\356\356\364\354\354\361\360\360\365\346\346\355\316\316\326" + "\334\334\341\371\371\374\203\376\376\376\12\365\365\371\312\312\322\277\277" + "\310\324\324\332\346\346\355\351\351\360\341\341\346\316\316\326\277\277" + "\310\344\344\351\205\376\376\376\4\370\370\365\337\337\331\261\261\260jj" + "k\202\0\0\0\1\14\14\15\202\0\0\0\1""557\202vvw\6\177\177\177\220\220\217" + "\240\240\241\261\261\260\212\212\214\14\14\15\203\0\0\0\15""557\314\314\315" + "\333\333\333\274\274\274\212\212\214\177\177\177vvw\256\302]\374\374z\332" + "\344`\323\335i\307\322\237\306\306\310\202\314\314\315\14\302\302\302\264" + "\264\265\240\240\241\205\205\206557\\\\^\376\376\212\316\350Q\315\347^\346" + "\374f\303\343C\231\236v\202\313\313\301\3\302\302\302\272\272\264\240\240" + "\241\202IIL\2\357\375\216\271\336:\203\275\333G\211\271\326C\15\261\3217" + "\232\256S\235\235\234\272\272\264\337\337\331\365\365\365\376\376\376\371" + "\371\371\341\341\341\322\322\323\314\314\315\316\316\326\354\354\361\202" + "\376\376\376\17\360\360\365\334\334\341\324\324\332\341\341\346\371\371\374" + "\376\376\376\365\365\371\305\305\315\263\263\277\273\273\302\277\277\310" + "\263\263\277\277\277\310\346\346\355\365\365\371\203\376\376\376\5\374\374" + "\376\360\360\365\344\344\354\312\312\322\305\305\315\202\316\316\326\1\277" + "\277\310\202\267\267\272\334\376\376\376\1\353\222@\204\345o\0\1\356\244" + "`\207\376\376\376\1\363\277\216\212\345o\0\4\355\233P\373\354\336\376\376" + "\376\371\343\316\210\376\376\376\1\370\332\276\202\376\376\376\1\350\200" + "\40\207\345o\0\1\370\332\276\205\376\376\376\3\373\354\336\360\255p\350\200" + "\40\207\345o\0\1\370\332\276\260\376\376\376\31\362\370\317\215\216\206\220" + "\220\217\240\240\241\264\264\265\306\306\310\322\322\323\334\334\341\345" + "\345\346\344\344\351\346\346\355\362\362\366\374\374\374\376\376\376\374" + "\374\376\354\354\361\341\341\346\354\354\361\362\362\366\356\356\364\354" + "\354\361\360\360\365\341\341\346\316\316\326\351\351\355\204\376\376\376" + "\1\354\354\361\202\305\305\315\7\334\334\341\351\351\360\346\346\355\327" + "\327\335\277\277\310\312\312\322\365\365\371\205\376\376\376\4\355\355\351" + "\333\333\333\264\264\265jjk\202\0\0\0\12\14\14\15\0\0\0\14\14\15\227\227" + "\231!\"!\177\177\177\220\220\217\245\245\247\261\261\260jjk\203\0\0\0\17" + "\14\14\15IIL\337\337\331\302\302\302\215\216\206\205\205\206\220\220\217" + "\223\223\224\220\220\217\254\266l\374\374z\351\352u\343\352l\324\344V\313" + "\313\301\202\327\327\327\15\321\321\313\313\313\301\272\272\264\244\246\230" + "z\200Y\274\320e\335\370Z\311\350T\346\374f\352\376WOj\16\\\\^\274\274\274" + "\202\321\321\313\6\313\313\301\261\261\260\231\232\217\260\301O\303\343C" + "\271\326C\202\275\333G\210\271\326C\10\264\322@\271\326C\261\3217\215\230" + "S\235\235\234\272\272\264\330\330\320\355\355\355\202\376\376\376\11\356" + "\356\361\327\327\327\322\322\323\314\314\315\324\324\332\365\365\371\376" + "\376\376\374\372\374\346\346\355\202\327\327\335\1\356\356\364\202\376\376" + "\376\1\334\334\341\202\263\263\277\6\305\305\315\273\273\302\263\263\277" + "\327\327\335\365\365\371\371\371\374\203\376\376\376\11\362\362\366\351\351" + "\360\324\324\332\305\305\315\316\316\326\324\324\332\305\305\315\263\263" + "\277\264\264\265\334\376\376\376\1\373\354\336\205\345o\0\1\356\244`\206" + "\376\376\376\1\373\354\336\207\345o\0\2\355\233P\365\310\236\221\376\376" + "\376\3\373\354\336\363\277\216\352\2110\204\345o\0\1\363\277\216\204\376" + "\376\376\1\360\255p\211\345o\0\1\353\222@\261\376\376\376\10\332\337\264" + "\205\205\206\223\223\224\245\245\247\267\267\272\306\306\310\327\327\327" + "\341\341\341\202\344\344\351\17\351\351\355\365\365\371\374\374\374\376\376" + "\376\371\371\374\351\351\355\341\341\346\360\360\365\362\362\366\356\356" + "\364\360\360\365\356\356\364\327\327\335\324\324\332\365\365\371\204\376" + "\376\376\11\334\334\341\277\277\310\312\312\322\341\341\346\351\351\360\344" + "\344\351\316\316\326\277\277\310\334\334\341\205\376\376\376\2\371\371\371" + "\341\341\341\202\327\327\327\3\177\177\177IIL\0\0\0\202\14\14\15\26\0\0\0" + "jjkvvw\212\212\214\245\245\247\274\274\274\253\252\253jjk\0\0\0\14\14\15" + "\0\0\0IIL\227\227\231\223\223\224\177\177\177\212\212\214\227\227\231\245" + "\245\247\253\252\253\235\235\234\254\266l\374\374z\203\343\352l\3\323\335" + "i\313\313\301\321\321\313\202\330\330\320\14\313\313\301\273\306t\333\356" + "m\346\374f\304\341M\346\374f\352\376WOj\16IILjjk\272\272\264\321\321\313" + "\202\330\330\320\3\312\316\253\313\342Z\307\344H\202\275\333G\210\271\326" + "C\203\264\322@!\271\326C\261\3217\215\230S\235\235\234\272\272\264\330\330" + "\320\345\345\340\371\371\371\376\376\376\371\371\371\341\341\341\322\322" + "\323\312\312\322\305\305\315\341\341\346\374\372\374\376\376\376\362\362" + "\366\334\334\341\324\324\332\344\344\351\371\371\374\376\376\376\354\354" + "\361\273\273\302\263\263\277\305\305\315\277\277\310\263\263\277\305\305" + "\315\354\352\362\371\371\374\374\374\376\202\376\376\376\11\365\365\371\356" + "\356\364\327\327\335\305\305\315\312\312\322\324\324\332\312\312\322\263" + "\263\277\255\255\260\335\376\376\376\1\355\233P\205\345o\0\1\356\244`\206" + "\376\376\376\1\360\255p\203\345o\0\3\347x\20\361\266\177\373\354\336\226" + "\376\376\376\2\373\354\336\356\244`\202\345o\0\1\356\244`\203\376\376\376" + "\1\353\222@\211\345o\0\1\350\200\40\262\376\376\376\21\273\301\235\205\205" + "\206\227\227\231\253\252\253\274\274\274\314\314\315\327\327\327\341\341" + "\341\351\351\351\344\344\351\356\356\361\371\371\371\374\374\374\376\376" + "\376\371\371\371\346\346\355\344\344\351\202\362\362\366\6\356\356\364\362" + "\362\366\354\354\361\324\324\332\334\334\341\371\371\374\203\376\376\376" + "\12\374\372\374\324\324\332\277\277\310\324\324\332\344\344\354\351\351\360" + "\334\334\341\305\305\315\277\277\310\354\354\361\205\376\376\376\6\361\361" + "\361\333\333\333\337\337\331\333\333\333\227\227\231\220\220\217\202\0\0" + "\0\22\14\14\15\0\0\0!\"!\223\223\224\235\235\234\274\274\274\314\314\315" + "\322\322\323vvwIIL\0\0\0\14\14\15\0\0\0\177\177\177vvw\220\220\217\245\245" + "\247\267\267\272\202\302\302\302\4\261\261\260\254\266l\374\374z\336\351" + "g\202\343\352l\3\324\344V\310\330r\313\313\301\202\330\330\320\20\326\343" + "\210\331\355f\324\354W\313\342Z\346\374f\352\376WOj\16""557IIL\231\232\217" + "\261\261\260\313\313\301\330\330\320\332\337\264\305\327T\271\326C\202\275" + "\333G\2\271\326C\303\343C\205\271\326C\206\264\322@\7\261\3217\215\230S\235" + "\235\234\272\272\264\330\330\320\337\337\331\361\361\354\202\376\376\376" + "\22\351\351\355\324\324\332\316\316\326\305\305\315\312\312\322\356\356\364" + "\376\376\376\374\372\374\346\346\355\324\324\332\334\334\341\362\362\366" + "\376\376\376\371\371\374\305\305\315\263\263\277\305\305\315\312\312\322" + "\202\273\273\302\3\341\341\346\365\365\371\374\372\374\202\376\376\376\3" + "\371\371\374\360\360\365\341\341\346\202\305\305\315\4\324\324\332\316\316" + "\326\273\273\302\253\252\253\335\376\376\376\1\363\277\216\206\345o\0\2\352" + "\2110\370\332\276\205\376\376\376\3\356\244`\347x\20\361\266\177\233\376" + "\376\376\3\373\354\336\356\244`\347x\20\202\376\376\376\1\361\266\177\211" + "\345o\0\2\347x\20\371\343\316\262\376\376\376\30\256\263\231\212\212\214" + "\235\235\234\253\252\253\274\274\274\314\314\315\333\333\333\341\341\346" + "\351\351\351\351\351\355\362\362\366\371\371\374\374\374\374\376\376\376" + "\365\365\371\344\344\351\351\351\355\365\365\371\362\362\366\360\360\365" + "\362\362\366\344\344\354\324\324\332\351\351\355\204\376\376\376\12\362\362" + "\366\312\312\322\277\277\310\334\334\341\351\351\355\346\346\355\324\324" + "\332\273\273\302\312\312\322\371\371\371\205\376\376\376\2\351\351\351\327" + "\327\327\202\337\337\331\1\313\313\301\202jjk\1\0\0\0\202\14\14\15\10\0\0" + "\0vvw\240\240\241\306\306\310\333\333\333\322\322\323\177\177\177\223\223" + "\224\203\0\0\0\5IIL\205\205\206\240\240\241\274\274\274\314\314\315\202\330" + "\330\320\3\302\302\302\254\266l\370\376k\203\336\351g\5\340\360u\275\333" + "G\273\301\235\312\316\253\326\343z\202\320\350U\4\313\342Z\370\376k\332\375" + "HOj\16\202557\7\205\205\206\240\240\241\272\272\264\321\321\313\332\337\264" + "\305\327T\271\333@\203\275\333G\6\323\363P\261\3217\312\350G\303\343C\264" + "\322@\271\326C\207\264\322@\40\261\3217\215\230S\235\235\234\272\272\264" + "\330\330\320\337\337\331\345\345\340\365\365\371\376\376\376\365\365\371" + "\334\334\341\322\322\323\316\316\326\305\305\315\334\334\341\374\372\374" + "\376\376\376\365\365\371\334\334\341\327\327\335\351\351\360\374\374\376" + "\376\376\376\334\334\341\263\263\277\277\277\310\316\316\326\305\305\315" + "\263\263\277\316\316\326\365\365\371\371\371\374\202\376\376\376\11\374\374" + "\376\362\362\366\344\344\354\305\305\315\277\277\310\316\316\326\324\324" + "\332\277\277\310\253\252\253\335\376\376\376\1\370\332\276\210\345o\0\2\355" + "\233P\366\321\256\243\376\376\376\4\371\343\316\373\354\336\376\376\376\347" + "x\20\210\345o\0\2\347x\20\371\343\316\262\376\376\376\15\362\370\317\244" + "\246\230\220\220\217\240\240\241\255\255\260\302\302\302\322\322\323\333" + "\333\333\345\345\346\351\351\351\351\351\355\365\365\371\374\374\374\202" + "\376\376\376\4\362\362\366\344\344\351\354\354\361\365\365\371\203\362\362" + "\366\3\341\341\346\327\327\335\360\360\365\204\376\376\376\1\351\351\355" + "\202\305\305\315\6\341\341\346\351\351\360\344\344\354\312\312\322\273\273" + "\302\334\334\341\205\376\376\376\40\374\372\374\334\334\341\327\327\327\345" + "\345\340\341\341\341\321\321\313\205\205\206\223\223\224\14\14\15\0\0\0\14" + "\14\15\0\0\0\14\14\15\235\235\234\306\306\310\327\327\327\321\321\313\272" + "\272\264jjkvvw\0\0\0\14\14\15\0\0\0\177\177\177\245\245\247\306\306\310\333" + "\333\333\345\345\340\352\352\343\330\330\320\273\306t\346\374f\203\336\351" + "g\35\332\352b\326\354c\312\346M\332\344`\320\350U\320\352Y\315\347^\370\376" + "k\270\336-557IIL557\205\205\206\235\235\234\267\267\272\314\314\315\325\343" + "\240\304\341M\271\333@\275\333G\271\326C\304\341M\332\375H\222\261\33\177" + "\177\177jjk\264\322@\312\3577\271\336:\207\264\322@\5\256\3170\200\220E\245" + "\245\247\274\274\274\330\330\320\202\337\337\331\1\355\355\355\202\376\376" + "\376\3\351\351\355\324\324\332\322\322\323\202\312\312\322\11\360\360\365" + "\376\376\376\374\374\376\346\346\355\324\324\332\341\341\346\371\371\371" + "\376\376\376\354\354\361\202\273\273\302\6\324\324\332\316\316\326\273\273" + "\302\277\277\310\356\356\364\371\371\374\202\376\376\376\11\374\374\374\365" + "\365\371\351\351\360\312\312\322\277\277\310\316\316\326\324\324\332\306" + "\306\310\255\255\260\336\376\376\376\213\345o\0\2\347x\20\370\332\276\242" + "\376\376\376\1\373\354\336\211\345o\0\1\371\343\316\217\376\376\376\1\373" + "\354\336\243\376\376\376\1\362\370\317\202\220\220\217\26\240\240\241\264" + "\264\265\306\306\310\322\322\323\334\334\341\345\345\346\351\351\351\354" + "\354\361\371\371\371\374\374\374\376\376\376\374\374\376\360\360\365\344" + "\344\351\356\356\364\365\365\371\362\362\366\365\365\371\360\360\365\327" + "\327\335\334\334\341\371\371\374\204\376\376\376\11\344\344\351\277\277\310" + "\316\316\326\344\344\354\351\351\360\341\341\346\305\305\315\277\277\310" + "\354\354\361\205\376\376\376\1\361\361\361\202\327\327\327\202\345\345\346" + "\4\330\330\320\272\272\264\\\\^\240\240\241\202\0\0\0\12\14\14\15\0\0\0\\" + "\\^\261\261\260\314\314\315\321\321\313\313\313\301jjk\245\245\247!\"!\202" + "\0\0\0+\14\14\15\227\227\231\306\306\310\333\333\333\355\355\351\361\361" + "\361\327\327\327\304\323|\346\374f\326\354c\332\352b\326\354_\324\351^\326" + "\354c\322\354]\311\350T\315\347^\346\374f\370\376kb\203\27""557\\\\^557\177" + "\177\177\223\223\224\253\252\253\302\302\302\317\323\213\275\333G\271\333" + "@\275\333G\271\326C\323\363P\332\375HOj\16""557\\\\^\245\245\247vvwz\200" + "Y\271\326C\312\3577\267\3309\205\264\322@\5\256\3170\200\220E\253\252\253" + "\302\302\302\330\330\320\202\337\337\331\11\341\341\341\371\371\371\376\376" + "\376\365\365\371\327\327\335\324\324\332\322\322\323\305\305\315\341\341" + "\346\202\376\376\376\31\360\360\365\327\327\335\334\334\341\362\362\366\376" + "\376\376\365\365\371\312\312\322\263\263\277\324\324\332\334\334\341\277" + "\277\310\273\273\302\341\341\346\371\371\374\374\374\376\376\376\376\374" + "\374\376\371\371\374\356\356\364\324\324\332\273\273\302\312\312\322\327" + "\327\335\312\312\322\255\255\260\336\376\376\376\1\355\233P\211\345o\0\1" + "\352\2110\245\376\376\376\2\371\343\316\347x\20\206\345o\0\1\361\266\177" + "\217\376\376\376\2\373\354\336\363\277\216\242\376\376\376\32\366\372\337" + "\356\366\304\205\205\206\223\223\224\245\245\247\264\264\265\306\306\310" + "\322\322\323\341\341\341\345\345\346\351\351\355\360\360\365\371\371\371" + "\374\374\374\376\376\376\374\374\376\356\356\364\346\346\355\362\362\366" + "\365\365\371\362\362\366\365\365\371\354\354\361\327\327\335\341\341\346" + "\374\374\376\203\376\376\376\4\374\372\374\334\334\341\277\277\310\324\324" + "\332\202\351\351\360\4\334\334\341\277\277\310\305\305\315\365\365\365\205" + "\376\376\376\3\351\351\351\322\322\323\333\333\333\202\345\345\346\3\330" + "\330\320\313\313\301\240\240\241\202vvw\2\0\0\0\14\14\15\202\0\0\0\7\220" + "\220\217\274\274\274\313\313\301\314\314\315\272\272\264jjk\267\267\272\203" + "\0\0\0\10""557\255\255\260\322\322\323\351\351\351\355\355\355\330\330\320" + "\304\323|\335\370Z\204\324\351^\202\315\347^\14\332\362e\370\376k\312\357" + "7!\"!jjk\205\205\206\\\\^\177\177\177\220\220\217\245\245\247\273\301\235" + "\310\330r\202\271\333@\202\275\333G\26\352\376W\250\326!Oj\16IIL557jjkvv" + "w\205\205\206\227\227\231vvw\200\220E\271\333@\312\3577\261\3217\264\322" + "@\261\3217\264\322@\256\3170\200\220E\253\252\253\306\306\310\330\330\320" + "\202\337\337\331$\333\333\333\361\361\361\376\376\376\374\372\374\341\341" + "\346\324\324\332\327\327\335\312\312\322\324\324\332\365\365\371\376\376" + "\376\365\365\371\341\341\346\327\327\335\351\351\360\376\376\376\374\374" + "\376\327\327\335\263\263\277\316\316\326\341\341\346\316\316\326\263\263" + "\277\324\324\332\365\365\371\374\374\376\376\376\376\374\374\374\371\371" + "\374\360\360\365\327\327\335\273\273\302\305\305\315\327\327\335\316\316" + "\326\267\267\272\336\376\376\376\1\365\310\236\210\345o\0\1\356\244`\250" + "\376\376\376\1\352\2110\204\345o\0\1\347x\20\220\376\376\376\2\361\266\177" + "\370\332\276\242\376\376\376\22\364\371\327\332\337\264\205\205\206\223\223" + "\224\245\245\247\267\267\272\306\306\310\327\327\327\341\341\341\345\345" + "\346\351\351\355\360\360\365\371\371\371\374\374\374\376\376\376\374\372" + "\374\356\356\361\351\351\355\204\365\365\371\3\351\351\360\327\327\335\351" + "\351\360\204\376\376\376\12\365\365\371\324\324\332\305\305\315\334\334\341" + "\351\351\360\351\351\355\324\324\332\273\273\302\327\327\335\374\372\374" + "\204\376\376\376\4\371\371\374\334\334\341\314\314\315\333\333\333\202\345" + "\345\346\21\337\337\331\330\330\320\314\314\315vvw\245\245\247557\0\0\0\14" + "\14\15\0\0\0!\"!\240\240\241\302\302\302\314\314\315\302\302\302\231\232" + "\217vvw\255\255\260\203\0\0\0\7""557\255\255\260\334\334\341\345\345\346" + "\321\321\313\304\323|\335\370Z\202\315\347^\202\322\354]\26\335\370Z\352" + "\376W\332\375Hb\203\27!\"!\255\255\260\245\245\247jjk\177\177\177\220\220" + "\217\244\246\230\317\323\213\310\332_\271\333@\275\333G\271\326C\311\350" + "T\332\375Hx\253\27""557\\\\^IIL\202\177\177\177\1\205\205\206\202\177\177" + "\177\6\212\212\214\217\216\224vvw\215\230S\275\341<\256\3170\202\264\322" + "@\4\256\3170\200\220E\253\252\253\314\314\315\203\337\337\331\12\327\327" + "\327\345\345\346\374\374\376\376\376\376\354\354\361\324\324\332\334\334" + "\341\324\324\332\312\312\322\351\351\360\202\376\376\376\30\351\351\360\327" + "\327\335\344\344\354\374\372\374\376\376\376\346\346\355\263\263\277\312" + "\312\322\346\346\355\334\334\341\273\273\302\305\305\315\360\360\365\374" + "\374\376\376\376\376\374\374\374\371\371\374\362\362\366\334\334\341\277" + "\277\310\305\305\315\327\327\335\324\324\332\273\273\302\337\376\376\376" + "\1\347x\20\206\345o\0\1\356\244`\252\376\376\376\1\352\2110\203\345o\0\1" + "\360\255p\220\376\376\376\2\347x\20\371\343\316\242\376\376\376\22\364\371" + "\327\312\316\253\212\212\214\227\227\231\245\245\247\267\267\272\314\314" + "\315\327\327\327\334\334\341\345\345\346\351\351\355\362\362\366\371\371" + "\374\374\374\374\376\376\376\371\371\374\354\354\361\351\351\360\204\365" + "\365\371\3\344\344\354\334\334\341\362\362\366\204\376\376\376\11\365\365" + "\365\316\316\326\305\305\315\341\341\346\351\351\360\344\344\354\312\312" + "\322\277\277\310\344\344\351\205\376\376\376\14\365\365\365\322\322\323\314" + "\314\315\333\333\333\345\345\346\341\341\341\337\337\331\345\345\340\334" + "\334\341\302\302\302jjk\267\267\272\202\0\0\0\4\14\14\15\0\0\0IIL\255\255" + "\260\202\313\313\301\5\272\272\264\177\177\177jjk\245\245\247\14\14\15\202" + "\0\0\0\5!\"!\235\235\234\314\314\315\302\302\302\273\306t\203\352\376W\202" + "\332\375H\15\275\341<x\222'557\212\212\214\316\316\326\240\240\241vvw\177" + "\177\177\231\232\217\256\263\231\310\330r\275\333G\267\3309\202\271\326C" + "\17\335\370Z\275\341-Oj\16\\\\^jjk\\\\^\177\177\177\223\223\224\240\240\241" + "\245\245\247\244\246\230\231\232\217\215\216\206\177\177\177\212\212\214" + "\202\177\177\177\20\332\362e\246\306(\264\322@\256\3170\200\220E\253\252" + "\253\314\314\315\341\341\341\345\345\340\337\337\331\330\330\320\334\334" + "\341\365\365\371\376\376\376\365\365\365\327\327\335\202\334\334\341\21\312" + "\312\322\334\334\341\371\371\374\376\376\376\362\362\366\327\327\335\341" + "\341\346\365\365\371\376\376\376\360\360\365\277\277\310\305\305\315\351" + "\351\360\344\344\354\305\305\315\273\273\302\344\344\354\202\374\374\376" + "\4\374\374\374\371\371\374\365\365\371\344\344\351\202\277\277\310\3\327" + "\327\335\327\327\327\277\277\310\337\376\376\376\1\363\277\216\205\345o\0" + "\1\356\244`\254\376\376\376\1\352\2110\202\345o\0\1\371\343\316\217\376\376" + "\376\2\355\233P\347x\20\243\376\376\376\20\364\371\327\273\301\235\212\212" + "\214\235\235\234\253\252\253\274\274\274\314\314\315\327\327\327\341\341" + "\341\351\351\351\354\354\361\365\365\371\374\372\374\374\374\374\376\376" + "\376\371\371\374\202\354\354\361\204\365\365\371\3\344\344\351\341\341\346" + "\365\365\371\204\376\376\376\1\362\362\366\202\312\312\322\3\344\344\351" + "\354\352\362\341\341\346\202\305\305\315\1\354\354\361\205\376\376\376\1" + "\361\361\361\202\314\314\315\2\333\333\333\341\341\341\202\337\337\331\6" + "\355\355\355\351\351\351\327\327\327\264\264\265jjk\264\264\265\202\0\0\0" + "\4\14\14\15\0\0\0\\\\^\267\267\272\202\302\302\302\5\274\274\274\177\177" + "\177IIL\220\220\217IIL\203\0\0\0\14IIL\220\220\217\177\177\177z\200Y\200" + "\220E\215\230S\231\236v\177\177\177\205\205\206\255\255\260\312\312\322\253" + "\252\253\202\177\177\177\5\205\205\206\231\232\217\273\306t\305\327T\267" + "\3309\202\271\326C\5\324\354W\332\375Hb\203\27""557\217\216\224\202jjk\33" + "\205\205\206\231\232\217\253\252\253\302\302\302\306\306\310\302\302\302" + "\272\272\264\245\245\247\231\232\217\215\216\206\254\266l\315\333}\261\321" + "7\252\3108\264\322@\256\3170\200\220E\253\252\253\314\314\315\345\345\346" + "\352\352\343\337\337\331\330\330\320\327\327\327\360\360\365\376\376\376" + "\371\371\374\202\334\334\341\1\341\341\346\202\316\316\326\32\365\365\371" + "\376\376\376\365\365\371\341\341\346\334\334\341\362\362\366\376\376\376" + "\365\365\371\305\305\315\277\277\310\346\346\355\354\352\362\312\312\322" + "\263\263\277\334\334\341\374\374\376\376\376\376\374\374\374\371\371\374" + "\365\365\371\346\346\355\305\305\315\277\277\310\324\324\332\327\327\335" + "\306\306\310\340\376\376\376\1\360\255p\203\345o\0\1\356\244`\256\376\376" + "\376\2\352\2110\345o\0\216\376\376\376\4\371\343\316\353\222@\345o\0\355" + "\233P\243\376\376\376\23\364\371\327\256\263\231\212\212\214\235\235\234" + "\253\252\253\274\274\274\314\314\315\327\327\327\334\334\341\351\351\351" + "\354\354\361\365\365\371\374\372\374\374\374\376\376\376\376\365\365\371" + "\354\354\361\356\356\361\365\365\371\202\371\371\374\4\362\362\366\341\341" + "\346\344\344\351\371\371\374\204\376\376\376\11\356\356\364\312\312\322\316" + "\316\326\346\346\355\354\352\362\341\341\346\277\277\310\316\316\326\371" + "\371\374\205\376\376\376\3\351\351\355\306\306\310\314\314\315\202\333\333" + "\333\11\327\327\327\337\337\331\370\370\365\365\365\365\345\345\346\314\314" + "\315\240\240\241jjk\261\261\260\202\0\0\0\14\14\14\15\0\0\0\\\\^\272\272" + "\264\306\306\310\314\314\315\267\267\272vvw\\\\^\223\223\224jjk!\"!\202\0" + "\0\0(557jjkIIL\\\\^vvw\217\216\224\255\255\260\263\263\277\235\235\234\177" + "\177\177vvw\177\177\177\231\236v\273\306t\305\327T\271\326C\264\322@\271" + "\326C\311\350T\332\375H\222\261\33!\"!vvw\253\252\253vvw\177\177\177\215" + "\216\206\235\235\234\261\261\260\302\302\302\327\327\327\345\345\346\341" + "\341\341\321\321\313\302\302\302\273\301\235\274\320e\275\341<\246\306(\244" + "\3014\202\252\3108+\256\3170\200\220E\245\245\247\314\314\315\345\345\346" + "\361\361\354\345\345\340\330\330\320\322\322\323\351\351\351\374\374\376" + "\376\376\376\344\344\351\334\334\341\344\344\354\334\334\341\312\312\322" + "\346\346\355\376\376\376\374\372\374\351\351\360\334\334\341\360\360\365" + "\376\376\376\374\374\376\316\316\326\277\277\310\346\346\355\362\362\366" + "\327\327\335\263\263\277\316\316\326\371\371\374\376\376\376\374\374\374" + "\374\372\374\371\371\374\354\354\361\312\312\322\273\273\302\324\324\332" + "\333\333\333\306\306\310\321\376\376\376\1\371\343\316\203\361\266\177\2" + "\363\277\216\371\343\316\212\376\376\376\3\370\332\276\353\222@\352\2110" + "\257\376\376\376\2\373\354\336\347x\20\203\376\376\376\2\365\310\236\353" + "\222@\205\345o\0\203\353\222@\1\350\200\40\203\345o\0\1\366\321\256\243\376" + "\376\376\23\364\371\327\244\246\230\220\220\217\235\235\234\253\252\253\274" + "\274\274\314\314\315\327\327\335\341\341\341\351\351\355\356\356\361\365" + "\365\371\371\371\374\374\372\374\376\376\376\365\365\371\354\354\361\356" + "\356\364\365\365\371\202\371\371\374\6\362\362\366\341\341\346\351\351\360" + "\374\372\374\376\376\376\374\374\376\202\376\376\376\10\351\351\360\312\312" + "\322\324\324\332\351\351\360\354\352\362\334\334\341\277\277\310\327\327" + "\335\206\376\376\376\7\341\341\346\277\277\310\314\314\315\327\327\335\327" + "\327\327\322\322\323\341\341\341\202\371\371\371\24\361\361\361\341\341\341" + "\306\306\310\220\220\217jjk\245\245\247\14\14\15\0\0\0\14\14\15\0\0\0IIL" + "\264\264\265\314\314\315\306\306\310\264\264\265\220\220\217\177\177\177" + "\245\245\247\223\223\224\177\177\177\202IIL\4jjk\177\177\177vvw\177\177\177" + "\202\205\205\206\202\177\177\177\16\205\205\206\254\266l\274\320e\305\327" + "T\271\326C\264\322@\271\326C\307\344H\323\363P\241\304\27Oj\16IIL\273\273" + "\302\245\245\247\202\177\177\177\15\220\220\217\245\245\247\272\272\264\314" + "\314\315\333\333\333\345\345\340\355\355\351\361\361\361\337\337\331\321" + "\336\204\305\327T\244\3014\235\272+\204\252\3108\22\256\3170x\222'\245\245" + "\247\314\314\315\345\345\346\365\365\365\351\351\351\327\327\327\322\322" + "\323\341\341\341\371\371\374\376\376\376\354\354\361\334\334\341\344\344" + "\354\344\344\351\316\316\326\334\334\341\202\376\376\376\3\360\360\365\334" + "\334\341\354\354\361\202\376\376\376\22\327\327\335\277\277\310\344\344\354" + "\371\371\374\346\346\355\273\273\302\305\305\315\362\362\366\376\376\376" + "\374\374\374\374\372\374\371\371\374\360\360\365\316\316\326\273\273\302" + "\324\324\332\333\333\333\314\314\315\317\376\376\376\2\365\310\236\350\200" + "\40\206\345o\0\2\353\222@\366\321\256\273\376\376\376\1\371\343\316\202\376" + "\376\376\1\353\222@\215\345o\0\1\352\2110\244\376\376\376\22\364\371\327" + "\231\232\217\220\220\217\235\235\234\253\252\253\274\274\274\314\314\315" + "\327\327\327\341\341\341\351\351\355\356\356\361\365\365\371\371\371\374" + "\374\372\374\374\374\376\365\365\371\356\356\364\360\360\365\202\365\365" + "\371\7\371\371\374\356\356\364\341\341\346\356\356\364\376\376\376\374\374" + "\376\371\371\374\202\376\376\376\3\346\346\355\312\312\322\327\327\335\202" + "\351\351\360\3\327\327\335\277\277\310\341\341\346\205\376\376\376\10\374" + "\374\376\327\327\335\273\273\302\314\314\315\324\324\332\322\322\323\314" + "\314\315\345\345\346\202\376\376\376\10\371\371\371\355\355\355\333\333\333" + "\302\302\302\220\220\217\\\\^\240\240\241557\203\0\0\0\14""557\235\235\234" + "\306\306\310\302\302\302\264\264\265\245\245\247\220\220\217\212\212\214" + "\205\205\206\177\177\177\\\\^\215\230S\202\231\236v\202\231\232\217\5\231" + "\236v\254\266l\274\320e\305\327T\275\333G\202\264\322@\20\271\326C\303\343" + "C\312\3577\241\304\27Oj\16IIL\255\255\260\277\277\310\220\220\217\205\205" + "\206\220\220\217\235\235\234\253\252\253\274\274\274\321\321\313\345\345" + "\340\203\352\352\343\5\343\345\233\313\342Z\252\3108\235\272+\244\3014\203" + "\252\3108-\244\3014\252\3108\246\306(x\222'\245\245\247\314\314\315\345\345" + "\346\365\365\371\361\361\361\333\333\333\322\322\323\334\334\341\365\365" + "\371\376\376\376\362\362\366\334\334\341\346\346\355\351\351\360\324\324" + "\332\327\327\335\371\371\374\376\376\376\365\365\371\341\341\346\351\351" + "\360\374\374\376\376\376\376\334\334\341\277\277\310\341\341\346\371\371" + "\374\356\356\364\305\305\315\277\277\310\354\354\361\376\376\376\374\374" + "\374\374\372\374\371\371\374\362\362\366\316\316\326\273\273\302\322\322" + "\323\333\333\333\314\314\315\315\376\376\376\1\370\332\276\202\350\200\40" + "\2\353\222@\347x\20\207\345o\0\2\350\200\40\365\310\236\206\376\376\376\1" + "\371\343\316\264\376\376\376\1\353\222@\215\345o\0\2\347x\20\371\343\316" + "\244\376\376\376\14\364\371\327\231\232\217\217\216\224\240\240\241\255\255" + "\260\273\273\302\314\314\315\327\327\327\341\341\341\351\351\355\356\356" + "\361\365\365\371\202\371\371\374\4\374\372\374\365\365\371\356\356\364\360" + "\360\365\203\365\365\371\20\356\356\364\344\344\351\362\362\366\376\376\376" + "\371\371\374\365\365\371\374\374\376\376\376\376\344\344\354\312\312\322" + "\327\327\335\354\352\362\351\351\360\324\324\332\277\277\310\346\346\355" + "\205\376\376\376\5\374\372\374\324\324\332\273\273\302\305\305\315\322\322" + "\323\202\314\314\315\1\351\351\355\202\376\376\376\11\374\374\374\365\365" + "\365\351\351\355\327\327\327\302\302\302\205\205\206IIL\212\212\214\\\\^" + "\203\0\0\0\16\14\14\15vvw\267\267\272\302\302\302\267\267\272\255\255\260" + "\235\235\234\205\205\206jjk\\\\^\260\301O\312\346G\275\333G\304\341M\202" + "\275\333G\1\264\322@\203\261\3217\27\270\3367\275\341-\262\330)\222\261\33" + "Oj\16jjk\263\263\277\306\306\310\223\223\224vvw\205\205\206\223\223\224\253" + "\252\253\302\302\302\314\314\315\330\330\320\337\337\331\352\352\343\357" + "\367\303\335\352\213\305\327T\252\3108\235\272+\207\244\3014,\252\3108\246" + "\306(cq2\253\252\253\314\314\315\345\345\346\365\365\371\365\365\365\341" + "\341\341\322\322\323\327\327\335\360\360\365\376\376\376\365\365\371\341" + "\341\346\346\346\355\354\354\361\334\334\341\324\324\332\362\362\366\376" + "\376\376\371\371\374\344\344\354\351\351\360\374\372\374\376\376\376\344" + "\344\351\277\277\310\334\334\341\371\371\374\365\365\371\312\312\322\273" + "\273\302\351\351\355\376\376\376\374\374\374\374\372\374\371\371\374\362" + "\362\366\324\324\332\273\273\302\322\322\323\333\333\333\314\314\315\314" + "\376\376\376\3\371\343\316\360\255p\371\343\316\203\376\376\376\2\370\332" + "\276\352\2110\210\345o\0\6\352\2110\353\222@\356\244`\353\222@\350\200\40" + "\355\233P\264\376\376\376\1\350\200\40\214\345o\0\2\347x\20\371\343\316\245" + "\376\376\376\1\361\367\316\202\220\220\217\10\240\240\241\255\255\260\273" + "\273\302\314\314\315\327\327\327\341\341\341\354\354\361\356\356\364\202" + "\365\365\371\202\371\371\374\1\365\365\371\202\360\360\365\203\365\365\371" + "\20\354\354\361\346\346\355\365\365\371\376\376\376\365\365\371\362\362\366" + "\371\371\374\376\376\376\344\344\351\316\316\326\334\334\341\354\354\361" + "\346\346\355\316\316\326\305\305\315\356\356\364\205\376\376\376\10\374\372" + "\374\316\316\326\273\273\302\305\305\315\316\316\326\306\306\310\314\314" + "\315\356\356\361\203\376\376\376\12\374\374\374\365\365\365\351\351\351\327" + "\327\327\261\261\260\215\216\206IILvvw\177\177\177\14\14\15\203\0\0\0\31" + "!\"!\205\205\206\264\264\265\274\274\274\264\264\265\235\235\234\231\232" + "\217\215\216\206\254\266l\312\3577\266\3363\266\3341\266\336/\265\332+\270" + "\334+\270\336-\265\332+\256\3170\235\272+\200\220Evvw\227\227\231\277\277" + "\310\267\267\272\223\223\224\202\177\177\177\13\215\216\206\235\235\234\253" + "\252\253\302\302\302\327\327\327\345\345\346\337\337\331\343\345\233\323" + "\335i\271\326C\244\3014\202\235\272+\211\244\3014\25\246\306(cq2\253\252" + "\253\314\314\315\345\345\346\365\365\371\371\371\371\345\345\346\322\322" + "\323\327\327\327\356\356\361\376\376\376\371\371\371\344\344\351\346\346" + "\355\356\356\364\341\341\346\324\324\332\356\356\361\376\376\376\374\372" + "\374\202\351\351\360\5\371\371\374\376\376\376\351\351\355\277\277\310\334" + "\334\341\202\371\371\374\15\324\324\332\273\273\302\344\344\351\376\376\376" + "\374\374\374\374\372\374\371\371\374\365\365\371\327\327\335\273\273\302" + "\316\316\326\333\333\333\314\314\315\324\376\376\376\1\356\244`\214\345o" + "\0\1\373\354\336\264\376\376\376\1\366\321\256\213\345o\0\1\356\244`\247" + "\376\376\376\15\361\367\316\215\216\206\223\223\224\240\240\241\255\255\260" + "\273\273\302\314\314\315\324\324\332\341\341\341\354\354\361\356\356\361" + "\362\362\366\365\365\371\202\371\371\374\1\365\365\371\202\360\360\365\20" + "\362\362\366\365\365\371\362\362\366\354\354\361\351\351\355\371\371\374" + "\374\374\376\362\362\366\360\360\365\371\371\374\376\376\376\344\344\351" + "\316\316\326\334\334\341\354\354\361\344\344\354\202\312\312\322\1\365\365" + "\371\205\376\376\376\10\371\371\371\312\312\322\273\273\302\305\305\315\312" + "\312\322\277\277\310\312\312\322\362\362\366\204\376\376\376\12\374\372\374" + "\365\365\365\345\345\346\313\313\301\261\261\260\235\235\234\\\\^jjk\212" + "\212\214IIL\204\0\0\0\7!\"!jjk\223\223\224\240\240\241\245\245\247\231\232" + "\217\231\236v\206\232\256S\4\231\236v\215\216\206\227\227\231\255\255\260" + "\202\273\273\302\16\253\252\253\212\212\214vvw\205\205\206\220\220\217\235" + "\235\234\253\252\253\272\272\264\302\302\302\313\313\301\343\345\233\326" + "\343z\305\327T\252\3108\202\235\272+\214\244\3014\15\246\306(cq2\253\252" + "\253\314\314\315\341\341\346\365\365\371\374\374\376\351\351\355\327\327" + "\327\324\324\332\354\354\361\376\376\376\371\371\374\202\346\346\355\4\356" + "\356\364\346\346\355\327\327\335\354\354\361\202\376\376\376\16\356\356\364" + "\351\351\360\371\371\374\376\376\376\356\356\364\305\305\315\334\334\341" + "\371\371\374\376\376\376\341\341\346\277\277\310\334\334\341\376\376\376" + "\374\374\376\202\374\372\374\6\365\365\371\327\327\335\263\263\277\316\316" + "\326\333\333\333\314\314\315\325\376\376\376\1\352\2110\212\345o\0\1\361" + "\266\177\266\376\376\376\1\353\222@\207\345o\0\2\347x\20\361\266\177\251" + "\376\376\376\14\361\367\316\205\205\206\223\223\224\240\240\241\255\255\260" + "\273\273\302\314\314\315\324\324\332\341\341\346\354\354\361\356\356\361" + "\362\362\366\202\365\365\371\2\371\371\374\365\365\371\202\360\360\365\203" + "\362\362\366\2\354\354\361\351\351\360\202\371\371\374\202\356\356\364\12" + "\365\365\371\376\376\376\344\344\354\316\316\326\341\341\346\356\356\364" + "\344\344\354\312\312\322\316\316\326\365\365\371\205\376\376\376\3\371\371" + "\371\305\305\315\263\263\277\202\305\305\315\3\273\273\302\316\316\326\365" + "\365\371\205\376\376\376\14\374\372\374\361\361\361\330\330\320\313\313\301" + "\272\272\264\244\246\230\177\177\177vvw\223\223\224\205\205\206IIL\14\14" + "\15\204\0\0\0\3\14\14\15""557\177\177\177\202jjk\5vvw\177\177\177\217\216" + "\224\227\227\231\245\245\247\202\263\263\277\3\264\264\265\240\240\241\212" + "\212\214\202\177\177\177\15\205\205\206\223\223\224\240\240\241\261\261\260" + "\274\274\274\312\316\253\317\323\213\323\335i\305\327T\252\3108\235\272+" + "\222\261\33\235\272+\216\244\3014\15\246\306(cq2\253\252\253\314\314\315" + "\341\341\341\365\365\365\374\374\376\356\356\361\327\327\327\324\324\332" + "\351\351\355\376\376\376\371\371\374\202\351\351\360\4\356\356\364\351\351" + "\360\334\334\341\351\351\355\202\376\376\376\14\360\360\365\351\351\360\371" + "\371\374\376\376\376\362\362\366\305\305\315\334\334\341\371\371\374\376" + "\376\376\344\344\354\277\277\310\327\327\335\202\374\374\376\10\374\372\374" + "\371\371\374\371\371\371\327\327\335\273\273\302\316\316\326\333\333\333" + "\314\314\315\325\376\376\376\1\371\343\316\211\345o\0\1\347x\20\267\376\376" + "\376\1\370\332\276\206\345o\0\1\361\266\177\253\376\376\376\11\361\367\316" + "\205\205\206\223\223\224\245\245\247\255\255\260\273\273\302\314\314\315" + "\324\324\332\341\341\346\202\354\354\361\1\362\362\366\203\365\365\371\202" + "\362\362\366\202\360\360\365\202\362\362\366\202\354\354\361\202\371\371" + "\374\202\351\351\360\12\365\365\371\376\376\376\344\344\354\324\324\332\341" + "\341\346\356\356\364\344\344\351\312\312\322\324\324\332\371\371\371\205" + "\376\376\376\3\371\371\371\305\305\315\263\263\277\202\305\305\315\3\273" + "\273\302\322\322\323\374\372\374\206\376\376\376\16\362\362\366\337\337\331" + "\330\330\320\313\313\301\272\272\264\253\252\253\240\240\241\205\205\206" + "\220\220\217\240\240\241\220\220\217jjkIIL\14\14\15\203\0\0\0\3""557jjk\177" + "\177\177\207\205\205\206\202\212\212\214\202\215\216\206\10\231\232\217\244" + "\246\230\273\301\235\317\323\213\310\330r\305\327T\264\322@\244\3014\202" + "\222\261\33\221\235\272+\24\244\3014\246\306(cq2\253\252\253\314\314\315" + "\341\341\341\362\362\366\374\374\376\362\362\366\333\333\333\324\324\332" + "\346\346\355\376\376\376\374\372\374\354\352\362\351\351\360\356\356\364" + "\354\354\361\334\334\341\346\346\355\202\376\376\376\26\362\362\366\354\352" + "\362\371\371\374\376\376\376\362\362\366\312\312\322\334\334\341\371\371" + "\374\376\376\376\354\354\361\305\305\315\324\324\332\374\372\374\374\374" + "\376\374\372\374\371\371\374\371\371\371\334\334\341\273\273\302\316\316" + "\326\333\333\333\314\314\315\326\376\376\376\1\363\277\216\210\345o\0\1\356" + "\244`\270\376\376\376\1\352\2110\203\345o\0\2\347x\20\370\332\276\254\376" + "\376\376\11\361\367\316\205\205\206\223\223\224\245\245\247\255\255\260\274" + "\274\274\314\314\315\324\324\332\341\341\346\202\354\354\361\202\362\362" + "\366\202\365\365\371\202\362\362\366\2\360\360\365\356\356\364\202\360\360" + "\365\4\354\354\361\356\356\364\371\371\374\365\365\371\202\346\346\355\12" + "\362\362\366\376\376\376\346\346\355\324\324\332\341\341\346\356\356\364" + "\341\341\346\312\312\322\327\327\335\371\371\374\205\376\376\376\3\371\371" + "\371\312\312\322\263\263\277\202\277\277\310\2\273\273\302\324\324\332\207" + "\376\376\376\2\365\365\365\337\337\331\202\330\330\320\5\321\321\313\313" + "\313\301\302\302\302\255\255\260\235\235\234\202\205\205\206\5\212\212\214" + "\205\205\206\177\177\177vvwjjk\202IIL\1\177\177\177\202\223\223\224\1\220" + "\220\217\203\215\216\206\13\223\223\224\227\227\231\244\246\230\256\263\231" + "\254\266l\273\306t\274\320e\305\327T\264\322@\244\3014\235\272+\202\222\261" + "\33\224\235\272+\20\244\3014\246\306(cq2\253\252\253\314\314\315\341\341" + "\341\361\361\361\374\374\376\365\365\371\334\334\341\324\324\332\346\346" + "\355\374\374\376\371\371\374\356\356\364\354\354\361\202\356\356\364\202" + "\344\344\354\21\374\372\374\376\376\376\365\365\371\354\352\362\371\371\374" + "\376\376\376\365\365\371\316\316\326\341\341\346\371\371\374\376\376\376" + "\360\360\365\312\312\322\324\324\332\371\371\374\374\374\376\371\371\374" + "\202\371\371\371\5\334\334\341\273\273\302\322\322\323\333\333\333\314\314" + "\315\327\376\376\376\1\356\244`\207\345o\0\1\373\354\336\270\376\376\376" + "\1\365\310\236\202\345o\0\2\347x\20\371\343\316\255\376\376\376\13\361\367" + "\316\205\205\206\223\223\224\245\245\247\255\255\260\274\274\274\314\314" + "\315\324\324\332\345\345\346\354\354\361\351\351\355\202\362\362\366\202" + "\365\365\371\202\362\362\366\2\360\360\365\354\354\361\202\356\356\364\4" + "\354\354\361\360\360\365\371\371\374\362\362\366\202\344\344\354\12\360\360" + "\365\376\376\376\351\351\360\327\327\335\341\341\346\356\356\364\341\341" + "\346\316\316\326\334\334\341\374\372\374\205\376\376\376\3\371\371\371\312" + "\312\322\263\263\277\202\277\277\310\2\263\263\277\324\324\332\207\376\376" + "\376\17\365\365\365\333\333\333\327\327\327\337\337\331\330\330\320\337\337" + "\331\333\333\333\314\314\315\274\274\274\253\252\253\235\235\234\212\212" + "\214vvwjjk\\\\^\202jjk\2\\\\^\232\256S\205\273\306t\202\274\320e\5\260\301" + "O\264\322@\252\3108\244\3014\235\272+\204\222\261\33\227\235\272+\16\244" + "\3014\246\306(cq2\253\252\253\314\314\315\341\341\341\356\356\361\371\371" + "\374\365\365\371\341\341\341\327\327\335\351\351\355\374\374\376\371\371" + "\374\202\356\356\364\202\354\352\362\23\346\346\355\344\344\354\371\371\374" + "\376\376\376\365\365\371\356\356\364\371\371\374\376\376\376\362\362\366" + "\316\316\326\344\344\354\374\374\376\376\376\376\362\362\366\316\316\326" + "\324\324\332\371\371\374\374\374\376\371\371\374\202\371\371\371\5\334\334" + "\341\273\273\302\322\322\323\333\333\333\314\314\315\330\376\376\376\1\352" + "\2110\205\345o\0\1\352\2110\272\376\376\376\3\347x\20\345o\0\366\321\256" + "\256\376\376\376\15\361\367\316\177\177\177\223\223\224\245\245\247\255\255" + "\260\274\274\274\314\314\315\322\322\323\345\345\346\354\354\361\351\351" + "\355\360\360\365\362\362\366\202\365\365\371\3\362\362\366\365\365\371\360" + "\360\365\202\354\354\361\202\356\356\364\3\360\360\365\371\371\374\360\360" + "\365\202\341\341\346\12\356\356\364\376\374\376\354\354\361\327\327\335\341" + "\341\346\354\354\361\341\341\346\316\316\326\334\334\341\374\372\374\205" + "\376\376\376\3\371\371\371\312\312\322\263\263\277\202\277\277\310\2\273" + "\273\302\324\324\332\207\376\376\376\23\365\365\365\333\333\333\330\330\320" + "\333\333\333\337\337\331\351\351\351\355\355\355\345\345\346\327\327\327" + "\314\314\315\274\274\274\255\255\260\240\240\241\227\227\231\212\212\214" + "vvwjjk\\\\^\232\256S\214\222\261\33\233\235\272+\22\244\3014\246\306(cq2" + "\253\252\253\314\314\315\341\341\341\356\356\361\371\371\374\365\365\371" + "\341\341\346\333\333\333\354\354\361\374\374\376\371\371\374\360\360\365" + "\356\356\364\351\351\360\354\352\362\202\346\346\355\21\371\371\374\376\376" + "\376\371\371\374\360\360\365\371\371\374\376\376\376\362\362\366\316\316" + "\326\346\346\355\374\374\376\376\376\376\365\365\371\316\316\326\324\324" + "\332\371\371\374\374\374\376\371\371\374\202\371\371\371\5\334\334\341\273" + "\273\302\324\324\332\333\333\333\314\314\315\331\376\376\376\1\355\233P\204" + "\345o\0\1\363\277\216\272\376\376\376\2\356\244`\353\222@\257\376\376\376" + "\11\360\367\307\205\205\206\223\223\224\245\245\247\255\255\260\274\274\274" + "\306\306\310\322\322\323\345\345\346\202\351\351\355\1\360\360\365\202\362" + "\362\366\4\365\365\371\360\360\365\365\365\371\360\360\365\202\351\351\360" + "\5\354\354\361\356\356\364\362\362\366\371\371\374\356\356\364\202\341\341" + "\346\12\351\351\360\374\374\376\354\354\361\334\334\341\341\341\346\354\352" + "\362\341\341\346\316\316\326\341\341\346\374\374\376\205\376\376\376\3\371" + "\371\374\316\316\326\263\263\277\202\277\277\310\2\273\273\302\327\327\335" + "\207\376\376\376\17\365\365\371\327\327\327\322\322\323\327\327\327\337\337" + "\331\355\355\355\371\371\371\365\365\365\355\355\355\345\345\346\333\333" + "\333\314\314\315\302\302\302\267\267\272\253\252\253\202\231\232\217\2\220" + "\220\217\232\256S\207\222\261\33\205\235\272+\202\222\261\33\231\235\272" + "+\7\244\3014\246\306(cq2\245\245\247\314\314\315\341\341\341\355\355\355" + "\202\365\365\371\3\345\345\346\334\334\341\356\356\361\202\371\371\374\202" + "\360\360\365\1\346\346\355\203\351\351\360\14\371\371\374\376\376\376\371" + "\371\374\362\362\366\371\371\374\376\376\376\362\362\366\324\324\332\351" + "\351\360\374\374\376\376\376\376\365\365\371\202\324\324\332\3\371\371\374" + "\374\374\376\371\371\374\202\371\371\371\5\334\334\341\273\273\302\324\324" + "\332\333\333\333\314\314\315\332\376\376\376\2\371\343\316\361\266\177\202" + "\353\222@\1\373\354\336\272\376\376\376\2\365\310\236\366\321\256\257\376" + "\376\376\11\360\367\307\205\205\206\223\223\224\245\245\247\255\255\260\274" + "\274\274\306\306\310\322\322\323\345\345\346\202\351\351\355\202\360\360" + "\365\202\362\362\366\3\356\356\364\365\365\371\360\360\365\202\351\351\355" + "\5\354\354\361\356\356\364\362\362\366\371\371\374\354\354\361\202\334\334" + "\341\14\346\346\355\371\371\374\360\360\365\334\334\341\341\341\346\351\351" + "\360\341\341\346\324\324\332\344\344\354\374\374\376\371\371\374\374\374" + "\376\203\376\376\376\3\374\372\374\324\324\332\273\273\302\202\277\277\310" + "\2\273\273\302\327\327\335\207\376\376\376\23\371\371\371\333\333\333\321" + "\321\313\322\322\323\327\327\327\361\361\361\376\376\376\374\374\374\371" + "\371\371\365\365\365\355\355\355\351\351\351\341\341\341\327\327\327\314" + "\314\315\272\272\264\261\261\260\244\246\230\254\266l\202x\253\27\226\222" + "\261\33\203\235\272+\204\246\306(\1\256\3170\202\261\3217\205\267\3309\16" + "\271\336:\275\341-cq2\245\245\247\314\314\315\341\341\341\351\351\355\365" + "\365\371\371\371\374\351\351\351\341\341\346\360\360\365\371\371\374\365" + "\365\371\202\360\360\365\2\344\344\354\346\346\355\202\354\352\362\20\371" + "\371\374\376\376\376\371\371\374\365\365\371\371\371\374\376\376\376\362" + "\362\366\327\327\335\354\352\362\374\374\376\376\376\376\365\365\371\327" + "\327\335\324\324\332\371\371\374\374\374\376\202\371\371\374\6\365\365\371" + "\327\327\335\277\277\310\327\327\335\333\333\333\314\314\315\377\376\376" + "\376\313\376\376\376\13\360\367\307\205\205\206\223\223\224\245\245\247\255" + "\255\260\267\267\272\306\306\310\322\322\323\341\341\346\351\351\355\346" + "\346\355\202\360\360\365\202\362\362\366\12\356\356\364\365\365\371\360\360" + "\365\351\351\355\346\346\355\351\351\360\356\356\364\362\362\366\365\365" + "\371\354\354\361\202\334\334\341\3\344\344\354\371\371\374\362\362\366\202" + "\341\341\346\5\351\351\360\341\341\346\324\324\332\344\344\354\374\372\374" + "\202\371\371\374\203\376\376\376\2\374\372\374\334\334\341\203\277\277\310" + "\2\273\273\302\327\327\335\207\376\376\376\6\374\372\374\333\333\333\321" + "\321\313\322\322\323\330\330\320\355\355\355\203\376\376\376\14\374\374\374" + "\371\371\371\370\370\365\362\362\366\355\355\355\345\345\346\330\330\320" + "\313\313\301\261\261\260\254\266l\244\3014\252\3108\206\244\3014\206\235" + "\272+\214\222\261\33\204x\253\27\204b\203\27\207Oj\16\20cq2\245\245\247\314" + "\314\315\341\341\341\351\351\351\365\365\371\371\371\374\351\351\355\351" + "\351\351\365\365\371\371\371\374\365\365\371\362\362\366\356\356\364\341" + "\341\346\346\346\355\202\354\352\362\14\371\371\374\376\376\376\371\371\374" + "\365\365\371\374\372\374\376\376\376\360\360\365\327\327\335\356\356\364" + "\374\374\376\376\376\376\365\365\371\202\327\327\335\2\371\371\374\374\374" + "\376\202\371\371\374\6\365\365\371\327\327\335\277\277\310\334\334\341\333" + "\333\333\314\314\315\377\376\376\376\313\376\376\376\13\360\367\307\205\205" + "\206\223\223\224\245\245\247\255\255\260\267\267\272\306\306\310\322\322" + "\323\341\341\346\351\351\355\346\346\355\202\360\360\365\202\362\362\366" + "\1\354\354\361\202\362\362\366\3\346\346\355\344\344\354\351\351\360\202" + "\360\360\365\2\365\365\371\354\354\361\202\334\334\341\1\341\341\346\202" + "\365\365\371\7\344\344\351\341\341\346\351\351\360\344\344\351\327\327\335" + "\346\346\355\374\372\374\202\371\371\374\204\376\376\376\1\344\344\351\204" + "\277\277\310\1\333\333\333\207\376\376\376\7\374\374\374\341\341\341\314" + "\314\315\321\321\313\322\322\323\351\351\351\374\374\376\205\376\376\376" + "\7\374\374\374\371\371\371\370\370\365\352\352\343\330\330\320\302\302\302" + "\177\177\177\205\205\205\206\211\177\177\177\202\205\205\206\202\212\212" + "\214\5\215\216\206\220\220\217\227\227\231\235\235\234\240\240\241\204\245" + "\245\247\4\240\240\241\235\235\234\227\227\231\223\223\224\202\220\220\217" + "\205\212\212\214\203\217\216\224\7\220\220\217\253\252\253\314\314\315\341" + "\341\341\351\351\351\365\365\371\371\371\374\202\354\354\361\13\371\371\374" + "\365\365\371\362\362\366\365\365\371\354\354\361\341\341\346\344\344\354" + "\356\356\364\360\360\365\371\371\374\376\376\376\202\371\371\374\14\374\374" + "\376\376\376\376\354\354\361\334\334\341\360\360\365\371\371\374\376\376" + "\376\365\365\371\327\327\335\334\334\341\374\372\374\374\374\376\202\371" + "\371\374\6\365\365\371\324\324\332\305\305\315\341\341\341\333\333\333\314" + "\314\315\377\376\376\376\313\376\376\376\14\360\367\307\215\216\206\220\220" + "\217\245\245\247\255\255\260\267\267\272\306\306\310\322\322\323\341\341" + "\346\351\351\355\344\344\351\356\356\364\202\360\360\365\2\362\362\366\354" + "\354\361\202\362\362\366\3\346\346\355\344\344\351\351\351\355\202\360\360" + "\365\2\365\365\371\351\351\360\203\334\334\341\14\362\362\366\365\365\371" + "\346\346\355\344\344\351\351\351\360\344\344\351\334\334\341\346\346\355" + "\371\371\374\365\365\371\371\371\374\376\376\376\202\374\374\376\3\376\376" + "\376\354\354\361\312\312\322\202\305\305\315\2\277\277\310\327\327\335\210" + "\376\376\376\6\351\351\351\314\314\315\321\321\313\322\322\323\345\345\346" + "\374\374\374\210\376\376\376\7\365\365\361\345\345\340\321\321\313\253\252" + "\253\227\227\231\212\212\214\205\205\206\206\177\177\177\213\205\205\206" + "\207\212\212\214\205\220\220\217\210\223\223\224\202\240\240\241\23\264\264" + "\265\322\322\323\341\341\341\351\351\351\365\365\371\371\371\374\356\356" + "\361\360\360\365\371\371\374\362\362\366\360\360\365\365\365\371\351\351" + "\360\334\334\341\344\344\354\360\360\365\362\362\366\374\372\374\376\376" + "\376\202\371\371\374\24\374\374\376\376\376\376\354\354\361\341\341\346\362" + "\362\366\365\365\371\371\371\374\365\365\371\327\327\335\334\334\341\374" + "\372\374\374\374\376\371\371\374\374\372\374\365\365\365\316\316\326\305" + "\305\315\341\341\341\333\333\333\314\314\315\377\376\376\376\313\376\376" + "\376\14\360\367\307\215\216\206\217\216\224\245\245\247\255\255\260\267\267" + "\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351\356\356" + "\361\202\360\360\365\7\362\362\366\354\354\361\356\356\364\362\362\366\351" + "\351\355\344\344\351\346\346\355\202\360\360\365\16\362\362\366\354\352\362" + "\334\334\341\327\327\335\334\334\341\360\360\365\371\371\374\351\351\360" + "\344\344\351\351\351\355\344\344\354\334\334\341\346\346\355\374\372\374" + "\202\365\365\371\202\376\376\376\4\374\372\374\376\376\376\362\362\366\316" + "\316\326\203\305\305\315\2\327\327\335\371\371\374\207\376\376\376\6\361" + "\361\361\322\322\323\321\321\313\322\322\323\341\341\341\374\374\372\210" + "\376\376\376\10\374\374\372\352\352\343\330\330\320\313\313\301\274\274\274" + "\253\252\253\235\235\234\223\223\224\205\220\220\217\205\223\223\224\205" + "\220\220\217\204\223\223\224\1\220\220\217\202\215\216\206\203\223\223\224" + "\3\220\220\217\215\216\206\220\220\217\202\223\223\224\1\220\220\217\203" + "\223\223\224\25\215\216\206\220\220\217\240\240\241\253\252\253\302\302\302" + "\333\333\333\341\341\341\351\351\351\365\365\371\371\371\374\356\356\364" + "\365\365\371\371\371\374\360\360\365\356\356\364\365\365\371\344\344\351" + "\327\327\335\346\346\355\360\360\365\362\362\366\202\374\374\376\202\371" + "\371\374\202\376\376\376\22\354\354\361\344\344\354\362\362\366\365\365\371" + "\371\371\374\362\362\366\334\334\341\344\344\351\374\374\376\374\374\374" + "\371\371\374\374\372\374\362\362\366\316\316\326\312\312\322\341\341\341" + "\333\333\333\314\314\315\233\376\376\376\4\336\346\354\236\270\311~\240\270" + "i\221\254\202S\201\240\4i\221\254~\240\270\236\270\311\310\327\341\220\376" + "\376\376\3\275\317\333\223\260\303~\240\270\204S\201\240\4i\221\254~\240" + "\270\250\277\317\371\372\373\213\376\376\376\1\275\317\333\205~\240\270\1" + "\236\270\311\217\376\376\376\3\371\372\373\275\317\333\236\270\311\202~\240" + "\270\203S\201\240\4^\211\246~\240\270\223\260\303\275\317\333\215\376\376" + "\376\205\250\277\317\1\371\372\373\204\376\376\376\6\262\307\325s\231\262" + "S\201\240i\221\254\223\260\303\371\372\373\204\376\376\376\1\275\317\333" + "\205\250\277\317\1\371\372\373\212\376\376\376\4\323\337\346\236\270\311" + "~\240\270^\211\246\202S\201\240\4i\221\254~\240\270\236\270\311\310\327\341" + "\202\376\376\376\1\371\372\373\202\323\337\346\2\371\372\373\336\346\354" + "\232\376\376\376\1\360\367\307\202\220\220\217\11\240\240\241\255\255\260" + "\267\267\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351" + "\354\354\361\202\360\360\365\7\362\362\366\354\354\361\356\356\364\365\365" + "\371\351\351\360\341\341\346\346\346\355\202\360\360\365\20\362\362\366\354" + "\354\361\334\334\341\327\327\335\334\334\341\354\352\362\371\371\374\356" + "\356\364\344\344\354\351\351\355\346\346\355\341\341\346\351\351\355\374" + "\372\374\362\362\366\365\365\371\202\376\376\376\4\371\371\374\374\374\376" + "\365\365\371\327\327\335\202\312\312\322\3\305\305\315\327\327\335\371\371" + "\371\207\376\376\376\6\365\365\371\327\327\327\321\321\313\322\322\323\337" + "\337\331\371\371\371\211\376\376\376\12\361\361\354\337\337\331\330\330\320" + "\314\314\315\306\306\310\274\274\274\267\267\272\264\264\265\261\261\260" + "\264\264\265\203\261\261\260\214\267\267\272\1\264\264\265\202\253\252\253" + "\1\261\261\260\202\267\267\272\1\261\261\260\202\253\252\253\1\264\264\265" + "\202\267\267\272\1\264\264\265\202\267\267\272\6\261\261\260\253\252\253" + "\264\264\265\274\274\274\306\306\310\327\327\327\202\341\341\341\20\351\351" + "\355\371\371\371\371\371\374\362\362\366\371\371\374\365\365\371\354\354" + "\361\360\360\365\365\365\371\341\341\346\327\327\335\351\351\355\362\362" + "\366\365\365\371\374\374\376\374\372\374\202\371\371\374\2\376\376\376\374" + "\374\376\202\351\351\360\20\360\360\365\362\362\366\365\365\371\360\360\365" + "\334\334\341\351\351\355\376\376\376\374\372\374\371\371\374\374\372\374" + "\360\360\365\312\312\322\324\324\332\341\341\346\333\333\333\314\314\315" + "\231\376\376\376\2\323\337\346~\240\270\212S\201\240\2^\211\246\250\277\317" + "\214\376\376\376\2\236\270\311^\211\246\213S\201\240\2~\240\270\371\372\373" + "\211\376\376\376\1\250\277\317\205S\201\240\1~\240\270\214\376\376\376\3" + "\336\346\354\236\270\311i\221\254\214S\201\240\2^\211\246\250\277\317\213" + "\376\376\376\205S\201\240\1\323\337\346\202\376\376\376\2\371\372\373s\231" + "\262\205S\201\240\1\323\337\346\204\376\376\376\1~\240\270\205S\201\240\1" + "\323\337\346\210\376\376\376\2\323\337\346i\221\254\212S\201\240\3^\211\246" + "\250\277\317\310\327\341\202~\240\270\2\223\260\303^\211\246\232\376\376" + "\376\17\354\366\307\231\232\217\212\212\214\240\240\241\255\255\260\267\267" + "\272\302\302\302\316\316\326\341\341\346\351\351\355\344\344\351\354\354" + "\361\362\362\366\360\360\365\362\362\366\202\354\354\361\4\365\365\371\354" + "\354\361\341\341\346\344\344\354\203\360\360\365\2\354\354\361\334\334\341" + "\202\327\327\335\15\346\346\355\371\371\374\360\360\365\346\346\355\351\351" + "\360\351\351\355\341\341\346\351\351\355\374\374\374\365\365\371\362\362" + "\366\374\374\376\376\376\376\203\371\371\374\6\344\344\351\322\322\323\316" + "\316\326\312\312\322\327\327\335\365\365\365\207\376\376\376\2\374\372\374" + "\345\345\346\202\322\322\323\2\333\333\333\362\362\366\211\376\376\376\2" + "\371\371\371\352\352\343\203\337\337\331\1\333\333\333\202\327\327\327\204" + "\322\322\323\202\321\321\313\1\322\322\323\210\327\327\327\2\322\322\323" + "\321\321\313\202\313\313\301\1\322\322\323\203\327\327\327\202\313\313\301" + "\1\321\321\313\206\327\327\327\3\314\314\315\313\313\301\327\327\327\202" + "\333\333\333\202\351\351\351\3\341\341\341\356\356\361\374\372\374\203\371" + "\371\374\4\360\360\365\351\351\355\362\362\366\356\356\364\202\327\327\335" + "\1\354\354\361\202\365\365\371\1\374\374\376\202\371\371\374\4\374\372\374" + "\376\376\376\371\371\374\351\351\360\202\354\352\362\17\356\356\364\362\362" + "\366\356\356\364\334\334\341\354\354\361\376\376\376\374\372\374\371\371" + "\374\374\372\374\354\354\361\312\312\322\327\327\335\345\345\346\333\333" + "\333\314\314\315\230\376\376\376\1\275\317\333\216S\201\240\1\310\327\341" + "\211\376\376\376\2\323\337\346^\211\246\216S\201\240\2^\211\246\275\317\333" + "\210\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1" + "~\240\270\221S\201\240\1s\231\262\212\376\376\376\205S\201\240\4\250\277" + "\317\376\376\376\336\346\354^\211\246\206S\201\240\1\371\372\373\204\376" + "\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\1\236\270" + "\311\216S\201\240\1\323\337\346\202\250\277\317\2S\201\240^\211\246\232\376" + "\376\376\31\354\366\307\244\246\230\212\212\214\240\240\241\255\255\260\264" + "\264\265\302\302\302\314\314\315\341\341\341\351\351\351\341\341\346\354" + "\354\361\362\362\366\360\360\365\362\362\366\354\354\361\346\346\355\362" + "\362\366\354\354\361\341\341\346\344\344\351\356\356\364\360\360\365\356" + "\356\364\354\354\361\202\334\334\341\4\327\327\335\344\344\351\365\365\371" + "\362\362\366\203\351\351\360\5\344\344\354\351\351\355\371\371\374\365\365" + "\371\356\356\364\202\376\376\376\5\374\372\374\371\371\374\374\374\376\354" + "\354\361\327\327\335\202\322\322\323\2\327\327\335\362\362\366\210\376\376" + "\376\5\361\361\361\327\327\327\322\322\323\327\327\327\355\355\351\212\376" + "\376\376\5\365\365\361\352\352\343\345\345\340\355\355\351\361\361\361\202" + "\355\355\355\1\351\351\355\204\351\351\351\203\345\345\340\205\351\351\351" + "\2\345\345\346\345\345\340\202\337\337\331\2\345\345\340\351\351\351\202" + "\355\355\355\5\351\351\355\345\345\340\337\337\331\345\345\340\355\355\351" + "\205\355\355\355\22\351\351\351\337\337\331\345\345\340\355\355\355\351\351" + "\355\355\355\355\362\362\366\351\351\351\345\345\340\361\361\361\376\376" + "\376\371\371\374\374\372\374\371\371\374\354\354\361\351\351\355\365\365" + "\371\351\351\355\202\327\327\335\1\360\360\365\202\365\365\371\203\371\371" + "\374\5\374\372\374\376\376\376\371\371\371\351\351\360\354\352\362\202\351" + "\351\360\16\356\356\364\354\352\362\334\334\341\360\360\365\376\376\376\374" + "\372\374\371\371\374\374\372\374\346\346\355\316\316\326\341\341\346\345" + "\345\346\333\333\333\314\314\315\227\376\376\376\1\275\317\333\217S\201\240" + "\1\371\372\373\210\376\376\376\1\275\317\333\222S\201\240\1\310\327\341\207" + "\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1~\240" + "\270\222S\201\240\1~\240\270\211\376\376\376\205S\201\240\3\250\277\317\376" + "\376\376i\221\254\207S\201\240\205\376\376\376\1~\240\270\205S\201\240\1" + "\323\337\346\206\376\376\376\1\262\307\325\217S\201\240\1\376\376\376\202" + "\323\337\346\202\275\317\333\232\376\376\376\27\354\366\307\256\263\231\212" + "\212\214\235\235\234\253\252\253\264\264\265\302\302\302\314\314\315\334" + "\334\341\351\351\355\341\341\346\354\354\361\362\362\366\360\360\365\362" + "\362\366\354\354\361\346\346\355\362\362\366\356\356\364\341\341\346\344" + "\344\351\356\356\364\360\360\365\202\354\354\361\202\334\334\341\23\327\327" + "\335\341\341\346\365\365\371\362\362\366\354\354\361\351\351\360\354\354" + "\361\346\346\355\351\351\360\371\371\374\365\365\371\356\356\364\374\372" + "\374\376\376\376\374\372\374\365\365\371\374\374\376\365\365\365\341\341" + "\341\202\327\327\327\2\333\333\333\361\361\361\210\376\376\376\2\371\371" + "\371\341\341\341\202\327\327\327\1\351\351\351\212\376\376\376\5\374\374" + "\372\361\361\354\357\357\346\361\361\354\371\371\371\203\374\372\374\6\370" + "\370\365\365\365\361\370\370\365\371\371\371\370\370\365\365\365\361\203" + "\361\361\354\206\357\357\346\2\365\365\361\371\371\371\202\374\372\374\5" + "\371\371\371\361\361\354\352\352\343\357\357\346\365\365\361\202\374\372" + "\374\202\371\371\371\27\374\372\374\371\371\371\357\357\346\352\352\343\365" + "\365\365\371\371\371\365\365\365\371\371\371\370\370\365\352\352\343\351" + "\351\351\365\365\371\376\376\376\374\372\374\374\374\376\365\365\371\346" + "\346\355\351\351\355\365\365\371\341\341\346\324\324\332\334\334\341\365" + "\365\371\202\362\362\366\202\371\371\374\202\374\372\374\13\376\376\376\365" + "\365\371\354\352\362\351\351\360\344\344\354\346\346\355\356\356\364\351" + "\351\360\341\341\346\365\365\371\376\376\376\203\374\372\374\6\341\341\346" + "\316\316\326\344\344\351\345\345\346\333\333\333\314\314\315\227\376\376" + "\376\1^\211\246\206S\201\240\2^\211\246\223\260\303\203\250\277\317\4\210" + "\250\275s\231\262S\201\240i\221\254\210\376\376\376\2\336\346\354^\211\246" + "\207S\201\240\203~\240\270\1^\211\246\207S\201\240\2^\211\246\371\372\373" + "\206\376\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\1" + "\236\270\311\205S\201\240\1i\221\254\204~\240\270\1i\221\254\210S\201\240" + "\1\275\317\333\210\376\376\376\205S\201\240\2\223\260\303s\231\262\207S\201" + "\240\1i\221\254\205\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205" + "\376\376\376\1\371\372\373\207S\201\240\2i\221\254\223\260\303\203\250\277" + "\317\4\210\250\275i\221\254S\201\240s\231\262\240\376\376\376\32\273\301" + "\235\205\205\206\235\235\234\253\252\253\264\264\265\273\273\302\314\314" + "\315\333\333\333\351\351\351\341\341\346\351\351\355\362\362\366\360\360" + "\365\362\362\366\356\356\364\344\344\351\356\356\364\362\362\366\344\344" + "\354\344\344\351\356\356\364\362\362\366\354\352\362\356\356\364\341\341" + "\346\327\327\335\202\334\334\341\3\360\360\365\365\365\371\356\356\364\204" + "\354\354\361\4\365\365\371\371\371\371\356\356\361\371\371\374\202\376\376" + "\376\4\365\365\371\371\371\374\374\372\374\351\351\355\202\333\333\333\2" + "\337\337\331\356\356\361\211\376\376\376\1\355\355\355\202\337\337\331\2" + "\345\345\340\371\371\371\212\376\376\376\4\371\371\371\361\361\354\357\357" + "\346\370\370\365\204\376\376\376\7\371\371\371\370\370\365\371\371\371\374" + "\374\374\374\374\376\374\374\374\371\371\371\205\370\370\365\2\371\371\371" + "\374\374\374\203\376\376\376\2\371\371\371\361\361\354\202\357\357\346\1" + "\371\371\371\206\376\376\376\13\365\365\361\357\357\346\361\361\354\374\374" + "\374\371\371\371\370\370\365\374\374\374\361\361\361\345\345\340\355\355" + "\355\374\372\374\202\376\376\376\14\374\372\374\354\354\361\341\341\346\356" + "\356\364\362\362\366\334\334\341\324\324\332\344\344\351\365\365\371\356" + "\356\364\362\362\366\365\365\371\202\371\371\374\202\374\372\374\12\362\362" + "\366\356\356\364\344\344\354\341\341\346\344\344\354\354\354\361\351\351" + "\360\344\344\354\371\371\374\376\376\376\202\374\372\374\7\371\371\374\334" + "\334\341\324\324\332\351\351\355\345\345\346\333\333\333\314\314\315\226" + "\376\376\376\1\250\277\317\206S\201\240\1\223\260\303\210\376\376\376\1\336" + "\346\354\210\376\376\376\1s\231\262\206S\201\240\2\250\277\317\363\366\370" + "\204\376\376\376\2\275\317\333^\211\246\206S\201\240\1\223\260\303\206\376" + "\376\376\1\250\277\317\205S\201\240\1~\240\270\213\376\376\376\5\310\327" + "\341S\201\240i\221\254\236\270\311\323\337\346\207\376\376\376\2\371\372" + "\373~\240\270\206S\201\240\1\210\250\275\210\376\376\376\213S\201\240\4^" + "\211\246i\221\254S\201\240~\240\270\205\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\205\376\376\376\1\223\260\303\206S\201\240\1\250\277\317\210" + "\376\376\376\1\336\346\354\240\376\376\376\15\307\322\237\205\205\206\227" + "\227\231\253\252\253\264\264\265\273\273\302\314\314\315\333\333\333\351" + "\351\351\341\341\346\346\346\355\362\362\366\356\356\364\202\360\360\365" + "\12\344\344\351\354\354\361\362\362\366\351\351\355\344\344\351\354\354\361" + "\362\362\366\351\351\360\356\356\364\341\341\346\203\334\334\341\5\354\354" + "\361\365\365\371\360\360\365\356\356\364\356\356\361\202\354\354\361\4\365" + "\365\371\371\371\374\356\356\361\365\365\371\202\376\376\376\5\371\371\371" + "\365\365\371\376\376\376\361\361\361\345\345\346\202\341\341\341\2\355\355" + "\355\374\374\374\210\376\376\376\5\371\371\371\345\345\340\337\337\331\345" + "\345\340\365\365\361\213\376\376\376\1\371\371\371\202\361\361\354\1\371" + "\371\371\204\376\376\376\1\374\374\372\202\370\370\365\2\371\371\371\374" + "\374\376\211\376\376\376\2\374\374\372\365\365\361\202\357\357\346\2\361" + "\361\354\371\371\371\206\376\376\376\1\371\371\371\202\357\357\346\3\371" + "\371\371\374\372\374\370\370\365\202\371\371\371\202\352\352\343\1\365\365" + "\365\203\376\376\376\5\365\365\371\351\351\351\345\345\346\365\365\371\351" + "\351\355\202\327\327\335\5\351\351\360\365\365\371\354\354\361\362\362\366" + "\365\365\371\204\371\371\374\10\362\362\366\354\354\361\341\341\346\334\334" + "\341\341\341\346\351\351\360\346\346\355\351\351\360\202\374\374\376\202" + "\374\372\374\1\365\365\371\202\334\334\341\4\351\351\355\345\345\346\333" + "\333\333\314\314\315\226\376\376\376\1s\231\262\205S\201\240\1~\240\270\221" + "\376\376\376\1\275\317\333\206S\201\240\1\275\317\333\207\376\376\376\2\336" + "\346\354^\211\246\206S\201\240\1\371\372\373\205\376\376\376\1\250\277\317" + "\205S\201\240\1~\240\270\214\376\376\376\1\336\346\354\214\376\376\376\1" + "~\240\270\206S\201\240\210\376\376\376\211S\201\240\2^\211\246\275\317\333" + "\203\376\376\376\1\336\346\354\205\376\376\376\1~\240\270\205S\201\240\1" + "\323\337\346\205\376\376\376\1i\221\254\205S\201\240\1\210\250\275\252\376" + "\376\376\14\325\343\240\205\205\206\223\223\224\253\252\253\264\264\265\273" + "\273\302\314\314\315\333\333\333\351\351\351\341\341\346\344\344\351\362" + "\362\366\202\360\360\365\1\362\362\366\202\346\346\355\16\365\365\371\354" + "\354\361\344\344\351\354\354\361\362\362\366\351\351\360\354\354\361\344" + "\344\351\334\334\341\341\341\346\334\334\341\346\346\355\365\365\371\362" + "\362\366\202\360\360\365\202\356\356\361\4\365\365\371\374\372\374\361\361" + "\361\365\365\371\202\376\376\376\5\371\371\374\365\365\371\374\374\376\371" + "\371\371\355\355\351\202\345\345\346\2\355\355\351\374\374\374\211\376\376" + "\376\1\361\361\354\202\345\345\340\1\361\361\354\214\376\376\376\1\371\371" + "\371\202\365\365\361\1\374\372\374\204\376\376\376\1\374\374\372\203\370" + "\370\365\3\371\371\371\374\372\374\374\374\374\202\376\376\376\5\374\374" + "\374\374\372\374\370\370\365\365\365\361\361\361\354\202\357\357\346\2\370" + "\370\365\374\374\372\206\376\376\376\14\376\376\374\361\361\354\352\352\343" + "\365\365\361\376\376\376\371\371\371\370\370\365\374\374\376\365\365\361" + "\352\352\343\355\355\351\371\371\371\203\376\376\376\14\361\361\361\341\341" + "\341\351\351\355\365\365\371\341\341\346\327\327\327\334\334\341\360\360" + "\365\365\365\371\354\354\361\362\362\366\365\365\371\203\371\371\374\3\365" + "\365\371\362\362\366\351\351\360\202\334\334\341\1\341\341\346\202\351\351" + "\360\14\360\360\365\376\376\376\374\374\376\374\372\374\374\374\374\360\360" + "\365\334\334\341\344\344\351\355\355\355\345\345\346\333\333\333\314\314" + "\315\226\376\376\376\206S\201\240\1\262\307\325\221\376\376\376\1s\231\262" + "\205S\201\240\1\223\260\303\211\376\376\376\1\262\307\325\206S\201\240\1" + "\262\307\325\205\376\376\376\1\250\277\317\205S\201\240\1~\240\270\231\376" + "\376\376\1\336\346\354\206S\201\240\1\336\346\354\207\376\376\376\210S\201" + "\240\2^\211\246\336\346\354\212\376\376\376\1~\240\270\205S\201\240\1\323" + "\337\346\205\376\376\376\206S\201\240\1\310\327\341\252\376\376\376\14\337" + "\360\236\215\216\206\220\220\217\245\245\247\264\264\265\274\274\274\306" + "\306\310\327\327\335\345\345\346\341\341\346\344\344\351\362\362\366\202" + "\360\360\365\10\362\362\366\351\351\355\344\344\351\362\362\366\356\356\364" + "\344\344\354\354\354\361\365\365\371\202\351\351\360\5\346\346\355\334\334" + "\341\341\341\346\334\334\341\344\344\351\203\362\362\366\203\360\360\365" + "\2\365\365\371\374\372\374\202\362\362\366\203\376\376\376\4\365\365\371" + "\371\371\371\374\374\374\365\365\361\202\355\355\351\2\361\361\354\371\371" + "\371\211\376\376\376\5\371\371\371\357\357\346\352\352\343\357\357\346\374" + "\374\372\214\376\376\376\4\371\371\371\365\365\361\370\370\365\374\372\374" + "\205\376\376\376\1\374\374\372\202\370\370\365\205\365\365\361\204\361\361" + "\354\2\365\365\361\371\371\371\210\376\376\376\10\365\365\361\357\357\346" + "\361\361\354\374\374\372\371\371\371\370\370\365\374\372\374\374\374\372" + "\202\357\357\346\1\365\365\361\203\376\376\376\3\374\372\374\355\355\351" + "\345\345\346\202\362\362\366\10\341\341\341\333\333\333\345\345\346\365\365" + "\371\361\361\361\354\354\361\362\362\366\365\365\371\202\371\371\374\1\365" + "\365\371\202\362\362\366\22\344\344\351\327\327\335\334\334\341\341\341\346" + "\354\354\361\354\352\362\365\365\371\376\376\376\374\374\376\374\372\374" + "\374\374\374\354\354\361\334\334\341\351\351\355\355\355\355\345\345\346" + "\333\333\333\314\314\315\226\376\376\376\206S\201\240\1\250\277\317\220\376" + "\376\376\1\336\346\354\206S\201\240\1\350\356\362\212\376\376\376\1^\211" + "\246\205S\201\240\1\210\250\275\205\376\376\376\1\250\277\317\205S\201\240" + "\1~\240\270\232\376\376\376\206S\201\240\1\323\337\346\207\376\376\376\207" + "S\201\240\2^\211\246\336\346\354\213\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\205\376\376\376\206S\201\240\1\310\327\341\252\376\376\376" + "\27\346\363\262\231\232\217\220\220\217\245\245\247\264\264\265\274\274\274" + "\306\306\310\324\324\332\344\344\351\345\345\346\341\341\346\360\360\365" + "\362\362\366\356\356\364\362\362\366\354\354\361\341\341\346\356\356\364" + "\362\362\366\351\351\355\351\351\360\365\365\371\354\354\361\202\351\351" + "\355\1\334\334\341\203\341\341\346\1\356\356\361\205\362\362\366\5\365\365" + "\371\371\371\374\365\365\371\365\365\361\374\374\374\202\376\376\376\202" + "\371\371\371\2\376\376\376\371\371\371\203\361\361\354\1\370\370\365\212" + "\376\376\376\1\365\365\361\202\357\357\346\1\365\365\361\215\376\376\376" + "\1\374\374\372\202\370\370\365\1\374\374\372\206\376\376\376\202\374\374" + "\372\1\371\371\371\205\370\370\365\202\374\374\372\211\376\376\376\14\365" + "\365\361\357\357\346\361\361\354\374\374\372\374\374\374\370\370\365\371" + "\371\371\376\376\376\365\365\361\357\357\346\365\365\361\374\374\372\203" + "\376\376\376\11\365\365\365\345\345\346\355\355\351\371\371\371\355\355\355" + "\337\337\331\341\341\341\355\355\355\371\371\371\202\355\355\355\1\362\362" + "\366\202\371\371\374\10\365\365\371\362\362\366\365\365\371\362\362\366\334" + "\334\341\327\327\335\334\334\341\341\341\346\202\356\356\364\14\371\371\374" + "\376\376\376\374\374\376\374\374\374\374\372\374\351\351\355\341\341\346" + "\354\354\361\355\355\355\345\345\346\333\333\333\314\314\315\226\376\376" + "\376\206S\201\240\1~\240\270\220\376\376\376\1\262\307\325\205S\201\240\1" + "~\240\270\213\376\376\376\1\223\260\303\205S\201\240\1^\211\246\205\376\376" + "\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376\376\1s\231\262\205" + "S\201\240\1\323\337\346\207\376\376\376\206S\201\240\2^\211\246\336\346\354" + "\214\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376\206" + "S\201\240\1~\240\270\253\376\376\376\30\244\246\230\212\212\214\240\240\241" + "\261\261\260\274\274\274\306\306\310\322\322\323\345\345\346\344\344\351" + "\341\341\346\356\356\361\365\365\371\360\360\365\362\362\366\360\360\365" + "\341\341\346\351\351\355\365\365\371\354\354\361\351\351\360\362\362\366" + "\356\356\364\346\346\355\354\354\361\202\341\341\346\3\346\346\355\341\341" + "\346\354\354\361\202\362\362\366\202\365\365\371\6\365\365\365\365\365\371" + "\371\371\374\371\371\371\365\365\361\371\371\371\202\376\376\376\5\374\374" + "\374\370\370\365\374\374\374\374\372\374\365\365\361\202\361\361\354\2\365" + "\365\361\374\374\374\211\376\376\376\5\371\371\371\361\361\354\357\357\346" + "\361\361\354\374\374\372\215\376\376\376\1\374\374\376\202\371\371\371\2" + "\374\372\374\374\374\376\210\376\376\376\2\374\374\376\376\376\376\204\374" + "\374\374\210\376\376\376\5\365\365\361\357\357\346\361\361\354\374\374\372" + "\374\374\374\202\370\370\365\2\374\372\374\365\365\361\202\357\357\346\1" + "\371\371\371\203\376\376\376\3\374\372\374\361\361\354\352\352\343\202\365" + "\365\365\16\345\345\346\341\341\341\345\345\346\365\365\371\365\365\365\351" + "\351\355\356\356\361\365\365\371\371\371\374\365\365\371\362\362\366\360" + "\360\365\365\365\371\351\351\355\203\327\327\335\5\344\344\351\360\360\365" + "\362\362\366\374\372\374\376\376\376\202\374\374\376\10\371\371\371\344\344" + "\354\346\346\355\354\354\361\355\355\355\345\345\346\333\333\333\314\314" + "\315\226\376\376\376\1s\231\262\206S\201\240\1\210\250\275\217\376\376\376" + "\1\210\250\275\205S\201\240\1\250\277\317\213\376\376\376\1\262\307\325\206" + "S\201\240\205\376\376\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376" + "\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1" + "\262\307\325\215\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376" + "\376\376\1^\211\246\206S\201\240\1\223\260\303\252\376\376\376\15\256\263" + "\231\212\212\214\235\235\234\255\255\260\274\274\274\302\302\302\316\316" + "\326\341\341\346\344\344\351\341\341\346\354\354\361\365\365\371\360\360" + "\365\202\362\362\366\202\344\344\351\16\365\365\371\356\356\364\351\351\360" + "\362\362\366\360\360\365\346\346\355\354\354\361\344\344\351\341\341\346" + "\351\351\355\341\341\346\351\351\351\362\362\366\365\365\365\202\365\365" + "\371\2\370\370\365\365\365\371\202\370\370\365\5\341\341\341\334\334\341" + "\361\361\361\370\370\365\371\371\371\202\370\370\365\6\362\362\366\345\345" + "\346\322\322\323\337\337\331\355\355\351\365\365\365\202\374\372\374\3\365" + "\365\365\351\351\351\345\345\346\203\351\351\351\3\345\345\346\341\341\346" + "\355\355\355\202\357\357\346\3\365\365\361\351\351\351\345\345\346\203\351" + "\351\351\2\341\341\346\355\355\355\202\371\371\371\202\374\372\374\202\345" + "\345\346\202\351\351\351\1\345\345\346\202\341\341\341\1\362\362\366\203" + "\371\371\371\202\345\345\346\5\341\341\341\341\341\346\341\341\341\333\333" + "\333\324\324\332\202\322\322\323\4\327\327\335\341\341\341\356\356\361\365" + "\365\365\202\371\371\371\202\374\374\374\1\370\370\365\202\357\357\346\13" + "\371\371\371\374\374\374\370\370\365\345\345\346\341\341\346\345\345\346" + "\337\337\331\330\330\320\333\333\333\334\334\341\351\351\355\202\371\371" + "\371\23\365\365\361\357\357\346\361\361\354\371\371\371\361\361\361\352\352" + "\343\345\345\340\355\355\355\371\371\371\355\355\355\327\327\327\334\334" + "\341\362\362\366\365\365\371\362\362\366\360\360\365\362\362\366\365\365" + "\371\345\345\346\202\327\327\335\4\334\334\341\346\346\355\362\362\366\365" + "\365\371\204\374\374\376\2\365\365\371\346\346\355\202\354\354\361\4\351" + "\351\355\345\345\346\333\333\333\314\314\315\226\376\376\376\1\236\270\311" + "\207S\201\240\2^\211\246\250\277\317\215\376\376\376\1i\221\254\205S\201" + "\240\1\310\327\341\213\376\376\376\1\323\337\346\206S\201\240\1\323\337\346" + "\204\376\376\376\1\250\277\317\205S\201\240\1~\240\270\232\376\376\376\1" + "~\240\270\205S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337" + "\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376" + "\1\223\260\303\207S\201\240\2^\211\246\250\277\317\250\376\376\376\14\307" + "\322\237\205\205\206\227\227\231\255\255\260\267\267\272\302\302\302\322" + "\322\323\341\341\341\344\344\351\334\334\341\351\351\355\365\365\371\202" + "\360\360\365\6\365\365\371\351\351\355\341\341\346\360\360\365\362\362\366" + "\354\354\361\202\362\362\366\23\346\346\355\354\354\361\346\346\355\341\341" + "\346\351\351\355\351\351\351\345\345\346\360\360\365\365\365\365\365\365" + "\371\371\371\371\370\370\365\365\365\365\351\351\351\235\235\234557IIL\240" + "\240\241\351\351\351\202\361\361\361\2\314\314\315\177\177\177\202557\11" + "\177\177\177\327\327\327\351\351\351\362\362\366\365\365\365\235\235\234" + "\177\177\177jjk\\\\^\202jjk\202vvw\10\220\220\217\345\345\346\352\352\343" + "\306\306\310\177\177\177jjk\\\\^jjk\202\\\\^\12\212\212\214\341\341\346\361" + "\361\361\365\365\365\302\302\302\177\177\177jjk\\\\^jjk\\\\^\202vvw\5\253" + "\252\253\356\356\361\362\362\366\306\306\310\212\212\214\202jjk\203IIL\202" + "vvw\1\\\\^\202IIL\16jjk\245\245\247\327\327\327\355\355\355\361\361\361\361" + "\361\354\357\357\346\361\361\354\374\372\374\376\376\376\370\370\365\341" + "\341\341\205\205\206jjk\204\\\\^\4jjk\205\205\206\355\355\355\361\361\361" + "\202\357\357\346\202\370\370\365\6\355\355\351\352\352\343\355\355\351\370" + "\370\365\365\365\365\274\274\274\202\205\205\206\7\355\355\355\356\356\361" + "\355\355\355\356\356\361\365\365\371\361\361\361\334\334\341\202\333\333" + "\333\5\334\334\341\354\354\361\365\365\371\371\371\374\376\376\376\203\374" + "\374\376\3\360\360\365\351\351\360\354\354\361\202\351\351\355\3\341\341" + "\346\327\327\335\314\314\315\226\376\376\376\2\371\372\373^\211\246\211S" + "\201\240\2\210\250\275\310\327\341\212\376\376\376\206S\201\240\1\323\337" + "\346\213\376\376\376\1\350\356\362\206S\201\240\1\323\337\346\204\376\376" + "\376\1\250\277\317\205S\201\240\1~\240\270\221\376\376\376\3\336\346\354" + "\275\317\333\236\270\311\203~\240\270\211S\201\240\1\323\337\346\207\376" + "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\205\376\376\376\1\371\372\373\212S\201\240\2\223\260\303\323" + "\337\346\245\376\376\376\26\325\343\240\215\216\206\223\223\224\245\245\247" + "\267\267\272\302\302\302\314\314\315\333\333\333\345\345\346\334\334\341" + "\344\344\351\365\365\371\362\362\366\360\360\365\365\365\371\356\356\364" + "\341\341\346\354\354\361\365\365\371\356\356\364\360\360\365\365\365\371" + "\202\351\351\355\2\354\354\361\344\344\351\202\354\354\361\2\345\345\346" + "\356\356\361\202\365\365\365\5\371\371\371\365\365\365\333\333\333jjk\14" + "\14\15\202\0\0\0\7jjk\235\235\234\341\341\341\245\245\247!\"!557jjk\202\0" + "\0\0\7\205\205\206\264\264\265\345\345\346\355\355\355\212\212\214jjkvvw" + "\203\0\0\0\6\177\177\177\212\212\214\205\205\206\327\327\327\341\341\341" + "\253\252\253\203\\\\^\202\0\0\0\24\177\177\177\227\227\231\264\264\265\345" + "\345\346\355\355\355\220\220\217jjkvvw\14\14\15\0\0\0\14\14\15\240\240\241" + "\255\255\260\220\220\217\341\341\341\351\351\351\227\227\231vvw\177\177\177" + "vvw\202\0\0\0\25\\\\^\306\306\310\240\240\241\177\177\177jjk\\\\^!\"!\14" + "\14\15!\"!\223\223\224\306\306\310\337\337\331\355\355\351\371\371\371\374" + "\374\374\371\371\371\365\365\365\240\240\241vvw\177\177\177jjk\202\0\0\0" + "\4vvw\302\302\302\205\205\206\333\333\333\202\345\345\340\3\361\361\354\371" + "\371\371\361\361\354\202\357\357\346\32\365\365\361\371\371\371\355\355\351" + "vvw!\"!IIL\314\314\315\341\341\341\345\345\346\355\355\355\371\371\371\351" + "\351\351\334\334\341\333\333\333\334\334\341\341\341\346\362\362\366\365" + "\365\371\371\371\374\376\376\376\374\374\376\376\376\376\374\372\374\356" + "\356\364\354\354\361\351\351\360\202\351\351\355\3\341\341\346\327\327\327" + "\306\306\310\227\376\376\376\1\275\317\333\213S\201\240\2i\221\254\275\317" + "\333\210\376\376\376\206S\201\240\1\323\337\346\214\376\376\376\206S\201" + "\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201\240\1~\240\270" + "\216\376\376\376\3\371\372\373\250\277\317i\221\254\217S\201\240\1\323\337" + "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270" + "\205S\201\240\1\323\337\346\206\376\376\376\1\275\317\333\213S\201\240\2" + "i\221\254\275\317\333\243\376\376\376\11\347\363\272\241\242\230\220\220" + "\217\245\245\247\267\267\272\302\302\302\314\314\315\327\327\335\344\344" + "\351\202\341\341\346\3\360\360\365\365\365\371\360\360\365\202\362\362\366" + "\16\341\341\346\344\344\351\365\365\371\362\362\366\360\360\365\365\365\371" + "\354\354\361\351\351\355\356\356\361\344\344\351\354\354\361\360\360\365" + "\351\351\355\355\355\355\203\365\365\365\6\314\314\315IIL\14\14\15\306\306" + "\310!\"!\0\0\0\202\227\227\231\27\223\223\224\14\14\15\\\\^\355\355\355\255" + "\255\260557\0\0\0jjkvvw\327\327\327\341\341\341\322\322\323vvw\177\177\177" + "\227\227\231\0\0\0\14\14\15\274\274\274\261\261\260\253\252\253\314\314\315" + "\333\333\333\322\322\323\202vvw\11\177\177\177\0\0\0IIL\333\333\333\314\314" + "\315\267\267\272\333\333\333\345\345\346\302\302\302\202vvw\35""557\0\0\0" + "vvw\322\322\323\333\333\333\245\245\247\327\327\327\341\341\341\302\302\302" + "\227\227\231\264\264\265\177\177\177!\"!\0\0\0\255\255\260\327\327\327\274" + "\274\274\235\235\234\177\177\177vvw\212\212\214\177\177\177\14\14\15\0\0" + "\0jjk\302\302\302\351\351\351\361\361\361\365\365\365\202\370\370\365\4\302" + "\302\302\245\245\247\227\227\231jjk\202\0\0\0\6\327\327\327\334\334\341\267" + "\267\272\314\314\315\330\330\320\345\345\340\202\370\370\365\202\357\357" + "\346\33\361\361\354\371\371\371\365\365\365\274\274\274\177\177\177\0\0\0" + "\14\14\15\235\235\234\322\322\323\333\333\333\356\356\361\365\365\365\345" + "\345\346\341\341\341\334\334\341\341\341\341\351\351\355\371\371\374\365" + "\365\371\374\372\374\376\376\376\374\374\376\376\376\376\371\371\374\356" + "\356\364\354\354\361\346\346\355\202\351\351\355\3\341\341\341\324\324\332" + "\306\306\310\230\376\376\376\2\310\327\341^\211\246\213S\201\240\2i\221\254" + "\336\346\354\205\376\376\376\1\336\346\354\206S\201\240\1\323\337\346\214" + "\376\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205" + "S\201\240\1~\240\270\215\376\376\376\2\250\277\317^\211\246\221S\201\240" + "\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376" + "\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376\2\275\317\333^\211" + "\246\213S\201\240\2s\231\262\336\346\354\242\376\376\376\10\256\263\231\212" + "\212\214\240\240\241\264\264\265\302\302\302\314\314\315\327\327\327\345" + "\345\346\202\341\341\346\16\356\356\364\365\365\371\360\360\365\362\362\366" + "\365\365\371\346\346\355\341\341\346\356\356\364\365\365\371\362\362\366" + "\365\365\371\356\356\364\344\344\351\356\356\361\202\351\351\355\3\365\365" + "\371\361\361\361\355\355\355\202\365\365\361\5\327\327\327IIL\0\0\0\376\376" + "\376\306\306\310\202\0\0\0\27\371\371\371\306\306\310\14\14\15IIL\361\361" + "\361\327\327\327\212\212\214\14\14\15\0\0\0\212\212\214\223\223\224\302\302" + "\302\327\327\327\333\333\333\322\322\323\264\264\265vvw!\"!\0\0\0vvw\227" + "\227\231\255\255\260\306\306\310\202\333\333\333\24\314\314\315\240\240\241" + "557\0\0\0\253\252\253\227\227\231\245\245\247\274\274\274\327\327\327\345" + "\345\346\341\341\341\322\322\323\220\220\217557\0\0\0\\\\^\223\223\224\245" + "\245\247\274\274\274\322\322\323\202\341\341\341\10\327\327\327\274\274\274" + "jjk!\"!\0\0\0vvw\223\223\224\227\227\231\202\235\235\234\32\177\177\177j" + "jk\177\177\177\223\223\224557\0\0\0\\\\^\302\302\302\345\345\346\361\361" + "\361\371\371\371\365\365\365\337\337\331\313\313\301\212\212\214\\\\^\0\0" + "\0\14\14\15\212\212\214\240\240\241\261\261\260\302\302\302\321\321\313\355" + "\355\351\370\370\365\361\361\354\202\357\357\346\12\365\365\361\371\371\371" + "\355\355\351\177\177\177jjk!\"!\0\0\0jjk\274\274\274\322\322\323\202\355" + "\355\355\202\345\345\340\22\341\341\341\345\345\346\362\362\366\371\371\374" + "\365\365\371\371\371\374\374\372\374\376\376\376\374\374\376\365\365\371" + "\360\360\365\351\351\355\346\346\355\351\351\355\351\351\351\334\334\341" + "\324\324\332\302\302\302\232\376\376\376\1\236\270\311\214S\201\240\1\275" + "\317\333\204\376\376\376\1\323\337\346\206S\201\240\1\323\337\346\214\376" + "\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201" + "\240\1~\240\270\214\376\376\376\1~\240\270\223S\201\240\1\323\337\346\207" + "\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201" + "\240\1\323\337\346\210\376\376\376\2\371\372\373\223\260\303\213S\201\240" + "\2^\211\246\336\346\354\241\376\376\376\14\273\301\235\212\212\214\227\227" + "\231\255\255\260\274\274\274\306\306\310\322\322\323\341\341\346\344\344" + "\351\334\334\341\351\351\355\365\365\371\202\360\360\365\4\365\365\371\356" + "\356\361\334\334\341\351\351\355\203\365\365\371\5\362\362\366\344\344\351" + "\355\355\355\356\356\361\351\351\355\202\365\365\371\202\361\361\361\17\345" + "\345\346jjk\14\14\15\345\345\346\371\371\371557\0\0\0IIL\365\365\365\0\0" + "\0""557\306\306\310\267\267\272\220\220\217IIL\202\0\0\0\7\264\264\265\261" + "\261\260\272\272\264\322\322\323\334\334\341\327\327\327\302\302\302\202" + "jjk\20\0\0\0""557\223\223\224\253\252\253\306\306\310\333\333\333\341\341" + "\341\322\322\323\212\212\214\14\14\15\\\\^\240\240\241\220\220\217\245\245" + "\247\302\302\302\333\333\333\202\345\345\346\11\327\327\327\223\223\2245" + "57\0\0\0\\\\^\212\212\214\245\245\247\274\274\274\327\327\327\202\345\345" + "\346\10\333\333\333\302\302\302\\\\^557\0\0\0vvw\220\220\217\235\235\234" + "\203\245\245\247\30\235\235\234vvwIIL\264\264\265!\"!\0\0\0vvw\314\314\315" + "\351\351\351\361\361\354\352\352\343\337\337\331\321\321\313\212\212\214" + "jjk\0\0\0\14\14\15\177\177\177\227\227\231\253\252\253\302\302\302\337\337" + "\331\361\361\361\361\361\354\202\357\357\346\13\361\361\354\374\374\372\365" + "\365\361\330\330\320vvw557\345\345\346\0\0\0!\"!\227\227\231\321\321\313" + "\202\345\345\346\203\345\345\340\2\355\355\351\371\371\374\202\365\365\371" + "\202\371\371\374\13\374\374\376\371\371\374\362\362\366\356\356\364\344\344" + "\351\346\346\355\351\351\355\344\344\351\333\333\333\322\322\323\302\302" + "\302\233\376\376\376\3\371\372\373\250\277\317i\221\254\212S\201\240\1\336" + "\346\354\203\376\376\376\1\323\337\346\206S\201\240\1\323\337\346\214\376" + "\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205S\201" + "\240\1~\240\270\213\376\376\376\1\210\250\275\206S\201\240\3i\221\254\236" + "\270\311\275\317\333\202\323\337\346\203\376\376\376\1~\240\270\205S\201" + "\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376" + "\376\1~\240\270\205S\201\240\1\323\337\346\212\376\376\376\3\371\372\373" + "\236\270\311^\211\246\211S\201\240\2^\211\246\371\372\373\240\376\376\376" + "\20\325\343\240\212\212\214\223\223\224\253\252\253\274\274\274\306\306\310" + "\322\322\323\341\341\341\344\344\351\334\334\341\344\344\351\365\365\371" + "\362\362\366\360\360\365\365\365\371\362\362\366\202\341\341\346\1\362\362" + "\366\203\365\365\371\202\351\351\355\13\360\360\365\351\351\355\365\365\371" + "\371\371\374\365\365\365\361\361\354\341\341\341vvw\327\327\327\355\355\355" + "\177\177\177\202\0\0\0\16\306\306\310IIL\14\14\15\264\264\265\205\205\206" + "\212\212\214vvw!\"!\0\0\0IIL\253\252\253\223\223\224\261\261\260\321\321" + "\313\202\341\341\341\3\322\322\323\253\252\253vvw\202\0\0\0\11\205\205\206" + "\253\252\253\306\306\310\341\341\341\345\345\346\327\327\327\\\\^\0\0\0\253" + "\252\253\202\227\227\231\16\261\261\260\314\314\315\345\345\346\356\356\361" + "\355\355\355\334\334\341\223\223\224557\0\0\0\\\\^\212\212\214\255\255\260" + "\306\306\310\341\341\341\202\355\355\355\11\345\345\346\314\314\315jjk!\"" + "!\0\0\0vvw\227\227\231\253\252\253\274\274\274\202\302\302\302\17\267\267" + "\272\253\252\253jjk\\\\^\267\267\272\0\0\0!\"!\227\227\231\322\322\323\337" + "\337\331\345\345\340\351\351\351\341\341\341\223\223\224jjk\202\14\14\15" + "\6\177\177\177\227\227\231\261\261\260\321\321\313\351\351\355\361\361\354" + "\202\357\357\346\16\361\361\354\370\370\365\371\371\371\352\352\343\220\220" + "\217jjkIIL\302\302\302IIL\0\0\0vvw\306\306\310\327\327\327\345\345\340\203" + "\352\352\343\4\365\365\361\371\371\374\362\362\366\365\365\371\203\371\371" + "\374\202\365\365\371\2\354\354\361\344\344\351\202\351\351\355\4\341\341" + "\346\327\327\335\322\322\323\302\302\302\236\376\376\376\2\310\327\341~\240" + "\270\210S\201\240\1~\240\270\204\376\376\376\206S\201\240\1\323\337\346\214" + "\376\376\376\206S\201\240\1\323\337\346\204\376\376\376\1\250\277\317\205" + "S\201\240\1~\240\270\212\376\376\376\1\275\317\333\206S\201\240\1\262\307" + "\325\210\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376\376\376" + "\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323" + "\337\346\215\376\376\376\2\275\317\333~\240\270\210S\201\240\1~\240\270\240" + "\376\376\376\13\342\361\255\231\232\217\220\220\217\245\245\247\267\267\272" + "\302\302\302\314\314\315\334\334\341\345\345\346\341\341\341\341\341\346" + "\202\365\365\371\202\362\362\366\4\365\365\371\351\351\355\334\334\341\354" + "\354\361\203\365\365\371\26\354\354\361\344\344\351\360\360\365\356\356\361" + "\362\362\366\374\372\374\371\371\371\361\361\354\351\351\351\223\223\224" + "\327\327\327\245\245\247557\0\0\0IIL\261\261\260\0\0\0\235\235\234vvw\177" + "\177\177\212\212\214\\\\^\202\0\0\0""0\240\240\241vvw\227\227\231\264\264" + "\265\322\322\323\351\351\351\355\355\355\341\341\341\314\314\315vvwIIL\0" + "\0\0\\\\^\245\245\247\314\314\315\341\341\341\351\351\351\267\267\272!\"" + "!557\274\274\274\227\227\231\253\252\253\306\306\310\334\334\341\356\356" + "\361\370\370\365\365\365\365\345\345\346\235\235\234557\0\0\0\\\\^\223\223" + "\224\274\274\274\327\327\327\351\351\355\365\365\365\370\370\365\361\361" + "\361\334\334\341jjk557\0\0\0vvw\245\245\247\302\302\302\327\327\327\202\341" + "\341\341\17\327\327\327\306\306\310\261\261\260\\\\^\245\245\247\14\14\15" + "\0\0\0vvw\274\274\274\330\330\320\355\355\351\365\365\365\351\351\351\240" + "\240\241jjk\202\14\14\15\5\177\177\177\235\235\234\274\274\274\341\341\341" + "\355\355\355\203\357\357\346\6\365\365\361\374\374\372\361\361\354\337\337" + "\331vvwIIL\202\\\\^\6\255\255\260\0\0\0IIL\240\240\241\314\314\315\337\337" + "\331\202\352\352\343\7\361\361\354\371\371\371\370\370\365\362\362\366\365" + "\365\371\371\371\371\371\371\374\203\365\365\371\202\344\344\351\202\351" + "\351\355\4\341\341\341\327\327\335\322\322\323\306\306\310\240\376\376\376" + "\2\323\337\346s\231\262\207S\201\240\1\336\346\354\203\376\376\376\206S\201" + "\240\1\262\307\325\213\376\376\376\1\336\346\354\206S\201\240\205\376\376" + "\376\1\250\277\317\205S\201\240\1~\240\270\212\376\376\376\1i\221\254\205" + "S\201\240\1\262\307\325\211\376\376\376\1~\240\270\205S\201\240\1\323\337" + "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270" + "\205S\201\240\1\323\337\346\217\376\376\376\2\323\337\346i\221\254\207S\201" + "\240\1\371\372\373\240\376\376\376\14\256\263\231\212\212\214\235\235\234" + "\264\264\265\302\302\302\314\314\315\327\327\335\345\345\346\341\341\346" + "\334\334\341\360\360\365\365\365\371\202\362\362\366\4\365\365\371\360\360" + "\365\341\341\346\346\346\355\202\365\365\371\4\371\371\374\360\360\365\344" + "\344\351\355\355\355\202\361\361\361'\374\372\374\374\374\376\361\361\361" + "\345\345\340\327\327\327\267\267\272\227\227\231!\"!\0\0\0\227\227\231!\"" + "!jjk\220\220\217\\\\^\212\212\214\177\177\177!\"!\0\0\0jjk\223\223\224vv" + "w\240\240\241\274\274\274\327\327\327\355\355\355\365\365\365\356\356\361" + "\333\333\333\220\220\217\177\177\177\0\0\0!\"!\223\223\224\306\306\310\341" + "\341\341\351\351\351vvw\0\0\0\223\223\224\202\245\245\247\17\274\274\274" + "\327\327\327\351\351\355\370\370\365\374\374\374\371\371\371\355\355\355" + "\240\240\241557\0\0\0\\\\^\235\235\234\302\302\302\341\341\341\361\361\361" + "\202\374\374\374\32\365\365\365\345\345\346vvw557\0\0\0vvw\253\252\253\314" + "\314\315\341\341\341\361\361\361\362\362\366\351\351\355\341\341\341\314" + "\314\315\240\240\241jjkIIL\0\0\0\\\\^\261\261\260\327\327\327\355\355\355" + "\370\370\365\355\355\355\253\252\253jjk\202\14\14\15\4\177\177\177\245\245" + "\247\321\321\313\345\345\346\203\357\357\346\12\365\365\361\374\372\374\370" + "\370\365\352\352\343\261\261\260jjkIIL\223\223\224IIL\261\261\260\202\14" + "\14\15\11\205\205\206\274\274\274\330\330\320\345\345\340\357\357\346\365" + "\365\365\374\374\372\362\362\366\365\365\365\204\365\365\371\12\371\371\371" + "\356\356\361\341\341\346\344\344\351\354\354\361\344\344\351\334\334\341" + "\333\333\333\322\322\323\306\306\310\242\376\376\376\1s\231\262\206S\201" + "\240\1\262\307\325\203\376\376\376\1^\211\246\205S\201\240\1\236\270\311" + "\213\376\376\376\1\310\327\341\205S\201\240\1i\221\254\205\376\376\376\1" + "\250\277\317\205S\201\240\1~\240\270\211\376\376\376\1\336\346\354\205S\201" + "\240\1i\221\254\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207" + "\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201" + "\240\1\323\337\346\221\376\376\376\1s\231\262\206S\201\240\1\323\337\346" + "\240\376\376\376\13\307\322\237\212\212\214\227\227\231\255\255\260\274\274" + "\274\314\314\315\327\327\327\341\341\346\345\345\346\334\334\341\351\351" + "\355\202\365\365\371\1\362\362\366\202\365\365\371\3\346\346\355\341\341" + "\346\360\360\365\202\371\371\374=\365\365\371\351\351\351\351\351\355\362" + "\362\366\361\361\361\371\371\371\376\376\376\370\370\365\351\351\351\333" + "\333\333\306\306\310jjk\0\0\0""557jjk!\"!\240\240\241\\\\^\205\205\206\223" + "\223\224\\\\^\0\0\0\14\14\15\235\235\234jjk\220\220\217\255\255\260\314\314" + "\315\341\341\341\361\361\361\371\371\371\365\365\371\345\345\346\314\314" + "\315vvw\14\14\15\0\0\0\177\177\177\274\274\274\327\327\327\314\314\315II" + "L\14\14\15\267\267\272\240\240\241\261\261\260\306\306\310\341\341\341\365" + "\365\365\374\374\374\376\376\376\374\372\374\355\355\355\235\235\234557\0" + "\0\0\\\\^\235\235\234\306\306\310\341\341\341\365\365\365\202\376\376\376" + "\17\371\371\371\351\351\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351" + "\351\370\370\365\374\374\374\371\371\371\355\355\355\333\333\333\302\302" + "\302\202\\\\^'\0\0\0IIL\245\245\247\322\322\323\351\351\351\365\365\365\361" + "\361\361\261\261\260jjk\14\14\15\0\0\0\177\177\177\261\261\260\321\321\313" + "\337\337\331\352\352\343\357\357\346\365\365\361\374\372\374\370\370\365" + "\357\357\346\345\345\340\177\177\177IILvvw\220\220\217jjk\253\252\253\\\\" + "^\0\0\0\\\\^\261\261\260\321\321\313\337\337\331\361\361\354\374\374\372" + "\370\370\365\365\365\361\365\365\365\202\365\365\371\1\365\365\365\202\365" + "\365\371\2\345\345\346\341\341\346\202\351\351\355\1\341\341\346\202\334" + "\334\341\2\324\324\332\314\314\315\242\376\376\376\1\336\346\354\206S\201" + "\240\1\250\277\317\203\376\376\376\1~\240\270\205S\201\240\1s\231\262\213" + "\376\376\376\1\236\270\311\205S\201\240\1\223\260\303\205\376\376\376\1\250" + "\277\317\205S\201\240\1~\240\270\211\376\376\376\1\275\317\333\205S\201\240" + "\1~\240\270\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376" + "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\221\376\376\376\1\310\327\341\206S\201\240\1\250\277\317\240" + "\376\376\376\13\333\356\227\231\232\217\223\223\224\245\245\247\274\274\274" + "\306\306\310\322\322\323\341\341\341\345\345\346\341\341\341\344\344\351" + "\204\365\365\3717\371\371\374\360\360\365\341\341\346\351\351\355\365\365" + "\371\371\371\374\365\365\371\354\354\361\351\351\351\362\362\366\361\361" + "\361\365\365\365\376\376\376\374\372\374\361\361\354\345\345\340\274\274" + "\274IIL\0\0\0vvw!\"!\227\227\231jjkvvw\220\220\217\177\177\177!\"!\0\0\0" + "jjk\212\212\214vvw\227\227\231\267\267\272\327\327\327\351\351\355\365\365" + "\365\370\370\365\371\371\371\361\361\361\327\327\327\177\177\177\\\\^\0\0" + "\0IIL\245\245\247\306\306\310\235\235\234\14\14\15vvw\253\252\253\245\245" + "\247\274\274\274\327\327\327\351\351\355\371\371\371\202\376\376\376\12\374" + "\372\374\355\355\355\235\235\234!\"!\0\0\0\\\\^\240\240\241\306\306\310\341" + "\341\341\365\365\365\202\376\376\376\"\371\371\371\351\351\351vvw557\0\0" + "\0vvw\255\255\260\314\314\315\345\345\346\370\370\365\374\374\372\370\370" + "\365\361\361\361\345\345\346\322\322\323jjkIIL\0\0\0IIL\235\235\234\306\306" + "\310\345\345\346\365\365\365\361\361\361\264\264\265jjk!\"!\0\0\0\177\177" + "\177\255\255\260\313\313\301\337\337\331\352\352\343\361\361\354\202\371" + "\371\371\4\357\357\346\352\352\343\321\321\313\205\205\206\202\0\0\0\202" + "!\"!\1\14\14\15\202\0\0\0\6!\"!\220\220\217\302\302\302\337\337\331\361\361" + "\354\374\374\372\202\365\365\361\203\365\365\365\7\362\362\366\371\371\374" + "\356\356\361\341\341\341\341\341\346\351\351\355\344\344\351\202\334\334" + "\341\3\341\341\341\324\324\332\314\314\315\243\376\376\376\206S\201\240\1" + "\250\277\317\203\376\376\376\1\236\270\311\206S\201\240\1\350\356\362\212" + "\376\376\376\1i\221\254\205S\201\240\1\275\317\333\205\376\376\376\1\250" + "\277\317\205S\201\240\1~\240\270\211\376\376\376\1\250\277\317\205S\201\240" + "\1~\240\270\212\376\376\376\1~\240\270\205S\201\240\1\323\337\346\207\376" + "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\222\376\376\376\206S\201\240\1\250\277\317\241\376\376\376" + "\10\256\263\231\220\220\217\240\240\241\264\264\265\302\302\302\316\316\326" + "\334\334\341\345\345\346\202\341\341\346\2\362\362\366\371\371\374\202\365" + "\365\371\5\371\371\371\365\365\371\344\344\351\341\341\346\360\360\365\202" + "\371\371\374\13\360\360\365\351\351\351\356\356\361\365\365\365\365\365\361" + "\374\374\374\376\376\376\370\370\365\351\351\351\212\212\214!\"!\202\0\0" + "\0\17\177\177\177\212\212\214jjk\212\212\214\227\227\231\\\\^\0\0\0\14\14" + "\15\240\240\241\\\\^\223\223\224\253\252\253\302\302\302\341\341\341\362" + "\362\366\203\371\371\371\21\365\365\365\341\341\341\261\261\260\177\177\177" + "\0\0\0\14\14\15\223\223\224\267\267\272jjk\14\14\15\255\255\260\245\245\247" + "\255\255\260\306\306\310\341\341\341\362\362\366\374\374\374\202\376\376" + "\376\12\371\371\371\355\355\355\240\240\241!\"!\0\0\0\\\\^\240\240\241\306" + "\306\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351\351" + "vvw557\0\0\0vvw\255\255\260\314\314\315\345\345\346\365\365\365\202\374\374" + "\372\30\371\371\371\361\361\361\341\341\341vvw557\0\0\0IIL\235\235\234\302" + "\302\302\341\341\341\362\362\366\355\355\355\272\272\264jjk!\"!\0\0\0\177" + "\177\177\253\252\253\302\302\302\337\337\331\355\355\351\371\371\371\374" + "\374\372\361\361\354\202\352\352\343\3\227\227\231\\\\^\0\0\0\202\253\252" + "\253\3\240\240\241\235\235\234\264\264\265\202\0\0\0\5jjk\272\272\264\327" + "\327\327\361\361\361\370\370\365\202\365\365\361\202\365\365\365\1\361\361" + "\361\202\365\365\371\6\351\351\351\341\341\346\344\344\351\351\351\355\341" + "\341\346\334\334\341\202\341\341\346\2\327\327\335\321\321\313\243\376\376" + "\376\206S\201\240\1\250\277\317\203\376\376\376\1\310\327\341\206S\201\240" + "\1\250\277\317\211\376\376\376\1\275\317\333\205S\201\240\1^\211\246\206" + "\376\376\376\1\250\277\317\205S\201\240\1~\240\270\211\376\376\376\1\250" + "\277\317\205S\201\240\1s\231\262\212\376\376\376\1s\231\262\205S\201\240" + "\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376" + "\1~\240\270\205S\201\240\1\323\337\346\221\376\376\376\1\371\372\373\206" + "S\201\240\1\275\317\333\240\376\376\376\15\370\373\355\307\322\237\220\220" + "\217\235\235\234\255\255\260\302\302\302\314\314\315\327\327\335\341\341" + "\346\345\345\346\334\334\341\356\356\361\371\371\374\203\365\365\371\7\371" + "\371\374\356\356\361\341\341\346\351\351\355\365\365\371\371\371\374\365" + "\365\371\202\351\351\355\7\365\365\365\362\362\366\371\371\371\376\376\376" + "\371\371\371\345\345\346\\\\^\202\0\0\0#IIL\240\240\241\\\\^\205\205\206" + "\235\235\234\205\205\206!\"!\0\0\0jjkvvw\177\177\177\235\235\234\267\267" + "\272\322\322\323\345\345\340\370\370\365\374\374\376\374\372\374\371\371" + "\371\370\370\365\355\355\355\322\322\323\177\177\177557\0\0\0vvw\220\220" + "\217!\"!IIL\253\252\253\245\245\247\267\267\272\322\322\323\351\351\351\370" + "\370\365\203\376\376\376\12\371\371\371\355\355\355\235\235\234!\"!\0\0\0" + "\\\\^\240\240\241\306\306\310\341\341\341\365\365\365\202\376\376\376\12" + "\371\371\371\351\351\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351\351" + "\365\365\371\203\376\376\376(\370\370\365\345\345\346\205\205\206\14\14\15" + "\0\0\0\\\\^\235\235\234\302\302\302\341\341\341\355\355\351\345\345\340\272" + "\272\264jjk!\"!\0\0\0vvw\245\245\247\302\302\302\337\337\331\365\365\361" + "\374\372\374\361\361\354\352\352\343\357\357\346\345\345\340\177\177\177" + "\0\0\0jjk\333\333\333\314\314\315\327\327\327\302\302\302jjk\177\177\177" + "\0\0\0""557\235\235\234\322\322\323\351\351\351\361\361\354\204\365\365\361" + "\7\361\361\361\371\371\371\361\361\361\341\341\341\345\345\346\351\351\355" + "\344\344\351\202\341\341\341\4\351\351\351\341\341\346\327\327\335\321\321" + "\313\242\376\376\376\1\250\277\317\206S\201\240\1\323\337\346\204\376\376" + "\376\1^\211\246\206S\201\240\1\336\346\354\207\376\376\376\2\350\356\362" + "^\211\246\205S\201\240\1\223\260\303\206\376\376\376\1\250\277\317\205S\201" + "\240\1~\240\270\211\376\376\376\1\275\317\333\206S\201\240\1\336\346\354" + "\207\376\376\376\2\350\356\362s\231\262\206S\201\240\1\323\337\346\207\376" + "\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240" + "\1\323\337\346\221\376\376\376\1\236\270\311\206S\201\240\1\336\346\354\240" + "\376\376\376\14\372\374\361\341\361\250\231\232\217\227\227\231\245\245\247" + "\267\267\272\306\306\310\324\324\332\341\341\341\345\345\346\341\341\341" + "\346\346\355\204\365\365\3715\371\371\374\365\365\371\344\344\351\341\341" + "\346\360\360\365\371\371\371\365\365\371\356\356\361\351\351\351\362\362" + "\366\365\365\365\370\370\365\374\374\374\371\371\371\261\261\260!\"!\0\0" + "\0!\"!\240\240\241jjk\177\177\177\227\227\231\240\240\241\\\\^\0\0\0!\"!" + "\220\220\217jjk\205\205\206\212\212\214\240\240\241\333\333\333\351\351\351" + "\365\365\361\374\374\374\376\376\376\374\372\374\371\371\371\361\361\361" + "\341\341\341\235\235\234vvw\0\0\0!\"!\227\227\231\0\0\0\253\252\253\235\235" + "\234\255\255\260\302\302\302\333\333\333\361\361\361\374\372\374\203\376" + "\376\376\12\371\371\371\355\355\355\227\227\231!\"!\0\0\0\\\\^\240\240\241" + "\306\306\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351" + "\351vvw557\0\0\0vvw\255\255\260\314\314\315\351\351\351\370\370\365\203\376" + "\376\376\3\365\365\365\322\322\323\\\\^\202\0\0\0\4vvw\245\245\247\302\302" + "\302\333\333\333\202\352\352\343\22\302\302\302jjk!\"!\0\0\0vvw\245\245\247" + "\313\313\301\345\345\346\365\365\365\361\361\354\352\352\343\357\357\346" + "\361\361\361\253\252\253vvw\14\14\15jjk\215\216\206\202\212\212\214\3vvw" + "IIL\322\322\323\202\0\0\0\4\177\177\177\306\306\310\337\337\331\352\352\343" + "\203\365\365\361\3\314\314\315\212\212\214\240\240\241\202\341\341\341\11" + "\345\345\346\351\351\351\341\341\346\341\341\341\345\345\346\355\355\355" + "\341\341\346\333\333\333\322\322\323\226\376\376\376\3\310\327\341\275\317" + "\333\371\372\373\210\376\376\376\1\250\277\317\206S\201\240\1i\221\254\205" + "\376\376\376\1\250\277\317\206S\201\240\2^\211\246\310\327\341\205\376\376" + "\376\2\323\337\346^\211\246\205S\201\240\1^\211\246\207\376\376\376\1\250" + "\277\317\205S\201\240\1^\211\246\211\376\376\376\1\336\346\354\206S\201\240" + "\2s\231\262\350\356\362\204\376\376\376\3\363\366\370\250\277\317^\211\246" + "\207S\201\240\1\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215" + "\376\376\376\1~\240\270\205S\201\240\1\323\337\346\205\376\376\376\3\275" + "\317\333\310\327\341\371\372\373\210\376\376\376\1\250\277\317\206S\201\240" + "\1i\221\254\243\376\376\376\10\256\263\231\223\223\224\240\240\241\264\264" + "\265\302\302\302\322\322\323\333\333\333\345\345\346\202\341\341\346\1\365" + "\365\365\202\371\371\374\6\371\371\371\365\365\371\371\371\374\354\354\361" + "\341\341\341\351\351\355\202\365\365\371\10\362\362\366\351\351\351\355\355" + "\355\370\370\365\365\365\365\371\371\371\362\362\366jjk\202\0\0\0\32\205" + "\205\206\177\177\177jjk\220\220\217\245\245\247\205\205\206!\"!\0\0\0\\\\" + "^\227\227\231\205\205\206\14\14\15jjk\220\220\217\333\333\333\351\351\355" + "\361\361\354\370\370\365\374\374\376\376\376\376\374\372\374\365\365\365" + "\351\351\351\314\314\315\177\177\177!\"!\202\0\0\0\7""557\261\261\260\235" + "\235\234\264\264\265\314\314\315\345\345\346\365\365\365\204\376\376\376" + "\12\371\371\371\355\355\355\227\227\231!\"!\0\0\0jjk\240\240\241\306\306" + "\310\341\341\341\365\365\365\202\376\376\376\12\371\371\371\351\351\351v" + "vw557\0\0\0vvw\255\255\260\314\314\315\345\345\346\370\370\365\202\376\376" + "\376\3\371\371\371\355\355\355\245\245\247\202\0\0\0\31IIL\220\220\217\245" + "\245\247\302\302\302\337\337\331\361\361\354\361\361\361\306\306\310jjk!" + "\"!\0\0\0vvw\253\252\253\314\314\315\345\345\346\357\357\346\352\352\343" + "\357\357\346\365\365\361\361\361\361\205\205\206!\"!557\205\205\206\223\223" + "\224\202\235\235\234\15\223\223\224IIL\235\235\234\\\\^\0\0\0\\\\^\261\261" + "\260\321\321\313\345\345\340\361\361\354\365\365\361\302\302\302557\202!" + "\"!\6IIL\333\333\333\341\341\346\345\345\346\341\341\341\341\341\346\202" + "\355\355\355\3\341\341\346\333\333\333\322\322\323\226\376\376\376\1~\240" + "\270\202S\201\240\3^\211\246~\240\270\236\270\311\203\250\277\317\2\210\250" + "\275^\211\246\207S\201\240\1\262\307\325\206\376\376\376\1^\211\246\207S" + "\201\240\5i\221\254\210\250\275\250\277\317\223\260\303i\221\254\207S\201" + "\240\1\275\317\333\207\376\376\376\1\262\307\325\206S\201\240\1~\240\270" + "\203\250\277\317\2~\240\270\236\270\311\204\376\376\376\1i\221\254\206S\201" + "\240\2^\211\246\223\260\303\202\250\277\317\1\210\250\275\212S\201\240\1" + "\323\337\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1" + "~\240\270\205S\201\240\1\323\337\346\205\376\376\376\1s\231\262\202S\201" + "\240\2i\221\254~\240\270\204\250\277\317\2\210\250\275^\211\246\207S\201" + "\240\1\310\327\341\243\376\376\376\15\307\322\237\220\220\217\235\235\234" + "\253\252\253\274\274\274\314\314\315\327\327\335\341\341\346\344\344\351" + "\334\334\341\354\354\361\371\371\371\365\365\371\203\371\371\374\4\365\365" + "\371\344\344\351\341\341\346\361\361\361\202\365\365\371\2\355\355\355\351" + "\351\351\202\365\365\365\25\365\365\361\274\274\274557\0\0\0IIL\220\220\217" + "\\\\^\212\212\214\235\235\234\253\252\253\\\\^\0\0\0IIL\365\365\371\205\205" + "\206\14\14\15jjk\240\240\241\220\220\217\322\322\323\351\351\351\202\365" + "\365\361\1\370\370\365\202\376\376\376\5\371\371\371\355\355\355\333\333" + "\333\212\212\214jjk\202\0\0\0\7\223\223\224\227\227\231\240\240\241\302\302" + "\302\333\333\333\355\355\355\371\371\371\204\376\376\376\12\371\371\371\355" + "\355\355\227\227\231!\"!\0\0\0\\\\^\245\245\247\306\306\310\341\341\341\365" + "\365\365\202\376\376\376\16\371\371\371\351\351\351\177\177\177557\0\0\0" + "jjk\253\252\253\314\314\315\345\345\346\365\365\365\374\372\374\371\371\371" + "\341\341\341\245\245\247\202\0\0\0\32\14\14\15\240\240\241\227\227\231\253" + "\252\253\314\314\315\351\351\351\365\365\365\355\355\355\321\321\313\\\\" + "^557\0\0\0jjk\255\255\260\314\314\315\337\337\331\345\345\340\361\361\354" + "\370\370\365\371\371\371\306\306\310vvw\0\0\0\\\\^\235\235\234\245\245\247" + "\203\261\261\260\15jjk\\\\^\261\261\260\0\0\0!\"!\212\212\214\302\302\302" + "\337\337\331\355\355\351\361\361\354jjk\\\\^!\"!\202557\1\327\327\327\202" + "\341\341\341\7\334\334\341\351\351\355\361\361\361\351\351\355\341\341\346" + "\333\333\333\314\314\315\226\376\376\376\1^\211\246\220S\201\240\1\210\250" + "\275\207\376\376\376\1\323\337\346\222S\201\240\1\236\270\311\210\376\376" + "\376\1\323\337\346\213S\201\240\1i\221\254\204\376\376\376\1\250\277\317" + "\217S\201\240\1^\211\246\205S\201\240\1\323\337\346\207\376\376\376\206S" + "\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337" + "\346\205\376\376\376\221S\201\240\1\223\260\303\245\376\376\376\7\244\246" + "\230\227\227\231\245\245\247\267\267\272\306\306\310\322\322\323\334\334" + "\341\202\341\341\346\2\344\344\351\365\365\371\205\371\371\374\24\360\360" + "\365\341\341\346\351\351\355\362\362\366\365\365\371\361\361\361\351\351" + "\351\355\355\355\365\365\365\355\355\355\177\177\177\14\14\15\0\0\0\223\223" + "\224\\\\^vvw\227\227\231\255\255\260\220\220\217!\"!\202\0\0\0\12""557\0" + "\0\0vvw\355\355\355\223\223\224\261\261\260\314\314\315\345\345\346\365\365" + "\365\371\371\371\202\370\370\365\17\374\374\374\376\376\376\365\365\365\341" + "\341\346\264\264\265\177\177\177\0\0\0\14\14\15\255\255\260\220\220\217\253" + "\252\253\314\314\315\341\341\341\365\365\365\374\374\374\203\376\376\376" + "\20\374\374\374\355\355\355\327\327\327\235\235\234\14\14\15\0\0\0jjk\240" + "\240\241\302\302\302\334\334\341\361\361\361\374\372\374\374\374\374\356" + "\356\361\327\327\327\220\220\217\202\0\0\0\10\14\14\15\223\223\224\267\267" + "\272\322\322\323\333\333\333\316\316\326\255\255\260jjk\202\0\0\0\13""55" + "7vvw\227\227\231\240\240\241\274\274\274\333\333\333\355\355\351\361\361" + "\354\337\337\331\302\302\302\205\205\206\202\0\0\0\24vvw\245\245\247\274" + "\274\274\330\330\320\355\355\351\370\370\365\371\371\371\351\351\355\261" + "\261\260557\0\0\0\177\177\177\240\240\241\261\261\260\274\274\274\313\313" + "\301\302\302\302\253\252\253jjk\273\273\302\202\0\0\0\6\\\\^\261\261\260" + "\321\321\313\345\345\340\352\352\343vvw\202557\14IIL557\314\314\315\327\327" + "\327\333\333\333\341\341\341\362\362\366\361\361\361\351\351\351\341\341" + "\346\333\333\333\314\314\315\226\376\376\376\220S\201\240\1\223\260\303\211" + "\376\376\376\2\275\317\333^\211\246\217S\201\240\1\262\307\325\212\376\376" + "\376\1^\211\246\213S\201\240\205\376\376\376\1s\231\262\215S\201\240\3~\240" + "\270\376\376\376^\211\246\204S\201\240\1\323\337\346\207\376\376\376\206" + "S\201\240\1\323\337\346\215\376\376\376\1~\240\270\205S\201\240\1\323\337" + "\346\204\376\376\376\1\336\346\354\220S\201\240\1\223\260\303\246\376\376" + "\376\7\273\301\235\223\223\224\240\240\241\255\255\260\302\302\302\314\314" + "\315\333\333\333\203\341\341\346\1\360\360\365\202\371\371\374\1\374\372" + "\374\203\371\371\374\40\351\351\355\341\341\346\356\356\361\365\365\371\365" + "\365\365\355\355\355\351\351\351\362\362\366\351\351\351jjk\0\0\0""557\177" + "\177\177\\\\^\220\220\217\253\252\253\274\274\274vvw\0\0\0\14\14\15!\"!I" + "IL\274\274\274\365\365\365\255\255\260\227\227\231\261\261\260\314\314\315" + "\345\345\346\365\365\365\376\376\376\374\374\372\202\370\370\365\7\374\374" + "\374\371\371\371\351\351\355\322\322\323\177\177\177!\"!jjk\202\227\227\231" + "\4\267\267\272\327\327\327\351\351\355\371\371\371\203\376\376\376\6\374" + "\374\374\327\327\327\227\227\231\212\212\214IIL\14\14\15\202!\"!\13\177\177" + "\177\212\212\214\306\306\310\351\351\351\365\365\365\351\351\355\227\227" + "\231\212\212\214557\14\14\15!\"!\202\14\14\15\23\\\\^\217\216\224\227\227" + "\231jjk!\"!\14\14\15jjk\220\220\217jjk\205\205\206\235\235\234\264\264\265" + "\314\314\315\341\341\341\352\352\343\302\302\302\223\223\224\205\205\206" + "557\202\14\14\15\21!\"!vvw\205\205\206\274\274\274\351\351\351\365\365\365" + "\227\227\231\253\252\253jjk\0\0\0\14\14\15""557\205\205\206\240\240\241\302" + "\302\302\321\321\313\272\272\264\202\240\240\241\27""557\14\14\15!\"!\14" + "\14\15jjk\217\216\224\313\313\301\337\337\331\327\327\327557IIL557\\\\^\306" + "\306\310\322\322\323\327\327\327\351\351\355\365\365\371\356\356\361\344" + "\344\351\341\341\341\327\327\327\314\314\315\226\376\376\376\2\323\337\346" + "\223\260\303\214S\201\240\2i\221\254\275\317\333\213\376\376\376\2\336\346" + "\354~\240\270\214S\201\240\2~\240\270\336\346\354\213\376\376\376\1\262\307" + "\325\213S\201\240\1\323\337\346\205\376\376\376\1\210\250\275\212S\201\240" + "\2^\211\246\262\307\325\202\376\376\376\1~\240\270\204S\201\240\1\323\337" + "\346\207\376\376\376\206S\201\240\1\323\337\346\215\376\376\376\1~\240\270" + "\205S\201\240\1\323\337\346\205\376\376\376\2\323\337\346\210\250\275\214" + "S\201\240\2i\221\254\310\327\341\247\376\376\376\14\307\322\237\231\232\217" + "\235\235\234\253\252\253\274\274\274\314\314\315\327\327\327\341\341\341" + "\341\341\346\341\341\341\351\351\355\371\371\371\202\371\371\374\24\374\374" + "\376\371\371\374\374\372\374\362\362\366\344\344\351\351\351\351\361\361" + "\361\365\365\365\356\356\361\351\351\351\351\351\355\345\345\346\205\205" + "\206vvw\333\333\333vvw\205\205\206\240\240\241\272\272\264\306\306\310\202" + "vvw\13\227\227\231\302\302\302\355\355\351\334\334\341\227\227\231\205\205" + "\206\240\240\241\274\274\274\327\327\327\351\351\355\370\370\365\202\376" + "\376\376\1\374\374\372\202\365\365\361\14\370\370\365\361\361\361\341\341" + "\341\227\227\231jjk\240\240\241\220\220\217\240\240\241\302\302\302\341\341" + "\341\362\362\366\374\374\374\203\376\376\376\21\371\371\371\302\302\302j" + "jkvvw\205\205\206\223\223\224\212\212\214\177\177\177\\\\^\177\177\177\245" + "\245\247\341\341\341\355\355\355\314\314\315jjkvvw\220\220\217\203\245\245" + "\247\1\240\240\241\202\223\223\224\5\220\220\217\227\227\231\274\274\274" + "\327\327\327\306\306\310\202\220\220\217\25\235\235\234\255\255\260\302\302" + "\302\327\327\327\345\345\340\352\352\343\177\177\177vvw\220\220\217\245\245" + "\247\274\274\274\267\267\272\240\240\241\220\220\217\205\205\206\274\274" + "\274\341\341\341\322\322\323jjk\220\220\217\235\235\234\202\274\274\274\11" + "\245\245\247\223\223\224vvw\313\313\301\330\330\320jjk\205\205\206\227\227" + "\231\245\245\247\202\302\302\302\24\264\264\265\240\240\241vvw\272\272\264" + "\333\333\333\341\341\341\321\321\313\212\212\214\227\227\231\302\302\302" + "\306\306\310\314\314\315\334\334\341\362\362\366\365\365\365\351\351\355" + "\345\345\346\341\341\341\327\327\327\314\314\315\231\376\376\376\3\275\317" + "\333\223\260\303s\231\262\205S\201\240\3s\231\262\223\260\303\310\327\341" + "\217\376\376\376\3\336\346\354\236\270\311s\231\262\206S\201\240\3~\240\270" + "\236\270\311\336\346\354\216\376\376\376\3\310\327\341\210\250\275^\211\246" + "\203S\201\240\5s\231\262~\240\270\223\260\303\250\277\317\336\346\354\207" + "\376\376\376\3\323\337\346\223\260\303i\221\254\204S\201\240\3^\211\246\210" + "\250\275\275\317\333\204\376\376\376\1\275\317\333\204\250\277\317\1\371" + "\372\373\207\376\376\376\206\250\277\317\1\371\372\373\215\376\376\376\1" + "\275\317\333\205\250\277\317\1\371\372\373\207\376\376\376\4\371\372\373" + "\262\307\325\210\250\275i\221\254\205S\201\240\3~\240\270\236\270\311\310" + "\327\341\252\376\376\376\13\256\263\231\227\227\231\240\240\241\264\264\265" + "\302\302\302\316\316\326\334\334\341\345\345\346\341\341\346\345\345\346" + "\365\365\371\202\371\371\374\7\374\374\376\374\372\374\371\371\374\374\372" + "\374\355\355\355\341\341\346\351\351\355\202\362\362\366\1\355\355\355\202" + "\345\345\346\25\274\274\274vvw\302\302\302\227\227\231\240\240\241\267\267" + "\272\314\314\315\322\322\323\267\267\272\177\177\177\205\205\206\261\261" + "\260\245\245\247\205\205\206\212\212\214\235\235\234\261\261\260\314\314" + "\315\345\345\346\362\362\366\371\371\371\203\376\376\376\2\374\372\374\365" + "\365\365\202\361\361\361\11\351\351\351\314\314\315vvw\223\223\224\245\245" + "\247\267\267\272\322\322\323\345\345\346\365\365\365\204\376\376\376\6\371" + "\371\371\345\345\346\220\220\217\253\252\253\245\245\247\227\227\231\202" + "\220\220\217\4\223\223\224\255\255\260\274\274\274\327\327\327\202\345\345" + "\346\1\235\235\234\202\264\264\265\1\253\252\253\203\245\245\247\3\255\255" + "\260\264\264\265\267\267\272\202\302\302\302\1\261\261\260\202\235\235\234" + "*\240\240\241\255\255\260\302\302\302\322\322\323\345\345\340\355\355\351" + "\361\361\354\245\245\247\314\314\315\327\327\327\314\314\315\274\274\274" + "\272\272\264\274\274\274\314\314\315\245\245\247\306\306\310\333\333\333" + "\322\322\323\255\255\260\345\345\346\322\322\323\306\306\310\302\302\302" + "\314\314\315\255\255\260\244\246\230\302\302\302\321\321\313\235\235\234" + "\334\334\341\327\327\327\302\302\302\272\272\264\274\274\274\306\306\310" + "\302\302\302\227\227\231\302\302\302\333\333\333\327\327\327\321\321\313" + "\204\306\306\310\11\322\322\323\351\351\351\365\365\371\355\355\355\344\344" + "\351\341\341\346\334\334\341\333\333\333\314\314\315\377\376\376\376\323" + "\376\376\376\10\307\322\237\223\223\224\235\235\234\253\252\253\274\274\274" + "\314\314\315\327\327\327\341\341\341\202\341\341\346#\355\355\355\371\371" + "\371\371\371\374\374\374\376\376\376\376\374\372\374\371\371\374\365\365" + "\371\344\344\351\341\341\346\355\355\355\361\361\361\356\356\361\345\345" + "\346\334\334\341\327\327\327\274\274\274\255\255\260\253\252\253\264\264" + "\265\314\314\315\334\334\341\337\337\331\322\322\323\302\302\302\245\245" + "\247\223\223\224\220\220\217\227\227\231\245\245\247\274\274\274\306\306" + "\310\327\327\327\355\355\355\371\371\371\206\376\376\376\5\365\365\371\355" + "\355\351\345\345\346\333\333\333\306\306\310\202\274\274\274\5\314\314\315" + "\334\334\341\356\356\361\365\365\371\374\372\374\203\376\376\376\6\371\371" + "\371\355\355\355\333\333\333\306\306\310\261\261\260\240\240\241\202\227" + "\227\231\4\240\240\241\255\255\260\302\302\302\327\327\327\202\345\345\346" + "\4\333\333\333\306\306\310\264\264\265\240\240\241\203\227\227\231\1\240" + "\240\241\202\245\245\247\1\253\252\253\203\245\245\247\14\253\252\253\272" + "\272\264\306\306\310\327\327\327\345\345\346\362\362\366\371\371\371\365" + "\365\365\345\345\346\322\322\323\272\272\264\245\245\247\203\227\227\231" + "\32\240\240\241\264\264\265\306\306\310\322\322\323\330\330\320\321\321\313" + "\302\302\302\264\264\265\240\240\241\223\223\224\231\232\217\235\235\234" + "\261\261\260\302\302\302\330\330\320\333\333\333\321\321\313\261\261\260" + "\235\235\234\220\220\217\215\216\206\220\220\217\227\227\231\253\252\253" + "\306\306\310\322\322\323\203\327\327\327\203\322\322\323\1\341\341\341\202" + "\362\362\366\6\351\351\351\345\345\346\341\341\346\341\341\341\333\333\333" + "\306\306\310\377\376\376\376\324\376\376\376\7\244\246\230\227\227\231\245" + "\245\247\264\264\265\306\306\310\322\322\323\334\334\341\202\341\341\346" + "\2\351\351\351\365\365\371\202\371\371\374\202\376\376\376\10\371\371\374" + "\374\372\374\356\356\361\341\341\346\344\344\351\356\356\361\361\361\361" + "\351\351\351\202\333\333\333\17\314\314\315\302\302\302\306\306\310\314\314" + "\315\334\334\341\351\351\355\355\355\355\337\337\331\314\314\315\274\274" + "\274\261\261\260\253\252\253\264\264\265\302\302\302\314\314\315\202\341" + "\341\341\2\351\351\351\371\371\371\207\376\376\376\4\365\365\365\345\345" + "\346\333\333\333\327\327\327\202\322\322\323\6\334\334\341\351\351\355\365" + "\365\365\371\371\374\371\371\371\374\372\374\202\376\376\376\6\371\371\371" + "\361\361\361\341\341\341\322\322\323\302\302\302\274\274\274\202\264\264" + "\265\12\267\267\272\302\302\302\314\314\315\341\341\341\351\351\351\351\351" + "\355\345\345\346\322\322\323\306\306\310\274\274\274\203\264\264\265\203" + "\267\267\272\203\274\274\274\6\302\302\302\306\306\310\327\327\327\341\341" + "\341\355\355\355\365\365\365\202\374\372\374\6\362\362\366\345\345\346\330" + "\330\320\306\306\310\274\274\274\267\267\272\202\264\264\265\3\274\274\274" + "\306\306\310\321\321\313\202\330\330\320\4\337\337\331\322\322\323\302\302" + "\302\261\261\260\202\253\252\253\3\261\261\260\302\302\302\321\321\313\202" + "\341\341\341\4\321\321\313\274\274\274\261\261\260\253\252\253\202\245\245" + "\247\16\255\255\260\302\302\302\314\314\315\322\322\323\327\327\327\333\333" + "\333\334\334\341\333\333\333\327\327\327\334\334\341\356\356\361\365\365" + "\371\351\351\355\344\344\351\203\341\341\346\2\327\327\335\273\273\302\377" + "\376\376\376\324\376\376\376\36\273\301\235\223\223\224\240\240\241\255\255" + "\260\273\273\302\314\314\315\327\327\327\341\341\341\345\345\346\341\341" + "\346\356\356\361\371\371\371\371\371\374\374\374\376\376\376\376\374\374" + "\376\374\372\374\371\371\374\355\355\355\341\341\346\351\351\351\356\356" + "\361\355\355\355\341\341\341\334\334\341\341\341\341\327\327\327\333\333" + "\333\345\345\346\355\355\355\202\365\365\365\3\355\355\355\333\333\333\322" + "\322\323\203\314\314\315\7\327\327\327\333\333\333\351\351\351\356\356\361" + "\351\351\351\355\355\355\374\372\374\206\376\376\376\3\374\374\376\365\365" + "\371\351\351\351\202\333\333\333\4\341\341\346\355\355\355\365\365\365\371" + "\371\371\202\376\376\376\202\371\371\374\7\374\372\374\371\371\374\365\365" + "\365\355\355\355\341\341\341\333\333\333\327\327\327\202\322\322\323\4\327" + "\327\327\333\333\333\341\341\341\351\351\355\202\361\361\361\4\355\355\355" + "\345\345\346\333\333\333\327\327\327\207\322\322\323\202\327\327\327\16\334" + "\334\341\345\345\346\355\355\355\362\362\366\371\371\371\374\372\374\371" + "\371\374\371\371\371\362\362\366\356\356\361\345\345\346\334\334\341\333" + "\333\333\327\327\327\204\322\322\323\2\330\330\320\337\337\331\202\351\351" + "\351\2\333\333\333\314\314\315\203\302\302\302\10\313\313\301\330\330\320" + "\345\345\346\351\351\351\341\341\341\330\330\320\321\321\313\313\313\301" + "\203\302\302\302\5\314\314\315\333\333\333\322\322\323\327\327\327\337\337" + "\331\202\341\341\341\14\333\333\333\334\334\341\351\351\355\371\371\371\356" + "\356\361\344\344\351\345\345\346\341\341\346\344\344\351\345\345\346\314" + "\314\315\274\274\274\377\376\376\376\325\376\376\376\7\244\246\230\235\235" + "\234\245\245\247\267\267\272\306\306\310\322\322\323\334\334\341\202\341" + "\341\346\2\346\346\355\365\365\371\202\371\371\374\202\376\376\376\202\374" + "\372\374\10\371\371\371\351\351\355\341\341\346\351\351\355\355\355\355\345" + "\345\346\341\341\341\341\341\346\202\351\351\351\6\361\361\361\370\370\365" + "\371\371\371\374\372\374\371\371\371\361\361\361\202\341\341\341\1\341\341" + "\346\202\341\341\341\7\341\341\346\351\351\351\356\356\361\361\361\361\345" + "\345\346\355\355\355\374\372\374\207\376\376\376\7\371\371\371\361\361\361" + "\345\345\346\341\341\346\351\351\355\365\365\371\374\374\374\203\376\376" + "\376\1\374\372\374\202\371\371\374\3\371\371\371\365\365\371\361\361\361" + "\202\355\355\355\202\351\351\355\202\355\355\355\2\361\361\361\365\365\365" + "\202\371\371\371\4\370\370\365\362\362\366\356\356\361\355\355\355\202\351" + "\351\355\206\355\355\355\202\361\361\361\3\365\365\365\371\371\371\374\374" + "\374\202\374\374\376\7\374\372\374\371\371\374\374\372\374\371\371\371\365" + "\365\365\361\361\361\355\355\355\202\351\351\355\10\345\345\346\341\341\341" + "\337\337\331\351\351\351\365\365\365\361\361\361\345\345\346\333\333\333" + "\202\330\330\320\6\322\322\323\327\327\327\337\337\331\355\355\351\361\361" + "\361\345\345\340\202\337\337\331\11\333\333\333\327\327\327\322\322\323\330" + "\330\320\341\341\341\351\351\351\334\334\341\327\327\327\333\333\333\204" + "\341\341\341\4\351\351\355\371\371\374\362\362\366\344\344\351\202\341\341" + "\346\5\344\344\351\351\351\355\333\333\333\306\306\310\274\274\274\377\376" + "\376\376\325\376\376\376\16\273\301\235\223\223\224\240\240\241\255\255\260" + "\274\274\274\314\314\315\327\327\327\341\341\341\345\345\346\341\341\346" + "\356\356\361\371\371\371\371\371\374\374\374\376\202\376\376\376\3\374\372" + "\374\374\374\376\362\362\366\202\341\341\346\202\351\351\355\7\341\341\346" + "\341\341\341\356\356\361\362\362\366\365\365\371\374\372\374\376\376\376" + "\202\374\374\376\6\374\374\374\365\365\365\351\351\351\351\351\355\356\356" + "\361\351\351\351\202\345\345\346\1\351\351\351\202\356\356\361\3\341\341" + "\346\354\354\361\374\374\374\206\376\376\376\202\374\374\374\2\371\371\371" + "\362\362\366\202\351\351\355\2\362\362\366\371\371\374\204\376\376\376\1" + "\374\374\376\203\371\371\374\206\371\371\371\2\374\372\374\374\374\374\203" + "\376\376\376\1\374\374\374\212\371\371\371\2\374\372\374\374\374\374\211" + "\376\376\376\1\374\374\374\203\371\371\371\1\361\361\361\202\351\351\351" + "\5\362\362\366\374\372\374\362\362\366\345\345\346\337\337\331\203\333\333" + "\333\11\337\337\331\351\351\351\365\365\365\365\365\371\345\345\346\337\337" + "\331\341\341\341\345\345\340\341\341\341\202\333\333\333\3\351\351\355\365" + "\365\365\351\351\351\202\333\333\333\202\341\341\341\202\334\334\341\1\345" + "\345\346\202\365\365\371\1\346\346\355\202\341\341\346\6\345\345\346\355" + "\355\355\351\351\355\322\322\323\306\306\310\302\302\302\377\376\376\376" + "\326\376\376\376\7\244\246\230\235\235\234\253\252\253\267\267\272\306\306" + "\310\322\322\323\334\334\341\202\341\341\346\2\351\351\351\365\365\371\202" + "\371\371\374\17\374\374\376\376\376\376\374\374\376\374\372\374\371\371\374" + "\354\354\361\341\341\341\341\341\346\351\351\355\345\345\346\341\341\341" + "\345\345\346\365\365\371\365\365\365\371\371\371\205\376\376\376\5\371\371" + "\371\355\355\355\354\354\361\356\356\361\351\351\355\202\341\341\346\6\346" + "\346\355\356\356\361\351\351\355\341\341\341\351\351\355\371\371\374\211" + "\376\376\376\2\371\371\374\362\362\366\202\354\354\361\3\360\360\365\371" + "\371\371\374\374\376\203\376\376\376\203\374\374\376\242\376\376\376\4\371" + "\371\374\362\362\366\361\361\361\365\365\365\202\374\372\374\2\356\356\361" + "\341\341\341\204\333\333\333\6\341\341\341\355\355\355\371\371\371\365\365" + "\371\345\345\346\337\337\331\203\341\341\341\6\337\337\331\333\333\333\355" + "\355\355\371\371\371\355\355\355\341\341\341\202\334\334\341\20\341\341\341" + "\334\334\341\333\333\333\341\341\341\356\356\361\371\371\374\351\351\355" + "\341\341\341\334\334\341\341\341\346\354\354\361\361\361\361\341\341\341" + "\312\312\322\314\314\315\306\306\310\377\376\376\376\326\376\376\376\10\273" + "\301\235\223\223\224\245\245\247\255\255\260\274\274\274\314\314\315\327" + "\327\327\341\341\341\202\341\341\346\4\356\356\361\371\371\371\371\371\374" + "\374\374\376\202\376\376\376\4\374\374\376\374\372\374\371\371\374\351\351" + "\355\202\341\341\346\4\344\344\351\341\341\346\341\341\341\355\355\355\202" + "\365\365\371\1\374\372\374\205\376\376\376\5\371\371\371\351\351\355\355" + "\355\355\356\356\364\351\351\355\202\341\341\346\6\344\344\351\354\354\361" + "\351\351\355\334\334\341\344\344\351\371\371\371\212\376\376\376\2\371\371" + "\374\365\365\371\202\354\354\361\4\356\356\364\365\365\371\371\371\374\374" + "\374\376\243\376\376\376\11\374\374\376\371\371\371\362\362\366\365\365\371" + "\374\372\374\374\374\376\362\362\366\344\344\351\333\333\333\203\327\327" + "\327\12\333\333\333\341\341\346\361\361\361\374\372\374\362\362\366\341\341" + "\341\333\333\333\341\341\341\341\341\346\341\341\341\202\333\333\333\5\351" + "\351\351\371\371\371\355\355\355\334\334\341\333\333\333\203\334\334\341" + "\6\333\333\333\334\334\341\356\356\361\371\371\374\354\354\361\341\341\341" + "\202\334\334\341\7\351\351\355\365\365\365\351\351\355\324\324\332\316\316" + "\326\314\314\315\306\306\310\377\376\376\376\327\376\376\376\7\244\246\230" + "\235\235\234\253\252\253\267\267\272\302\302\302\322\322\323\333\333\333" + "\202\341\341\346\5\346\346\355\365\365\365\371\371\371\371\371\374\374\374" + "\376\202\376\376\376\202\374\372\374\5\371\371\374\351\351\355\334\334\341" + "\341\341\346\345\345\346\202\341\341\341\1\356\356\361\202\365\365\371\206" + "\376\376\376\5\371\371\371\351\351\355\346\346\355\354\354\361\351\351\355" + "\202\341\341\346\1\344\344\351\202\354\354\361\3\334\334\341\341\341\346" + "\365\365\371\213\376\376\376\3\374\374\376\365\365\371\362\362\366\202\360" + "\360\365\4\362\362\366\365\365\371\371\371\374\374\372\374\236\376\376\376" + "\12\374\374\376\374\372\374\371\371\374\371\371\371\374\374\374\376\376\376" + "\365\365\371\344\344\351\327\327\335\324\324\332\202\322\322\323\13\324\324" + "\332\333\333\333\351\351\351\365\365\371\374\372\374\355\355\355\334\334" + "\341\333\333\333\341\341\341\341\341\346\341\341\341\202\333\333\333\5\351" + "\351\355\371\371\371\355\355\355\333\333\333\327\327\335\203\333\333\333" + "\6\327\327\335\334\334\341\351\351\355\371\371\374\360\360\365\341\341\346" + "\202\334\334\341\4\344\344\351\365\365\365\356\356\361\334\334\341\203\324" + "\324\332\1\306\306\310\377\376\376\376\327\376\376\376\10\273\301\235\223" + "\223\224\245\245\247\255\255\260\274\274\274\314\314\315\327\327\327\334" + "\334\341\202\341\341\346\5\354\354\361\371\371\371\371\371\374\374\372\374" + "\374\374\376\202\376\376\376\5\374\372\374\374\374\376\365\365\371\341\341" + "\346\334\334\341\202\341\341\346\3\334\334\341\341\341\346\360\360\365\202" + "\365\365\371\206\376\376\376\5\365\365\371\351\351\355\344\344\351\354\354" + "\361\351\351\360\202\341\341\346\6\344\344\351\354\354\361\351\351\360\327" + "\327\335\334\334\341\360\360\365\215\376\376\376\1\374\372\374\202\365\365" + "\371\202\362\362\366\1\365\365\371\202\371\371\374\1\374\374\376\233\376" + "\376\376\2\374\374\376\374\372\374\202\376\376\376\4\371\371\371\354\354" + "\361\334\334\341\324\324\332\202\316\316\326\4\322\322\323\324\324\332\334" + "\334\341\354\354\361\202\371\371\374\1\351\351\355\202\333\333\333\3\341" + "\341\341\341\341\346\341\341\341\202\327\327\335\5\351\351\355\371\371\374" + "\354\354\361\334\334\341\324\324\332\205\327\327\335\4\344\344\351\365\365" + "\371\362\362\366\341\341\346\202\334\334\341\4\341\341\341\356\356\361\365" + "\365\371\344\344\351\202\327\327\335\3\333\333\333\327\327\327\306\306\310" + "\377\376\376\376\330\376\376\376\16\244\246\230\235\235\234\253\252\253\264" + "\264\265\302\302\302\322\322\323\333\333\333\341\341\341\341\341\346\344" + "\344\351\362\362\366\365\365\371\371\371\374\374\372\374\203\374\374\376" + "\4\371\371\374\374\372\374\360\360\365\341\341\346\203\334\334\341\2\327" + "\327\335\341\341\346\202\362\362\366\1\365\365\371\202\376\376\376\203\374" + "\374\376\11\376\376\376\371\371\374\351\351\355\341\341\346\351\351\355\354" + "\354\361\344\344\351\341\341\346\344\344\351\202\351\351\360\5\334\334\341" + "\327\327\335\351\351\360\374\372\374\376\376\376\213\374\374\374\202\374" + "\374\376\1\374\372\374\205\371\371\374\1\374\372\374\231\376\376\374\203" + "\376\376\376\5\371\371\371\354\354\361\334\334\341\322\322\323\316\316\326" + "\202\312\312\322\7\316\316\326\327\327\335\344\344\354\365\365\365\374\374" + "\376\365\365\365\341\341\346\202\334\334\341\12\341\341\346\345\345\346\334" + "\334\341\324\324\332\327\327\335\351\351\355\365\365\371\351\351\355\327" + "\327\335\322\322\323\204\324\324\332\5\327\327\335\341\341\346\365\365\371" + "\362\362\366\341\341\346\202\327\327\335\6\334\334\341\354\354\361\365\365" + "\371\351\351\355\334\334\341\327\327\335\202\334\334\341\2\322\322\323\302" + "\302\302\377\376\376\376\330\376\376\376\10\273\301\235\227\227\231\240\240" + "\241\255\255\260\274\274\274\306\306\310\322\322\323\334\334\341\202\341" + "\341\346\5\351\351\355\365\365\365\365\365\371\371\371\374\374\374\374\203" + "\374\372\374\202\371\371\374\2\356\356\361\341\341\341\204\327\327\335\4" + "\344\344\351\362\362\366\360\360\365\365\365\371\204\374\374\374\10\374\372" + "\374\374\374\374\374\372\374\354\354\361\341\341\346\344\344\351\351\351" + "\360\346\346\355\202\344\344\351\6\351\351\360\354\354\361\341\341\346\324" + "\324\332\341\341\346\362\362\366\212\374\372\374\241\374\374\372\202\374" + "\374\374\5\371\371\374\362\362\366\346\346\355\334\334\341\316\316\326\204" + "\312\312\322\3\327\327\335\341\341\346\360\360\365\202\371\371\374\15\356" + "\356\361\341\341\346\334\334\341\341\341\346\346\346\355\344\344\351\334" + "\334\341\324\324\332\334\334\341\356\356\361\365\365\371\344\344\351\324" + "\324\332\202\316\316\326\203\322\322\323\13\324\324\332\341\341\346\362\362" + "\366\365\365\365\341\341\346\327\327\335\324\324\332\327\327\335\346\346" + "\355\371\371\371\356\356\361\203\334\334\341\4\341\341\346\334\334\341\322" + "\322\323\274\274\274\377\376\376\376\331\376\376\376\7\256\263\231\227\227" + "\231\245\245\247\264\264\265\302\302\302\314\314\315\327\327\327\202\341" + "\341\341\2\341\341\346\355\355\355\202\365\365\371\1\371\371\371\203\371" + "\371\374\203\371\371\371\2\356\356\361\334\334\341\202\327\327\335\6\324" + "\324\332\327\327\335\351\351\355\362\362\366\356\356\364\371\371\371\207" + "\374\372\374\17\361\361\361\341\341\346\334\334\341\346\346\355\351\351\360" + "\344\344\354\344\344\351\351\351\355\354\354\361\341\341\346\324\324\332" + "\327\327\335\354\354\361\371\371\374\374\372\374\205\371\371\371\212\374" + "\374\372\231\374\372\374\5\371\371\371\360\360\365\341\341\346\327\327\335" + "\312\312\322\202\305\305\315\202\312\312\322\24\324\324\332\341\341\346\360" + "\360\365\371\371\374\374\372\374\365\365\371\346\346\355\341\341\346\344" + "\344\351\351\351\355\354\354\361\346\346\355\334\334\341\324\324\332\334" + "\334\341\362\362\366\365\365\371\341\341\346\322\322\323\312\312\322\204" + "\316\316\326\5\324\324\332\341\341\341\362\362\366\365\365\371\341\341\346" + "\203\324\324\332\13\341\341\346\365\365\371\362\362\366\341\341\341\327\327" + "\335\341\341\341\344\344\351\341\341\346\327\327\335\306\306\310\267\267" + "\272\377\376\376\376\331\376\376\376\1\307\322\237\202\235\235\234\15\255" + "\255\260\267\267\272\302\302\302\322\322\323\327\327\335\334\334\341\341" + "\341\341\345\345\346\361\361\361\362\362\366\365\365\371\371\371\371\365" + "\365\371\203\371\371\371\202\365\365\371\2\351\351\355\327\327\335\203\324" + "\324\332\5\327\327\335\346\346\355\356\356\364\356\356\361\365\365\371\207" + "\371\371\371\4\362\362\366\341\341\346\334\334\341\341\341\346\204\346\346" + "\355\6\351\351\360\341\341\346\327\327\335\324\324\332\341\341\346\360\360" + "\365\245\371\371\371\6\365\365\365\356\356\361\346\346\355\334\334\341\324" + "\324\332\312\312\322\203\305\305\315\25\316\316\326\324\324\332\341\341\346" + "\354\354\361\365\365\371\371\371\371\365\365\371\356\356\361\351\351\355" + "\346\346\355\351\351\360\356\356\364\354\354\361\346\346\355\334\334\341" + "\327\327\335\344\344\351\362\362\366\360\360\365\334\334\341\316\316\326" + "\205\312\312\322\11\316\316\326\334\334\341\356\356\361\362\362\366\344\344" + "\351\324\324\332\322\322\323\324\324\332\334\334\341\202\356\356\364\11\341" + "\341\346\327\327\335\334\334\341\341\341\346\344\344\351\341\341\341\322" + "\322\323\302\302\302\267\267\272\377\376\376\376\332\376\376\376\10\273\301" + "\235\223\223\224\245\245\247\261\261\260\274\274\274\306\306\310\322\322" + "\323\333\333\333\202\334\334\341\2\345\345\346\356\356\361\202\361\361\361" + "\204\365\365\365\1\362\362\366\202\360\360\365\2\345\345\346\327\327\327" + "\203\316\316\326\5\324\324\332\344\344\351\354\354\361\351\351\355\361\361" + "\361\207\365\365\365\5\361\361\361\344\344\351\327\327\335\324\324\332\334" + "\334\341\202\344\344\351\10\344\344\354\346\346\355\344\344\351\327\327\335" + "\312\312\322\316\316\326\341\341\346\361\361\361\235\365\365\365\202\362" + "\362\366\7\361\361\361\354\354\361\346\346\355\334\334\341\327\327\335\316" + "\316\326\312\312\322\203\305\305\315\6\312\312\322\324\324\332\327\327\335" + "\344\344\351\356\356\361\362\362\366\202\365\365\365\1\356\356\364\202\351" + "\351\355\1\354\354\361\202\360\360\365\10\354\354\361\341\341\346\327\327" + "\335\334\334\341\351\351\355\362\362\366\351\351\355\316\316\326\206\305" + "\305\315\14\312\312\322\334\334\341\354\354\361\356\356\361\334\334\341\316" + "\316\326\312\312\322\316\316\326\327\327\335\351\351\355\356\356\361\334" + "\334\341\202\324\324\332\7\334\334\341\345\345\346\341\341\341\324\324\332" + "\314\314\315\273\273\302\267\267\272\377\376\376\376\333\376\376\376\10\244" + "\246\230\227\227\231\245\245\247\264\264\265\274\274\274\306\306\310\322" + "\322\323\327\327\327\202\333\333\333\1\345\345\346\202\351\351\355\203\355" + "\355\355\202\356\356\361\202\355\355\355\3\351\351\355\341\341\341\316\316" + "\326\203\305\305\315\1\324\324\332\203\344\344\351\1\355\355\355\204\356" + "\356\361\204\355\355\355\2\351\351\351\324\324\332\202\316\316\326\1\327" + "\327\335\204\341\341\346\1\324\324\332\202\305\305\315\3\316\316\326\341" + "\341\346\355\355\355\202\356\356\361\225\355\355\355\202\351\351\355\7\351" + "\351\351\344\344\351\341\341\346\334\334\341\327\327\335\316\316\326\312" + "\312\322\205\305\305\315\5\316\316\326\324\324\332\334\334\341\351\351\351" + "\351\351\355\203\356\356\361\1\355\355\355\203\351\351\355\202\355\355\355" + "\11\356\356\361\351\351\355\341\341\346\327\327\335\334\334\341\351\351\351" + "\355\355\355\341\341\341\312\312\322\206\277\277\310\6\305\305\315\324\324" + "\332\351\351\351\351\351\355\334\334\341\312\312\322\202\305\305\315\4\316" + "\316\326\341\341\346\351\351\355\334\334\341\202\316\316\326\1\327\327\335" + "\202\334\334\341\5\327\327\335\314\314\315\302\302\302\274\274\274\267\267" + "\272\377\376\376\376\333\376\376\376\10\273\301\235\231\232\217\235\235\234" + "\253\252\253\264\264\265\274\274\274\306\306\310\314\314\315\202\322\322" + "\323\1\324\324\332\203\341\341\341\206\345\345\346\202\341\341\346\2\327" + "\327\335\305\305\315\203\277\277\310\2\312\312\322\333\333\333\202\334\334" + "\341\1\341\341\346\210\345\345\346\3\341\341\346\327\327\335\312\312\322" + "\202\305\305\315\2\316\316\326\324\324\332\202\327\327\335\2\324\324\332" + "\312\312\322\202\277\277\310\3\312\312\322\327\327\335\341\341\346\220\345" + "\345\346\2\341\341\346\341\341\341\202\334\334\341\1\327\327\335\202\324" + "\324\332\202\316\316\326\202\312\312\322\203\305\305\315\1\312\312\322\202" + "\316\316\326\3\327\327\335\334\334\341\341\341\341\215\345\345\346\1\341" + "\341\341\202\327\327\335\10\341\341\341\345\345\346\341\341\341\316\316\326" + "\273\273\302\267\267\272\263\263\277\267\267\272\203\273\273\302\2\277\277" + "\310\322\322\323\202\341\341\341\2\316\316\326\306\306\310\202\277\277\310" + "\4\305\305\315\333\333\333\341\341\341\324\324\332\202\305\305\315\11\316" + "\316\326\327\327\327\324\324\332\322\322\323\314\314\315\302\302\302\273" + "\273\302\274\274\274\267\267\272\377\376\376\376\334\376\376\376\7\256\263" + "\231\223\223\224\235\235\234\253\252\253\264\264\265\267\267\272\302\302" + "\302\203\306\306\310\1\314\314\315\203\327\327\327\206\333\333\333\5\327" + "\327\335\333\333\333\322\322\323\277\277\310\274\274\274\202\267\267\272" + "\2\277\277\310\316\316\326\202\322\322\323\1\327\327\327\211\333\333\333" + "\3\327\327\327\314\314\315\277\277\310\202\273\273\302\2\277\277\310\305" + "\305\315\202\312\312\322\2\305\305\315\273\273\302\202\263\263\277\3\273" + "\273\302\312\312\322\327\327\327\217\333\333\333\1\327\327\327\202\324\324" + "\332\203\322\322\323\202\316\316\326\4\322\322\323\316\316\326\322\322\323" + "\324\324\332\202\327\327\327\221\333\333\333\3\324\324\332\322\322\323\327" + "\327\327\202\333\333\333\2\316\316\326\273\273\302\206\255\255\260\20\263" + "\263\277\273\273\302\314\314\315\333\333\333\324\324\332\306\306\310\273" + "\273\302\267\267\272\273\273\302\277\277\310\322\322\323\327\327\327\314" + "\314\315\277\277\310\273\273\302\306\306\310\203\314\314\315\2\302\302\302" + "\273\273\302\203\274\274\274\1\261\261\260\377\376\376\376\335\376\376\376" + "\7\244\246\230\220\220\217\235\235\234\245\245\247\255\255\260\264\264\265" + "\267\267\272\203\274\274\274\3\302\302\302\314\314\315\306\306\310\211\314" + "\314\315\3\306\306\310\273\273\302\261\261\260\202\255\255\260\5\267\267" + "\272\302\302\302\277\277\310\302\302\302\306\306\310\212\314\314\315\3\306" + "\306\310\302\302\302\264\264\265\202\255\255\260\3\264\264\265\267\267\272" + "\273\273\302\202\267\267\272\1\255\255\260\202\253\252\253\4\255\255\260" + "\267\267\272\302\302\302\306\306\310\256\314\314\315\3\306\306\310\267\267" + "\272\253\252\253\206\245\245\247\6\253\252\253\264\264\265\306\306\310\314" + "\314\315\306\306\310\267\267\272\203\255\255\260\1\267\267\272\202\306\306" + "\310\1\273\273\302\202\264\264\265\5\267\267\272\273\273\302\302\302\302" + "\273\273\302\267\267\272\203\264\264\265\3\267\267\272\261\261\260\245\245" + "\247\377\376\376\376\336\376\376\376\6\231\232\217\220\220\217\227\227\231" + "\240\240\241\245\245\247\253\252\253\203\255\255\260\1\261\261\260\203\267" + "\267\272\211\274\274\274\3\267\267\272\255\255\260\245\245\247\202\240\240" + "\241\1\245\245\247\203\264\264\265\1\267\267\272\214\274\274\274\5\264\264" + "\265\245\245\247\240\240\241\235\235\234\240\240\241\204\245\245\247\1\240" + "\240\241\202\235\235\234\4\240\240\241\245\245\247\255\255\260\267\267\272" + "\253\274\274\274\2\255\255\260\240\240\241\207\227\227\231\2\240\240\241" + "\253\252\253\202\274\274\274\11\264\264\265\253\252\253\245\245\247\240\240" + "\241\245\245\247\253\252\253\267\267\272\274\274\274\255\255\260\203\245" + "\245\247\4\255\255\260\261\261\260\255\255\260\253\252\253\202\245\245\247" + "\5\253\252\253\255\255\260\253\252\253\240\240\241\227\227\231", +}; + diff --git a/src/image_data/clocks_banner.h b/src/image_data/clocks_banner.h new file mode 100644 index 0000000..46814e5 --- /dev/null +++ b/src/image_data/clocks_banner.h @@ -0,0 +1,1884 @@ +/* GIMP RGB C-Source image dump 1-byte-run-length-encoded */
+
+#include "image.h"
+
+static const nv_image_t clocks_banner_image = {
+ 360, 60, 3,
+ "\204]y\30\202m\216\33\377\201\221\33\311\201\221\33\6\205\234G\226\244b\200"
+ "\200\205z{|\206\207\212\227\227\232\202\235\234\237\1\243\242\244\202\235"
+ "\234\237\2\217\217\222\206\207\212\203\217\217\222\3\206\207\212\200\200"
+ "\205\206\207\212\206\217\217\222\202\200\200\205\1\217\217\222\204\227\227"
+ "\232\3\200\200\205z{|\206\207\212\204\217\217\222\1\206\207\212\202z{|\1"
+ "\217\217\222\205\227\227\232\4\217\217\222rqyz{|\217\217\222\203\227\227"
+ "\232\5\217\217\222\200\200\205rqyz{|\217\217\222\210\227\227\232\2\206\207"
+ "\212\200\200\205\202z{|\1\200\200\205\202\206\207\212\205\217\217\222\225"
+ "\206\207\212\204\200\200\205\1\206\207\212\204\227\227\232\1\217\217\222"
+ "\202\206\207\212\202\217\217\222\203\227\227\232\1\217\217\222\204\206\207"
+ "\212\1\217\217\222\203\227\227\232\2\217\217\222z{|\203rqy\1\200\200\205"
+ "\202\217\217\222\206\227\227\232\202\217\217\222\202\206\207\212\202\200"
+ "\200\205\203\206\207\212\1\200\200\205\202z{|\1iku\203]y\30\202\201\221\33"
+ "\202\222\247#\377\235\262\"\307\235\262\"\11\246\277?\264\277q\241\252vz"
+ "{|\206\207\212\227\227\232\243\242\244\252\252\254\254\254\262\202\261\261"
+ "\264\1\252\252\254\202\235\234\237\202\243\242\244\4\235\234\237\227\227"
+ "\232\217\217\222\227\227\232\205\243\242\244\3\227\227\232\217\217\222\227"
+ "\227\232\204\252\252\254\4\235\234\237\206\207\212\217\217\222\235\234\237"
+ "\203\243\242\244\4\235\234\237\217\217\222\200\200\205\235\234\237\205\252"
+ "\252\254\5\243\242\244\206\207\212\200\200\205\227\227\232\244\244\252\202"
+ "\252\252\254\5\243\242\244\217\217\222\200\200\205\217\217\222\243\242\244"
+ "\207\252\252\254\2\243\242\244\217\217\222\202\206\207\212\3\217\217\222"
+ "\227\227\232\235\234\237\202\243\242\244\202\235\234\237\202\227\227\232"
+ "\1\217\217\222\206\227\227\232\2\235\234\237\227\227\232\203\235\234\237"
+ "\214\227\227\232\203\217\217\222\2\227\227\232\235\234\237\203\252\252\254"
+ "\5\243\242\244\227\227\232\217\217\222\227\227\232\243\242\244\203\252\252"
+ "\254\1\243\242\244\204\227\227\232\1\235\234\237\202\252\252\254\2\244\244"
+ "\252\227\227\232\204\200\200\205\3\217\217\222\235\234\237\243\242\244\205"
+ "\252\252\254\202\243\242\244\2\235\234\237\227\227\232\203\217\217\222\202"
+ "\227\227\232\1\217\217\222\202\200\200\205\2z{|]y\30\202\201\221\33\1\222"
+ "\247#\202\235\262\"\377\261\305&\310\261\305&\10\251\300X\302\312\225\237"
+ "\243\221z{|\217\217\222\243\242\244\252\252\254\265\265\265\202\275\275\276"
+ "\2\302\302\304\264\264\272\202\254\254\262\202\265\265\265\4\252\252\254"
+ "\235\234\237\243\242\244\252\252\254\204\261\261\264\5\254\254\262\233\233"
+ "\250\243\242\244\265\265\265\271\271\272\202\275\275\276\5\271\271\272\243"
+ "\242\244\227\227\232\243\242\244\254\254\262\202\257\255\267\5\261\261\264"
+ "\233\233\250\217\217\222\243\242\244\271\271\272\202\275\275\276\16\271\271"
+ "\272\275\275\276\264\264\272\235\234\237\203\212\224\243\242\244\265\265"
+ "\265\271\271\272\275\275\276\264\264\272\235\234\237\203\212\224\235\234"
+ "\237\265\265\265\202\275\275\276\203\271\271\272\4\275\275\276\271\271\272"
+ "\261\261\264\235\234\237\202\227\227\232\2\243\242\244\252\252\254\203\261"
+ "\261\264\202\252\252\254\204\244\244\252\202\252\252\254\5\254\254\262\261"
+ "\261\264\265\265\265\271\271\272\264\264\272\202\271\271\272\2\265\265\265"
+ "\271\271\272\202\265\265\265\202\261\261\264\1\254\254\262\202\252\252\254"
+ "\206\244\244\252\6\243\242\244\233\233\250\235\234\237\243\242\244\254\254"
+ "\262\271\271\272\202\275\275\276\11\264\264\272\244\244\252\235\234\237\243"
+ "\242\244\261\261\264\271\271\272\275\275\276\271\271\272\257\255\267\203"
+ "\244\244\252\2\252\252\254\261\261\264\202\271\271\272\2\264\264\272\233"
+ "\233\250\203\217\217\222\6\227\227\232\244\244\252\261\261\264\265\265\265"
+ "\275\275\276\271\271\272\202\275\275\276\1\271\271\272\202\261\261\264\3"
+ "\244\244\252\233\233\250\243\242\244\202\235\234\237\6\243\242\244\235\234"
+ "\237\217\217\222\206\207\212z{|m\216\33\202\201\221\33\1\222\247#\202\261"
+ "\305&\1\265\321&\377\301\325.\307\301\325.\11\340\351v\324\343\223\226\231"
+ "\212\206\207\212\235\234\237\252\252\254\265\265\265\302\302\304\311\311"
+ "\311\202\314\314\315\10\302\302\304\275\275\276\302\302\304\311\311\311\302"
+ "\302\304\265\265\265\252\252\254\261\261\264\203\275\275\276\202\302\302"
+ "\304\4\271\271\272\252\252\254\264\264\272\311\311\311\203\314\314\315\10"
+ "\302\302\304\244\244\252\251\244\260\264\264\272\273\273\304\302\302\304"
+ "\275\275\276\264\264\272\202\244\244\252\1\302\302\304\205\314\314\315\13"
+ "\264\264\272\222\230\242\243\242\244\273\273\304\311\311\311\314\314\315"
+ "\303\303\313\254\254\262\222\230\242\244\244\252\302\302\304\202\314\314"
+ "\315\202\311\311\311\202\314\314\315\7\311\311\311\273\273\304\254\254\262"
+ "\244\244\252\254\254\262\264\264\272\273\273\304\202\302\302\304\1\273\273"
+ "\304\202\264\264\272\3\261\261\264\264\264\272\271\271\272\202\302\302\304"
+ "\220\311\311\311\4\303\303\313\302\302\304\275\275\276\271\271\272\204\264"
+ "\264\272\1\265\265\265\202\261\261\264\4\251\244\260\254\254\262\275\275"
+ "\276\311\311\311\202\314\314\315\22\302\302\304\261\261\264\251\244\260\254"
+ "\254\262\275\275\276\311\311\311\314\314\315\311\311\311\302\302\304\264"
+ "\264\272\261\261\264\264\264\272\273\265\277\311\311\311\314\314\315\311"
+ "\311\311\271\271\272\233\233\250\202\222\230\242\5\233\233\250\244\244\252"
+ "\273\265\277\302\302\304\311\311\311\204\314\314\315\3\303\303\313\273\273"
+ "\304\271\271\272\203\254\254\262\203\252\252\254\3\235\234\237\217\217\222"
+ "\206\207\212\202\201\221\33\1\222\247#\202\261\305&\1\301\325.\202\307\333"
+ "0\377\315\341.\305\315\341.\16\320\350R\345\361\223\302\312\225z{|\217\217"
+ "\222\243\242\244\261\261\264\275\275\276\314\314\315\323\323\324\331\331"
+ "\335\323\323\324\311\311\311\314\314\315\202\323\323\324\4\311\311\311\275"
+ "\275\276\264\264\272\302\302\304\203\314\314\315\5\313\313\323\311\311\311"
+ "\273\273\304\271\271\272\313\313\323\204\331\331\331\12\273\273\304\254\254"
+ "\262\273\273\304\311\311\311\313\313\323\314\314\315\303\303\313\264\264"
+ "\272\251\244\260\303\303\313\205\331\331\331\13\323\323\324\254\254\262\244"
+ "\244\252\273\273\304\323\323\331\325\325\335\323\323\331\273\273\304\244"
+ "\244\252\254\254\262\313\313\323\207\331\331\331\5\311\311\311\264\264\272"
+ "\257\255\267\275\275\276\303\303\313\202\323\323\324\11\314\314\315\303\303"
+ "\313\302\302\304\275\275\276\302\302\304\311\311\311\323\323\324\331\331"
+ "\331\325\325\335\202\331\331\331\1\323\323\331\205\323\323\324\202\323\323"
+ "\331\212\331\331\331\3\323\323\324\313\313\323\311\311\311\203\302\302\304"
+ "\1\273\273\304\202\275\275\276\202\264\264\272\2\302\302\304\323\323\324"
+ "\202\331\331\331\5\313\313\323\273\273\304\257\255\267\264\264\272\303\303"
+ "\313\203\331\331\331\1\313\313\323\203\273\273\304\1\313\313\323\202\331"
+ "\331\331\2\323\323\331\264\264\272\203\244\244\252\4\251\244\260\264\264"
+ "\272\313\313\323\323\323\331\205\331\331\331\13\313\313\323\314\314\315\273"
+ "\273\304\264\264\272\271\271\272\264\264\272\254\254\262\261\261\264\244"
+ "\244\252\227\227\232\206\207\212\202\201\221\33\7\235\262\"\261\305&\265"
+ "\321&\307\3330\315\341.\321\345.\315\341.\377\321\345.\304\321\345.\21\325"
+ "\347`\345\361\223\262\270\222\200\200\205\227\227\232\252\252\254\271\271"
+ "\272\303\303\313\323\323\324\331\331\331\333\333\341\325\325\335\323\323"
+ "\331\335\331\335\341\341\341\335\335\335\323\323\324\202\302\302\304\1\313"
+ "\313\323\202\323\323\331\5\325\325\335\331\331\335\313\313\323\302\302\304"
+ "\312\305\321\204\343\342\345\13\331\331\331\273\273\304\273\265\277\313\313"
+ "\323\323\323\331\325\325\335\323\323\331\303\303\313\264\264\272\273\273"
+ "\304\341\341\341\205\343\342\345\12\303\303\313\251\244\260\273\273\304\323"
+ "\323\331\335\335\345\333\333\341\313\313\323\257\255\267\264\264\272\331"
+ "\331\331\207\343\342\345\15\323\323\331\273\273\304\273\265\277\311\311\311"
+ "\325\325\335\335\331\335\331\331\335\323\323\324\314\314\315\305\304\321"
+ "\314\314\315\325\325\335\341\341\341\202\343\342\345\4\341\341\341\335\335"
+ "\335\331\331\331\323\323\331\203\323\323\324\3\323\323\331\323\323\324\323"
+ "\323\331\202\331\331\331\1\323\323\331\204\331\331\331\202\331\331\335\1"
+ "\335\331\335\203\335\335\335\4\335\331\335\331\331\331\323\323\324\314\314"
+ "\315\204\302\302\304\1\303\303\313\202\273\273\304\2\314\314\315\341\341"
+ "\341\202\343\342\345\5\323\323\331\273\273\304\264\264\272\273\273\304\323"
+ "\323\324\203\343\342\345\5\323\323\331\305\304\321\303\303\313\313\313\323"
+ "\331\331\335\202\343\342\345\3\323\323\331\264\264\272\254\254\262\202\257"
+ "\255\267\4\264\264\272\313\313\323\335\331\335\341\341\341\204\343\342\345"
+ "\7\333\333\341\323\323\331\314\314\315\302\302\304\275\275\312\273\273\304"
+ "\271\271\272\202\261\261\264\11\235\234\237\217\217\222\201\221\33\222\247"
+ "#\235\262\"\261\305&\301\325.\307\3330\315\341.\377\324\3452\305\324\345"
+ "2\25\325\3512\340\351v\345\361\223\237\243\221\206\207\212\235\234\237\254"
+ "\254\262\275\275\276\311\311\311\323\323\324\341\341\341\343\342\345\335"
+ "\331\335\333\333\341\345\345\351\351\351\351\343\342\345\325\325\335\311"
+ "\311\311\313\313\323\335\331\335\202\333\333\341\5\335\335\335\335\335\345"
+ "\322\314\324\303\303\313\333\333\341\204\355\355\355\12\323\323\331\273\273"
+ "\304\303\303\313\331\331\335\335\335\345\333\333\341\325\325\335\275\275"
+ "\312\264\264\272\325\325\335\205\355\355\355\12\343\342\345\263\265\303\273"
+ "\265\277\323\323\331\341\341\351\345\345\351\333\333\341\275\275\312\264"
+ "\264\272\325\325\335\207\355\355\355\10\341\341\341\303\303\313\302\302\304"
+ "\315\315\331\335\335\345\345\345\351\343\342\345\331\331\335\202\323\323"
+ "\331\2\335\331\335\345\345\351\203\355\355\355\3\345\345\351\341\341\341"
+ "\324\343\223\211\340\351v\203\325\347`\205\320\350R\204\302\335M\4\277\334"
+ "=\302\335M\271\326B\302\335M\202\271\326B\4\302\335M\302\302\304\303\303"
+ "\313\311\311\311\202\303\303\313\11\325\325\335\355\351\355\355\355\355\351"
+ "\351\351\325\325\335\275\275\312\273\273\304\303\303\313\333\333\341\202"
+ "\355\355\355\12\351\351\351\325\325\335\313\313\323\315\315\331\333\333\341"
+ "\351\351\351\355\355\355\345\345\351\312\305\321\257\255\267\203\264\264"
+ "\272\3\303\303\313\335\335\345\345\345\351\204\355\355\355\4\351\351\351"
+ "\335\335\345\325\325\335\312\305\321\202\303\303\313\13\273\273\304\264\264"
+ "\272\261\261\264\244\244\252\217\217\222\201\221\33\222\247#\241\272*\261"
+ "\305&\301\325.\315\341.\203\324\3452\377\325\3512\302\325\3512\13\324\345"
+ "2\334\355=\345\361\223\324\343\223\206\207\212\217\217\222\243\242\244\261"
+ "\261\264\302\302\304\323\323\324\331\331\335\202\343\342\345\10\341\341\341"
+ "\351\351\351\355\355\361\361\361\361\351\351\355\331\331\335\323\323\324"
+ "\331\331\335\203\343\342\345\5\345\345\351\335\335\345\313\313\323\323\323"
+ "\331\355\355\361\203\365\365\365\13\355\351\355\313\313\323\303\303\313\323"
+ "\323\331\343\342\345\341\341\351\343\342\345\315\315\331\273\273\304\305"
+ "\304\321\355\355\361\202\365\365\365\16\361\361\365\365\365\365\361\361\361"
+ "\315\315\331\264\264\272\313\313\323\341\341\351\345\345\355\341\341\351"
+ "\313\313\323\263\265\303\313\313\323\361\361\361\365\365\365\203\361\361"
+ "\365\202\365\365\365\24\351\351\351\313\313\323\305\304\321\325\325\335\345"
+ "\345\351\351\351\355\345\345\351\333\333\341\325\325\335\333\333\341\351"
+ "\351\351\361\361\361\365\365\365\361\361\361\355\355\355\351\351\351\345"
+ "\345\351\345\341\351\310\325t\370\372\201\202\345\361\223\2\340\351v\370"
+ "\372\201\202\340\351v\1\355\371e\205\340\351v\203\325\347`\203\320\350R\203"
+ "\302\335M\203\271\326B\7\263\315A\257\3232\263\315A\264\264\272\303\303\313"
+ "\313\313\323\315\315\331\202\313\313\323\11\335\335\345\361\361\365\365\365"
+ "\365\351\351\355\323\323\324\303\303\313\275\275\312\313\313\323\345\345"
+ "\351\202\365\365\365\5\351\351\355\325\325\341\323\323\331\325\325\335\345"
+ "\345\351\202\361\361\365\3\341\341\351\275\275\312\263\265\303\203\273\273"
+ "\304\3\325\325\335\351\351\355\355\355\361\203\365\365\365\17\361\361\361"
+ "\351\351\355\341\341\351\323\323\324\312\305\321\314\314\315\303\303\313"
+ "\271\271\272\254\254\262\252\252\254\227\227\232\201\221\33\222\247#\235"
+ "\262\"\261\305&\202\307\3330\2\315\341.\324\3452\226\334\3567\7\325\347`"
+ "\340\351v\310\325t\325\347`\264\277q\320\350R\334\355=\202\335\3556\377\334"
+ "\3567\245\334\3567\16\341\372P\345\361\223\302\312\225\200\200\205\217\217"
+ "\222\252\252\254\265\265\265\311\311\311\323\323\324\341\341\341\345\345"
+ "\351\343\342\345\345\345\351\361\361\361\202\365\365\365\5\355\355\355\333"
+ "\333\341\325\325\335\343\342\345\351\351\355\202\345\345\351\4\351\351\355"
+ "\335\335\345\322\314\324\343\342\345\204\371\371\371\4\345\345\351\312\305"
+ "\321\313\313\323\335\335\345\202\345\345\355\4\335\335\345\312\305\321\303"
+ "\303\313\343\342\345\205\371\371\371\1\345\345\351\202\275\275\312\1\333"
+ "\333\341\202\345\345\355\4\325\325\335\273\273\304\305\304\321\361\361\361"
+ "\206\371\371\371\13\361\361\361\323\323\331\313\313\323\331\331\335\351\351"
+ "\355\355\355\361\351\351\355\335\335\345\333\333\341\343\342\345\361\361"
+ "\361\202\371\371\371\10\365\365\365\355\355\361\355\355\355\355\351\355\355"
+ "\355\355\345\345\351\310\325t\345\361\223\205\370\372\201\203\340\351v\2"
+ "\325\347`\355\371e\204\325\347`\203\320\350R\203\302\335M\2\271\326B\277"
+ "\334=\203\271\326B\12\257\3232\263\315A\271\271\272\303\303\313\323\323\324"
+ "\325\325\335\323\323\324\313\313\323\323\323\324\345\345\351\202\371\371"
+ "\371\6\351\351\355\315\315\331\303\303\313\275\275\312\315\315\331\355\355"
+ "\361\202\371\371\371\20\351\351\361\331\331\335\325\325\335\335\335\345\361"
+ "\361\365\371\371\371\365\365\365\323\323\331\273\273\304\275\275\312\303"
+ "\303\313\273\273\304\313\313\323\345\345\355\361\361\365\365\365\371\203"
+ "\371\371\371\3\355\355\365\351\351\355\331\331\335\203\313\313\323\14\273"
+ "\273\304\254\254\262\244\244\252\227\227\232\201\221\33\222\247#\241\272"
+ "*\261\305&\307\3330\315\341.\324\3452\325\3507\224\334\3567\13\302\335M\263"
+ "\264\244\206\207\212_`l\206\207\212IUW&*49;I\226\231\212\302\335M\334\355"
+ "=\377\334\3567\244\334\3567\24\335\3556\340\351v\345\361\223\262\270\222"
+ "\206\207\212\227\227\232\252\252\254\275\275\276\314\314\315\331\331\331"
+ "\341\341\341\351\351\351\343\342\345\351\351\355\365\365\365\371\371\371"
+ "\365\365\365\355\355\361\335\331\335\335\335\345\203\351\351\355\6\355\355"
+ "\361\355\351\361\331\331\335\325\325\335\355\355\361\375\375\371\202\371"
+ "\371\375\13\371\371\371\333\333\341\305\304\321\323\323\331\345\345\351\351"
+ "\351\355\345\345\355\331\331\335\303\303\313\315\315\331\365\365\365\202"
+ "\371\371\375\16\371\371\371\375\375\371\371\371\371\315\315\331\273\265\277"
+ "\313\313\323\341\341\351\345\345\355\341\341\351\305\304\321\275\275\312"
+ "\345\341\351\371\371\375\375\375\371\203\371\371\371\17\375\375\371\371\371"
+ "\371\343\342\345\313\313\323\325\325\335\345\345\355\355\355\365\351\351"
+ "\355\343\342\345\333\333\341\351\351\355\365\365\371\371\371\375\371\371"
+ "\371\365\365\365\202\355\355\361\202\351\351\355\7\345\345\351\331\331\331"
+ "\226\244b\241\252v\226\244b\241\252v\310\325t\203\370\372\201\202\355\371"
+ "e\1\340\351v\204\325\347`\203\320\350R\2\302\335M\320\350R\203\302\335M\204"
+ "\271\326B\202\263\315A\3\275\275\276\322\314\324\323\323\331\202\325\325"
+ "\335\10\315\315\331\313\313\323\323\323\331\361\361\365\371\371\375\371\371"
+ "\371\343\342\345\305\304\321\202\303\303\313\10\333\333\341\365\365\371\371"
+ "\371\375\365\365\371\341\341\351\325\325\341\333\333\341\351\351\361\202"
+ "\371\371\375\1\345\345\355\202\275\275\312\1\305\304\321\202\303\303\313"
+ "\3\333\333\341\355\355\365\371\371\371\202\371\371\375\4\375\375\371\365"
+ "\365\371\355\355\361\341\341\351\202\313\313\323\15\314\314\315\302\302\304"
+ "\254\254\262\244\244\252\227\227\232\201\221\33\222\247#\241\272*\301\325"
+ ".\307\3330\315\341.\324\3452\331\3556\223\336\3578\1z{|\202rqy\12\235\234"
+ "\237\310\325t\325\347`\340\351v\310\325t\235\234\2379;I_`l\263\264\244\334"
+ "\355=\377\336\3578\243\336\3578\13\334\3567\370\372\201\345\361\223\237\243"
+ "\221\206\207\212\235\234\237\254\254\262\302\302\304\314\314\315\331\331"
+ "\335\343\342\345\202\345\345\351\1\355\355\361\203\371\371\371\3\355\355"
+ "\361\335\335\345\345\345\351\202\355\355\361\23\355\351\355\355\355\361\351"
+ "\351\355\325\325\335\335\335\345\371\371\371\375\375\375\375\375\371\375"
+ "\375\375\365\365\371\323\323\331\312\305\321\333\333\341\345\345\355\351"
+ "\351\361\341\341\351\315\315\331\275\275\312\345\341\351\202\375\375\375"
+ "\7\375\375\371\371\371\375\375\375\375\355\355\361\303\303\313\273\273\304"
+ "\325\325\335\202\345\341\351\5\323\323\331\273\273\304\325\325\335\371\371"
+ "\371\375\375\371\203\371\371\375\202\375\375\375\25\355\355\361\315\315\331"
+ "\323\323\331\345\345\351\355\355\361\355\351\361\343\342\345\335\335\345"
+ "\351\351\355\371\371\371\375\375\371\371\371\375\361\361\365\355\355\361"
+ "\345\345\351\314\314\315\244\244\252rqyDEJTY_DEJ\20201?\202&*4\4:::TY_\226"
+ "\244b\310\325t\203\355\371e\204\325\347`\203\320\350R\203\302\335M\206\271"
+ "\326B\16\263\315A\275\275\276\331\331\335\341\341\341\333\333\341\325\325"
+ "\335\323\323\331\315\315\331\313\313\323\335\335\345\371\371\375\375\375"
+ "\375\361\361\365\325\325\335\202\303\303\313\15\312\305\321\345\345\355\375"
+ "\375\371\375\375\375\355\355\365\333\333\341\325\325\341\341\341\351\365"
+ "\365\371\375\375\371\365\365\365\313\313\323\273\273\304\202\305\304\321"
+ "\5\275\275\312\313\313\323\351\351\361\365\365\371\371\371\375\202\375\375"
+ "\375\4\371\371\371\361\361\365\345\345\355\323\323\324\202\313\313\323\11"
+ "\303\303\313\261\261\264\243\242\244\227\227\232\201\221\33\222\247#\241"
+ "\272*\301\325.\307\3330\202\324\3452\1\334\3567\221\336\3578\5\334\3567\226"
+ "\231\212\16\20\16\265\265\265\320\350R\202\335\3556\1\331\3516\202\334\355"
+ "=\6\336\3578\340\351v\200\200\2059;I\252\252\254\334\355=\377\336\3578\242"
+ "\336\3578\1\335\361:\202\345\361\223\202\217\217\222\5\243\242\244\265\265"
+ "\265\302\302\304\323\323\324\335\335\335\202\345\345\351\11\351\351\351\361"
+ "\361\365\371\371\375\375\375\375\371\371\371\355\351\355\343\342\345\351"
+ "\351\355\361\361\365\202\355\355\361\4\361\361\365\345\345\351\325\325\335"
+ "\355\355\361\204\375\375\375\12\355\355\361\313\313\323\315\315\331\341\341"
+ "\351\355\351\361\351\351\355\333\333\341\305\304\321\313\313\323\365\365"
+ "\371\205\375\375\375\11\333\333\341\263\265\303\305\304\321\335\335\345\341"
+ "\341\351\325\325\341\303\303\313\305\304\321\361\361\365\204\375\375\375"
+ "\6\375\375\371\375\375\375\361\361\365\325\325\335\322\314\324\341\341\351"
+ "\202\355\355\361\34\345\345\351\335\335\345\351\351\355\371\371\375\375\375"
+ "\375\371\371\375\361\361\365\335\335\335\243\242\244IUW\21\20\27\16\20\16"
+ "\5\10\15-,-&*4\216\225{\263\264\244\246\253\221\263\264\244\252\252\254\226"
+ "\231\212rqyTY_iku\200\200\205\251\300X\320\350R\355\371e\202\325\347`\203"
+ "\320\350R\203\302\335M\2\277\334=\302\335M\204\271\326B\14\257\3232\263\315"
+ "A\275\275\276\335\335\335\361\361\361\355\351\355\333\333\341\325\325\335"
+ "\323\323\331\313\313\323\315\315\331\351\351\355\202\375\375\375\14\345\345"
+ "\355\313\313\323\305\304\321\303\303\313\323\323\331\361\361\365\375\375"
+ "\375\371\371\375\345\345\355\332\325\341\335\335\345\355\355\365\202\375"
+ "\375\375\11\335\335\345\275\275\312\303\303\313\313\313\323\305\304\321\303"
+ "\303\313\335\335\345\365\365\371\371\371\375\203\375\375\375\20\365\365\371"
+ "\355\351\361\325\325\335\312\305\321\314\314\315\311\311\311\264\264\272"
+ "\235\234\237\227\227\232\201\221\33\222\247#\261\305&\301\325.\307\3330\324"
+ "\3452\325\3507\222\336\3578\4\302\312\225\21\20\27\313\315\253\335\3556\207"
+ "\336\3578\5\335\3556\336\3578z{|TY_\302\312\225\377\336\3578\242\336\357"
+ "8\12\341\372P\345\361\223\324\343\223\200\200\205\217\217\222\244\244\252"
+ "\265\265\265\311\311\311\323\323\324\341\341\341\202\345\345\351\12\355\355"
+ "\361\365\365\371\375\375\371\375\375\375\371\371\371\351\351\355\341\341"
+ "\351\355\355\361\361\361\365\355\355\361\202\361\361\365\3\335\335\345\333"
+ "\333\341\365\365\371\204\376\376\376\11\345\345\351\313\313\323\325\325\335"
+ "\345\345\355\355\355\361\345\345\355\323\323\331\303\303\313\335\335\345"
+ "\203\376\376\376\6\375\375\375\376\376\376\371\371\371\312\305\321\273\273"
+ "\304\315\315\331\202\335\335\345\3\313\313\323\273\273\304\335\335\345\202"
+ "\376\376\376\203\375\375\375\30\376\376\376\375\375\375\343\342\345\313\313"
+ "\323\333\333\341\351\351\361\355\355\361\345\345\351\343\342\345\355\355"
+ "\361\371\371\375\375\375\375\371\371\371\331\331\335\217\217\222-,-\0\0\0"
+ "\3\3\3:::\217\217\222\206\207\212ikuTY_\310\325t\202\370\372\201\12\355\371"
+ "e\340\351v\324\343\223\271\271\272\265\265\265\252\252\254\227\227\232\233"
+ "\233\250\217\217\222\251\300X\202\341\372P\1\320\350R\206\302\335M\204\271"
+ "\326B\11\263\315A\271\326B\263\315A\275\275\276\341\341\341\365\365\365\371"
+ "\375\375\355\351\355\331\331\335\202\323\323\331\7\313\313\323\325\325\341"
+ "\365\365\371\376\376\376\365\365\371\331\331\335\313\313\323\202\305\304"
+ "\321\23\335\335\345\371\371\375\376\376\376\365\365\371\341\341\351\333\333"
+ "\341\345\345\355\371\371\375\376\376\376\361\361\365\305\304\321\275\275"
+ "\312\323\323\331\315\315\331\303\303\313\315\315\331\355\355\365\371\371"
+ "\375\375\375\375\202\376\376\376\20\365\365\371\355\355\365\333\333\341\311"
+ "\311\311\303\303\313\311\311\311\271\271\272\243\242\244\217\217\222\201"
+ "\221\33\235\262\"\261\305&\301\325.\307\3330\324\3452\325\3507\221\336\357"
+ "8\4\325\347`iku\235\234\237\335\3556\212\336\3578\4\334\355=rqy\200\200\205"
+ "\320\350R\337\336\3578\206\334\3567\273\336\3578\12\355\371e\345\361\223"
+ "\302\312\225\206\207\212\227\227\232\252\252\254\271\271\272\314\314\315"
+ "\331\331\331\341\341\341\202\345\345\351\17\355\355\361\375\375\371\371\371"
+ "\375\375\375\375\371\371\371\351\351\355\345\345\355\365\365\371\365\361"
+ "\371\355\355\361\361\361\365\355\355\361\333\333\341\341\341\351\371\371"
+ "\375\203\376\376\376\12\375\375\375\335\335\345\313\313\323\333\333\341\351"
+ "\351\361\355\355\361\341\341\351\313\313\323\305\304\321\355\355\361\203"
+ "\376\376\376\14\375\375\375\376\376\376\351\351\361\275\275\312\303\303\313"
+ "\325\325\335\335\335\345\325\325\341\275\275\312\303\303\313\355\355\365"
+ "\376\376\376\204\375\375\375\2\376\376\376\365\361\371\202\323\323\331\12"
+ "\345\341\351\355\355\361\345\345\355\335\335\345\345\345\351\371\371\371"
+ "\375\375\375\351\351\355\217\217\222\"#$\202\0\0\0\10fgf\302\302\304\311"
+ "\311\311\252\252\254\227\227\232\235\234\237\252\252\254\310\325t\204\370"
+ "\372\201\202\355\371e\13\340\351v\313\315\253\275\275\276\271\271\272\264"
+ "\264\272\251\244\260\216\225{\302\335M\341\372P\302\335M\320\350R\203\302"
+ "\335M\206\271\326B\202\263\315A\16\275\275\276\335\331\335\365\365\365\376"
+ "\376\376\371\371\375\345\345\351\325\325\335\323\323\331\313\313\323\315"
+ "\315\331\345\345\355\375\375\375\376\376\376\345\345\355\202\313\313\323"
+ "\17\305\304\321\313\313\323\355\355\365\376\376\376\375\375\375\351\351\361"
+ "\333\333\341\341\341\351\365\365\371\376\376\376\371\371\375\323\323\331"
+ "\275\275\312\315\315\331\323\323\331\202\305\304\321\3\345\345\355\371\371"
+ "\375\375\375\375\202\376\376\376\15\371\371\375\361\361\361\335\335\345\312"
+ "\305\321\303\303\313\311\311\311\273\273\304\244\244\252\217\217\222\201"
+ "\221\33\222\247#\263\315A\301\325.\202\324\3452\1\331\3516\221\336\3578\3"
+ "\313\315\253&*4\340\351v\213\336\3578\4\334\355=\310\325tTY_\262\270\222"
+ "\333\336\3578\1\334\3567\202\331\3556\207\331\3516\202\334\3567\270\336\357"
+ "8\17\334\3567\355\371e\345\361\223\262\270\222\206\207\212\227\227\232\252"
+ "\252\254\275\275\276\314\314\315\331\331\335\343\342\345\351\351\351\355"
+ "\351\355\361\361\365\371\371\375\202\375\375\375\4\365\365\371\345\345\355"
+ "\351\351\355\365\365\371\202\361\361\365\4\365\365\371\351\351\355\333\333"
+ "\341\355\355\361\204\376\376\376\12\365\365\371\325\325\335\313\313\323\341"
+ "\341\351\355\355\361\351\351\361\333\333\341\303\303\313\315\315\331\371"
+ "\371\371\202\376\376\376\1\375\375\375\202\376\376\376\12\333\333\341\273"
+ "\273\304\305\304\321\331\331\335\333\333\341\313\313\323\263\265\303\325"
+ "\325\341\375\375\375\376\376\376\203\375\375\375\5\376\376\376\375\375\375"
+ "\341\341\351\313\313\323\333\333\341\202\351\351\355\202\343\342\345\4\365"
+ "\365\365\365\365\371\271\271\272:::\202\0\0\0\4:::\302\302\304\335\335\335"
+ "\311\311\311\202\261\261\264\4\271\271\272\265\265\265\243\242\244z{|\202"
+ "TY_\3z\214^\226\244b\310\325t\202\355\371e\2\325\347`\345\361\223\202\311"
+ "\311\311\5\275\275\276\261\261\264\206\207\212\251\300X\341\372P\205\302"
+ "\335M\206\271\326B\4\263\315A\275\275\276\331\331\335\361\361\365\202\376"
+ "\376\376\12\365\365\371\335\335\345\323\323\331\315\315\331\313\313\323\323"
+ "\323\331\361\361\365\376\376\376\365\365\371\331\331\335\202\313\313\323"
+ "\10\303\303\313\333\333\341\375\375\375\376\376\376\365\365\371\335\335\345"
+ "\333\333\341\355\355\361\202\375\375\375\11\341\341\351\303\303\313\313\313"
+ "\323\333\333\341\315\315\331\303\303\313\333\333\341\365\365\371\371\371"
+ "\375\202\375\375\375\14\371\371\375\361\361\365\345\345\351\313\313\323\303"
+ "\303\313\311\311\311\302\302\304\244\244\252\217\217\222\201\221\33\235\262"
+ "\"\261\305&\202\307\3330\2\324\3452\331\3516\221\336\3578\202sz\205\2\334"
+ "\355=\334\3567\205\336\3578\12\320\350R\264\277q\241\252v\302\312\225\334"
+ "\355=\334\3567\334\355=sz\205\206\207\212\334\355=\325\336\3578\203\334\356"
+ "7\1\331\3556\202\331\3516\202\325\3507\5\320\350R\310\325t\246\253\221\251"
+ "\300X\324\3452\203\325\3507\202\331\3556\1\334\3567\266\336\3578\16\331\355"
+ "6\370\372\201\345\361\223\237\243\221\217\217\222\235\234\237\254\254\262"
+ "\302\302\304\323\323\324\335\331\335\343\342\345\345\345\351\355\355\355"
+ "\365\365\371\203\375\375\375\5\365\365\371\351\351\355\355\355\361\365\365"
+ "\371\365\365\365\202\365\361\371\3\345\345\351\335\335\345\361\361\365\204"
+ "\376\376\376\11\355\355\361\315\315\331\323\323\331\345\345\355\355\355\365"
+ "\351\351\355\321\320\336\303\303\313\335\335\345\203\376\376\376\10\375\375"
+ "\375\376\376\376\371\371\375\313\313\323\273\273\304\315\315\331\333\333"
+ "\341\323\323\331\202\275\275\312\2\355\355\361\376\376\376\204\375\375\375"
+ "\2\376\376\376\365\365\371\202\323\323\331\10\341\341\351\345\345\355\343"
+ "\342\345\335\335\345\355\355\361\345\345\351rqy\5\10\15\202\0\0\0\36\200"
+ "\200\205\331\331\331\311\311\311\265\265\265\275\275\276\271\271\272\206"
+ "\207\212DEJ\31\34\32:::z{|\206\207\212z{|TY__`l\206\207\212\216\225{\325"
+ "\347`\355\371e\320\350R\340\351v\327\330\306\323\323\324\314\314\315\261"
+ "\261\264z{|\264\277q\341\372P\277\334=\302\335M\210\271\326B\5\246\277?\271"
+ "\271\272\335\331\335\355\355\361\375\375\375\202\376\376\376\3\355\355\361"
+ "\331\331\335\315\315\331\202\313\313\323\1\345\341\351\202\375\375\375\1"
+ "\345\345\355\202\315\315\331\13\313\313\323\315\315\331\361\361\365\376\376"
+ "\376\375\375\375\351\351\361\333\333\341\345\341\351\371\371\375\376\376"
+ "\376\355\355\365\202\305\304\321\6\333\333\341\331\331\335\305\304\321\315"
+ "\315\331\361\361\365\371\371\375\203\375\375\375\14\365\365\371\351\351\355"
+ "\315\315\331\275\275\312\303\303\313\302\302\304\254\254\262\217\217\222"
+ "\201\221\33\241\272*\261\305&\307\3330\202\324\3452\1\331\3516\220\334\356"
+ "7\4\320\350Riku\237\243\221\334\355=\202\334\3567\3\320\350R\264\277q\227"
+ "\227\232\202\233\233\250\11rqy9;I\243\245\264\302\335M\334\355=\335\3556"
+ "\226\231\212rqy\325\347`\322\334\3567\203\331\3556\1\331\3516\202\325\350"
+ "7\202\324\3452\11\302\335M\264\277q\216\225{sz\205_mpx\205\210Teg\277\334"
+ "=\307\3330\203\324\3452\2\331\3516\331\3556\267\334\3567\202\345\361\223"
+ "\202\217\217\222\11\235\234\237\261\261\264\302\302\304\323\323\324\335\335"
+ "\335\345\345\351\351\351\355\355\355\361\371\371\371\203\375\375\375\3\361"
+ "\361\365\351\351\355\361\361\365\203\365\365\371\1\361\361\365\202\341\341"
+ "\351\1\371\371\375\204\376\376\376\11\351\351\355\315\315\331\325\325\335"
+ "\351\351\361\355\355\361\345\345\351\313\313\323\303\303\313\355\355\361"
+ "\203\376\376\376\3\375\375\375\376\376\376\355\355\361\202\275\275\312\7"
+ "\315\315\331\325\325\341\313\313\323\273\273\304\323\323\331\371\371\371"
+ "\376\376\376\203\375\375\375\202\376\376\376\11\345\345\355\313\313\323\331"
+ "\331\335\345\345\351\345\341\351\333\333\341\343\342\345\311\311\311:::\203"
+ "\0\0\0\3\227\227\232\335\335\335\271\271\272\202\275\275\276\11z{|\31\34"
+ "\32\0\0\0\5\10\15iku_`l\216\225{\271\271\272\275\275\276\202\311\301\310"
+ "\10\265\265\265\264\264\272\206\207\212\264\277q\355\371e\320\350R\325\347"
+ "`\327\330\306\202\331\331\331\6\254\254\262TY_\264\277q\341\372P\271\326"
+ "B\302\335M\205\271\326B\32\263\315A\277\334=\246\277?\275\275\276\335\335"
+ "\335\355\355\361\371\371\375\375\375\375\376\376\376\371\371\375\345\345"
+ "\351\323\323\331\313\313\323\312\305\321\325\325\335\365\365\371\376\376"
+ "\376\365\365\371\325\325\335\323\323\331\315\315\331\305\304\321\341\341"
+ "\351\375\375\375\376\376\376\361\361\365\202\335\335\345\31\365\365\371\376"
+ "\376\376\371\371\371\323\323\331\303\303\313\333\333\341\341\341\351\315"
+ "\315\331\303\303\313\345\345\355\371\371\375\375\375\375\376\376\376\375"
+ "\375\375\365\365\371\355\355\361\323\323\331\273\273\304\303\303\313\302"
+ "\302\304\261\261\264\217\217\222\201\221\33\241\272*\301\325.\202\307\333"
+ "0\2\324\3452\334\355=\217\334\3567\26\335\3556\325\347`TY_\237\243\221\335"
+ "\3556\334\3567\320\350R\213\222\233DEJTY_\243\245\264\222\230\242\213\222"
+ "\2339;I\222\230\242\302\312\225\335\3556\334\3567\264\277qrqy\320\350R\335"
+ "\3556\316\334\3567\202\331\3556\202\331\3516\202\325\3507\5\324\3452\277"
+ "\334=\251\300X\226\244b\216\225{\202ix{\7iku<QN\222\230\242Tegz{|\205\234"
+ "G\301\325.\202\307\3330\4\324\3452\325\3507\331\3516\331\3556\265\334\356"
+ "7\1\334\355=\202\345\361\223\13\206\207\212\217\217\222\243\242\244\265\265"
+ "\265\311\311\311\323\323\324\341\341\341\345\345\351\351\351\355\361\361"
+ "\365\371\371\371\203\375\375\375\3\361\361\365\351\351\355\365\361\371\203"
+ "\365\365\371\4\361\361\365\335\335\345\345\345\355\375\375\375\203\376\376"
+ "\376\4\375\375\375\341\341\351\315\315\331\333\333\341\202\355\355\361\4"
+ "\335\335\345\305\304\321\315\315\331\365\365\371\202\376\376\376\1\375\375"
+ "\375\202\376\376\376\3\343\342\345\273\273\304\303\303\313\202\323\323\331"
+ "\3\303\303\313\273\273\304\345\341\351\202\376\376\376\203\375\375\375\6"
+ "\376\376\376\371\371\371\331\331\335\315\315\331\335\335\345\345\345\351"
+ "\202\335\335\345\6\243\242\244\21\20\27\3\3\3\0\0\0\5\10\15fgf\202\265\265"
+ "\265\3\302\302\304\244\244\252-,-\202\0\0\0\32z{|\323\323\324\261\261\264"
+ "z{|\251\300X\355\371e\345\361\223\327\330\306\323\323\331\323\323\324\314"
+ "\314\315\261\261\264TY_\241\252v\355\371e\320\350R\325\347`\275\275\276\331"
+ "\331\331\335\331\335\254\254\262IUW\264\277q\323\365?\271\326B\302\335M\206"
+ "\271\326B\4\246\277?\275\275\276\335\335\335\361\361\361\202\371\371\375"
+ "\202\376\376\376\2\365\365\371\333\333\341\203\313\313\323\16\355\355\361"
+ "\376\376\376\371\371\375\335\335\345\323\323\331\325\325\341\313\313\323"
+ "\325\325\335\365\365\371\376\376\376\371\371\375\341\341\351\335\335\345"
+ "\355\355\365\202\375\375\375\7\335\335\345\303\303\313\331\331\335\345\345"
+ "\355\325\325\335\303\303\313\335\335\345\202\371\371\375\6\376\376\376\375"
+ "\375\375\371\371\371\355\355\361\331\331\335\275\275\312\202\302\302\304"
+ "\10\261\261\264\227\227\232\201\221\33\235\262\"\261\305&\307\3330\315\341"
+ ".\324\3452\221\331\3556\3\334\355=rqy\216\225{\202\331\3556\5\331\3516\233"
+ "\233\250TY_9;I\263\265\303\202\233\233\250\3""9;Isz\205\263\264\244\202\331"
+ "\3556\3\217\217\222iku\320\350R\314\331\3556\1\325\3552\202\325\3512\202"
+ "\324\3452\15\315\341.\277\334=\246\277?\226\244b\216\225{ix{_mpx\205\210"
+ "ix{Teg\203\212\224Teg\213\222\233\202_mp\4\222\230\242fgf\263\315A\301\325"
+ ".\202\307\3330\202\324\3452\1\325\3552\264\331\3556\17\331\3552\341\372P"
+ "\345\361\223\324\343\223\200\200\205\227\227\232\243\242\244\264\264\272"
+ "\311\311\311\323\323\331\341\341\341\345\345\351\355\351\355\361\361\361"
+ "\371\371\375\202\375\375\375\3\371\371\375\361\361\365\355\355\361\203\365"
+ "\365\371\4\365\365\375\355\355\361\343\342\345\355\355\361\204\376\376\376"
+ "\12\371\371\371\333\333\341\315\315\331\341\341\351\355\355\365\355\351\361"
+ "\331\331\335\303\303\313\333\333\341\375\375\375\202\376\376\376\14\375\375"
+ "\375\376\376\376\371\371\375\321\320\336\273\273\304\305\304\321\321\320"
+ "\336\315\315\331\273\273\304\305\304\321\365\365\371\376\376\376\204\375"
+ "\375\375\12\376\376\376\355\355\361\315\315\331\323\323\331\335\335\345\343"
+ "\342\345\333\333\341\343\342\345iku\3\3\3\202\0\0\0\202fgf\10\261\261\264"
+ "\311\311\311\217\217\222\16\20\16\0\0\0\31\34\32\235\234\237\331\331\331"
+ "\202\265\265\265\13\303\274\304\264\277q\370\372\201\325\347`\340\351v\323"
+ "\323\324\331\331\335\335\331\335\323\323\324\241\252v\310\325t\202\355\371"
+ "e\10m\204>z{|\323\323\324\341\341\341\342\333\342\264\277q\263\315A\302\335"
+ "M\205\271\326B\10\263\315A\271\326B\277\334=\246\277?\275\275\276\335\335"
+ "\335\361\361\361\371\371\371\202\371\371\375\36\376\376\376\375\375\375\351"
+ "\351\355\315\315\331\313\313\323\312\305\321\341\341\351\375\375\375\376"
+ "\376\376\351\351\361\321\320\336\333\333\341\325\325\335\313\313\323\355"
+ "\351\361\376\376\376\375\375\375\355\351\361\333\333\341\351\351\361\371"
+ "\371\375\376\376\376\351\351\361\303\303\313\325\325\335\351\351\361\341"
+ "\341\351\312\305\321\315\315\331\361\361\371\203\375\375\375\13\371\371\371"
+ "\361\361\365\335\335\345\302\302\304\273\273\304\302\302\304\265\265\265"
+ "\227\227\232\201\221\33\241\272*\301\325.\202\307\3330\1\324\3452\222\331"
+ "\3552\3sz\205\200\200\205\334\355=\202\331\3552\4\251\244\260_`l9;I\243\245"
+ "\264\202\222\230\242\10TY__`l\254\254\262\331\3556\334\355=\217\217\222s"
+ "z\205\334\355=\307\331\3552\202\325\3552\202\325\3512\203\324\3452\26\304"
+ "\3428\263\315A\226\244bz\214^z{|ix{Tegx\205\210_mpsz\205x\205\210_mp\203"
+ "\212\224TY_\203\212\224x\205\210TY_\213\222\233Teg\206\207\212z\214^\261"
+ "\305&\202\301\325.\4\307\3330\324\3452\325\3512\325\3552\263\331\3552\17"
+ "\331\3516\341\372P\345\361\223\302\312\225\206\207\212\227\227\232\244\244"
+ "\252\271\271\272\311\311\311\331\331\331\341\341\341\345\345\351\355\355"
+ "\355\361\361\365\371\371\375\202\375\375\375\12\371\371\375\355\355\365\355"
+ "\355\361\365\365\371\371\371\375\365\365\375\365\365\371\351\351\361\341"
+ "\341\351\365\365\371\204\376\376\376\11\365\365\371\331\331\335\323\323\331"
+ "\345\345\351\355\355\365\351\351\361\323\323\331\305\304\321\351\351\355"
+ "\203\376\376\376\12\375\375\375\376\376\376\361\361\365\305\304\321\263\265"
+ "\303\313\313\323\315\315\331\312\305\321\273\273\304\325\325\335\202\376"
+ "\376\376\203\375\375\375\13\376\376\376\375\375\375\341\341\351\313\313\323"
+ "\325\325\341\335\335\345\333\333\341\335\335\345\361\361\361\252\252\254"
+ "IUW\202\0\0\0$\"*,\252\252\254\275\275\276\331\331\331z{|\"#$\0\0\0-,-\254"
+ "\254\262\252\252\254\275\275\276\323\323\324\335\331\331\264\277q\370\372"
+ "\201\340\351v\325\347`\324\343\223\323\323\324\335\331\331\324\343\223\355"
+ "\371e\341\372P\355\371em\204>:::\252\252\254\323\323\324\343\342\345\324"
+ "\343\223\320\350R\277\334=\302\335M\277\334=\271\326B\263\315A\205\271\326"
+ "B%\246\277?\275\275\276\335\335\335\361\361\361\371\371\375\371\371\371\371"
+ "\371\375\375\375\375\376\376\376\365\365\371\331\331\335\313\313\323\305"
+ "\304\321\325\325\335\365\365\371\376\376\376\365\361\371\325\325\341\333"
+ "\333\341\335\335\345\313\313\323\335\335\345\371\371\375\376\376\376\365"
+ "\361\371\335\335\345\345\341\351\371\371\375\376\376\376\361\361\365\312"
+ "\305\321\315\315\331\355\355\361\351\351\361\315\315\331\312\305\321\351"
+ "\351\355\203\375\375\375\13\371\371\371\361\361\365\343\342\345\302\302\304"
+ "\273\273\304\302\302\304\271\271\272\235\234\237\201\234$\235\262\"\261\305"
+ "&\202\307\3330\1\324\3452\222\325\3552\23\246\253\221TY_\310\325t\325\351"
+ "2\325\3552\302\312\225sz\2059;I\203\212\224\333\334\352\321\320\33601?ik"
+ "u\325\347`\325\3512\325\347`IUW\237\243\221\331\3516\303\325\3552\204\325"
+ "\3512\202\324\3452\34\315\345.\311\342/\271\326B\251\300X\226\244bix{\203"
+ "\212\224_mp_`l\213\222\233Teg\213\222\233Tegsz\205\213\222\233<QN\222\230"
+ "\242_mpix{x\205\210IUW\213\222\233_mpiku\203\212\224_mp\246\277?\261\305"
+ "&\202\301\325.\2\315\341.\315\345.\202\325\3512\263\325\3552\32\325\347`"
+ "\345\361\223\302\312\225\206\207\212\227\227\232\252\252\254\271\271\272"
+ "\314\314\315\331\331\331\341\341\341\345\345\351\355\355\361\365\365\371"
+ "\371\371\375\375\375\371\375\375\375\371\371\375\361\361\365\355\355\365"
+ "\371\371\371\371\371\375\371\371\371\365\365\371\351\351\355\345\345\351"
+ "\371\371\371\204\376\376\376\1\365\365\371\202\325\325\335\6\351\351\355"
+ "\355\355\365\345\345\355\315\315\331\313\313\323\361\361\365\203\376\376"
+ "\376\13\375\375\375\376\376\376\355\355\361\275\275\312\273\273\304\313\313"
+ "\323\315\315\331\275\275\312\273\273\304\345\345\355\376\376\376\204\375"
+ "\375\375\14\376\376\376\371\371\371\325\325\335\315\315\331\331\331\335\335"
+ "\335\345\333\333\341\345\345\351\371\371\371\351\351\351rqy\31\34\32\202"
+ "\0\0\0\12\200\200\205\302\302\304\335\335\335\254\254\262fgf\0\0\0\3\3\3"
+ "\200\200\205\265\265\265\323\323\324\202\351\351\351\20\264\277q\355\371"
+ "e\325\347`\340\351v\320\350R\324\343\223\340\351v\325\347`\355\371e\341\372"
+ "Pm\204>\"#$\217\217\222\275\275\276\323\323\324\345\361\223\202\271\326B"
+ "\3\320\350R\304\3428\263\315A\202\304\3428\204\263\315A\5\271\326B\246\277"
+ "?\275\275\276\335\335\335\361\361\361\204\371\371\375\26\376\376\376\375"
+ "\375\375\345\345\355\315\315\331\312\305\321\315\315\331\355\355\361\376"
+ "\376\376\371\371\375\335\335\345\333\333\341\341\341\351\321\320\336\325"
+ "\325\335\365\365\371\376\376\376\371\371\375\345\341\351\341\341\351\365"
+ "\365\371\376\376\376\365\365\371\202\315\315\331\5\355\351\361\355\355\365"
+ "\325\325\335\305\304\321\341\341\351\202\375\375\375\17\371\371\375\371\371"
+ "\371\361\361\365\345\345\351\303\303\313\273\265\277\302\302\304\264\264"
+ "\272\243\242\244\201\221\33\241\272*\301\325.\307\3330\311\342/\324\3452"
+ "\222\325\3552\23\310\325t9;I\263\264\244\325\3507\325\3552\325\347`\217\217"
+ "\22201?sz\205DEJ\33#,\345\345\371\273\265\277\325\3507\325\3552\226\231\212"
+ "01?\325\347`\325\3507\277\325\3552\1\325\3512\204\321\3512\202\315\345.\36"
+ "\311\342/\277\334=\251\300X\226\244b\216\225{_mp\203\212\224_mp_`l\203\212"
+ "\224Teg\222\230\242IUWsz\205\203\212\224IUW\213\222\233Tegx\205\210ix{Te"
+ "g\222\230\242Tegx\205\210sz\205ix{\222\230\242<QN\206\207\212z\214^\202\261"
+ "\305&\3\301\325.\307\3330\315\341.\202\321\3512\263\325\3552\21\355\371e"
+ "\345\361\223\262\270\222\206\207\212\235\234\237\252\252\254\271\271\272"
+ "\314\314\315\331\331\331\335\335\345\351\351\351\355\355\361\365\365\371"
+ "\371\371\375\375\375\375\376\376\376\371\371\375\202\361\361\365\7\371\371"
+ "\375\371\371\371\371\371\375\365\365\371\345\345\355\351\351\361\371\371"
+ "\375\204\376\376\376\11\361\361\365\325\325\335\331\331\335\355\351\361\361"
+ "\361\365\345\345\355\313\313\323\325\325\335\371\371\375\203\376\376\376"
+ "\5\375\375\375\376\376\376\345\345\355\273\273\304\275\275\312\202\313\313"
+ "\323\4\273\273\304\303\303\313\365\365\365\376\376\376\204\375\375\375\4"
+ "\376\376\376\361\361\365\315\315\331\323\323\331\203\333\333\341\5\355\355"
+ "\361\375\375\375\365\365\365\235\234\237rqy\202\0\0\0\16\31\34\32\271\271"
+ "\272\323\323\324\323\323\331rqyIUW\0\0\0\21\20\27\252\252\254\331\331\331"
+ "\355\355\355\351\351\355\264\277q\355\371e\203\325\347`\24\320\350R\325\347"
+ "`\355\371e\271\334#m\204>01?\217\217\222\275\275\276\327\330\306\340\351"
+ "v\263\315A\302\335M\341\372P\257\3232UlF\200\200\205\216\225{\257\3232\305"
+ "\355.\277\334=\202\263\315A\5\271\326B\241\272*\275\275\276\335\335\335\361"
+ "\361\361\202\371\371\375\6\371\371\371\371\371\375\375\375\375\376\376\376"
+ "\361\361\365\325\325\335\202\313\313\323\1\345\345\351\202\375\375\375\""
+ "\345\345\351\333\333\341\345\345\355\335\335\345\315\315\331\351\351\361"
+ "\376\376\376\371\371\375\355\355\361\341\341\351\361\361\365\376\376\376"
+ "\375\375\375\325\325\341\313\313\323\351\351\361\365\365\371\341\341\351"
+ "\303\303\313\331\331\335\371\371\375\376\376\376\371\371\375\371\371\371"
+ "\361\361\365\351\351\355\311\311\311\264\264\272\302\302\304\271\271\272"
+ "\243\242\244\201\221\33\235\262\"\265\321&\202\307\3330\1\315\345.\222\321"
+ "\351.\22\325\3507\241\252v9;I\262\270\222\325\3507\321\3512\325\3512\313"
+ "\315\253\305\305\33101?\5\10\15\333\334\352\257\255\267\334\355=\216\225"
+ "{\16\20\16\235\234\237\321\3512\277\321\351.\1\321\345.\203\315\345.\11\307"
+ "\3330\301\325.\225\257:\205\234Gz\214^z{|Tegx\205\210Teg\202sz\205\30Teg"
+ "\222\230\242IUW\213\222\233_mpTeg\203\212\224IUW\222\230\242IUWTeg\231\243"
+ "\251iku\213\222\233Tegz{|\222\230\242IUWsz\205_mp\203\212\224sz\205Teg\225"
+ "\257:\202\261\305&\3\301\325.\307\3330\315\341.\264\321\351.\16\340\351v"
+ "\345\361\223\237\243\221\217\217\222\235\234\237\252\252\254\275\275\276"
+ "\314\314\315\331\331\331\341\341\341\351\351\355\355\355\361\365\365\371"
+ "\371\371\375\202\375\375\375\1\371\371\371\202\361\361\365\1\371\363\372"
+ "\202\371\371\375\3\365\365\371\345\345\355\355\355\361\203\375\375\375\202"
+ "\376\376\376\3\355\355\365\325\325\335\333\333\341\202\355\355\365\3\335"
+ "\335\345\313\313\323\335\335\345\205\376\376\376\12\375\375\375\335\335\345"
+ "\263\265\303\303\303\313\313\313\323\305\304\321\273\273\304\315\315\331"
+ "\371\371\371\376\376\376\205\375\375\375\14\351\351\355\313\313\323\323\323"
+ "\331\333\333\341\325\325\335\335\335\345\365\365\371\376\376\376\371\371"
+ "\371\351\351\351z{|TY_\202\0\0\0\15TY_\311\311\311\323\323\324\261\261\264"
+ "\200\200\205\"#$\0\0\0DEJ\311\311\311\335\335\335\343\342\345\264\277q\355"
+ "\371e\203\325\347`\17\355\371e\323\365?}\243\25z{|iku\252\252\254\275\275"
+ "\276\350\350\304\310\325t\257\3232\320\350R\323\365?\201\234$DEJIUW\202\235"
+ "\234\237\22\206\207\212\226\244b\257\3232\275\341&\250\3051\271\326B\225"
+ "\257:\275\275\276\335\335\335\361\361\361\371\371\375\375\375\375\371\371"
+ "\375\371\371\371\371\371\375\376\376\376\371\371\371\343\342\345\202\313"
+ "\313\323\5\335\335\345\371\371\375\376\376\376\351\351\361\335\335\345\202"
+ "\345\345\355\2\321\320\336\343\342\345\202\375\375\375\32\361\361\365\341"
+ "\341\351\355\355\365\375\375\375\376\376\376\335\335\345\312\305\321\351"
+ "\351\361\371\371\375\351\351\361\313\313\323\315\315\331\365\365\371\376"
+ "\376\376\371\371\375\371\371\371\365\365\365\351\351\361\313\313\323\264"
+ "\264\272\275\275\276\271\271\272\243\242\244\201\221\33\241\272*\301\325"
+ ".\202\307\3330\1\315\345.\223\321\351.\13\320\350Rz{|&*4\271\271\272\320"
+ "\350R\321\3512\310\325t\263\265\303rqy\3\3\3\305\305\331\202\222\230\242"
+ "\3\21\20\27sz\205\320\350R\236\321\351.\1\315\351.\207\315\345.\2\321\351"
+ ".\315\351.\222\321\351.\3\315\351.\321\351.\315\351.\202\315\345.\202\311"
+ "\342/\17\304\3428\263\315A\251\300Xz\214^x\205\210sz\205_mp\222\230\242T"
+ "Y_x\205\210ix{_mp\213\222\233<QN\213\222\233\202_mp\34x\205\2103HE\231\243"
+ "\251IUWix{\213\222\233sz\205\203\212\224<QNIUW\16""4$\6)\30\252\261\276<"
+ "QN\203\212\224ix{TY_\231\243\251IUW\217\217\222z\214^\241\272*\261\305&\265"
+ "\321&\276\334,\311\342/\315\345.\315\351.\262\321\351.\15\340\351v\345\361"
+ "\223\237\243\221\217\217\222\235\234\237\252\252\254\275\275\276\314\314"
+ "\315\323\323\331\341\341\341\351\351\355\361\361\361\365\365\371\202\371"
+ "\371\375\2\375\375\375\365\365\371\202\361\361\365\6\365\365\371\371\371"
+ "\371\371\371\375\361\361\365\351\351\355\361\361\365\202\375\375\375\6\371"
+ "\371\375\375\375\375\376\376\376\355\355\361\325\325\335\335\335\345\202"
+ "\355\355\365\3\335\335\345\313\313\323\345\341\351\203\376\376\376\203\375"
+ "\375\375\7\325\325\341\263\265\303\303\303\313\315\315\331\303\303\313\263"
+ "\265\303\331\331\335\207\375\375\375\33\343\342\345\313\313\323\323\323\331"
+ "\331\331\335\325\325\335\345\345\351\375\375\375\376\376\376\375\375\375"
+ "\361\361\365\311\311\311z{|103\0\0\0\3\3\3\200\200\205\311\311\311\322\314"
+ "\324\226\231\212\200\200\205-,-\0\0\0-,-\273\265\277\323\323\324\264\277"
+ "q\355\371e\202\341\372P\10\305\355.\222\247#z\214^\254\254\262\261\261\264"
+ "\254\254\262\275\275\276\345\361\223\202\271\326B\22\341\372P\265\321&]y"
+ "\30fgfz{|\265\265\265\275\275\276\302\302\304\251\244\260\213\222\233sz\205"
+ "\241\252v\277\334=\257\3232\225\257:\271\271\272\335\335\335\361\361\361"
+ "\202\371\371\375\3\375\375\375\371\371\375\371\371\371\202\375\375\375\10"
+ "\351\351\361\323\323\331\312\305\321\331\331\335\365\365\371\376\376\376"
+ "\361\361\371\335\335\345\202\351\351\361!\325\325\341\333\333\341\371\371"
+ "\375\376\376\376\365\365\371\345\345\355\355\355\365\375\375\375\376\376"
+ "\376\345\345\351\312\305\321\345\345\355\371\371\375\361\361\365\315\315"
+ "\331\313\313\323\361\361\365\376\376\376\371\371\375\371\371\371\365\365"
+ "\365\355\355\361\313\313\323\264\264\272\273\273\304\271\271\272\243\242"
+ "\244\201\221\33\241\272*\265\321&\301\325.\306\340*\315\345*\223\315\351"
+ ".\21\315\345*\320\350R\226\231\212\31\34\32DEJ\216\225{\264\277q\252\261"
+ "\276\243\245\264\0\0\0\243\245\264\263\265\30301?\203\212\224\277\334=\321"
+ "\345.\315\345*\233\315\351.\202\315\345*\3\325\347`\320\350R\307\3330\206"
+ "\306\340*\4\311\345*\315\341.\315\345*\315\345.\214\315\351.\1\315\345.\202"
+ "\315\345*\11\311\345*\311\342/\306\340*\307\3330\271\326B\251\300X\226\244"
+ "bix{x\205\210\202_mp\11\222\230\242TY_\213\222\233_mpix{\213\222\233<QN\222"
+ "\230\242Teg\202ix{\11""3HE\231\243\251IUW\203\212\224x\205\210sz\205x\205"
+ "\210/7>,??\203\16""4$\17\30:,\2\24\12\203\212\224_mp\213\222\233TY_\231\243"
+ "\251TY_x\205\210\203\212\224Teg\225\257:\241\272*\261\305&\301\325.\202\306"
+ "\340*\1\315\345*\262\315\351.\15\340\351v\345\361\223\226\231\212\217\217"
+ "\222\235\234\237\252\252\254\275\275\276\314\314\315\331\331\331\343\342"
+ "\345\351\351\355\361\361\361\365\365\371\203\371\371\375\27\365\365\371\361"
+ "\361\365\365\361\371\365\365\371\365\365\375\371\371\371\361\361\365\351"
+ "\351\355\365\365\371\376\376\376\371\371\375\365\365\375\371\371\375\375"
+ "\375\375\351\351\361\325\325\335\341\341\351\355\355\365\355\355\361\333"
+ "\333\341\313\313\323\351\351\361\376\376\376\203\375\375\375\12\376\376\376"
+ "\371\371\375\325\325\335\263\265\303\303\303\313\313\313\323\275\275\312"
+ "\273\273\304\341\341\351\376\376\376\204\375\375\375\4\376\376\376\371\371"
+ "\375\333\333\341\313\313\323\202\325\325\335\2\331\331\335\355\351\355\203"
+ "\376\376\376\27\371\371\371\355\355\361\254\254\262\206\207\212\31\34\32"
+ "\0\0\0\3\3\3\243\242\244\311\311\311\323\323\324\206\207\212fgfDEJ\0\0\0"
+ "\16\20\16iku\216\225{z\214^\226\244b\241\252v\243\242\244\263\265\303\311"
+ "\301\310\202\261\261\264\13\324\343\223\325\347`\271\326B\320\350R\305\345"
+ "*m\216\33fgf\206\207\212\227\227\232\265\265\265\314\314\315\202\335\335"
+ "\335\4\331\331\331\314\314\315\262\270\222\310\325t\202\257\3232\4\225\257"
+ ":\271\271\272\335\335\335\361\361\361\202\371\371\375\1\375\375\375\203\371"
+ "\371\375?\375\375\375\361\361\365\331\331\335\313\313\323\325\325\335\361"
+ "\361\365\376\376\376\365\365\371\341\341\351\345\345\355\355\355\365\335"
+ "\335\345\332\325\341\365\365\371\376\376\376\371\371\375\351\351\361\355"
+ "\351\361\371\371\375\376\376\376\351\351\355\313\313\323\341\341\351\371"
+ "\371\375\365\365\371\325\325\335\313\313\323\355\355\361\376\376\376\371"
+ "\371\375\371\371\371\365\365\365\355\355\361\313\313\323\264\264\272\275"
+ "\275\276\271\271\272\243\242\244\201\221\33\241\272*\265\321&\276\334,\307"
+ "\3330\311\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\202\315\345*'\325\3507\264\277"
+ "qrqy9;I\"#$\203\212\224\333\334\352\0\0\0sz\205\252\261\276\246\253\221\321"
+ "\345.\321\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315"
+ "\345*\315\351.\315\345*\315\351.\202\315\345*\202\311\345*\1\263\315A\202"
+ "\345\361\223\11\340\351vm\204>\205\234G\246\277?\301\325.\276\334,\301\325"
+ ".\306\340*\276\334,\203\306\340*\202\311\345*\202\315\345*\3\315\351.\315"
+ "\345*\315\351.\202\315\345*\202\311\345*\203\306\340*\6\271\326B\251\300"
+ "X\226\244b\216\225{Tegx\205\210\202_mp\17\206\207\212IUW\213\222\233IUWs"
+ "z\205x\205\2103HE\231\243\251Tegsz\205_mp<QN\243\245\264Teg\213\222\233\202"
+ "sz\205\4ix{\35""23\21*$\10\26\31\203\16""4$\203\30:,\202\16""4$A\275\275"
+ "\312IUW\203\212\224ix{IUW\222\230\242IUW\227\227\232z\214^\235\262\"\245"
+ "\304\37\265\321&\301\325.\276\334,\306\340*\311\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315"
+ "\351.\315\345*\315\351.\315\345*\315\351.\315\345*\315\351.\202\345\361\223"
+ "\202\217\217\222\12\243\242\244\252\252\254\275\275\276\314\314\315\323\323"
+ "\331\343\342\345\355\355\361\361\361\361\365\365\371\371\371\371\202\371"
+ "\371\375\12\365\365\371\361\361\365\365\361\371\365\365\371\365\365\375\365"
+ "\365\371\355\355\365\355\351\361\365\365\371\375\375\375\202\365\365\371"
+ "\13\371\371\375\375\375\375\351\351\355\325\325\335\341\341\351\361\361\365"
+ "\355\351\361\325\325\341\315\315\331\361\361\365\376\376\376\203\375\375"
+ "\375\12\376\376\376\371\371\375\315\315\331\273\273\304\305\304\321\312\305"
+ "\321\273\273\304\275\275\312\351\351\355\376\376\376\204\375\375\375\4\376"
+ "\376\376\371\371\375\325\325\335\315\315\331\202\325\325\335\2\335\335\345"
+ "\361\361\365\202\376\376\376\26\375\375\375\371\371\375\365\365\365\355\355"
+ "\355\235\234\237\200\200\205\"#$\0\0\0\5\10\15\227\227\232\314\314\315\323"
+ "\323\324\235\234\237\206\207\212\200\200\205-,-\21\20\27_`l\200\200\205\203"
+ "\212\224\261\261\264\313\315\253\202\263\264\244\33\324\343\223\325\347`"
+ "\271\326B\277\334=\275\341&}\243\25m\204>\237\243\221\252\252\254\265\265"
+ "\265\302\302\304\323\323\324\341\341\341\355\355\355\355\355\361\350\350"
+ "\304\340\351v\277\334=\245\304\37\250\3051\271\326B\225\257:\271\271\272"
+ "\335\335\335\361\361\361\371\371\371\371\371\375\202\375\375\375\202\371"
+ "\371\375\27\375\375\375\371\371\375\341\341\351\313\313\323\323\323\331\355"
+ "\355\361\376\376\376\371\371\371\345\345\355\351\351\361\361\361\365\345"
+ "\345\355\333\333\341\361\361\365\376\376\376\375\375\375\355\355\365\355"
+ "\351\361\371\371\375\376\376\376\355\355\361\313\313\323\341\341\351\202"
+ "\371\371\375\20\335\335\345\312\305\321\351\351\355\376\376\376\375\375\375"
+ "\371\371\371\365\365\365\355\355\361\323\323\331\264\264\272\275\275\276"
+ "\271\271\272\243\242\244\201\221\33\241\272*\265\321&\202\276\334,\226\311"
+ "\345*\202\311\342/\11\304\3428\310\325t\264\277q\227\227\232sz\205\213\222"
+ "\233sz\205_`l\325\347`\202\310\325t\4\302\335M\277\334=\311\345*\304\342"
+ "8\230\311\345*\16\306\340*\276\334,UlF\226\244b\320\210\2129;I\33#,\35""2"
+ "3,??UlF\205\234G\225\257:\261\305&\265\321&\203\276\334,\204\306\340*\204"
+ "\311\345*\202\306\340*\15\301\325.\302\335M\241\252vz\214^x\205\210Tegx\205"
+ "\210_mpTeg\213\222\233TY_\213\222\233IUW\202x\205\210\11<QN\203\212\224I"
+ "UW\203\212\224TegTY_\231\243\251_mp\243\245\264\202_mp\6<QN\21*$\16""4$\6"
+ ")\30\10\26\31\2\24\12\202\34?0\205\30:,\10\34?0\2\24\12\222\230\242ix{x\205"
+ "\210IUW\254\254\262TY_\202ix{\6_mp\225\257:\241\272*\261\305&\265\321&\276"
+ "\334,\202\306\340*\261\311\345*\12\340\351v\345\361\223\206\207\212\217\217"
+ "\222\235\234\237\252\252\254\275\275\276\314\314\315\323\323\331\341\341"
+ "\341\202\355\355\361\2\365\365\365\365\365\371\202\371\371\375\1\365\365"
+ "\371\202\361\361\365\203\365\365\371\15\355\355\365\355\355\361\371\371\375"
+ "\375\375\375\365\365\371\365\361\371\371\371\375\375\375\375\351\351\361"
+ "\331\331\335\345\345\355\361\361\365\351\351\361\202\325\325\335\2\365\365"
+ "\371\376\376\376\203\375\375\375\12\376\376\376\371\371\371\315\315\331\273"
+ "\273\304\305\304\321\312\305\321\273\273\304\303\303\313\361\361\365\376"
+ "\376\376\204\375\375\375\4\376\376\376\365\365\371\325\325\335\315\315\331"
+ "\202\325\325\335\2\343\342\345\371\371\371\202\376\376\376\202\375\375\375"
+ "\20\375\375\371\365\365\365\351\351\351\227\227\232rqy:::\0\0\0\3\3\3rqy"
+ "\311\311\311\323\323\324\311\311\311\252\252\254\206\207\212_`l\226\244b"
+ "\203\302\312\225\23\310\325t\320\350R\302\335M\301\325.\257\3232\247\326"
+ "\31\217\265\23m\204>\237\243\221\305\304\321\261\261\264\271\271\272\314"
+ "\314\315\335\335\335\343\342\345\351\351\351\350\350\304\340\351v\271\326"
+ "B\202\241\272*\202\250\3051\7\257\3232\222\247#\265\265\265\335\335\335\361"
+ "\361\365\371\371\371\371\371\375\202\375\375\375\12\371\371\375\371\371\371"
+ "\375\375\375\371\371\375\351\351\355\323\323\331\325\325\335\355\351\361"
+ "\376\376\376\371\371\375\202\351\351\361\31\361\361\365\351\351\361\333\333"
+ "\341\355\355\361\376\376\376\375\375\375\361\361\365\355\351\361\371\371"
+ "\375\376\376\376\361\361\365\315\315\331\341\341\351\371\371\375\375\375"
+ "\375\345\345\355\313\313\323\345\341\351\376\376\376\375\375\375\371\371"
+ "\371\365\365\365\361\361\361\323\323\331\264\264\272\202\271\271\272\4\243"
+ "\242\244\201\221\33\241\272*\265\321&\202\276\334,\232\311\345*\14\306\340"
+ "*\302\335M\213\222\233sz\205\273\265\277_`l01?TY_\227\227\232TY_IUW.1:\202"
+ "IUW\3\226\244b\310\325t\304\3428\222\311\345*\10\305\345*\306\340*\275\341"
+ "&\226\244b\30:,\33#,\5\10\15\22\35!\202.1:\1&*4\202\33#,\6,?\077<QNm\204>\225"
+ "\257:\261\305&\265\321&\202\271\334#\1\276\334,\203\306\340*\16\302\342&"
+ "\306\340*\276\334,\241\252vix{x\205\210<QN\203\212\224ix{_mpx\205\210TY_"
+ "\213\222\233<QN\202x\205\210\15IUW\203\212\224<QN\222\230\242Teg_mp\222\230"
+ "\242_mp\231\243\251TY_Teg\35""23\6)\30\202\16""4$\202\30:,\4\2\24\12!983"
+ "HE\16""4$\207\30:,\202\16""4$\20\252\261\276TY_x\205\210_mpiku\231\243\251"
+ "<QN\206\207\212z\214^\235\262\"\245\304\37\261\305&\265\321&\276\334,\306"
+ "\340*\305\345*\260\311\345*\202\345\361\223\10\200\200\205\217\217\222\243"
+ "\242\244\252\252\254\275\275\276\314\314\315\323\323\331\343\342\345\202"
+ "\355\355\361\202\365\365\371\2\371\371\371\371\371\375\202\365\365\371\1"
+ "\365\361\371\203\365\365\371\2\361\361\365\355\355\365\202\371\371\375\202"
+ "\361\361\365\7\371\371\375\375\375\375\351\351\361\333\333\341\345\345\355"
+ "\361\361\365\351\351\361\202\325\325\335\2\371\371\371\376\376\376\203\375"
+ "\375\375\12\376\376\376\371\371\371\315\315\331\273\273\304\312\305\321\305"
+ "\304\321\273\273\304\312\305\321\365\365\371\376\376\376\204\375\375\375"
+ "\2\376\376\376\361\361\365\202\323\323\331\202\325\325\335\2\345\345\351"
+ "\371\371\375\202\376\376\376\203\375\375\375\6\375\375\371\365\365\365\343"
+ "\342\345\217\217\222fgfTY_\202\0\0\0\2-,-\235\234\237\203\302\302\304\26"
+ "\254\254\262\251\300X\325\3507\304\3428\277\334=\276\334,\257\3232\245\304"
+ "\37\241\272*\225\257:\216\225{\251\244\260\305\304\321\273\265\277\261\261"
+ "\264\302\302\304\314\314\315\341\341\341\355\355\335\345\361\223\325\347"
+ "`\263\315A\202\241\272*\204\250\3051\7\257\3232\201\234$\264\264\272\335"
+ "\331\335\361\361\361\371\371\371\371\371\375\202\375\375\375\5\371\371\375"
+ "\371\371\371\371\371\375\375\375\375\355\355\361\202\325\325\335\3\351\351"
+ "\361\375\375\375\371\371\375\202\355\351\361\22\361\361\365\355\355\365\341"
+ "\341\351\355\355\361\376\376\376\375\375\375\361\361\371\355\355\365\371"
+ "\371\375\376\376\376\365\361\371\323\323\331\341\341\351\371\371\375\376"
+ "\376\376\351\351\361\313\313\323\341\341\351\202\375\375\375\13\371\371\371"
+ "\365\365\365\361\361\361\323\323\331\264\264\272\275\275\276\271\271\272"
+ "\243\242\244\201\221\33\241\272*\265\321&\202\276\334,\231\305\345*\6\302"
+ "\335M\265\265\265_`l\33#,iku\265\265\265\203\375\367\375\13\362\350\354\375"
+ "\367\375\313\304\315rqy\3\3\3\33#,\213\222\233TY_\203\212\224\241\252v\302"
+ "\335M\220\305\345*\7\306\340*\302\342&\271\326B<QN\35""23.1:*2:\202/7>\2"
+ "*2:.1:\202*2:\1*16\202&*4\5*69<QNm\204>\225\257:\250\3051\202\265\321&\15"
+ "\271\334#\276\334,\271\334#\276\334,\251\300XIUW\213\222\233ix{_mpx\205\210"
+ "TY_\231\243\251<QN\202sz\205\11IUWx\205\2103HE\231\243\251Teg_mp\213\222"
+ "\233sz\205\203\212\224\202<QN\2\21*$\6)\30\202\16""4$\1\34?0\202\30""3)\6"
+ "\22\35!\21*$\257\255\267x\205\210\222\230\242\6)\30\207\30:,\2\34?0\2\24"
+ "\12\202sz\205\17\222\230\242<QN\203\212\224IUW\203\212\224ix{Teg\205\234"
+ "G\235\262\"\245\304\37\265\321&\271\334#\276\334,\302\342&\306\340*\257\305"
+ "\345*\202\345\361\223\12\200\200\205\227\227\232\243\242\244\252\252\254"
+ "\275\275\276\311\311\311\323\323\331\343\342\345\355\355\355\355\355\361"
+ "\203\365\365\371\3\371\371\375\365\365\371\365\365\365\202\361\361\365\4"
+ "\365\365\371\365\361\371\355\355\361\361\361\365\202\371\371\375\202\355"
+ "\355\365\13\365\365\371\375\375\375\355\351\361\333\333\341\345\345\355\361"
+ "\361\365\351\351\355\325\325\335\333\333\341\371\371\375\376\376\376\203"
+ "\375\375\375\12\376\376\376\371\371\371\315\315\331\275\275\312\305\304\321"
+ "\312\305\321\275\275\312\315\315\331\371\371\375\376\376\376\204\375\375"
+ "\375\10\376\376\376\361\361\365\325\325\335\323\323\331\325\325\335\331\331"
+ "\335\351\351\355\371\371\375\202\376\376\376\203\375\375\375\10\376\376\376"
+ "\375\375\375\361\361\361\335\335\335\254\254\262rqyz{|-,-\202\0\0\0\5-,-"
+ "fgf\244\244\252\271\271\272\216\225{\202\205\234G\202\226\244b\5\246\253"
+ "\221\252\252\254\264\264\272\275\275\312\312\305\321\202\275\275\276\7\302"
+ "\302\304\314\314\315\327\330\306\324\343\223\340\351v\271\326B\246\277?\202"
+ "\241\272*\203\250\3051\12\241\272*\250\3051\241\272*\257\3232\201\234$\271"
+ "\271\272\335\331\335\361\361\365\371\371\375\371\371\371\203\375\375\375"
+ "\1\365\365\371\202\371\371\375\6\361\361\365\333\333\341\325\325\335\351"
+ "\351\361\375\375\375\371\371\375\202\355\355\365\4\361\361\371\355\355\365"
+ "\345\341\351\351\351\361\202\375\375\375\14\365\365\371\355\355\365\371\371"
+ "\371\376\376\376\365\365\371\321\320\336\341\341\351\371\371\375\376\376"
+ "\376\355\355\365\315\315\331\335\335\345\202\371\371\375\15\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\264\264\272\275\275\276\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\276\334,\271\334#\227\302\342&\4\306"
+ "\340*\241\252v\217\217\222_`l\202\375\367\375\22\362\350\354\233\233\250"
+ "TY_rqysz\205iku_`l\203\212\224sz\205\213\222\233rqyIUW\263\265\303\375\367"
+ "\375\321\320\336rqy\216\225{\302\335M\216\302\342&\6\275\341&\301\325.z\214"
+ "^\16""4$.1:*16\202*2:\3\"#$\30)$*16\203*2:\203*16\202&*4\6*2:3HEUlF\205\234"
+ "G\225\257:\261\305&\202\265\321&\23\257\3232IUW\213\222\233Teg\243\245\264"
+ "<QN_mpsz\205_mp\203\212\2243HE\222\230\242_mp\203\212\224sz\205_`lix{!98"
+ "#C5\202\6)\30\1\16""4$\203\6)\30\12\34?0\30""3)\22\35!\30""3)\21*$\30)$T"
+ "eg\10\26\31\6)\30\21*$\205\30:,\24\16""4$\6)\30\34?0\5\10\15\21*$\252\261"
+ "\276<QN\206\207\212Tegix{\222\230\242TY_\213\222\233UlF\235\262\"\245\304"
+ "\37\261\305&\265\321&\271\334#\275\341\"\260\302\342&\202\345\361\223\10"
+ "z{|\217\217\222\243\242\244\252\252\254\275\275\276\311\311\311\323\323\324"
+ "\343\342\345\202\355\355\361\1\361\361\365\205\365\365\371\203\361\361\365"
+ "\22\365\361\371\355\355\365\361\361\365\371\371\375\365\365\371\355\355\361"
+ "\355\351\361\365\365\371\375\375\375\355\355\361\335\335\345\345\345\355"
+ "\361\361\365\345\345\355\325\325\335\335\335\345\371\371\375\376\376\376"
+ "\203\375\375\375\10\376\376\376\371\371\371\315\315\331\275\275\312\312\305"
+ "\321\305\304\321\275\275\312\323\323\331\206\375\375\375\10\376\376\376\361"
+ "\361\365\325\325\335\323\323\331\325\325\335\333\333\341\355\355\361\375"
+ "\375\375\202\376\376\376\203\375\375\375\202\376\376\376\10\365\365\371\351"
+ "\351\355\335\335\335\314\314\315\235\234\237\227\227\232z{|DEJ\203\3\3\3"
+ "\21""103rqy\200\200\205\217\217\222\233\233\250\257\255\267\275\275\276\302"
+ "\302\304\275\275\276\271\271\272\275\275\276\302\302\304\313\315\253\324"
+ "\343\223\325\347`\271\326B\246\277?\202\235\262\"\211\241\272*\5\257\323"
+ "2\201\234$\271\271\272\335\331\335\361\361\361\202\371\371\371\203\375\375"
+ "\375\12\371\371\375\365\365\371\371\371\375\365\365\371\335\335\345\333\333"
+ "\341\351\351\361\375\375\375\371\371\375\361\361\365\202\355\355\365\3\361"
+ "\361\365\345\345\355\351\351\361\202\375\375\375\34\365\365\375\355\355\365"
+ "\371\371\375\376\376\376\365\365\371\325\325\341\345\345\355\371\371\375"
+ "\376\376\376\361\361\371\323\323\331\333\333\341\371\371\375\375\375\375"
+ "\371\371\371\365\365\365\361\361\361\331\331\331\264\264\272\275\275\276"
+ "\271\271\272\243\242\244\201\221\33\245\304\37\265\321&\271\334#\276\334"
+ ",\302\342&\224\301\341\"\34\307\3330\251\300XDEJ9;I\375\375\371\375\367\375"
+ "\203\212\224iku\222\230\242\233\233\250\263\265\303\233\233\250\243\245\264"
+ "\200\200\205\203\212\224\222\230\242\203\212\224\233\233\250\200\200\205"
+ "rqyIUW9;I\273\265\277\375\367\375\305\305\331\203\212\224\264\277q\307\333"
+ "0\213\301\341\"\202\271\334#\4\251\300X\30:,*2:.1:\202*2:\4&*4\30)$\"*,-"
+ ",-\205*2:\2*16*2:\202*16\20&*4\"*,\35""23,??UlFm\204>\222\247#\245\304\37"
+ "\205\234GIUWix{sz\205_mp\213\222\233<QN\213\222\233\202ix{\6sz\205_`lIUW"
+ "\21*$\30:,\6)\30\202\16""4$\23\34?0\16""4$#C5<QN\213\222\233x\205\210\2\24"
+ "\12\21\20\27\21*$\34?0\30""3)\21*$\16""4$\10\26\31\3\3\3\6)\30\30:,\16""4"
+ "$\30:,\202\16""4$\25<QN_mp\5\10\15\22\35!\0\0\0ix{_mp\203\212\224_mp\222"
+ "\230\242<QN\213\222\233sz\205ix{\205\234G\235\262\"\245\304\37\261\305&\265"
+ "\321&\271\334#\275\341\"\256\301\341\"\1\275\341\"\202\345\361\223\10\200"
+ "\200\205\227\227\232\243\242\244\252\252\254\275\275\276\311\311\311\323"
+ "\323\324\343\342\345\202\355\355\355\2\361\361\365\365\365\365\204\365\365"
+ "\371\1\365\361\371\204\361\361\365\20\365\361\371\371\371\375\365\365\371"
+ "\351\351\361\351\351\355\365\361\371\375\375\375\355\355\365\335\335\345"
+ "\345\345\355\361\361\365\345\345\355\325\325\335\341\341\351\371\371\375"
+ "\376\376\376\203\375\375\375\10\376\376\376\371\371\375\323\323\331\275\275"
+ "\312\313\313\323\305\304\321\275\275\312\325\325\335\206\375\375\375\2\376"
+ "\376\376\361\361\365\202\325\325\335\4\331\331\335\333\333\341\355\355\361"
+ "\375\375\375\202\376\376\376\202\375\375\375\203\376\376\376\17\371\371\371"
+ "\355\355\361\355\351\355\343\342\345\335\335\335\314\314\315\261\261\264"
+ "\227\227\232\200\200\205fgfIUW.1:\216\225{\271\271\272\264\264\272\202\265"
+ "\265\265\202\313\315\253\11\324\343\223\310\325t\302\335M\271\326B\250\305"
+ "1\241\272*\235\262\"\222\247#\235\262\"\213\241\272*\5\250\3051\201\234$"
+ "\264\264\272\335\331\335\361\361\365\202\371\371\371\203\375\375\375\11\371"
+ "\371\375\365\365\371\371\371\375\365\365\371\341\341\351\335\335\345\355"
+ "\355\361\375\375\375\371\371\375\202\361\361\365\202\355\355\365\202\351"
+ "\351\361\33\371\371\375\375\375\375\365\365\375\361\361\365\371\371\375\376"
+ "\376\376\365\365\371\325\325\341\345\345\355\375\375\375\376\376\376\365"
+ "\365\371\325\325\341\333\333\341\371\371\375\375\375\375\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\264\264\272\275\275\276\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\202\276\334,\224\275\341&\5\277\334"
+ "=fgf\22\35!_`l\375\367\375\202sz\205\15\243\245\264\251\244\260\203\212\224"
+ "rqyTY_rqy\200\200\205\213\222\233\217\217\222sz\205\200\200\205rqy\200\200"
+ "\205\203\213\222\233\7_`lDEJ\251\244\260\365\361\371\222\230\242\226\231"
+ "\212\304\3428\212\275\341&\5\271\334#\263\315A<QN\35""23.1:\203*2:\4.6:*"
+ "16&*4*16\204*2:\1*16\205*2:\202.1:\22&*4\"*,*16#C5<QNUlF#C5\252\261\276<"
+ "QN\233\233\250sz\205Tegsz\205IUW\252\261\276\16""4$\6)\30\16""4$\202\30:"
+ ",\2\34?0\30:,\202\30""3)\3\10\26\31""3HE\252\261\276\2023HE\3\21*$\30)$\22"
+ "\35!\202\6)\30\2\10\26\31\16""4$\202<QN\11\263\265\303\30""3)\34?0\30""3"
+ ")\22\35!\6)\30<QN\277\313\327\22\35!\202\16""4$\4!98\252\261\276<QN\213\222"
+ "\233\202ix{\7x\205\2103HE\243\245\264UlF\217\265\23\235\262\"\245\304\37"
+ "\202\265\321&\1\271\334#\256\275\341&\16\275\341\"\324\343\223\345\361\223"
+ "z{|\217\217\222\235\234\237\252\252\254\271\271\272\303\303\313\323\323\324"
+ "\343\342\345\355\351\355\355\355\361\361\361\365\203\365\365\371\2\365\361"
+ "\371\365\365\371\205\361\361\365\3\365\365\365\371\371\375\365\365\371\202"
+ "\351\351\355\13\361\361\365\375\375\375\355\355\365\341\341\351\345\345\355"
+ "\361\361\365\345\345\355\325\325\341\345\341\351\371\371\375\376\376\376"
+ "\203\375\375\375\10\376\376\376\371\371\375\323\323\331\303\303\313\313\313"
+ "\323\305\304\321\275\275\312\331\331\335\206\375\375\375\4\376\376\376\365"
+ "\365\371\331\331\335\325\325\335\202\333\333\341\2\361\361\365\375\375\375"
+ "\203\376\376\376\1\375\375\375\203\376\376\376\3\371\371\371\361\361\365"
+ "\361\361\361\202\355\355\361\11\351\351\351\335\335\335\314\314\315\261\261"
+ "\264\217\217\222z{|iku\251\300X\302\335M\202\271\326B\3\263\315A\250\305"
+ "1\241\272*\202\235\262\"\202\222\247#\3\217\276$\235\262\"\217\276$\202\241"
+ "\272*\1\217\276$\212\241\272*\7\250\3051\201\234$\271\271\272\335\335\335"
+ "\361\361\361\365\365\371\371\371\371\203\375\375\375\13\371\371\375\365\365"
+ "\371\371\371\375\365\365\375\345\345\355\343\342\345\355\355\365\375\375"
+ "\375\371\371\375\365\361\371\361\361\371\202\355\355\365\202\355\351\361"
+ "\36\371\371\375\375\375\375\371\371\375\365\361\371\371\371\375\376\376\376"
+ "\365\365\371\333\333\341\351\351\361\375\375\375\376\376\376\365\365\371"
+ "\325\325\341\333\333\341\371\371\375\375\375\375\371\371\371\365\365\365"
+ "\361\361\361\325\325\335\264\264\272\302\302\304\271\271\272\243\242\244"
+ "\201\221\33\217\276$\265\321&\271\334#\276\334,\275\341&\222\275\341\"\13"
+ "\271\326B_`liku\0\0\0\233\233\250\213\222\233\257\255\267\203\212\224sz\205"
+ "iku\200\200\205\202\252\261\276\23\301\351\375\321\320\336\275\275\312\311"
+ "\307\331\273\265\277\305\304\321\273\273\304\243\245\264DEJ\217\217\222r"
+ "qy\213\222\233\222\230\242_`lrqy\357\345\361\252\261\276\200\200\205\302"
+ "\335M\210\275\341\"\6\271\334#\265\321&z\214^\30:,*2:*16\202*2:\202*16\222"
+ "*2:\1&*4\202*16\202#C5\5,N<x\205\2103HE\243\245\264TY_\202sz\205\2_mp\6)"
+ "\30\202\34?0\1\30:,\202\30)$\10\30""3)\30:,\30)$\21*$\16""4$\2\24\12\10\26"
+ "\31\6)\30\202\30""3)\35\22\35!Teg_mp\2\24\12Teg\231\243\251Teg_mp\231\243"
+ "\251<QN\2\24\12\30""3)\2\24\12\222\230\242_mp\6)\30\34?0\6)\30\213\222\233"
+ "ix{sz\2053HE\264\264\272IUWx\205\210_mpix{\205\234G\235\262\"\202\245\304"
+ "\37\3\263\333\36\265\321&\271\334#\255\275\341\"\1\275\341&\202\345\361\223"
+ "\10z{|\227\227\232\243\242\244\252\252\254\271\271\272\303\303\313\323\323"
+ "\324\343\342\345\202\351\351\355\202\361\361\365\202\365\365\371\3\361\361"
+ "\365\365\365\371\361\361\365\202\355\355\361\202\361\361\365\3\365\365\371"
+ "\371\371\375\361\361\365\202\345\345\355\11\355\355\365\375\375\375\361\361"
+ "\365\341\341\351\345\345\355\355\355\365\345\345\355\331\331\335\345\345"
+ "\355\205\375\375\375\4\376\376\376\371\371\375\325\325\335\305\304\321\202"
+ "\312\305\321\2\303\303\313\335\335\345\206\375\375\375\7\376\376\376\365"
+ "\365\371\333\333\341\331\331\335\333\333\341\335\335\345\361\361\365\210"
+ "\376\376\376\15\371\371\375\361\361\365\361\361\361\361\361\365\365\365\371"
+ "\371\371\371\361\361\365\351\351\351\335\335\335\323\323\324\314\314\315"
+ "\311\301\310\226\244b\203}\243\25\204\217\265\23\2\235\262\"\217\276$\205"
+ "\235\262\"\7\217\276$\241\272*\235\262\"\217\276$\241\272*\231\311'\241\272"
+ "*\202\250\3051\12\257\3232\250\3051\257\3232\276\334,\201\234$\271\271\272"
+ "\335\331\335\361\361\361\365\365\371\371\371\371\203\375\375\375\14\371\371"
+ "\375\365\365\371\371\371\371\371\371\375\351\351\355\345\345\351\361\361"
+ "\365\375\375\375\371\371\375\365\361\371\361\361\371\355\355\361\203\355"
+ "\355\365\33\371\371\375\375\375\375\371\371\375\365\365\371\371\371\375\376"
+ "\376\376\365\365\371\335\335\345\355\355\361\375\375\375\376\376\376\365"
+ "\365\375\335\335\345\333\333\341\371\371\375\375\375\375\371\371\371\365"
+ "\365\365\361\361\361\325\325\335\273\265\277\302\302\304\271\271\272\243"
+ "\242\244\201\221\33\235\262\"\265\321&\202\276\334,\1\275\341&\210\275\341"
+ "\"\4\277\334=\216\225{\263\315A\275\341&\205\275\341\"#\302\335Miku\375\367"
+ "\375\0\0\0\213\222\233\233\233\250\213\222\233iku\203\212\224\233\233\250"
+ "\275\275\312\311\307\331\320\210\212\200\200\205\322H<\320\210\212\345\340"
+ "\355\332\325\341\342\333\342\321\320\336\365\361\371\341\330\336\345\340"
+ "\355\305\304\321\257\255\267\200\200\205\233\233\250\251\244\260\213\222"
+ "\2339;I\332\325\341\315\315\331z{|\277\334=\275\341&\205\275\341\"\202\271"
+ "\334#\12\263\315A,N<\35""23.1:*2:*16*2:.6:*2:.6:\204*2:\1.1:\202*2:\1.6:"
+ "\204*2:\1*16\204*2:\202.6:\16*16.1:&*4*16\21*$#C5Teg\34?0\213\222\2333HE"
+ "\263\265\303\30)$\16""4$\34?0\202\30""3)\205\30:,\202\21*$\2\30""3)ix{\202"
+ "\6)\30\20\277\313\327<QN\235\234\237IUW_mpix{IUW\222\230\242IUW\222\230\242"
+ "\6)\30\21*$\30:,\6)\30\10\26\31\30""3)\202\21*$\17\10\26\31\273\273\304<"
+ "QN\243\242\244Tegrqy\213\222\233TY_\213\222\233fgf\217\265\23\235\262\"\245"
+ "\304\37\265\321&\263\333\36\202\271\334#\255\275\341\"\14\324\343\223\345"
+ "\361\223\200\200\205\217\217\222\235\234\237\252\252\254\265\265\265\302"
+ "\302\304\313\313\323\343\342\345\345\345\351\351\351\355\203\361\361\365"
+ "\4\365\365\371\361\361\365\365\365\371\365\361\371\202\355\355\361\22\355"
+ "\355\365\361\361\365\365\365\371\371\371\375\361\361\365\345\345\355\345"
+ "\345\351\355\351\361\371\371\375\365\361\371\345\341\351\351\351\355\355"
+ "\355\365\345\345\355\333\333\341\351\351\355\375\375\375\371\371\375\204"
+ "\375\375\375\7\371\371\375\333\333\341\305\304\321\313\313\323\312\305\321"
+ "\305\304\321\335\335\345\206\375\375\375\7\376\376\376\371\371\375\335\335"
+ "\345\331\331\335\333\333\341\335\335\345\361\361\365\210\376\376\376\1\371"
+ "\371\375\202\361\361\365\12\361\361\361\371\371\371\376\376\376\375\375\375"
+ "\365\365\371\355\355\361\351\351\351\343\342\345\341\341\341\251\300X\205"
+ "\217\265\23\1\222\247#\215\217\265\23\210}\243\25\6m\216\33\271\271\272\335"
+ "\335\335\361\361\361\365\365\371\371\371\371\203\375\375\375\7\371\371\371"
+ "\365\365\371\371\371\371\371\371\375\355\355\361\351\351\355\365\365\371"
+ "\202\371\371\375\3\365\365\371\365\361\371\355\351\361\203\355\355\365\14"
+ "\371\371\375\375\375\375\371\371\375\365\365\375\371\371\375\376\376\376"
+ "\365\365\371\335\335\345\355\355\365\375\375\375\376\376\376\371\371\371"
+ "\202\335\335\345\20\371\371\375\375\375\375\371\371\371\365\365\365\361\361"
+ "\361\323\323\331\273\265\277\302\302\304\271\271\272\243\242\244\201\221"
+ "\33\235\262\"\257\3232\271\334#\276\334,\275\341&\207\275\341\"\6\275\341"
+ "&rqyikusz\205\216\225{\302\335M\202\275\341\"\5\271\334#\302\335Miku\371"
+ "\371\375\3\3\3\202\233\233\250\36\203\212\224rqy\251\244\260\273\265\277"
+ "\322\314\324\333\361\375\322H<\341\275\304\223\32\26\375\366\371\320\210"
+ "\212\341\275\304\333\333\341\334\325\335\357\345\361\227\227\23201?\365\357"
+ "\365\341\330\336\345\340\355\311\301\310\233\233\250\200\200\205\257\255"
+ "\267\233\233\2509;I\273\265\277\321\320\336iku\277\334=\204\275\341\"\202"
+ "\271\334#\5\257\3232UlF\30""3).1:*16\205*2:\1.6:\203*2:\1*16\203*2:\1.1:"
+ "\203*2:\1.6:\202*2:\1.1:\203*2:\1.1:\204*2:\4.1:&*4\33#,*16\202\30:,\6x\205"
+ "\210IUW\16""4$\34?0\30""3)\21*$\205\30:,\5\2\24\12\222\230\242ix{\252\261"
+ "\276\34?0\202ix{\12sz\205ix{IUW\231\243\251IUW\213\222\233ix{\203\212\224"
+ "\2\24\12\6)\30\202\30""3)\1\30:,\203\22\35!\15\21*$\3\3\3\203\212\224x\205"
+ "\210\203\212\224IUW\213\222\233IUW\213\222\233_mpix{\205\234G\217\265\23"
+ "\202\245\304\37\1\265\321&\203\271\334#\253\275\341\"\13\275\341&\340\351"
+ "v\345\361\223\200\200\205\217\217\222\243\242\244\252\252\254\265\265\265"
+ "\302\302\304\314\314\315\341\341\341\202\345\345\351\23\361\361\365\365\365"
+ "\365\361\361\365\365\365\371\361\361\365\365\365\371\361\361\371\355\355"
+ "\361\355\351\355\355\355\365\361\361\365\365\365\371\371\371\375\355\355"
+ "\365\341\341\351\345\341\351\351\351\361\371\371\375\365\365\371\202\345"
+ "\345\355\5\355\355\365\345\345\355\333\333\341\351\351\361\375\375\375\202"
+ "\371\371\375\1\376\376\376\203\375\375\375\2\335\335\345\305\304\321\202"
+ "\313\313\323\2\312\305\321\335\335\345\206\375\375\375\10\376\376\376\375"
+ "\375\375\345\341\351\333\333\341\335\335\345\343\342\345\361\361\365\375"
+ "\375\375\207\376\376\376\5\375\375\375\365\365\365\361\361\361\361\361\365"
+ "\371\371\371\202\376\376\376\6\375\375\375\365\365\371\365\365\365\361\361"
+ "\365\355\351\355\226\231\212\213\216\225{\203\226\231\212\1\237\243\221\205"
+ "\246\253\221\3\237\243\221\216\225{\226\231\212\202\216\225{\202\226\231"
+ "\212\6\237\243\221\302\302\304\341\341\341\361\361\365\365\365\365\371\371"
+ "\375\203\375\375\375\2\371\371\371\361\361\365\202\371\371\375\4\355\355"
+ "\365\355\355\361\365\365\375\371\371\375\202\365\365\371\7\361\361\371\351"
+ "\351\361\355\355\361\361\361\365\361\361\371\371\371\375\375\375\375\203"
+ "\371\371\375\7\375\375\375\361\361\365\341\341\351\361\361\371\375\375\375"
+ "\376\376\376\365\365\375\202\335\335\345\202\371\371\375\13\371\371\371\365"
+ "\365\365\361\361\361\323\323\331\273\273\304\303\303\313\271\271\272\243"
+ "\242\244m\216\33\235\262\"\265\321&\202\276\334,\202\275\341&\4\275\341\""
+ "\275\341&\275\341\"\275\341&\202\275\341\"\4\264\277q\5\10\15\0\0\0&*4\202"
+ "sz\205'\302\335M\275\341&\275\341\"sz\205\375\367\375DEJ\203\212\224\222"
+ "\230\242sz\205\213\222\233\233\233\250\325\325\341\334\325\335\335\331\335"
+ "\333\361\375\322H<\341\275\304\223\32\26\320\210\212\322H<\371\375\375\343"
+ "\342\345\342\333\342\375\367\375TY_\244\244\252rqy\362\354\362\334\325\335"
+ "\345\341\351\322\314\324\313\304\315\213\222\233\251\244\260\264\264\272"
+ "DEJ\257\255\267\275\275\312\200\200\205\202\275\341&\1\275\341\"\202\271"
+ "\334#\5\263\333\36\226\244b\30:,/7>*16\204*2:\3*16*2:.1:\202*2:\2*16.1:\202"
+ "*2:\2.6:*16\202&*4\1*16\202\22\35!\1*16\203.6:\211*2:\1*16\202.1:\2\22\35"
+ "!\34?0\203,N<\203\30""3)\7\16""4$\30""3)\16""4$<QNIUW\213\222\233Teg\202"
+ "x\205\210\14<QN\231\243\251IUWx\205\210Tegx\205\210\203\212\224IUW\213\222"
+ "\233!98\252\261\276\3\3\3\202\21*$\1\22\35!\202\30)$\202\22\35!\14\10\26"
+ "\31\263\265\303<QN\213\222\233Teg_mp\206\207\212_mp\233\233\250UlF\222\247"
+ "#\235\262\"\202\245\304\37\1\265\321&\203\271\334#)\275\341\"\275\341&\275"
+ "\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&"
+ "\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341"
+ "&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275"
+ "\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\""
+ "\275\341&\275\341\"\275\341&\275\341\"\275\341&\275\341\"\271\334#\275\341"
+ "&\202\275\341\"\12\324\343\223\345\361\223\206\207\212\217\217\222\235\234"
+ "\237\244\244\252\261\261\264\275\275\276\314\314\315\341\341\341\202\345"
+ "\345\351\1\355\355\361\202\361\361\365\13\365\365\371\361\361\365\365\365"
+ "\371\365\365\365\355\355\361\351\351\361\355\355\361\361\361\365\365\365"
+ "\371\365\365\375\355\355\365\202\341\341\351\15\345\345\355\371\371\371\365"
+ "\365\375\351\351\355\345\345\355\355\355\361\345\345\355\335\335\345\351"
+ "\351\361\371\371\375\365\365\375\371\371\375\376\376\376\203\375\375\375"
+ "\1\345\345\355\203\313\313\323\2\305\304\321\343\342\345\206\375\375\375"
+ "\10\376\376\376\375\375\375\345\345\355\333\333\341\335\335\345\343\342\345"
+ "\361\361\365\375\375\375\207\376\376\376\2\375\375\375\365\365\365\202\361"
+ "\361\365\5\365\365\371\375\375\375\376\376\376\375\375\375\371\371\371\202"
+ "\365\365\371\6\361\361\365\352\343\353\335\331\331\313\304\315\275\275\276"
+ "\273\265\277\202\264\264\272\1\271\271\272\202\273\265\277\202\275\275\276"
+ "\3\271\271\272\265\265\265\271\271\272\203\275\275\276\202\265\265\265\202"
+ "\271\271\272\3\275\275\276\271\271\272\265\265\265\203\275\275\276\6\302"
+ "\302\304\323\323\324\351\351\355\361\361\365\365\365\371\371\371\375\203"
+ "\375\375\375\2\365\365\371\361\361\365\202\371\371\375\202\361\361\365\202"
+ "\371\371\375\11\365\365\371\365\365\375\361\361\365\345\345\355\355\351\361"
+ "\361\361\371\365\361\371\371\371\375\375\375\375\202\371\371\375\202\375"
+ "\375\375\25\361\361\365\345\341\351\365\361\371\371\371\375\375\375\375\371"
+ "\371\375\335\335\345\341\341\351\375\375\375\371\371\375\371\371\371\365"
+ "\365\365\355\355\361\315\315\331\273\273\304\311\311\311\271\271\272\243"
+ "\242\244\201\221\33\241\272*\257\3232\202\276\334,\1\275\341&\207\275\341"
+ "\"\3\235\234\237\233\233\2509;I\202\0\0\0+\243\245\264\213\222\233\246\253"
+ "\221\237\243\221\305\304\321\355\351\355TY_\233\233\250\217\217\222TY_\217"
+ "\217\222\355\351\365\355\351\355\375\367\375\332\320\330\335\331\335\361"
+ "\365\371\320\210\212\254\254\262x\205\210\351\361\375\217\217\222\303\274"
+ "\304\335\331\335\352\343\353\312\305\321\303\274\304\22\35!\376\376\376\341"
+ "\330\336\334\325\335\342\333\342\362\354\362\273\273\304\257\255\267\213"
+ "\222\233\263\265\3039;I\311\307\331\213\222\233\264\277q\271\334#\275\341"
+ "\"\202\271\334#\6\263\315A,N<!98.1:*2:.1:\206*2:\1*16\203*2:\17/7>&*4\5\10"
+ "\15\22\35!*2:.6:\10\26\31rqyTY_\5\10\15\3\3\3\10\26\31&*4*16.6:\202*2:\3"
+ ".1:*2:*69\204*2:\1*16\204.1:\1,??\202,N<\5\34?0#C5\34?0\2\24\12\231\243\251"
+ "\202x\205\210\",N<\231\243\251TY_\203\212\224Teg_mp\213\222\233IUW\213\222"
+ "\233,N<x\205\210Teg_mp\233\233\250Teg\2\24\12\30""3)\21*$\21\20\27\2\24\12"
+ "\21*$\30)$\2\24\12ix{_mp\203\212\224_mp\222\230\2423HE\203\212\224ix{\203"
+ "\212\224m\204>\217\265\23\202\245\304\37\202\263\333\36\1\271\334#\254\275"
+ "\341\"\2\340\351v\345\361\223\202\206\207\212\11\235\234\237\244\244\252"
+ "\261\261\264\275\275\276\314\314\315\333\333\341\345\345\351\343\342\345"
+ "\355\355\361\202\361\361\365\2\365\361\371\355\355\361\202\365\365\371\7"
+ "\355\355\361\351\351\355\355\355\361\365\361\371\361\361\365\365\365\371"
+ "\355\355\365\202\341\341\351\15\345\345\351\365\365\371\371\371\375\351\351"
+ "\361\345\345\355\355\355\361\345\345\355\335\335\345\351\351\361\371\371"
+ "\375\365\365\375\371\371\375\376\376\376\202\375\375\375\3\376\376\376\355"
+ "\355\365\315\315\331\203\313\313\323\1\335\335\345\210\375\375\375\2\355"
+ "\355\361\335\335\345\202\343\342\345\2\355\355\365\375\375\375\210\376\376"
+ "\376\20\371\371\371\361\361\365\361\361\361\365\365\371\375\375\375\376\376"
+ "\376\375\375\375\371\371\375\365\365\371\371\371\371\365\365\365\361\361"
+ "\361\351\351\355\343\342\345\341\341\341\335\331\335\202\331\331\331\1\325"
+ "\325\335\205\331\331\331\1\331\331\335\203\335\335\335\3\331\331\331\323"
+ "\323\324\331\331\331\202\335\335\335\3\335\331\331\323\323\324\331\331\331"
+ "\202\335\335\335\3\335\331\331\335\335\335\351\351\351\202\361\361\365\1"
+ "\365\365\365\204\375\375\375\2\365\365\371\361\361\365\202\371\371\375\202"
+ "\365\365\371\1\371\371\375\202\365\365\371\6\365\365\375\355\355\365\345"
+ "\345\355\355\355\361\361\361\371\365\365\371\202\375\375\375\202\371\371"
+ "\375\202\375\375\375\3\361\361\365\345\345\355\365\365\371\202\371\371\375"
+ "\23\365\365\371\343\342\345\345\345\355\375\375\375\371\371\375\371\371\371"
+ "\365\365\365\355\355\361\322\314\324\302\302\304\311\311\311\271\271\272"
+ "\243\242\244\201\221\33\235\262\"\265\321&\276\334,\304\3428\275\341&\206"
+ "\275\341\"9\276\334,\264\277q\217\217\222\243\245\264\213\222\233_`l\3\3"
+ "\3\0\0\0\273\265\277_`l\371\371\375.1:\203\212\224\213\222\233sz\205\341"
+ "\330\336\355\351\365\362\354\362\227\227\232_`l\375\375\375\362\354\362\251"
+ "\244\260\333\334\352\332\325\341tPV\351\341\345\355\351\365\303\274\304\311"
+ "\301\310\335\331\335\362\354\362rqy\371\360\365\342\333\342\341\330\336\365"
+ "\357\365\362\350\354\313\304\315\376\376\376rqy\217\217\222\264\264\272\233"
+ "\233\250DEJ\355\351\371sz\205\271\326B\275\341\"\271\334#\263\333\36z\214"
+ "^\16""4$01?*16*2:*16\212*2:\2\"*,*69\202\261\261\264\16\206\207\212\235\234"
+ "\237\233\233\250\244\244\252\371\375\375\375\375\375\254\254\262TY_\10\26"
+ "\31\5\10\15\10\26\31.6:*2:.6:\202*2:\1.6:\202*2:\1.6:\202*2:\1.1:\202*2:"
+ "\32*16.1:\"*,\34?0#C5<QN#C5\6)\30\252\261\276!98\222\230\242Tegix{\203\212"
+ "\224<QN\213\222\233<QN\217\217\222Teg_mp\213\222\233Teg\222\230\2423HE<Q"
+ "N\2\24\12\202\30:,\12\22\35!\231\243\251\22\35!\21*$\22\35!\21*$\305\321"
+ "\327,??\227\227\232TY_\202x\205\210\10<QN\254\254\262UlF\222\247#\235\262"
+ "\"\245\304\37\261\305&\263\333\36\202\271\334#\253\275\341\"\15\340\351v"
+ "\324\343\223\216\225{\206\207\212\235\234\237\243\242\244\254\254\262\271"
+ "\271\272\311\311\311\335\331\335\345\345\351\343\342\345\355\355\361\202"
+ "\361\361\365\10\365\361\371\355\355\361\361\361\365\365\365\371\355\355\361"
+ "\351\351\355\355\355\361\365\361\371\202\365\365\371\17\355\355\365\341\341"
+ "\351\343\342\345\341\341\351\361\361\365\371\371\375\355\355\361\345\345"
+ "\355\355\351\361\351\351\355\341\341\351\351\351\361\371\371\375\365\365"
+ "\371\365\365\375\202\375\375\375\4\371\371\375\375\375\375\365\365\371\325"
+ "\325\335\202\315\315\331\3\313\313\323\335\335\345\371\371\375\206\375\375"
+ "\375\2\376\376\376\365\365\371\202\343\342\345\3\345\345\351\355\355\361"
+ "\375\375\375\210\376\376\376\2\375\375\375\365\365\365\202\361\361\365\1"
+ "\371\371\375\202\376\376\376\1\375\375\375\202\371\371\371\3\365\365\371"
+ "\365\365\365\361\361\365\203\365\365\365\2\361\361\365\361\361\361\203\355"
+ "\355\355\202\355\355\361\202\361\361\361\202\365\365\365\23\355\355\361\351"
+ "\351\351\351\351\355\361\361\361\365\365\365\361\361\365\355\355\355\351"
+ "\351\351\355\355\361\365\365\365\361\361\365\361\361\361\361\361\365\365"
+ "\365\371\371\371\371\361\361\365\365\365\371\375\375\375\371\371\375\202"
+ "\375\375\375\5\365\365\371\365\365\365\371\371\371\371\371\375\365\365\371"
+ "\202\371\371\375\202\365\365\371\4\371\371\375\355\355\361\345\341\351\355"
+ "\355\365\202\365\365\371\202\375\375\375\202\371\371\375\202\375\375\375"
+ "\30\355\355\365\351\351\361\365\365\371\365\365\375\371\371\375\365\365\371"
+ "\341\341\351\351\351\355\375\375\375\371\371\375\371\371\371\365\365\365"
+ "\355\355\361\313\313\323\303\303\313\311\311\311\271\271\272\243\242\244"
+ "\201\234$\235\262\"\257\3232\276\334,\304\3428\305\345*\207\275\341\"%\275"
+ "\341&\302\335M\246\253\221\217\217\222\203\212\224\243\245\264\22\35!sz\205"
+ "\375\375\375z{|sz\205\257\255\267z{|\275\275\312\345\341\351\0\0\0\371\360"
+ "\365\3\3\3\217\217\222\342\333\342\303\274\304\323\323\331\322\314\324\332"
+ "\320\330tPV\357\345\361\311\301\310\303\274\304\362\354\362\275\275\276\322"
+ "\314\324\375\367\375\343\342\345\342\333\342\355\351\355\235\234\237\322"
+ "\314\324\202_`l\20\375\367\375\342\333\342\213\222\233\322\314\324_`l\217"
+ "\217\222\275\275\312\216\225{\276\334,\271\334#\246\277?\34?0/7>*16*2:*1"
+ "6\202*2:\1*69\203*2:\1*16\202*2:\14*16.6:\10\26\31z{|\375\375\375IUW\275"
+ "\275\276_mp_`l\271\271\2729;I\302\302\304\203\376\376\376\4\331\331\331\200"
+ "\200\205\22\35!*16\203*2:\1*69\206*2:\1.6:\202*2:\3.1:.6:\31\34\32\202\30"
+ """3)\202,N<\7\2\24\12\3\3\3\252\261\276,N<x\205\210IUW\206\207\212\202_m"
+ "p\4x\205\210Teg\222\230\242<QN\202x\205\210\26Teg\16""4$3HE\21*$\30:,\10"
+ "\26\31\252\261\276_mp\2\24\12\30)$\2\24\12sz\205x\205\210sz\205IUW\243\245"
+ "\264<QN\244\244\252TY_\203\212\224m\204>\217\265\23\202\245\304\37\1\265"
+ "\321&\202\271\334#\252\275\341\"\13\275\341&\325\347`\345\361\223\226\231"
+ "\212\206\207\212\235\234\237\243\242\244\254\254\262\271\271\272\311\311"
+ "\311\331\331\335\202\343\342\345\1\355\355\361\202\361\361\365\7\365\365"
+ "\371\355\355\361\361\361\365\365\365\371\355\355\361\351\351\355\355\351"
+ "\361\202\361\361\365\11\365\365\371\355\355\361\341\341\351\335\335\345\341"
+ "\341\351\355\355\365\371\371\375\355\355\365\351\351\355\202\351\351\361"
+ "\5\341\341\351\351\351\355\371\375\375\365\361\371\365\365\371\202\375\375"
+ "\375\202\371\371\375\2\365\365\371\335\335\345\203\315\315\331\3\335\335"
+ "\345\371\371\375\376\376\376\205\375\375\375\7\376\376\376\371\371\371\345"
+ "\345\355\345\341\351\345\345\351\355\355\361\371\371\375\210\376\376\376"
+ "\17\375\375\375\365\365\371\361\361\361\361\361\365\371\371\371\375\375\375"
+ "\376\376\376\375\375\375\371\371\375\371\371\371\371\371\375\371\371\371"
+ "\365\365\371\371\371\371\375\375\375\203\376\376\376\205\375\375\375\202"
+ "\376\376\376\2\375\375\375\371\371\371\202\361\361\365\1\371\371\371\202"
+ "\375\375\375\1\371\371\371\202\361\361\365\4\371\371\375\376\376\376\375"
+ "\375\375\371\371\375\202\375\375\375\11\371\371\371\361\361\365\371\371\371"
+ "\375\375\375\371\371\375\375\375\375\371\371\375\361\361\365\365\365\371"
+ "\202\371\371\375\1\371\371\371\202\371\371\375\1\361\361\371\202\365\365"
+ "\371\3\351\351\355\341\341\351\355\355\365\202\365\365\371\203\375\375\375"
+ "\1\371\371\375\202\375\375\375\30\355\355\361\355\355\365\365\361\371\365"
+ "\365\371\365\365\375\361\361\371\341\341\351\355\355\361\376\376\376\371"
+ "\371\375\371\371\371\365\365\365\355\355\355\313\313\323\311\311\311\314"
+ "\314\315\271\271\272\243\242\244\201\221\33\222\247#\257\3232\276\334,\304"
+ "\3428\276\334,\202\275\341\"\5\301\341\"\275\341\"\301\341\"\275\341\"\301"
+ "\341\"\203\275\341\"\21\277\334=\271\326B\262\270\222_`l\257\255\267\365"
+ "\357\365TY_\251\244\260rqy\251\244\260\313\304\315\375\375\375\243\242\244"
+ "\217\217\222\251\244\260\217\217\222rqy\202\322\314\324\36\203\212\224\371"
+ "\363\372\203\212\224\303\303\313\341\330\336\333\333\341\342\333\342\264"
+ "\264\272\313\313\323\335\331\335\342\333\342\341\330\336\352\343\353\303"
+ "\274\304\5\10\15\375\375\375\235\234\237\312\305\321\332\320\330\303\274"
+ "\304\251\244\260\275\275\312IUW\275\275\312\203\212\224\251\300X\257\323"
+ "2UlF!98.1:\205*2:\1.6:\205*2:\1*16\202*2:\13\33#,.1:\365\365\365iku\302\302"
+ "\304_`l\376\376\376\5\10\15\376\376\376\0\0\0\314\314\315\203\376\376\376"
+ "\2\233\233\250\5\10\15\206*2:\1.1:\204*2:\2.1:.6:\202*2:\5""01?\"*,\30)$"
+ "\30""3)#C5\202\22\35!\11\243\245\264IUWx\205\210ix{<QN\231\243\251Teg\213"
+ "\222\233<QN\202x\205\210\36_mpx\205\210,N<\231\243\251_mp\222\230\242\2\24"
+ "\12\30)$\5\10\15<QN\203\212\224\5\10\15\22\35!\10\26\31\22\35!\275\275\312"
+ "<QN\231\243\251IUWx\205\210\203\212\224IUW\222\230\242UlF\222\247#\235\262"
+ "\"\245\304\37\247\326\31\263\333\36\271\334#\202\275\341\"'\301\341\"\275"
+ "\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341"
+ "\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\""
+ "\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275"
+ "\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341"
+ "\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\"\301\341\"\275\341\""
+ "\301\341\"\202\275\341\"\12\325\347`\345\361\223\226\231\212\206\207\212"
+ "\227\227\232\243\242\244\252\252\254\271\271\272\303\303\313\331\331\335"
+ "\202\343\342\345\1\355\355\361\202\361\361\365\1\365\365\371\202\355\355"
+ "\361\11\365\365\371\355\355\365\345\345\355\351\351\361\365\365\365\365\361"
+ "\371\361\361\371\355\355\365\341\341\351\202\335\335\345\3\351\351\361\371"
+ "\371\375\361\361\371\203\351\351\361\7\345\341\351\351\351\361\371\371\375"
+ "\365\361\371\361\361\365\375\375\375\376\376\376\203\371\371\375\1\345\345"
+ "\351\202\323\323\331\4\315\315\331\333\333\341\365\365\371\376\376\376\205"
+ "\375\375\375\3\376\376\376\375\375\375\355\355\361\202\345\345\351\2\355"
+ "\355\361\371\371\371\211\376\376\376\5\375\375\375\365\365\365\361\361\361"
+ "\365\365\371\375\375\375\202\376\376\376\11\375\375\375\371\371\375\371\371"
+ "\371\371\371\375\371\371\371\365\365\371\371\371\371\371\371\375\375\375"
+ "\375\206\376\376\376\3\375\375\375\371\371\375\365\365\371\202\361\361\365"
+ "\4\371\371\375\375\375\375\376\376\376\371\371\375\202\361\361\365\3\365"
+ "\365\371\375\375\375\376\376\376\202\375\375\375\4\376\376\376\375\375\375"
+ "\365\365\365\361\361\365\202\375\375\375\6\371\371\375\375\375\375\371\371"
+ "\375\361\361\365\365\365\371\376\376\376\202\371\371\375\3\375\375\375\365"
+ "\365\371\361\361\365\202\365\365\371\6\345\345\355\345\341\351\361\361\365"
+ "\365\365\375\365\365\371\375\375\375\203\371\371\375\2\375\375\375\371\371"
+ "\375\203\355\355\365\12\361\361\365\365\361\371\361\361\365\341\341\351\355"
+ "\355\365\376\376\376\371\371\375\371\371\371\365\365\365\351\351\355\202"
+ "\313\313\323\6\314\314\315\271\271\272\243\242\244\201\221\33\235\262\"\250"
+ "\3051\202\276\334,\1\305\345*\214\275\341\"\7\307\3330z{|\371\363\372iku"
+ "\200\200\205\243\245\264\203\212\224\202\342\333\342\6\365\357\365DEJz{|"
+ "\355\351\361\200\200\205\371\363\372\202\342\333\342\10\351\341\345\352\343"
+ "\353\251\244\260\213\222\233\375\375\375\342\333\342\302\302\304\313\304"
+ "\315\202\322\314\324\203\342\333\342\21\376\376\376\5\10\15\243\242\244\21"
+ "\20\27\375\367\375\362\354\362\322\314\324\235\234\237\322\314\324\200\200"
+ "\205iku\311\307\331ikuz\214^\34?0*2:*16\204*2:\2*16.6:\204*2:\17.6:*2:*1"
+ "6*2:.1:\5\10\15\264\264\272\271\271\272rqy\275\275\276\323\323\324\254\254"
+ "\262\217\217\222\203\212\224\345\345\351\202\376\376\376\4\365\365\365\0"
+ "\0\0*16.1:\203*2:\1.6:\202*2:\1*69\202*2:\1*69\202*2:\4.1:*16.6:/7>\202\30"
+ ")$\20!98\35""23\10\26\31\222\230\242Teg\203\212\224IUW\252\252\254<QNx\205"
+ "\210_mpTeg\213\222\233,N<\213\222\233IUW\202x\205\210\5Teg\222\230\242\35"
+ """23\10\26\31\30:,\202\6)\30\21\21*$\22\35!\30)$\3\3\3ix{x\205\210\203\212"
+ "\224Tegsz\205<QN\243\245\264_mpx\205\210m\204>\217\265\23\245\304\37\261"
+ "\305&\202\265\321&\1\271\334#\252\275\341\"\12\325\347`\345\361\223\226\231"
+ "\212\200\200\205\227\227\232\243\242\244\252\252\254\264\264\272\302\302"
+ "\304\331\331\331\202\343\342\345\1\351\351\355\202\361\361\365\1\365\365"
+ "\371\202\355\355\361\2\365\365\371\361\361\365\202\351\351\355\5\361\361"
+ "\365\361\361\371\361\361\365\355\355\361\343\342\345\202\335\335\345\22\345"
+ "\345\355\365\365\371\365\361\371\355\355\361\355\351\361\355\351\355\345"
+ "\345\355\351\351\361\371\371\375\365\361\371\355\355\365\375\375\375\376"
+ "\376\376\371\371\375\365\365\375\371\371\375\355\355\361\325\325\335\202"
+ "\323\323\331\3\331\331\335\361\361\365\376\376\376\205\375\375\375\202\376"
+ "\376\376\1\365\365\371\202\351\351\355\2\355\351\355\365\365\371\212\376"
+ "\376\376\1\371\371\371\202\361\361\365\1\371\371\371\203\376\376\376\2\375"
+ "\375\371\371\371\371\203\371\371\375\203\365\365\371\205\371\371\375\2\371"
+ "\371\371\365\365\371\202\361\361\365\12\365\365\371\371\371\371\375\375\375"
+ "\376\376\376\375\375\375\365\365\371\361\361\361\365\365\365\375\375\375"
+ "\376\376\376\203\375\375\375\5\376\376\376\371\371\371\361\361\365\365\365"
+ "\371\375\375\375\202\371\371\375\5\375\375\375\365\365\371\365\365\365\371"
+ "\371\371\376\376\376\202\375\375\375\12\371\371\375\365\361\371\361\361\365"
+ "\371\371\375\361\361\365\343\342\345\345\345\355\365\365\371\365\365\375"
+ "\365\365\371\203\371\371\375\202\375\375\375\31\371\371\371\355\355\365\361"
+ "\361\365\355\355\365\355\355\361\361\361\371\355\355\365\345\345\355\365"
+ "\361\371\376\376\376\371\371\375\371\371\371\365\365\365\345\345\351\313"
+ "\313\323\323\323\324\314\314\315\271\271\272\243\242\244\201\221\33\222\247"
+ "#\250\3051\276\334,\304\3428\276\334,\212\275\341\"(\271\334#\275\341\"\304"
+ "\3428\203\212\224\345\340\355_`l\251\244\260\200\200\205\273\265\277\341"
+ "\330\336\342\333\342\341\330\336\371\363\372\357\345\361\351\341\345\375"
+ "\367\375\206\207\212\355\351\361rqy\332\320\330\365\357\365\200\200\205\""
+ "#$\200\200\205\365\357\365\342\333\342\352\343\353\355\351\361\273\265\277"
+ "\351\341\345\341\330\336\335\331\335\365\361\371\273\265\277\352\343\353"
+ "\375\367\375\335\331\335\342\333\342\365\357\365\303\274\304\202\257\255"
+ "\267\6rqy\233\233\250rqyIUW,??.1:\202*2:\3*16*2:*16\205*2:\5.6:\33#,\"*,"
+ "*16*69\202*2:\3\3\3\3\222\230\242\244\244\252\202rqy\14\200\200\205\206\207"
+ "\212z{|\22\35!\335\331\335\376\376\376*16\10\26\31/7>*16*2:.6:\202.1:\2*"
+ "2:.1:\203*2:\3.1:*2:.1:\202*2:\36/7>*16\31\34\32,N<$>M\33#,\21*$,N<\10\26"
+ "\31<QN\203\212\224x\205\210<QN\213\222\233<QN\231\243\251<QNx\205\210ix{"
+ "x\205\210\213\222\233,N<\252\261\276\6)\30\16""4$\30:,\30)$\30""3)\34?0\30"
+ """3)\203\22\35!\16\2\24\12\275\275\312,??\231\243\251Tegsz\205ix{Teg\231"
+ "\243\251Teg\222\247#\235\262\"\245\304\37\247\326\31\202\263\333\36\202\271"
+ "\334#\250\275\341\"\15\302\335M\345\361\223\246\253\221z{|\217\217\222\243"
+ "\242\244\252\252\254\264\264\272\302\302\304\323\323\331\343\342\345\341"
+ "\341\341\351\351\355\202\361\361\365\5\365\361\371\361\361\365\351\351\361"
+ "\365\365\371\361\361\365\202\351\351\355\204\361\361\365\1\341\341\351\202"
+ "\335\335\345\4\345\341\351\365\365\371\361\365\371\355\355\365\202\351\351"
+ "\361\21\345\345\355\351\351\355\371\371\375\361\361\365\355\355\365\371\371"
+ "\375\376\376\376\371\371\375\365\365\371\371\371\375\365\365\365\335\335"
+ "\345\325\325\335\323\323\331\331\331\335\361\361\365\376\376\376\205\375"
+ "\375\375\202\376\376\376\6\371\371\371\351\351\355\343\342\345\345\345\351"
+ "\361\361\365\371\371\375\204\371\371\371\202\375\375\375\202\371\371\371"
+ "\2\365\365\371\365\365\365\202\355\355\361\1\361\361\365\202\371\371\371"
+ "\202\365\365\371\202\365\365\365\4\365\365\371\371\371\371\365\365\371\361"
+ "\361\365\202\355\355\361\1\361\361\361\202\361\361\365\7\361\361\361\355"
+ "\355\361\355\351\355\355\355\361\361\361\361\361\361\365\365\365\365\202"
+ "\365\365\371\7\361\361\365\361\361\361\361\361\365\371\371\375\376\376\376"
+ "\375\375\375\371\371\371\202\365\365\371\1\365\365\365\202\355\355\361\5"
+ "\371\371\371\375\375\375\371\371\375\375\375\375\371\371\375\202\365\365"
+ "\365\1\371\371\371\202\371\371\375\2\375\375\375\371\371\371\202\361\361"
+ "\365\7\371\371\375\355\351\355\341\341\351\345\345\355\365\365\371\365\365"
+ "\375\365\365\371\204\371\371\375\32\375\375\375\365\365\371\361\361\365\355"
+ "\355\365\351\351\355\351\351\361\361\361\365\355\355\365\345\345\351\365"
+ "\365\371\376\376\376\371\371\375\371\371\371\365\365\365\343\342\345\313"
+ "\313\323\323\323\331\314\314\315\271\271\272\244\244\252\201\234$\222\247"
+ "#\250\3051\257\3232\276\334,\304\3428\214\271\334#\13\264\277q\275\275\312"
+ "\217\217\222sz\205\275\275\312\206\207\212\322\314\324\362\354\362\351\341"
+ "\345\376\376\376\375\367\375\202\342\333\342\2\351\341\345\325\325\335\202"
+ "\311\301\310\14\355\351\361\365\357\365103\21\20\27-,-\376\376\376\352\343"
+ "\353\235\234\237\227\227\232\323\323\331\351\341\345\342\333\342\202\341"
+ "\330\336\2\352\343\353\343\342\345\202\342\333\342\202\351\341\345\16\342"
+ "\333\342\254\254\262\303\274\304\213\222\233rqy\243\245\264Teg.1:*2:*16*"
+ "2:*16*2:*16\204*2:\4.1:\22\35!_`l9;I\203\33#,\20*2:\"*,\5\10\15\331\331\331"
+ "\371\371\371\343\342\345\303\303\313\217\217\222sz\205\206\207\212\375\375"
+ "\375\275\275\276\0\0\0/7>.6:*16\202*2:\10*69*2:.6:.1:*2:.6:*2:.6:\202*2:"
+ "\1*16\202/7>\15\30)$\30""3)$>M\30:,!98\30""3)\6)\30<QNIUW\213\222\233<QN"
+ "\222\230\242IUW\202x\205\210!_mp\231\243\251IUW\3\3\3x\205\210\203\212\224"
+ "Teg\30""3)\30:,\34?0\30)$\34?0\30:,\34?0\30:,\30""3)\30)$\3\3\3ix{\203\212"
+ "\224x\205\210Teg\227\227\2323HE\222\230\242TY_\213\222\233m\204>\217\265"
+ "\23\235\262\"\245\304\37\247\326\31\265\321&\202\263\333\36\247\271\334#"
+ "\16\275\341\"\304\3428\324\343\223\262\270\222z{|\217\217\222\243\242\244"
+ "\252\252\254\264\264\272\302\302\304\323\323\331\343\342\345\335\335\345"
+ "\351\351\355\204\361\361\365\13\351\351\355\361\361\365\365\365\371\351\351"
+ "\361\351\351\355\361\361\365\365\361\371\355\355\365\361\361\365\345\341"
+ "\351\343\342\345\202\335\335\345\5\361\361\365\365\365\371\355\355\365\355"
+ "\355\361\355\351\361\202\351\351\361\202\365\365\371\5\351\351\361\371\371"
+ "\371\376\376\376\375\375\375\365\365\371\202\371\371\375\1\345\345\355\202"
+ "\325\325\335\2\331\331\335\355\355\361\206\375\375\375\26\376\376\376\371"
+ "\371\371\302\302\304fgf\243\242\244\331\331\335\345\345\351\314\314\315r"
+ "qyfgf\331\331\331\355\355\355\365\365\365\243\242\244\200\200\205z{|\200"
+ "\200\205\206\207\212\244\244\252\345\345\351\323\323\324\206\207\212\203"
+ "z{|\4\275\275\276\355\355\355\331\331\331\217\217\222\203z{|\20\217\217\222"
+ "\331\331\331\355\355\355\243\242\244\200\200\205rqyfgfz{|\200\200\205rqy"
+ "\200\200\205\252\252\254\323\323\324\343\342\345\355\351\355\365\365\371"
+ "\202\375\375\375\3\271\271\272\206\207\212\200\200\205\202z{|\17\243\242"
+ "\244\345\345\351\365\365\365\371\371\371\371\371\375\375\375\375\365\365"
+ "\371\361\361\365\261\261\264\227\227\232\355\355\355\365\365\365\371\371"
+ "\371\365\365\371\355\355\361\202\365\365\371\6\345\345\355\343\342\345\355"
+ "\351\355\371\371\375\365\361\371\365\365\371\203\371\371\375\34\375\375\375"
+ "\371\371\375\365\365\371\361\361\365\351\351\361\345\345\355\351\351\361"
+ "\355\355\365\355\355\361\351\351\361\371\371\375\375\375\375\371\371\375"
+ "\371\371\371\365\365\371\333\333\341\323\323\331\331\331\335\314\314\315"
+ "\271\271\272\243\242\244m\216\33\222\247#\250\3051\257\3232\277\334=\276"
+ "\334,\271\334#\213\263\333\36\33\226\231\212\333\334\352_`l\263\265\303f"
+ "gf\303\303\313\375\375\375\235\234\237\362\354\362\21\20\27IUW\376\376\376"
+ "\342\333\342\351\341\345\311\301\310\362\354\362\345\341\351\303\274\304"
+ "\365\361\371\273\265\277\21\20\27\243\245\264\355\351\355\362\354\362\352"
+ "\343\353\342\333\342\302\302\304\204\342\333\342\1\341\330\336\203\342\333"
+ "\342\14\351\341\345\371\363\372\352\343\353\264\264\272\257\255\267\263\265"
+ "\303TY_\275\275\312iku.1:*2:*16\202*2:\2*69*16\204*2:\16\33#,IUW\235\234"
+ "\237\206\207\212\227\227\232DEJIUW\33#,/7>\22\35!\5\10\15\"*,\200\200\205"
+ "\323\323\324\203\376\376\376\3\375\375\375\5\10\15\"*,\203*2:\1*69\202*2"
+ ":\1*69\211*2:\30*69*16\31\34\32,??&*4\37""8B\30""3)\30)$\2\24\12x\205\210"
+ "\231\243\251Teg<QN\203\212\224ix{TY_\34?0\231\243\251ix{x\205\210\2\24\12"
+ "\30""3)\10\26\31\6)\30\202\21*$\3\30:,\30""3)\30)$\205\34?0\15\30""3)\6)"
+ "\30\264\264\272.6:\231\243\251Teg\206\207\212_mpIUW\252\261\276Teg\222\247"
+ "#\217\265\23\202\245\304\37\1\247\326\31\252\263\333\36\15\277\334=\345\361"
+ "\223\302\312\225z{|\217\217\222\243\242\244\252\252\254\261\261\264\302\302"
+ "\304\323\323\324\343\342\345\341\341\341\345\345\351\203\361\361\365\31\365"
+ "\361\371\351\351\355\355\355\365\365\365\371\355\355\361\351\351\355\361"
+ "\361\365\365\365\371\355\355\361\361\361\365\345\345\355\335\335\345\343"
+ "\342\345\335\335\345\355\355\361\365\365\371\361\361\365\355\355\365\355"
+ "\355\361\351\351\361\351\351\355\365\361\371\371\371\375\351\351\361\365"
+ "\365\371\202\376\376\376\202\365\365\371\10\375\375\375\355\355\361\333\333"
+ "\341\325\325\341\331\331\335\351\351\355\371\371\375\376\376\376\203\375"
+ "\375\375\20\376\376\376\371\371\371\252\252\254103\0\0\0:::\252\252\254\235"
+ "\234\237DEJ\200\200\205\3\3\3IUW\271\271\272\345\345\351rqyz{|\202\5\10\15"
+ "*\235\234\237\217\217\222\335\335\335\252\252\254fgfTY_\3\3\3\206\207\212"
+ "\243\242\244\343\342\345\275\275\276fgfDEJ\0\0\0\217\217\222\275\275\276"
+ "\302\302\304\351\351\351rqy\227\227\232\31\34\32\3\3\3\311\311\311\261\261"
+ "\264rqyIUW\"#$-,-\243\242\244\341\341\341\361\361\361\371\371\371\371\371"
+ "\375z{|\227\227\232\31\34\32\3\3\3\265\265\265\252\252\254\335\335\335\361"
+ "\361\361\365\365\371\202\371\371\375\22\361\361\365\355\355\361fgf\"#$\302"
+ "\302\304\351\351\351\361\361\365\355\355\365\355\355\361\371\371\371\361"
+ "\361\365\343\342\345\341\341\351\355\355\365\371\371\375\361\361\365\365"
+ "\361\371\365\365\375\204\371\371\375\10\365\365\371\361\361\365\345\345\355"
+ "\345\341\351\345\345\355\355\355\365\355\355\361\355\355\365\202\375\375"
+ "\375\14\371\371\375\371\371\371\365\365\365\333\333\341\331\331\335\335\331"
+ "\335\314\314\315\271\271\272\244\244\252m\216\33\222\247#\241\272*\202\257"
+ "\3232\1\276\334,\213\263\333\36\14\276\334,sz\205\315\315\331sz\205\264\264"
+ "\272\200\200\205\206\207\212\233\233\250\5\10\15\375\375\375_`l\227\227\232"
+ "\202\342\333\342\17\352\343\353\311\301\310\313\313\323z{|\273\265\277\375"
+ "\366\371\371\371\371rqy\233\233\250\322\314\324\217\217\222\345\341\351\264"
+ "\264\272\357\345\361\341\330\336\202\342\333\342\1\341\330\336\202\342\333"
+ "\342\16\335\331\335\376\376\376\355\351\355rqy\375\367\375\335\331\331\244"
+ "\244\252\332\325\341_`l\264\264\272\200\200\205DEJ*2:*16\204*2:\27*16*2:"
+ ".6:&*49;I\206\207\212\200\200\205\217\217\222\3\3\3\227\227\232TY_\206\207"
+ "\212/7>TY_9;I\10\26\31\3\3\3\0\0\0\5\10\15&*4\243\242\244Teg\21\20\27\203"
+ "*2:\1*69\211*2:\1.6:\202*2:\4.6:/7>\31\34\32\30:,\202\37""8B\2\252\261\276"
+ "\10\26\31\202\22\35!\11\6)\30\231\243\251,N<\252\252\254IUW\275\275\312\2"
+ "\24\12\16""4$IUW\202\2\24\12\7\30)$\30:,\30""3)\3\3\3\10\26\31\30)$\21*$"
+ "\202\30)$\1\22\35!\202\30""3)\16\30)$\34?0#C5\6)\30_mp\203\212\224_mpIUW"
+ "\213\222\233TY_\252\261\276<QN\206\207\212m\204>\202\217\265\23\202\245\304"
+ "\37\202\247\326\31\251\263\333\36\14\324\343\223\302\312\225z{|\206\207\212"
+ "\235\234\237\252\252\254\265\265\265\302\302\304\323\323\324\341\341\341"
+ "\335\335\345\345\345\351\203\361\361\365\31\365\365\371\351\351\355\355\355"
+ "\361\365\365\371\355\355\365\351\351\355\355\355\365\365\365\371\355\355"
+ "\361\355\355\365\345\345\355\335\335\345\341\341\351\335\335\345\345\345"
+ "\355\365\365\371\361\361\365\355\355\365\355\355\361\355\351\361\351\351"
+ "\361\361\361\365\371\371\375\351\351\361\361\361\365\202\376\376\376\5\371"
+ "\371\375\361\361\365\375\375\375\365\365\371\341\341\351\202\333\333\341"
+ "\3\345\341\351\371\371\375\376\376\376\203\375\375\375\31\371\371\375\227"
+ "\227\232103\345\345\351\0\0\0\235\234\237\227\227\232\"#$\335\331\331\314"
+ "\314\315\3\3\3DEJ\227\227\232\335\331\331\331\331\331\252\252\254IUW\3\3"
+ "\3\252\252\254\275\275\276\331\331\331\335\335\335\261\261\264DEJ:::\202"
+ "\311\311\3110\335\335\335\351\351\351\275\275\276TY_\3\3\3\243\242\244\311"
+ "\311\311\314\314\315\343\342\345\323\323\324\275\275\276:::\31\34\32\311"
+ "\311\311\275\275\276\243\242\244\200\200\205z{|DEJ\16\20\16\227\227\232\341"
+ "\341\341\361\361\361\371\371\371\335\335\335\244\244\252\"#$\21\20\27\314"
+ "\314\315\302\302\304\335\335\335\355\355\355\365\365\371\375\375\375\371"
+ "\371\371\361\361\361\275\275\276TY_\3\3\3z{|\331\331\331\345\345\351\351"
+ "\351\355\361\361\365\371\371\375\351\351\361\343\342\345\341\341\351\202"
+ "\365\365\371\2\355\355\361\361\365\371\204\371\371\375\3\365\365\375\365"
+ "\365\371\355\355\361\202\341\341\351\4\345\345\351\355\355\365\355\355\361"
+ "\361\361\365\202\375\375\375\3\371\371\375\371\371\371\361\361\361\202\333"
+ "\333\341\7\335\335\335\314\314\315\275\275\276\243\242\244m\216\33\201\234"
+ "$\217\276$\203\257\3232\1\263\333\36\212\247\326\31\34\271\326B\233\233\250"
+ "\264\264\272rqy\257\255\267\251\244\260\352\343\353\371\363\372\217\217\222"
+ "z{|\0\0\0\233\233\250\313\304\315\352\343\353\341\330\336\371\363\372\227"
+ "\227\232\375\367\375\371\363\372\206\207\212\332\320\330\233\233\250_`l\375"
+ "\375\375\311\301\310\251\244\260\335\331\335\342\333\342\204\341\330\336"
+ "\16\335\331\335\342\333\342\376\376\376\31\34\32\203\212\224IUW\332\320\330"
+ "\243\242\244_`l\342\333\342rqy\222\230\242\203\212\224IUW\204*2:\25*16*2"
+ ":/7>&*4\10\26\31\33#,&*4\22\35!_`l&*4\5\10\15\254\254\262\206\207\212\22"
+ "\35!*2:\302\302\304\5\10\15\217\217\222_`l&*4\"*,\202\5\10\15\2\22\35!/7"
+ ">\207*2:\1*69\204*2:\2.6:.1:\202*2:\13*69*16\31\34\32,N<\37""8B\10\26\31"
+ "\203\212\224ix{\2\24\12\22\35!\30""3)\202\6)\30\20\203\212\224#C5\21*$\30"
+ """3)\34?0\10\26\31\22\35!\30:,\22\35!\30:,\6)\30x\205\210iku\277\313\327"
+ "\6)\30\21*$\204\22\35!\202\10\26\31\15\2\24\12\6)\30\34?0\252\261\276Teg"
+ "\243\245\264<QNx\205\210ix{_mp\213\222\233Teg\201\234$\202\217\265\23\2\233"
+ "\320\26\245\304\37\251\247\326\31\3\263\333\36\310\325t\324\343\223\202\206"
+ "\207\212\5\235\234\237\252\252\254\261\261\264\275\275\276\323\323\324\202"
+ "\341\341\341\1\343\342\345\203\361\361\365\10\365\365\371\355\355\361\351"
+ "\351\355\365\365\371\361\361\365\351\351\355\355\355\361\365\365\371\202"
+ "\355\355\361\7\351\351\355\335\335\345\341\341\351\335\335\345\341\341\351"
+ "\361\361\371\361\361\365\202\355\355\365\202\355\355\361\13\361\361\365\371"
+ "\371\375\355\351\361\355\355\361\375\375\375\376\376\376\371\371\375\361"
+ "\361\365\365\365\371\371\371\375\345\345\355\202\333\333\341\3\341\341\351"
+ "\365\365\371\376\376\376\203\375\375\375?\314\314\315IUW\355\351\355\200"
+ "\200\205\0\0\0\302\302\304\31\34\32\235\234\237\271\271\272iku\3\3\3\217"
+ "\217\222\311\311\311\323\323\324\343\342\345\341\341\341rqy\5\10\15fgf\275"
+ "\275\276\331\331\331\345\345\351\302\302\304\"#$\235\234\237\271\271\272"
+ "\314\314\315\341\341\341\361\361\361\351\351\351TY_\16\20\16z{|\275\275\276"
+ "\323\323\324\343\342\345\351\351\351\314\314\315:::\"#$\254\254\262\271\271"
+ "\272\311\311\311\314\314\315\252\252\254fgfDEJ\21\20\27\261\261\264\343\342"
+ "\345\361\361\365\361\361\361\243\242\244103\31\34\32\252\252\254\302\302"
+ "\304\341\341\341\355\355\361\371\371\371\371\371\375\361\361\365\355\355"
+ "\361\202z{|\5TY_-,-\275\275\276\331\331\335\345\345\351\202\365\365\371\7"
+ "\345\345\351\343\342\345\351\351\355\371\371\371\361\361\365\355\355\361"
+ "\365\361\371\202\371\371\375\202\365\365\375\202\365\365\371\1\345\345\355"
+ "\202\335\335\345\1\345\345\351\202\355\355\365\1\365\365\371\202\375\375"
+ "\375\15\371\371\375\371\371\371\355\355\361\333\333\341\343\342\345\335\335"
+ "\335\314\314\315\271\271\272\244\244\252m\216\33\201\234$\235\262\"\231\311"
+ "'\203\257\3232\212\247\326\31\10\251\300X\222\230\242\203\212\224\222\230"
+ "\242\257\255\267\233\233\250\355\351\355\342\333\342\202\200\200\205\3\376"
+ "\376\376\257\255\267\362\350\354\203\342\333\342\16\357\345\361\252\252\254"
+ "\365\357\365\235\234\237\343\342\345\311\301\310\22\35!\376\376\376\345\341"
+ "\351\261\261\264\345\341\351\342\333\342\341\330\336\342\333\342\202\335"
+ "\331\335\4\341\330\336\342\333\342\357\345\361\217\217\222\202\332\320\330"
+ "\10*16\375\375\375\257\255\267\332\320\330\222\230\242rqy\203\212\224_`l"
+ "\205*2:\1.1:\202\33#,\27\227\227\232DEJ&*4\33#,\10\26\31\"*,*16DEJ&*4\22"
+ "\35!\302\302\304&*4DEJ\206\207\212\10\26\31\261\261\264\10\26\31rqyDEJ&*"
+ "4\33#,*16.1:\203*2:\2*16*69\210*2:\7*16,??\31\34\32\6)\30$>M\37""8B\30:,"
+ "\202#C5\202\21*$\1\30""3)\202\30:,\2\2\24\12\22\35!\202\10\26\31\2\21*$\30"
+ """3)\202\34?0\6\30:,\21*$\16""4$x\205\2103HE\10\26\31\203\22\35!\202\10\26"
+ "\31\1\2\24\12\202\21*$\16sz\205_mp\244\244\252IUWx\205\210sz\205Teg\213\222"
+ "\233<QN\231\243\251Teg\213\222\233m\204>}\243\25\202\217\265\23\202\233\320"
+ "\26\251\247\326\31\12\325\347`\324\343\223\226\231\212\200\200\205\227\227"
+ "\232\252\252\254\261\261\264\275\275\276\313\313\323\341\341\341\202\343"
+ "\342\345\10\361\361\361\365\365\371\361\361\365\365\365\371\361\361\365\345"
+ "\345\355\361\361\365\365\365\371\202\355\355\361\2\365\365\371\355\355\365"
+ "\202\355\351\361\5\335\335\345\345\341\351\341\341\351\335\335\345\355\355"
+ "\365\202\361\361\365\202\355\355\365\20\355\355\361\355\355\365\365\365\371"
+ "\355\355\365\345\345\355\371\371\375\376\376\376\375\375\375\361\361\371"
+ "\361\361\365\371\371\375\361\361\365\341\341\351\333\333\341\343\342\345"
+ "\361\361\365\204\375\375\375\11\323\323\324\265\265\265\323\323\324\16\20"
+ "\16IUWDEJfgf\227\227\232\243\242\244\202\31\34\32\3\217\217\222\265\265\265"
+ "\331\331\331\202\355\355\355\10\252\252\254103\31\34\32\275\275\276\331\331"
+ "\331\351\351\351z{|-,-\202\302\302\3047\331\331\331\355\355\355\371\371\371"
+ "\361\361\361TY_\16\20\16\200\200\205\311\311\311\341\341\341\361\361\361"
+ "\361\361\365\311\311\311DEJ\"#$\261\261\264\311\311\311\335\335\335\351\351"
+ "\351\341\341\341\235\234\237\200\200\205\3\3\3fgf\323\323\324\355\355\355"
+ "\361\361\365\243\242\244:::\31\34\32\252\252\254\314\314\315\343\342\345"
+ "\365\365\371\375\375\375\365\365\371\361\361\361\323\323\331fgfTY_\206\207"
+ "\212\16\20\16\217\217\222\314\314\315\343\342\345\371\371\371\355\355\365"
+ "\345\341\351\341\341\351\355\355\365\371\371\375\355\351\361\355\355\361"
+ "\365\365\371\371\371\375\365\365\375\203\365\365\371\10\361\361\371\341\341"
+ "\351\333\333\341\335\335\345\345\341\351\355\355\365\361\361\365\371\371"
+ "\375\202\375\375\375\14\371\371\375\371\371\371\345\345\355\343\342\345\341"
+ "\341\351\335\331\335\314\314\315\271\271\272\243\242\244m\216\33\201\234"
+ "$\205\263\37\202\237\322,\2\257\3232\263\333\36\212\247\326\31\6\251\300"
+ "X\263\265\303\213\222\233\203\212\224\257\255\267\273\265\277\202\345\341"
+ "\351\4\371\360\365\375\367\375\342\333\342\352\343\353\205\342\333\342\17"
+ "\362\354\362\273\265\277\254\254\262\342\333\342\303\274\304_`l\251\244\260"
+ "\322\314\324\351\341\345\342\333\342\341\330\336\333\333\341\341\330\336"
+ "\342\333\342\341\330\336\203\342\333\342\14\345\341\351rqy\257\255\267\375"
+ "\375\375\334\325\335\311\301\310\303\274\304\263\265\303_`l\213\222\233_"
+ "`l*16\204*2:\6*16\10\26\31\343\342\345DEJ\244\244\252\331\331\335\202TY_"
+ "\1&*4\202\10\26\31\17\33#,/7>IUW\10\26\31\273\273\304/7>iku\217\217\222/"
+ "7>\264\264\272\10\26\31\22\35!TY_*2:*16\203*2:\1*16\202*2:\1.1:\203*2:\16"
+ "*69*2:*16*69\"*,\2\24\12Teg\37""8B\30:,\35""23\16""4$\30""3)\30:,\34?0\202"
+ "\30:,\4\22\35!\30)$\16""4$\6)\30\202Teg\12\16""4$\30""3)\22\35!\30""3)\30"
+ ")$\30:,\6)\30\30:,\10\26\31\5\10\15\202\2\24\12\202,??\14x\205\210Teg\231"
+ "\243\251_mpx\205\210sz\205IUW\231\243\251<QN\231\243\251Tegx\205\210\202"
+ "ix{\3x\205\210_mp\201\234$\203\217\265\23\1\245\304\37\202\233\320\26\247"
+ "\247\326\31\32\302\335M\324\343\223\237\243\221\200\200\205\227\227\232\252"
+ "\252\254\265\265\265\275\275\276\314\314\315\341\341\341\343\342\345\341"
+ "\341\341\355\355\361\365\365\371\361\361\365\365\365\371\365\361\371\345"
+ "\345\355\355\355\361\365\365\371\355\355\365\355\355\361\365\365\371\361"
+ "\361\365\351\351\355\355\355\361\202\341\341\351\15\345\345\355\335\335\345"
+ "\345\345\355\361\361\365\355\355\365\361\361\365\355\355\365\355\355\361"
+ "\355\355\365\365\365\371\365\361\371\345\345\355\365\365\371\202\376\376"
+ "\376\2\371\371\375\355\355\361\202\371\371\375\1\345\345\355\202\335\335"
+ "\345\2\355\355\361\371\371\375\203\375\375\375U\365\365\365\341\341\341\217"
+ "\217\222\16\20\16TY_fgfz{|\252\252\254iku\3\3\3z{|\217\217\222\302\302\304"
+ "\341\341\341\365\365\365\371\371\371\351\351\351fgf\3\3\3\217\217\222\323"
+ "\323\324\331\331\331103\200\200\205\302\302\304\323\323\324\343\342\345\365"
+ "\365\365\375\375\375\365\365\365TY_\5\10\15\206\207\212\314\314\315\345\345"
+ "\351\371\371\371\371\371\375\323\323\324DEJ\"#$\265\265\265\323\323\324\355"
+ "\355\355\371\371\371\361\361\361\351\341\345rqy\31\34\32:::\311\311\311\343"
+ "\342\345\355\355\355\244\244\252:::\31\34\32\252\252\254\323\323\324\351"
+ "\351\355\371\371\375\371\371\371\355\355\361\361\361\361\217\217\222fgf\243"
+ "\242\244\206\207\212\"*,DEJ\275\275\276\341\341\341\361\361\365\351\351\355"
+ "\343\342\345\345\345\351\365\365\371\361\361\365\351\351\355\355\355\361"
+ "\365\365\371\371\371\375\365\365\371\365\361\371\361\361\365\365\365\371"
+ "\355\355\361\202\333\333\341\5\335\335\345\345\345\355\361\361\371\365\365"
+ "\371\371\371\375\203\375\375\375\1\365\365\371\202\345\345\351\5\343\342"
+ "\345\331\331\335\314\314\315\271\271\272\244\244\252\202m\216\33\5\222\247"
+ "#\231\311'\237\322,\257\3232\237\322,\212\233\320\26\7\264\277q\243\245\264"
+ "iku\251\244\260\233\233\250\273\265\277\362\354\362\203\342\333\342\1\341"
+ "\330\336\207\342\333\342\7\351\341\345\342\333\342\313\304\315\376\376\376"
+ "\5\10\15_`l\357\345\361\202\342\333\342\23\341\330\336\333\333\341\335\331"
+ "\335\341\330\336\342\333\342\335\331\335\341\330\336\342\333\342\351\341"
+ "\345\357\345\361\362\350\354\342\333\342\351\341\345\257\255\267\303\274"
+ "\304\257\255\267z{|\243\245\264_`l\202*16\203*2:\24\22\35!\254\254\262\217"
+ "\217\222\323\323\324TY_IUW\345\345\351iku\217\217\222\243\242\244IUW\22\35"
+ "!\10\26\31\21\20\27*2:\33#,DEJIUW\22\35!\303\303\313\202\33#,\4\217\217\222"
+ "\311\311\311\33#,&*4\203*2:\3*69.6:.1:\205*2:\10*16*69.6:\31\34\32\6)\30"
+ "sz\205_`l\21*$\207\30:,\10\34?0\16""4$3HE\275\275\312ix{_mp\2\24\12\30""3"
+ ")\202\30:,\34\34?0\30""3)\6)\30\16""4$\6)\30IUW<QN\252\261\276Tegx\205\210"
+ "_`lsz\205\213\222\233<QN\213\222\2333HE\243\245\264Tegx\205\210Teg_mp\231"
+ "\243\251<QN\222\230\242<QN\231\243\251m\204>}\243\25\202\217\265\23\252\233"
+ "\320\26\17\271\326B\324\343\223\246\253\221\200\200\205\217\217\222\252\252"
+ "\254\261\261\264\275\275\276\314\314\315\333\333\341\343\342\345\335\335"
+ "\345\355\355\361\365\365\371\361\361\365\202\365\365\371\202\351\351\355"
+ "\14\365\365\371\361\361\365\355\355\361\365\365\371\361\361\365\351\351\355"
+ "\355\355\361\345\341\351\341\341\351\345\345\355\335\335\345\345\341\351"
+ "\202\355\355\365\202\361\361\365\202\355\355\365\17\361\361\365\365\365\371"
+ "\345\345\351\355\355\365\375\375\375\376\376\376\371\371\375\355\355\365"
+ "\361\361\371\375\375\371\355\355\365\345\345\351\343\342\345\351\351\355"
+ "\371\371\371\203\375\375\375+\371\371\371\343\342\345:::\31\34\32IUWz{|\235"
+ "\234\237\243\242\244\31\34\32-,-z{|\265\265\265\323\323\324\351\351\351\371"
+ "\371\371\375\375\371\365\365\365\206\207\212\21\20\27DEJ\311\311\311\252"
+ "\252\254\"#$\271\271\272\311\311\311\335\331\331\355\355\361\371\371\375"
+ "\375\375\375\361\361\365TY_\16\20\16\217\217\222\314\314\315\351\351\351"
+ "\371\371\371\375\375\375\331\331\331DEJ\31\34\32\265\265\265\323\323\324"
+ "\355\355\355\202\371\371\375\17\361\361\361z{|\31\34\32-,-\271\271\272\331"
+ "\331\331\345\345\351\252\252\254DEJ\21\20\27\243\242\244\314\314\315\355"
+ "\355\355\371\371\371\361\361\365\202\355\355\361\4fgf\16\20\16TY_IUW\202"
+ "\16\20\16\2\244\244\252\331\331\335\202\345\345\351\6\345\341\351\351\351"
+ "\361\371\371\371\355\355\361\345\345\355\355\355\365\202\365\365\371\13\365"
+ "\361\371\355\355\365\361\361\365\365\365\371\341\341\351\325\325\341\331"
+ "\331\335\333\333\341\345\345\355\365\361\371\365\365\371\203\375\375\375"
+ "\15\371\371\375\365\365\371\345\345\351\351\351\355\343\342\345\331\331\335"
+ "\314\314\315\271\271\272\243\242\244]y\30\201\234$\205\263\37\241\272*\202"
+ "\237\322,\2\257\3232\247\326\31\211\233\320\26\7\264\277q\243\245\264rqy"
+ "\243\245\264\257\255\267\251\244\260\351\341\345\202\343\342\345\3\342\333"
+ "\342\371\363\372\351\341\345\204\342\333\342\6\341\330\336\342\333\342\341"
+ "\330\336\342\333\342\371\360\365_`l\202(\26\20\3\227\227\232\352\343\353"
+ "\334\325\335\202\342\333\342\11\341\330\336\342\333\342\335\331\335\342\333"
+ "\342\341\330\336\342\333\342\341\330\336\342\333\342\341\330\336\202\342"
+ "\333\342\10\261\261\264\332\320\330\257\255\267iku\233\233\250_`l*2:*16\204"
+ "*2:\4\33#,DEJix{\10\26\31\202\22\35!\1\0\0\0\202\217\217\222\4TY_\365\357"
+ "\365z{|9;I\203\22\35!\11\33#,&*4/7>*16\217\217\222DEJ\302\302\304\10\26\31"
+ "*16\204*2:\1.6:\202*2:\1.1:\202*2:\12.1:*16*69\"*,\2\24\12ix{$>M\203\212"
+ "\224\10\26\31\34?0\204\30:,\2\30""3)\34?0\202\30:,\5\34?0,N<\6)\30\21*$\34"
+ "?0\202\30:,\1\6)\30\202\16""4$\5ix{IUW\243\245\264Tegsz\205\202_mp\6\235"
+ "\234\237,??\213\222\2333HE\244\244\252IUW\202ix{\14_mp\243\245\264<QN\222"
+ "\230\242IUW\231\243\251sz\205x\205\210_mpTeg}\243\25\205\263\37\202\217\265"
+ "\23\247\233\320\26\20\247\326\31\233\320\26\237\322,\324\343\223\302\312"
+ "\225z{|\217\217\222\243\242\244\261\261\264\275\275\276\311\311\311\331\331"
+ "\335\343\342\345\335\335\345\351\351\355\365\365\371\202\361\361\365\20\365"
+ "\365\371\355\355\361\345\345\355\361\361\365\365\365\371\355\355\361\361"
+ "\361\365\365\361\371\345\345\355\355\351\361\345\345\355\341\341\351\351"
+ "\351\355\345\341\351\335\335\345\355\355\361\202\355\355\365\10\361\361\371"
+ "\361\361\365\355\355\365\361\361\365\365\365\371\351\351\355\345\345\355"
+ "\371\371\375\202\376\376\376\10\365\365\371\355\355\361\371\371\375\365\365"
+ "\371\351\351\361\341\341\351\345\345\355\361\361\365\203\375\375\375\4\371"
+ "\371\375\261\261\264\16\20\16\0\0\0\202\200\200\205\25\271\271\272iku\3\3"
+ "\3fgf\235\234\237\275\275\276\335\331\331\361\361\361\375\375\375\376\376"
+ "\376\371\371\371\311\311\311IUW\16\20\16\252\252\254TY_fgf\302\302\304\323"
+ "\323\324\343\342\345\365\365\365\202\375\375\375\35\361\361\361TY_\16\20"
+ "\16\217\217\222\323\323\324\351\351\351\371\371\371\375\375\375\331\331\331"
+ "DEJ\"#$\265\265\265\323\323\324\355\355\355\371\371\375\376\376\376\365\365"
+ "\371\217\217\222\16\20\16""103\271\271\272\323\323\324\345\345\351\265\265"
+ "\265DEJ\16\20\16\244\244\252\323\323\324\355\351\355\202\355\355\361\15\361"
+ "\361\365\302\302\304:::fgf\261\261\264\252\252\254\217\217\222\3\3\3rqy\314"
+ "\314\315\331\331\335\335\335\345\345\345\355\202\365\365\371\20\345\345\351"
+ "\351\351\361\361\361\365\365\365\375\365\365\371\355\355\365\355\355\361"
+ "\365\365\371\355\355\361\333\333\341\325\325\335\325\325\341\333\333\341"
+ "\355\355\361\365\365\371\371\371\375\203\375\375\375\2\371\371\375\361\361"
+ "\365\202\345\345\355\12\335\335\345\331\331\331\314\314\315\271\271\272\243"
+ "\242\244]y\30m\216\33\201\234$\217\276$\231\311'\202\237\322,\212\233\320"
+ "\26\6\241\252v\257\255\267\206\207\212\222\230\242\273\265\277\313\304\315"
+ "\203\352\343\353\5\375\367\375\243\242\244\345\341\351\351\341\345\341\330"
+ "\336\204\342\333\342\202\341\330\336\14\342\333\342\332\320\330:::-,-\315"
+ "\315\331\342\333\342\334\325\335\342\333\342\343\342\345\341\330\336\334"
+ "\325\335\342\333\342\202\341\330\336\3\335\331\335\334\325\335\343\342\345"
+ "\203\342\333\342\6\257\255\267\273\265\277\305\304\321TY_\203\212\224_`l"
+ "\202*2:\1*16\203*2:\26&*4\33#,\22\35!\33#,/7>\376\376\376z{|iku\33#,\206"
+ "\207\212\341\341\341iku\302\302\304\313\313\323ikuIUW\22\35!\"*,\10\26\31"
+ "*16\33#,*2:\2029;I\3IUW\"*,.1:\203*2:\1*69\202*2:\15.6:*69*2:*16*69\16\20"
+ "\16\21*$ikuIUWsz\205IUW\6)\30\34?0\205\30:,\1\34?0\202\30:,\203\16""4$\7"
+ "\6)\30#C5\34?0z{|TY_\263\265\303TY_\202ix{\26TY_\254\254\2623HE\203\212\224"
+ "<QN\213\222\233Teg_mpx\205\210IUW\252\261\276<QN\222\230\242IUW\222\230\242"
+ "x\205\210ix{_mp\37""8B<QNTegz\214^\202}\243\25\3\217\265\23\233\320\26\217"
+ "\265\23\251\233\320\26\2\310\325t\324\343\223\202\206\207\212\20\243\242"
+ "\244\261\261\264\275\275\276\311\311\311\331\331\331\343\342\345\335\335"
+ "\335\345\345\355\365\365\365\365\365\371\361\361\365\365\365\371\361\361"
+ "\365\345\345\351\355\355\361\365\365\371\202\361\361\365\1\365\365\371\203"
+ "\351\351\355\1\341\341\351\202\351\351\355\4\335\335\345\345\345\351\355"
+ "\355\365\355\351\361\202\361\361\365\202\355\355\365\4\365\361\371\355\355"
+ "\361\341\341\351\365\365\371\202\375\375\375\22\371\371\375\355\355\361\361"
+ "\361\365\371\371\375\355\355\365\345\345\355\345\341\351\351\351\361\371"
+ "\371\371\371\375\375\371\371\375\365\365\365fgf\0\0\0fgf\200\200\205\265"
+ "\265\265\261\261\264\202\31\34\32K\217\217\222\235\234\237\227\227\232\335"
+ "\335\335\361\361\361\371\371\375\375\375\375\371\371\375\355\355\355z{|\3"
+ "\3\3fgf-,-\244\244\252\302\302\304\331\331\331\355\355\355\371\371\371\375"
+ "\375\375\375\375\371\371\360\365IUW\16\20\16\217\217\222\314\314\315\351"
+ "\351\351\371\371\371\375\375\375\335\331\331DEJ\31\34\32\265\265\265\323"
+ "\323\324\355\355\355\371\371\371\375\375\375\365\365\365\206\207\212\0\0"
+ "\0TY_\271\271\272\323\323\331\355\355\355\275\275\276DEJ\21\20\27\243\242"
+ "\244\314\314\315\343\342\345\351\351\355\361\361\365\365\365\365\200\200"
+ "\205\31\34\32\275\275\276\314\314\315\271\271\272rqy-,-\"#$\261\261\264\314"
+ "\314\315\333\333\341\355\351\361\341\341\341\235\234\237\311\311\311\345"
+ "\345\355\361\361\365\365\365\371\355\355\361\351\351\361\355\351\361\365"
+ "\365\371\341\341\351\202\323\323\331\5\325\325\335\335\335\345\361\361\371"
+ "\365\365\371\371\371\375\203\375\375\375\11\371\371\375\355\355\365\351\351"
+ "\355\345\345\351\335\335\345\325\325\335\311\311\311\264\264\272\243\242"
+ "\244\202m\216\33\3\201\234$\217\276$\231\311'\203\237\322,\211\233\320\26"
+ "\20\251\300X\233\233\250sz\205\233\233\250\273\265\277\264\264\272\352\343"
+ "\353\375\375\375-,-\227\227\232\5\10\15\217\217\222\365\357\365\342\333\342"
+ "\341\341\341\341\330\336\202\342\333\342\2\341\330\336\335\331\335\202\342"
+ "\333\342\31\257\255\267.1:\303\303\313\341\341\351\375\367\375\341\330\336"
+ "\311\301\310\352\343\353\335\331\335\342\333\342\341\330\336\351\341\345"
+ "\376\376\376\371\360\365\332\320\330\343\342\345\345\341\351\351\341\345"
+ "\257\255\267\342\333\342\251\244\260\200\200\205\222\230\242_`l*16\205*2"
+ ":\1*69\202.1:\27\22\35!\217\217\222\365\365\365\376\376\376TY_\355\355\355"
+ "rqy\0\0\0\10\26\31\261\261\264\254\254\262\33#,\200\200\205\323\323\324_"
+ "`lrqy\33#,\5\10\15&*4\217\217\222TY_*2:&*4\207*2:\16*16.1:*16*69\"*,\2\24"
+ "\12Teg$>M\203\212\224IUW\231\243\251\2\24\12\34?0\30:,\203\34?0\202\30:,"
+ "\33\6)\30\16""4$\6)\30Teg<QN\213\222\233TY_\213\222\233_mpix{sz\205TY_\213"
+ "\222\2333HE\231\243\251IUWsz\205_mpTY_\222\230\242TY_\222\230\2423HE\244"
+ "\244\252_mp\222\230\242ix{\202IUW\6\35""233HEIUWUlFm\204>m\216\33\203}\243"
+ "\25\202\217\265\23\252\233\320\26\24\310\325t\324\343\223\226\231\212\206"
+ "\207\212\235\234\237\254\254\262\275\275\276\303\303\313\323\323\331\343"
+ "\342\345\335\335\345\345\345\351\361\361\365\365\365\371\361\361\365\365"
+ "\365\371\361\361\365\345\345\351\345\345\355\365\361\371\202\361\361\365"
+ "\7\365\365\371\351\351\355\345\345\355\355\355\361\341\341\351\345\345\355"
+ "\355\355\361\202\335\335\345\4\355\351\361\351\351\355\355\355\365\361\361"
+ "\365\203\355\355\365\3\361\361\365\335\335\345\351\351\361\203\375\375\375"
+ "\2\361\361\365\351\351\355\202\365\365\371\7\351\351\355\345\345\351\345"
+ "\345\355\361\361\365\371\371\375\371\371\371\314\314\315\202\31\34\32\30"
+ "z{|\243\242\244\275\275\276fgf\3\3\3\252\252\254fgf103\217\217\222\323\323"
+ "\331\355\355\361\371\371\371\375\375\375\375\375\371\365\365\365\261\261"
+ "\264:::\0\0\0IUW\271\271\272\311\311\311\341\341\341\361\361\361\371\371"
+ "\375\202\375\375\375\21\361\361\361IUW\5\10\15\227\227\232\314\314\315\345"
+ "\345\351\365\365\365\371\371\375\341\341\341DEJ\31\34\32\265\265\265\323"
+ "\323\324\351\351\351\365\365\371\365\365\365\311\311\311\202\16\20\16\17"
+ "\252\252\254\302\302\304\341\341\341\361\361\361\311\311\311DEJ\16\20\16"
+ "\243\242\244\311\311\311\331\331\335\355\355\355\365\365\371\341\341\341"
+ "IUWDEJ\202\302\302\304\14\271\271\272TY_\200\200\205\5\10\15\217\217\222"
+ "\302\302\304\325\325\335\345\345\351iku\"#$DEJ\343\342\345\202\355\355\361"
+ "\6\351\351\355\345\341\351\355\355\365\355\355\361\325\325\335\315\315\331"
+ "\202\323\323\331\4\345\345\351\365\365\371\361\361\365\371\371\371\203\371"
+ "\371\375\16\365\365\371\355\355\361\345\345\355\343\342\345\335\335\335\325"
+ "\325\335\311\311\311\265\265\265\235\234\237]y\30m\216\33\201\234$\217\276"
+ "$\231\311'\203\237\322,\211\233\320\26\15\251\300Xx\205\210\200\200\205\233"
+ "\233\250\313\304\315\217\217\222\313\304\315IUW\345\340\355.1:\375\367\375"
+ "DEJ\355\351\361\204\342\333\342\35\341\330\336\341\341\341\355\351\355\351"
+ "\341\345\355\351\355\251\244\260\33#,rqy\235\234\237\206\207\212\227\227"
+ "\232\251\244\260\351\341\345\334\325\335\341\330\336\351\341\345\311\301"
+ "\3109;I\251\244\260\227\227\2329;I\375\366\371\323\323\331\233\233\250\371"
+ "\363\372\222\230\242\200\200\205sz\205DEJ\207*2:\34*16*2:.1:\33#,\"*,TY_"
+ "\235\234\237\376\376\376.6:\33#,\203\212\224\200\200\205&*4fgfrqy\254\254"
+ "\262fgf9;I\"*,\227\227\232\254\254\262iku\"*,IUW*2:*16*2:*16\204*2:\16.6"
+ ":.1:*16*69\16\20\16\30""3)_mpTY_ikuIUW\222\230\242,??\6)\30\34?0\202\30""3"
+ ")\1\6)\30\202\16""4$\36ix{<QN\222\230\242Tegx\205\210_mpTY_\203\212\224I"
+ "UW\213\222\233,??\222\230\242Tegrqyix{<QN\222\230\242TY_\222\230\2423HE\203"
+ "\212\224x\205\210\217\217\222sz\205,??3HE\35""233HEIUWUlF\202]y\30\204m\216"
+ "\33\202}\243\25\203\217\265\23\251\233\320\26\11\271\326B\324\343\223\246"
+ "\253\221\200\200\205\227\227\232\252\252\254\271\271\272\302\302\304\323"
+ "\323\324\203\341\341\341\2\355\355\361\365\365\371\202\361\361\365\12\365"
+ "\365\371\345\345\355\343\342\345\355\355\361\361\361\365\355\355\365\361"
+ "\361\365\355\355\361\345\341\351\355\351\361\202\345\345\351\6\355\355\365"
+ "\345\345\355\335\335\345\345\345\355\351\351\355\351\351\361\202\355\355"
+ "\365\202\355\355\361\1\361\361\365\202\341\341\351\10\371\371\371\371\371"
+ "\375\375\375\371\365\365\371\351\351\355\361\361\365\371\371\371\361\361"
+ "\365\202\345\345\355\7\355\355\361\371\371\371\365\365\371z{|\3\3\3ikurq"
+ "y\202\271\271\272\35\16\20\16\0\0\0TY_-,-\275\275\276\235\234\237\322\314"
+ "\324\351\351\351\371\371\371\371\371\375\375\375\371\365\365\371\335\335"
+ "\335fgf\3\3\3\227\227\232\265\265\265\314\314\315\345\345\351\365\365\365"
+ "\375\375\371\371\371\375\365\365\365\323\323\324DEJ\3\3\3\227\227\232\311"
+ "\311\311\341\341\341\202\361\361\361*\311\311\311103\3\3\3\206\207\212\302"
+ "\302\304\323\323\324\314\314\315\227\227\232\31\34\32\16\20\16\206\207\212"
+ "\275\275\276\323\323\324\345\345\351\355\351\355\302\302\304DEJ\0\0\0\243"
+ "\242\244\275\275\276\331\331\335\355\355\361\361\361\361\252\252\254\16\20"
+ "\16iku\275\275\276\302\302\304\314\314\315\243\242\244\200\200\205\0\0\0"
+ """103\265\265\265\323\323\324\323\323\331IUW:::DEJ\341\341\341\345\345\355"
+ "\351\351\355\202\341\341\351\2\361\361\365\341\341\351\203\315\315\331\5"
+ "\325\325\335\355\355\361\365\361\371\361\361\365\365\365\371\202\371\371"
+ "\375\17\371\371\371\361\361\365\355\355\361\345\341\351\343\342\345\333\333"
+ "\341\323\323\324\302\302\304\261\261\264\235\234\237]y\30m\216\33\201\234"
+ "$\205\263\37\217\276$\203\237\322,\211\233\320\26\7\237\322,rqy\233\233\250"
+ "\203\212\224\257\255\267\206\207\212\371\363\372\202\227\227\232\4\206\207"
+ "\212sz\205\257\255\267\352\343\353\204\342\333\342\12\341\330\336\342\333"
+ "\342\227\227\232\313\304\315\273\265\277\314\314\315&*4rqy\303\274\304\273"
+ "\265\277\202\303\274\304\1\342\333\342\202\335\331\335\16\355\351\355iku"
+ "\371\360\365&*4\357\345\361iku\334\325\335\345\341\351\244\244\252\371\363"
+ "\372\200\200\205\213\222\233\200\200\205DEJ\203*2:\1*16\203*2:\1*16\202*"
+ "2:\2*16\33#,\202\22\35!\7DEJ\33#,rqy\375\375\371x\205\210\206\207\212\323"
+ "\323\324\202TY_\11IUWTY_\376\376\376z{|x\205\210\217\217\222\22\35!\"*,."
+ "1:\205*2:(.6:*16.6:*16*69\"#$\2\24\12_mp$>M\203\212\224$>M\213\222\233TY"
+ "_\213\222\233\2\24\12\6)\30\34?0\16""4$x\205\210IUW\235\234\237sz\205Teg"
+ "sz\2053HE\233\233\250<QN\222\230\242,??\203\212\224ix{_mpx\205\2103HE\254"
+ "\254\262IUW\203\212\224<QNx\205\210\203\212\224\202ix{\4\30""3),??\35""2"
+ "3<QN\202UlF\203]y\30\2m\216\33]y\30\203m\216\33\202}\243\25\203\217\265\23"
+ "\2\233\320\26\217\265\23\250\233\320\26\31\237\322,\324\343\223\262\270\222"
+ "\200\200\205\217\217\222\244\244\252\271\271\272\302\302\304\323\323\324"
+ "\335\335\335\345\345\351\335\335\345\351\351\355\365\365\365\361\361\365"
+ "\355\355\361\361\361\365\355\355\361\335\335\345\345\345\351\361\361\365"
+ "\355\355\361\355\355\365\355\355\361\343\342\345\202\345\345\355\1\343\342"
+ "\345\202\355\355\361\5\335\335\345\343\342\345\351\351\355\345\345\351\351"
+ "\351\355\202\355\355\361\5\355\351\361\355\355\361\351\351\355\335\335\345"
+ "\355\355\361\203\371\371\371\30\355\355\365\345\345\351\361\361\365\365\365"
+ "\371\351\351\355\345\345\351\345\345\355\361\361\365\361\361\361TY_103fg"
+ "f\243\242\244\302\302\304\217\217\222\"#$:::\200\200\205\343\342\345\302"
+ "\302\304\275\275\276\323\323\324\345\345\351\365\365\365\203\371\371\371"
+ "<\355\355\355\206\207\212DEJ\265\265\265\275\275\276\331\331\331\355\355"
+ "\355\365\365\371\371\371\371\365\365\365\235\234\237z{|DEJ103TY_\217\217"
+ "\222\323\323\324\351\351\351\252\252\254z{|DEJ:::103z{|\217\217\222z{|IU"
+ "Wz{|rqy\265\265\265\311\311\311\335\335\335\351\351\351\217\217\222\200\200"
+ "\205IUW103TY_\206\207\212\323\323\324\314\314\315\206\207\212z{|-,-fgf\227"
+ "\227\232\275\275\276\261\261\264\206\207\212z{|:::-,-z{|\261\261\264\323"
+ "\323\331z{|DEJiku\335\331\335\343\342\345\202\335\335\345\3\351\351\355\355"
+ "\351\361\323\323\331\202\313\313\323\13\315\315\331\335\335\345\361\361\365"
+ "\355\355\361\355\355\365\361\361\365\365\365\371\371\371\371\365\361\371"
+ "\355\355\365\351\351\355\202\335\335\345\13\333\333\341\322\314\324\302\302"
+ "\304\254\254\262\227\227\232]y\30m\216\33\201\234$\205\263\37\217\276$\231"
+ "\311'\214\237\322,\13\200\200\205\263\265\303iku\321\320\336\257\255\267"
+ "\311\301\310\371\360\365\357\345\361\375\375\375\371\360\365\352\343\353"
+ "\206\342\333\342\35\362\350\354\235\234\237\254\254\262\273\265\277\362\354"
+ "\362\257\255\267\233\233\250\342\333\342\322\314\324\261\261\264\313\304"
+ "\315\343\342\345\334\325\335\341\330\336\334\325\335\375\375\375&*4\375\375"
+ "\375iku&*4\365\357\365sz\205\217\217\222\355\351\371iku\243\245\264iku*2"
+ ":*16\202*2:\1*16\204*2:\1.6:\203*2:\14.1:*16\33#,*16\10\26\31""9;I\227\227"
+ "\232\351\351\355\200\200\205\331\331\331\351\351\351\5\10\15\202\33#,\6\371"
+ "\371\371\355\355\361*16\33#,.6:.1:\203*2:\1.6:\204*2:%*16*69\2\24\12\30""3"
+ ")Tegikuix{TY_sz\205,??\263\265\303\30:,ix{_mp\200\200\205\203\212\224TY_"
+ "ix{\35""23\261\261\2643HE\222\230\242IUWix{\203\212\224TY_\203\212\224!9"
+ "8\243\245\264<QN\213\222\233Tegsz\205\222\230\242IUWTeg\35""23\202,??\3I"
+ "UWUlFm\204>\202]y\30\205m\216\33\2}\243\25m\216\33\202}\243\25\202\205\263"
+ "\37\202\217\276$\202\231\311'\252\237\322,\16\324\343\223\313\315\253\200"
+ "\200\205\217\217\222\243\242\244\265\265\265\302\302\304\314\314\315\331"
+ "\331\335\343\342\345\333\333\341\343\342\345\361\361\365\361\361\361\203"
+ "\355\355\361\202\333\333\341\4\351\351\355\355\355\361\355\351\355\355\355"
+ "\361\202\335\335\345\11\345\345\351\335\335\345\351\351\355\355\355\365\341"
+ "\341\351\331\331\335\345\345\351\341\341\351\343\342\345\203\351\351\355"
+ "\5\345\345\351\351\351\355\333\333\341\343\342\345\361\361\365\202\365\365"
+ "\365\31\361\361\365\345\341\351\343\342\345\361\361\365\355\355\361\345\345"
+ "\351\343\342\345\351\351\355\355\355\355\235\234\237\252\252\254\235\234"
+ "\237\302\302\304\323\323\324\261\261\264z{|\265\265\265\335\335\335\271\271"
+ "\272\275\275\276\323\323\324\341\341\341\345\345\351\355\355\361\361\361"
+ "\365\202\365\365\365\7\355\355\355\275\275\276\217\217\222\271\271\272\314"
+ "\314\315\341\341\341\355\355\355\202\365\365\365\16\361\361\361\217\217\222"
+ "\227\227\232\243\242\244\235\234\237\217\217\222\243\242\244\311\311\311"
+ "\341\341\341\217\217\222\243\242\244\271\271\272\275\275\276\271\271\272"
+ "\202\265\265\265\2\302\302\304\331\331\331\202\275\275\276\6\311\311\311"
+ "\323\323\324\343\342\345\351\351\351\217\217\222\314\314\315\202\323\323"
+ "\324\5\314\314\315\254\254\262\314\314\315\271\271\272\261\261\264\203\323"
+ "\323\324\4\235\234\237\302\302\304\243\242\244\271\271\272\202\323\323\324"
+ "\7\331\331\331\265\265\265\244\244\252\302\302\304\303\303\313\302\302\304"
+ "\331\331\331\202\331\331\335\32\323\323\331\333\333\341\355\355\361\331\331"
+ "\335\313\313\323\312\305\321\305\304\321\313\313\323\341\341\351\355\355"
+ "\361\345\345\351\351\351\355\355\355\361\355\355\365\361\361\365\355\355"
+ "\361\355\351\361\341\341\351\331\331\335\333\333\341\331\331\335\314\314"
+ "\315\275\275\276\254\254\262\227\227\232]y\30\202m\216\33\2\201\234$\217"
+ "\276$\202\231\311'\2\237\322,\231\311'\211\237\322,\11\241\252v\243\245\264"
+ "rqy\257\255\267\313\304\315\257\255\267\352\343\353\342\333\342\341\330\336"
+ "\203\342\333\342\202\341\330\336\202\342\333\342\15\341\330\336\342\333\342"
+ "\365\357\365\311\301\310\352\343\353\200\200\205\312\305\321\200\200\205"
+ "\243\242\244\265\265\265\251\244\260\322\314\324\342\333\342\202\334\325"
+ "\335\17\343\342\345\341\330\336&*4\206\207\212\362\354\362\375\375\375\342"
+ "\333\342\264\264\272\322\314\324\305\304\321TY_\213\222\233iku*2:*16\211"
+ "*2:\1*16\203*2:\3*16*2:.6:\203\22\35!\3/7>\264\264\272IUW\202\33#,\5DEJT"
+ "Y_\5\10\15*2:*16\211*2:\24*16*69\30)$\2\24\12sz\205$>Msz\205\37""8B\213\222"
+ "\233IUWsz\205Tegz{|\203\212\2243HE\222\230\242!98\213\222\233<QNsz\205\202"
+ "ix{\17\203\212\224,??\213\222\2333HE\231\243\2513HEx\205\210sz\205x\205\210"
+ "\222\230\242,??3HE\21*$3HE<QN\202UlF\204]y\30\207m\216\33\3\201\234$}\243"
+ "\25\201\234$\202\205\263\37\203\217\276$\205\231\311'\243\237\322,\1\231"
+ "\311'\203\237\322,\17\310\325t\324\343\223\226\231\212\206\207\212\227\227"
+ "\232\254\254\262\275\275\276\311\311\311\323\323\331\341\341\341\331\331"
+ "\335\333\333\341\355\355\355\355\351\355\351\351\355\202\351\351\351\3\333"
+ "\333\341\323\323\331\335\335\345\202\351\351\351\24\351\351\355\335\335\345"
+ "\325\325\335\343\342\345\333\333\341\335\335\345\355\351\355\345\345\351"
+ "\323\323\331\331\331\335\335\335\345\331\331\335\343\342\345\345\345\351"
+ "\343\342\345\335\335\345\341\341\351\333\333\341\323\323\331\351\351\355"
+ "\203\355\355\355\5\345\345\351\333\333\341\345\345\351\355\351\355\343\342"
+ "\345\202\335\335\345\17\343\342\345\335\335\335\314\314\315\302\302\304\314"
+ "\314\315\335\331\331\335\335\335\323\323\324\302\302\304\275\275\276\302"
+ "\302\304\314\314\315\335\335\335\345\345\351\351\351\355\202\351\351\351"
+ "\202\355\355\355\7\355\351\355\341\341\341\331\331\331\323\323\324\331\331"
+ "\331\341\341\341\355\351\355\202\355\355\355\4\351\351\351\343\342\345\323"
+ "\323\324\311\311\311\202\275\275\276\2\302\302\304\323\323\324\202\335\335"
+ "\335\4\323\323\324\311\311\311\275\275\276\271\271\272\202\275\275\276\203"
+ "\302\302\304\7\314\314\315\323\323\324\341\341\341\351\351\351\345\345\351"
+ "\331\331\331\311\311\311\203\271\271\272\17\302\302\304\323\323\324\335\331"
+ "\335\331\331\331\314\314\315\271\271\272\252\252\254\265\265\265\314\314"
+ "\315\323\323\324\303\303\313\264\264\272\254\254\262\261\261\264\275\275"
+ "\276\202\271\271\272\36\312\305\321\331\331\335\335\331\335\331\331\331\315"
+ "\315\331\313\313\323\335\335\345\343\342\345\312\305\321\303\303\313\275"
+ "\275\312\302\302\304\315\315\331\345\345\351\343\342\345\335\335\345\345"
+ "\345\351\345\345\355\351\351\355\345\345\355\351\351\355\345\345\351\325"
+ "\325\335\323\323\331\331\331\335\323\323\324\303\303\313\271\271\272\252"
+ "\252\254\227\227\232\202]y\30\3m\216\33}\243\25\205\263\37\202\217\276$\213"
+ "\231\311'\10\251\300X\203\212\224\206\207\212\213\222\233\321\320\336\251"
+ "\244\260\314\314\315\352\343\353\203\342\333\342\202\362\354\362\17\376\376"
+ "\376\351\341\345\335\331\335\341\330\336\335\331\335\352\343\353\303\274"
+ "\304\235\234\237\257\255\267\273\265\277\313\304\315\303\274\304\357\345"
+ "\361\355\351\355\342\333\342\203\334\325\335\12\335\331\335\365\357\365\375"
+ "\375\375\345\341\351\334\325\335\342\333\342\325\325\341\235\234\237\375"
+ "\367\375\203\212\224\202\200\200\205\2IUW.1:\205*2:\1*16\206*2:\22*69*2:"
+ "*16.1:*16.6:*16&*4\"*,\5\10\15\33#,.1:.6:&*4\22\35!*2:*16.6:\204*2:\1*16"
+ "\202*2:\2.1:*2:\202*16\15\16\20\16\16""4$Tegsz\205_`lTY_\203\212\224IUW\213"
+ "\222\2333HE\213\222\233IUWsz\205\202TY_\22\203\212\224TY_\203\212\224*69"
+ "\222\230\242IUW\203\212\224Teg_mp\203\212\224sz\205\203\212\224\35""23,?"
+ "?\30""3)3HEIUWUlF\204]y\30\2m\216\33]y\30\206m\216\33\4}\243\25\201\234$"
+ "}\243\25\201\234$\205\205\263\37\202\217\276$\254\231\311'\11\251\300X\324"
+ "\343\223\246\253\221z{|\217\217\222\244\244\252\265\265\265\302\302\304\314"
+ "\314\315\202\331\331\335\16\323\323\331\343\342\345\345\345\351\343\342\345"
+ "\341\341\341\343\342\345\335\331\335\313\313\323\323\323\324\335\335\345"
+ "\341\341\341\343\342\345\331\331\335\313\313\323\202\325\325\335\1\323\323"
+ "\331\202\343\342\345\14\323\323\331\313\313\323\325\325\335\323\323\324\323"
+ "\323\331\331\331\335\333\333\341\331\331\335\325\325\335\331\331\335\313"
+ "\313\323\325\325\335\204\343\342\345\6\331\331\331\323\323\331\341\341\341"
+ "\343\342\345\331\331\335\325\325\335\202\331\331\335\202\323\323\324\1\323"
+ "\323\331\202\335\335\335\1\331\331\331\203\323\323\324\1\331\331\331\202"
+ "\341\341\341\202\343\342\345\1\341\341\341\203\343\342\345\5\341\341\341"
+ "\335\331\331\331\331\331\335\331\331\341\341\341\204\343\342\345\3\341\341"
+ "\341\331\331\331\323\323\324\202\314\314\315\202\323\323\324\202\335\335"
+ "\335\2\331\331\331\323\323\324\206\314\314\315\2\323\323\324\331\331\331"
+ "\202\335\335\335\4\335\331\335\323\323\331\323\323\324\313\313\323\203\314"
+ "\314\315\202\323\323\324\30\335\331\335\331\331\331\314\314\315\271\271\272"
+ "\275\275\276\314\314\315\323\323\324\311\311\311\302\302\304\273\273\304"
+ "\275\275\276\311\311\311\302\302\304\264\264\272\273\273\304\313\313\323"
+ "\331\331\331\323\323\331\313\313\323\303\303\313\313\313\323\333\333\341"
+ "\312\305\321\273\273\304\202\273\265\277\5\273\273\304\323\323\324\335\335"
+ "\345\323\323\331\325\325\335\202\333\333\341\14\335\335\345\335\335\335\341"
+ "\341\341\325\325\335\313\313\323\322\314\324\323\323\331\314\314\315\275"
+ "\275\276\265\265\265\244\244\252\217\217\222\202]y\30\202m\216\33\2\201\234"
+ "$\205\263\37\215\217\276$\7\200\200\205\243\245\264sz\205\313\313\323\261"
+ "\261\264\257\255\267\352\343\353\202\342\333\342\7\362\354\362\200\200\205"
+ "\303\303\313\21\20\27\312\305\321\362\350\354\342\333\342\203\341\330\336"
+ "\202\351\341\345\25\371\363\372\243\242\244\254\254\262\335\331\335\332\320"
+ "\330\325\325\335\322\314\324\342\333\342\355\351\361\371\363\372\206\207"
+ "\212\233\233\250\352\343\353\342\333\342\322\314\324\251\244\260\257\255"
+ "\267\342\333\342iku\243\245\264sz\205\203.1:\204*2:\202*16\1.6:\203*2:\3"
+ "*16*2:*16\203*2:\1*16\203*2:\1.6:\204*2:\4.1:*2:*16.1:\206*2:\2*16.1:\202"
+ "*69\32\30)$\2\24\12<QN\37""8B\213\222\233$>M\222\230\242,??\222\230\242_"
+ "mpTegix{,??\243\245\264<QN\213\222\233!98\203\212\224_mpikusz\205IUW\243"
+ "\245\264_mpx\205\210\35""23\202!98\1""3HE\202UlF\206]y\30\2m\216\33]y\30"
+ "\205m\216\33\6}\243\25\201\234$}\243\25\201\234$\205\263\37}\243\25\204\205"
+ "\263\37\256\217\276$\12\231\311'\237\322,\302\312\225\262\270\222z{|\206"
+ "\207\212\227\227\232\252\252\254\271\271\272\302\302\304\202\323\323\324"
+ "\4\314\314\315\323\323\331\335\335\335\331\331\335\203\323\323\331\6\311"
+ "\311\311\303\303\313\323\323\324\323\323\331\331\331\331\323\323\331\202"
+ "\311\311\311\5\323\323\324\312\305\321\323\323\331\335\331\335\323\323\324"
+ "\202\303\303\313\5\314\314\315\303\303\313\313\313\323\323\323\324\322\314"
+ "\324\202\313\313\323\4\303\303\313\302\302\304\323\323\331\335\331\331\203"
+ "\331\331\331\10\312\305\321\314\314\315\331\331\331\323\323\331\322\314\324"
+ "\313\313\323\323\323\324\323\323\331\202\323\323\324\202\331\331\331\204"
+ "\323\323\324\224\331\331\331\205\323\323\324\203\331\331\331\212\323\323"
+ "\324\2\313\313\323\314\314\315\202\323\323\324\1\331\331\331\204\323\323"
+ "\324\10\331\331\331\323\323\324\311\311\311\273\273\304\302\302\304\323\323"
+ "\324\314\314\315\302\302\304\202\273\273\304\3\302\302\304\313\313\323\311"
+ "\311\311\202\264\264\272\11\302\302\304\313\313\323\322\314\324\303\303\313"
+ "\275\275\276\271\271\272\313\313\323\311\311\311\264\264\272\202\257\255"
+ "\267\11\264\264\272\273\273\304\323\323\324\314\314\315\303\303\313\314\314"
+ "\315\313\313\323\323\323\324\313\313\323\202\323\323\331\2\303\303\313\302"
+ "\302\304\202\311\311\311\5\273\273\304\264\264\272\261\261\264\243\242\244"
+ "\217\217\222\203]y\30\2m\216\33}\243\25\203\205\263\37\213\217\276$\17\241"
+ "\252v\200\200\205sz\205\213\222\233\365\357\365\227\227\232\314\314\315\352"
+ "\343\353\375\375\375TY_\342\333\342\5\10\15\376\376\376_`l\355\351\361\202"
+ "\341\330\336\2\342\333\342\341\330\336\202\342\333\342\26\334\325\335\332"
+ "\320\330\322\314\324\303\274\304\264\264\272\261\261\264\343\342\345\342"
+ "\333\342TY_\217\217\222_`l\244\244\252\357\345\361\345\341\351\312\305\321"
+ "\217\217\222\375\375\375\233\233\250rqy\203\212\224TY_\30)$\202\"*,\5*16"
+ ".6:/7>.1:*16\205*2:\1*16\204*2:\1*16\210*2:\202*16\203*2:\1*16\204*2:\2*"
+ "69*2:\202*16\33\"*,\16\20\16,N<]y\30<QNTegikux\205\210IUWx\205\210*69\231"
+ "\243\2513HE\231\243\251IUWikux\205\210IUW\213\222\233IUW\231\243\2513HEI"
+ "UW\30)$!983HE<QN\202UlF\210]y\30\206m\216\33\2}\243\25\201\234$\202}\243"
+ "\25\3\201\234$}\243\25\201\234$\210\205\263\37\2\217\276$\205\263\37\251"
+ "\217\276$\20\205\263\37\217\276$\264\277q\302\312\225\200\200\205z{|\217"
+ "\217\222\243\242\244\254\254\262\271\271\272\302\302\304\311\311\311\302"
+ "\302\304\303\303\313\323\323\324\314\314\315\203\311\311\311\3\302\302\304"
+ "\271\271\272\275\275\276\202\311\311\311\6\314\314\315\302\302\304\264\264"
+ "\272\302\302\304\275\275\276\302\302\304\202\314\314\315\3\275\275\276\264"
+ "\264\272\273\273\304\202\275\275\276\203\302\302\304\4\273\273\304\302\302"
+ "\304\264\264\272\302\302\304\204\314\314\315\5\311\311\311\273\265\277\302"
+ "\302\304\314\314\315\311\311\311\202\302\302\304\204\311\311\311\203\314"
+ "\314\315\202\311\311\311\237\314\314\315\203\311\311\311\1\303\303\313\203"
+ "\302\302\304\202\311\311\311\207\314\314\315\12\311\311\311\273\273\304\261"
+ "\261\264\275\275\276\311\311\311\302\302\304\271\271\272\264\264\272\261"
+ "\261\264\271\271\272\202\302\302\304\13\257\255\267\254\254\262\264\264\272"
+ "\302\302\304\303\303\313\273\273\304\261\261\264\251\244\260\275\275\276"
+ "\302\302\304\257\255\267\203\244\244\252\3\252\252\254\273\265\277\311\311"
+ "\311\202\271\271\272\1\273\273\304\203\302\302\304\13\311\311\311\302\302"
+ "\304\264\264\272\271\271\272\273\273\304\275\275\276\261\261\264\254\254"
+ "\262\252\252\254\235\234\237\217\217\222\203]y\30\202m\216\33\202}\243\25"
+ "\214\205\263\37\24\217\276$\200\200\205\243\245\264iku\305\304\321\357\345"
+ "\361\235\234\237\332\320\330\375\375\375\21\20\27\217\217\22201?\200\200"
+ "\205iku\375\366\371\334\325\335\341\330\336\343\342\345\352\343\353\251\244"
+ "\260\202\273\265\277\35\243\242\244\254\254\262\264\264\272\312\305\321\345"
+ "\341\351\352\343\353\251\244\260\365\361\371TY_\273\265\277\251\244\260\227"
+ "\227\232\332\325\341\257\255\267\334\325\335\332\325\341TY_\243\245\264s"
+ "z\205\"*,\31\34\32\"#$\30)$\"*,\"#$&*4*16*2:.1:\211*2:\1*16\206*2:\3*16*"
+ "2:*69\206*2:\1.6:\202*2:\2.1:*2:\202*16\2\31\34\32\21*$\202]y\30\23Teg\30"
+ """3)\243\245\264,??\213\222\233<QNsz\205x\205\210_`l\213\222\233,??\222\230"
+ "\242<QN\244\244\252,??3HE\21*$!98<QN\202UlF\212]y\30\207m\216\33\2}\243\25"
+ "m\216\33\202}\243\25\1\201\234$\202}\243\25\4\205\263\37}\243\25\205\263"
+ "\37}\243\25\262\205\263\37\14\251\300X\302\312\225\216\225{rqy\200\200\205"
+ "\217\217\222\235\234\237\252\252\254\265\265\265\271\271\272\264\264\272"
+ "\265\265\265\202\275\275\276\204\271\271\272\12\254\254\262\252\252\254\264"
+ "\264\272\271\271\272\275\275\276\264\264\272\254\254\262\261\261\264\264"
+ "\264\272\261\261\264\202\275\275\276\1\271\271\272\202\252\252\254\7\254"
+ "\254\262\252\252\254\254\254\262\264\264\272\261\261\264\254\254\262\261"
+ "\261\264\202\252\252\254\11\271\271\272\275\275\276\271\271\272\275\275\276"
+ "\271\271\272\261\261\264\252\252\254\265\265\265\271\271\272\203\264\264"
+ "\272\207\271\271\272\1\275\275\276\213\271\271\272\206\275\275\276\1\271"
+ "\271\272\212\275\275\276\2\271\271\272\275\275\276\210\271\271\272\210\275"
+ "\275\276\7\271\271\272\254\254\262\244\244\252\254\254\262\271\271\272\265"
+ "\265\265\252\252\254\202\244\244\252\17\252\252\254\265\265\265\271\271\272"
+ "\244\244\252\235\234\237\243\242\244\254\254\262\264\264\272\261\261\264"
+ "\244\244\252\235\234\237\244\244\252\264\264\272\252\252\254\235\234\237"
+ "\203\227\227\232\14\244\244\252\264\264\272\254\254\262\244\244\252\252\252"
+ "\254\254\254\262\261\261\264\254\254\262\261\261\264\271\271\272\252\252"
+ "\254\244\244\252\202\254\254\262\1\252\252\254\202\244\244\252\3\243\242"
+ "\244\217\217\222\206\207\212",
+};
+
diff --git a/src/libXNVCtrl/NVCtrl.c b/src/libXNVCtrl/NVCtrl.c index 2f8b352..f20b9be 100644 --- a/src/libXNVCtrl/NVCtrl.c +++ b/src/libXNVCtrl/NVCtrl.c @@ -13,8 +13,8 @@ #include <stdlib.h> #include <X11/Xlibint.h> #include <X11/Xutil.h> -#include "Xext.h" -#include "extutil.h" +#include <X11/extensions/Xext.h> +#include <X11/extensions/extutil.h> #include "NVCtrlLib.h" #include "nv_control.h" @@ -154,6 +154,44 @@ void XNVCTRLSetAttribute ( SyncHandle (); } +Bool XNVCTRLSetAttributeAndGetStatus ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int attribute, + int value +){ + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlSetAttributeAndGetStatusReq *req; + xnvCtrlSetAttributeAndGetStatusReply rep; + Bool success; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlSetAttributeAndGetStatus, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlSetAttributeAndGetStatus; + req->screen = screen; + req->display_mask = display_mask; + req->attribute = attribute; + req->value = value; + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + UnlockDisplay (dpy); + SyncHandle (); + + success = rep.flags; + return success; +} + + Bool XNVCTRLQueryAttribute ( Display *dpy, @@ -243,6 +281,51 @@ Bool XNVCTRLQueryStringAttribute ( return exists; } + +Bool XNVCTRLSetStringAttribute ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int attribute, + char *ptr +){ + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlSetStringAttributeReq *req; + xnvCtrlSetStringAttributeReply rep; + int size; + Bool success; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + size = strlen(ptr)+1; + + LockDisplay (dpy); + GetReq (nvCtrlSetStringAttribute, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlSetStringAttribute; + req->screen = screen; + req->display_mask = display_mask; + req->attribute = attribute; + req->length += ((size + 3) & ~3) >> 2; + req->num_bytes = size; + Data(dpy, ptr, size); + + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + UnlockDisplay (dpy); + SyncHandle (); + + success = rep.flags; + return success; +} + + Bool XNVCTRLQueryValidAttributeValues ( Display *dpy, int screen, @@ -403,6 +486,494 @@ Bool XNVCtrlSelectNotify ( return True; } + +Bool XNVCTRLQueryDDCCILutSize ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int *red_entries, + unsigned int *green_entries, + unsigned int *blue_entries, + unsigned int *red_bits_per_entries, + unsigned int *green_bits_per_entries, + unsigned int *blue_bits_per_entries +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCILutSizeReply rep; + xnvCtrlQueryDDCCILutSizeReq *req; + unsigned int buf[6]; + Bool exists; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + + GetReq (nvCtrlQueryDDCCILutSize, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCILutSize; + req->screen = screen; + req->display_mask = display_mask; + + if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + + _XRead(dpy, (char *)(&buf), 24); + + *red_entries = buf[0]; + *green_entries = buf[1]; + *blue_entries = buf[2]; + *red_bits_per_entries = buf[3]; + *green_bits_per_entries = buf[4]; + *blue_bits_per_entries = buf[5]; + + UnlockDisplay (dpy); + SyncHandle (); + exists = rep.flags; + return exists; +} + + +Bool XNVCTRLQueryDDCCISinglePointLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int *red_value, + unsigned int *green_value, + unsigned int *blue_value +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCISinglePointLutOperationReply rep; + xnvCtrlQueryDDCCISinglePointLutOperationReq *req; + unsigned int buf[4]; + Bool exists; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + + GetReq (nvCtrlQueryDDCCISinglePointLutOperation, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCISinglePointLutOperation; + req->screen = screen; + req->display_mask = display_mask; + req->offset = offset; + + if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + + _XRead(dpy, (char *)(&buf), 12); + + *red_value = buf[0]; + *green_value = buf[1]; + *blue_value = buf[2]; + + UnlockDisplay (dpy); + SyncHandle (); + + exists=rep.flags; + return exists; +} + + +Bool XNVCTRLSetDDCCISinglePointLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int red_value, + unsigned int green_value, + unsigned int blue_value +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlSetDDCCISinglePointLutOperationReply rep; + xnvCtrlSetDDCCISinglePointLutOperationReq *req; + Bool success; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlSetDDCCISinglePointLutOperation, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlSetDDCCISinglePointLutOperation; + req->screen = screen; + req->display_mask = display_mask; + req->offset = offset; + req->red_value = red_value; + req->green_value = green_value; + req->blue_value = blue_value; + + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + UnlockDisplay (dpy); + SyncHandle (); + + success = rep.flags; + return success; +} + + +Bool XNVCTRLQueryDDCCIBlockLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int color, // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT + unsigned int offset, + unsigned int size, + unsigned int **value +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCIBlockLutOperationReply rep; + xnvCtrlQueryDDCCIBlockLutOperationReq *req; + Bool exists; + int length, slop; + char *ptr; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlQueryDDCCIBlockLutOperation, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCIBlockLutOperation; + req->screen = screen; + req->display_mask = display_mask; + req->color=color; + req->offset=offset; + req->size=size; + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + length = rep.length; + slop = rep.num_bytes & 3; + ptr = (char *) Xmalloc(rep.num_bytes); + if (! ptr) { + _XEatData(dpy, length); + UnlockDisplay (dpy); + SyncHandle (); + return False; + } else { + _XRead(dpy, (char *) ptr, rep.num_bytes); + if (slop) _XEatData(dpy, 4-slop); + } + exists = rep.flags; + if(exists) { + *value=(unsigned int *)ptr; + } + UnlockDisplay (dpy); + SyncHandle (); + return exists; +} + + +Bool XNVCTRLSetDDCCIBlockLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int color, // NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT + unsigned int offset, + unsigned int size, + unsigned int *value +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlSetDDCCIBlockLutOperationReq *req; + xnvCtrlSetDDCCIBlockLutOperationReply rep; + Bool success; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlSetDDCCIBlockLutOperation, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlSetDDCCIBlockLutOperation; + req->screen = screen; + req->display_mask = display_mask; + req->color = color; + req->offset = offset; + req->size = size; + req->num_bytes = size << 2; + req->length += (req->num_bytes + 3) >> 2; + Data(dpy, (char *)value, req->num_bytes ); + + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + UnlockDisplay (dpy); + SyncHandle (); + + success = rep.flags; + return success; +} + + +Bool XNVCTRLSetDDCCIRemoteProcedureCall ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int size, + unsigned int *red_lut, + unsigned int *green_lut, + unsigned int *blue_lut, + unsigned int *increment +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlSetDDCCIRemoteProcedureCallReq *req; + xnvCtrlSetDDCCIRemoteProcedureCallReply rep; + unsigned int nbytes; + Bool success; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlSetDDCCIRemoteProcedureCall, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlSetDDCCIRemoteProcedureCall; + req->screen = screen; + req->display_mask = display_mask; + req->size = size; + nbytes= size << 2; + req->num_bytes = nbytes * 4; + req->length += (req->num_bytes + 3) >> 2; + req->offset = offset; + Data(dpy, (char *)red_lut, nbytes ); + Data(dpy, (char *)green_lut, nbytes ); + Data(dpy, (char *)blue_lut, nbytes ); + Data(dpy, (char *)increment, nbytes ); + + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + UnlockDisplay (dpy); + SyncHandle (); + + success = rep.flags; + return success; +} + +/* XXXAlternative: Instead of getting the manufacturer string from the server, + * get the manufacturer Id instead, and have controller_manufacturer assigned + * to a static string that would not need to be malloc'ed and freed. + */ +Bool XNVCTRLQueryDDCCIDisplayControllerType ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned char **controller_manufacturer, + unsigned int *controller_type +) +{ + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCIDisplayControllerTypeReply rep; + xnvCtrlQueryDDCCIDisplayControllerTypeReq *req; + Bool exists; + int length, numbytes, slop; + char *ptr; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + GetReq (nvCtrlQueryDDCCIDisplayControllerType, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCIDisplayControllerType; + req->screen = screen; + req->display_mask = display_mask; + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + length = rep.length; + numbytes = rep.size; + slop = numbytes & 3; + ptr = (char *) Xmalloc(numbytes); + if (! ptr) { + _XEatData(dpy, length); + UnlockDisplay (dpy); + SyncHandle (); + return False; + } else { + _XRead(dpy, (char *) ptr, numbytes); + if (slop) _XEatData(dpy, 4-slop); + } + exists = rep.flags; + if(exists) { + *controller_type=rep.controller_type; + *controller_manufacturer=ptr; + } + UnlockDisplay (dpy); + SyncHandle (); + return exists; +} + + +Bool NVCTRLQueryDDCCICapabilities ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int **nvctrl_vcp_supported, + unsigned int **possible_values_offset, + unsigned int **possible_values_size, + unsigned int **nvctrl_vcp_possible_values, + unsigned int **nvctrl_string_vcp_supported +) +{ + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCICapabilitiesReply rep; + xnvCtrlQueryDDCCICapabilitiesReq *req; + Bool exists=1; + int length, numbytes, slop; + char *ptr, *p; + int len1, len2, len3, len4, len5; + int step; + + *nvctrl_vcp_supported=*nvctrl_vcp_possible_values=*possible_values_offset=*possible_values_size=*nvctrl_string_vcp_supported=NULL; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + + GetReq (nvCtrlQueryDDCCICapabilities, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCICapabilities; + + req->screen = screen; + req->display_mask = display_mask; + if (!_XReply (dpy, (xReply *) &rep, 0, False)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + length = rep.length; + numbytes = rep.num_bytes; + slop = numbytes & 3; + ptr = (char *) Xmalloc(numbytes); + if (! ptr) { + _XEatData(dpy, length); + UnlockDisplay (dpy); + SyncHandle (); + return False; + } else { + _XRead(dpy, (char *) ptr, numbytes); + if (slop) _XEatData(dpy, 4-slop); + } + exists = rep.flags; + if(exists) { + p = ptr; + len1 = len2 = len3 = (NV_CTRL_DDCCI_LAST_VCP+1) << 2 ; + len4 = rep.possible_val_len << 2; + len5 = (NV_CTRL_STRING_LAST_ATTRIBUTE+1) << 2; + *nvctrl_vcp_supported=(unsigned int *) Xmalloc(len1); + *possible_values_offset=(unsigned int *) Xmalloc(len2); + *possible_values_size=(unsigned int *) Xmalloc(len3); + if(len4) + *nvctrl_vcp_possible_values=(unsigned int *) Xmalloc(len4); + *nvctrl_string_vcp_supported=(unsigned int *) Xmalloc(len5); + memcpy((char*)*nvctrl_vcp_supported, p, len1); p += len1; + memcpy((char*)*possible_values_offset, p, len2); p += len2; + memcpy((char*)*possible_values_size, p, len3); p += len3; + if(len4) { + memcpy((char*)*nvctrl_vcp_possible_values, p, len4); p += len4; + } + memcpy((char*)*nvctrl_string_vcp_supported, p, len5); + } + free(ptr); + UnlockDisplay (dpy); + SyncHandle (); + return exists; +} + +Bool XNVCTRLQueryDDCCITimingReport ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int *sync_freq_out_range, + unsigned int *unstable_count, + unsigned int *positive_h_sync, + unsigned int *positive_v_sync, + unsigned int *h_freq, + unsigned int *v_freq +) { + XExtDisplayInfo *info = find_display (dpy); + xnvCtrlQueryDDCCITimingReportReply rep; + xnvCtrlQueryDDCCITimingReportReq *req; + unsigned int buf[6]; + Bool exists; + + if(!XextHasExtension(info)) + return False; + + XNVCTRLCheckExtension (dpy, info, False); + + LockDisplay (dpy); + + GetReq (nvCtrlQueryDDCCITimingReport, req); + req->reqType = info->codes->major_opcode; + req->nvReqType = X_nvCtrlQueryDDCCITimingReport; + req->screen = screen; + req->display_mask = display_mask; + + if (!_XReply(dpy, (xReply *) &rep, 0, xFalse)) { + UnlockDisplay (dpy); + SyncHandle (); + return False; + } + + _XRead(dpy, (char *)(&buf), 24); + + exists = rep.flags; + + *sync_freq_out_range = buf[0]; + *unstable_count = buf[1]; + *positive_h_sync = buf[2]; + *positive_v_sync = buf[3]; + *h_freq = buf[4]; + *v_freq = buf[5]; + + UnlockDisplay (dpy); + SyncHandle (); + + return exists; +} + static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire) { XExtDisplayInfo *info = find_display (dpy); diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h index caea219..7561010 100644 --- a/src/libXNVCtrl/NVCtrl.h +++ b/src/libXNVCtrl/NVCtrl.h @@ -804,13 +804,20 @@ #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274 14 #define NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274 15 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_50_00_SMPTE296 16 -#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274 17 -#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274 18 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_24_00_SMPTE274 17 //deprecated +#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274 17 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_23_98_SMPTE274 18 //deprecated +#define NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274 18 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_30_00_SMPTE296 19 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_29_97_SMPTE296 20 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_25_00_SMPTE296 21 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_24_00_SMPTE296 22 #define NV_CTRL_GVO_VIDEO_FORMAT_720P_23_98_SMPTE296 23 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 24 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 25 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 26 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 27 +#define NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 28 /* @@ -1006,14 +1013,1347 @@ * XXX what sync error attributes do we need to expose? */ +/* + * NV_CTRL_GPU_OVERCLOCKING_STATE - query the current or set a new + * overclocking state; the value of this attribute controls the + * availability of additional overclocking attributes (see below). + * + * Note: this attribute is unavailable unless overclocking support + * has been enabled in the X server (by the user). + */ + +#define NV_CTRL_GPU_OVERCLOCKING_STATE 88 /* RW- */ +#define NV_CTRL_GPU_OVERCLOCKING_STATE_NONE 0 +#define NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL 1 + + +/* + * NV_CTRL_GPU_{2,3}D_CLOCK_FREQS - query or set the GPU and memory + * clocks of the device driving the X screen. New clock frequencies + * are tested before being applied, and may be rejected. + * + * Note: if the target clocks are too aggressive, their testing may + * render the system unresponsive. + * + * Note: while this attribute can always be queried, it can't be set + * unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL. Since + * the target clocks may be rejected, the requester should read this + * attribute after the set to determine success or failure. + */ + +#define NV_CTRL_GPU_2D_CLOCK_FREQS 89 /* RW- */ +#define NV_CTRL_GPU_3D_CLOCK_FREQS 90 /* RW- */ + + +/* + * NV_CTRL_GPU_DEFAULT_{2,3}D_CLOCK_FREQS - query the default memory + * and GPU core clocks of the device driving the X screen. + */ + +#define NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS 91 /* R-- */ +#define NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS 92 /* R-- */ + +/* + * NV_CTRL_GPU_CURRENT_CLOCK_FREQS - query the current GPU and memory + * clocks of the graphics device driving the X screen. + */ + +#define NV_CTRL_GPU_CURRENT_CLOCK_FREQS 93 /* R-- */ + + +/* + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS - Holds the last calculated + * optimal 3D clock frequencies found by the + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION process. Querying this + * attribute before having probed for the optimal clocks will return + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID + * + * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the + * optimal clock detection process is unavailable. + */ + +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS 94 /* R-- */ +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID 0 + + +/* + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION - set to _START to + * initiate testing for the optimal 3D clock frequencies. Once + * found, the optimal clock frequencies will be returned by the + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS attribute asynchronously + * (using an X event, see XNVCtrlSelectNotify). + * + * To cancel an ongoing test for the optimal clocks, set the + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION attribute to _CANCEL + * + * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the + * optimal clock detection process is unavailable. + */ + +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION 95 /* -W- */ +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START 0 +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL 1 + + +/* + * NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE - query this + * variable to know if a test is currently being run to + * determine the optimal 3D clock frequencies. _BUSY means a + * test is currently running, _IDLE means the test is not running. + * + * Note: unless NV_CTRL_GPU_OVERCLOCKING_STATE is set to _MANUAL, the + * optimal clock detection process is unavailable. + */ + +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE 96 /* R-- */ +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_IDLE 0 +#define NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY 1 + + + +/************************************************************************* + * DDC/CI VCP codes * + * From the VESA Monitor Control Command Set (MCCS) Standard - Version 2 * + *************************************************************************/ + +#define NV_CTRL_DDCCI_ON 1 +#define NV_CTRL_DDCCI_OFF 0 + +/************************************* + * DDC/CI VCP CODES: GEOMETRY ADJUST * + *************************************/ + +/* Increasing (decreasing) this value moves the image toward the right + * (left) side of the screen. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_POSITION 97 /* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the width + * of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_SIZE 98 /* RWD */ + +/* Increasing (decreasing) this value will cause the right and left sides + * of the image to become more (less) convex. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_PINCUSHION 99 /* RWD */ + +/* Increasing (decreasing) this value will move the center section of the + * image towards the right(left) side of the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_PINCUSHION_BALANCE 100/* RWD */ + +/* Increasing (decreasing) this value will shift the red pixels to the right + * (left) across the image and the blue pixels left (right) across the image + * with respect to the green pixels. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_CONVERGENCE 101/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * density of pixels in the image center. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_LINEARITY 102/* RWD */ + +/* Increasing (decreasing) this value shifts the density of pixels from + * the left (right) side to the right (left) side of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_LINEARITY_BALANCE 103/* RWD */ + +/* Increasing (decreasing) this value moves the image toward the + * top (bottom) edge of the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_POSITION 104/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * height of the image + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_SIZE 105/* RWD */ + +/* Increasing (decreasing) this value will cause the top and bottom + * edges of the image to become more (less) convex. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_PINCUSHION 106/* RWD */ + +/* Increasing (decreasing) this value will move the center section of + * the image toward the top (bottom) edge of the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_PINCUSHION_BALANCE 107/* RWD */ + +/* Increasing (decreasing) this value shifts the red pixels up (down) + * across the image and the blue pixels down (up) across the image + * with respect to the green pixels. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_CONVERGENCE 108/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * density of scan lines in the image center. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_LINEARITY 109/* RWD */ + +/* Increasing (decreasing) this value shifts the density of scan lines + * from the top (bottom) end to the bottom (top) end of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_LINEARITY_BALANCE 110/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * degree of keystone distortion in the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_KEYSTONE 111/* RWD */ + +/* Increasing (decreasing) this value shifts the top section of the + * image to the right (left) with respect to the bottom section of the + * image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_KEY_BALANCE 112/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * degree of trapezoid distortion in the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_TRAPEZOID 113/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * ratio between the horizontal size at the top of the image and the + * horizontal size at the bottom of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_TRAPEZOID 114/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * ratio between the vertical size at the left of the image and the + * vertical size at the right of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_VERTICAL_TRAPEZOID 115/* RWD */ + +/* Increasing (decreasing) this value rotates the image (counter) + clockwise about the center point of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_TILT 116/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * distance between the left and right sides at the top of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_TOP_CORNER 117/* RWD */ + +/* Increasing (decreasing) this value moves the top end of the + * image to the right (left). + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_TOP_CORNER_BALANCE 118/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * distance between the left and right sides at the bottom of the + * image. + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_BOTTOM_CORNER 119/* RWD */ + +/* Increasing (decreasing) this value moves the bottom end of the + * image to the right (left). + * Type: Range + */ +#define NV_CTRL_DDCCI_GEOMETRY_BOTTOM_CORNER_BALANCE 120/* RWD */ + + +/************************************** + * DDC/CI VCP CODES: PRESET SELECTION * + **************************************/ + +/* Restore all factory presets including brightness / contrast, + * geometry, color and TV defaults. + * NV__CTRL_DDCCI_ON causes defaults to be restored + * A value of NV_CTRL_DDCCI_OFF shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS 121/* -WD */ + +/* Restores factory defaults for brightness and contrast adjustments. + * NV_CTRL_DDCCI_ON causes defaults to be restored + * A value of NV_CTRL_DDCCI_OFF shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_BRIGHTNESS_CONTRAST 122/* -WD */ + +/* Restore factory defaults for geometry adjustments. + * NV_CTRL_DDCCI_ON causes defaults to be restored + * A value of NV_CTRL_DDCCI_OFF shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_GEOMETRY 123/* -WD */ + +/* Restore factory defaults for color settings. + * NV_CTRL_DDCCI_ON causes defaults to be restored + * A value of NV_CTRL_DDCCI_OFF shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_COLOR 124/* -WD */ + +/* Restore factory defaults for TV functions. + * NV_CTRL_DDCCI_ON causes defaults to be restored + * A value of NV_CTRL_DDCCI_OFF shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_PRESET_RESTORE_DEFAULTS_TV 125/* -WD */ + +/* Store / Restore the user saved values for current mode. + * - NV_CTRL_DDCCI_PRESET_SETTINGS_STORE_CURRENT: + * Store current settings in the monitor. + * - NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS: + * Restore factory defaults for current mode. If no factory + * defaults then restore user values for current mode. + * - All other values are reserved and shall be ignored. + * Type: Integer + */ +#define NV_CTRL_DDCCI_PRESET_SETTINGS 126/* -WD */ +#define NV_CTRL_DDCCI_PRESET_SETTINGS_STORE_CURRENT 1 +#define NV_CTRL_DDCCI_PRESET_SETTINGS_RESTORE_FACTORY_DEFAULTS 2 + + +/*************************************** + * DDC/CI VCP CODES: IMAGE ADJUSTMENTS * + ***************************************/ + +/* + * Increasing (decreasing) this value will increase (decrease) the + * Brightness of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_BRIGHTNESS 127/* RWD */ + +/* + * Increasing (decreasing) this value will increase (decrease) the + * Contrast of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_CONTRAST 128/* RWD */ + +/* + * Turn on / off an auto setup function (periodic or event driven) + * 0 and 3 : Shall be ignored + * NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_OFF : Turn auto setup off + * NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_ON : Turn auto setup on + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE 129/* -WD */ +#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_OFF 1 +#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP_TOGGLE_ON 2 + +/* + * Perform autosetup function (H/V position, clock, clock phase, A/D + * converter, etc) + * NV_CTRL_OFF : Indicates that auto-setup is not active + * NV_CTRL_ON : Perform autosetup + * >=2 : Shall be ignored + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_AUTO_SETUP 130/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * sampling clock frequency + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_CLOCK 131/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * phase shift of the sampling clock + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_CLOCK_PHASE 132/* RWD */ + +/* Allows the display to specify the minimum increment in which it + * can adjust the color temperature. + * This will be used in conjunction with + * NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_REQUEST, Color temperature request. + * Values of 0 and > 5000 are invalid and shall be ignored. + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT 133/* R-D */ + +/* Allows a specified color temperature (in °K) to be requested. If + * display is unable to achieve requested color temperature, then it + * should move to the closest possible temperature. + * A value of 0 shall be treated as a request for a color temperature + * of 3000°K. Values greater than 0 shall be used as a multiplier of + * the color temperature increment (read using + * NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT) and the + * result added to the base value of 3000°K + * Example: + * If NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT returns a value of + * 50°K and NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_INCREMENT sends a + * value of 50 (decimal) then the display shall interpret this as a + * request to adjust the color temperature to 5500°K + * (3000 + (50 * 50))°K = 5500°K + * Notes: + * 1) Applications using this function are recommended to read the + * actual color temperature after using this command and taking + * appropriate action. + * 2) This control is only recommended if the display can produce a + * continuously (at defined increment, see VCP code 0Bh) variable + * color temperature. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_COLOR_TEMPERATURE_REQUEST 134/* RWD */ + +/* Select a specified color temperature. + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_SRGB : sRGB + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_NATIVE : Display native + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_4000K : 4000 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_5000K : 5000 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_6500K : 6500 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_7500K : 7500 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_8200K : 8200 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_9300K : 9300 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_10000K : 10000 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 : 11500 K + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 : User 1 + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER2 : User 2 + * NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER3 : User 3 + * 00 and >=0E shall be ignored + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET 135/* RWD */ +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_SRGB 0x01 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_NATIVE 0x02 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_4000K 0x03 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_5000K 0x04 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_6500K 0x05 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_7500K 0x06 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_8200K 0x07 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_9300K 0x08 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_10000K 0x09 +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_11500K 0x0A +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER1 0x0B +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER2 0x0C +#define NV_CTRL_DDCCI_IMAGE_SELECT_COLOR_PRESET_USER3 0x0D + +/* + * Increasing (decreasing) this value will increase (decrease) the + * luminance of red pixels. + * The value returned shall be an indication of the actual red gain at + * the current color temperature and not be normalized. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_RED_VIDEO_GAIN 136/* RWD */ + +/* + * Increasing (decreasing) this value will increase (decrease) the + * luminance of green pixels. + * The value returned shall be an indication of the actual green gain at + * the current color temperature and not be normalized. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_GREEN_VIDEO_GAIN 137/* RWD */ + +/* + * Increasing (decreasing) this value will increase (decrease) the + * luminance of blue pixels. + * The value returned shall be an indication of the actual blue gain at + * the current color temperature and not be normalized. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_BLUE_VIDEO_GAIN 138/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * black level of red pixels. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_RED_VIDEO_BLACK_LEVEL 139/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * black level of green pixels. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_GREEN_VIDEO_BLACK_LEVEL 140/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * black level of blue pixels. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_BLUE_VIDEO_BLACK_LEVEL 141/* RWD */ + +/* Increasing (decreasing) this value will adjust the focus of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_FOCUS 142/* RWD */ + +/* Increasing (decreasing) this value controls the horizontal picture + * moiré cancellation. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_HORIZONTAL_MOIRE 143/* RWD */ + +/* Increasing (decreasing) this value controls the vertical picture + * moiré cancellation. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_VERTICAL_MOIRE 144/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * distance to the focal plane of the image. + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_ADJUST_FOCAL_PLANE 145/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * zoom function of the optics + * Type: Range + */ +#define NV_CTRL_DDCCI_IMAGE_ADJUST_ZOOM 146/* RWD */ + +/* This value will cause the picture to flip horizontally. + * NV_CTRL_DDCCI_ON : flip horizontally + * NV_CTRL_DDCCI_OFF : Shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_IMAGE_HOR_FLIP 147/* -WD */ + +/* This value will cause the picture to flip vertically. + * NV_CTRL_DDCCI_ON : flip vertically + * NV_CTRL_DDCCI_OFF : Shall be ignored + * Type: Boolean + */ +#define NV_CTRL_DDCCI_IMAGE_VER_FLIP 148/* -WD */ + +/* Changing this value will affect the scaling (input versus output) + * function of the display. + * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_NO_SCALING : No scaling, 1:1 relationship + * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_NO_DISTORT2 : Scale to maximum + * without AR distortion + * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_VERTICAL : Scale to maximum vertical + size + * NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_HORIZONTAL ; Scale to maximum + horizontal size + * 0 and >=5 : Shall be ignored + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING 149/* RWD */ +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_NO_SCALING 1 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_NO_DISTORT 2 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_VERTICAL 3 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_SCALING_MAX_HORIZONTAL 4 + +/* Allows one of several image expansion algorithms to be selecte + * to suit different types of image and/or different personal + * preference. + * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(1) : Filter function 1 + * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(2) : Filter function 2 + * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(3) : Filter function 3 + * NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(4) : Filter function 4 + * 0 and 5 shall be ignored + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_SHARPNESS 150/* RWD */ +#define NV_CTRL_DDCCI_IMAGE_SHARPNESS_FILTER_FUNC(n) n + +/* Indicates the orientation of the screen. + * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_0 + * The normal landscape mode. + * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_90 + * Portrait mode achieved by clockwise rotation of the display 90 degrees. + * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_180 + * Landscape mode achieved by rotation of the display 180 degrees. + * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_270 + * Portrait mode achieved by clockwise rotation of the display 270 degrees. + * NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_NA + * Indicates that the display cannot supply the current orientation + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION 151/* R-D */ +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_0 0x01 +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_90 0x02 +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_180 0x03 +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_270 0x04 +#define NV_CTRL_DDCCI_IMAGE_SCREEN_ORIENTATION_NA 0xFF + +/* Selects a scan format. + * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_UNDERSCAN: Underscan + * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_OVERSCAN: Overscan + * NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_WIDESCREEN: Widescreen + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT 152/* RWD */ +#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_UNDERSCAN 1 +#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_OVERSCAN 2 +#define NV_CTRL_DDCCI_IMAGE_SCAN_FORMAT_WIDESCREEN 3 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE 153/* RWD */ + +/* Display mode: + * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_PRODUCTIVITY : + * Productivity (e.g. office applications) + * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_MIXED : Mixed (e.g. internet) + * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_ENTERTAINMENT : + Entertainment (e.g. TV / movie) + * NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_USERDEFINED : User defined + * Note: + * The condition(s) associated with options 1, 2 and 3 are defined + * by the display manufacturer + * Type: Integer + */ +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_PRODUCTIVITY 1 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_MIXED 2 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_ENTERTAINMENT 3 +#define NV_CTRL_DDCCI_IMAGE_DISPLAY_MODE_USERDEFINED 4 + +/*********************************************** + * DDC/CI VCP CODES: WINDOWED IMAGE OPERATIONS * + ***********************************************/ + +/* Defines the top left X pixel of an area of the image. Specified in + * co-ordinates of incoming image before any scaling etc in the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_TOP_LEFT_X 154/* RWD */ + +/* Defines the top left Y pixel of an area of the image. Specified in + * co-ordinates of incoming image before any scaling etc in the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_TOP_LEFT_Y 155/* RWD */ + +/* Defines the bottom right X pixel of an area of the image. + * Specified in co-ordinates of incoming image before any scaling + * in the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_BOTTOM_RIGHT_X 156/* RWD */ + +/* Defines the bottom right Y pixel of an area of the image. + * Specified in co-ordinates of incoming image before any scaling + * in the display. + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_POSITION_BOTTOM_LEFT_X 157/* RWD */ + +/* Window control, enables the brightness and color within a + * window to be different from the desktop. + * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_OFF : Off + * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_ON: On + * All other values are reserved. + * Notes: + * 1. This control should be used in conjunction with + * NV_CTRL_DDCCI_WINDOWEDIMAGE_BACKGROUND + * 2. This command structure is not recommended for new designs, + * see NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE for alternate. + * Type: Integer + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE 158/* RWD */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_OFF 1 +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE_ON 2 + +/* Changes the contrast ratio between the area of the window and + * the rest of the desktop + * Lower (higher) values will cause the desktop brightness to + * decrease (increase) + * Notes: + * 1. This contropl should be used in conjunction with + * NV_CTRL_DDCCI_WINDOWEDIMAGE_OLD_CONTROL_TOGGLE + * 2. This command structure is not recommended for new designs, + * see NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT for alternate. + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_BACKGROUND 159/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards yellow + * A value < 127 shall cause the color to shift towards magenta + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_RED 160/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards green + * A value < 127 shall cause the color to shift towards red + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_YELLOW 161/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards cyan + * A value < 127 shall cause the color to shift towards yellow + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_GREEN 162/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards blue + * A value < 127 shall cause the color to shift towards green + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_CYAN 163/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards magenta + * A value < 127 shall cause the color to shift towards cyan + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_BLUE 164/* RWD */ + +/* A value of 127 shall have no effect. + * A value > 127 shall cause the color to shift towards red + * A value < 127 shall cause the color to shift towards blue + * Type: Range + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_6AXIS_COLOR_CONTROL_MAGENTA 165/* RWD */ + +/* Turn the selected window operation on / off. + * Bit: NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_DPY_IMAGE + * 0 Window controls have no effect on the + * displayed image + * 1 Window controls effect the displayed image + * (full image area) + * Bit: NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_WINDOW(n) + * 0 Window controls have no effect on the + * displayed image (window n) + * 1 Window controls effect the displayed image + * (window n) + * n is between 1 and 7 + * Note: This command structure is recommend, in conjunction with + * NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT, for all new designs. + * Type: Bitmask + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE 166/* RWD */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_DPY_IMAGE 1 +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE_WINDOW(n) (1<<n) + +/* Change the selected window as defined with + * NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE + * When a window is selected then all commands that the display + * controller supports for window operations are valid, this may + * include but is not limited to: brightness, contrast, R/G/B gain, 6- + * axis color, sharpness, etc. + * meaning of value NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_DPY_IMAGE: + * Full display image area is selected except for + * area(s) of active windows + * meaning of value NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_WINDOW(n) + * Window n is selected + * If this command is not supported then the `full image area' shall + * be the default. + * This command structure is recommend, in conjunction with + * NV_CTRL_DDCCI_WINDOWEDIMAGE_CONTROL_TOGGLE, for all new designs. + * Type: Integer + */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT 167/* RWD */ +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_DPY_IMAGE 0 +#define NV_CTRL_DDCCI_WINDOWEDIMAGE_WINDOW_SELECT_WINDOW(n) (1<<n) + + +/*************************************/ +/* DDC/CI VCP CODES: AUDIO FUNCTIONS */ +/*************************************/ + +/* Increasing (decreasing) this value will increase (decrease) the + * audio volume. + * Type: Range + */ +#define NV_CTRL_DDCCI_AUDIO_SPEAKER_VOLUME 168/* RWD */ + +/* Increasing (decreasing) this value will increase (decrease) the + * microphone gain. + * Type: Range + */ +#define NV_CTRL_DDCCI_AUDIO_MICROPHONE_VOLUME 169/* RWD */ + +/* Increasing (decreasing) this control will cause high frequency + * audio to be emphasized (de-emphasised). + * Type: Range + */ +#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_TREBLE 170/* RWD */ + +/* Increasing (decreasing) this control will cause low frequency + * audio to be emphasized (de-emphasised). + * Type: Range + */ +#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_BASS 171/* RWD */ + +/* This control affects the left right balance of audio output. + * Increasing (decreasing) the value will cause the balance to move + * to the right (left). + * Type: Range + */ +#define NV_CTRL_DDCCI_AUDIO_TV_AUDIO_BALANCE 172/* RWD */ + +/* This control allows one of several audio modes to be selected. + * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_OFF: Display audio is disabled, + * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_MONO: Both display audio channels, + * use the left audio channel + * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO: Incoming left and right + * audio. Channels feed separate display output audio channels. + * NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO_EXPANDED: As defined + * by the manufacturer. + * Type: Integer + */ +#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE 173/* RWD */ +#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_OFF 0 +#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_MONO 1 +#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO 2 +#define NV_CTRL_DDCCI_AUDIO_TV_STEREO_MODE_SPEAKER_STEREO_EXPANDED 3 + + +/************************************/ +/* DDC/CI VCP CODES: DPVL Functions */ +/************************************/ + +/* Video mode and status of a DPVL capable monitor + * Bit Value Meaning + * 0 0 Raster scan mode + * 1 DPVL mode + * 1 0 Monitor is able to receive the next packet + * 1 Monitor is unable to accept another packet + * 2 0 No error detected in the last header received + * 1 Error detected in the last header received + * Other bits are reserved and shall be set to '0'. + * Type: Bitmask + */ +#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS 174/* R-D */ +#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_DPVL_MODE (1<<0) +#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_UNABLE_TO_RECEIVE_NEXT_PACKET (1<<1) +#define NV_CTRL_DDCCI_DPVL_MONITOR_STATUS_ERROR_DETECTED_IN_LAST_HEADER (1<<2) + +/* Counter for the DPVL packets received (valid and invalid ones). + * This value counts from 0000h to FFFFh and then rolls over to 0000h. + * The host can reset the value to 0000h. + * Type: Range + */ +#define NV_CTRL_DDCCI_DPVL_PACKET_COUNT 175/* RWD */ + +/* The X origin of the monitor in the virtual screen. The support of + * this command indicates the multi-display support of the display. If + * a display supports this command, the monitor must also support + * Monitor Y Origin command. + * Type: Range; "0000h" to "FFFFh" or 0 to 65535 + */ +#define NV_CTRL_DDCCI_DPVL_MONITOR_X_ORIGIN 176/* RWD */ + +/* The Y origin of the display in the virtual screen. The support of + * this command indicates the multi-display support of the display. If + * a display supports this command, the monitor must also support + * Monitor X Origin command. + * Type: Range; "0000h" to "FFFFh" or 0 to 65535 + */ +#define NV_CTRL_DDCCI_DPVL_MONITOR_Y_ORIGIN 177/* RWD */ + +/* Error Counter for the DPVL header. The counter value saturates + * at FFFFh. Host can reset to 0000h. + * Type: Range + */ +#define NV_CTRL_DDCCI_DPVL_HEADER_ERROR_COUNT 178/* RWD */ + +/* CRC error Counter for the DPVL body (containing video data). + * The counter value saturates at FFFFh. The Host can reset to 0000h + * Type: Range + */ +#define NV_CTRL_DDCCI_DPVL_BODY_CRC_ERROR_COUNT 179/* RWD */ + +/* Assigned identification number for the monitor. + * Type: Valid range is 0000h to FFFEh, FFFFh is reserved for broadcast. + */ +#define NV_CTRL_DDCCI_DPVL_CLIENT_ID 180/* RWD */ + +/* Indicates the status of the DVI link + * NV_CTRL_DDCCI_DPVL_LINK_CONTROL_DISABLED: Link shutdown is disabled + * NV_CTRL_DDCCI_DPVL_LINK_CONTROL_ENABLED: Link shutdown is enabled + * Type: Boolean + */ +#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL 181/* RWD */ +#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL_DISABLED 0 +#define NV_CTRL_DDCCI_DPVL_LINK_CONTROL_ENABLED 1 + +/**********************************************/ +/* DDC/CI VCP CODES: Miscellaneous Functions */ +/**********************************************/ + +/* Causes a CRT display to perform a degauss cycle with + * NV_CTRL_DDCCI_ON + * Type: Boolean + */ +#define NV_CTRL_DDCCI_MISC_DEGAUSS 182/* -WD */ + +/* Used to indicate that a display user control (excluding power + * controls) has been used to change and save (or autosave) a new value. + * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW : No new control value + * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS : A new control value + * has been saved + * NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS : No user controls are present + * Note: + * A value = NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NEW should only be reset to + * a value = NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW by a host write + * operation and not by the display + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE 183/* RWD */ +#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_NEW 0x01 +#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NEW 0x02 +#define NV_CTRL_DDCCI_MISC_NEW_CONTROL_VALUE_NO_USER_CONTROLS 0xFF + +/* Allows display controls to be used as soft keys + * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NO_BUTTON_ACTIVE : No button active + * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_BUTTON(n): Button n active + * n is between 1 and 7. + * NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NONE : No controls present + * Note: + * A `button active' value should only be reset to a value = 0 by + * host write operation and not by the display + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS 184/* RWD */ +#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NO_BUTTON_ACTIVE 0 +#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_BUTTON(n) n +#define NV_CTRL_DDCCI_MISC_SOFT_CONTROLS_NONE 0xFF + +/* When read this control returns the VCP code associated with + * the new control value reported using 02H + * Examples: + * If brightness has been changed then return value of 10h + * If red gain has been changed then return value of 16h. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_ACTIVE_CONTROL 185/* R-D */ + +/* Used to select the active video source + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_1: Analog video (R/G/B) 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_2: Analog video (R/G/B) 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_1: Digital video (TMDS) 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_2: Digital video (TMDS) 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_1: Composite video 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_2: Composite video 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_1: S-video 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_2: S-video 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_1: Tuner 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_2: Tuner 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_3: Tuner 3 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_1: Component video (YPrPb/YCrCb) 1 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_2: Component video (YPrPb/YCrCb) 2 + * NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_3: Component video (YPrPb/YCrCb) 3 + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE 186/* RWD */ +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_1 1 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_ANALOG_2 2 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_1 3 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_DIGITAL_2 4 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_1 5 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPOSITE_2 6 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_1 7 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_SVIDEO_2 8 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_1 9 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_2 10 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_TUNER_3 11 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_1 12 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_2 13 +#define NV_CTRL_DDCCI_MISC_INPUT_SOURCE_COMPONENT_3 14 + +/* ncreasing (decreasing) this value will increase (decrease) the + * velocity modulation of the horizontal scan as a function of a + * change in the luminance level. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_VELOCITY_SCAN_MODULATION 187/* RWD */ + +/* Increasing this control increases the amplitude of the color + * difference components of the video signal. + * The result is an increase in the amount of pure color relative to + * white in the video. This control does not affect the RGB input, + * only the TV video inputs. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_COLOR_SATURATION 188/* RWD */ + +/* Used to increment / decrement between TV-channels, the exact + * behavior is implementation specific (e.g. increment / decrement + * to next numeric channel or increment / decrement to next + * channel with a signal) + * NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_INCREMENT: Increment channel + * NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_DECREMENT: Decrement channel + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN 189/* -WD */ +#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_INCREMENT 1 +#define NV_CTRL_DDCCI_MISC_TV_CHANNEL_UP_DOWN_DECREMENT 2 + +/* Increasing this control increases the amplitude of the high + * frequency components of the video signal. + * This allows fine details to be accentuated. This control does not + * affect the RGB input, only the TV video inputs. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_SHARPNESS 190/* RWD */ + +/* Provides for the TV-audio to be muted or unmated. + * NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_ON: Mute the audio + * NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_OFF: Unmute the audio + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE 191/* RWD */ +#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_ON 1 +#define NV_CTRL_DDCCI_MISC_TV_AUDIO_MUTE_OFF 2 + +/* Increasing (decreasing) this control increases (decreases) the + * ratio between whites and blacks in the video. + * This control does not affect the RGB input, only the TV video + * inputs. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_CONTRAST 192/* RWD */ + +/* Also known as `tint' + * Increasing (decreasing) this control increases (decreases) the + * wavelength of the color component of the video signal. + * The result is a shift towards red (blue) in the hue of all colors. + * This control does not affect the RGB input, only the TV video + * inputs. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_HUE 193/* RWD */ + +/* Increasing this control increases the black level of the video, + * resulting in an increase of the luminance level of the video. + * A value of zero represents the darkest level possible. + * This control does not affect the RGB input, only the TV video + * inputs. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_TV_BLACK_LEVEL_SHARPNESS 194/* RWD */ + +/* Horizontal synchronization signal frequency in Hz as determined + * by the display. + * FFh: Indicates that the display cannot supply this information + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_HORIZONTAL_FREQUENCY 195/* R-D */ + +/* Vertical synchronization signal frequency in 0.01Hz as + * determined by the display. + * FFh: Indicates that the display cannot supply this information + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_VERTICAL_FREQUENCY 196/* R-D */ + +/* Select a type of LCD sub-pixel structure + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_UNDEFINED: + * Sub-pixel layout is not defined + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_V: + * Red / Green / Blue vertical stripe + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_H: + * Red / Green / Blue horizontal stripe + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_V: + * Blue / Green / Red vertical stripe + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_H: + * Blue/ Green / Red horizontal stripe + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_1: + * Quad-pixel, a 2 x 2 sub-pixel structure with red at top + * left, blue at bottom right and green at top right and + * bottom left + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_2: + * Quad-pixel, a 2 x 2 sub-pixel structure with red at + * bottom left, blue at top right and green at top left and + * bottom right + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_DELTA: + * Delta (triad) + * NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_MOSAIC: + * Mosaic with red, green and blue fields overlayed + * (field sequential color) + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT 197/* R-D */ +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_UNDEFINED 0 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_V 1 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_RGB_H 2 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_V 3 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_BGR_H 4 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_1 5 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_QUAD_2 6 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_DELTA 7 +#define NV_CTRL_DDCCI_MISC_FLATPANEL_SUBPIXEL_LAYOUT_MOSAIC 8 + +/* Select the base technology type + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_SHADOWMASK: CRT (shadowmask) + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_APERTURE_GRILL: CRT (aperture + * grill) + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_TFT: TFT + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_LCOS: LCoS + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_PLASMA: Plasma + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_OLED: OLED + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_EL: EL + * NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_MEM: MEM + * Type: integer + */ +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE 198/* R-D */ +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_SHADOWMASK 1 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_CRT_APERTURE_GRILL 2 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_TFT 3 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_LCOS 4 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_PLASMA 5 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_OLED 6 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_EL 7 +#define NV_CTRL_DDCCI_MISC_DISPLAY_TECHNOLOGY_TYPE_MEM 8 + +/* Returns the current value (in hours) of `active power on' time + * accumulated by the display a 2 byte value. + * "Active power on" time is defined as the period when the + * emissive elements(s) of the display cathodes for a CRT, + * fluorescent lamps for a LCD, etc are active. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_DISPLAY_USAGE_TIME 199/* R-D */ + +/* Returns the length (in bytes) of non-volatile storage in the display + * available for writing a display descriptor the maximum + * descriptor length is 256 bytes + * See + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_DISPLAY_DESCRIPTOR_LENGTH 200/* R-D */ + +/* If enabled (NV_CTRL_DDCCI_ON), the display descriptor written to the + * display using XNVCTRLSetDDCCIDisplayDescriptor() shall be displayed when + * no video is being received. + * The duration for which it is displayed is left to individual manufacturers. + * NV_CTRL_DDCCI_ON: Display is enabled + * NV_CTRL_DDCCI_OFF: The display descriptor shall not be displayed. + * Type: Boolean + */ +#define NV_CTRL_DDCCI_MISC_ENABLE_DISPLAY_OF_DISPLAY_DESCRIPTOR 201/* RWD */ + +/* A 2 byte value used to allow an application to only operate with + * known products. The display manufacturer and application author + * agree to a code such that application will only run when a valid + * code is present in the display. + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_APPLICATION_ENABLE_KEY 202/* R-D */ + +/* This VCP code provides allows a 2 byte value identifying the + * firmware level installed in the display to be determined. + * Type: Range + */ +#define NV_CTRL_DDCCI_MISC_DISPLAY_FIRMWARE_LEVEL 203/* R-D */ + +/* Indicates the current state of the display OSD + * NV_CTRL_DDCCI_MISC_OSD_DISABLED: OSD is disabled + * NV_CTRL_DDCCI_MISC_OSD_ENABLED: OSD is enabled + * NV_CTRL_DDCCI_MISC_OSD_CANNOT_SUPPLY: Indicates that the display cannot + * supply this information. + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_OSD 204/* RWD */ +#define NV_CTRL_DDCCI_MISC_OSD_DISABLED 1 +#define NV_CTRL_DDCCI_MISC_OSD_ENABLED 2 +#define NV_CTRL_DDCCI_MISC_OSD_CANNOT_SUPPLY 0xFF + +/* Allows the displayed OSD language to be selected. + * Type: Integer */ +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE 205/* RWD */ +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_CHINESE 1 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_ENGLISH 2 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_FRENCH 3 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_GERMAN 4 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_ITALIAN 5 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_JAPANESE 6 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_KOREAN 7 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_PORTUGESE 8 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_RUSSIAN 9 +#define NV_CTRL_DDCCI_MISC_OSD_LANGUAGE_SPANISH 10 + +/* An `auxiliary display' is a small alpha-numeric display associated + * with the primary display and able to be accessed via the primary + * display. + * This command returns a 1 byte value that defines the number of + * characters and the number of rows available. The format is: + * Bits 0 to 5 : The number of characters / row + * Bits 6 to 7 : The number of rows + * I.e. The maximum auxiliary display size is 4 rows each with 64 characters + * Type: Bitmask + */ +#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE 206/* R-D */ +#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE_COLUMNS_MASK 0x1F +#define NV_CTRL_DDCCI_MISC_AUXILIARY_DISPLAY_SIZE_ROWS_MASK 0x60 + +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT 207/* RWD */ + +/* Used to selects the active output. + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_1: Analog video (R/G/B) 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_2: Analog video (R/G/B) 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_1: Digital video (TMDS) 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_2: Digital video (TMDS) 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_1: Composite video 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_2: Composite video 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_1: S-video 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_2: S-video 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_1: Tuner 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_2: Tuner 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_3: Tuner 3 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_1: Component video (YPrPb/YCrCb) 1 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_2: Component video (YPrPb/YCrCb) 2 + * NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_3: Component video (YPrPb/YCrCb) 3 + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_1 1 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_ANALOG_2 2 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_1 3 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_DIGITAL_2 4 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_1 5 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPOSITE_2 6 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_1 7 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_SVIDEO_2 8 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_1 9 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_2 10 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_TUNER_3 11 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_1 12 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_2 13 +#define NV_CTRL_DDCCI_MISC_OUTPUT_SELECT_COMPONENT_3 14 + +/* Used to select the video mode with respect to 2D or 3D video. + * Here is the meaning of the bitmask: + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_RIGHT_FIRST: + * Enable Field-Sequential Right Eye First + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_LEFT_FIRST: + * Enable Field-Sequential Left Eye First + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_RIGHT_FIRST: + * Enable 2-Way Interleaved Right Eye First + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_LEFT_FIRST: + * Enable 2-Way Interleaved Left Eye First + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES: + * Enable 4-Way Interleaved, Display Stereo Buffer 0 (even scan lines) + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES: + * Enable 4-Way Interleaved, Display Stereo Buffer 1 (odd scan lines) + * NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_SIDE_BY_SIDE_INTERLEAVED: + * Enable Side-by-Side Interleaved + * Note: It is permissible, during a read operation, for a display to indicate + * support for 2 or more stereo modes + * Type: Bitmask + */ +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE 208/* RWD */ +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_RIGHT_FIRST (1<<6) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_FIELD_SEQUENTIAL_LEFT_FIRST (1<<5) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_RIGHT_FIRST (1<<4) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_2WAY_INTERLEAVED_LEFT_FIRST (1<<3) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_EVEN_LINES (1<<2) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_4WAY_INTERLEAVED_ODD_LINES (1<<1) +#define NV_CTRL_DDCCI_MISC_STEREO_VIDEO_MODE_SIDE_BY_SIDE_INTERLEAVED (1<<0) + +/* Power Mode DPMS and DPM standards are supported. + * Value DPMS DPM + * NV_CTRL_DDCCI_MISC_POWER_MODE_ON On On + * NV_CTRL_DDCCI_MISC_POWER_MODE_STANDBY Standby Off + * NV_CTRL_DDCCI_MISC_POWER_MODE_SUSPEND Suspend Off + * NV_CTRL_DDCCI_MISC_POWER_MODE_OFF Off Off + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_POWER_MODE 209/* RWD */ +#define NV_CTRL_DDCCI_MISC_POWER_MODE_ON 1 +#define NV_CTRL_DDCCI_MISC_POWER_MODE_STANDBY 2 +#define NV_CTRL_DDCCI_MISC_POWER_MODE_SUSPEND 3 +#define NV_CTRL_DDCCI_MISC_POWER_MODE_OFF 4 + +/* Controls output of an auxiliary power output from a display to a host device. + * NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_DISABLE: + * Disable auxiliary output power + * NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_ENABLE: + * Enable auxiliary output power + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT 210/* RWD */ +#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_DISABLE 1 +#define NV_CTRL_DDCCI_MISC_AUXILIARY_POWER_OUTPUT_ENABLE 2 + +/* Operation mode + * NV_CTRL_DDCCI_MISC_OPERATION_MODE_STANDALONE: Stand alone + * NV_CTRL_DDCCI_MISC_OPERATION_MODE_SLAVE: Slave (full PC control) + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_OPERATION_MODE 211/* -WD */ +#define NV_CTRL_DDCCI_MISC_OPERATION_MODE_STANDALONE 1 +#define NV_CTRL_DDCCI_MISC_OPERATION_MODE_SLAVE 2 + +/* Define the version number of VCP list recognized by the display. + * This is a 2 byte value, byte 1 defines the version number and + * byte 2 defines the revision number + * e.g 02 00 (hex) defines Version 2, Revision 0 + * Type: Integer + */ +#define NV_CTRL_DDCCI_MISC_VCP_VERSION 212/* R-D */ + +/* Save the current adjustment data to EEPROM or other + * non-volatile storage inside the display + * Returns TRUE on success + * Type: Boolean + */ +#define NV_CTRL_DDCCI_SAVE_CURRENT_SETTINGS 213/* -WD */ + +/* Detects if the display is DDC/CI capable + * Returns TRUE on success + * Type: Boolean + */ +#define NV_CTRL_DDCCI_CAPABLE 214/* R-D*/ + +#define NV_CTRL_DDCCI_FIRST_VCP NV_CTRL_DDCCI_GEOMETRY_HORIZONTAL_POSITION +#define NV_CTRL_DDCCI_LAST_VCP NV_CTRL_DDCCI_CAPABLE /**************************************************************************/ +/* + * NV_CTRL_FLATPANEL_CHIP_LOCATION - for the specified display device, + * report whether the flatpanel is driven by the on-chip controller, + * or a separate controller chip elsewhere on the graphics board. + * This attribute is only available for flatpanels. + */ + +#define NV_CTRL_FLATPANEL_CHIP_LOCATION 215/* R-D */ +#define NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL 0 +#define NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL 1 + +/* + * NV_CTRL_FLATPANEL_LINK - report whether the specified display + * device is driven by a single link or dual link DVI connection. + * This attribute is only available for flatpanels. + */ + +#define NV_CTRL_FLATPANEL_LINK 216/* R-D */ +#define NV_CTRL_FLATPANEL_LINK_SINGLE 0 +#define NV_CTRL_FLATPANEL_LINK_DUAL 1 + +/* + * NV_CTRL_FLATPANEL_SIGNAL - for the specified display device, report + * whether the flatpanel is driven by an LVDS or TMDS signal. This + * attribute is only available for flatpanels. + */ -#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_GVO_X_SCREEN_PAN_Y +#define NV_CTRL_FLATPANEL_SIGNAL 217/* R-D */ +#define NV_CTRL_FLATPANEL_SIGNAL_LVDS 0 +#define NV_CTRL_FLATPANEL_SIGNAL_TMDS 1 +/* + * NV_CTRL_USE_HOUSE_SYNC - when TRUE, framelock will sync to the house + * sync + * + */ +#define NV_CTRL_USE_HOUSE_SYNC 218/* RW- */ +#define NV_CTRL_USE_HOUSE_SYNC_FALSE 0 +#define NV_CTRL_USE_HOUSE_SYNC_TRUE 1 + +/**************************************************************************/ +#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_USE_HOUSE_SYNC /**************************************************************************/ @@ -1021,6 +2361,9 @@ * String Attributes: */ +#define QUERY_STRING_ERR 0 +#define QUERY_STRING_OK 1 +#define QUERY_STRING_STATIC 2 /* * NV_CTRL_STRING_PRODUCT_NAME - the GPU product name on which the @@ -1060,10 +2403,33 @@ */ #define NV_CTRL_STRING_TV_ENCODER_NAME 5 /* R-D */ - -#define NV_CTRL_STRING_LAST_ATTRIBUTE NV_CTRL_STRING_TV_ENCODER_NAME +/* NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR - + * Allows a display descriptor (up to maximum length defined by the + * display (see NV_CTRL_DDCCI_MISC_DISPLAY_DESCRIPTOR_LENGTHC2h) to be written + * (read) to (from) non-volatile storage in the display. + * If an attempt is made to write beyond the maximum storage + * length, the descriptor shall be truncated with the excess bytes + * being discarded. + */ +#define NV_CTRL_STRING_DDCCI_MISC_TRANSMIT_DISPLAY_DESCRIPTOR 6 /* RWD */ + + +/* NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA - + * An `auxiliary display' is a small alpha-numeric display associated + * with the primary display and able to be accessed via the primary + * display. + * This command transmits a number of bytes of alpha-numeric + * data to be displayed on the auxiliary display. The data shall + * conform to ISO 8859-2 (Latin 1) code set. + * The auxiliary display will be written from the top left position, + * moving to right along each line and then starting at left end of the + * next line. + */ +#define NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA 7 /* -WD */ + +#define NV_CTRL_STRING_LAST_ATTRIBUTE NV_CTRL_STRING_DDCCI_MISC_AUXILIARY_DISPLAY_DATA /**************************************************************************/ /* diff --git a/src/libXNVCtrl/NVCtrlLib.h b/src/libXNVCtrl/NVCtrlLib.h index 372247c..c5d34f6 100644 --- a/src/libXNVCtrl/NVCtrlLib.h +++ b/src/libXNVCtrl/NVCtrlLib.h @@ -71,6 +71,24 @@ void XNVCTRLSetAttribute ( /* + * XNVCTRLSetAttributeAndGetStatus - + * + * Same as XNVCTRLSetAttribute(). + * In addition, XNVCTRLSetAttributeAndGetStatus() returns + * True if the operation succeeds, False otherwise. + * + */ + +Bool XNVCTRLSetAttributeAndGetStatus ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int attribute, + int value +); + + +/* * XNVCTRLQueryAttribute - * * Returns True if the attribute exists. Returns False otherwise. @@ -116,6 +134,24 @@ Bool XNVCTRLQueryStringAttribute ( char **ptr ); +/* + * XNVCTRLSetStringAttribute - + * + * Returns True if the operation succeded. Returns False otherwise. + * + * Possible X errors: + * BadValue - The screen doesn't exist. + * BadMatch - The NVIDIA driver is not present on that screen. + * BadAlloc - Insufficient resources to fulfill the request. + */ + +Bool XNVCTRLSetStringAttribute ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int attribute, + char *ptr +); /* * XNVCTRLQueryValidAttributeValues - @@ -172,6 +208,224 @@ Bool XNVCTRLQueryGvoColorConversion ( float colorOffset[3] ); +/* SPECIAL HANDLING OF VCP CODES + * + * XNVCTRLQueryDDCCILutSize + * XNVCTRLQueryDDCCISinglePointLutOperation + * XNVCTRLSetDDCCISinglePointLutOperation + * XNVCTRLQueryDDCCIBlockLutOperation + * XNVCTRLSetDDCCIBlockLutOperation + * XNVCTRLSetDDCCIRemoteProcedureCall + * XNVCTRLQueryDDCCIDisplayControllerType + + * Some of DDC/CI VCP codes handle multiple values, + * therefore they need their own NV_CONTROL structure + */ + +/* XNVCTRLQueryDDCCILutSize + * Provides the size (number of entries and number of bits / entry) + * for the Red / Green and Blue LUT in the display + * + * red_entries: Number of Red LUT entries + * green_entries: Number of Green LUT entries + * blue_entries: Number of Blue LUT entries + * red_bits_per_entries: Number of bits / entry in Red LUT + * green_bits_per_entries: Number of bits / entry in Green LUT + * blue_bits_per_entries: Number of bits / entry in Blue LUT + * Returns TRUE on success + */ +Bool XNVCTRLQueryDDCCILutSize ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int *red_entries, + unsigned int *green_entries, + unsigned int *blue_entries, + unsigned int *red_bits_per_entries, + unsigned int *green_bits_per_entries, + unsigned int *blue_bits_per_entries +); + +/* XNVCTRLQueryDDCCISinglePointLutOperation + * Allows a single point within a display's color LUT to be read + * Input: + * offset: Offset into the LUT + * Output: + * red_value: Red LUT value read + * green_value: Green LUT value read + * blue_value: Blue LUT value read + * Returns TRUE on success + */ +Bool XNVCTRLQueryDDCCISinglePointLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int *red_value, + unsigned int *green_value, + unsigned int *blue_value +); + +/* XNVCTRLSetDDCCISinglePointLutOperation + * Allows a single point within a display's color LUT (look up table) + * to be loaded. + * offset: Offset into the LUT + * red_value: Red LUT value to be loaded + * green_value: Green LUT value to be loaded + * blue_value: Blue LUT value to be loaded + * Note: If display LUT cannot store 16 bit values then least significant + * bits are discarded + * Returns TRUE on success + */ +Bool XNVCTRLSetDDCCISinglePointLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int red_value, + unsigned int green_value, + unsigned int blue_value +); + +/* XNVCTRLQueryDDCCIBlockLutOperation + * Provides an efficient method for reading multiple values from a display's LUT + * color: is one of NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, + * NV_CTRL_DDCCI_BLUE_LUT. Color to be read. + * size: Number of values to be read + * offset: Offset into Red or Green or Blue LUT + * value: Red or Green or Blue LUT contents. Needs to be freed when done. + * Returns TRUE on success + */ +Bool XNVCTRLQueryDDCCIBlockLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int color, + unsigned int size, + unsigned int offset, + unsigned int **value +); + +/* XNVCTRLSetDDCCIBlockLutOperation + * Provides an efficient method for loading multiple values into a display's LUT + * size: Number of values to be loaded + * offset: Offset into Red or Green or Blue LUT + * value: R or G or B LUT values to be loaded + * color: NV_CTRL_DDCCI_RED_LUT, NV_CTRL_DDCCI_GREEN_LUT, NV_CTRL_DDCCI_BLUE_LUT + * Note: If display LUT cannot store 16 bit values then least significant + * bits are discarded + * Returns TRUE on success + */ +#define NV_CTRL_DDCCI_RED_LUT 1 +#define NV_CTRL_DDCCI_GREEN_LUT 2 +#define NV_CTRL_DDCCI_BLUE_LUT 3 +Bool XNVCTRLSetDDCCIBlockLutOperation ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int color, + unsigned int offset, + unsigned int size, + unsigned int *value +); + +/* XNVCTRLSetDDCCIRemoteProcedureCall + * Allows initiation of a routine / macro resident in the display. Only + * one RPC is defined at this time: + * A spline curve routine applied to the data (supplied in format + * below) and the resulting data used to derive a full set of values + * for the display color LUT which shall then be loaded. + * offset: Offset into the LUT + * size: Number of values to be loaded + * red_lut: Red LUT values + * green_lut: Green LUT value + * blue_lut: Blue LUT value + * increment: Increment to next LUT entry + * Values of E0h FFh inclusive are reserved for manufacturer + * specific routines / macros. + * All other values are reserved and shall be ignored. + * Returns TRUE on success + */ +Bool XNVCTRLSetDDCCIRemoteProcedureCall ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int offset, + unsigned int size, + unsigned int *red_lut, + unsigned int *green_lut, + unsigned int *blue_lut, + unsigned int *increment +); + +/* XNVCTRLQueryDDCCIDisplayControllerType: + * Provides the host with knowledge of the controller type being used by a + * particular display + * controller_manufacturer: Indicates controller manufacturer. (This string + * needs to be freed when done) (XXX This will be changed to a static string) + * controller_type: Provide a numeric indication of controller type + * Return TRUE on success + */ +Bool XNVCTRLQueryDDCCIDisplayControllerType ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned char **controller_manufacturer, + unsigned int *controller_type +); + +/* NVCTRLQueryDDCCICapabilities: + * Gets the capabilities of the display as a VCP string + * Returns : + * nvctrl_vcp_supported: a table of 0 (not supported) and 1 (supported) + * which index is the NV_CTRL_DDCI* values + * possible_value_offset; contains the offsets in the table + * nvctrl_vcp_possible_values. Index is the NV_CTRL_DDCI* values. + * -1 means no possible values are available. + * possible_value_size; contains the count in the table + * nvctrl_vcp_possible_values. Index is the NV_CTRL_DDCI* values. + * -1 means no possible values are available. + * nvctrl_vcp_possible_values: a table of possible values for the non + * continuous values. + * nvctrl_string_vcp_supported: a table or 0 (not supported) and 1 (supported) + * which index is the NV_CTRL_STRING_DDCI* values. + * + * Returns TRUE on success + */ +Bool NVCTRLQueryDDCCICapabilities ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int **nvctrl_vcp_supported, // Size is NV_CTRL_DDCCI_LAST_VCP+1 + unsigned int **possible_values_offset, // Size is NV_CTRL_DDCCI_LAST_VCP+1 + unsigned int **possible_values_size, // Size is NV_CTRL_DDCCI_LAST_VCP+1 + unsigned int **nvctrl_vcp_possible_values, + unsigned int **nvctrl_string_vcp_supported // Size is NV_CTRL_STRING_LAST_ATTRIBUTE+1 +); + +/* XNVCTRLQueryDDCCITimingReport + * Queries the currently operating video signal timing report data. + * - is_sync_freq_out_range: Sync. Freq. out of range (TRUE/FALSE) + * - is_unstable_count: Unstable Count (TRUE/FALSE) + * - is_positive_h_sync: Positive Horizontal sync polarity (TRUE/FALSE) + * - is_positive_v_sync: Positive Vertical sync polarity (TRUE/FALSE) + * - h_freq: Horizontal Frequency + * - v_freq: Vertical Frequency. + * + * Returns TRUE on success + */ +Bool XNVCTRLQueryDDCCITimingReport ( + Display *dpy, + int screen, + unsigned int display_mask, + unsigned int *sync_freq_out_range, + unsigned int *unstable_count, + unsigned int *positive_h_sync, + unsigned int *positive_v_sync, + unsigned int *h_freq, + unsigned int *v_freq +); + /* * XNVCtrlSelectNotify - diff --git a/src/libXNVCtrl/libXNVCtrl.a b/src/libXNVCtrl/libXNVCtrl.a Binary files differindex 67db008..a94e166 100644 --- a/src/libXNVCtrl/libXNVCtrl.a +++ b/src/libXNVCtrl/libXNVCtrl.a diff --git a/src/libXNVCtrl/nv_control.h b/src/libXNVCtrl/nv_control.h index e82b0f4..ff27a95 100644 --- a/src/libXNVCtrl/nv_control.h +++ b/src/libXNVCtrl/nv_control.h @@ -8,16 +8,27 @@ #define NV_CONTROL_MAJOR 1 #define NV_CONTROL_MINOR 6 -#define X_nvCtrlQueryExtension 0 -#define X_nvCtrlIsNv 1 -#define X_nvCtrlQueryAttribute 2 -#define X_nvCtrlSetAttribute 3 -#define X_nvCtrlQueryStringAttribute 4 -#define X_nvCtrlQueryValidAttributeValues 5 -#define X_nvCtrlSelectNotify 6 -#define X_nvCtrlSetGvoColorConversion 7 -#define X_nvCtrlQueryGvoColorConversion 8 -#define X_nvCtrlLastRequest (X_nvCtrlQueryGvoColorConversion + 1) +#define X_nvCtrlQueryExtension 0 +#define X_nvCtrlIsNv 1 +#define X_nvCtrlQueryAttribute 2 +#define X_nvCtrlSetAttribute 3 +#define X_nvCtrlQueryStringAttribute 4 +#define X_nvCtrlQueryValidAttributeValues 5 +#define X_nvCtrlSelectNotify 6 +#define X_nvCtrlSetGvoColorConversion 7 +#define X_nvCtrlQueryGvoColorConversion 8 +#define X_nvCtrlSetStringAttribute 9 +#define X_nvCtrlQueryDDCCILutSize 10 +#define X_nvCtrlQueryDDCCISinglePointLutOperation 11 +#define X_nvCtrlSetDDCCISinglePointLutOperation 12 +#define X_nvCtrlQueryDDCCIBlockLutOperation 13 +#define X_nvCtrlSetDDCCIBlockLutOperation 14 +#define X_nvCtrlSetDDCCIRemoteProcedureCall 15 +#define X_nvCtrlQueryDDCCIDisplayControllerType 16 +#define X_nvCtrlQueryDDCCICapabilities 17 +#define X_nvCtrlQueryDDCCITimingReport 18 +#define X_nvCtrlSetAttributeAndGetStatus 19 +#define X_nvCtrlLastRequest (X_nvCtrlSetAttributeAndGetStatus + 1) /* Define 32 bit floats */ @@ -113,6 +124,31 @@ typedef struct { CARD32 screen B32; CARD32 display_mask B32; CARD32 attribute B32; + INT32 value B32; +} xnvCtrlSetAttributeAndGetStatusReq; +#define sz_xnvCtrlSetAttributeAndGetStatusReq 20 + +typedef struct { + BYTE type; + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; +} xnvCtrlSetAttributeAndGetStatusReply; +#define sz_xnvCtrlSetAttributeAndGetStatusReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 attribute B32; } xnvCtrlQueryStringAttributeReq; #define sz_xnvCtrlQueryStringAttributeReq 16 @@ -134,6 +170,32 @@ typedef struct { } xnvCtrlQueryStringAttributeReply; #define sz_xnvCtrlQueryStringAttributeReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 attribute B32; + CARD32 num_bytes B32; +} xnvCtrlSetStringAttributeReq; +#define sz_xnvCtrlSetStringAttributeReq 20 + +typedef struct { + BYTE type; + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; +} xnvCtrlSetStringAttributeReply; +#define sz_xnvCtrlSetStringAttributeReply 32 + typedef struct { CARD8 reqType; CARD8 nvReqType; @@ -203,6 +265,232 @@ typedef struct { } xnvCtrlQueryGvoColorConversionReply; #define sz_xnvCtrlQueryGvoColorConversionReply 32 + + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; +} xnvCtrlQueryDDCCILutSizeReq; +#define sz_xnvCtrlQueryDDCCILutSizeReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlQueryDDCCILutSizeReply; +#define sz_xnvCtrlQueryDDCCILutSizeReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 offset B32; + CARD32 red_value B32; + CARD32 green_value B32; + CARD32 blue_value B32; +} xnvCtrlSetDDCCISinglePointLutOperationReq; +#define sz_xnvCtrlSetDDCCISinglePointLutOperationReq 28 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlSetDDCCISinglePointLutOperationReply; +#define sz_xnvCtrlSetDDCCISinglePointLutOperationReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 offset B32; +} xnvCtrlQueryDDCCISinglePointLutOperationReq; +#define sz_xnvCtrlQueryDDCCISinglePointLutOperationReq 16 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlQueryDDCCISinglePointLutOperationReply; +#define sz_xnvCtrlQueryDDCCISinglePointLutOperationReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 size B32; + CARD32 color B32; + CARD32 offset B32; +} xnvCtrlQueryDDCCIBlockLutOperationReq; +#define sz_xnvCtrlQueryDDCCIBlockLutOperationReq 24 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 num_bytes B32; + CARD32 flags B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlQueryDDCCIBlockLutOperationReply; +#define sz_xnvCtrlQueryDDCCIBlockLutOperationReply 32 + + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 color B32; + CARD32 offset B32; + CARD32 size B32; + CARD32 num_bytes B32; +} xnvCtrlSetDDCCIBlockLutOperationReq; +#define sz_xnvCtrlSetDDCCIBlockLutOperationReq 28 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 num_bytes B32; + CARD32 flags B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlSetDDCCIBlockLutOperationReply; +#define sz_xnvCtrlSetDDCCIBlockLutOperationReply 32 + + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; + CARD32 num_bytes B32; + CARD32 size B32; + CARD32 offset B32; +} xnvCtrlSetDDCCIRemoteProcedureCallReq; +#define sz_xnvCtrlSetDDCCIRemoteProcedureCallReq 24 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 num_bytes B32; + CARD32 flags B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlSetDDCCIRemoteProcedureCallReply; +#define sz_xnvCtrlSetDDCCIRemoteProcedureCallReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; +} xnvCtrlQueryDDCCIDisplayControllerTypeReq; +#define sz_xnvCtrlQueryDDCCIDisplayControllerTypeReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 controller_type B32; + CARD32 size B32; + CARD32 flags B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; +} xnvCtrlQueryDDCCIDisplayControllerTypeReply; +#define sz_xnvCtrlQueryDDCCIDisplayControllerTypeReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; +} xnvCtrlQueryDDCCICapabilitiesReq; +#define sz_xnvCtrlQueryDDCCICapabilitiesReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 num_bytes B32; + CARD32 flags B32; + CARD32 possible_val_len B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlQueryDDCCICapabilitiesReply; +#define sz_xnvCtrlQueryDDCCICapabilitiesReply 32 + +typedef struct { + CARD8 reqType; + CARD8 nvReqType; + CARD16 length B16; + CARD32 screen B32; + CARD32 display_mask B32; +} xnvCtrlQueryDDCCITimingReportReq; +#define sz_xnvCtrlQueryDDCCITimingReportReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 flags B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; + CARD32 pad7 B32; + CARD32 pad8 B32; +} xnvCtrlQueryDDCCITimingReportReply; +#define sz_xnvCtrlQueryDDCCITimingReportReply 32 + typedef struct { CARD8 reqType; CARD8 nvReqType; @@ -224,7 +512,7 @@ typedef struct { BYTE type; BYTE detail; CARD16 sequenceNumber B16; - Time time B32; + CARD32 time B32; CARD32 screen B32; CARD32 display_mask B32; CARD32 attribute B32; diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributes.c b/src/libXNVCtrlAttributes/NvCtrlAttributes.c index 4ffc302..f15d63e 100644 --- a/src/libXNVCtrlAttributes/NvCtrlAttributes.c +++ b/src/libXNVCtrlAttributes/NvCtrlAttributes.c @@ -83,7 +83,7 @@ NvCtrlAttributeHandle *NvCtrlAttributeInit(Display *dpy, int screen, */ if (subsystems & NV_CTRL_ATTRIBUTES_XVIDEO_SUBSYSTEM) { - NvCtrlInitXvOverlayAttributes(h); + h->xv = NvCtrlInitXvAttributes(h); } /* @@ -303,11 +303,11 @@ NvCtrlGetDisplayAttribute(NvCtrlAttributeHandle *handle, case NV_CTRL_ATTR_EXT_VM_PRESENT: *val = (h->vm) ? True : False; break; case NV_CTRL_ATTR_EXT_XV_OVERLAY_PRESENT: - *val = (h->xv_overlay) ? True : False; break; + *val = (h->xv && h->xv->overlay) ? True : False; break; case NV_CTRL_ATTR_EXT_XV_TEXTURE_PRESENT: - *val = (h->xv_texture) ? True : False; break; + *val = (h->xv && h->xv->texture) ? True : False; break; case NV_CTRL_ATTR_EXT_XV_BLITTER_PRESENT: - *val = (h->xv_blitter) ? True : False; break; + *val = (h->xv && h->xv->blitter) ? True : False; break; default: return NvCtrlNoAttribute; } @@ -482,6 +482,9 @@ void NvCtrlAttributeClose(NvCtrlAttributeHandle *handle) if ( h->xrandr ) { NvCtrlXrandrAttributesClose(h); } + if ( h->xv ) { + NvCtrlXvAttributesClose(h); + } free(h); } /* NvCtrlAttributeClose() */ diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c b/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c index 4428d94..b7f3060 100644 --- a/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c +++ b/src/libXNVCtrlAttributes/NvCtrlAttributesGlx.c @@ -43,11 +43,9 @@ #include <GL/glx.h> /* GLX #defines */ #if defined(NV_BSD) -static void *__handle = NULL; +static void *__libGL_handle = NULL; #endif -#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); }) - /**** * * Provides a way to communicate GLX settings. @@ -138,8 +136,10 @@ NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *h) * to be free()'d on dlclose(); this results in failures * on subsequent attempts to open libGL.so. */ - if (__handle == NULL) - glx->libGL = __handle = dlopen("libGL.so.1", RTLD_LAZY); + if (__libGL_handle == NULL) { + __libGL_handle = dlopen("libGL.so.1", RTLD_LAZY); + } + glx->libGL = __libGL_handle; #else /* Link the libGL lib */ glx->libGL = dlopen("libGL.so.1", RTLD_LAZY); @@ -243,7 +243,7 @@ NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *h) XCloseDisplay( h->glx->dpy ); } -#if defined(NV_BSD) +#if !defined(NV_BSD) if ( h->glx->libGL != NULL ) { dlclose( h->glx->libGL ); } diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h index 294cad2..1617bb8 100644 --- a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h +++ b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h @@ -29,6 +29,7 @@ #include "NVCtrl.h" #include <GL/glx.h> /* GLX #defines */ #include <X11/extensions/Xrandr.h> /* Xrandr */ +#include <X11/extensions/Xvlib.h> /* Xv */ #define EXTENSION_NV_CONTROL 0x1 @@ -70,10 +71,16 @@ #define XV_MINMINOR 0 +/* Use to resolve symbols in dynamically opened libraries */ + +#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); }) + + typedef struct __NvCtrlAttributes NvCtrlAttributes; typedef struct __NvCtrlVidModeAttributes NvCtrlVidModeAttributes; typedef struct __NvCtrlAttributePrivateHandle NvCtrlAttributePrivateHandle; typedef struct __NvCtrlNvControlAttributes NvCtrlNvControlAttributes; +typedef struct __NvCtrlXvAttributes NvCtrlXvAttributes; typedef struct __NvCtrlXvOverlayAttributes NvCtrlXvOverlayAttributes; typedef struct __NvCtrlXvTextureAttributes NvCtrlXvTextureAttributes; typedef struct __NvCtrlXvBlitterAttributes NvCtrlXvBlitterAttributes; @@ -121,6 +128,33 @@ struct __NvCtrlXvBlitterAttributes { NvCtrlXvAttribute *defaults; }; +struct __NvCtrlXvAttributes { + + /* libXv.so library handle */ + void *libXv; + + /* Private display connection for the Xv ext. */ + Display *dpy; + + /* libXv functions */ + int (* XvGetPortAttribute) (Display *, XvPortID, Atom, int *); + + int (* XvSetPortAttribute) (Display *, XvPortID, Atom, int); + + XvAttribute* (* XvQueryPortAttributes) (Display *, XvPortID, int *); + + int (* XvQueryExtension) (Display *, unsigned int *, unsigned int *, + unsigned int *, unsigned int *, unsigned int *); + + int (* XvQueryAdaptors) (Display *, Window, unsigned int *, + XvAdaptorInfo **); + + + NvCtrlXvOverlayAttributes *overlay; /* XVideo info (overlay) */ + NvCtrlXvTextureAttributes *texture; /* XVideo info (texture) */ + NvCtrlXvBlitterAttributes *blitter; /* XVideo info (blitter) */ +}; + struct __NvCtrlGlxAttributes { /* Private display connection for the GLX information ext. */ @@ -154,6 +188,9 @@ struct __NvCtrlGlxAttributes { struct __NvCtrlXrandrAttributes { + /* Private display connection for the XRandR information ext. */ + Display *dpy; + /* libXrandr.so library handle */ void *libXrandr; int event_base; /* XRandR extension event base */ @@ -190,13 +227,11 @@ struct __NvCtrlXrandrAttributes { }; struct __NvCtrlAttributePrivateHandle { - Display *dpy; /* display connection */ - int screen; /* the screen that this handle controls */ - NvCtrlNvControlAttributes *nv; /* NV-CONTROL extension info */ - NvCtrlVidModeAttributes *vm; /* XF86VidMode extension info */ - NvCtrlXvOverlayAttributes *xv_overlay; /* XVideo info (overlay) */ - NvCtrlXvTextureAttributes *xv_texture; /* XVideo info (texture) */ - NvCtrlXvBlitterAttributes *xv_blitter; /* XVideo info (blitter) */ + Display *dpy; /* display connection */ + int screen; /* the screen that this handle controls */ + NvCtrlNvControlAttributes *nv; /* NV-CONTROL extension info */ + NvCtrlVidModeAttributes *vm; /* XF86VidMode extension info */ + NvCtrlXvAttributes *xv; /* XVideo info */ NvCtrlGlxAttributes *glx; /* GLX extension info */ NvCtrlXrandrAttributes *xrandr; /* XRandR extension info */ }; @@ -207,43 +242,46 @@ NvCtrlInitNvControlAttributes (NvCtrlAttributePrivateHandle *); NvCtrlVidModeAttributes * NvCtrlInitVidModeAttributes (NvCtrlAttributePrivateHandle *); -void NvCtrlInitXvOverlayAttributes (NvCtrlAttributePrivateHandle *); + +/* Xv attribute functions */ + +NvCtrlXvAttributes * +NvCtrlInitXvAttributes (NvCtrlAttributePrivateHandle *); + +void +NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *); /* GLX extension attribute functions */ NvCtrlGlxAttributes * -NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *h); +NvCtrlInitGlxAttributes (NvCtrlAttributePrivateHandle *); void -NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *h); +NvCtrlGlxAttributesClose (NvCtrlAttributePrivateHandle *); ReturnStatus -NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *, - unsigned int, +NvCtrlGlxGetVoidAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, void **); ReturnStatus -NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *, - unsigned int, +NvCtrlGlxGetStringAttribute (NvCtrlAttributePrivateHandle *, unsigned int, int, char **); /* XRandR extension attribute functions */ NvCtrlXrandrAttributes * -NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h); +NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *); void -NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *h); +NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *); ReturnStatus -NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *h, - int attr, int *val); +NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *, int, int *); ReturnStatus -NvCtrlXrandrSetAttribute (NvCtrlAttributePrivateHandle *h, - int attr, int val); +NvCtrlXrandrSetAttribute (NvCtrlAttributePrivateHandle *, int, int); /* Generic attribute functions */ diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c b/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c index 9fec569..bbd61ef 100644 --- a/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c +++ b/src/libXNVCtrlAttributes/NvCtrlAttributesXrandr.c @@ -37,8 +37,6 @@ #include <X11/Xlib.h> #include <X11/extensions/Xrandr.h> /* Xrandr */ -#define NV_DLSYM(handle, symbol) ({ dlerror(); dlsym(handle, symbol); }) - #include "NvCtrlAttributes.h" #include "NvCtrlAttributesPrivate.h" #include "NVCtrlLib.h" @@ -69,14 +67,14 @@ set_rotation(NvCtrlAttributePrivateHandle *h, Rotation rotation) } /* Get current size & orientation */ - sc = h->xrandr->XRRGetScreenInfo(h->dpy, DefaultRootWindow(h->dpy)); + sc = h->xrandr->XRRGetScreenInfo(h->xrandr->dpy, DefaultRootWindow(h->xrandr->dpy)); if ( !sc ) { return NvCtrlError; } cur_size = h->xrandr->XRRConfigCurrentConfiguration(sc, &cur_rotation); - status = h->xrandr->XRRSetScreenConfig (h->dpy, sc, - DefaultRootWindow(h->dpy), + status = h->xrandr->XRRSetScreenConfig (h->xrandr->dpy, sc, + DefaultRootWindow(h->xrandr->dpy), cur_size, rotation, CurrentTime); h->xrandr->XRRFreeScreenConfigInfo(sc); @@ -164,13 +162,19 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h) if ((error = dlerror()) != NULL) goto fail; + /* Duplicate the display connection */ + + xrandr->dpy = XOpenDisplay(XDisplayString(h->dpy)); + if ( xrandr->dpy == NULL ) + goto fail; + /* Verify rotation is supported */ - ret = xrandr->XRRQueryExtension(h->dpy, &xrandr->event_base, + ret = xrandr->XRRQueryExtension(xrandr->dpy, &xrandr->event_base, &xrandr->error_base); if ( !ret ) goto fail; - xrandr->rotations = xrandr->XRRRotations(h->dpy, h->screen, &rotation); - sizes = xrandr->XRRSizes(h->dpy, h->screen, &(xrandr->nsizes)); + xrandr->rotations = xrandr->XRRRotations(xrandr->dpy, h->screen, &rotation); + sizes = xrandr->XRRSizes(xrandr->dpy, h->screen, &(xrandr->nsizes)); /* Must support more than one rotation orientation */ if ( (xrandr->rotations == 1) || (xrandr->rotations == 2) || @@ -180,7 +184,7 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h) /* Register to recieve XRandR events */ - xrandr->XRRSelectInput(h->dpy, DefaultRootWindow(h->dpy), + xrandr->XRRSelectInput(xrandr->dpy, DefaultRootWindow(xrandr->dpy), RRScreenChangeNotifyMask); // xrandr->rotations = 1; @@ -194,6 +198,9 @@ NvCtrlInitXrandrAttributes (NvCtrlAttributePrivateHandle *h) nv_error_msg("libXrandr setup error : %s\n", error); } if ( xrandr != NULL ) { + if ( xrandr->dpy != NULL ) { + XCloseDisplay(xrandr->dpy); + } if ( xrandr->libXrandr != NULL ) { dlclose(xrandr->libXrandr); } @@ -220,6 +227,9 @@ NvCtrlXrandrAttributesClose (NvCtrlAttributePrivateHandle *h) return; } + if ( h->xrandr->dpy ) { + XCloseDisplay(h->xrandr->dpy); + } if ( h->xrandr->libXrandr != NULL ) { dlclose( h->xrandr->libXrandr ); } @@ -269,7 +279,7 @@ NvCtrlXrandrGetAttribute (NvCtrlAttributePrivateHandle *h, break; case NV_CTRL_ATTR_XRANDR_ROTATION: - sc = h->xrandr->XRRGetScreenInfo(h->dpy, DefaultRootWindow(h->dpy)); + sc = h->xrandr->XRRGetScreenInfo(h->xrandr->dpy, DefaultRootWindow(h->xrandr->dpy)); h->xrandr->XRRConfigRotations(sc, &rotation); h->xrandr->XRRFreeScreenConfigInfo(sc); diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c b/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c index 1c0bb50..5145d75 100644 --- a/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c +++ b/src/libXNVCtrlAttributes/NvCtrlAttributesXv.c @@ -29,8 +29,12 @@ #include <stdlib.h> #include <string.h> +#include <dlfcn.h> -static NvCtrlXvAttribute *getXvAttribute (Display *, XvPortID, const char *); +#include "msg.h" + +static NvCtrlXvAttribute *getXvAttribute (NvCtrlXvAttributes *, + XvPortID, const char *); static Bool checkAdaptor(NvCtrlAttributePrivateHandle *h, unsigned int attribute); @@ -52,28 +56,76 @@ static NvCtrlXvAttribute *getXvAttributePtr(NvCtrlAttributePrivateHandle *h, * otherwise. */ -void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) +NvCtrlXvAttributes * NvCtrlInitXvAttributes(NvCtrlAttributePrivateHandle *h) { + NvCtrlXvAttributes *xv = NULL; XvAdaptorInfo *ainfo; unsigned int ver, rev, req, event, error, nadaptors; int ret, i; Display *dpy = h->dpy; + const char *error_str = NULL; + const char *warn_str = NULL; - /* clear the adaptor pointers */ - h->xv_overlay = NULL; - h->xv_texture = NULL; - h->xv_blitter = NULL; + /* Check parameters */ + if (h == NULL || h->dpy == NULL) { + goto fail; + } + + + /* Allocate the attributes structure */ + xv = (NvCtrlXvAttributes *) + calloc(1, sizeof (NvCtrlXvAttributes)); + if ( xv == NULL ) { + error_str = "Out of memory."; + goto fail; + } + - ret = XvQueryExtension(dpy, &ver, &rev, &req, &event, &error); - if (ret != Success) return; + /* Link the libXv lib */ + xv->libXv = dlopen("libXv.so.1", RTLD_LAZY); + + if (xv->libXv == NULL) { + warn_str = "Failed to open libXv.so.1: this library " + "is not present in your system or is not in your " + "LD_LIBRARY_PATH."; + goto fail; + } + + + /* Resolve Xv functions needed */ + xv->XvQueryExtension = NV_DLSYM(xv->libXv, "XvQueryExtension"); + if ((error_str = dlerror()) != NULL) goto fail; - /* XXX do we have a minimum Xv version? */ + xv->XvQueryAdaptors = NV_DLSYM(xv->libXv, "XvQueryAdaptors"); + if ((error_str = dlerror()) != NULL) goto fail; - ret = XvQueryAdaptors(dpy, RootWindow(dpy, h->screen), - &nadaptors, &ainfo); + xv->XvGetPortAttribute = NV_DLSYM(xv->libXv, "XvGetPortAttribute"); + if ((error_str = dlerror()) != NULL) goto fail; + + xv->XvSetPortAttribute = NV_DLSYM(xv->libXv, "XvSetPortAttribute"); + if ((error_str = dlerror()) != NULL) goto fail; - if (ret != Success || !nadaptors || !ainfo) return; + xv->XvQueryPortAttributes = NV_DLSYM(xv->libXv, "XvQueryPortAttributes"); + if ((error_str = dlerror()) != NULL) goto fail; + + + /* Duplicate the display connection and verify Xv extension exists */ + xv->dpy = XOpenDisplay( XDisplayString(h->dpy) ); + if ( xv->dpy == NULL ) { + goto fail; + } + ret = xv->XvQueryExtension(xv->dpy, &ver, &rev, &req, &event, &error); + if (ret != Success) goto fail; + + /* XXX do we have a minimum Xv version? */ + + + /* Get the list of adaptors */ + ret = xv->XvQueryAdaptors(xv->dpy, RootWindow(dpy, h->screen), + &nadaptors, &ainfo); + + if (ret != Success || !nadaptors || !ainfo) goto fail; for (i = 0; i < nadaptors; i++) { @@ -84,17 +136,21 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = (NvCtrlXvOverlayAttributes *) malloc(sizeof(NvCtrlXvOverlayAttributes)); + if ( !attrs ) { + error_str = "Out of memory."; + goto fail; + } attrs->port = ainfo[i].base_id; - attrs->saturation = getXvAttribute(dpy, attrs->port, + attrs->saturation = getXvAttribute(xv, attrs->port, "XV_SATURATION"); - attrs->contrast = getXvAttribute(dpy, attrs->port, + attrs->contrast = getXvAttribute(xv, attrs->port, "XV_CONTRAST"); - attrs->brightness = getXvAttribute(dpy, attrs->port, + attrs->brightness = getXvAttribute(xv, attrs->port, "XV_BRIGHTNESS"); - attrs->hue = getXvAttribute(dpy, attrs->port, + attrs->hue = getXvAttribute(xv, attrs->port, "XV_HUE"); - attrs->defaults = getXvAttribute(dpy, attrs->port, + attrs->defaults = getXvAttribute(xv, attrs->port, "XV_SET_DEFAULTS"); if (!attrs->saturation || @@ -113,7 +169,7 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = NULL; } else { - h->xv_overlay = attrs; + xv->overlay = attrs; } } @@ -123,11 +179,15 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = (NvCtrlXvTextureAttributes *) malloc(sizeof(NvCtrlXvTextureAttributes)); - + if ( !attrs ) { + error_str = "Out of memory."; + goto fail; + } + attrs->port = ainfo[i].base_id; - attrs->sync_to_vblank = getXvAttribute(dpy, attrs->port, + attrs->sync_to_vblank = getXvAttribute(xv, attrs->port, "XV_SYNC_TO_VBLANK"); - attrs->defaults = getXvAttribute(dpy, attrs->port, + attrs->defaults = getXvAttribute(xv, attrs->port, "XV_SET_DEFAULTS"); if (!attrs->sync_to_vblank || !attrs->defaults) { @@ -139,7 +199,7 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = NULL; } else { - h->xv_texture = attrs; + xv->texture = attrs; } } @@ -149,11 +209,15 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = (NvCtrlXvBlitterAttributes *) malloc(sizeof(NvCtrlXvBlitterAttributes)); - + if ( !attrs ) { + error_str = "Out of memory."; + goto fail; + } + attrs->port = ainfo[i].base_id; - attrs->sync_to_vblank = getXvAttribute(dpy, attrs->port, + attrs->sync_to_vblank = getXvAttribute(xv, attrs->port, "XV_SYNC_TO_VBLANK"); - attrs->defaults = getXvAttribute(dpy, attrs->port, + attrs->defaults = getXvAttribute(xv, attrs->port, "XV_SET_DEFAULTS"); if (!attrs->sync_to_vblank || !attrs->defaults) { @@ -165,11 +229,35 @@ void NvCtrlInitXvOverlayAttributes(NvCtrlAttributePrivateHandle *h) attrs = NULL; } else { - h->xv_blitter = attrs; + xv->blitter = attrs; } } } -} /* NvCtrlInitXvOverlayAttributes() */ + + return xv; + + + /* Handle failures */ + fail: + if (error_str) { + nv_error_msg("libXv setup error: %s\n", error_str); + } + if (warn_str) { + nv_warning_msg("libXv setup warning: %s\n", warn_str); + } + if (xv != NULL) { + if ( xv->dpy != NULL ) { + XCloseDisplay(xv->dpy); + } + if (xv->libXv) { + dlclose(xv->libXv); + } + free (xv); + } + + return NULL; + +} /* NvCtrlInitXvAttributes() */ @@ -199,7 +287,7 @@ ReturnStatus NvCtrlXvGetAttribute(NvCtrlAttributePrivateHandle *h, /* finally, query the value */ - if (XvGetPortAttribute(h->dpy, port, a->atom, val) != Success) { + if (h->xv->XvGetPortAttribute(h->xv->dpy, port, a->atom, val) != Success) { return NvCtrlError; } @@ -231,7 +319,7 @@ ReturnStatus NvCtrlXvSetAttribute(NvCtrlAttributePrivateHandle *h, /* finally, set the value */ - if (XvSetPortAttribute(h->dpy, port, a->atom, val) != Success) { + if (h->xv->XvSetPortAttribute(h->xv->dpy, port, a->atom, val) != Success) { return NvCtrlError; } @@ -278,7 +366,8 @@ NvCtrlXvGetValidAttributeValues(NvCtrlAttributePrivateHandle *h, int attr, * NvCtrlXvAttribute struct if successful, otherwise return NULL. */ -static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port, +static NvCtrlXvAttribute *getXvAttribute(NvCtrlXvAttributes *xv, + XvPortID port, const char *name) { NvCtrlXvAttribute *attr = NULL; @@ -286,7 +375,7 @@ static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port, unsigned int n; int i; - attributes = XvQueryPortAttributes(dpy, port, &n); + attributes = xv->XvQueryPortAttributes(xv->dpy, port, &n); if (!attributes || !n) goto failed; @@ -297,7 +386,7 @@ static NvCtrlXvAttribute *getXvAttribute(Display *dpy, XvPortID port, attr->range.type = ATTRIBUTE_TYPE_RANGE; attr->range.u.range.min = attributes[i].min_value; attr->range.u.range.max = attributes[i].max_value; - attr->atom = XInternAtom(dpy, name, True); + attr->atom = XInternAtom(xv->dpy, name, True); if (attr->atom == None) goto failed; if (! (attributes[i].flags & XvSettable)) goto failed; @@ -339,17 +428,17 @@ static Bool checkAdaptor(NvCtrlAttributePrivateHandle *h, case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS: case NV_CTRL_ATTR_XV_OVERLAY_HUE: case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS: - if (h && h->xv_overlay) return True; + if (h && h->xv && h->xv->overlay) return True; else return False; case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK: case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS: - if (h && h->xv_texture) return True; + if (h && h->xv && h->xv->texture) return True; else return False; case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK: case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS: - if (h && h->xv_blitter) return True; + if (h && h->xv && h->xv->blitter) return True; else return False; default: @@ -376,15 +465,15 @@ static unsigned int getXvPort(NvCtrlAttributePrivateHandle *h, case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS: case NV_CTRL_ATTR_XV_OVERLAY_HUE: case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS: - return h->xv_overlay->port; + return h->xv->overlay->port; case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK: case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS: - return h->xv_texture->port; + return h->xv->texture->port; case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK: case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS: - return h->xv_blitter->port; + return h->xv->blitter->port; default: return 0; @@ -406,33 +495,70 @@ static NvCtrlXvAttribute *getXvAttributePtr(NvCtrlAttributePrivateHandle *h, switch (attribute) { case NV_CTRL_ATTR_XV_OVERLAY_SATURATION: - return h->xv_overlay->saturation; + return h->xv->overlay->saturation; case NV_CTRL_ATTR_XV_OVERLAY_CONTRAST: - return h->xv_overlay->contrast; + return h->xv->overlay->contrast; case NV_CTRL_ATTR_XV_OVERLAY_BRIGHTNESS: - return h->xv_overlay->brightness; + return h->xv->overlay->brightness; case NV_CTRL_ATTR_XV_OVERLAY_HUE: - return h->xv_overlay->hue; + return h->xv->overlay->hue; case NV_CTRL_ATTR_XV_TEXTURE_SYNC_TO_VBLANK: - return h->xv_texture->sync_to_vblank; + return h->xv->texture->sync_to_vblank; case NV_CTRL_ATTR_XV_BLITTER_SYNC_TO_VBLANK: - return h->xv_blitter->sync_to_vblank; + return h->xv->blitter->sync_to_vblank; case NV_CTRL_ATTR_XV_OVERLAY_SET_DEFAULTS: - return h->xv_overlay->defaults; + return h->xv->overlay->defaults; case NV_CTRL_ATTR_XV_TEXTURE_SET_DEFAULTS: - return h->xv_texture->defaults; + return h->xv->texture->defaults; case NV_CTRL_ATTR_XV_BLITTER_SET_DEFAULTS: - return h->xv_blitter->defaults; + return h->xv->blitter->defaults; default: return NULL; } } /* getXvAttributePtr() */ + + + +/* + * Frees and relinquishes any resource used by the Xv Attributes + * + */ + +void +NvCtrlXvAttributesClose (NvCtrlAttributePrivateHandle *h) +{ + if (h == NULL || h->xv == NULL) { + return; + } + + if (h->xv->dpy) { + XCloseDisplay(h->xv->dpy); + } + + if (h->xv->libXv) { + dlclose(h->xv->libXv); + } + + if (h->xv->overlay) { + free(h->xv->overlay); + } + if (h->xv->texture) { + free(h->xv->texture); + } + if (h->xv->blitter) { + free(h->xv->blitter); + } + + free(h->xv); + h->xv = NULL; + +} /* NvCtrlXvAttributesClose() */ @@ -26,6 +26,7 @@ #define __MSG_H__ #include <stdarg.h> +#include <stdio.h> void nv_error_msg(const char*, ...); void nv_warning_msg(const char*, ...); diff --git a/src/parse.c b/src/parse.c index b162a27..126b740 100644 --- a/src/parse.c +++ b/src/parse.c @@ -61,12 +61,13 @@ AttributeTableEntry attributeTable[] = { { "FlatpanelScaling", NV_CTRL_FLATPANEL_SCALING, 0 }, { "FlatpanelDithering", NV_CTRL_FLATPANEL_DITHERING, 0 }, { "DigitalVibrance", NV_CTRL_DIGITAL_VIBRANCE, 0 }, - { "ImageSharpening", NV_CTRL_IMAGE_SHARPENING, 0, }, + { "ImageSharpening", NV_CTRL_IMAGE_SHARPENING, 0 }, { "BusType", NV_CTRL_BUS_TYPE, 0 }, { "VideoRam", NV_CTRL_VIDEO_RAM, 0 }, { "Irq", NV_CTRL_IRQ, 0 }, { "OperatingSystem", NV_CTRL_OPERATING_SYSTEM, 0 }, { "SyncToVBlank", NV_CTRL_SYNC_TO_VBLANK, 0 }, + { "AllowFlipping", NV_CTRL_FLIPPING_ALLOWED, 0 }, { "LogAniso", NV_CTRL_LOG_ANISO, 0 }, { "FSAA", NV_CTRL_FSAA_MODE, 0 }, { "TextureSharpen", NV_CTRL_TEXTURE_SHARPEN, 0 }, @@ -105,14 +106,15 @@ AttributeTableEntry attributeTable[] = { { "RedGamma", GAMMA_VALUE|RED_CHANNEL, C|G }, { "GreenGamma", GAMMA_VALUE|GREEN_CHANNEL, C|G }, { "BlueGamma", GAMMA_VALUE|BLUE_CHANNEL, C|G }, - { "TVOverScan", NV_CTRL_TV_OVERSCAN, 0, }, - { "TVFlickerFilter", NV_CTRL_TV_FLICKER_FILTER, 0, }, - { "TVBrightness", NV_CTRL_TV_BRIGHTNESS, 0, }, - { "TVHue", NV_CTRL_TV_HUE, 0, }, - { "TVContrast", NV_CTRL_TV_CONTRAST, 0, }, - { "TVSaturation", NV_CTRL_TV_SATURATION, 0, }, + { "TVOverScan", NV_CTRL_TV_OVERSCAN, 0 }, + { "TVFlickerFilter", NV_CTRL_TV_FLICKER_FILTER, 0 }, + { "TVBrightness", NV_CTRL_TV_BRIGHTNESS, 0 }, + { "TVHue", NV_CTRL_TV_HUE, 0 }, + { "TVContrast", NV_CTRL_TV_CONTRAST, 0 }, + { "TVSaturation", NV_CTRL_TV_SATURATION, 0 }, { "GPUCoreTemp", NV_CTRL_GPU_CORE_TEMPERATURE, N }, { "GPUAmbientTemp", NV_CTRL_AMBIENT_TEMPERATURE, N }, + { "FramelockUseHouseSync", NV_CTRL_USE_HOUSE_SYNC, 0 }, { "XVideoOverlaySaturation", NV_CTRL_ATTR_XV_OVERLAY_SATURATION, V }, { "XVideoOverlayContrast", NV_CTRL_ATTR_XV_OVERLAY_CONTRAST, V }, diff --git a/src/query-assign.c b/src/query-assign.c index f8637b1..8f0366e 100644 --- a/src/query-assign.c +++ b/src/query-assign.c @@ -186,6 +186,17 @@ void nv_free_ctrl_handles(CtrlHandles *h) if (h->display) free(h->display); if (h->dpy) { + + /* + * XXX It is unfortunate that the display connection needs + * to be closed before the backends have had a chance to + * tear down their state. If future backends need to send + * protocol in this case or perform similar tasks, we'll + * have to add e.g. NvCtrlAttributeTearDown(), which would + * need to be called before XCloseDisplay(). + */ + XCloseDisplay(h->dpy); + h->dpy = NULL; for (i = 0; i < h->num_screens; i++) { NvCtrlAttributeClose(h->h[i]); @@ -195,8 +206,6 @@ void nv_free_ctrl_handles(CtrlHandles *h) if (h->d) free(h->d); if (h->h) free(h->h); if (h->screen_names) free(h->screen_names); - - XCloseDisplay(h->dpy); } free(h); |